diff --git a/packages/core/package.json b/packages/core/package.json index 4b641c3556fbb8a6b66b24920143d0faf7a95cbe..69880d24cf52d444bd7cd2eef4a721be3990323f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -7,6 +7,7 @@ "openai": "^4.3.1", "papaparse": "^5.4.1", "pdf-parse": "^1.1.1", + "rake-js": "^0.1.1", "replicate": "^0.16.1", "tiktoken-node": "^0.0.6", "uuid": "^9.0.0", diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts index 5b7adb2965229a110f4ce46083906ee73db54be5..43344097b747dc08d44c572d83cb6f7230caf626 100644 --- a/packages/core/src/Node.ts +++ b/packages/core/src/Node.ts @@ -294,5 +294,5 @@ export function jsonToNode(json: any) { */ export interface NodeWithScore { node: BaseNode; - score: number; + score?: number; } diff --git a/packages/core/src/Prompt.ts b/packages/core/src/Prompt.ts index 262096198e24ff61a74d78e2b79cbca5508487a7..b072a3ee6a180db6afb97def75a4638630948827 100644 --- a/packages/core/src/Prompt.ts +++ b/packages/core/src/Prompt.ts @@ -356,3 +356,36 @@ ${context} }; export type ContextSystemPrompt = typeof defaultContextSystemPrompt; + +export const defaultKeywordExtractPrompt = ({ + context = "", + maxKeywords = 10, +}) => { + // const { text = "", maxKeywords = 10 } = input; + return ` +Some text is provided below. Given the text, extract up to ${maxKeywords} keywords from the text. Avoid stopwords. +--------------------- +${context} +--------------------- +Provide keywords in the following comma-separated format: 'KEYWORDS: <keywords>' +`; +}; + +export type KeywordExtractPrompt = typeof defaultKeywordExtractPrompt; + +export const defaultQueryKeywordExtractPrompt = ({ + question = "", + maxKeywords = 10, +}) => { + // const { question = "", maxKeywords = 10 } = input; + return `( + "A question is provided below. Given the question, extract up to ${maxKeywords} " + "keywords from the text. Focus on extracting the keywords that we can use " + "to best lookup answers to the question. Avoid stopwords." + "---------------------" + "${question}" + "---------------------" + "Provide keywords in the following comma-separated format: 'KEYWORDS: <keywords>'" +)`; +}; +export type QueryKeywordExtractPrompt = typeof defaultQueryKeywordExtractPrompt; diff --git a/packages/core/src/indices/BaseIndex.ts b/packages/core/src/indices/BaseIndex.ts index 85fa7187200657242460f2b137cd0fff2d43f4b4..c9c0d66f331fb924dd8bdb24937cde78bcbdf2e3 100644 --- a/packages/core/src/indices/BaseIndex.ts +++ b/packages/core/src/indices/BaseIndex.ts @@ -39,6 +39,7 @@ export abstract class IndexStruct { export enum IndexStructType { SIMPLE_DICT = "simple_dict", LIST = "list", + KEYWORD_TABLE = "keyword_table", } export class IndexDict extends IndexStruct { @@ -106,6 +107,36 @@ export class IndexList extends IndexStruct { } } +// A table of keywords mapping keywords to text chunks. +export class KeywordTable extends IndexStruct { + table: Map<string, Set<string>> = new Map(); + type: IndexStructType = IndexStructType.KEYWORD_TABLE; + addNode(keywords: string[], nodeId: string): void { + keywords.forEach((keyword) => { + if (!this.table.has(keyword)) { + this.table.set(keyword, new Set()); + } + this.table.get(keyword)!.add(nodeId); + }); + } + + deleteNode(keywords: string[], nodeId: string) { + keywords.forEach((keyword) => { + if (this.table.has(keyword)) { + this.table.get(keyword)!.delete(nodeId); + } + }); + } + + toJson(): Record<string, unknown> { + return { + ...super.toJson(), + table: this.table, + type: this.type, + }; + } +} + export interface BaseIndexInit<T> { serviceContext: ServiceContext; storageContext: StorageContext; diff --git a/packages/core/src/indices/keyword/KeywordTableIndex.ts b/packages/core/src/indices/keyword/KeywordTableIndex.ts new file mode 100644 index 0000000000000000000000000000000000000000..51da0939758f745ef462e480e83f8590d6dbb2a1 --- /dev/null +++ b/packages/core/src/indices/keyword/KeywordTableIndex.ts @@ -0,0 +1,275 @@ +import { BaseNode, Document, MetadataMode } from "../../Node"; +import { defaultKeywordExtractPrompt } from "../../Prompt"; +import { BaseQueryEngine, RetrieverQueryEngine } from "../../QueryEngine"; +import { ResponseSynthesizer } from "../../ResponseSynthesizer"; +import { BaseRetriever } from "../../Retriever"; +import { + ServiceContext, + serviceContextFromDefaults, +} from "../../ServiceContext"; +import { StorageContext, storageContextFromDefaults } from "../../storage"; +import { BaseDocumentStore } from "../../storage/docStore/types"; +import { + BaseIndex, + BaseIndexInit, + IndexStructType, + KeywordTable, +} from "../BaseIndex"; +import { + KeywordTableGPTRetriever, + KeywordTableRAKERetriever, + KeywordTableSimpleRetriever, +} from "./KeywordTableIndexRetriever"; +import { extractKeywordsGivenResponse } from "./utils"; + +export interface KeywordIndexOptions { + nodes?: BaseNode[]; + indexStruct?: KeywordTable; + indexId?: string; + serviceContext?: ServiceContext; + storageContext?: StorageContext; +} +export enum KeywordTableRetrieverMode { + DEFAULT = "DEFAULT", + SIMPLE = "SIMPLE", + RAKE = "RAKE", +} + +const KeywordTableRetrieverMap = { + [KeywordTableRetrieverMode.DEFAULT]: KeywordTableGPTRetriever, + [KeywordTableRetrieverMode.SIMPLE]: KeywordTableSimpleRetriever, + [KeywordTableRetrieverMode.RAKE]: KeywordTableRAKERetriever, +}; + +export interface KeywordIndexInit extends BaseIndexInit<KeywordTable> { + retrieverMode?: KeywordTableRetrieverMode; +} + +/** + * The KeywordTableIndex, an index that extracts keywords from each Node and builds a mapping from each keyword to the corresponding Nodes of that keyword. + */ +export class KeywordTableIndex extends BaseIndex<KeywordTable> { + constructor(init: BaseIndexInit<KeywordTable>) { + super(init); + } + + static async init(options: KeywordIndexOptions): Promise<KeywordTableIndex> { + const storageContext = + options.storageContext ?? (await storageContextFromDefaults({})); + const serviceContext = + options.serviceContext ?? serviceContextFromDefaults({}); + const { docStore, indexStore } = storageContext; + + // Setup IndexStruct from storage + let indexStructs = (await indexStore.getIndexStructs()) as KeywordTable[]; + let indexStruct: KeywordTable | null; + + if (options.indexStruct && indexStructs.length > 0) { + throw new Error( + "Cannot initialize index with both indexStruct and indexStore", + ); + } + + if (options.indexStruct) { + indexStruct = options.indexStruct; + } else if (indexStructs.length == 1) { + indexStruct = indexStructs[0]; + } else if (indexStructs.length > 1 && options.indexId) { + indexStruct = (await indexStore.getIndexStruct( + options.indexId, + )) as KeywordTable; + } else { + indexStruct = null; + } + + // check indexStruct type + if (indexStruct && indexStruct.type !== IndexStructType.KEYWORD_TABLE) { + throw new Error( + "Attempting to initialize ListIndex with non-list indexStruct", + ); + } + + if (indexStruct) { + if (options.nodes) { + throw new Error( + "Cannot initialize VectorStoreIndex with both nodes and indexStruct", + ); + } + } else { + if (!options.nodes) { + throw new Error( + "Cannot initialize VectorStoreIndex without nodes or indexStruct", + ); + } + indexStruct = await KeywordTableIndex.buildIndexFromNodes( + options.nodes, + storageContext.docStore, + serviceContext, + ); + + await indexStore.addIndexStruct(indexStruct); + } + + return new KeywordTableIndex({ + storageContext, + serviceContext, + docStore, + indexStore, + indexStruct, + }); + } + + asRetriever(options?: any): BaseRetriever { + const { + retrieverMode = KeywordTableRetrieverMode.DEFAULT, + ...otherOptions + } = options ?? {}; + const KeywordTableRetriever = + KeywordTableRetrieverMap[retrieverMode as KeywordTableRetrieverMode]; + if (KeywordTableRetriever) { + return new KeywordTableRetriever({ index: this, ...otherOptions }); + } + throw new Error(`Unknown retriever mode: ${retrieverMode}`); + } + + asQueryEngine(options?: { + retriever?: BaseRetriever; + responseSynthesizer?: ResponseSynthesizer; + }): BaseQueryEngine { + const { retriever, responseSynthesizer } = options ?? {}; + return new RetrieverQueryEngine( + retriever ?? this.asRetriever(), + responseSynthesizer, + ); + } + + static async extractKeywords( + text: string, + serviceContext: ServiceContext, + ): Promise<Set<string>> { + const response = await serviceContext.llm.complete( + defaultKeywordExtractPrompt({ + text, + }), + ); + return extractKeywordsGivenResponse(response.message.content, "KEYWORDS:"); + } + + /** + * High level API: split documents, get keywords, and build index. + * @param documents + * @param storageContext + * @param serviceContext + * @returns + */ + static async fromDocuments( + documents: Document[], + args: { + storageContext?: StorageContext; + serviceContext?: ServiceContext; + } = {}, + ): Promise<KeywordTableIndex> { + let { storageContext, serviceContext } = args; + storageContext = storageContext ?? (await storageContextFromDefaults({})); + serviceContext = serviceContext ?? serviceContextFromDefaults({}); + const docStore = storageContext.docStore; + + docStore.addDocuments(documents, true); + for (const doc of documents) { + docStore.setDocumentHash(doc.id_, doc.hash); + } + + const nodes = serviceContext.nodeParser.getNodesFromDocuments(documents); + const index = await KeywordTableIndex.init({ + nodes, + storageContext, + serviceContext, + }); + return index; + } + + /** + * Get keywords for nodes and place them into the index. + * @param nodes + * @param serviceContext + * @param vectorStore + * @returns + */ + static async buildIndexFromNodes( + nodes: BaseNode[], + docStore: BaseDocumentStore, + serviceContext: ServiceContext, + ): Promise<KeywordTable> { + const indexStruct = new KeywordTable(); + await docStore.addDocuments(nodes, true); + for (const node of nodes) { + const keywords = await KeywordTableIndex.extractKeywords( + node.getContent(MetadataMode.LLM), + serviceContext, + ); + indexStruct.addNode([...keywords], node.id_); + } + return indexStruct; + } + + async insertNodes(nodes: BaseNode[]) { + for (let node of nodes) { + const keywords = await KeywordTableIndex.extractKeywords( + node.getContent(MetadataMode.LLM), + this.serviceContext, + ); + this.indexStruct.addNode([...keywords], node.id_); + } + } + + deleteNode(nodeId: string): void { + const keywordsToDelete: Set<string> = new Set(); + for (const [keyword, existingNodeIds] of Object.entries( + this.indexStruct.table, + )) { + const index = existingNodeIds.indexOf(nodeId); + if (index !== -1) { + existingNodeIds.splice(index, 1); + + // Delete keywords that have zero nodes + if (existingNodeIds.length === 0) { + keywordsToDelete.add(keyword); + } + } + } + this.indexStruct.deleteNode([...keywordsToDelete], nodeId); + } + + async deleteNodes(nodeIds: string[], deleteFromDocStore: boolean) { + nodeIds.forEach((nodeId) => { + this.deleteNode(nodeId); + }); + + if (deleteFromDocStore) { + for (const nodeId of nodeIds) { + await this.docStore.deleteDocument(nodeId, false); + } + } + + await this.storageContext.indexStore.addIndexStruct(this.indexStruct); + } + + async deleteRefDoc( + refDocId: string, + deleteFromDocStore?: boolean, + ): Promise<void> { + const refDocInfo = await this.docStore.getRefDocInfo(refDocId); + + if (!refDocInfo) { + return; + } + + await this.deleteNodes(refDocInfo.nodeIds, false); + + if (deleteFromDocStore) { + await this.docStore.deleteRefDoc(refDocId, false); + } + + return; + } +} diff --git a/packages/core/src/indices/keyword/KeywordTableIndexRetriever.ts b/packages/core/src/indices/keyword/KeywordTableIndexRetriever.ts new file mode 100644 index 0000000000000000000000000000000000000000..16866c632b52cc66115c6902e0e2a5bad4fa447a --- /dev/null +++ b/packages/core/src/indices/keyword/KeywordTableIndexRetriever.ts @@ -0,0 +1,119 @@ +import { NodeWithScore } from "../../Node"; +import { + defaultKeywordExtractPrompt, + defaultQueryKeywordExtractPrompt, + KeywordExtractPrompt, + QueryKeywordExtractPrompt, +} from "../../Prompt"; +import { BaseRetriever } from "../../Retriever"; +import { ServiceContext } from "../../ServiceContext"; +import { BaseDocumentStore } from "../../storage/docStore/types"; +import { KeywordTable } from "../BaseIndex"; +import { KeywordTableIndex } from "./KeywordTableIndex"; +import { + extractKeywordsGivenResponse, + rakeExtractKeywords, + simpleExtractKeywords, +} from "./utils"; + +// Base Keyword Table Retriever +abstract class BaseKeywordTableRetriever implements BaseRetriever { + protected index: KeywordTableIndex; + protected indexStruct: KeywordTable; + protected docstore: BaseDocumentStore; + protected serviceContext: ServiceContext; + + protected maxKeywordsPerQuery: number; // Maximum number of keywords to extract from query. + protected numChunksPerQuery: number; // Maximum number of text chunks to query. + protected keywordExtractTemplate: KeywordExtractPrompt; // A Keyword Extraction Prompt + protected queryKeywordExtractTemplate: QueryKeywordExtractPrompt; // A Query Keyword Extraction Prompt + + constructor({ + index, + keywordExtractTemplate, + queryKeywordExtractTemplate, + maxKeywordsPerQuery = 10, + numChunksPerQuery = 10, + }: { + index: KeywordTableIndex; + keywordExtractTemplate?: KeywordExtractPrompt; + queryKeywordExtractTemplate?: QueryKeywordExtractPrompt; + maxKeywordsPerQuery: number; + numChunksPerQuery: number; + }) { + this.index = index; + this.indexStruct = index.indexStruct; + this.docstore = index.docStore; + this.serviceContext = index.serviceContext; + + this.maxKeywordsPerQuery = maxKeywordsPerQuery; + this.numChunksPerQuery = numChunksPerQuery; + this.keywordExtractTemplate = + keywordExtractTemplate || defaultKeywordExtractPrompt; + this.queryKeywordExtractTemplate = + queryKeywordExtractTemplate || defaultQueryKeywordExtractPrompt; + } + + abstract getKeywords(query: string): Promise<string[]>; + + async retrieve(query: string): Promise<NodeWithScore[]> { + const keywords = await this.getKeywords(query); + const chunkIndicesCount: { [key: string]: number } = {}; + const filteredKeywords = keywords.filter((keyword) => + this.indexStruct.table.has(keyword), + ); + + for (let keyword of filteredKeywords) { + for (let nodeId of this.indexStruct.table.get(keyword) || []) { + chunkIndicesCount[nodeId] = (chunkIndicesCount[nodeId] ?? 0) + 1; + } + } + + const sortedChunkIndices = Object.keys(chunkIndicesCount) + .sort((a, b) => chunkIndicesCount[b] - chunkIndicesCount[a]) + .slice(0, this.numChunksPerQuery); + + const sortedNodes = await this.docstore.getNodes(sortedChunkIndices); + + return sortedNodes.map((node) => ({ node })); + } + + getServiceContext(): ServiceContext { + return this.index.serviceContext; + } +} + +// Extracts keywords using GPT. +export class KeywordTableGPTRetriever extends BaseKeywordTableRetriever { + async getKeywords(query: string): Promise<string[]> { + const response = await this.serviceContext.llm.complete( + this.queryKeywordExtractTemplate({ + text: query, + maxKeywords: String(this.maxKeywordsPerQuery), + }), + ); + const keywords = extractKeywordsGivenResponse( + response.message.content, + "KEYWORDS:", + ); + return [...keywords]; + } +} + +// Extracts keywords using simple regex-based keyword extractor. +export class KeywordTableSimpleRetriever extends BaseKeywordTableRetriever { + getKeywords(query: string): Promise<string[]> { + return Promise.resolve([ + ...simpleExtractKeywords(query, this.maxKeywordsPerQuery), + ]); + } +} + +// Extracts keywords using RAKE keyword extractor +export class KeywordTableRAKERetriever extends BaseKeywordTableRetriever { + getKeywords(query: string): Promise<string[]> { + return Promise.resolve([ + ...rakeExtractKeywords(query, this.maxKeywordsPerQuery), + ]); + } +} diff --git a/packages/core/src/indices/keyword/index.ts b/packages/core/src/indices/keyword/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b84c72fba270290c4175ff27545388ff32e17db4 --- /dev/null +++ b/packages/core/src/indices/keyword/index.ts @@ -0,0 +1,9 @@ +export { + KeywordTableIndex, + KeywordTableRetrieverMode, +} from "./KeywordTableIndex"; +export { + KeywordTableGPTRetriever, + KeywordTableRAKERetriever, + KeywordTableSimpleRetriever, +} from "./KeywordTableIndexRetriever"; diff --git a/packages/core/src/indices/keyword/utils.ts b/packages/core/src/indices/keyword/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4903bf42d721d5804b4a80f6df46b8cf278f560 --- /dev/null +++ b/packages/core/src/indices/keyword/utils.ts @@ -0,0 +1,77 @@ +// @ts-ignore +import rake from "rake-js"; + +// Get subtokens from a list of tokens., filtering for stopwords. +export function expandTokensWithSubtokens(tokens: Set<string>): Set<string> { + const results: Set<string> = new Set(); + const regex: RegExp = /\w+/g; + + for (let token of tokens) { + results.add(token); + const subTokens: RegExpMatchArray | null = token.match(regex); + if (subTokens && subTokens.length > 1) { + for (let w of subTokens) { + results.add(w); + } + } + } + return results; +} + +export function extractKeywordsGivenResponse( + response: string, + startToken: string = "", + lowercase: boolean = true, +): Set<string> { + const results: string[] = []; + response = response.trim(); + + if (response.startsWith(startToken)) { + response = response.substring(startToken.length); + } + + const keywords: string[] = response.split(","); + for (let k of keywords) { + let rk: string = k; + if (lowercase) { + rk = rk.toLowerCase(); + } + results.push(rk.trim()); + } + + return expandTokensWithSubtokens(new Set(results)); +} +export function simpleExtractKeywords( + textChunk: string, + maxKeywords?: number, +): Set<string> { + const regex: RegExp = /\w+/g; + let tokens: string[] = [...textChunk.matchAll(regex)].map((token) => + token[0].toLowerCase().trim(), + ); + + // Creating a frequency map + const valueCounts: Map<string, number> = new Map(); + for (let token of tokens) { + valueCounts.set(token, (valueCounts.get(token) || 0) + 1); + } + + // Sorting by frequency and taking the top 'maxKeywords' tokens + const keywords: string[] = [...valueCounts.entries()] + .sort((a, b) => b[1] - a[1]) + .map((entry) => entry[0]) + .slice(0, maxKeywords); + + return new Set(keywords); +} + +export function rakeExtractKeywords( + textChunk: string, + maxKeywords: number | null = null, +): Set<string> { + const keywords = rake(textChunk); + const limitedKeywords = maxKeywords + ? keywords.slice(0, maxKeywords) + : keywords; + return new Set(limitedKeywords); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 880b34e546333aa2e0a96ddf6c5a0347897388fd..09a0c68a72ea017ea82a5a9672623175bacdfdea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ importers: devDependencies: '@turbo/gen': specifier: ^1.10.13 - version: 1.10.13(@types/node@20.5.7)(typescript@5.2.2) + version: 1.10.13(@types/node@18.17.12)(typescript@4.9.5) '@types/jest': specifier: ^29.5.4 version: 29.5.4 @@ -32,16 +32,16 @@ importers: version: 8.0.3 jest: specifier: ^29.6.4 - version: 29.6.4(@types/node@20.5.7) + version: 29.6.4(@types/node@18.17.12) prettier: specifier: ^3.0.3 version: 3.0.3 prettier-plugin-organize-imports: specifier: ^3.2.3 - version: 3.2.3(prettier@3.0.3)(typescript@5.2.2) + version: 3.2.3(prettier@3.0.3)(typescript@4.9.5) ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.22.11)(jest@29.6.4)(typescript@5.2.2) + version: 29.1.1(@babel/core@7.22.11)(jest@29.6.4)(typescript@4.9.5) turbo: specifier: ^1.10.13 version: 1.10.13 @@ -128,6 +128,9 @@ importers: pdf-parse: specifier: ^1.1.1 version: 1.1.1 + rake-js: + specifier: ^0.1.1 + version: 0.1.1 replicate: specifier: ^0.16.1 version: 0.16.1 @@ -161,22 +164,22 @@ importers: version: 1.2.0 tsup: specifier: ^7.2.0 - version: 7.2.0(typescript@5.2.2) + version: 7.2.0(typescript@4.9.5) packages/eslint-config-custom: dependencies: eslint-config-next: specifier: ^13.4.1 - version: 13.4.1(eslint@8.48.0)(typescript@5.2.2) + version: 13.4.1(eslint@7.32.0)(typescript@4.9.5) eslint-config-prettier: specifier: ^8.3.0 - version: 8.8.0(eslint@8.48.0) + version: 8.8.0(eslint@7.32.0) eslint-config-turbo: specifier: ^1.9.3 - version: 1.9.3(eslint@8.48.0) + version: 1.9.3(eslint@7.32.0) eslint-plugin-react: specifier: 7.28.0 - version: 7.28.0(eslint@8.48.0) + version: 7.28.0(eslint@7.32.0) devDependencies: next: specifier: ^13.4.10 @@ -2698,7 +2701,7 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.2.20 + '@types/react': 18.2.21 prop-types: 15.8.1 react: 17.0.2 @@ -3147,21 +3150,6 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.48.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@eslint-community/regexpp@4.8.0: - resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: false - /@eslint/eslintrc@0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3178,28 +3166,6 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@eslint/js@8.48.0: - resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -3208,17 +3174,6 @@ packages: dependencies: '@hapi/hoek': 9.3.0 - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: false - /@humanwhocodes/config-array@0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -3229,11 +3184,6 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: false - /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} @@ -3929,7 +3879,7 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@turbo/gen@1.10.13(@types/node@20.5.7)(typescript@5.2.2): + /@turbo/gen@1.10.13(@types/node@18.17.12)(typescript@4.9.5): resolution: {integrity: sha512-fwGVjeun2i0RIdq/20d2wpatPw9vE4Mbk60uB8rk8NENDXn2JLfbsh00mZ5KAEX5ZQUibh6tD+B7xROV8Eb7dQ==} hasBin: true dependencies: @@ -3941,7 +3891,7 @@ packages: minimatch: 9.0.3 node-plop: 0.26.3 proxy-agent: 6.3.0 - ts-node: 10.9.1(@types/node@20.5.7)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@18.17.12)(typescript@4.9.5) update-check: 1.5.4 validate-npm-package-name: 5.0.0 transitivePeerDependencies: @@ -4242,7 +4192,7 @@ packages: resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.20 + '@types/react': 18.2.21 /@types/react@18.2.20: resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} @@ -4257,7 +4207,6 @@ packages: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 csstype: 3.1.2 - dev: false /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} @@ -4345,7 +4294,7 @@ packages: dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/parser@5.59.2(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/parser@5.59.2(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4357,10 +4306,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.59.2 '@typescript-eslint/types': 5.59.2 - '@typescript-eslint/typescript-estree': 5.59.2(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 5.59.2(typescript@4.9.5) debug: 4.3.4 - eslint: 8.48.0 - typescript: 5.2.2 + eslint: 7.32.0 + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: false @@ -4378,7 +4327,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /@typescript-eslint/typescript-estree@5.59.2(typescript@5.2.2): + /@typescript-eslint/typescript-estree@5.59.2(typescript@4.9.5): resolution: {integrity: sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4393,8 +4342,8 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: false @@ -4533,14 +4482,6 @@ packages: dependencies: acorn: 7.4.1 - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: false - /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -5757,6 +5698,11 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /condense-whitespace@1.0.0: + resolution: {integrity: sha512-1eu4eAfuH4oongidVWOX8EkYUxTmav9SpEW1YUeNVWzrdgJTEoXFnF7WuLL+sI9SSQdfnKWjObAn/g9SkseUiw==} + engines: {node: '>=0.10.0'} + dev: false + /configstore@5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} engines: {node: '>=8'} @@ -6843,7 +6789,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-next@13.4.1(eslint@8.48.0)(typescript@5.2.2): + /eslint-config-next@13.4.1(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-ajuxjCkW1hvirr0EQZb3/B/bFH52Z7CT89uCtTcICFL9l30i5c8hN4p0LXvTjdOXNPV5fEDcxBgGHgXdzTj1/A==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 @@ -6854,36 +6800,36 @@ packages: dependencies: '@next/eslint-plugin-next': 13.4.1 '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/parser': 5.59.2(eslint@8.48.0)(typescript@5.2.2) - eslint: 8.48.0 + '@typescript-eslint/parser': 5.59.2(eslint@7.32.0)(typescript@4.9.5) + eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.48.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) - eslint-plugin-react: 7.32.2(eslint@8.48.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) - typescript: 5.2.2 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@7.32.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@7.32.0) + eslint-plugin-react: 7.32.2(eslint@7.32.0) + eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0) + typescript: 4.9.5 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color dev: false - /eslint-config-prettier@8.8.0(eslint@8.48.0): + /eslint-config-prettier@8.8.0(eslint@7.32.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.48.0 + eslint: 7.32.0 dev: false - /eslint-config-turbo@1.9.3(eslint@8.48.0): + /eslint-config-turbo@1.9.3(eslint@7.32.0): resolution: {integrity: sha512-QG6jxFQkrGSpQqlFKefPdtgUfr20EbU0s4tGGIuGFOcPuJEdsY6VYZpZUxNJvmMcTGqPgMyOPjAFBKhy/DPHLA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.48.0 - eslint-plugin-turbo: 1.9.3(eslint@8.48.0) + eslint: 7.32.0 + eslint-plugin-turbo: 1.9.3(eslint@7.32.0) dev: false /eslint-import-resolver-node@0.3.7: @@ -6896,7 +6842,7 @@ packages: - supports-color dev: false - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.48.0): + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@7.32.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -6905,9 +6851,9 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.13.0 - eslint: 8.48.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0) + eslint: 7.32.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) get-tsconfig: 4.5.0 globby: 13.1.4 is-core-module: 2.12.0 @@ -6920,7 +6866,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -6941,16 +6887,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.59.2(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.59.2(eslint@7.32.0)(typescript@4.9.5) debug: 3.2.7 - eslint: 8.48.0 + eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.48.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@7.32.0) transitivePeerDependencies: - supports-color dev: false - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -6960,15 +6906,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.59.2(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.59.2(eslint@7.32.0)(typescript@4.9.5) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) has: 1.0.3 is-core-module: 2.12.0 is-glob: 4.0.3 @@ -6983,7 +6929,7 @@ packages: - supports-color dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@7.32.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -6998,7 +6944,7 @@ packages: axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.48.0 + eslint: 7.32.0 has: 1.0.3 jsx-ast-utils: 3.3.3 language-tags: 1.0.5 @@ -7008,16 +6954,16 @@ packages: semver: 6.3.0 dev: false - /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): + /eslint-plugin-react-hooks@4.6.0(eslint@7.32.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.48.0 + eslint: 7.32.0 dev: false - /eslint-plugin-react@7.28.0(eslint@8.48.0): + /eslint-plugin-react@7.28.0(eslint@7.32.0): resolution: {integrity: sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==} engines: {node: '>=4'} peerDependencies: @@ -7026,7 +6972,7 @@ packages: array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 7.32.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -7040,7 +6986,7 @@ packages: string.prototype.matchall: 4.0.8 dev: false - /eslint-plugin-react@7.32.2(eslint@8.48.0): + /eslint-plugin-react@7.32.2(eslint@7.32.0): resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} peerDependencies: @@ -7050,7 +6996,7 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 7.32.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -7064,12 +7010,12 @@ packages: string.prototype.matchall: 4.0.8 dev: false - /eslint-plugin-turbo@1.9.3(eslint@8.48.0): + /eslint-plugin-turbo@1.9.3(eslint@7.32.0): resolution: {integrity: sha512-ZsRtksdzk3v+z5/I/K4E50E4lfZ7oYmLX395gkrUMBz4/spJlYbr+GC8hP9oVNLj9s5Pvnm9rLv/zoj5PVYaVw==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.48.0 + eslint: 7.32.0 dev: false /eslint-scope@5.1.1: @@ -7079,14 +7025,6 @@ packages: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: false - /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} @@ -7106,11 +7044,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - /eslint@7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -7159,52 +7092,6 @@ packages: transitivePeerDependencies: - supports-color - /eslint@8.48.0: - resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@eslint-community/regexpp': 4.8.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.48.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: false - /espree@7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} @@ -7213,15 +7100,6 @@ packages: acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - dev: false - /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -7659,6 +7537,12 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: false + /franc@3.1.1: + resolution: {integrity: sha512-AV6c8eGQRl3lxtC43ESNZZFddUsYIVmxaXQiVtuRNPy2MHeFvxZhQrvaV28t16GwxPYrwm5dAwt+PRBZRRQZpA==} + dependencies: + trigram-utils: 1.0.3 + dev: false + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -7986,10 +7870,6 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: false - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: false - /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} @@ -9037,7 +8917,7 @@ packages: - supports-color dev: true - /jest-cli@29.6.4(@types/node@20.5.7): + /jest-cli@29.6.4(@types/node@18.17.12): resolution: {integrity: sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9054,7 +8934,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.6.4(@types/node@20.5.7) + jest-config: 29.6.4(@types/node@18.17.12) jest-util: 29.6.3 jest-validate: 29.6.3 prompts: 2.4.2 @@ -9066,6 +8946,46 @@ packages: - ts-node dev: true + /jest-config@29.6.4(@types/node@18.17.12): + resolution: {integrity: sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.22.11 + '@jest/test-sequencer': 29.6.4 + '@jest/types': 29.6.3 + '@types/node': 18.17.12 + babel-jest: 29.6.4(@babel/core@7.22.11) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.4 + jest-environment-node: 29.6.4 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.6.4 + jest-runner: 29.6.4 + jest-util: 29.6.3 + jest-validate: 29.6.3 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.3 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-config@29.6.4(@types/node@20.5.7): resolution: {integrity: sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9406,7 +9326,7 @@ packages: supports-color: 8.1.1 dev: true - /jest@29.6.4(@types/node@20.5.7): + /jest@29.6.4(@types/node@18.17.12): resolution: {integrity: sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9419,7 +9339,7 @@ packages: '@jest/core': 29.6.4 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.6.4(@types/node@20.5.7) + jest-cli: 29.6.4(@types/node@18.17.12) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -10053,6 +9973,10 @@ packages: thenify-all: 1.6.0 dev: true + /n-gram@1.1.2: + resolution: {integrity: sha512-mBTpWKp0NHdujHmxrskPg2jc108mjyMmVxHN1rZGK/ogTLi9O0debDIXlQPqotNELdNmVGtL4jr7SCig+4OWvQ==} + dev: false + /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -11236,7 +11160,7 @@ packages: engines: {node: '>=4'} dev: false - /prettier-plugin-organize-imports@3.2.3(prettier@3.0.3)(typescript@5.2.2): + /prettier-plugin-organize-imports@3.2.3(prettier@3.0.3)(typescript@4.9.5): resolution: {integrity: sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==} peerDependencies: '@volar/vue-language-plugin-pug': ^1.0.4 @@ -11250,7 +11174,7 @@ packages: optional: true dependencies: prettier: 3.0.3 - typescript: 5.2.2 + typescript: 4.9.5 dev: true /prettier@2.8.8: @@ -11443,6 +11367,15 @@ packages: engines: {node: '>=8'} dev: false + /rake-js@0.1.1: + resolution: {integrity: sha512-NARP3fiQok9El3ewwszuwVbCnxLiggNOBBDSt4LB9HFjbUUjKQEQncO8Fq9C9TUapChMsYz7NgvICiOhdF+HYg==} + dependencies: + condense-whitespace: 1.0.0 + franc: 3.1.1 + lodash: 4.17.21 + snowball: 0.3.1 + dev: false + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -12436,6 +12369,11 @@ packages: no-case: 2.3.2 dev: true + /snowball@0.3.1: + resolution: {integrity: sha512-mCgdHVUCYV2W67Wm75phNERUQ01a6k1Rbjm3l2wF3QWVaxLxf2Iu3Jm3nWlZW3S6g0SdQcn9AEsnhgBoplw+3g==} + engines: {node: '>=0'} + dev: false + /sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} dependencies: @@ -13049,6 +12987,14 @@ packages: hasBin: true dev: true + /trigram-utils@1.0.3: + resolution: {integrity: sha512-UAhS1Ll21FtClVIzIN0I/SmGnJ+D08BOxX7Dl1penV8raC0ksf2dJkhNI6kU1Mj3uT86Bul12iMvxXquXSYSng==} + dependencies: + collapse-white-space: 1.0.6 + n-gram: 1.1.2 + trim: 1.0.1 + dev: false + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -13071,7 +13017,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-jest@29.1.1(@babel/core@7.22.11)(jest@29.6.4)(typescript@5.2.2): + /ts-jest@29.1.1(@babel/core@7.22.11)(jest@29.6.4)(typescript@4.9.5): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -13095,17 +13041,17 @@ packages: '@babel/core': 7.22.11 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.6.4(@types/node@20.5.7) + jest: 29.6.4(@types/node@18.17.12) jest-util: 29.6.3 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 5.2.2 + typescript: 4.9.5 yargs-parser: 21.1.1 dev: true - /ts-node@10.9.1(@types/node@20.5.7)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@18.17.12)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -13124,14 +13070,14 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.7 + '@types/node': 18.17.12 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.2.2 + typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -13155,7 +13101,7 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsup@7.2.0(typescript@5.2.2): + /tsup@7.2.0(typescript@4.9.5): resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true @@ -13185,20 +13131,20 @@ packages: source-map: 0.8.0-beta.0 sucrase: 3.34.0 tree-kill: 1.2.2 - typescript: 5.2.2 + typescript: 4.9.5 transitivePeerDependencies: - supports-color - ts-node dev: true - /tsutils@3.21.0(typescript@5.2.2): + /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.2.2 + typescript: 4.9.5 dev: false /tty-browserify@0.0.1: @@ -13369,11 +13315,6 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - /ua-parser-js@1.0.35: resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} dev: false