diff --git a/apps/simple/openai.ts b/apps/simple/openai.ts new file mode 100644 index 0000000000000000000000000000000000000000..0977b8d359114b5b72c4af1c01c3e10421449085 --- /dev/null +++ b/apps/simple/openai.ts @@ -0,0 +1,18 @@ +import process from "node:process"; +import { Configuration, OpenAIWrapper } from "@llamaindex/core/src/openai"; + +(async () => { + const configuration = new Configuration({ + apiKey: process.env.OPENAI_API_KEY, + }); + + const openai = new OpenAIWrapper(configuration); + + const { data } = await openai.createChatCompletion({ + model: "gpt-3.5-turbo-0613", + messages: [{ role: "user", content: "Hello, world!" }], + }); + + console.log(data); + console.log(data.choices[0].message); +})(); diff --git a/apps/simple/package.json b/apps/simple/package.json index dfde9dc87f3273b3231492963d7dee66c5a5ecd0..a5a22b25e7d1608ad5298e6c35f1dd9abd9d4bcd 100644 --- a/apps/simple/package.json +++ b/apps/simple/package.json @@ -2,5 +2,8 @@ "name": "simple", "dependencies": { "@llamaindex/core": "workspace:*" + }, + "devDependencies": { + "@types/node": "^18" } } diff --git a/packages/core/package.json b/packages/core/package.json index 2ba2e98e147e376fb63dd77cdd3a434c929188d7..fe9910ac054a566b0d6ddffaf372ec97495539ad 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,7 @@ { "name": "@llamaindex/core", "dependencies": { + "axios": "^0.26.1", "js-tiktoken": "^1.0.7", "openai": "^3.3.0" }, diff --git a/packages/core/src/fetchAdapter.d.ts b/packages/core/src/fetchAdapter.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..dbec1d1d938cbedbf37cb5e62bf960f21aa7d1be --- /dev/null +++ b/packages/core/src/fetchAdapter.d.ts @@ -0,0 +1,3 @@ +import { AxiosRequestConfig, AxiosPromise } from "axios"; + +export default function fetchAdapter(config: AxiosRequestConfig): AxiosPromise; diff --git a/packages/core/src/fetchAdapter.js b/packages/core/src/fetchAdapter.js new file mode 100644 index 0000000000000000000000000000000000000000..9b34eca10c9460112b45a62ac574f60c1a7b9000 --- /dev/null +++ b/packages/core/src/fetchAdapter.js @@ -0,0 +1,250 @@ +// Adapted from https://github.com/vespaiach/axios-fetch-adapter +// Missing type: module + +// MIT License + +// Copyright (c) 2021 Vespaiach + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +const axios = require("axios"); +const settle = require("axios/lib/core/settle"); +const buildURL = require("axios/lib/helpers/buildURL"); +const buildFullPath = require("axios/lib/core/buildFullPath"); +const { + isUndefined, + isStandardBrowserEnv, + isFormData, +} = require("axios/lib/utils"); + +/** + * - Create a request object + * - Get response body + * - Check if timeout + */ +module.exports = async function fetchAdapter(config) { + const request = createRequest(config); + const promiseChain = [getResponse(request, config)]; + + if (config.timeout && config.timeout > 0) { + promiseChain.push( + new Promise((res) => { + setTimeout(() => { + const message = config.timeoutErrorMessage + ? config.timeoutErrorMessage + : "timeout of " + config.timeout + "ms exceeded"; + res(createError(message, config, "ECONNABORTED", request)); + }, config.timeout); + }) + ); + } + + const data = await Promise.race(promiseChain); + return new Promise((resolve, reject) => { + if (data instanceof Error) { + reject(data); + } else { + Object.prototype.toString.call(config.settle) === "[object Function]" + ? config.settle(resolve, reject, data) + : settle(resolve, reject, data); + } + }); +}; + +/** + * Fetch API stage two is to get response body. This funtion tries to retrieve + * response body based on response's type + */ +async function getResponse(request, config) { + let stageOne; + try { + stageOne = await fetch(request); + } catch (e) { + return createError("Network Error", config, "ERR_NETWORK", request); + } + + const response = { + ok: stageOne.ok, + status: stageOne.status, + statusText: stageOne.statusText, + headers: new Headers(stageOne.headers), // Make a copy of headers + config: config, + request, + }; + + if (stageOne.status >= 200 && stageOne.status !== 204) { + switch (config.responseType) { + case "arraybuffer": + response.data = await stageOne.arrayBuffer(); + break; + case "blob": + response.data = await stageOne.blob(); + break; + case "json": + response.data = await stageOne.json(); + break; + case "formData": + response.data = await stageOne.formData(); + break; + default: + response.data = await stageOne.text(); + break; + } + } + + return response; +} + +/** + * This function will create a Request object based on configuration's axios + */ +function createRequest(config) { + const headers = new Headers(config.headers); + + // HTTP basic authentication + if (config.auth) { + const username = config.auth.username || ""; + const password = config.auth.password + ? decodeURI(encodeURIComponent(config.auth.password)) + : ""; + headers.set("Authorization", `Basic ${btoa(username + ":" + password)}`); + } + + const method = config.method.toUpperCase(); + const options = { + headers: headers, + method, + }; + if (method !== "GET" && method !== "HEAD") { + options.body = config.data; + + // In these cases the browser will automatically set the correct Content-Type, + // but only if that header hasn't been set yet. So that's why we're deleting it. + if (isFormData(options.body) && isStandardBrowserEnv()) { + headers.delete("Content-Type"); + } + } + if (config.mode) { + options.mode = config.mode; + } + if (config.cache) { + options.cache = config.cache; + } + if (config.integrity) { + options.integrity = config.integrity; + } + if (config.redirect) { + options.redirect = config.redirect; + } + if (config.referrer) { + options.referrer = config.referrer; + } + // This config is similar to XHR’s withCredentials flag, but with three available values instead of two. + // So if withCredentials is not set, default value 'same-origin' will be used + if (!isUndefined(config.withCredentials)) { + options.credentials = config.withCredentials ? "include" : "omit"; + } + + const fullPath = buildFullPath(config.baseURL, config.url); + const url = buildURL(fullPath, config.params, config.paramsSerializer); + + // Expected browser to throw error if there is any wrong configuration value + return new Request(url, options); +} + +/** + * Note: + * + * From version >= 0.27.0, createError function is replaced by AxiosError class. + * So I copy the old createError function here for backward compatible. + * + * + * + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. + */ +function createError(message, config, code, request, response) { + if (axios.AxiosError && typeof axios.AxiosError === "function") { + return new axios.AxiosError( + message, + axios.AxiosError[code], + config, + request, + response + ); + } + + var error = new Error(message); + return enhanceError(error, config, code, request, response); +} + +/** + * + * Note: + * + * This function is for backward compatible. + * + * + * Update an Error with the specified config, error code, and response. + * + * @param {Error} error The error to update. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The error. + */ +function enhanceError(error, config, code, request, response) { + error.config = config; + if (code) { + error.code = code; + } + + error.request = request; + error.response = response; + error.isAxiosError = true; + + error.toJSON = function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code, + status: + this.response && this.response.status ? this.response.status : null, + }; + }; + return error; +} diff --git a/packages/core/src/openai.ts b/packages/core/src/openai.ts index d22971cf6124f0852aae4018a300225628ae24ac..b300580cb16bc72251bc935931020dd14f7d1879 100644 --- a/packages/core/src/openai.ts +++ b/packages/core/src/openai.ts @@ -1,56 +1,33 @@ -const OPENAI_EMBEDDINGS_URL = "https://api.openai.com/v1/embeddings"; -const OPENAI_CHAT_COMPLETIONS_URL = - "https://api.openai.com/v1/chat/completions"; +import { + CreateCompletionRequest, + OpenAIApi, + CreateCompletionResponse, + CreateChatCompletionRequest, + CreateChatCompletionResponse, +} from "openai"; +import { AxiosRequestConfig, AxiosResponse } from "axios"; +import fetchAdapter from "./fetchAdapter"; -const OPENAI_API_KEY = process.env.OPENAI_API_KEY; +export class OpenAIWrapper extends OpenAIApi { + createCompletion( + createCompletionRequest: CreateCompletionRequest, + options?: AxiosRequestConfig + ): Promise<AxiosResponse<CreateCompletionResponse, any>> { + return super.createCompletion(createCompletionRequest, { + adapter: fetchAdapter, + ...options, + }); + } -export const getEmbeddings = async ( - text: string, - model = "text-embedding-ada-002" -) => { - return await fetch(OPENAI_EMBEDDINGS_URL, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${OPENAI_API_KEY}`, - }, - body: JSON.stringify({ input: text, model: model }), - }); -}; - -interface ChatMessage { - role: "system" | "user" | "assistant"; - content: string; - name?: string; -} - -interface FunctionMessage { - role: "function"; - content?: string; - name: string; - function_call?: string; -} - -export type Message = ChatMessage | FunctionMessage; - -interface Function { - name: string; + createChatCompletion( + createChatCompletionRequest: CreateChatCompletionRequest, + options?: AxiosRequestConfig<any> | undefined + ): Promise<AxiosResponse<CreateChatCompletionResponse, any>> { + return super.createChatCompletion(createChatCompletionRequest, { + adapter: fetchAdapter, + ...options, + }); + } } -export const getChatCompletions = async ( - messages: Message[], - model = "gpt-3.5-turbo", - functions: Function[] | null = null -) => { - return await fetch(OPENAI_CHAT_COMPLETIONS_URL, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${OPENAI_API_KEY}`, - }, - body: JSON.stringify({ - model, - messages, - }), - }); -}; +export * from "openai"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e82f10a3b6f4cda24770a8aa05cc4f8e669b567c..0dd717a424f7be485e041adf75188102f36f7b99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@turbo/gen': specifier: ^1.9.7 - version: 1.9.7(@types/node@17.0.45)(typescript@4.9.5) + version: 1.9.7(@types/node@18.6.0)(typescript@4.9.5) '@types/jest': specifier: ^29.5.2 version: 29.5.2 @@ -22,7 +22,7 @@ importers: version: link:packages/eslint-config-custom jest: specifier: ^29.5.0 - version: 29.5.0(@types/node@17.0.45) + version: 29.5.0(@types/node@18.6.0) prettier: specifier: ^2.5.1 version: 2.8.8 @@ -75,6 +75,10 @@ importers: '@llamaindex/core': specifier: workspace:* version: link:../../packages/core + devDependencies: + '@types/node': + specifier: ^18 + version: 18.6.0 apps/web: dependencies: @@ -112,6 +116,12 @@ importers: packages/core: dependencies: + '@vespaiach/axios-fetch-adapter': + specifier: ^0.3.1 + version: 0.3.1(axios@0.26.1) + axios: + specifier: ^0.26.1 + version: 0.26.1 js-tiktoken: specifier: ^1.0.7 version: 1.0.7 @@ -570,7 +580,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 chalk: 4.1.2 jest-message-util: 29.5.0 jest-util: 29.5.0 @@ -591,14 +601,14 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@17.0.45) + jest-config: 29.5.0(@types/node@18.6.0) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -625,7 +635,7 @@ packages: dependencies: '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 jest-mock: 29.5.0 dev: true @@ -652,7 +662,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.1.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 jest-message-util: 29.5.0 jest-mock: 29.5.0 jest-util: 29.5.0 @@ -685,7 +695,7 @@ packages: '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 17.0.45 + '@types/node': 18.6.0 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -773,7 +783,7 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.45 + '@types/node': 18.6.0 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -981,7 +991,7 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@turbo/gen@1.9.7(@types/node@17.0.45)(typescript@4.9.5): + /@turbo/gen@1.9.7(@types/node@18.6.0)(typescript@4.9.5): resolution: {integrity: sha512-mjenROdRNvYxZixNfamJY/XxwKMT+01PuQby8+qdRUUa5ZLBPOv4rw11n+II1O8ZnpFpBJIGGFJcnRNY+lCddw==} dependencies: chalk: 2.4.2 @@ -991,7 +1001,7 @@ packages: minimatch: 9.0.0 node-plop: 0.26.3 semver: 7.5.0 - ts-node: 10.9.1(@types/node@17.0.45)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@18.6.0)(typescript@4.9.5) update-check: 1.5.4 validate-npm-package-name: 5.0.0 transitivePeerDependencies: @@ -1034,13 +1044,13 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 17.0.45 + '@types/node': 18.6.0 dev: true /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.6.0 dev: true /@types/inquirer@6.5.0: @@ -1085,6 +1095,10 @@ packages: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: true + /@types/node@18.6.0: + resolution: {integrity: sha512-WZ/6I1GL0DNAo4bb01lGGKTHH8BHJyECepf11kWONg3OJoHq2WYOm16Es1V54Er7NTUXsbDCpKRKdmBc4X2xhA==} + dev: true + /@types/prettier@2.7.3: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} dev: true @@ -1118,7 +1132,7 @@ packages: /@types/through@0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.6.0 dev: true /@types/yargs-parser@21.0.0: @@ -1193,6 +1207,14 @@ packages: eslint-visitor-keys: 3.4.0 dev: false + /@vespaiach/axios-fetch-adapter@0.3.1(axios@0.26.1): + resolution: {integrity: sha512-+1F52VWXmQHSRFSv4/H0wtnxfvjRMPK5531e880MIjypPdUSX6QZuoDgEVeCE1vjhzDdxCVX7rOqkub7StEUwQ==} + peerDependencies: + axios: '>=0.26.0' + dependencies: + axios: 0.26.1 + dev: false + /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3170,7 +3192,7 @@ packages: '@jest/expect': 29.5.0 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -3190,7 +3212,7 @@ packages: - supports-color dev: true - /jest-cli@29.5.0(@types/node@17.0.45): + /jest-cli@29.5.0(@types/node@18.6.0): resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3207,7 +3229,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@17.0.45) + jest-config: 29.5.0(@types/node@18.6.0) jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 @@ -3218,7 +3240,7 @@ packages: - ts-node dev: true - /jest-config@29.5.0(@types/node@17.0.45): + /jest-config@29.5.0(@types/node@18.6.0): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3233,7 +3255,7 @@ packages: '@babel/core': 7.22.5 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 babel-jest: 29.5.0(@babel/core@7.22.5) chalk: 4.1.2 ci-info: 3.8.0 @@ -3292,7 +3314,7 @@ packages: '@jest/environment': 29.5.0 '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 jest-mock: 29.5.0 jest-util: 29.5.0 dev: true @@ -3308,7 +3330,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.6 - '@types/node': 17.0.45 + '@types/node': 18.6.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -3359,7 +3381,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 jest-util: 29.5.0 dev: true @@ -3414,7 +3436,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -3445,7 +3467,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.1 @@ -3500,7 +3522,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -3525,7 +3547,7 @@ packages: dependencies: '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 17.0.45 + '@types/node': 18.6.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -3537,13 +3559,13 @@ packages: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.6.0 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.5.0(@types/node@17.0.45): + /jest@29.5.0(@types/node@18.6.0): resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3556,7 +3578,7 @@ packages: '@jest/core': 29.5.0 '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@17.0.45) + jest-cli: 29.5.0(@types/node@18.6.0) transitivePeerDependencies: - '@types/node' - supports-color @@ -4798,7 +4820,7 @@ packages: '@babel/core': 7.22.5 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@17.0.45) + jest: 29.5.0(@types/node@18.6.0) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -4808,7 +4830,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-node@10.9.1(@types/node@17.0.45)(typescript@4.9.5): + /ts-node@10.9.1(@types/node@18.6.0)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -4827,7 +4849,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 17.0.45 + '@types/node': 18.6.0 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3