diff --git a/packages/orama/src/components/index.ts b/packages/orama/src/components/index.ts index 77878f87..108c4025 100644 --- a/packages/orama/src/components/index.ts +++ b/packages/orama/src/components/index.ts @@ -287,7 +287,7 @@ export function insert( } } -function insertVector(index: Index, prop: string, value: number[] | VectorType, id: DocumentID): void { +export function insertVector(index: AnyIndexStore, prop: string, value: number[] | VectorType, id: DocumentID): void { if (!(value instanceof Float32Array)) { value = new Float32Array(value) } diff --git a/packages/orama/src/trees.ts b/packages/orama/src/trees.ts index 81a2c206..9de8b05f 100644 --- a/packages/orama/src/trees.ts +++ b/packages/orama/src/trees.ts @@ -3,3 +3,4 @@ export * as avl from './trees/avl.js' export * as zip from './trees/zip.js' export * as bkd from './trees/bkd.js' export * as flat from './trees/flat.js' +export * as bool from './trees/bool.js' diff --git a/packages/plugin-qps/LICENSE.md b/packages/plugin-qps/LICENSE.md new file mode 100644 index 00000000..1b02b293 --- /dev/null +++ b/packages/plugin-qps/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2024 OramaSearch Inc + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/plugin-qps/README.md b/packages/plugin-qps/README.md new file mode 100644 index 00000000..773d1894 --- /dev/null +++ b/packages/plugin-qps/README.md @@ -0,0 +1,96 @@ +# Orama Plugin Embeddings + +**Orama Plugin Embeddings** allows you to generate fast text embeddings at insert and search time offline, directly on your machine - no OpenAI needed! + +## Installation + +To get started with **Orama Plugin Embeddings**, just install it with npm: + +```sh +npm i @orama/plugin-embeddings +``` + +**Important note**: to use this plugin, you'll also need to install one of the following TensorflowJS backend: + +- `@tensorflow/tfjs` +- `@tensorflow/tfjs-node` +- `@tensorflow/tfjs-backend-webgl` +- `@tensorflow/tfjs-backend-cpu` +- `@tensorflow/tfjs-node-gpu` +- `@tensorflow/tfjs-backend-wasm` + +For example, if you're running Orama on the browser, we highly recommend using `@tensorflow/tfjs-backend-webgl`: + +```sh +npm i @tensorflow/tfjs-backend-webgl +``` + +If you're using Orama in Node.js, we recommend using `@tensorflow/tfjs-node`: + +```sh +npm i @tensorflow/tfjs-node +``` + +## Usage + +```js +import { create } from '@orama/orama' +import { pluginEmbeddings } from '@orama/plugin-embeddings' +import '@tensorflow/tfjs-node' // Or any other appropriate TensorflowJS backend + +const plugin = await pluginEmbeddings({ + embeddings: { + defaultProperty: 'embeddings', // Property used to store generated embeddings + onInsert: { + generate: true, // Generate embeddings at insert-time + properties: ['description'], // properties to use for generating embeddings at insert time + verbose: true, + } + } +}) + +const db = await create({ + schema: { + description: 'string', + embeddings: 'vector[512]' // Orama generates 512-dimensions vectors + }, + plugins: [plugin] +}) +``` + +Example usage at insert time: + +```js +await insert(db, { + description: 'Classroom Headphones Bulk 5 Pack, Student On Ear Color Varieties' +}) + +await insert(db, { + description: 'Kids Wired Headphones for School Students K-12' +}) + +await insert(db, { + description: 'Kids Headphones Bulk 5-Pack for K-12 School' +}) + +await insert(db, { + description: 'Bose QuietComfort Bluetooth Headphones' +}) +``` + +Orama will automatically generate text embeddings and store them into the `embeddings` property. + +Then, you can use the `vector` or `hybrid` setting to perform hybrid or vector search at runtime: + +```js +await search(db, { + term: 'Headphones for 12th grade students', + mode: 'vector' +}) +``` + +Orama will generate embeddings at search time and perform vector or hybrid search for you. + +# License + +[Apache 2.0](/LICENSE.md) \ No newline at end of file diff --git a/packages/plugin-qps/package.json b/packages/plugin-qps/package.json new file mode 100644 index 00000000..eec3af50 --- /dev/null +++ b/packages/plugin-qps/package.json @@ -0,0 +1,53 @@ +{ + "name": "@orama/plugin-qps", + "version": "3.0.0-rc-2", + "description": "Performant search algorithm optimized for descriptive texts", + "keywords": [ + "orama", + "embeddings", + "secure proxy", + "vector search" + ], + "license": "Apache-2.0", + "main": "./dist/index.js", + "type": "module", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "browser": "./dist/index.global.js" + } + }, + "bugs": { + "url": "https://github.com/askorama/orama/issues" + }, + "homepage": "https://github.com/askorama/orama#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/askorama/orama.git" + }, + "sideEffects": false, + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsup --config tsup.lib.js", + "lint": "exit 0", + "test": "exit 0" + }, + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@types/node": "^20.9.0", + "tap": "^21.0.1", + "tsup": "^7.2.0", + "tsx": "^4.19.1", + "typescript": "^5.0.0" + }, + "dependencies": { + "@orama/orama": "workspace:*" + } +} diff --git a/packages/plugin-qps/src/index.ts b/packages/plugin-qps/src/index.ts new file mode 100644 index 00000000..10781bee --- /dev/null +++ b/packages/plugin-qps/src/index.ts @@ -0,0 +1,140 @@ +import type { create, AnyOrama, SearchableType, IIndex, AnyIndexStore, VectorIndex, AnySchema, SearchableValue, Tokenizer } from '@orama/orama' +import { + getVectorSize, index as Index, internalDocumentIDStore, isVectorType } from '@orama/orama/components' +import { avl, bkd, flat, radix, bool } from '@orama/orama/trees' + +type InternalDocumentID = internalDocumentIDStore.InternalDocumentID; + +type CreateParams = Parameters>>[0] +type Component = NonNullable +type IndexParameter = NonNullable + + +export type Tree = + | Index.TTree<'Radix', radix.RadixNode> + | Index.TTree<'AVL', avl.AVLTree> + | Index.TTree<'Bool', bool.BoolNode> + | Index.TTree<'Flat', flat.FlatTree> + | Index.TTree<'BKD', bkd.BKDTree> + +export interface QPSIndex extends AnyIndexStore { + indexes: Record + vectorIndexes: Record + searchableProperties: string[] + searchablePropertiesWithTypes: Record +} + +function recursiveCreate(indexDatastore: QPSIndex, schema: T['schema'], prefix: string) { + for (const [prop, type] of Object.entries(schema)) { + const path = `${prefix}${prefix ? '.' : ''}${prop}` + + if (typeof type === 'object' && !Array.isArray(type)) { + // Nested + recursiveCreate(indexDatastore, type, path) + continue + } + + if (isVectorType(type)) { + indexDatastore.searchableProperties.push(path) + indexDatastore.searchablePropertiesWithTypes[path] = type + indexDatastore.vectorIndexes[path] = { + size: getVectorSize(type), + vectors: {} + } + } else { + const isArray = /\[/.test(type as string) + switch (type) { + case 'boolean': + case 'boolean[]': + indexDatastore.indexes[path] = { type: 'Bool', node: new bool.BoolNode(), isArray } + break + case 'number': + case 'number[]': + indexDatastore.indexes[path] = { type: 'AVL', node: new avl.AVLTree(0, []), isArray } + break + case 'string': + case 'string[]': + indexDatastore.indexes[path] = { type: 'Radix', node: new radix.RadixTree(), isArray } + // indexDatastore.avgFieldLength[path] = 0 + // indexDatastore.frequencies[path] = {} + // indexDatastore.tokenOccurrences[path] = {} + // indexDatastore.fieldLengths[path] = {} + break + case 'enum': + case 'enum[]': + indexDatastore.indexes[path] = { type: 'Flat', node: new flat.FlatTree(), isArray } + break + case 'geopoint': + indexDatastore.indexes[path] = { type: 'BKD', node: new bkd.BKDTree(), isArray } + break + default: + throw new Error('INVALID_SCHEMA_TYPE: ' + path) + } + + indexDatastore.searchableProperties.push(path) + indexDatastore.searchablePropertiesWithTypes[path] = type + } + } +} + +export function qpsComponents(): { + index: IndexParameter, +} { + + return { + index: { + create: function create(orama: T, sharedInternalDocumentStore: T['internalDocumentIDStore'], schema: T['schema']) { + const indexDatastore: QPSIndex = { + indexes: {}, + vectorIndexes: {}, + searchableProperties: [], + searchablePropertiesWithTypes: {}, + } + + recursiveCreate(indexDatastore, schema, '') + + return indexDatastore + }, + insert: function insert( + implementation: IIndex, + indexDatastorage: QPSIndex, + prop: string, + id: DocumentID, + internalId: InternalDocumentID, + value: SearchableValue, + schemaType: SearchableType, + language: string | undefined, + tokenizer: Tokenizer, + docsCount: number + ) { + if (isVectorType(schemaType)) { + return Index.insertVector(indexDatastorage, prop, value as number[] | Float32Array, id) + } + + const insertScalar = insertScalarBuilder(implementation, index, prop, internalId, language, tokenizer, docsCount, options) + + if (!isArrayType(schemaType)) { + return insertScalar(value) + } + + const elements = value as Array + const elementsLength = elements.length + for (let i = 0; i < elementsLength; i++) { + insertScalar(elements[i]) + } + }, + remove: Index.remove, + insertDocumentScoreParameters: Index.insertDocumentScoreParameters, + insertTokenScoreParameters: Index.insertTokenScoreParameters, + removeDocumentScoreParameters: Index.removeDocumentScoreParameters, + removeTokenScoreParameters: Index.removeTokenScoreParameters, + calculateResultScores: Index.calculateResultScores, + search: Index.search, + searchByWhereClause: Index.searchByWhereClause, + getSearchableProperties: Index.getSearchableProperties, + getSearchablePropertiesWithTypes: Index.getSearchablePropertiesWithTypes, + load: Index.load, + save: Index.save + } + } +} diff --git a/packages/plugin-qps/tests/index.test.ts b/packages/plugin-qps/tests/index.test.ts new file mode 100644 index 00000000..6a38187a --- /dev/null +++ b/packages/plugin-qps/tests/index.test.ts @@ -0,0 +1,25 @@ +import t from 'tap' +import { create, insertMultiple, search } from '@orama/orama' + +t.test('plugin-qps', async t => { + const db = create({ + schema: { + name: 'string', + age: 'number', + isCool: 'boolean', + algo: 'string[]', + preferredNumbers: 'number[]', + } as const + }) + + insertMultiple(db, [ + { name: 'foo', age: 33, isCool: true, algo: ['algo1', 'algo2'], preferredNumbers: [20] }, + { name: 'bar', age: 32, isCool: true, algo: ['algo3'], preferredNumbers: [55] }, + { name: 'baz', age: 22, isCool: false, algo: ['algo4'], preferredNumbers: [22] } + ]) + + const result = search(db, { + term: 'b' + }) + console.log(result) +}) \ No newline at end of file diff --git a/packages/plugin-qps/tests/quality.test.ts b/packages/plugin-qps/tests/quality.test.ts new file mode 100644 index 00000000..fb5da991 --- /dev/null +++ b/packages/plugin-qps/tests/quality.test.ts @@ -0,0 +1,401 @@ +import t from 'tap' +import { AnyOrama, create, insertMultiple, search } from '@orama/orama' +import { bitmask_20, calculateTokenQuantum, count, numberOfOnes } from '../src/trees/radix.js' + +async function createNew(docs: { description: string }[]) { + const db = await create({ + schema: { + description: 'string' + } as const, + components: { + tokenizer: { + stopWords: ['the', 'is', 'on', 'under'] + } + } + }) + await insertMultiple( + db, + docs.map(d => ({ ...d })) + ) + return db +} +async function searchNew(db: AnyOrama, { term }: { term: string }) { + const searchResult = await search(db, { + mode: 'fulltext', + term + }) + return searchResult.hits +} + +t.test('order of the results', async (t) => { + const docs = [ + { id: '0', description: 'The pen is on the table. The cat is under the table. The dog is near the table' }, + { id: '1', description: 'The pen is on the table' }, + { id: '2', description: 'The cat is under the table' }, + { id: '3', description: 'The dog is near the table' } + ] + const s = await createNew(docs) + + t.test('if the document more words, it should be the first result', async (t) => { + const results = await searchNew(s, { + term: 'table' + }) + + t.equal(results.length, 4) + t.equal(results[0].id, '0') + const score = results[0].score + + for (let i = 1; i < results.length; i++) { + t.ok(results[i].score < score, 'Score should be less than the first result') + } + }) + + t.test('every doc permutation has the correct order', async (t) => { + const docs = permutator([ + { id: '0', description: 'The pen is on the table. The cat is under the table. The dog is near the table' }, + { id: '1', description: 'The pen is on the table' }, + { id: '2', description: 'The cat is under the table' }, + { id: '3', description: 'The dog is near the table' } + ]) + for (const d of docs) { + const s = await createNew(d) + const results = await searchNew(s, { + term: 'table' + }) + + t.equal(results.length, 4) + t.equal(results[0].id, '0') + const score = results[0].score + + for (let i = 1; i < results.length; i++) { + t.ok(results[i].score < score, 'Score should be less than the first result') + } + } + }) + + t.test('multiple words increments score', async (t) => { + const results = await searchNew(s, { + term: 'table pen' + }) + t.equal(results.length, 4) + t.equal(results[0].id, '0') + const score = results[0].score + + for (let i = 1; i < results.length; i++) { + t.ok(results[i].score < score, 'Score should be less than the first result') + } + + const score2 = results[1].score + for (let i = 2; i < results.length; i++) { + t.ok(results[i].score < score2, 'Score should be less than the second result') + } + }) + + t.test('same matches + same length, same score', async (t) => { + const results = await searchNew(s, { + term: 'table pen cat' + }) + t.equal(results.length, 4) + t.equal(results[0].id, '0') + t.equal(results[1].id, '1') + t.equal(results[2].id, '2') + t.equal(results[3].id, '3') + t.equal(results[1].score, results[2].score) + }) + + t.test('shorter, more score', async (t) => { + const results = await searchNew(s, { + term: 'table pen dog' + }) + t.equal(results.length, 4) + t.equal(results[0].id, '0') + t.equal(results[1].id, '1') + t.equal(results[2].id, '3') + t.equal(results[3].id, '2') + }) + + t.test('matching word score is higher than prefixed word', async (t) => { + const docs = [ + { id: '0', description: 'table' }, + { id: '1', description: 'tab' } + ] + const s = await createNew(docs) + + const results = await searchNew(s, { + term: 'tab' + }) + t.equal(results[0].id, '1') + t.equal(results[1].id, '0') + t.ok(results[1].score < results[0].score) + }) + + t.test("prefix score doesn't depend on matched word lenght", async (t) => { + const docs = [{ description: 'table' }, { description: 'tab' }] + const s = await createNew(docs) + + const results = await searchNew(s, { + term: 't' + }) + t.equal(results[0].score, results[1].score) + }) +}) + +t.test('calculateTokenQuantum', async t => { + let n = 0 + n = calculateTokenQuantum(n, 0) + t.equal(n, 1 + (1 << 20), 'set the 0th bit and the 20th bit') + n = calculateTokenQuantum(n, 0) + t.equal(n, 1 + (2 << 20), 'increment the counter') + n = calculateTokenQuantum(n, 1) + t.equal(n, 3 + (3 << 20), ' 1 + 2 + (3 count)') + n = calculateTokenQuantum(n, 2) + t.equal(n, 7 + (4 << 20), ' 1 + 2 + 4 + (4 count)') + + t.equal(bitmask_20(n), 7) + t.equal(count(n), 4) +}) + +t.test('numberOfOnes', async t => { + t.equal(0, numberOfOnes(0)) + t.equal(1, numberOfOnes(1)) + t.equal(1, numberOfOnes(2)) + t.equal(2, numberOfOnes(3)) + t.equal(1, numberOfOnes(4)) + t.equal(2, numberOfOnes(5)) + t.equal(2, numberOfOnes(6)) + t.equal(3, numberOfOnes(7)) + t.equal(1, numberOfOnes(8)) +}) + +t.test('matching criteria', async t => { + const docs = [ + { id: '0', description: 'Find your way!' }, + ] + const s = await createNew(docs) + + t.test('no match', async t => { + const results = await searchNew(s, { + term: 'unknown words' + }) + t.equal(results.length, 0) + }) + + t.test('match', async t => { + const results = await searchNew(s, { + term: 'way' + }) + t.equal(results.length, 1) + t.equal(results[0].id, '0') + }) + + t.test('match with 2 words', async t => { + const results = await searchNew(s, { + term: 'way find' + }) + t.equal(results.length, 1) + t.equal(results[0].id, '0') + }) + + t.test('the order of the words doesn\'t matter', async t => { + const results1 = await searchNew(s, { + term: 'way find' + }) + t.equal(results1.length, 1) + t.equal(results1[0].id, '0') + const score = results1[0].score + + const results2 = await searchNew(s, { + term: 'way find' + }) + t.equal(results2.length, 1) + t.equal(results2[0].id, '0') + + t.equal(results2[0].score, score) + }) + + t.test('empty string', async t => { + const results = await searchNew(s, { + term: '' + }) + t.equal(results.length, 1) + t.equal(results[0].id, '0') + t.equal(results[0].score, 0) + }) + + t.test('prefix', async t => { + const results = await searchNew(s, { + term: 'w' + }) + t.equal(results.length, 1) + t.equal(results[0].id, '0') + }) +}) + +t.test('long text', async t => { + const docs = [ + { id: '0', description: 'The pen is on the table. '.repeat(100) }, + { id: '1', description: 'The pen is on the table' }, + ] + const s = await createNew(docs) + + const results = await searchNew(s, { + term: 'table' + }) + t.equal(results.length, 2) + t.equal(results[0].id, '0') + t.equal(results[1].id, '1') + t.ok(results[0].score > results[1].score) +}) + +t.test('test', async t => { + const docs = [ + { id: '0', description: 'FLEXIBLE COMFORT.On your marks! The Nike Flex Plus is built for kiddos who want to move all day. With a flexible feel, supersoft cushioning and an easy slip-on design (no laces needed!), these running-inspired shoes are ready to zoom with little feet learning to crawl and walk.360 ComfortSupersoft foam cushioning feels plush with every move.Easy to WearThe slip-on design with 2 pull tabs gets little feet in easily. A stretchy strap with leather on the sides creates a secure feel.Super FlexibleFlexibility grooves under the forefoot help make every growing step feel natural.More BenefitsMesh fabric adds breathability where little feet need it.Reinforced toe tip brings extra durability for kids who drag their toes.Product DetailsNot intended for use as Personal Protective Equipment (PPE)Shown: Game Royal/Midnight Navy/White/Yellow OchreStyle: CW7430-405' }, + { id: '1', description: 'no matter the distance. Easy, adjustable cuffs help you slide these on and off after your warmup or run.BenefitsNike Dri-FIT technology moves sweat away from your skin for quicker evaporation, helping you stay dry and comfortable.Soft knit fabric is lightweight and breathable.Zippered pockets help keep your things secure.Bungee cords at the hem make it easier to change them over your running shoes.Nike Track Club silicone oval logo is inspired by the shape of a track.Product DetailsElastic waistband with a drawcord100% polyesterMachine washImportedShown: Midnight Navy/Summit White/Summit WhiteStyle: FB5503-410' }, + { id: '2', description: 'A NEW GENERATION OF MAX.Nodding to '90s style, the Nike Air Max Axis honors the past while looking to the future. Subtle design lines and branding pay homage to icons like the Air Max 97 and 98, while sleek no-sew skins, airy mesh and its unique heel design keep your look fresh. Of course, Max Air cushions your journey.BenefitsOriginally designed for performance running, the visible Max Air unit provides lasting comfort.The design lines and details nod to the iconic '90s running shoes you lovesuddenly they could see it. Since then, next-generation Air Max shoes have become a hit with athletes and collectors by offering striking color combinations and reliable, lightweight cushioning.'} + ] + const s = await createNew(docs) + + const results = await searchNew(s, { + term: 'running shoes' + }) + + t.equal(results.length, 3) + // The 3° document has the most matches because it: + // - contains running + // - contains shoes twice + // - contains running shoes in the same sentence + t.equal(results[0].id, '2') + // The 2° document is the second because it: + // - contains running + // - contains shoes but only one + // - contains running shoes in the same sentence + t.equal(results[1].id, '1') + // The 1° document is the last because it: + // - not contain running (it contains "running-inspired" but it's not the same in this case) + // - contains shoes + t.equal(results[2].id, '0') +}) + +t.test('test #2', async t => { + const texts = [ + // 0 + "The sun was setting behind the mountains, casting a golden hue over the landscape. Birds chirped as they flew across the sky, their silhouettes blending with the clouds. The air was cool and crisp, filled with the scent of pine trees.", + "She opened the old book, its pages yellowed with time. The words inside told a story of adventure, of brave heroes and distant lands. As she read, the room around her seemed to fade away.", + "The city buzzed with energy as people hurried along the streets. Tall buildings towered over them, casting long shadows. A street vendor called out, selling fresh fruit to passersby, while car horns blared in the distance.", + "On a quiet night, the stars twinkled brightly in the clear sky. A gentle breeze rustled the leaves, and the sound of crickets filled the air. It was a peaceful moment, one that seemed to stretch on forever.", + "The ocean waves crashed against the shore, their rhythm steady and unchanging. Seagulls circled overhead, calling out to one another. A lone figure stood at the water's edge, watching the horizon with a sense of calm.", + // 5 + "In the heart of the forest, the trees stood tall and proud. Sunlight filtered through the leaves, casting dappled shadows on the ground. A deer cautiously stepped out into a clearing, its ears twitching as it listened for danger.", + "The train pulled into the station with a loud screech. Passengers hurried to board, their footsteps echoing on the platform. Inside the train, the seats were worn but comfortable, and the soft hum of the engine filled the air.", + "The storm raged outside, lightning flashing across the sky. Rain pounded against the windows, and the wind howled through the trees. Inside, the fire crackled in the fireplace, offering warmth and light against the storm’s fury.", + "The classroom was filled with the sound of pencils scratching on paper. Students sat at their desks, focused on their assignments. The teacher moved quietly between the rows, offering guidance and encouragement.", + // 9 + "At the edge of the desert, the sand dunes stretched as far as the eye could see. The heat was intense, and the sun beat down relentlessly. In the distance, a caravan made its way slowly across the barren landscape." + ] + const docs = texts.map((text, i) => ({ id: i.toString(), description: text })) + const s = await createNew(docs) + + await t.test('"sun"', async t => { + const results = await searchNew(s, { + term: 'sun' + }) + + // only 3 documents contain the word "sun" + t.equal(results.length, 3) + // This contains the word "sun". + t.equal(results[0].id, '9') + // Also this, but the text is more length, so it has less score. + t.equal(results[1].id, '0') + // This contains the word "Sunlight", so it match as prefix and not as a word. + t.equal(results[2].id, '5') + }) + + await t.test("stormy night", async t => { + const results = await searchNew(s, { + term: 'storm night' + }) + + t.equal(results.length, 2) + // This mention the storm twice + t.equal(results[0].id, '7') + // this mention night only once + t.equal(results[1].id, '3') + // For this reason, the first document has more score + t.ok(results[0].score > results[1].score) + }) + + await t.test('trees casting sun', async t => { + const results = await searchNew(s, { + term: 'trees casting sun' + }) + + t.equal(results.length, 5) + + // This contains the word "sun" and "trees" and "casting" + // Also, "sun" & "casting" are in the same sentence. + t.equal(results[0].id, '0') + + // This contains "trees" and "sun" ("Sunlight") also "casting" but not in the same sentence. + // This score is high because "Sunlight" (so "sun") and "casting" are in the same sentence. + t.equal(results[1].id, '5') + + // This contains only "trees" + t.equal(results[2].id, '7') + + // This contains only "sun". + // This score is less (compared to the previous one) because the sentences are longer. + t.equal(results[3].id, '9') + + // This contains only "casting" + // Again, the score is less because the sentences are longer. + t.equal(results[4].id, '2') + }) + + await t.test('the sound of pencils scratching on paper', async t => { + const results = await searchNew(s, { + term: 'the sound of pencils scratching on paper' + }) + + t.equal(results.length, 9) + + // This contains a lot of word in the same sentence. + t.equal(results[0].id, '8') + // This contains 2 words in the same sentence. + t.equal(results[1].id, '3') + + // The remaining documents contain only "of" word. + t.equal(results[2].id, '6') + t.equal(results[3].id, '1') + t.equal(results[4].id, '4') + t.equal(results[5].id, '9') + t.equal(results[6].id, '5') + t.equal(results[7].id, '0') + + // This contains "of" in term of "offering", so it has less score. + t.equal(results[8].id, '7') + }) +}) + + + + + +function permutator(inputArr: T[]): T[][] { + const result: T[][] = [] + + const permute = (arr, m = []) => { + if (arr.length === 0) { + result.push(m) + } else { + for (let i = 0; i < arr.length; i++) { + const curr = arr.slice() + const next = curr.splice(i, 1) + permute(curr.slice(), m.concat(next)) + } + } + } + + permute(inputArr) + + return result +} diff --git a/packages/plugin-qps/tsconfig.json b/packages/plugin-qps/tsconfig.json new file mode 100644 index 00000000..c8726d97 --- /dev/null +++ b/packages/plugin-qps/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "allowJs": true, + "target": "ES5", + "module": "NodeNext", + "outDir": "dist", + "jsx": "react", + "noImplicitAny": false, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "esModuleInterop": true, + "declaration": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "sourceMap": true, + "moduleResolution": "nodenext" + }, + "include": ["src/*.ts", "src/**/*.ts", "src/*.tsx", "src/**/*.tsx"] +} diff --git a/packages/plugin-qps/tsup.lib.js b/packages/plugin-qps/tsup.lib.js new file mode 100644 index 00000000..a78a3f79 --- /dev/null +++ b/packages/plugin-qps/tsup.lib.js @@ -0,0 +1,17 @@ +import { defineConfig } from 'tsup' + +const entry = new URL('src/index.ts', import.meta.url).pathname +const outDir = new URL('dist', import.meta.url).pathname + +export default defineConfig({ + entry: [entry], + splitting: false, + sourcemap: true, + minify: true, + format: ['cjs', 'esm', 'iife'], + globalName: 'pluginEmbeddings', + dts: true, + clean: true, + bundle: true, + outDir +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c0aa1da..2021e347 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -703,6 +703,28 @@ importers: specifier: ^5.0.0 version: 5.6.2 + packages/plugin-qps: + dependencies: + '@orama/orama': + specifier: workspace:* + version: link:../orama + devDependencies: + '@types/node': + specifier: ^20.9.0 + version: 20.16.9 + tap: + 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) + 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) + tsx: + specifier: ^4.19.1 + version: 4.19.1 + typescript: + specifier: ^5.0.0 + version: 5.6.2 + packages/plugin-secure-proxy: dependencies: '@oramacloud/client': @@ -18356,11 +18378,6 @@ 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) @@ -18371,11 +18388,6 @@ 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) 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) @@ -18392,17 +18404,6 @@ 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) @@ -18419,11 +18420,6 @@ 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/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) @@ -18434,11 +18430,6 @@ 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) 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) @@ -18458,16 +18449,6 @@ 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) @@ -18503,7 +18484,7 @@ snapshots: dependencies: '@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) + '@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@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 @@ -18553,10 +18534,6 @@ snapshots: 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) @@ -18567,12 +18544,6 @@ snapshots: 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) @@ -18585,12 +18556,6 @@ 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) '@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)) @@ -18605,14 +18570,6 @@ 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)) @@ -18628,13 +18585,6 @@ 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) @@ -18673,30 +18623,6 @@ 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)) @@ -18763,17 +18689,17 @@ 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)': + '@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@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/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/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)) + '@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)) + '@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/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) + '@tapjs/reporter': 1.3.20(@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))(@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@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@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@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 @@ -18859,16 +18785,6 @@ 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) @@ -18883,10 +18799,6 @@ snapshots: 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) @@ -18899,10 +18811,6 @@ snapshots: 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) @@ -18942,25 +18850,25 @@ 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)': + '@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@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)) + '@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/after-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)) + '@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) + '@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)) + '@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)) + '@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@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)) + '@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)) + '@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)) + '@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)) + '@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) + '@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)) + '@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)) + '@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@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@20.16.9)(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 @@ -19035,20 +18943,20 @@ 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)': + '@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@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) + '@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) 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)': + '@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@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) + '@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) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -19079,10 +18987,6 @@ snapshots: 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) @@ -28972,24 +28876,24 @@ snapshots: 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/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/after-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)) + '@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) + '@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)) + '@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)) '@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)) + '@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/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)) + '@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)) + '@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)) + '@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)) + '@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@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@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': 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/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)) + '@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@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@20.16.9)(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@20.16.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) resolve-import: 1.4.6 transitivePeerDependencies: - '@swc/core'