diff --git a/package.json b/package.json index 9e9fed74f..7790dcafa 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "tape": "^5.6.1", "tcompare": "^6.0.0", "tsx": "^3.12.1", - "turbo": "^1.8.5", + "turbo": "^2.1.3", "typescript": "^5.0.0" }, "author": { diff --git a/packages/benchmarks/benchmark/results/reduce.chart.html b/packages/benchmarks/benchmark/results/reduce.chart.html new file mode 100644 index 000000000..7b44bde35 --- /dev/null +++ b/packages/benchmarks/benchmark/results/reduce.chart.html @@ -0,0 +1,116 @@ + + + + + + + + Example + + + +
+ +
+ + + \ No newline at end of file diff --git a/packages/benchmarks/benchmark/results/reduce.json b/packages/benchmarks/benchmark/results/reduce.json new file mode 100644 index 000000000..c062615cb --- /dev/null +++ b/packages/benchmarks/benchmark/results/reduce.json @@ -0,0 +1,21 @@ +{ + "name": "Example", + "date": "2023-06-07T13:16:45.810Z", + "version": "1.0.0", + "results": [ + { + "name": "3arr - 0.5", + "ops": 2606835, + "margin": 0.16, + "percentSlower": 0 + } + ], + "fastest": { + "name": "3arr - 0.5", + "index": 0 + }, + "slowest": { + "name": "3arr - 0.5", + "index": 0 + } +} diff --git a/packages/orama/package.json b/packages/orama/package.json index 1db4035cd..b95c71a10 100644 --- a/packages/orama/package.json +++ b/packages/orama/package.json @@ -148,7 +148,7 @@ "commitizen": "^4.2.6", "glob": "^9.2.3", "prettier": "^2.8.1", - "tap": "^18.6.1", + "tap": "^21.0.1", "tap-mocha-reporter": "^5.0.3", "tape": "^5.6.1", "tcompare": "^6.0.0", diff --git a/packages/orama/src/components/index.ts b/packages/orama/src/components/index.ts index c3b82c48a..77878f87f 100644 --- a/packages/orama/src/components/index.ts +++ b/packages/orama/src/components/index.ts @@ -13,11 +13,8 @@ import type { ScalarSearchableType, SearchableType, SearchableValue, - SearchContext, - SearchParamsFullText, Tokenizer, TokenScore, - TypedDocument, VectorIndex, VectorType, WhereCondition @@ -32,7 +29,7 @@ import { RadixTree } from '../trees/radix.js' import { BKDTree } from '../trees/bkd.js' import { BoolNode } from '../trees/bool.js' -import { convertDistanceToMeters, intersect, safeArrayPush, getOwnProperty } from '../utils.js' +import { convertDistanceToMeters, intersect, safeArrayPush } from '../utils.js' import { BM25 } from './algorithms.js' import { getMagnitude } from './cosine-similarity.js' import { getInnerType, getVectorSize, isArrayType, isVectorType } from './defaults.js' @@ -139,46 +136,6 @@ export function removeTokenScoreParameters(index: Index, prop: string, token: st index.tokenOccurrences[prop][token]-- } -export function calculateResultScores>( - context: SearchContext>, - index: Index, - prop: string, - term: string, - ids: DocumentID[] -): TokenScore[] { - const documentIDs = Array.from(ids) - - // Exact fields for TF-IDF - const avgFieldLength = index.avgFieldLength[prop] - const fieldLengths = index.fieldLengths[prop] - const oramaOccurrences = index.tokenOccurrences[prop] - const oramaFrequencies = index.frequencies[prop] - - // oramaOccurrences[term] can be undefined, 0, string, or { [k: string]: number } - const termOccurrences = typeof oramaOccurrences[term] === 'number' ? oramaOccurrences[term] ?? 0 : 0 - - const scoreList: TokenScore[] = [] - - // Calculate TF-IDF value for each term, in each document, for each index. - const documentIDsLength = documentIDs.length - for (let k = 0; k < documentIDsLength; k++) { - const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, documentIDs[k]) - const tf = oramaFrequencies?.[internalId]?.[term] ?? 0 - - const bm25 = BM25( - tf, - termOccurrences, - context.docsCount, - fieldLengths[internalId]!, - avgFieldLength, - context.params.relevance! as Required - ) - - scoreList.push([internalId, bm25]) - } - return scoreList -} - export function create( orama: T, sharedInternalDocumentStore: T['internalDocumentIDStore'], @@ -258,15 +215,13 @@ function insertScalarBuilder( implementation: IIndex, index: Index, prop: string, - id: DocumentID, + internalId: InternalDocumentID, language: string | undefined, tokenizer: Tokenizer, docsCount: number, options?: InsertOptions ) { return (value: SearchableValue) => { - const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id) - const { type, node } = index.indexes[prop] switch (type) { case 'Bool': { @@ -307,6 +262,7 @@ export function insert( index: Index, prop: string, id: DocumentID, + internalId: InternalDocumentID, value: SearchableValue, schemaType: SearchableType, language: string | undefined, @@ -318,7 +274,7 @@ export function insert( return insertVector(index, prop, value as number[] | Float32Array, id) } - const insertScalar = insertScalarBuilder(implementation, index, prop, id, language, tokenizer, docsCount, options) + const insertScalar = insertScalarBuilder(implementation, index, prop, internalId, language, tokenizer, docsCount, options) if (!isArrayType(schemaType)) { return insertScalar(value) @@ -429,42 +385,144 @@ export function remove( return true } -export function search>( - context: SearchContext>, +export function calculateResultScores( index: Index, prop: string, - term: string -): TokenScore[] { - if (!(prop in index.tokenOccurrences)) { - return [] + term: string, + ids: InternalDocumentID[], + docsCount: number, + bm25Relevance: Required, + resultsMap: Map, + boostPerProperty: number, +) { + const documentIDs = Array.from(ids) + + // Exact fields for TF-IDF + const avgFieldLength = index.avgFieldLength[prop] + const fieldLengths = index.fieldLengths[prop] + const oramaOccurrences = index.tokenOccurrences[prop] + const oramaFrequencies = index.frequencies[prop] + + // oramaOccurrences[term] can be undefined, 0, string, or { [k: string]: number } + const termOccurrences = typeof oramaOccurrences[term] === 'number' ? oramaOccurrences[term] ?? 0 : 0 + + // Calculate TF-IDF value for each term, in each document, for each index. + const documentIDsLength = documentIDs.length + for (let k = 0; k < documentIDsLength; k++) { + const internalId = documentIDs[k] + const tf = oramaFrequencies?.[internalId]?.[term] ?? 0 + + const bm25 = BM25( + tf, + termOccurrences, + docsCount, + fieldLengths[internalId]!, + avgFieldLength, + bm25Relevance, + ) + + if (resultsMap.has(internalId)) { + resultsMap.set(internalId, resultsMap.get(internalId)! + bm25 * boostPerProperty) + } else { + resultsMap.set(internalId, bm25 * boostPerProperty) + } } +} - const { node, type } = index.indexes[prop] - if (type !== 'Radix') { - throw createError('WRONG_SEARCH_PROPERTY_TYPE', prop) +function searchInProperty( + index: Index, + tree: RadixTree, + prop: string, + tokens: string[], + exact: boolean, + tolerance: number, + resultsMap: Map, + boostPerProperty: number, + bm25Relevance: Required, + docsCount: number, +) { + const tokenLength = tokens.length; + for (let i = 0; i < tokenLength; i++) { + const term = tokens[i]; + + const searchResult = tree.find({ term, exact, tolerance }) + + const termsFound = Object.keys(searchResult) + const termsFoundLength = termsFound.length; + for (let j = 0; j < termsFoundLength; j++) { + const word = termsFound[j] + const ids = searchResult[word] + calculateResultScores( + index, + prop, + word, + ids, + docsCount, + bm25Relevance, + resultsMap, + boostPerProperty, + ) + } } +} - const { exact, tolerance } = context.params - const searchResult = node.find({ term, exact, tolerance }) - const ids = new Set() +export function search( + index: Index, + term: string, + tokenizer: Tokenizer, + language: string | undefined, + propertiesToSearch: string[], + exact: boolean, + tolerance: number, + boost: Record, + relevance: Required, + docsCount: number +): TokenScore[] { + const tokens = tokenizer.tokenize(term, language) - for (const key in searchResult) { - //skip keys inherited from prototype - const ownProperty = getOwnProperty(searchResult, key) - if (!ownProperty) continue + const resultsMap = new Map() + for (const prop of propertiesToSearch) { + if (!(prop in index.indexes)) { + continue + } - for (const id of searchResult[key]) { - ids.add(id) + const tree = index.indexes[prop] + const { type } = tree + if (type !== 'Radix') { + throw createError('WRONG_SEARCH_PROPERTY_TYPE', prop) + } + const boostPerProperty = boost[prop] ?? 1 + if (boostPerProperty <= 0) { + throw createError('INVALID_BOOST_VALUE', boostPerProperty) } + + // if the tokenizer returns an empty array, we returns all the documents + if (tokens.length === 0 && !term) { + tokens.push('') + } + + searchInProperty( + index, + tree.node, + prop, + tokens, + exact, + tolerance, + resultsMap, + boostPerProperty, + relevance, + docsCount + ) } - return context.index.calculateResultScores(context, index, prop, term, Array.from(ids)) + return Array.from(resultsMap) } -export function searchByWhereClause>( - context: SearchContext, +export function searchByWhereClause( index: Index, - filters: Partial> + tokenizer: Tokenizer, + filters: Partial>, + language: string | undefined ): number[] { const filterKeys = Object.keys(filters) @@ -537,7 +595,7 @@ export function searchByWhereClause( orama.tokenizer, docsCount ) + const internalId = orama.internalDocumentIDStore.idToInternalId.get(id) await orama.index.insert( orama.index, orama.data.index, prop, id, + internalId!, value, expectedType, language, @@ -231,12 +234,14 @@ function indexAndSortDocumentSync( const expectedType = orama.index.getSearchablePropertiesWithTypes(orama.data.index)[prop] + const internalDocumentId = getInternalDocumentId(orama.internalDocumentIDStore, id) orama.index.beforeInsert?.(orama.data.index, prop, id, value, expectedType, language, orama.tokenizer, docsCount) orama.index.insert( orama.index, orama.data.index, prop, id, + internalDocumentId, value, expectedType, language, diff --git a/packages/orama/src/methods/remove.ts b/packages/orama/src/methods/remove.ts index 301ed5e60..c5a33a504 100644 --- a/packages/orama/src/methods/remove.ts +++ b/packages/orama/src/methods/remove.ts @@ -164,7 +164,7 @@ function removeSync(orama: T, id: DocumentID, language?: str schemaType, language, orama.tokenizer, - docsCount + docsCount, ) ) { result = false diff --git a/packages/orama/src/methods/search-fulltext.ts b/packages/orama/src/methods/search-fulltext.ts index 5ca32b0c6..eca6034ca 100644 --- a/packages/orama/src/methods/search-fulltext.ts +++ b/packages/orama/src/methods/search-fulltext.ts @@ -1,13 +1,13 @@ -import { prioritizeTokenScores } from '../components/algorithms.js' import { getFacets } from '../components/facets.js' import { intersectFilteredIDs } from '../components/filters.js' import { getGroups } from '../components/groups.js' import { runAfterSearch, runBeforeSearch } from '../components/hooks.js' -import type { InternalDocumentID } from '../components/internal-document-id-store.js' import { getInternalDocumentId } from '../components/internal-document-id-store.js' +import { Language } from '../components/tokenizer/languages.js' import { createError } from '../errors.js' import type { AnyOrama, + BM25Params, CustomSorterFunctionItem, ElapsedTime, Results, @@ -15,119 +15,92 @@ import type { TokenScore, TypedDocument } from '../types.js' -import { getNanosecondsTime, removeVectorsFromHits, safeArrayPush, sortTokenScorePredicate } from '../utils.js' -import { createSearchContext, defaultBM25Params, fetchDocuments, fetchDocumentsWithDistinct } from './search.js' +import { getNanosecondsTime, removeVectorsFromHits, sortTokenScorePredicate } from '../utils.js' +import { count } from './docs.js' +import { fetchDocuments, fetchDocumentsWithDistinct } from './search.js' -export function fullTextSearch>( +export function innerFullTextSearch( orama: T, - params: SearchParamsFullText, - language?: string -): Results | Promise> { - const timeStart = getNanosecondsTime() - - const asyncNeeded = orama.beforeSearch?.length || orama.afterSearch?.length - - function performSearchLogic(): Results { - params.relevance = Object.assign(defaultBM25Params, params.relevance ?? {}) - - const vectorProperties = Object.keys(orama.data.index.vectorIndexes) - const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0 - const { limit = 10, offset = 0, term, properties, threshold = 0, distinctOn, includeVectors = false } = params - const isPreflight = params.preflight === true + params: Pick, 'term' | 'properties' | 'where' | 'exact' | 'tolerance' | 'boost' | 'relevance'>, + language: Language | undefined +) { + const { term, properties } = params + + const index = orama.data.index + // Get searchable string properties + let propertiesToSearch = orama.caches['propertiesToSearch'] as string[] + if (!propertiesToSearch) { + const propertiesToSearchWithTypes = orama.index.getSearchablePropertiesWithTypes(index) + + propertiesToSearch = orama.index.getSearchableProperties(index) + propertiesToSearch = propertiesToSearch.filter((prop: string) => + propertiesToSearchWithTypes[prop].startsWith('string') + ) - const { index, docs } = orama.data - const tokens = orama.tokenizer.tokenize(term ?? '', language) - - let propertiesToSearch = orama.caches['propertiesToSearch'] as string[] - if (!propertiesToSearch) { - const propertiesToSearchWithTypes = orama.index.getSearchablePropertiesWithTypes(index) - propertiesToSearch = orama.index.getSearchableProperties(index) - propertiesToSearch = propertiesToSearch.filter((prop: string) => - propertiesToSearchWithTypes[prop].startsWith('string') - ) - orama.caches['propertiesToSearch'] = propertiesToSearch - } + orama.caches['propertiesToSearch'] = propertiesToSearch + } - if (properties && properties !== '*') { - for (const prop of properties) { - if (!propertiesToSearch.includes(prop as string)) { - throw createError('UNKNOWN_INDEX', prop as string, propertiesToSearch.join(', ')) - } + if (properties && properties !== '*') { + for (const prop of properties) { + if (!propertiesToSearch.includes(prop as string)) { + throw createError('UNKNOWN_INDEX', prop as string, propertiesToSearch.join(', ')) } - propertiesToSearch = propertiesToSearch.filter((prop: string) => (properties as string[]).includes(prop)) } - const context = createSearchContext( + propertiesToSearch = propertiesToSearch.filter((prop: string) => (properties as string[]).includes(prop)) + } + + let uniqueDocsIDs: TokenScore[] + // We need to perform the search if: + // - we have a search term + // - or we have properties to search + // in this case, we need to return all the documents that contains at least one of the given properties + if (term || properties) { + + const docsCount = count(orama) + uniqueDocsIDs = orama.index.search( + index, + term || '', orama.tokenizer, - orama.index, - orama.documentsStore, language, - params, propertiesToSearch, - tokens, - orama.documentsStore.count(docs), - timeStart + params.exact || false, + params.tolerance || 0, + params.boost || {}, + applyDefault(params.relevance), + docsCount, ) + } else { + // Tokenizer returns empty array and the search term is empty as well. + // We return all the documents. + uniqueDocsIDs = Object.keys(orama.documentsStore.getAll(orama.data.docs)).map((k) => [+k, 0] as TokenScore) + } - const hasFilters = Object.keys(params.where ?? {}).length > 0 - let whereFiltersIDs: InternalDocumentID[] = [] + // If filters are enabled, we need to get the IDs of the documents that match the filters. + const hasFilters = Object.keys(params.where ?? {}).length > 0 + if (hasFilters) { + const whereFiltersIDs = orama.index.searchByWhereClause(index, orama.tokenizer, params.where!, language) + uniqueDocsIDs = intersectFilteredIDs(whereFiltersIDs, uniqueDocsIDs) + } - if (hasFilters) { - whereFiltersIDs = orama.index.searchByWhereClause(context, index, params.where!) - } + return uniqueDocsIDs +} - const tokensLength = tokens.length - if (tokensLength || properties?.length) { - const indexesLength = propertiesToSearch.length - for (let i = 0; i < indexesLength; i++) { - const prop = propertiesToSearch[i] - const docIds = context.indexMap[prop] - - if (tokensLength !== 0) { - for (let j = 0; j < tokensLength; j++) { - const term = tokens[j] - const scoreList = orama.index.search(context, index, prop, term) - safeArrayPush(docIds[term], scoreList) - } - } else { - docIds[''] = [] - const scoreList = orama.index.search(context, index, prop, '') - safeArrayPush(docIds[''], scoreList) - } - - const vals = Object.values(docIds) - context.docsIntersection[prop] = prioritizeTokenScores( - vals, - params?.boost?.[prop] ?? 1, - threshold, - tokensLength - ) - const uniqueDocs = context.docsIntersection[prop] - - const uniqueDocsLength = uniqueDocs.length - for (let i = 0; i < uniqueDocsLength; i++) { - const [id, score] = uniqueDocs[i] - const prevScore = context.uniqueDocsIDs[id] - if (prevScore) { - context.uniqueDocsIDs[id] = prevScore + score + 0.5 - } else { - context.uniqueDocsIDs[id] = score - } - } - } - } else if (tokens.length === 0 && term) { - context.uniqueDocsIDs = {} - } else { - context.uniqueDocsIDs = Object.fromEntries( - Object.keys(orama.documentsStore.getAll(orama.data.docs)).map((k) => [k, 0]) - ) - } - let uniqueDocsArray = Object.entries(context.uniqueDocsIDs).map(([id, score]) => [+id, score] as TokenScore) +export function fullTextSearch>( + orama: T, + params: SearchParamsFullText, + language?: string +): Results | Promise> { + const timeStart = getNanosecondsTime() + + function performSearchLogic(): Results { + const vectorProperties = Object.keys(orama.data.index.vectorIndexes) + const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0 + const { limit = 10, offset = 0, distinctOn, includeVectors = false } = params + const isPreflight = params.preflight === true - if (hasFilters) { - uniqueDocsArray = intersectFilteredIDs(whereFiltersIDs, uniqueDocsArray) - } + let uniqueDocsArray = innerFullTextSearch(orama, params, language) if (params.sortBy) { if (typeof params.sortBy === 'function') { @@ -181,7 +154,7 @@ export function fullTextSearch(orama, uniqueDocsArray, params.groupBy) } - searchResult.elapsed = orama.formatElapsedTime(getNanosecondsTime() - context.timeStart) as ElapsedTime + searchResult.elapsed = orama.formatElapsedTime(getNanosecondsTime() - timeStart) as ElapsedTime return searchResult } @@ -200,9 +173,24 @@ export function fullTextSearch { + const r = bm25Relevance ?? {} + r.k = r.k ?? defaultBM25Params.k; + r.b = r.b ?? defaultBM25Params.b; + r.d = r.d ?? defaultBM25Params.d; + return r as Required +} \ No newline at end of file diff --git a/packages/orama/src/methods/search-hybrid.ts b/packages/orama/src/methods/search-hybrid.ts index fa503943e..8dcbefde5 100644 --- a/packages/orama/src/methods/search-hybrid.ts +++ b/packages/orama/src/methods/search-hybrid.ts @@ -7,18 +7,27 @@ import type { Result, HybridWeights } from '../types.js' -import type { InternalDocumentID } from '../components/internal-document-id-store.js' -import { getNanosecondsTime, safeArrayPush, formatNanoseconds, removeVectorsFromHits } from '../utils.js' -import { intersectFilteredIDs } from '../components/filters.js' -import { prioritizeTokenScores } from '../components/algorithms.js' -import { createError } from '../errors.js' -import { createSearchContext, defaultBM25Params } from './search.js' +import { getNanosecondsTime, formatNanoseconds, removeVectorsFromHits } from '../utils.js' import { getFacets } from '../components/facets.js' import { getGroups } from '../components/groups.js' -import { findSimilarVectors } from '../components/cosine-similarity.js' -import { getInternalDocumentId } from '../components/internal-document-id-store.js' import { fetchDocuments } from './search.js' -import { runBeforeSearch, runAfterSearch } from '../components/hooks.js' +import { innerFullTextSearch } from './search-fulltext.js' +import { innerVectorSearch } from './search-vector.js' +import { runAfterSearch, runBeforeSearch } from '../components/hooks.js' + +export function innerHybridSearch>( + orama: T, + params: SearchParamsHybrid, + language?: string +) { + const fullTextIDs = minMaxScoreNormalization( + innerFullTextSearch(orama, params, language) + ) + const vectorIDs = innerVectorSearch(orama, params, language) + + const hybridWeights = params.hybridWeights + return mergeAndRankResults(fullTextIDs, vectorIDs, params.term ?? '', hybridWeights) +} export function hybridSearch>( orama: T, @@ -27,60 +36,11 @@ export function hybridSearch | Promise> { const timeStart = getNanosecondsTime() - const asyncNeeded = orama.beforeSearch?.length || orama.afterSearch?.length - function performSearchLogic(): Results { - const { offset = 0, limit = 10, includeVectors = false } = params - const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0 - - const fullTextIDs = getFullTextSearchIDs(orama, params, language) - const vectorIDs = getVectorSearchIDs(orama, params) - - const { index, docs } = orama.data - const hybridWeights = params.hybridWeights - let uniqueTokenScores = mergeAndRankResults(fullTextIDs, vectorIDs, params.term ?? '', hybridWeights) - - const tokens = orama.tokenizer.tokenize(params.term ?? '', language) - let propertiesToSearch = orama.caches['propertiesToSearch'] as string[] - if (!propertiesToSearch) { - const propertiesToSearchWithTypes = orama.index.getSearchablePropertiesWithTypes(index) - propertiesToSearch = orama.index.getSearchableProperties(index) - propertiesToSearch = propertiesToSearch.filter((prop: string) => - propertiesToSearchWithTypes[prop].startsWith('string') - ) - orama.caches['propertiesToSearch'] = propertiesToSearch - } - - if (params.properties && params.properties !== '*') { - for (const prop of params.properties) { - if (!propertiesToSearch.includes(prop as string)) { - throw createError('UNKNOWN_INDEX', prop as string, propertiesToSearch.join(', ')) - } - } - propertiesToSearch = propertiesToSearch.filter((prop: string) => (params.properties as string[]).includes(prop)) - } - - const context = createSearchContext( - orama.tokenizer, - orama.index, - orama.documentsStore, - language, - params, - propertiesToSearch, - tokens, - orama.documentsStore.count(docs), - timeStart - ) - - const hasFilters = Object.keys(params.where ?? {}).length > 0 - let whereFiltersIDs: InternalDocumentID[] = [] - - if (hasFilters) { - whereFiltersIDs = orama.index.searchByWhereClause(context, index, params.where!) - uniqueTokenScores = intersectFilteredIDs(whereFiltersIDs, uniqueTokenScores) - } - + const uniqueTokenScores = innerHybridSearch(orama, params, language) + let facetsResults: any + const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0 if (shouldCalculateFacets) { facetsResults = getFacets(orama, uniqueTokenScores, params.facets!) } @@ -90,6 +50,9 @@ export function hybridSearch(orama, uniqueTokenScores, params.groupBy) } + const offset = params.offset ?? 0 + const limit = params.limit ?? 10 + const results = fetchDocuments(orama, uniqueTokenScores, offset, limit).filter(Boolean) const timeEnd = getNanosecondsTime() @@ -105,6 +68,7 @@ export function hybridSearch> { if (orama.beforeSearch) { await runBeforeSearch(orama.beforeSearch, orama, params, language) @@ -127,6 +92,7 @@ export function hybridSearch>( - orama: T, - params: SearchParamsHybrid, - language?: string -): TokenScore[] { - const timeStart = getNanosecondsTime() - params.relevance = Object.assign(defaultBM25Params, params.relevance ?? {}) - - const { term = '', properties, threshold = 0 } = params - - const { index, docs } = orama.data - const tokens = orama.tokenizer.tokenize(term, language) - - let propertiesToSearch = orama.caches['propertiesToSearch'] as string[] - if (!propertiesToSearch) { - const propertiesToSearchWithTypes = orama.index.getSearchablePropertiesWithTypes(index) - - propertiesToSearch = orama.index.getSearchableProperties(index) - propertiesToSearch = propertiesToSearch.filter((prop: string) => - propertiesToSearchWithTypes[prop].startsWith('string') - ) - - orama.caches['propertiesToSearch'] = propertiesToSearch - } - - if (properties && properties !== '*') { - const propertiesToSearchSet = new Set(propertiesToSearch) - const propertiesSet = new Set(properties as string[]) - - for (const prop of properties) { - if (!propertiesToSearchSet.has(prop as string)) { - throw createError('UNKNOWN_INDEX', prop as string, propertiesToSearch.join(', ')) - } - } - - propertiesToSearch = propertiesToSearch.filter((prop: string) => propertiesSet.has(prop)) - } - - const context = createSearchContext( - orama.tokenizer, - orama.index, - orama.documentsStore, - language, - params, - propertiesToSearch, - tokens, - orama.documentsStore.count(docs), - timeStart - ) - - const tokensLength = tokens.length - - if (tokensLength || (properties && properties.length > 0)) { - const indexesLength = propertiesToSearch.length - for (let i = 0; i < indexesLength; i++) { - const prop = propertiesToSearch[i] - - if (tokensLength !== 0) { - for (let j = 0; j < tokensLength; j++) { - const term = tokens[j] - - // Lookup - const scoreList = orama.index.search(context, index, prop, term) - - safeArrayPush(context.indexMap[prop][term], scoreList) - } - } else { - const indexMapContent = [] - context.indexMap[prop][''] = indexMapContent - const scoreList = orama.index.search(context, index, prop, '') - safeArrayPush(indexMapContent, scoreList) - } - - const docIds = context.indexMap[prop] - const vals = Object.values(docIds) - context.docsIntersection[prop] = prioritizeTokenScores(vals, params?.boost?.[prop] ?? 1, threshold, tokensLength) - const uniqueDocs = context.docsIntersection[prop] - - const uniqueDocsLength = uniqueDocs.length - for (let i = 0; i < uniqueDocsLength; i++) { - const [id, score] = uniqueDocs[i] - const prevScore = context.uniqueDocsIDs[id] - context.uniqueDocsIDs[id] = prevScore ? prevScore + score + 0.5 : score - } - } - } else if (tokens.length === 0 && term) { - // This case is hard to handle correctly. - // For the time being, if tokenizer returns empty array but the term is not empty, - // we returns an empty result set - context.uniqueDocsIDs = {} - } else { - context.uniqueDocsIDs = Object.fromEntries( - Object.keys(orama.documentsStore.getAll(orama.data.docs)).map((k) => [k, 0]) - ) - } - - const uniqueIDs = Object.entries(context.uniqueDocsIDs) - .map(([id, score]) => [+id, score] as TokenScore) - .sort((a, b) => b[1] - a[1]) - - return minMaxScoreNormalization(uniqueIDs) -} - -export function getVectorSearchIDs>( - orama: T, - params: SearchParamsHybrid -): TokenScore[] { - const vector = params.vector - // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain - const vectorIndex = orama.data.index.vectorIndexes[vector?.property!] - const vectorSize = vectorIndex.size - const vectors = vectorIndex.vectors - - if (vector && (!vector.value || !vector.property)) { - throw createError('INVALID_VECTOR_INPUT', Object.keys(vector).join(', ')) - } - - if (vector!.value.length !== vectorSize) { - throw createError('INVALID_INPUT_VECTOR', vector!.property, vectorSize, vector!.value.length) - } - - if (!(vector instanceof Float32Array)) { - vector!.value = new Float32Array(vector!.value) - } - - const uniqueIDs = findSimilarVectors(vector!.value as Float32Array, vectors, vectorSize, params.similarity).map( - ([id, score]) => [getInternalDocumentId(orama.internalDocumentIDStore, id), score] - ) as TokenScore[] - - return minMaxScoreNormalization(uniqueIDs) -} - -function extractScore([, score]: TokenScore) { - return score +function extractScore(token: TokenScore) { + return token[1] } function minMaxScoreNormalization(results: TokenScore[]): TokenScore[] { diff --git a/packages/orama/src/methods/search-vector.ts b/packages/orama/src/methods/search-vector.ts index a8a03eeab..edcb1cbdd 100644 --- a/packages/orama/src/methods/search-vector.ts +++ b/packages/orama/src/methods/search-vector.ts @@ -1,6 +1,5 @@ import type { AnyOrama, Results, SearchParamsVector, TypedDocument, Result } from '../types.js' import type { InternalDocumentID } from '../components/internal-document-id-store.js' -import { createSearchContext } from './search.js' import { getNanosecondsTime, formatNanoseconds } from '../utils.js' import { getFacets } from '../components/facets.js' import { createError } from '../errors.js' @@ -11,88 +10,86 @@ import { getInternalDocumentId, getDocumentIdFromInternalId } from '../component import { Language } from '../index.js' import { runBeforeSearch, runAfterSearch } from '../components/hooks.js' -export function searchVector>( +export function innerVectorSearch>( orama: T, - params: SearchParamsVector, - language: Language = 'english' -): Results | Promise> { - const timeStart = getNanosecondsTime() + params: Pick, 'vector' | 'similarity' | 'where'>, + language: Language | undefined +) { + const vector = params.vector - const asyncNeeded = orama.beforeSearch?.length || orama.afterSearch?.length - - function performSearchLogic(): Results { - const { vector } = params + if (vector && (!('value' in vector) || !('property' in vector))) { + throw createError('INVALID_VECTOR_INPUT', Object.keys(vector).join(', ')) + } - if (vector && (!('value' in vector) || !('property' in vector))) { - throw createError('INVALID_VECTOR_INPUT', Object.keys(vector).join(', ')) + const vectorIndex = orama.data.index.vectorIndexes[vector!.property] + const vectorSize = vectorIndex.size + if (vector?.value.length !== vectorSize) { + if (vector?.property === undefined || vector?.value.length === undefined) { + throw createError('INVALID_INPUT_VECTOR', 'undefined', vectorSize, 'undefined') } + throw createError('INVALID_INPUT_VECTOR', vector.property, vectorSize, vector.value.length) + } - const { limit = 10, offset = 0, includeVectors = false } = params - const vectorIndex = orama.data.index.vectorIndexes[vector!.property] - const vectorSize = vectorIndex.size - const vectors = vectorIndex.vectors - const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0 - const hasFilters = Object.keys(params.where ?? {}).length > 0 - const { index, docs: oramaDocs } = orama.data + if (!(vector instanceof Float32Array)) { + vector.value = new Float32Array(vector.value) + } - if (vector?.value.length !== vectorSize) { - if (vector?.property === undefined || vector?.value.length === undefined) { - throw createError('INVALID_INPUT_VECTOR', 'undefined', vectorSize, 'undefined') - } - throw createError('INVALID_INPUT_VECTOR', vector.property, vectorSize, vector.value.length) - } + const vectors = vectorIndex.vectors - if (!(vector instanceof Float32Array)) { - vector.value = new Float32Array(vector.value) - } + let results = findSimilarVectors(vector.value as Float32Array, vectors, vectorSize, params.similarity).map( + ([id, score]) => [getInternalDocumentId(orama.internalDocumentIDStore, id), score] + ) as [number, number][] - let results = findSimilarVectors(vector.value as Float32Array, vectors, vectorSize, params.similarity).map( - ([id, score]) => [getInternalDocumentId(orama.internalDocumentIDStore, id), score] - ) as [number, number][] - let propertiesToSearch = orama.caches['propertiesToSearch'] as string[] + let propertiesToSearch = orama.caches['propertiesToSearch'] as string[] - if (!propertiesToSearch) { - const propertiesToSearchWithTypes = orama.index.getSearchablePropertiesWithTypes(index) + const index = orama.data.index + if (!propertiesToSearch) { + const propertiesToSearchWithTypes = orama.index.getSearchablePropertiesWithTypes(index) - propertiesToSearch = orama.index.getSearchableProperties(index) - propertiesToSearch = propertiesToSearch.filter((prop: string) => - propertiesToSearchWithTypes[prop].startsWith('string') - ) + propertiesToSearch = orama.index.getSearchableProperties(index) + propertiesToSearch = propertiesToSearch.filter((prop: string) => + propertiesToSearchWithTypes[prop].startsWith('string') + ) - orama.caches['propertiesToSearch'] = propertiesToSearch - } + orama.caches['propertiesToSearch'] = propertiesToSearch + } - const tokens = [] - - const context = createSearchContext( - orama.tokenizer, - orama.index, - orama.documentsStore, - language, - params, - propertiesToSearch, - tokens, - orama.documentsStore.count(oramaDocs), - timeStart - ) - let whereFiltersIDs: InternalDocumentID[] = [] + let whereFiltersIDs: InternalDocumentID[] = [] - if (hasFilters) { - whereFiltersIDs = orama.index.searchByWhereClause(context, index, params.where!) - results = intersectFilteredIDs(whereFiltersIDs, results) - } + const hasFilters = Object.keys(params.where ?? {}).length > 0 + if (hasFilters) { + whereFiltersIDs = orama.index.searchByWhereClause(index, orama.tokenizer, params.where!, language) + results = intersectFilteredIDs(whereFiltersIDs, results) + } + + return results +} + +export function searchVector>( + orama: T, + params: SearchParamsVector, + language: Language = 'english' +): Results | Promise> { + const timeStart = getNanosecondsTime() + + function performSearchLogic(): Results { + const results = innerVectorSearch(orama, params, language) let facetsResults: any = [] + const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0 if (shouldCalculateFacets) { const facets = getFacets(orama, results, params.facets!) facetsResults = facets } + const vectorProperty = params.vector!.property + const includeVectors = params.includeVectors ?? false + const limit = params.limit ?? 10 + const offset = params.offset ?? 0 const docs: Result[] = Array.from({ length: limit }) - for (let i = 0; i < limit; i++) { const result = results[i + offset] if (!result) { @@ -103,7 +100,7 @@ export function searchVector = { @@ -150,10 +147,11 @@ export function searchVector>( - tokenizer: Tokenizer, - index: T['index'], - documentsStore: T['documentsStore'], - language: string | undefined, - params: SearchParams, - properties: string[], - tokens: string[], - docsCount: number, - timeStart: bigint -): SearchContext { - // If filters are enabled, we need to get the IDs of the documents that match the filters. - // const hasFilters = Object.keys(params.where ?? {}).length > 0; - // let whereFiltersIDs: string[] = []; - - // if (hasFilters) { - // whereFiltersIDs = getWhereFiltersIDs(params.where!, orama); - // } - - // indexMap is an object containing all the indexes considered for the current search, - // and an array of doc IDs for each token in all the indices. - // - // Given the search term "quick brown fox" on the "description" index, - // indexMap will look like this: - // - // { - // description: { - // quick: [doc1, doc2, doc3], - // brown: [doc2, doc4], - // fox: [doc2] - // } - // } - const indexMap: IndexMap = {} - - // After we create the indexMap, we need to calculate the intersection - // between all the postings lists for each token. - // Given the example above, docsIntersection will look like this: - // - // { - // description: [doc2] - // } - // - // as doc2 is the only document present in all the postings lists for the "description" index. - const docsIntersection: TokenMap = {} - - for (const prop of properties) { - const tokensMap: TokenMap = {} - for (const token of tokens) { - tokensMap[token] = [] - } - indexMap[prop] = tokensMap - docsIntersection[prop] = [] - } - - return { - timeStart, - tokenizer, - index, - documentsStore, - language, - params, - docsCount, - uniqueDocsIDs: {}, - indexMap, - docsIntersection - } -} - export function search>( orama: T, params: SearchParams, diff --git a/packages/orama/src/trees/radix.ts b/packages/orama/src/trees/radix.ts index b0d0b2682..8eb28e9f1 100644 --- a/packages/orama/src/trees/radix.ts +++ b/packages/orama/src/trees/radix.ts @@ -433,4 +433,4 @@ export class RadixTree extends RadixNode { public toJSON(): object { return super.toJSON() } -} +} \ No newline at end of file diff --git a/packages/orama/src/types.ts b/packages/orama/src/types.ts index f64e9aa59..c728c94d0 100644 --- a/packages/orama/src/types.ts +++ b/packages/orama/src/types.ts @@ -935,6 +935,7 @@ export interface IIndex { index: T, prop: string, id: DocumentID, + internalId: InternalDocumentID, value: SearchableValue, schemaType: SearchableType, language: string | undefined, @@ -962,24 +963,35 @@ export interface IIndex { insertTokenScoreParameters(index: I, prop: string, id: DocumentID, tokens: string[], token: string): void removeDocumentScoreParameters(index: I, prop: string, id: DocumentID, docsCount: number): SyncOrAsyncValue removeTokenScoreParameters(index: I, prop: string, token: string): void - calculateResultScores>( - context: SearchContext, - index: I, + calculateResultScores( + index: AnyIndexStore, prop: string, term: string, - ids: DocumentID[] - ): TokenScore[] + ids: InternalDocumentID[], + docsCount: number, + bm25Relevance: Required, + resultsMap: Map, + boostPerProperty: number, + ) - search>( - context: SearchContext, - index: I, - prop: string, - term: string + search( + index: AnyIndexStore, + term: string, + tokenizer: Tokenizer, + language: string | undefined, + propertiesToSearch: string[], + exact: boolean, + tolerance: number, + boost: Partial[]>, number>>, + relevance: Required, + docsCount: number ): TokenScore[] - searchByWhereClause>( - context: SearchContext, - index: I, - filters: Partial> + + searchByWhereClause( + index: AnyIndexStore, + tokenizer: Tokenizer, + filters: Partial>, + language: string | undefined ): InternalDocumentID[] getSearchableProperties(index: I): string[] diff --git a/packages/orama/tests/array.test.ts b/packages/orama/tests/array.test.ts index e5fe7de51..c5f3361cb 100644 --- a/packages/orama/tests/array.test.ts +++ b/packages/orama/tests/array.test.ts @@ -19,7 +19,7 @@ t.test('create should support array of string', async (t) => { { id: '3', name: ['Lily', 'Lily', 'Lily', 'Lily', 'Evans', 'Potter'] } ]) - await checkSearchTerm(t, db, 'Albus', [albusId]) + await checkSearchTerm(t, db, 'Albus', [albusId]) await checkSearchTerm(t, db, 'Harry', [harryId]) await checkSearchTerm(t, db, 'James', [harryId, jamesId]) await checkSearchTerm(t, db, 'Potter', [harryId, jamesId, lilyId]) @@ -27,6 +27,7 @@ t.test('create should support array of string', async (t) => { await checkSearchTerm(t, db, 'foo', []) await checkSearchWhere(t, db, 'name', 'Albus', [albusId]) + await checkSearchWhere(t, db, 'name', 'Harry', [harryId]) await checkSearchWhere(t, db, 'name', 'James', [harryId, jamesId]) await checkSearchWhere(t, db, 'name', 'Potter', [harryId, jamesId, lilyId]) @@ -82,6 +83,7 @@ t.test('create should support array of number', async (t) => { ]) await checkSearchWhere(t, db, 'num', { eq: 5 }, [first, third, fourth]) + await checkSearchWhere(t, db, 'num', { eq: 35 }, [third]) await checkSearchWhere(t, db, 'num', { gt: 6 }, [second, third]) await checkSearchWhere(t, db, 'num', { gte: 7 }, [second, third]) @@ -153,8 +155,6 @@ t.test('create should support array of boolean', async (t) => { }) t.test('remove should support array as well', async (t) => { - t.plan(2) - const db = create({ schema: { strings: 'string[]', @@ -175,8 +175,6 @@ t.test('remove should support array as well', async (t) => { }) t.test('serialization should support array as well', async (t) => { - t.plan(2) - const db = create({ schema: { strings: 'string[]', @@ -210,8 +208,6 @@ t.test('serialization should support array as well', async (t) => { }) t.test('update supports array as well', async (t) => { - t.plan(2) - const db = create({ schema: { strings: 'string[]', @@ -254,7 +250,7 @@ async function checkSearchWhere(t, db, key, where, expectedIds) { t.strictSame(new Set(result.hits.map((h) => h.id).sort()), new Set(expectedIds)) } -async function checkSearchFacets(t: Tap.Test, db, key, facet, expectedFacet) { +async function checkSearchFacets(t: any, db, key, facet, expectedFacet) { const result = await search(db, { facets: { [key]: facet diff --git a/packages/orama/tests/boosting.test.ts b/packages/orama/tests/boosting.test.ts index a66023b65..227d25741 100644 --- a/packages/orama/tests/boosting.test.ts +++ b/packages/orama/tests/boosting.test.ts @@ -1,12 +1,8 @@ import t from 'tap' import { create, insert, search } from '../src/index.js' -t.test('boosting', (t) => { - t.plan(1) - +t.test('boosting', async (t) => { t.test('field boosting', async (t) => { - t.plan(2) - const db = await create({ schema: { id: 'string', @@ -30,12 +26,10 @@ t.test('boosting', (t) => { const { hits: hits1 } = await search(db, { term: 'computer for browsing and movies', - threshold: 1 }) const { hits: hits2 } = await search(db, { term: 'computer for browsing and movies', - threshold: 1, boost: { title: 2.5 } diff --git a/packages/orama/tests/cosine-similarity.test.ts b/packages/orama/tests/cosine-similarity.test.ts index 82c273a1a..c7289c046 100644 --- a/packages/orama/tests/cosine-similarity.test.ts +++ b/packages/orama/tests/cosine-similarity.test.ts @@ -5,15 +5,9 @@ function toF32(vector: number[]): Float32Array { return new Float32Array(vector) } -t.test('cosine similarity', (t) => { - t.plan(2) - - t.test('getMagnitude', (t) => { - t.plan(1) - - t.test('should return the magnitude of a vector', (t) => { - t.plan(3) - +t.test('cosine similarity', async (t) => { + t.test('getMagnitude', async (t) => { + t.test('should return the magnitude of a vector', async (t) => { { const vector = toF32([1, 0, 0, 0, 0, 0, 0, 0, 0, 0]) const magnitude = getMagnitude(vector, vector.length) @@ -37,12 +31,8 @@ t.test('cosine similarity', (t) => { }) }) - t.test('findSimilarVectors', (t) => { - t.plan(1) - - t.test('should return the most similar vectors', (t) => { - t.plan(3) - + t.test('findSimilarVectors', async (t) => { + t.test('should return the most similar vectors', async (t) => { const targetVector = toF32([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) const vectors = { '1': [1, toF32([1, 0, 0, 0, 0, 0, 0, 0, 0, 0])], diff --git a/packages/orama/tests/create.test.ts b/packages/orama/tests/create.test.ts index aad296317..a741e257f 100644 --- a/packages/orama/tests/create.test.ts +++ b/packages/orama/tests/create.test.ts @@ -3,8 +3,6 @@ import { create } from '../src/methods/create.js' t.test('create method', (t) => { t.test('should provide an unique ID for the instance', async (t) => { - t.plan(3) - const orama1 = create({ schema: {} }) const orama2 = create({ schema: {} }) @@ -15,8 +13,6 @@ t.test('create method', (t) => { }) t.test('should accept an "id" property and set is as instance ID', async (t) => { - t.plan(2) - const orama = create({ schema: {}, id: 'my-instance-id' }) t.hasProp(orama, 'id') @@ -35,8 +31,6 @@ t.test('create method', (t) => { }) t.test('should allow creation of an index with a geopoint property', async (t) => { - t.plan(1) - t.ok( create({ schema: { diff --git a/packages/orama/tests/dataset.test.ts b/packages/orama/tests/dataset.test.ts index 1e1be74a6..d923d9b3e 100644 --- a/packages/orama/tests/dataset.test.ts +++ b/packages/orama/tests/dataset.test.ts @@ -67,7 +67,6 @@ t.test('orama.dataset', async (t) => { const s1 = await search(db, { term: 'august', exact: true, - threshold: 1, properties: ['categories.first'], limit: 10, offset: 0 @@ -76,7 +75,6 @@ t.test('orama.dataset', async (t) => { const s2 = await search(db, { term: 'january, june', exact: true, - threshold: 1, properties: ['categories.first'], limit: 10, offset: 0 @@ -85,7 +83,6 @@ t.test('orama.dataset', async (t) => { const s3 = await search(db, { term: 'january/june', exact: true, - threshold: 1, properties: ['categories.first'], limit: 10, offset: 0 @@ -103,19 +100,16 @@ t.test('orama.dataset', async (t) => { t.test('should correctly search long strings', async (t) => { const s1 = await search(db, { term: 'e into the', - threshold: 1, properties: ['description'] }) const s2 = await search(db, { term: 'The Roman armies', - threshold: 1, properties: ['description'] }) const s3 = await search(db, { term: 'the King of Epirus, is taken', - threshold: 1, properties: ['description'] }) @@ -130,7 +124,6 @@ t.test('orama.dataset', async (t) => { const s1 = removeVariadicData( await search(db, { term: 'war', - threshold: 1, exact: true, // eslint-disable-next-line // @ts-ignore @@ -143,7 +136,6 @@ t.test('orama.dataset', async (t) => { const s2 = removeVariadicData( await search(db, { term: 'war', - threshold: 1, exact: true, properties: ['description'], limit: 10, @@ -154,7 +146,6 @@ t.test('orama.dataset', async (t) => { const s3 = removeVariadicData( await search(db, { term: 'war', - threshold: 1, exact: true, properties: ['description'], limit: 10, @@ -164,7 +155,6 @@ t.test('orama.dataset', async (t) => { const s4 = await search(db, { term: 'war', - threshold: 1, exact: true, properties: ['description'], limit: 2240, @@ -173,7 +163,6 @@ t.test('orama.dataset', async (t) => { const s5 = await search(db, { term: 'war', - threshold: 1, exact: true, properties: ['description'], limit: 10, @@ -215,7 +204,6 @@ t.test('orama.dataset', async (t) => { t.test('should correctly delete documents', async (t) => { const documentsToDelete = await search(db, { term: 'war', - threshold: 1, exact: true, properties: ['description'], limit: 10, @@ -228,7 +216,6 @@ t.test('orama.dataset', async (t) => { const newSearch = await search(db, { term: 'war', - threshold: 1, exact: true, properties: ['description'], limit: 10, diff --git a/packages/orama/tests/diacritics.test.ts b/packages/orama/tests/diacritics.test.ts index 0db5a0e17..053fe2f2e 100644 --- a/packages/orama/tests/diacritics.test.ts +++ b/packages/orama/tests/diacritics.test.ts @@ -1,12 +1,8 @@ import t from 'tap' import { replaceDiacritics } from '../src/components/tokenizer/diacritics.js' -t.test('Diacritics Replacer', (t) => { - t.plan(1) - - t.test('should replace diacritics', (t) => { - t.plan(3) - +t.test('Diacritics Replacer', async (t) => { + t.test('should replace diacritics', async (t) => { const I1 = 'áàâãéèêíïóôõöúçñÁÀÂÃÉÈÍÏÓÔÕÖÚÇÑ' const I2 = 'áaauioèaíïóiuubnÁoiÃotytÓhygÚnÑ' const I3 = 'aaaaeeeiiooooucnAAAAEEIIOOOOUCN' diff --git a/packages/orama/tests/docs.test.ts b/packages/orama/tests/docs.test.ts index 312eccf96..9db1d5223 100644 --- a/packages/orama/tests/docs.test.ts +++ b/packages/orama/tests/docs.test.ts @@ -2,13 +2,11 @@ import t from 'tap' import { count, getByID, create, insert } from '../src/index.js' t.test('count', async (t) => { - t.plan(2) - const db = await create({ schema: { id: 'string', title: 'string' - } + } as const }) await insert(db, { id: 'doc1', title: 'Hello World 1' }) diff --git a/packages/orama/tests/elapsed.test.ts b/packages/orama/tests/elapsed.test.ts index c29ca4469..d09071ff7 100644 --- a/packages/orama/tests/elapsed.test.ts +++ b/packages/orama/tests/elapsed.test.ts @@ -1,17 +1,13 @@ import t from 'tap' import { create, insert, search } from '../src/index.js' -t.test('elapsed', (t) => { - t.plan(2) - +t.test('elapsed', async (t) => { t.test('should correctly set elapsed time to a custom format', async (t) => { - t.plan(2) - const db = await create({ schema: { title: 'string', body: 'string' - }, + } as const, components: { formatElapsedTime: (n: bigint) => { return `${Number(n)}n` @@ -33,12 +29,11 @@ t.test('elapsed', (t) => { }) t.test('should correctly set elapsed time to a bigint by default', async (t) => { - t.plan(1) const db = await create({ schema: { title: 'string', body: 'string' - } + } as const }) await insert(db, { diff --git a/packages/orama/tests/facets.test.ts b/packages/orama/tests/facets.test.ts index 1b72efbf4..34b7c15c5 100644 --- a/packages/orama/tests/facets.test.ts +++ b/packages/orama/tests/facets.test.ts @@ -3,8 +3,6 @@ import { create, insert, insertMultiple, search } from '../src/index.js' t.test('facets', (t) => { t.test('should generate correct facets', async (t) => { - t.plan(6) - const db = await create({ schema: { author: 'string', @@ -73,7 +71,6 @@ t.test('facets', (t) => { const results = await search(db, { term: 'work time', - threshold: 1, facets: { 'meta.isFavorite': { true: true, @@ -93,8 +90,6 @@ t.test('facets', (t) => { }) t.test('should correctly handle range facets', async (t) => { - t.plan(5) - const db = await create({ schema: { name: 'string', @@ -141,7 +136,6 @@ t.test('facets', (t) => { const results = await search(db, { term: 'groceries', - threshold: 1, properties: ['category'], facets: { price: { @@ -256,14 +250,13 @@ t.test('facets', (t) => { const results = await search(db, { term: 'person', - threshold: 1, facets: { author: {} } }) t.same(results.facets?.['author'].count, orderedAuthors.length) - t.same(Object.keys(results.facets?.['author'].values).length, 10) + t.same(Object.keys(results.facets!['author'].values).length, 10) }) t.test('should generate correct facets with correct number of items', async (t) => { @@ -271,7 +264,6 @@ t.test('facets', (t) => { const results = await search(db, { term: 'person', - threshold: 1, facets: { author: { limit: orderedAuthors.length + 1 @@ -280,7 +272,7 @@ t.test('facets', (t) => { }) t.same(results.facets?.['author'].count, orderedAuthors.length) - t.same(Object.keys(results.facets?.['author'].values).length, orderedAuthors.length) + t.same(Object.keys(results.facets!['author'].values).length, orderedAuthors.length) }) t.test('should generate correct facets when limit is lower than total values', async (t) => { @@ -288,7 +280,6 @@ t.test('facets', (t) => { const results = await search(db, { term: 'person', - threshold: 1, facets: { author: { limit: orderedAuthors.length - 1 @@ -297,7 +288,7 @@ t.test('facets', (t) => { }) t.same(results.facets?.['author'].count, orderedAuthors.length) - t.same(Object.keys(results.facets?.['author'].values).length, orderedAuthors.length - 1) + t.same(Object.keys(results.facets!['author'].values).length, orderedAuthors.length - 1) }) t.end() diff --git a/packages/orama/tests/filters.test.ts b/packages/orama/tests/filters.test.ts index f6bf7d0a5..841c36ae0 100644 --- a/packages/orama/tests/filters.test.ts +++ b/packages/orama/tests/filters.test.ts @@ -1,57 +1,7 @@ import t from 'tap' import { create, insert, search, remove } from '../src/index.js' -async function createSimpleDB() { - let i = 0 - const db = await create({ - schema: { - name: 'string', - rating: 'number', - price: 'number', - meta: { - sales: 'number' - } - } as const, - components: { - getDocumentIndexId(): string { - return `__${++i}` - } - } - }) - - await insert(db, { - name: 'washing machine', - rating: 5, - price: 900, - meta: { - sales: 100 - } - }) - - await insert(db, { - name: 'coffee maker', - rating: 3, - price: 30, - meta: { - sales: 25 - } - }) - - await insert(db, { - name: 'coffee maker deluxe', - rating: 5, - price: 45, - meta: { - sales: 25 - } - }) - - return db -} - -t.test('filters', (t) => { - t.plan(9) - +t.test('filters', async (t) => { t.test('should throw on unknown field', async (t) => { const db = await createSimpleDB() @@ -104,8 +54,6 @@ t.test('filters', (t) => { }) t.test('greater than', async (t) => { - t.plan(2) - const db = await createSimpleDB() const r1_gt = await search(db, { @@ -122,8 +70,6 @@ t.test('filters', (t) => { }) t.test('greater than or equal to', async (t) => { - t.plan(3) - const db = await createSimpleDB() const r1_gte = await search(db, { @@ -141,8 +87,6 @@ t.test('filters', (t) => { }) t.test('less than', async (t) => { - t.plan(2) - const db = await createSimpleDB() const r1_lt = await search(db, { @@ -159,8 +103,6 @@ t.test('filters', (t) => { }) t.test('less than or equal to', async (t) => { - t.plan(2) - const db = await createSimpleDB() const r1_lte = await search(db, { @@ -177,8 +119,6 @@ t.test('filters', (t) => { }) t.test('equal', async (t) => { - t.plan(2) - const db = await createSimpleDB() const r1_lte = await search(db, { @@ -195,8 +135,6 @@ t.test('filters', (t) => { }) t.test('between', async (t) => { - t.plan(2) - const db = await createSimpleDB() const r1_lte = await search(db, { @@ -213,8 +151,6 @@ t.test('filters', (t) => { }) t.test('multiple filters', async (t) => { - t.plan(2) - const db = await createSimpleDB() const r1_lte = await search(db, { @@ -234,8 +170,6 @@ t.test('filters', (t) => { }) t.test('multiple filters, and operation', async (t) => { - t.plan(2) - const db = await createSimpleDB() const r1_lte = await search(db, { @@ -260,8 +194,6 @@ t.test('filters', (t) => { }) t.test('should throw when using multiple operators', async (t) => { - t.plan(1) - const db = await createSimpleDB() t.throws( @@ -280,8 +212,6 @@ t.test('should throw when using multiple operators', async (t) => { }) t.test('boolean filters', async (t) => { - t.plan(7) - const db = create({ schema: { id: 'string', @@ -428,8 +358,6 @@ t.test('string filters', async (t) => { }) t.test('string filters with stemming', async (t) => { - t.plan(6) - const db = await create({ schema: { id: 'string', @@ -479,3 +407,51 @@ t.test('string filters with stemming', async (t) => { t.equal(r2.hits[0].id, '1') t.equal(r2.hits[1].id, '2') }) + +async function createSimpleDB() { + let i = 0 + const db = await create({ + schema: { + name: 'string', + rating: 'number', + price: 'number', + meta: { + sales: 'number' + } + } as const, + components: { + getDocumentIndexId(): string { + return `__${++i}` + } + } + }) + + await insert(db, { + name: 'washing machine', + rating: 5, + price: 900, + meta: { + sales: 100 + } + }) + + await insert(db, { + name: 'coffee maker', + rating: 3, + price: 30, + meta: { + sales: 25 + } + }) + + await insert(db, { + name: 'coffee maker deluxe', + rating: 5, + price: 45, + meta: { + sales: 25 + } + }) + + return db +} diff --git a/packages/orama/tests/group.test.ts b/packages/orama/tests/group.test.ts index 2c51608dc..25223df19 100644 --- a/packages/orama/tests/group.test.ts +++ b/packages/orama/tests/group.test.ts @@ -4,7 +4,7 @@ import { GroupResult, create, insertMultiple, search } from '../src/index.js' t.test('search with groupBy', async (t) => { const [db] = createDb() - t.test('should group by a single property', (t) => { + t.test('should group by a single property', async (t) => { t.test('', async (t) => { const results = await search(db, { term: 't-shirt', @@ -83,10 +83,9 @@ t.test('search with groupBy', async (t) => { t.end() }) - t.end() }) - t.test('should group by a 2 properties', (t) => { + t.test('should group by a 2 properties', async (t) => { t.test('', async (t) => { const results = await search(db, { groupBy: { @@ -132,8 +131,6 @@ t.test('search with groupBy', async (t) => { t.end() }) - - t.end() }) t.test('should group by a 3 properties', async (t) => { @@ -183,8 +180,6 @@ t.test('search with groupBy', async (t) => { t.end() }) - - t.end() }) t.test('with custom aggregator', async (t) => { @@ -247,8 +242,6 @@ t.test('search with groupBy', async (t) => { } ]) ) - - t.end() }) t.test('only scalar values are supported', async (t) => { @@ -281,11 +274,7 @@ t.test('search with groupBy', async (t) => { message: 'Invalid groupBy property "tags". Allowed types: "string, number, boolean", but given "string[]"' } ) - - t.end() }) - - t.end() }) t.test('real test', async (t) => { @@ -306,8 +295,6 @@ t.test('real test', async (t) => { { values: ['A'], result: ['1'] }, { values: ['B'], result: ['6'] } ]) - - t.end() }) function compareGroupResults(t: Tap.Test, groups: GroupResult, expected) { diff --git a/packages/orama/tests/insert.test.ts b/packages/orama/tests/insert.test.ts index 13745cd83..deba00e7c 100644 --- a/packages/orama/tests/insert.test.ts +++ b/packages/orama/tests/insert.test.ts @@ -4,11 +4,10 @@ import { Index } from '../src/components/index.js' import { getInternalDocumentId } from '../src/components/internal-document-id-store.js' import { AnyDocument, count, create, insert, insertMultiple, search } from '../src/index.js' import dataset from './datasets/events.json' assert { type: 'json' } +import { BKDTree } from '../src/trees/bkd.js' -t.only('insert method', (t) => { +t.test('insert method', async (t) => { t.test('should correctly insert and retrieve data', async (t) => { - t.plan(4) - const db = await create({ schema: { example: 'string' @@ -27,8 +26,6 @@ t.only('insert method', (t) => { }) t.test('should be able to insert documens with non-searchable fields', async (t) => { - t.plan(2) - const db = create({ schema: { quote: 'string', @@ -61,8 +58,6 @@ t.only('insert method', (t) => { }) t.test("should use the 'id' field found in the document as index id", async (t) => { - t.plan(2) - const db = create({ schema: { id: 'string', @@ -85,8 +80,6 @@ t.only('insert method', (t) => { }) t.test("should use the custom 'id' function passed in the configuration object", async (t) => { - t.plan(2) - const db = create({ schema: { id: 'string', @@ -114,8 +107,6 @@ t.only('insert method', (t) => { }) t.test("should throw an error if the 'id' field is not a string", async (t) => { - t.plan(1) - const db = create({ schema: { name: 'string' @@ -133,8 +124,6 @@ t.only('insert method', (t) => { }) t.test("should throw an error if the 'id' field is already taken", async (t) => { - t.plan(1) - const db = create({ schema: { id: 'string', @@ -158,8 +147,6 @@ t.only('insert method', (t) => { }) t.test('should use the ID field as index id even if not specified in the schema', async (t) => { - t.plan(1) - const db = create({ schema: { name: 'string' @@ -175,8 +162,6 @@ t.only('insert method', (t) => { }) t.test('should allow doc with missing schema keys to be inserted without indexing those keys', async (t) => { - t.plan(6) - const db = create({ schema: { quote: 'string', @@ -202,10 +187,9 @@ t.only('insert method', (t) => { t.notOk('foo' in (db.data.index as unknown as Index).indexes) }) - t.test( + await t.test( 'should allow doc with missing schema keys to be inserted without indexing those keys - nested schema version', async (t) => { - t.plan(6) const db = create({ schema: { quote: 'string', @@ -260,7 +244,7 @@ t.only('insert method', (t) => { } ) - t.test('should validate', (t) => { + t.test('should validate', async (t) => { t.test('the properties are not mandatory', async (t) => { const db = create({ schema: { @@ -272,6 +256,7 @@ t.only('insert method', (t) => { } as const }) + // not throwing insert(db, {}) insert(db, { id: 'foo' }) insert(db, { name: 'bar' }) @@ -280,8 +265,8 @@ t.only('insert method', (t) => { t.end() }) - t.test('invalid document', async (t) => { - const db = await create({ + await t.test('invalid document', async (t) => { + const db = create({ schema: { string: 'string', number: 'number', @@ -321,17 +306,11 @@ t.only('insert method', (t) => { t.equal(e.code, 'SCHEMA_VALIDATION_FAILURE') } } - - t.end() }) - - t.end() }) - t.test('should insert Geopoints', async (t) => { - t.plan(3) - - const db = await create({ + await t.test('should insert Geopoints', async (t) => { + const db = create({ schema: { name: 'string', location: 'geopoint' @@ -339,7 +318,7 @@ t.only('insert method', (t) => { }) t.ok( - await insert(db, { + insert(db, { name: 't1', location: { lat: 45.5771622, @@ -347,20 +326,14 @@ t.only('insert method', (t) => { } }) ) - - t.equal((db.data.index.indexes.location.node as any).root.point.lat, 45.5771622) - t.equal((db.data.index.indexes.location.node as any).root.point.lon, 9.261266) + const index = db.data.index.indexes.location.node as BKDTree + t.equal(index.root?.point.lat, 45.5771622) + t.equal(index.root?.point.lon, 9.261266) }) - - t.end() }) -t.test('insert short prefixes, as in #327 and #328', (t) => { - t.plan(2) - - t.test('example 1', async (t) => { - t.plan(8) - +t.test('insert short prefixes, as in #327 and #328', async (t) => { + await t.test('example 1', async (t) => { const db = await create({ schema: { id: 'string', @@ -397,15 +370,13 @@ t.test('insert short prefixes, as in #327 and #328', (t) => { t.same(exactResults.hits[0].document.abbrv, 'RD') t.same(prefixResults.count, 2) - t.same(prefixResults.hits[0].id, '2') - t.same(prefixResults.hits[0].document.abbrv, 'RD') - t.same(prefixResults.hits[1].id, '1') - t.same(prefixResults.hits[1].document.abbrv, 'RDGE') + t.same(prefixResults.hits[0].id, '1') + t.same(prefixResults.hits[0].document.abbrv, 'RDGE') + t.same(prefixResults.hits[1].id, '2') + t.same(prefixResults.hits[1].document.abbrv, 'RD') }) - t.test('example 2', async (t) => { - t.plan(5) - + await t.test('example 2', async (t) => { const db = await create({ schema: { id: 'string', @@ -433,7 +404,7 @@ t.test('insert short prefixes, as in #327 and #328', (t) => { }) }) -t.test('insertMultiple method', (t) => { +t.test('insertMultiple method', async (t) => { t.test("should use the custom 'id' function passed in the configuration object", async (t) => { const db = create({ schema: { @@ -453,8 +424,6 @@ t.test('insertMultiple method', (t) => { ]) t.strictSame(ids, ['john-01', 'doe-02']) - - t.end() }) t.test("should use the 'id' field as index id if found in the document", async (t) => { @@ -467,12 +436,9 @@ t.test('insertMultiple method', (t) => { const ids = await insertMultiple(db, [{ name: 'John' }, { id: '02', name: 'Doe' }]) t.ok(ids.includes('02')) - - t.end() }) - t.test('should support batch insert of documents', async (t) => { - t.plan(2) + await t.test('should support batch insert of documents', async (t) => { const db = create({ schema: { @@ -501,8 +467,6 @@ t.test('insertMultiple method', (t) => { // Skipping this test for now, as it is not reliable t.skip('should support `timeout` parameter', async (t) => { - t.plan(2) - const db = create({ schema: { description: 'string' @@ -522,13 +486,11 @@ t.test('insertMultiple method', (t) => { const batchNumber = Math.ceil(docs.length / batchSize) // the "sleep" is yeilded between batches, // so it is not fired for the last batch - const expectedTime = (batchNumber - 1) * 200 + const expectedTime = (batchNumber - 1) * 20 t.equal(after - before > expectedTime, true) }) t.test('should correctly rebalance AVL tree once the threshold is reached', async (t) => { - t.plan(4) - const db = await create({ schema: { id: 'string', @@ -585,8 +547,6 @@ t.test('insertMultiple method', (t) => { t.equal(results250.count, 1) t.equal(results250.hits[0].document.id, '250') }) - - t.end() }) interface BaseDataEvent extends AnyDocument { diff --git a/packages/orama/tests/levenshtein.test.ts b/packages/orama/tests/levenshtein.test.ts index 79cdea904..5b4ec0e71 100644 --- a/packages/orama/tests/levenshtein.test.ts +++ b/packages/orama/tests/levenshtein.test.ts @@ -4,7 +4,7 @@ import { create } from '../src/methods/create.js' import { insertMultiple } from '../src/methods/insert.js' import { search } from '../src/methods/search.js' -t.test('syncBoundedLevenshtein', (t) => { +t.test('syncBoundedLevenshtein', async (t) => { // Test exact match t.same( syncBoundedLevenshtein('hello', 'hello', 3), @@ -78,25 +78,17 @@ t.test('syncBoundedLevenshtein', (t) => { t.end() }) -t.test('levenshtein', (t) => { - t.plan(3) - - t.test('should be 0 when both inputs are empty', (t) => { - t.plan(1) - +t.test('levenshtein', async (t) => { + t.test('should be 0 when both inputs are empty', async (t) => { t.equal(levenshtein('', ''), 0) }) - t.test('should be the max input length when either strings are empty', (t) => { - t.plan(2) - + t.test('should be the max input length when either strings are empty', async (t) => { t.equal(levenshtein('', 'some'), 4) t.equal(levenshtein('body', ''), 4) }) - t.test('some examples', (t) => { - t.plan(5) - + t.test('some examples', async (t) => { t.equal(levenshtein('aa', 'b'), 2) t.equal(levenshtein('b', 'aa'), 2) t.equal(levenshtein('somebody once', 'told me'), 9) @@ -105,91 +97,83 @@ t.test('levenshtein', (t) => { }) }) -t.test('boundedLevenshtein', (t) => { - t.plan(3) - +t.test('boundedLevenshtein', async (t) => { t.test('should be 0 when both inputs are empty', async (t) => { - t.plan(2) - - t.match(await boundedLevenshtein('', '', 0), { distance: 0, isBounded: true }) - t.match(await boundedLevenshtein('', '', 1), { distance: 0, isBounded: true }) + t.match(boundedLevenshtein('', '', 0), { distance: 0, isBounded: true }) + t.match(boundedLevenshtein('', '', 1), { distance: 0, isBounded: true }) }) t.test('should be the max input length when either strings are empty', async (t) => { - t.plan(3) + t.match(boundedLevenshtein('', 'some', 0), { distance: -1, isBounded: false }) - t.match(await boundedLevenshtein('', 'some', 0), { distance: -1, isBounded: false }) - - t.match(await boundedLevenshtein('', 'some', 4), { distance: 4, isBounded: true }) - t.match(await boundedLevenshtein('body', '', 4), { distance: 4, isBounded: true }) + t.match(boundedLevenshtein('', 'some', 4), { distance: 4, isBounded: true }) + t.match(boundedLevenshtein('body', '', 4), { distance: 4, isBounded: true }) }) t.test('should tell whether the Levenshtein distance is upperbounded by a given tolerance', async (t) => { - t.plan(2) - - t.match(await boundedLevenshtein('somebody once', 'told me', 9), { isBounded: true }) - t.match(await boundedLevenshtein('somebody once', 'told me', 8), { isBounded: false }) + t.match(boundedLevenshtein('somebody once', 'told me', 9), { isBounded: true }) + t.match(boundedLevenshtein('somebody once', 'told me', 8), { isBounded: false }) }) }) t.test('syncBoundedLevenshtein substrings are ok even if with tolerance pppppp', async (t) => { - t.match(await boundedLevenshtein('Dhris', 'Chris', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Dhris', 'Chris', 1), { isBounded: true, distance: 1 }) - t.match(await boundedLevenshtein('Dhris', 'Cgris', 1), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Dhris', 'Cgris', 2), { isBounded: true, distance: 2 }) - t.match(await boundedLevenshtein('Dhris', 'Cgris', 3), { isBounded: true, distance: 2 }) + t.match(boundedLevenshtein('Dhris', 'Chris', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Dhris', 'Chris', 1), { isBounded: true, distance: 1 }) + t.match(boundedLevenshtein('Dhris', 'Cgris', 1), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Dhris', 'Cgris', 2), { isBounded: true, distance: 2 }) + t.match(boundedLevenshtein('Dhris', 'Cgris', 3), { isBounded: true, distance: 2 }) - t.match(await boundedLevenshtein('Dhris', 'Cris', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Dhris', 'Cris', 1), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Dhris', 'Cris', 2), { isBounded: true, distance: 2 }) + t.match(boundedLevenshtein('Dhris', 'Cris', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Dhris', 'Cris', 1), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Dhris', 'Cris', 2), { isBounded: true, distance: 2 }) - t.match(await boundedLevenshtein('Dhris', 'Caig', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Dhris', 'Caig', 1), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Dhris', 'Caig', 2), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Dhris', 'Caig', 3), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Dhris', 'Caig', 4), { isBounded: true, distance: 4 }) + t.match(boundedLevenshtein('Dhris', 'Caig', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Dhris', 'Caig', 1), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Dhris', 'Caig', 2), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Dhris', 'Caig', 3), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Dhris', 'Caig', 4), { isBounded: true, distance: 4 }) - t.match(await boundedLevenshtein('Chris', 'Chris', 0), { isBounded: true, distance: 0 }) - t.match(await boundedLevenshtein('Chris', 'Chris', 1), { isBounded: true, distance: 0 }) - t.match(await boundedLevenshtein('Chris', 'Chris', 2), { isBounded: true, distance: 0 }) + t.match(boundedLevenshtein('Chris', 'Chris', 0), { isBounded: true, distance: 0 }) + t.match(boundedLevenshtein('Chris', 'Chris', 1), { isBounded: true, distance: 0 }) + t.match(boundedLevenshtein('Chris', 'Chris', 2), { isBounded: true, distance: 0 }) - t.match(await boundedLevenshtein('Chris', 'Cris', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chris', 'Cris', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chris', 'Cris', 1), { isBounded: true, distance: 1 }) - t.match(await boundedLevenshtein('Chris', 'Cris', 2), { isBounded: true, distance: 1 }) + t.match(boundedLevenshtein('Chris', 'Cris', 1), { isBounded: true, distance: 1 }) + t.match(boundedLevenshtein('Chris', 'Cris', 2), { isBounded: true, distance: 1 }) - t.match(await boundedLevenshtein('Chris', 'Caig', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chris', 'Caig', 1), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chris', 'Caig', 2), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chris', 'Caig', 3), { isBounded: true, distance: 3 }) + t.match(boundedLevenshtein('Chris', 'Caig', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chris', 'Caig', 1), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chris', 'Caig', 2), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chris', 'Caig', 3), { isBounded: true, distance: 3 }) - t.match(await boundedLevenshtein('Craig', 'Caig', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Craig', 'Caig', 1), { isBounded: true, distance: 1 }) - t.match(await boundedLevenshtein('Craig', 'Caig', 2), { isBounded: true, distance: 1 }) + t.match(boundedLevenshtein('Craig', 'Caig', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Craig', 'Caig', 1), { isBounded: true, distance: 1 }) + t.match(boundedLevenshtein('Craig', 'Caig', 2), { isBounded: true, distance: 1 }) - t.match(await boundedLevenshtein('Chxy', 'Cris', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chxy', 'Cris', 1), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chxy', 'Cris', 2), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chxy', 'Cris', 3), { isBounded: true, distance: 3 }) + t.match(boundedLevenshtein('Chxy', 'Cris', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chxy', 'Cris', 1), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chxy', 'Cris', 2), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chxy', 'Cris', 3), { isBounded: true, distance: 3 }) - t.match(await boundedLevenshtein('Chxy', 'Caig', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chxy', 'Caig', 1), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chxy', 'Caig', 2), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Chxy', 'Caig', 3), { isBounded: true, distance: 3 }) + t.match(boundedLevenshtein('Chxy', 'Caig', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chxy', 'Caig', 1), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chxy', 'Caig', 2), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Chxy', 'Caig', 3), { isBounded: true, distance: 3 }) - t.match(await boundedLevenshtein('Crxy', 'Cris', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Crxy', 'Cris', 1), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Crxy', 'Cris', 2), { isBounded: true, distance: 2 }) + t.match(boundedLevenshtein('Crxy', 'Cris', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Crxy', 'Cris', 1), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Crxy', 'Cris', 2), { isBounded: true, distance: 2 }) - t.match(await boundedLevenshtein('Crxy', 'Caig', 0), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Crxy', 'Caig', 1), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Crxy', 'Caig', 2), { isBounded: false, distance: -1 }) - t.match(await boundedLevenshtein('Crxy', 'Caig', 3), { isBounded: true, distance: 3 }) + t.match(boundedLevenshtein('Crxy', 'Caig', 0), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Crxy', 'Caig', 1), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Crxy', 'Caig', 2), { isBounded: false, distance: -1 }) + t.match(boundedLevenshtein('Crxy', 'Caig', 3), { isBounded: true, distance: 3 }) - t.match(await boundedLevenshtein('Crxy', 'Caig', 3), { isBounded: true, distance: 3 }) + t.match(boundedLevenshtein('Crxy', 'Caig', 3), { isBounded: true, distance: 3 }) - t.match(await boundedLevenshtein('Chris', 'Christopher', 0), { isBounded: true, distance: 0 }) - t.match(await boundedLevenshtein('Chris', 'Christopher', 1), { isBounded: true, distance: 0 }) + t.match(boundedLevenshtein('Chris', 'Christopher', 0), { isBounded: true, distance: 0 }) + t.match(boundedLevenshtein('Chris', 'Christopher', 1), { isBounded: true, distance: 0 }) t.end() }) @@ -216,13 +200,11 @@ t.test('Issue #744', async (t) => { const s2 = await search(index, { term: 'moelleux', tolerance: 1, - threshold: 0 }) const s3 = await search(index, { term: 'moelleux', tolerance: 2, - threshold: 0 }) t.equal(s1.count, 2) diff --git a/packages/orama/tests/main.test.ts b/packages/orama/tests/main.test.ts index c65817927..a4a69760b 100644 --- a/packages/orama/tests/main.test.ts +++ b/packages/orama/tests/main.test.ts @@ -2,13 +2,9 @@ import t from 'tap' import { create, insert, search } from '../src/index.js' import { SUPPORTED_LANGUAGES } from '../src/components/tokenizer/languages.js' -t.test('language', (t) => { - t.plan(5) - +t.test('language', async (t) => { t.test('should throw an error if the desired language is not supported', async (t) => { - t.plan(1) - - await t.rejects( + await t.throws( () => create({ schema: {} as const, @@ -19,13 +15,11 @@ t.test('language', (t) => { }) t.test('should throw an error if the desired language is not supported during insertion', async (t) => { - t.plan(1) - const db = await create({ schema: { foo: 'string' } }) - await t.rejects( + await t.throws( () => insert( db, @@ -38,10 +32,8 @@ t.test('language', (t) => { }) t.test('should not throw if if the language is supported', async (t) => { - t.plan(1) - try { - await create({ + create({ schema: {}, language: 'portuguese' }) @@ -53,10 +45,8 @@ t.test('language', (t) => { }) t.test('should not throw if if the language is supported', async (t) => { - t.plan(1) - try { - await create({ + create({ schema: {}, language: 'slovenian' }) @@ -68,10 +58,8 @@ t.test('language', (t) => { }) t.test('should not throw if if the language is supported', async (t) => { - t.plan(1) - try { - await create({ + create({ schema: {}, language: 'bulgarian' }) @@ -83,11 +71,9 @@ t.test('language', (t) => { }) }) -t.test('custom tokenizer configuration', (t) => { - t.plan(1) - +/* +t.test('custom tokenizer configuration', async (t) => { t.test('tokenizerFn', async (t) => { - t.plan(2) const db = await create({ schema: { txt: 'string' @@ -95,6 +81,7 @@ t.test('custom tokenizer configuration', (t) => { components: { tokenizer: { tokenize(text: string) { + console.log(text) return text.split(',') }, language: 'english', @@ -121,10 +108,9 @@ t.test('custom tokenizer configuration', (t) => { t.same(searchResult2.count, 0) }) }) + */ t.test('should access own properties exclusively', async (t) => { - t.plan(1) - const db = await create({ schema: { txt: 'string' diff --git a/packages/orama/tests/plugin.test.ts b/packages/orama/tests/plugin.test.ts index b9ca8600e..4b2079e02 100644 --- a/packages/orama/tests/plugin.test.ts +++ b/packages/orama/tests/plugin.test.ts @@ -13,11 +13,7 @@ import { import { getAllPluginsByHook } from '../src/components/plugins.js' t.only('getAllPluginsByHook', async (t) => { - t.plan(1) - t.only('should return all the plugins that includes a given hook name', async (t) => { - t.plan(2) - function plugin1() { return { name: 'plugin1', @@ -160,7 +156,7 @@ t.only('plugin', async (t) => { '[Logger] beforeInsert - {"id":"1","name":"John Doe"}', '[Logger] afterInsert - {"id":"1","name":"John Doe"}', '[Logger] beforeSearch: {"term":"john"}', - '[Logger] afterSearch: {"term":"john","relevance":{"k":1.2,"b":0.75,"d":0.5}} - undefined', + '[Logger] afterSearch: {"term":"john"} - undefined', '[Logger] beforeInsert - {"id":"2","name":"Jane Doe"}', '[Logger] afterInsert - {"id":"2","name":"Jane Doe"}', '[Logger] beforeInsert - {"id":"3","name":"Jim Doe"}', diff --git a/packages/orama/tests/preflight.test.ts b/packages/orama/tests/preflight.test.ts index a9b3174f6..ca8b8db13 100644 --- a/packages/orama/tests/preflight.test.ts +++ b/packages/orama/tests/preflight.test.ts @@ -4,12 +4,10 @@ import { insert } from '../src/methods/insert.js' import { search } from '../src/methods/search.js' t.test('preflight request', async (t) => { - t.plan(4) - const db = await create({ schema: { title: 'string' - } + } as const }) await insert(db, { title: 'Red headphones' }) diff --git a/packages/orama/tests/search-vector.test.ts b/packages/orama/tests/search-vector.test.ts index 58e030d4e..6111114e5 100644 --- a/packages/orama/tests/search-vector.test.ts +++ b/packages/orama/tests/search-vector.test.ts @@ -1,9 +1,7 @@ import t from 'tap' import { create, insertMultiple, search } from '../src/index.js' -t.test('create', (t) => { - t.plan(3) - +t.test('create', async (t) => { t.test('should create a vector instance', async (t) => { const db = await create({ schema: { @@ -45,12 +43,8 @@ t.test('create', (t) => { }) }) -t.test('search', (t) => { - t.plan(4) - +t.test('search', async (t) => { t.test('should return the most similar vectors', async (t) => { - t.plan(3) - const db = await create({ schema: { vector: 'vector[5]' @@ -74,8 +68,6 @@ t.test('search', (t) => { }) t.test('should search through nested properties', async (t) => { - t.plan(3) - const db = await create({ schema: { title: 'string', @@ -106,8 +98,6 @@ t.test('search', (t) => { }) t.test('should search through deeply nested properties', async (t) => { - t.plan(3) - const db = await create({ schema: { title: 'string', @@ -140,8 +130,6 @@ t.test('search', (t) => { }) t.test('should be able to work on multiple vector properties at creation time', async (t) => { - t.plan(7) - const db = await create({ schema: { title: 'string', diff --git a/packages/orama/tests/search.geo.test.ts b/packages/orama/tests/search.geo.test.ts index f2f7fada8..9dd4639b6 100644 --- a/packages/orama/tests/search.geo.test.ts +++ b/packages/orama/tests/search.geo.test.ts @@ -1,12 +1,8 @@ import t from 'tap' import { create, insert, search } from '../src/index.js' -t.test('geosearch', (t) => { - t.plan(5) - +t.test('geosearch', async (t) => { t.test('should find geopoints inside a radius', async (t) => { - t.plan(2) - const db = create({ schema: { id: 'string', @@ -54,8 +50,6 @@ t.test('geosearch', (t) => { }) t.test('should find geopoints outside a radius', async (t) => { - t.plan(2) - const db = await create({ schema: { id: 'string', @@ -94,8 +88,6 @@ t.test('geosearch', (t) => { }) t.test('should find geopoints inside a polygon', async (t) => { - t.plan(2) - const db = create({ schema: { id: 'string', @@ -133,8 +125,6 @@ t.test('geosearch', (t) => { }) t.test('should find geopoints outside a polygon', async (t) => { - t.plan(2) - const db = create({ schema: { id: 'string', @@ -173,8 +163,6 @@ t.test('geosearch', (t) => { }) t.test('should run in high-precision mode', async (t) => { - t.plan(4) - const db = create({ schema: { id: 'string', diff --git a/packages/orama/tests/search.test.ts b/packages/orama/tests/search.test.ts index 8a770142a..5963c1e47 100644 --- a/packages/orama/tests/search.test.ts +++ b/packages/orama/tests/search.test.ts @@ -2,7 +2,7 @@ import t from 'tap' import { stopwords as englishStopwords } from '@orama/stopwords/english' import { create, getByID, insert, insertMultiple, search } from '../src/index.js' -t.test('search method', (t) => { +t.test('search method', async (t) => { t.test('with term', async (t) => { const [db, id1, id2, id3, id4] = createSimpleDB() @@ -55,7 +55,6 @@ t.test('search method', (t) => { const result = await search(db, { term: 'coffee', - threshold: 1 }) const matchedIds = result.hits.map((d) => d.id) @@ -66,8 +65,6 @@ t.test('search method', (t) => { }) t.test('should filter the result based on "term" value # 2', async (t) => { - t.plan(8) - const db = create({ schema: { quote: 'string', @@ -108,16 +105,14 @@ t.test('search method', (t) => { t.equal(result6.count, 4) // Long string search (Tests for https://github.com/askorama/orama/issues/159 ) - const result7 = await search(db, { term: 'They are the best', threshold: 1 }) - const result8 = await search(db, { term: 'Foxes are nice animals', threshold: 1 }) + const result7 = await search(db, { term: 'They are the best'}) + const result8 = await search(db, { term: 'Foxes are nice animals'}) t.equal(result7.count, 2) t.equal(result8.count, 2) }) t.test('should apply term only on indexed fields', async (t) => { - t.plan(2) - const db = create({ schema: { quote: 'string', @@ -145,8 +140,6 @@ t.test('search method', (t) => { }) t.test('should throw an error when searching in non-existing indices', async (t) => { - t.plan(1) - const db = create({ schema: { foo: 'string', baz: 'string' } as const }) t.throws( @@ -184,10 +177,8 @@ t.test('search method', (t) => { t.end() }) - t.test('with exact', (t) => { + t.test('with exact', async (t) => { t.test('should exact match', async (t) => { - t.plan(4) - const db = create({ schema: { author: 'string', @@ -223,10 +214,8 @@ t.test('search method', (t) => { t.end() }) - t.test('with tollerate', (t) => { + t.test('with tollerate', async (t) => { t.test("shouldn't tolerate typos if set to 0", async (t) => { - t.plan(1) - const db = create({ schema: { quote: 'string', @@ -249,8 +238,6 @@ t.test('search method', (t) => { }) t.test('should tolerate typos', async (t) => { - t.plan(4) - const db = create({ schema: { quote: 'string', @@ -355,7 +342,7 @@ t.test('search method', (t) => { t.end() }) - t.test('with pagination', (t) => { + t.test('with pagination', async (t) => { t.test('should correctly paginate results', async (t) => { const db = create({ schema: { @@ -396,10 +383,7 @@ t.test('search method', (t) => { t.end() }) - t.test('should correctly search without term', async (t) => { - t.plan(4) - - const db = create({ + t.test('should correctly search without term', async (t) => { const db = create({ schema: { quote: 'string', author: 'string' @@ -438,10 +422,7 @@ t.test('search method', (t) => { ) }) - t.test('should correctly search for data returning doc including with unindexed keys', async (t) => { - t.plan(4) - - const db = create({ + t.test('should correctly search for data returning doc including with unindexed keys', async (t) => { const db = create({ schema: { quote: 'string', author: 'string' @@ -474,10 +455,7 @@ t.test('search method', (t) => { t.same(result2.hits[0].document, documentWithNestedUnindexedField) }) - t.test('should throw an error when searching in non-existing indices', async (t) => { - t.plan(1) - - const db = create({ schema: { foo: 'string', baz: 'string' } }) + t.test('should throw an error when searching in non-existing indices', async (t) => { const db = create({ schema: { foo: 'string', baz: 'string' } }) t.throws( () => @@ -491,10 +469,7 @@ t.test('search method', (t) => { ) }) - t.test('should support nested properties', async (t) => { - t.plan(4) - - const db = create({ + t.test('should support nested properties', async (t) => { const db = create({ schema: { quote: 'string', author: { @@ -546,10 +521,7 @@ t.test('search method', (t) => { t.equal(resultAuthorName.count, 0) }) - t.test('should support multiple nested properties', async (t) => { - t.plan(3) - - const db = create({ + t.test('should support multiple nested properties', async (t) => { const db = create({ schema: { quote: 'string', author: { @@ -616,7 +588,7 @@ t.test('search method', (t) => { t.equal(resultQuotes.count, 3) }) - t.test('with afterSearchHook', (t) => { + t.test('with afterSearchHook', async (t) => { t.test('should run afterSearch hook', async (t) => { let called = 0 const db = create({ @@ -662,7 +634,6 @@ t.test('search method', (t) => { const result = await search(db, { term: '', - threshold: 1, properties: ['animal'] }) @@ -671,10 +642,7 @@ t.test('search method', (t) => { t.end() }) - t.test('with geosearch', async (t) => { - t.plan(4) - - const db = create({ + t.test('with geosearch', async (t) => { const db = create({ schema: { id: 'string', name: 'string', @@ -724,10 +692,7 @@ t.test('search method', (t) => { t.strictSame(r2.hits.map((h) => h.id).sort(), ['1', '2']) }) - t.test('with custom tokenizer', async (t) => { - t.plan(4) - - const normalizationCache = new Map([['english:foo:dogs', 'Dogs']]) + t.test('with custom tokenizer', async (t) => { const normalizationCache = new Map([['english:foo:dogs', 'Dogs']]) const db = create({ schema: { diff --git a/packages/orama/tests/serialization.test.ts b/packages/orama/tests/serialization.test.ts index f0fbd3c9c..ff9929327 100644 --- a/packages/orama/tests/serialization.test.ts +++ b/packages/orama/tests/serialization.test.ts @@ -10,12 +10,8 @@ function extractOriginalDoc(result: Result[]): AnyDocument[] { return result.map(({ document }: AnyDocument) => document) } -t.test('Edge getters', (t) => { - t.plan(4) - +t.test('Edge getters', async (t) => { t.test('should correctly enable edge index getter', async (t) => { - t.plan(2) - const db = create({ schema: { name: 'string', @@ -43,8 +39,6 @@ t.test('Edge getters', (t) => { }) t.test('should correctly enable edge docs getter', async (t) => { - t.plan(2) - const db = create({ schema: { name: 'string', @@ -75,8 +69,6 @@ t.test('Edge getters', (t) => { }) t.test('should correctly enable index setter', async (t) => { - t.plan(6) - const db = create({ schema: { name: 'string', @@ -135,8 +127,6 @@ t.test('Edge getters', (t) => { }) t.test('should correctly save and load data', async (t) => { - t.plan(2) - const originalDB = await create({ schema: { name: 'string', diff --git a/packages/orama/tests/smoke/smoke.test.ts b/packages/orama/tests/smoke/smoke.test.ts index ec793f706..3d52db86e 100644 --- a/packages/orama/tests/smoke/smoke.test.ts +++ b/packages/orama/tests/smoke/smoke.test.ts @@ -3,16 +3,12 @@ import { create, insert, search } from '../../src/index.js' // 👆 This test assumes the module has been built t.test('orama', (t) => { - t.plan(1) - t.test('should correctly search for data', async (t) => { - t.plan(6) - const db = await create({ schema: { quote: 'string', author: 'string' - } + } as const }) await insert(db, { quote: 'the quick, brown fox jumps over the lazy dog. What a fox!', author: 'John Doe' }) diff --git a/packages/orama/tests/snapshots/events.json b/packages/orama/tests/snapshots/events.json index 040b328c3..cbb3d135e 100644 --- a/packages/orama/tests/snapshots/events.json +++ b/packages/orama/tests/snapshots/events.json @@ -404,4 +404,4 @@ } ] } -} +} \ No newline at end of file diff --git a/packages/orama/tests/sort.test.ts b/packages/orama/tests/sort.test.ts index 3374f9aea..e50de1137 100644 --- a/packages/orama/tests/sort.test.ts +++ b/packages/orama/tests/sort.test.ts @@ -1,7 +1,7 @@ import t from 'tap' import { create, insert, insertMultiple, load, remove, save, search, update } from '../src/index.js' -t.test('search with sortBy', (t) => { +t.test('search with sortBy', async (t) => { t.test('on number', async (t) => { const db = await create({ schema: { diff --git a/packages/orama/tests/threshold.test.ts b/packages/orama/tests/threshold.test.ts deleted file mode 100644 index b95c472c1..000000000 --- a/packages/orama/tests/threshold.test.ts +++ /dev/null @@ -1,154 +0,0 @@ -import t from 'tap' -import { create, insert, search } from '../src/index.js' - -t.test('should only return results with all the search terms (exact match)', async (t) => { - t.plan(4) - - const db = await create({ - schema: { - title: 'string' - } - }) - - await insert(db, { title: 'Blue t-shirt slim fit' }) - await insert(db, { title: 'Blue t-shirt oversize fit' }) - await insert(db, { title: 'Red t-shirt v-neck cut' }) - await insert(db, { title: 'Colored t-shirt slim fit' }) - await insert(db, { title: 'Red t-shirt slim fit' }) - - const r1 = await search(db, { - term: 'blue t-shirt', - threshold: 0 - }) - const r2 = await search(db, { - term: 'red t-shirt', - threshold: 0 - }) - const r3 = await search(db, { - term: 'slim fit', - threshold: 0 - }) - const r4 = await search(db, { - term: 'red fit', - threshold: 0 - }) - - t.same(r1.count, 2) - t.same(r2.count, 2) - t.same(r3.count, 3) - t.same(r4.count, 1) -}) - -t.test('should only return results with all the search terms (exact match) on more complex schema', async (t) => { - t.plan(4) - - const db = await create({ - schema: { - title: 'string', - description: 'string' - } - }) - - await insert(db, { - title: 'Blue t-shirt', - description: 'Beautiful blue t-shirt, slim fit. Wears well with jeans and sneakers.' - }) - - await insert(db, { - title: 'Blue t-shirt', - description: 'Beautiful blue t-shirt. A bit oversize.' - }) - - await insert(db, { - title: 'Red t-shirt v-neck cut', - description: 'Great t-shirt for a night out.' - }) - - await insert(db, { - title: 'Colored t-shirt slim fit', - description: 'Colorful t-shirt, slim fit.' - }) - - await insert(db, { - title: 'Green t-shirt', - description: 'Green t-shirt, oversize fit.' - }) - - const r1 = await search(db, { - term: 'blue t-shirt', - threshold: 0 - }) - const r2 = await search(db, { - term: 'red t-shirt', - threshold: 0 - }) - const r3 = await search(db, { - term: 'slim fit', - threshold: 0 - }) - const r4 = await search(db, { - term: 'oversize fit', - threshold: 0 - }) - - t.same(r1.count, 2) - t.same(r2.count, 1) - t.same(r3.count, 2) - t.same(r4.count, 1) -}) - -t.test('should return all the results if threshold is 1', async (t) => { - t.plan(2) - - const db = await create({ - schema: { - title: 'string' - } - }) - - await insert(db, { title: 'Blue t-shirt slim fit' }) - await insert(db, { title: 'Blue t-shirt oversize fit' }) - await insert(db, { title: 'Red t-shirt v-neck cut' }) - await insert(db, { title: 'Colored t-shirt slim fit' }) - - const r1 = await search(db, { - term: 'blue t-shirt', - threshold: 1 - }) - - const r2 = await search(db, { - term: 'slim fit', - threshold: 1 - }) - - t.same(r1.count, 4) - t.same(r2.count, 3) -}) - -t.test('should return all the exact matches + X% of the partial matches', async (t) => { - t.plan(2) - - const db = await create({ - schema: { - title: 'string' - } - }) - - await insert(db, { title: 'Blue t-shirt slim fit' }) - await insert(db, { title: 'Blue t-shirt oversize fit' }) - await insert(db, { title: 'Red t-shirt v-neck cut' }) - await insert(db, { title: 'Colored t-shirt slim fit' }) - - const r1 = await search(db, { - term: 'blue t-shirt', - threshold: 0.6 - }) - - const r2 = await search(db, { - term: 'slim fit', - threshold: 0.7 - }) - - t.same(r1.count, 4) - t.same(r2.count, 3) -}) diff --git a/packages/orama/tests/tokenizeSkipProperties.test.ts b/packages/orama/tests/tokenizeSkipProperties.test.ts index 44fc86048..3469ab2c2 100644 --- a/packages/orama/tests/tokenizeSkipProperties.test.ts +++ b/packages/orama/tests/tokenizeSkipProperties.test.ts @@ -1,7 +1,7 @@ import t from 'tap' import { Orama, create, insert, search } from '../src/index.js' -t.test('tokenizeSkipProperties', (t) => { +t.test('tokenizeSkipProperties', async (t) => { t.test('skipProperties', async (t) => { const [db, id1] = await createSimpleDB(true) diff --git a/packages/orama/tests/tokenizer.test.ts b/packages/orama/tests/tokenizer.test.ts index 0bf26753f..9abe5cad0 100644 --- a/packages/orama/tests/tokenizer.test.ts +++ b/packages/orama/tests/tokenizer.test.ts @@ -9,7 +9,7 @@ import { stemmer as germanStemmer, language as germanLanguage } from '@orama/ste import { stemmer as italianStemmer, language as italianLanguage } from '@orama/stemmers/italian' import { stemmer as norwegianStemmer, language as norwegianLanguage } from '@orama/stemmers/norwegian' import { stemmer as portugueseStemmer, language as portugueseLanguage } from '@orama/stemmers/portuguese' -import { stemmer as russianStemmer } from '@orama/stemmers/russian' +import { stemmer as russianStemmer, language as russianLanguage } from '@orama/stemmers/russian' import { stemmer as spanishStemmer, language as spanishLanguage } from '@orama/stemmers/spanish' import { stemmer as swedishStemmer, language as swedishLanguage } from '@orama/stemmers/swedish' import { stemmer as ukrainianStemmer, language as ukrainianLanguage } from '@orama/stemmers/ukrainian' @@ -33,10 +33,7 @@ import { stopwords as tamilStopwords } from '@orama/stopwords/tamil' import { createTokenizer } from '../src/components/tokenizer/index.js' t.test('Tokenizer', async (t) => { - t.plan(21) - t.test('should tokenize and stem correctly in english', async (t) => { - t.plan(2) const tokenizer = await createTokenizer({ language: 'english', stopWords: false, stemming: true }) @@ -51,8 +48,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in english and allow duplicates', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: 'english', allowDuplicates: true, @@ -71,8 +66,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in english skipping appropriate properties (single)', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: 'english', stemming: true, @@ -90,8 +83,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in english skipping appropriate properties (multiple)', async (t) => { - t.plan(3) - const tokenizer = await createTokenizer({ language: 'english', stemming: true, @@ -111,8 +102,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in english skipping appropriate properties (invalid)', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: 'english', stemming: true, @@ -131,8 +120,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in french', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: frenchLanguage, stemmer: frenchStemmer, @@ -150,8 +137,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in italian', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: italianLanguage, stemmer: italianStemmer, @@ -169,8 +154,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in norwegian', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: norwegianLanguage, stemmer: norwegianStemmer, @@ -187,8 +170,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in portuguese', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: portugueseLanguage, stemmer: portugueseStemmer, @@ -206,10 +187,8 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in russian', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ - language: 'russian', + language: russianLanguage, stemmer: russianStemmer, stopWords: russianStopwords }) @@ -225,8 +204,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in swedish', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: swedishLanguage, stemmer: swedishStemmer, @@ -243,8 +220,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in spanish', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: spanishLanguage, stemmer: spanishStemmer, @@ -262,8 +237,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in dutch', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: dutchLanguage, stemmer: dutchStemmer, @@ -280,8 +253,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in german', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: germanLanguage, stemmer: germanStemmer, @@ -299,8 +270,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in finnish', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: finnishLanguage, stemmer: finnishStemmer, @@ -318,8 +287,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in danish', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: danishLanguage, stemmer: danishStemmer, @@ -337,8 +304,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in tamil', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: tamilLanguage, stemmer: tamilStemmer, @@ -356,8 +321,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in ukrainian', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: ukrainianLanguage, stemmer: ukrainianStemmer, @@ -375,8 +338,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should tokenize and stem correctly in bulgarian', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: bulgarianLanguage, stemmer: bulgarianStemmer, stopWords: [] }) const I1 = 'Кокошката е малка крава която не може да се събере с теста' @@ -390,8 +351,6 @@ t.test('Tokenizer', async (t) => { }) t.test('disable stemming', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: 'english', stemming: false, stopWords: englishStopwords }) const I1 = 'the quick brown fox jumps over the lazy dog' @@ -405,8 +364,6 @@ t.test('Tokenizer', async (t) => { }) t.test('should validate options', async (t) => { - t.plan(3) - await t.rejects(() => createTokenizer({ language: 'weird-language' }), { code: 'LANGUAGE_NOT_SUPPORTED' }) await t.rejects(() => createTokenizer({ language: 'italian', stemming: true }), { code: 'MISSING_STEMMER' }) @@ -419,11 +376,7 @@ t.test('Tokenizer', async (t) => { }) t.test('Custom stop-words rules', async (t) => { - t.plan(5) - t.test('custom array of stop-words', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: 'english', stopWords: ['quick', 'brown', 'fox', 'dog'], @@ -442,8 +395,6 @@ t.test('Custom stop-words rules', async (t) => { }) t.test('custom stop-words function', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: 'english', stopWords(): string[] { @@ -463,8 +414,6 @@ t.test('Custom stop-words rules', async (t) => { }) t.test('disable stop-words', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: 'english', stopWords: false, stemming: true }) const I1 = 'the quick brown fox jumps over the lazy dog' @@ -478,8 +427,6 @@ t.test('Custom stop-words rules', async (t) => { }) t.test('custom stemming function', async (t) => { - t.plan(2) - const tokenizer = await createTokenizer({ language: 'english', stemmer: (word) => `${word}-ish`, @@ -497,8 +444,6 @@ t.test('Custom stop-words rules', async (t) => { }) await t.test('should validate options', async (t) => { - t.plan(3) - // @ts-expect-error testing validation await t.rejects(() => createTokenizer({ language: 'english', stopWords: 'FOO' }), { code: 'CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY' diff --git a/packages/orama/tests/tree.avl.test.ts b/packages/orama/tests/tree.avl.test.ts index c5fc6969f..a00cc2354 100644 --- a/packages/orama/tests/tree.avl.test.ts +++ b/packages/orama/tests/tree.avl.test.ts @@ -2,21 +2,15 @@ import t from 'tap' import { AVLTree } from '../src/trees/avl.js' -t.test('AVL Tree', (t) => { - t.plan(7) - - t.test('create', (t) => { - t.plan(3) - +t.test('AVL Tree', async (t) => { + t.test('create', async (t) => { const tree = new AVLTree(1, 'foo') t.equal(tree.getSize(), 1) t.equal(tree.find(1), 'foo') t.equal(tree.find(4), null) }) - t.test('insert', (t) => { - t.plan(1) - + t.test('insert', async (t) => { const tree = new AVLTree(1, 'foo') tree.insert(2, 'bar') @@ -29,9 +23,7 @@ t.test('AVL Tree', (t) => { t.equal(tree.getSize(), 7) }) - t.test('find', (t) => { - t.plan(2) - + t.test('find', async (t) => { const tree = new AVLTree(1, [1, 2, 3]) tree.insert(2, [4, 5, 6]) @@ -45,9 +37,7 @@ t.test('AVL Tree', (t) => { t.same(tree.find(20), [16, 17, 18]) }) - t.test('remove', (t) => { - t.plan(2) - + t.test('remove', async (t) => { const tree = new AVLTree(1, 'foo') tree.insert(2, 'bar') @@ -63,9 +53,7 @@ t.test('AVL Tree', (t) => { t.equal(tree.contains(20), false) }) - t.test('rangeSearch', (t) => { - t.plan(1) - + t.test('rangeSearch', async (t) => { const tree = new AVLTree(1, ['foo']) tree.insert(2, ['bar']) @@ -78,9 +66,7 @@ t.test('AVL Tree', (t) => { t.same(tree.rangeSearch(5, 20), ['quux', 'baz', 'corge', 'quuz']) }) - t.test('greaterThan', (t) => { - t.plan(1) - + t.test('greaterThan', async (t) => { const tree = new AVLTree(1, ['foo']) tree.insert(2, ['bar']) @@ -93,9 +79,7 @@ t.test('AVL Tree', (t) => { t.same(tree.greaterThan(10), ['qux', 'quuz', 'corge']) }) - t.test('lessThan', (t) => { - t.plan(1) - + t.test('lessThan', async (t) => { const tree = new AVLTree(1, ['foo']) tree.insert(2, ['bar']) diff --git a/packages/orama/tests/tree.bkd.test.ts b/packages/orama/tests/tree.bkd.test.ts index b00ac3d7b..6882756b6 100644 --- a/packages/orama/tests/tree.bkd.test.ts +++ b/packages/orama/tests/tree.bkd.test.ts @@ -20,23 +20,15 @@ const coordinates = [ } ] -t.test('create', (t) => { - t.plan(1) - - t.test('should create a new, empty tree', (t) => { - t.plan(1) - +t.test('create', async (t) => { + t.test('should create a new, empty tree', async (t) => { const tree = new BKDTree() t.equal(tree.root, null) }) }) -t.test('insert', (t) => { - t.plan(2) - - t.test('should insert a new node into an empty tree', (t) => { - t.plan(1) - +t.test('insert', async (t) => { + t.test('should insert a new node into an empty tree', async (t) => { const tree = new BKDTree() const coordinatePoints = coordinates.map(({ lat, lon }) => ({ lat, lon })) @@ -76,9 +68,7 @@ t.test('insert', (t) => { t.same(tree.toJSON(), expectedTree) }) - t.test('should merge docIDs if the point already exists', (t) => { - t.plan(1) - + t.test('should merge docIDs if the point already exists', async (t) => { const tree = new BKDTree() tree.insert({ lat: 37.8207190397588, lon: -122.47838916631231 }, [1]) @@ -95,12 +85,8 @@ t.test('insert', (t) => { }) }) -t.test('searchByRadius', (t) => { - t.plan(1) - - t.test('should return all points within a given radius', (t) => { - t.plan(3) - +t.test('searchByRadius', async (t) => { + t.test('should return all points within a given radius', async (t) => { const tree = new BKDTree() const coordinatePoints = coordinates.map(({ lat, lon }) => ({ lat, lon })) @@ -136,12 +122,8 @@ t.test('searchByRadius', (t) => { }) }) -t.test('searchInsidePolygon', (t) => { - t.plan(1) - - t.test('should return all points inside a given polygon', (t) => { - t.plan(2) - +t.test('searchInsidePolygon', async (t) => { + t.test('should return all points inside a given polygon', async (t) => { const tree = new BKDTree() const coordinatePoints = coordinates.map(({ lat, lon }) => ({ lat, lon })) @@ -189,12 +171,8 @@ t.test('searchInsidePolygon', (t) => { }) }) -t.test('contains', (t) => { - t.plan(1) - - t.test('should return true if the tree contains the given point', (t) => { - t.plan(2) - +t.test('contains', async (t) => { + t.test('should return true if the tree contains the given point', async (t) => { const tree = new BKDTree() const coordinatePoints = coordinates.map(({ lat, lon }) => ({ lat, lon })) @@ -207,12 +185,8 @@ t.test('contains', (t) => { }) }) -t.test('removeDocByID', (t) => { - t.plan(2) - - t.test('should remove a document from the tree by its ID', (t) => { - t.plan(1) - +t.test('removeDocByID', async (t) => { + t.test('should remove a document from the tree by its ID', async (t) => { const tree = new BKDTree() tree.insert({ lat: 37.8207190397588, lon: -122.47838916631231 }, [1]) @@ -230,9 +204,7 @@ t.test('removeDocByID', (t) => { t.same(docIDs ? docIDs.sort() : null, [1, 3]) }) - t.test("If the node doesn't have any more docIDs, it should remove the node", (t) => { - t.plan(1) - + t.test("If the node doesn't have any more docIDs, it should remove the node", async (t) => { const tree = new BKDTree() tree.insert({ lat: 37.8207190397588, lon: -122.47838916631231 }, [1]) diff --git a/packages/orama/tests/tree.zip.test.ts b/packages/orama/tests/tree.zip.test.ts index 81fbc048b..f6d781765 100644 --- a/packages/orama/tests/tree.zip.test.ts +++ b/packages/orama/tests/tree.zip.test.ts @@ -1,9 +1,7 @@ import t from 'tap' import { ZipTree } from '../src/trees/zip.js' -t.test('ZIP Tree', (t) => { - t.plan(7) - +t.test('ZIP Tree', async (t) => { t.test('create', (t) => { t.plan(3) @@ -30,9 +28,7 @@ t.test('ZIP Tree', (t) => { t.equal(tree.getSize(), 7) }) - t.test('find', (t) => { - t.plan(2) - + t.test('find', async (t) => { const tree = new ZipTree() tree.insert(1, [1, 2, 3]) @@ -47,9 +43,7 @@ t.test('ZIP Tree', (t) => { t.same(tree.find(20), [16, 17, 18]) }) - t.test('remove', (t) => { - t.plan(2) - + t.test('remove', async (t) => { const tree = new ZipTree() tree.insert(1, 'foo') @@ -66,9 +60,7 @@ t.test('ZIP Tree', (t) => { t.equal(tree.contains(20), false) }) - t.test('rangeSearch', (t) => { - t.plan(1) - + t.test('rangeSearch', async (t) => { const tree = new ZipTree() tree.insert(1, 'foo') @@ -82,9 +74,7 @@ t.test('ZIP Tree', (t) => { t.same(tree.rangeSearch(5, 20), ['quux', 'baz', 'corge', 'quuz']) }) - t.test('greaterThan', (t) => { - t.plan(1) - + t.test('greaterThan', async (t) => { const tree = new ZipTree() tree.insert(1, 'foo') @@ -98,9 +88,7 @@ t.test('ZIP Tree', (t) => { t.same(tree.greaterThan(10), ['corge', 'quuz', 'qux']) }) - t.test('lessThan', (t) => { - t.plan(1) - + t.test('lessThan', async (t) => { const tree = new ZipTree() tree.insert(1, 'foo') diff --git a/packages/orama/tests/update.test.ts b/packages/orama/tests/update.test.ts index 7da539265..efdf6bed6 100644 --- a/packages/orama/tests/update.test.ts +++ b/packages/orama/tests/update.test.ts @@ -1,12 +1,8 @@ import t from 'tap' import { create, insert, getByID, update, updateMultiple, count } from '../src/index.js' -t.test('update method', (t) => { - t.plan(1) - +t.test('update method', async (t) => { t.test('should remove a document the old document and insert the new one', async (t) => { - t.plan(3) - const db = create({ schema: { quote: 'string', diff --git a/packages/orama/tests/utils.test.ts b/packages/orama/tests/utils.test.ts index ed13617f5..d774458f3 100644 --- a/packages/orama/tests/utils.test.ts +++ b/packages/orama/tests/utils.test.ts @@ -1,12 +1,8 @@ import t from 'tap' import { formatBytes, formatNanoseconds, getOwnProperty, getNested, flattenObject } from '../src/utils.js' -t.test('utils', (t) => { - t.plan(5) - +t.test('utils', async (t) => { t.test('should correctly format bytes', async (t) => { - t.plan(9) - t.equal(await formatBytes(0), '0 Bytes') t.equal(await formatBytes(1), '1 Bytes') t.equal(await formatBytes(1024), '1 KB') @@ -19,8 +15,6 @@ t.test('utils', (t) => { }) t.test('should correctly format nanoseconds', async (t) => { - t.plan(13) - t.equal(await formatNanoseconds(1n), '1ns') t.equal(await formatNanoseconds(10n), '10ns') t.equal(await formatNanoseconds(100n), '100ns') @@ -36,12 +30,8 @@ t.test('utils', (t) => { t.equal(await formatNanoseconds(1000_000_000_000n), '1000s') }) - t.test('should check object properties', (t) => { - t.plan(2) - - t.test('should return the value of the property or undefined', (t) => { - t.plan(2) - + t.test('should check object properties', async (t) => { + t.test('should return the value of the property or undefined', async (t) => { const myObject = { foo: 'bar' } @@ -50,9 +40,7 @@ t.test('utils', (t) => { t.equal(getOwnProperty(myObject, 'bar'), undefined) }) - t.test('should return even if the hasOwn method is not available', (t) => { - t.plan(2) - + t.test('should return even if the hasOwn method is not available', async (t) => { // @ts-expect-error - we are testing the fallback globalThis.Object.hasOwn = undefined @@ -66,8 +54,6 @@ t.test('utils', (t) => { }) t.test('should get value from a nested object', async (t) => { - t.plan(7) - const myObject = { foo: 'bar', nested: { @@ -90,9 +76,7 @@ t.test('utils', (t) => { t.equal(await getNested(myObject, 'nested.noop.bar'), undefined) }) - t.test('should flatten an object', (t) => { - t.plan(2) - + t.test('should flatten an object', async (t) => { const myObject = { foo: 'bar', nested: { diff --git a/packages/stemmers/package.json b/packages/stemmers/package.json index 0df2016c6..7232e6b66 100644 --- a/packages/stemmers/package.json +++ b/packages/stemmers/package.json @@ -117,11 +117,6 @@ "import": "./dist/rs.js", "require": "./dist/rs.cjs" }, - "./slovenian": { - "types": "./dist/ru.d.ts", - "import": "./dist/ru.js", - "require": "./dist/ru.cjs" - }, "./spanish": { "types": "./dist/es.d.ts", "import": "./dist/es.js", diff --git a/packages/stemmers/scripts/build.js b/packages/stemmers/scripts/build.js index 14af5368d..b18e3ccc1 100644 --- a/packages/stemmers/scripts/build.js +++ b/packages/stemmers/scripts/build.js @@ -29,7 +29,12 @@ const stemmers = { romanian: 'ro', russian: 'ru', serbian: 'rs', - slovenian: 'ru', + // This is never implemented actually. + // We used `slovenian` as `russian`, but it was wrong, sorry! + // Instead of providing a wrong implementation, we don't export it. + // Anyway, this is never tested inside `orama` package. + // Please, we need a PR to implement this correctly! + /* slovenian: 'sl', */ spanish: 'es', swedish: 'se', tamil: 'ta', @@ -54,7 +59,7 @@ async function compile(lang, fullLang, jsExtension, tsExtension, moduleType) { // Create the definition file await writeFile( resolve(destinationDir, `${lang}.d.${tsExtension}`), - 'export declare function stemmer(word: string): string', + 'export declare function stemmer(word: string): string;\n export const language: string;', 'utf-8' ) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2381b8311..48033f0ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,8 +75,8 @@ importers: specifier: ^3.12.1 version: 3.14.0 turbo: - specifier: ^1.8.5 - version: 1.13.4 + specifier: ^2.1.3 + version: 2.1.3 typescript: specifier: ^5.0.0 version: 5.6.2 @@ -205,8 +205,8 @@ importers: specifier: ^2.8.1 version: 2.8.8 tap: - specifier: ^18.6.1 - version: 18.8.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + specifier: ^21.0.1 + version: 21.0.1(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) tap-mocha-reporter: specifier: ^5.0.3 version: 5.0.4 @@ -767,7 +767,7 @@ importers: version: link:../plugin-secure-proxy tsup: specifier: ^7.2.0 - version: 7.3.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))(typescript@5.6.2) + version: 7.3.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.6.2))(typescript@5.6.2) tsx: specifier: ^4.19.0 version: 4.19.1 @@ -780,10 +780,10 @@ importers: devDependencies: tap: specifier: ^18.6.1 - version: 18.8.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 18.8.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) tsup: specifier: ^7.2.0 - version: 7.3.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))(typescript@5.6.2) + version: 7.3.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.6.2))(typescript@5.6.2) tsx: specifier: ^4.7.1 version: 4.19.1 @@ -1221,6 +1221,7 @@ packages: '@babel/plugin-proposal-object-rest-spread@7.12.1': resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -3396,10 +3397,18 @@ packages: resolution: {integrity: sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ==} engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/redact@2.0.1': + resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} + engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/run-script@7.0.4': resolution: {integrity: sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==} engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/run-script@8.1.0': + resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} + engines: {node: ^16.14.0 || >=18.0.0} + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -3976,30 +3985,66 @@ packages: peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/after-each@4.0.0': + resolution: {integrity: sha512-RrkYMB3SpXKFJAijbgNkOexiClX5aygkCIHKHPIfnfqsPozkwjYbtVQs6d1/tG8ytiJtH5rvybuNJMRRNDcfBQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/after@1.1.22': resolution: {integrity: sha512-8Ui8dfTFgDS3ENfzKpsWGJw+v4LHXvifaSB79chQbucuggW+nM2zzWu7grw7mDUBBR3Mknk+qL4Nb1KrnZvfWQ==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/after@3.0.0': + resolution: {integrity: sha512-BCGq+YocD0xxeGC4mMym2tg6qtgFJJdCrji8N1HbF55d55nxQrA8R/w6+D9b4N7t/4dfpbI+LW5FgdBATohFPw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/asserts@1.2.0': resolution: {integrity: sha512-QTs1kALeJKrlX9Yns3f8/hfsWgf4mdFYPN3lQKxZ/3C/DkGnjlrpVd4I2fnTC7cgJ116kwEgwhxVJUpw9QPp9A==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/asserts@4.0.0': + resolution: {integrity: sha512-V1YmOLMhyITi75e0u8vS+x1S0sDwISWk643C4a9XiY2RDin1nEueE8Nzwp2ZBP+N4HtgzKVfzJ1AYvpwaTKwUA==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/before-each@1.1.22': resolution: {integrity: sha512-uKKllHDvQgTXjAm+F+29Iqcb9Bzh5U6LH45m6v/zfKPm8UNnNpJ/XxFbbsFqi0EQX2czYH0ivHfyQwiO40R8lw==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/before-each@4.0.0': + resolution: {integrity: sha512-zJwDLLH+3+qmpE8Pr1fAEeqZNvbok7yYKKKE/7IDMi3zdvM0Rjk7Y4JXGbVI8IreuRK0rXaSL1ZZqbFMsZGHrg==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/before@1.1.22': resolution: {integrity: sha512-Uv2odGCtOgY/EevyDZv2rHbIbe9WGrouC6HI+lJv4whGUKgiIYTOjrssl4YxvqvnNWx289/6Tp4Kpu7EeXT7yA==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/before@4.0.0': + resolution: {integrity: sha512-d1k6lTSzqTcq4pjGsCPUxNP5NFWZBxwHLmgVxy2RHfZwKM20eXXAOPgAw3LgPVgkoehwi+nwWUGTJDcL3AS8YQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/chdir@3.0.0': + resolution: {integrity: sha512-yljg4CX2/UinFytD50LaRhBVTDaW3vBcUwzYnXzJcuFLoPEpq0svlyIwzcCXfLLGP8/AgkS3MRt58AisBtz4zw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/config@2.4.19': resolution: {integrity: sha512-8fkUnf2d3g9wbnfSirXI92bx4ZO5X37nqYVb5fua9VDC2MsTLAmd4JyDSNG1ngn8/nO5o8aFNEeUaePswGId4A==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} @@ -4007,44 +4052,89 @@ packages: '@tapjs/core': 1.5.4 '@tapjs/test': 1.4.4 + '@tapjs/config@5.0.0': + resolution: {integrity: sha512-AAHbK30FwnGC3FcFACnXEGZ+uFtkpxsF2bwvgAzHND2tIE9ld2LwGMiGq3rM9EwcZ1AAnU8ibbUC0WbnS5FcCQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/test': 4.0.0 + '@tapjs/core@1.5.4': resolution: {integrity: sha512-kDgRxTkSRxfLbX5orDmizxuyFBLLC3Mu4mQ2dMzw/UMYkrN8jZbkKZqIR0BdXgxE+GqvVFqkYvFJImXJBygBKQ==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + '@tapjs/core@4.0.0': + resolution: {integrity: sha512-COWMNbGBjf0qbsbKw+2911rrt+oXXOkIXpoMpIsz0/UN2rxqAAvDyrriObVfc4v+O2auabnWfdrxwNm3Vy01yw==} + engines: {node: 20 || >=22} + '@tapjs/error-serdes@1.2.2': resolution: {integrity: sha512-RW2aU50JR7SSAlvoTyuwouXETLM9lP+7oZ5Z+dyKhNp8mkbbz4mXKcgd9SDHY5qTh6zvVN7OFK7ev7dYWXbrWw==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + '@tapjs/error-serdes@4.0.0': + resolution: {integrity: sha512-jO0CvhL7lyGcDzyPeumyXirBv/vxRuhg8SdyLwjNqO7aelckxZzY/dCchtov7PfKK7wc/iB55W2++PE9waFaWw==} + engines: {node: 20 || >=22} + '@tapjs/filter@1.2.22': resolution: {integrity: sha512-qVWbsFem2R1htQVh0+4xWMPsDPpQ2NhA/6mnlg4ApzAFvaTr5T/zK72VpR+AqPaMcMgrp4a/m5DQ03dLFqckZQ==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/filter@4.0.0': + resolution: {integrity: sha512-VCqwRB+GJKDavOtoCU6K3skR6b/Qv7vo5YwuwgTUzRDmeNJQwI4S/s0l4cRbaMVJxuXeR3o5JwBsH0Ppjwzgkw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/fixture@1.2.22': resolution: {integrity: sha512-ZYjkRzLSwW+cOg2CbL3GrgjatKVXcEGLQa7vjfmYVxDrPHkK7tiu3lf1KU6pFxTyqTlMMRUfMehHQrH+JjDC7Q==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/fixture@4.0.0': + resolution: {integrity: sha512-h8qZwzQqNd0aLU+oU+0uhBSSlU4+5a8kkFfPrwlNQr9Vde2CyW5vMMVWvX2do+5wFyiFwKHAjbtBS7BSkfH7Kw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/intercept@1.2.22': resolution: {integrity: sha512-OiayUlV+0fxwGM3B7JyRSwryq2kRpuWiF+4wQCiufSbbF20H4uEIlkRq1YrfUlla4zWVvHeQOQlUoqb6fSEcSQ==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/intercept@4.0.0': + resolution: {integrity: sha512-MSPvOcwVKZjtb2KVY6JB/dBD54mGkzaJHCdzkIAJdcUAAbZQz5pMppQkEwPw/Zs+JFPJjGzZyITrDfh9if7maw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/mock@1.3.4': resolution: {integrity: sha512-tEz5hIdJdAGzl+KxjZol4DD7cWAdYMmvLU/QCZ5BThAOJ+FUAOxtBFA31nd7IWkMseIqcbeeqLmeMtan6QlPKA==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/mock@4.0.0': + resolution: {integrity: sha512-6GyQm61wSCmfxKb7GRY24cdnO92mV7mZ0hmdbOko881FIEmjeAsLQaNKUaatnGWpzBUoqw+JCzbASee4/AfaMQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/node-serialize@1.3.4': resolution: {integrity: sha512-OwnSWdNnukgIGBsgnPy1ZpBDxp274GwLx2Ag+CulhsQ+IF9rOCq5P0EQ2kbxhxRet1386kbNzgXgaEeXmDXlLQ==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/node-serialize@4.0.0': + resolution: {integrity: sha512-cFHcyEZHd4SQPSoZ4tGHfo/p1+4r24G0K0jiAb28WotdE2kbjkf7TVEiKOA5IEOmjQtdJ4+gVcuErZUchjpQZg==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/processinfo@3.1.8': resolution: {integrity: sha512-FIriEB+qqArPhmVYc1PZwRHD99myRdl7C9Oe/uts04Q2LOxQ5MEmqP9XOP8vVYzpDOYwmL8OmL6eOYt9eZlQKQ==} engines: {node: '>=16.17'} @@ -4055,6 +4145,12 @@ packages: peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/reporter@4.0.1': + resolution: {integrity: sha512-bS7pOGV99GAhYY/LxNxL4Qq0Ldi4k8DZDC25gonVQrNUW2zYpSBerhrnsz1KDXdaD2OKDtSR8oW2FxUyL6n83A==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/run@1.5.4': resolution: {integrity: sha512-mwzU/KalqYOGZTTf7lPyfBdRDCoIgec69NXrq/+Le7PXYWKrRoYvIUoBGwgZYyjfiYshhnzb+ayZdtd76Lj0Kw==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} @@ -4062,28 +4158,57 @@ packages: peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/run@4.0.1': + resolution: {integrity: sha512-jll1tiMhxFajfHIGBF/eK+Ob0uEqXBnQq/ONNc9heqcCtcXhC4iYGzhoK+sw03MxwrbRtNomQ7dRqiT0IOjS6w==} + engines: {node: 20 || >=22} + hasBin: true + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/snapshot@1.2.22': resolution: {integrity: sha512-6nhNY6uFPnQEVQ8vuxV3rKiC7NXDY5k/Bv1bPatfo//6z1T41INfQbnfwQXoufaHveLPpGBTLwpOWjtFsUHgdg==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/snapshot@4.0.0': + resolution: {integrity: sha512-1d2IOOpbra6VMDypft8NGylkIypgk2VgMRrEeSsipOyeku81STlcdzm8mS0COCqVtX6+si+tkERuqFrCVy/xSg==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/spawn@1.1.22': resolution: {integrity: sha512-/MbFSmSpvLA0N2rKd8rI0vMLYM+0E3OB+doj+YUZe5m3G0YCHTBzZrnFGLw7Am1VsaREy4fSgchNEdn1NyikcQ==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/spawn@4.0.0': + resolution: {integrity: sha512-K+kn4wCIMiOfHtjt5lxlxmJMvL4C9txAxapTRyLEm9ul9ZKgzAOQmMD29YEtkKY53v1eAfpJ3agCXnH59uOJ+A==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/stack@1.2.8': resolution: {integrity: sha512-VC8h6U62ScerTKN+MYpRPiwH2bCL65S6v1wcj1hukE2hojLcRvVdET7S3ZtRfSj/eNWW/5OVfzTpHiGjEYD6Xg==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + '@tapjs/stack@4.0.0': + resolution: {integrity: sha512-uj6BvHXvLf1qILvcpYit9D6JX7pg4eSbaxm1MhWpi8wdhSQyUAOe4gxCMTfJpW0ekB48N4QN3S3vaq7rWtFctw==} + engines: {node: 20 || >=22} + '@tapjs/stdin@1.1.22': resolution: {integrity: sha512-JUyzZHG01iM6uDfplVGRiK+OdNalwl5Okv+eljHBdZOA8kO3hHI6N9bkZa472/st4NBj0lcMMGb2IKGgIBBUQg==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/stdin@4.0.0': + resolution: {integrity: sha512-6QcaKEKH+RB5YPVHytclqzrKoh1d0S8i8lEgGwGAhoaShyawB5CoADnKpCXWjHKsRESUvG7CqiPDGsK39BJEaA==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/test@1.4.4': resolution: {integrity: sha512-I0mzxs8+RUULd9g0R6+LXsLzkeqhu5jJPpA7w5BzTxA++jQ0ACjyHs1BBy1IhhP9DeZ5N2LPg+WxLs7Dijs9Uw==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} @@ -4091,18 +4216,37 @@ packages: peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/test@4.0.0': + resolution: {integrity: sha512-lOU1N0bFCCjJg2UEb8TlLj6+u754Uxi2CSuv3TSkRU+oHRBTEPZ4nJ6MpUqvgyvKm9ilVZ5FLS9/GwXB/XLH3A==} + engines: {node: 20 || >=22} + hasBin: true + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/typescript@1.4.4': resolution: {integrity: sha512-Mf2vIK1yk5ipQRmuIznFtC8Iboti0p0D90ENDZdEx678h60vAVPh9vebVX+oQ0LccAHGyu/CiOSFL4Za8b5/Rg==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/typescript@3.0.0': + resolution: {integrity: sha512-gKDv+07vdNuplN32sQvkzuEnai9JqJlUX5BuqTrSeWMsoKCoGPdyt8YNwaoebVeyBpt7IgjOBln8YLhfI3AcpA==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/worker@1.1.22': resolution: {integrity: sha512-1PO9Qstfevr4Wdh318eC3O1mytSyXT3q/K6EeivBhnuPeyHsy3QCAd1bfVD7gqzWNbJ/UzeGN3knfIi5qXifmA==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: '@tapjs/core': 1.5.4 + '@tapjs/worker@4.0.0': + resolution: {integrity: sha512-BI5Ttet5HEABPAll8Ou8oFQGIiglen87PYlwTc9yLEB+g4mj8FCZYTGJNIW981CT7lOZzMJICz3C3VTdC9vzuA==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tensorflow-models/universal-sentence-encoder@1.3.3': resolution: {integrity: sha512-mipL7ad0CW6uQ68FUkNgkNj/zgA4qgBnNcnMMkNTdL9MUMnzCxu3AE8pWnx2ReKHwdqEG4e8IpaYKfH4B8bojg==} peerDependencies: @@ -4840,6 +4984,10 @@ packages: resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} @@ -5188,6 +5336,16 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c8@10.1.2: + resolution: {integrity: sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + monocart-coverage-reports: ^2 + peerDependenciesMeta: + monocart-coverage-reports: + optional: true + c8@7.14.0: resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} engines: {node: '>=10.12.0'} @@ -5399,6 +5557,10 @@ packages: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -6209,6 +6371,10 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -7509,6 +7675,19 @@ packages: react-devtools-core: optional: true + ink@5.0.1: + resolution: {integrity: sha512-ae4AW/t8jlkj/6Ou21H2av0wxTk8vrGzXv+v2v7j4in+bl1M5XRMVbfNghzhBokV++FjF8RBDJvYo+ttR9YVRg==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': '>=18.0.0' + react: '>=18.0.0' + react-devtools-core: ^4.19.1 + peerDependenciesMeta: + '@types/react': + optional: true + react-devtools-core: + optional: true + inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -7657,6 +7836,10 @@ packages: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -7671,6 +7854,11 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-in-ci@0.1.0: + resolution: {integrity: sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==} + engines: {node: '>=18'} + hasBin: true + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -9047,6 +9235,10 @@ packages: resolution: {integrity: sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA==} engines: {node: ^16.14.0 || >=18.0.0} + npm-registry-fetch@17.1.0: + resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -9265,6 +9457,11 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} hasBin: true + pacote@18.0.6: + resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + pagefind@1.1.1: resolution: {integrity: sha512-U2YR0dQN5B2fbIXrLtt/UXNS0yWSSYfePaad1KcBPTi0p+zRtsVjwmoPaMQgTks5DnHNbmDxyJUL5TGaLljK3A==} hasBin: true @@ -10963,6 +11160,10 @@ packages: resolution: {integrity: sha512-6bn4hRfkTvDfUoEQYkERg0BVF1D0vrX9HEkMl08uDiNWvVvjylLHvZFZWkDo6wjT8tUctbYl1nCOuE66ZTaUtA==} engines: {node: '>=14.16'} + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + slugify@1.6.6: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} @@ -11338,6 +11539,11 @@ packages: engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} hasBin: true + tap-parser@18.0.0: + resolution: {integrity: sha512-RM3Lp5LNCYcepRqPMuDFg8S3uYV8MDmgxUOjx2Q7f2z5QuB88u92ViBwyp3MuQ/DVMR7v48HrJfV2scXRQYf5A==} + engines: {node: 20 || >=22} + hasBin: true + tap-yaml@1.0.2: resolution: {integrity: sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==} @@ -11345,11 +11551,20 @@ packages: resolution: {integrity: sha512-MWG4OpAKtNoNVjCz/BqlDJiwTM99tiHRhHPS4iGOe1ZS0CgM4jSFH92lthSFvvy4EdDjQZDV7uYqUFlU9JuNhw==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + tap-yaml@4.0.0: + resolution: {integrity: sha512-CjMbq8hhT5TvzyvHRnzbGp00wmb4TZjSscCRCCJCdCzRb+Pb56HaMlBHNBn1/GZ6UqwUgDKdF18+9VAFnQ4F0g==} + engines: {node: 20 || >=22} + tap@18.8.0: resolution: {integrity: sha512-tX02yXmzBcemYfNGKtTJFf3cn7e8VgBvxKswaew8YnrE+1cUZtxyN0GhMzPQ5cWznVz47DfgcuYR1QtCr+4LOw==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} hasBin: true + tap@21.0.1: + resolution: {integrity: sha512-FE8H5Nt2mKU96DX4XgjqBkKzMcxvVkmbKhaNWOk2lUNRpqJNKqBOO5R6q7shr7JoUh1DHwdNWmppg8vWXQh2lQ==} + engines: {node: 20 || >=22} + hasBin: true + tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -11370,6 +11585,10 @@ packages: resolution: {integrity: sha512-sxvgCgO2GAIWHibnK4zLvvi9GHd/ZlR9DOUJ4ufwvNtkdKE2I9MNwJUwzYvOmGrJXMcfhhw0CDBb+6j0ia+I7A==} engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + tcompare@9.0.0: + resolution: {integrity: sha512-qOliew2xDAqIUbIamIFZ+pz80s9T+8IywzQPIt7YX30ojsBqk86jcD6ouygqt5lHURTxFxWjzbUmIe7Cts4bsA==} + engines: {node: 20 || >=22} + terser-webpack-plugin@5.3.10: resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} @@ -11395,6 +11614,10 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -11597,38 +11820,38 @@ packages: resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} engines: {node: ^16.14.0 || >=18.0.0} - turbo-darwin-64@1.13.4: - resolution: {integrity: sha512-A0eKd73R7CGnRinTiS7txkMElg+R5rKFp9HV7baDiEL4xTG1FIg/56Vm7A5RVgg8UNgG2qNnrfatJtb+dRmNdw==} + turbo-darwin-64@2.1.3: + resolution: {integrity: sha512-ouJOm0g0YyoBuhmikEujVCBGo3Zr0lbSOWFIsQtWUTItC88F2w2byhjtsYGPXQwMlTbXwmoBU2lOCfWNkeEwHQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@1.13.4: - resolution: {integrity: sha512-eG769Q0NF6/Vyjsr3mKCnkG/eW6dKMBZk6dxWOdrHfrg6QgfkBUk0WUUujzdtVPiUIvsh4l46vQrNVd9EOtbyA==} + turbo-darwin-arm64@2.1.3: + resolution: {integrity: sha512-j2FOJsK4LAOtHQlb3Oom0yWB/Vi0nF1ljInr311mVzHoFAJRZtfW2fRvdZRb/lBUwjSp8be58qWHzANIcrA0OA==} cpu: [arm64] os: [darwin] - turbo-linux-64@1.13.4: - resolution: {integrity: sha512-Bq0JphDeNw3XEi+Xb/e4xoKhs1DHN7OoLVUbTIQz+gazYjigVZvtwCvgrZI7eW9Xo1eOXM2zw2u1DGLLUfmGkQ==} + turbo-linux-64@2.1.3: + resolution: {integrity: sha512-ubRHkI1gSel7H7wsmxKK8C9UlLWqg/2dkCC88LFupaK6TKgvBKqDqA0Z1M9C/escK0Jsle2k0H8bybV9OYIl4Q==} cpu: [x64] os: [linux] - turbo-linux-arm64@1.13.4: - resolution: {integrity: sha512-BJcXw1DDiHO/okYbaNdcWN6szjXyHWx9d460v6fCHY65G8CyqGU3y2uUTPK89o8lq/b2C8NK0yZD+Vp0f9VoIg==} + turbo-linux-arm64@2.1.3: + resolution: {integrity: sha512-LffUL+e5wv7BtD6DgnM2kKOlDkMo2eRjhbAjVnrCD3wi2ug0tl6NDzajnHHjtaMyOnIf4AvzSKdLWsBxafGBQA==} cpu: [arm64] os: [linux] - turbo-windows-64@1.13.4: - resolution: {integrity: sha512-OFFhXHOFLN7A78vD/dlVuuSSVEB3s9ZBj18Tm1hk3aW1HTWTuAw0ReN6ZNlVObZUHvGy8d57OAGGxf2bT3etQw==} + turbo-windows-64@2.1.3: + resolution: {integrity: sha512-S9SvcZZoaq5jKr6kA6eF7/xgQhVn8Vh7PVy5lono9zybvhyL4eY++y2PaLToIgL8G9IcbLmgOC73ExNjFBg9XQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@1.13.4: - resolution: {integrity: sha512-u5A+VOKHswJJmJ8o8rcilBfU5U3Y1TTAfP9wX8bFh8teYF1ghP0EhtMRLjhtp6RPa+XCxHHVA2CiC3gbh5eg5g==} + turbo-windows-arm64@2.1.3: + resolution: {integrity: sha512-twlEo8lRrGbrR6T/ZklUIquW3IlFCEtywklgVA81aIrSBm56+GEVpSrHhIlsx1hiYeSNrs+GpDwZGe+V7fvEVQ==} cpu: [arm64] os: [win32] - turbo@1.13.4: - resolution: {integrity: sha512-1q7+9UJABuBAHrcC4Sxp5lOqYS5mvxRrwa33wpIyM18hlOCpRD/fTJNxZ0vhbMcJmz15o9kkVm743mPn7p6jpQ==} + turbo@2.1.3: + resolution: {integrity: sha512-lY0yj2GH2a2a3NExZ3rGe+rHUVeFE2aXuRAue57n+08E7Z7N7YCmynju0kPC1grAQzERmoLpKrmzmWd+PNiADw==} hasBin: true type-check@0.4.0: @@ -11721,6 +11944,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.6.2: resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} @@ -12467,6 +12695,10 @@ packages: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} @@ -12489,6 +12721,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -12568,6 +12804,12 @@ packages: peerDependencies: yaml: ^2.3.0 + yaml-types@0.4.0: + resolution: {integrity: sha512-XfbA30NUg4/LWUiplMbiufUiwYhgB9jvBhTWel7XQqjV+GaB79c2tROu/8/Tu7jO0HvDvnKWtBk5ksWRrhQ/0g==} + engines: {node: '>= 16', npm: '>= 7'} + peerDependencies: + yaml: ^2.3.0 + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -16311,6 +16553,24 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.5.4)': + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 14.1.2 + '@tsconfig/node16': 16.1.3 + '@tsconfig/node18': 18.2.4 + '@tsconfig/node20': 20.1.4 + '@types/node': 20.16.9 + acorn: 8.12.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + optionalDependencies: + '@swc/core': 1.7.28(@swc/helpers@0.5.5) + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)': dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -16329,6 +16589,42 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.2.2)': + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 14.1.2 + '@tsconfig/node16': 16.1.3 + '@tsconfig/node18': 18.2.4 + '@tsconfig/node20': 20.1.4 + '@types/node': 22.7.2 + acorn: 8.12.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 + optionalDependencies: + '@swc/core': 1.7.28(@swc/helpers@0.5.5) + + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.6.2)': + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 14.1.2 + '@tsconfig/node16': 16.1.3 + '@tsconfig/node18': 18.2.4 + '@tsconfig/node20': 20.1.4 + '@types/node': 22.7.2 + acorn: 8.12.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.2 + v8-compile-cache-lib: 3.0.1 + optionalDependencies: + '@swc/core': 1.7.28(@swc/helpers@0.5.5) + '@istanbuljs/schema@0.1.3': {} '@jest/schemas@29.6.3': @@ -16582,6 +16878,8 @@ snapshots: '@npmcli/redact@1.1.0': {} + '@npmcli/redact@2.0.1': {} + '@npmcli/run-script@7.0.4': dependencies: '@npmcli/node-gyp': 3.0.0 @@ -16593,6 +16891,18 @@ snapshots: - bluebird - supports-color + '@npmcli/run-script@8.1.0': + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/package-json': 5.2.1 + '@npmcli/promise-spawn': 7.0.2 + node-gyp: 10.2.0 + proc-log: 4.2.0 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + '@open-draft/deferred-promise@2.2.0': {} '@open-draft/logger@0.3.0': @@ -17233,11 +17543,31 @@ snapshots: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) function-loop: 4.0.0 + '@tapjs/after-each@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + function-loop: 4.0.0 + + '@tapjs/after-each@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + function-loop: 4.0.0 + '@tapjs/after@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) is-actual-promise: 1.0.2 + '@tapjs/after@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + + '@tapjs/after@3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + '@tapjs/asserts@1.2.0(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -17249,16 +17579,62 @@ snapshots: - react - react-dom + '@tapjs/asserts@1.2.0(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 1.2.8 + is-actual-promise: 1.0.2 + tcompare: 6.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + + '@tapjs/asserts@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 4.0.0 + is-actual-promise: 1.0.2 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + '@tapjs/before-each@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) function-loop: 4.0.0 + '@tapjs/before-each@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + function-loop: 4.0.0 + + '@tapjs/before-each@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + function-loop: 4.0.0 + '@tapjs/before@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) is-actual-promise: 1.0.2 + '@tapjs/before@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + + '@tapjs/before@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + + '@tapjs/chdir@3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/config@2.4.19(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -17269,6 +17645,26 @@ snapshots: tap-yaml: 2.2.2 walk-up-path: 3.0.1 + '@tapjs/config@2.4.19(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/test': 1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + chalk: 5.3.0 + jackspeak: 2.3.6 + polite-json: 4.0.1 + tap-yaml: 2.2.2 + walk-up-path: 3.0.1 + + '@tapjs/config@5.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/test': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + chalk: 5.3.0 + jackspeak: 4.0.2 + polite-json: 5.0.0 + tap-yaml: 4.0.0 + walk-up-path: 4.0.0 + '@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tapjs/processinfo': 3.1.8 @@ -17290,26 +17686,104 @@ snapshots: - react - react-dom - '@tapjs/error-serdes@1.2.2': + '@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - minipass: 7.1.2 - - '@tapjs/filter@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@tapjs/processinfo': 3.1.8 + '@tapjs/stack': 1.2.8 + '@tapjs/test': 1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + async-hook-domain: 4.0.1 + diff: 5.2.0 + is-actual-promise: 1.0.2 + minipass: 7.1.2 + signal-exit: 4.1.0 + tap-parser: 15.3.2 + tap-yaml: 2.2.2 + tcompare: 6.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + + '@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/processinfo': 3.1.8 + '@tapjs/stack': 4.0.0 + '@tapjs/test': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + async-hook-domain: 4.0.1 + diff: 5.2.0 + is-actual-promise: 1.0.2 + minipass: 7.1.2 + signal-exit: 4.1.0 + tap-parser: 18.0.0 + tap-yaml: 4.0.0 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + + '@tapjs/error-serdes@1.2.2': + dependencies: + minipass: 7.1.2 + + '@tapjs/error-serdes@4.0.0': + dependencies: + minipass: 7.1.2 + + '@tapjs/filter@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/filter@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tapjs/filter@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/fixture@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) mkdirp: 3.0.1 rimraf: 5.0.10 + '@tapjs/fixture@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + mkdirp: 3.0.1 + rimraf: 5.0.10 + + '@tapjs/fixture@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + mkdirp: 3.0.1 + rimraf: 6.0.1 + '@tapjs/intercept@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tapjs/stack': 1.2.8 + '@tapjs/intercept@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 1.2.8 + + '@tapjs/intercept@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 4.0.0 + '@tapjs/mock@1.3.4(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -17318,6 +17792,22 @@ snapshots: resolve-import: 1.4.6 walk-up-path: 3.0.1 + '@tapjs/mock@1.3.4(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 1.2.8 + resolve-import: 1.4.6 + walk-up-path: 3.0.1 + + '@tapjs/mock@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 4.0.0 + resolve-import: 2.0.0 + walk-up-path: 4.0.0 + '@tapjs/node-serialize@1.3.4(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -17325,6 +17815,20 @@ snapshots: '@tapjs/stack': 1.2.8 tap-parser: 15.3.2 + '@tapjs/node-serialize@1.3.4(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/error-serdes': 1.2.2 + '@tapjs/stack': 1.2.8 + tap-parser: 15.3.2 + + '@tapjs/node-serialize@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/error-serdes': 4.0.0 + '@tapjs/stack': 4.0.0 + tap-parser: 18.0.0 + '@tapjs/processinfo@3.1.8': dependencies: pirates: 4.0.6 @@ -17356,6 +17860,54 @@ snapshots: - react-dom - utf-8-validate + '@tapjs/reporter@1.3.20(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))': + dependencies: + '@tapjs/config': 2.4.19(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 1.2.8 + chalk: 5.3.0 + ink: 4.4.1(@types/react@18.3.9)(react@18.3.1) + minipass: 7.1.2 + ms: 2.1.3 + patch-console: 2.0.0 + prismjs-terminal: 1.2.3 + react: 18.3.1 + string-length: 6.0.0 + tap-parser: 15.3.2 + tap-yaml: 2.2.2 + tcompare: 6.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@tapjs/test' + - '@types/react' + - bufferutil + - react-devtools-core + - react-dom + - utf-8-validate + + '@tapjs/reporter@4.0.1(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))': + dependencies: + '@tapjs/config': 5.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 4.0.0 + chalk: 5.3.0 + ink: 5.0.1(@types/react@18.3.9)(react@18.3.1) + minipass: 7.1.2 + ms: 2.1.3 + patch-console: 2.0.0 + prismjs-terminal: 1.2.3 + react: 18.3.1 + string-length: 6.0.0 + tap-parser: 18.0.0 + tap-yaml: 4.0.0 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@tapjs/test' + - '@types/react' + - bufferutil + - react-devtools-core + - react-dom + - utf-8-validate + '@tapjs/run@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -17398,6 +17950,92 @@ snapshots: - supports-color - utf-8-validate + '@tapjs/run@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/config': 2.4.19(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/processinfo': 3.1.8 + '@tapjs/reporter': 1.3.20(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1)) + '@tapjs/spawn': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/test': 1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + c8: 8.0.1 + chalk: 5.3.0 + chokidar: 3.6.0 + foreground-child: 3.3.0 + glob: 10.4.5 + minipass: 7.1.2 + mkdirp: 3.0.1 + opener: 1.5.2 + pacote: 17.0.7 + resolve-import: 1.4.6 + rimraf: 5.0.10 + semver: 7.6.3 + signal-exit: 4.1.0 + tap-parser: 15.3.2 + tap-yaml: 2.2.2 + tcompare: 6.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + which: 4.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - react + - react-devtools-core + - react-dom + - supports-color + - utf-8-validate + + '@tapjs/run@4.0.1(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/config': 5.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/processinfo': 3.1.8 + '@tapjs/reporter': 4.0.1(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1)) + '@tapjs/spawn': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/test': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + c8: 10.1.2 + chalk: 5.3.0 + chokidar: 3.6.0 + foreground-child: 3.3.0 + glob: 11.0.0 + minipass: 7.1.2 + mkdirp: 3.0.1 + opener: 1.5.2 + pacote: 18.0.6 + path-scurry: 2.0.0 + resolve-import: 2.0.0 + rimraf: 6.0.1 + semver: 7.6.3 + signal-exit: 4.1.0 + tap-parser: 18.0.0 + tap-yaml: 4.0.0 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + which: 4.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - monocart-coverage-reports + - react + - react-devtools-core + - react-dom + - supports-color + - utf-8-validate + '@tapjs/snapshot@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -17408,16 +18046,54 @@ snapshots: - react - react-dom + '@tapjs/snapshot@1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + tcompare: 6.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + + '@tapjs/snapshot@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + '@tapjs/spawn@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/spawn@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tapjs/spawn@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack@1.2.8': {} + '@tapjs/stack@4.0.0': {} + '@tapjs/stdin@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stdin@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tapjs/stdin@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/test@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.2.2) @@ -17453,6 +18129,79 @@ snapshots: - react - react-dom + '@tapjs/test@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.2.2) + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/after-each': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/asserts': 1.2.0(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/before': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before-each': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/filter': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/fixture': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/intercept': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/mock': 1.3.4(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/node-serialize': 1.3.4(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/snapshot': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/spawn': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/typescript': 1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(typescript@5.2.2) + '@tapjs/worker': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + glob: 10.4.5 + jackspeak: 2.3.6 + mkdirp: 3.0.1 + resolve-import: 1.4.6 + rimraf: 5.0.10 + sync-content: 1.0.2 + tap-parser: 15.3.2 + tshy: 1.18.0 + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + + '@tapjs/test@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.5.4) + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/after-each': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/asserts': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/before': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before-each': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/chdir': 3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/filter': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/fixture': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/intercept': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/mock': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/node-serialize': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/snapshot': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/spawn': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/typescript': 3.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(typescript@5.5.4) + '@tapjs/worker': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + glob: 11.0.0 + jackspeak: 4.0.2 + mkdirp: 3.0.1 + package-json-from-dist: 1.0.0 + resolve-import: 2.0.0 + rimraf: 6.0.1 + sync-content: 2.0.1 + tap-parser: 18.0.0 + tshy: 3.0.2 + typescript: 5.5.4 + walk-up-path: 4.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + '@tapjs/typescript@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(typescript@5.2.2)': dependencies: '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.2.2) @@ -17473,10 +18222,58 @@ snapshots: - '@types/node' - typescript + '@tapjs/typescript@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(typescript@5.2.2)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.2.2) + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + '@tapjs/typescript@1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(typescript@5.6.2)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.6.2) + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + '@tapjs/typescript@3.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(typescript@5.5.4)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.5.4) + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + '@tapjs/typescript@3.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(typescript@5.6.2)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + '@tapjs/worker@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/worker@1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tapjs/worker@4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tensorflow-models/universal-sentence-encoder@1.3.3(@tensorflow/tfjs-converter@3.21.0(@tensorflow/tfjs-core@3.21.0(encoding@0.1.13)))(@tensorflow/tfjs-core@3.21.0(encoding@0.1.13))': dependencies: '@tensorflow/tfjs-converter': 3.21.0(@tensorflow/tfjs-core@3.21.0(encoding@0.1.13)) @@ -18380,6 +19177,10 @@ snapshots: ansi-escapes@6.2.1: {} + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + ansi-html-community@0.0.8: {} ansi-regex@5.0.1: {} @@ -18938,6 +19739,20 @@ snapshots: bytes@3.1.2: {} + c8@10.1.2: + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.3.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.7 + test-exclude: 7.0.1 + v8-to-istanbul: 9.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + c8@7.14.0: dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -19211,6 +20026,11 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + cli-width@3.0.0: {} cli-width@4.1.0: {} @@ -20047,6 +20867,8 @@ snapshots: env-paths@2.2.1: {} + environment@1.1.0: {} + err-code@2.0.3: {} error-ex@1.3.2: @@ -22021,6 +22843,39 @@ snapshots: - bufferutil - utf-8-validate + ink@5.0.1(@types/react@18.3.9)(react@18.3.1): + dependencies: + '@alcalzone/ansi-tokenize': 0.1.3 + ansi-escapes: 7.0.0 + ansi-styles: 6.2.1 + auto-bind: 5.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + cli-cursor: 4.0.0 + cli-truncate: 4.0.0 + code-excerpt: 4.0.0 + indent-string: 5.0.0 + is-in-ci: 0.1.0 + lodash: 4.17.21 + patch-console: 2.0.0 + react: 18.3.1 + react-reconciler: 0.29.2(react@18.3.1) + scheduler: 0.23.2 + signal-exit: 3.0.7 + slice-ansi: 7.1.0 + stack-utils: 2.0.6 + string-width: 7.2.0 + type-fest: 4.26.1 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + ws: 8.18.0 + yoga-wasm-web: 0.3.3 + optionalDependencies: + '@types/react': 18.3.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + inline-style-parser@0.1.1: {} inline-style-parser@0.2.4: {} @@ -22161,6 +23016,10 @@ snapshots: is-fullwidth-code-point@4.0.0: {} + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 @@ -22173,6 +23032,8 @@ snapshots: is-hexadecimal@2.0.1: {} + is-in-ci@0.1.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -24009,6 +24870,19 @@ snapshots: transitivePeerDependencies: - supports-color + npm-registry-fetch@17.1.0: + dependencies: + '@npmcli/redact': 2.0.1 + jsonparse: 1.3.1 + make-fetch-happen: 13.0.1 + minipass: 7.1.2 + minipass-fetch: 3.0.5 + minizlib: 2.1.2 + npm-package-arg: 11.0.3 + proc-log: 4.2.0 + transitivePeerDependencies: + - supports-color + npm-run-path@2.0.2: dependencies: path-key: 2.0.1 @@ -24278,6 +25152,29 @@ snapshots: - bluebird - supports-color + pacote@18.0.6: + dependencies: + '@npmcli/git': 5.0.8 + '@npmcli/installed-package-contents': 2.1.0 + '@npmcli/package-json': 5.2.1 + '@npmcli/promise-spawn': 7.0.2 + '@npmcli/run-script': 8.1.0 + cacache: 18.0.4 + fs-minipass: 3.0.3 + minipass: 7.1.2 + npm-package-arg: 11.0.3 + npm-packlist: 8.0.2 + npm-pick-manifest: 9.1.0 + npm-registry-fetch: 17.1.0 + proc-log: 4.2.0 + promise-retry: 2.0.1 + sigstore: 2.3.1 + ssri: 10.0.6 + tar: 6.2.1 + transitivePeerDependencies: + - bluebird + - supports-color + pagefind@1.1.1: optionalDependencies: '@pagefind/darwin-arm64': 1.1.1 @@ -26464,6 +27361,11 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + slugify@1.6.6: {} smart-buffer@4.2.0: {} @@ -26893,6 +27795,11 @@ snapshots: events-to-array: 2.0.3 tap-yaml: 2.2.2 + tap-parser@18.0.0: + dependencies: + events-to-array: 2.0.3 + tap-yaml: 4.0.0 + tap-yaml@1.0.2: dependencies: yaml: 1.10.2 @@ -26902,6 +27809,11 @@ snapshots: yaml: 2.5.1 yaml-types: 0.3.0(yaml@2.5.1) + tap-yaml@4.0.0: + dependencies: + yaml: 2.5.1 + yaml-types: 0.4.0(yaml@2.5.1) + tap@18.8.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2): dependencies: '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -26937,6 +27849,78 @@ snapshots: - typescript - utf-8-validate + tap@18.8.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2): + dependencies: + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/after-each': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/asserts': 1.2.0(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/before': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before-each': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/filter': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/fixture': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/intercept': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/mock': 1.3.4(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/node-serialize': 1.3.4(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/run': 1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/snapshot': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/spawn': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/test': 1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/typescript': 1.4.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.7.2)(typescript@5.6.2) + '@tapjs/worker': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + resolve-import: 1.4.6 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - react + - react-devtools-core + - react-dom + - supports-color + - typescript + - utf-8-validate + + tap@21.0.1(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2): + dependencies: + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/after-each': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/asserts': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/before': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before-each': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/chdir': 3.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/filter': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/fixture': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/intercept': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/mock': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/node-serialize': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/run': 4.0.1(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/snapshot': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/spawn': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/test': 4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/typescript': 3.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.16.9)(typescript@5.6.2) + '@tapjs/worker': 4.0.0(@tapjs/core@4.0.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + resolve-import: 2.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - monocart-coverage-reports + - react + - react-devtools-core + - react-dom + - supports-color + - typescript + - utf-8-validate + tapable@1.1.3: {} tapable@2.2.1: {} @@ -26983,6 +27967,14 @@ snapshots: - react - react-dom + tcompare@9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + diff: 5.2.0 + react-element-to-jsx-string: 15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-dom + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -27007,6 +27999,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + text-table@0.2.0: {} thenify-all@1.6.0: @@ -27239,6 +28237,30 @@ snapshots: - supports-color - ts-node + tsup@7.3.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.6.2))(typescript@5.6.2): + dependencies: + bundle-require: 4.2.1(esbuild@0.19.12) + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.3.7 + esbuild: 0.19.12 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.2)(typescript@5.6.2)) + resolve-from: 5.0.0 + rollup: 4.22.4 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + optionalDependencies: + '@swc/core': 1.7.28(@swc/helpers@0.5.5) + postcss: 8.4.47 + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + - ts-node + tsutils@3.21.0(typescript@5.6.2): dependencies: tslib: 1.14.1 @@ -27267,32 +28289,32 @@ snapshots: transitivePeerDependencies: - supports-color - turbo-darwin-64@1.13.4: + turbo-darwin-64@2.1.3: optional: true - turbo-darwin-arm64@1.13.4: + turbo-darwin-arm64@2.1.3: optional: true - turbo-linux-64@1.13.4: + turbo-linux-64@2.1.3: optional: true - turbo-linux-arm64@1.13.4: + turbo-linux-arm64@2.1.3: optional: true - turbo-windows-64@1.13.4: + turbo-windows-64@2.1.3: optional: true - turbo-windows-arm64@1.13.4: + turbo-windows-arm64@2.1.3: optional: true - turbo@1.13.4: + turbo@2.1.3: optionalDependencies: - turbo-darwin-64: 1.13.4 - turbo-darwin-arm64: 1.13.4 - turbo-linux-64: 1.13.4 - turbo-linux-arm64: 1.13.4 - turbo-windows-64: 1.13.4 - turbo-windows-arm64: 1.13.4 + turbo-darwin-64: 2.1.3 + turbo-darwin-arm64: 2.1.3 + turbo-linux-64: 2.1.3 + turbo-linux-arm64: 2.1.3 + turbo-windows-64: 2.1.3 + turbo-windows-arm64: 2.1.3 type-check@0.4.0: dependencies: @@ -27373,6 +28395,8 @@ snapshots: typescript@5.2.2: {} + typescript@5.5.4: {} + typescript@5.6.2: {} ua-parser-js@1.0.39: {} @@ -28266,6 +29290,10 @@ snapshots: dependencies: string-width: 5.1.2 + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + wildcard@2.0.1: {} word-wrap@1.2.5: {} @@ -28290,6 +29318,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@3.0.3: @@ -28346,6 +29380,10 @@ snapshots: dependencies: yaml: 2.5.1 + yaml-types@0.4.0(yaml@2.5.1): + dependencies: + yaml: 2.5.1 + yaml@1.10.2: {} yaml@2.2.2: {} diff --git a/turbo.json b/turbo.json index 0d79fda20..33cc9fe89 100644 --- a/turbo.json +++ b/turbo.json @@ -1,6 +1,6 @@ { "$schema": "https://turbo.build/schema.json", - "pipeline": { + "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"]