diff --git a/apps/jest.config.js b/apps/jest.config.js new file mode 100644 index 0000000..afa4723 --- /dev/null +++ b/apps/jest.config.js @@ -0,0 +1,7 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} **/ +export default { + testEnvironment: "node", + transform: { + "^.+.tsx?$": ["ts-jest",{}], + }, +}; \ No newline at end of file diff --git a/apps/package.json b/apps/package.json index 90b1322..82f8465 100644 --- a/apps/package.json +++ b/apps/package.json @@ -23,6 +23,8 @@ }, "packageManager": "yarn@4.3.1", "devDependencies": { - "@types/uuid": "^10" + "@types/uuid": "^10", + "jest": "^29.7.0", + "ts-jest": "^29.2.5" } } diff --git a/apps/src/metabase/helpers/DOMToState.ts b/apps/src/metabase/helpers/DOMToState.ts index 5871da7..e28bb22 100644 --- a/apps/src/metabase/helpers/DOMToState.ts +++ b/apps/src/metabase/helpers/DOMToState.ts @@ -5,7 +5,6 @@ import { isDashboardPage } from './dashboard/util'; import { DashboardInfo } from './dashboard/types'; import { getDashboardAppState } from './dashboard/appState'; import { visualizationSettings, Card, ParameterValues, FormattedTable } from './types'; -import { getTablesFromSql } from './parseSql'; const { getMetabaseState, queryURL } = RPCs; interface ExtractedDataBase { @@ -71,7 +70,6 @@ export async function convertDOMtoStateSQLQuery() { const vizType = await getMetabaseState('qb.card.display') as string const visualizationSettings = await getMetabaseState('qb.card.visualization_settings') as visualizationSettings const sqlVariables = await getSqlVariables(); - const tablesFromSql = getTablesFromSql(sqlQuery); const metabaseAppStateSQLEditor: MetabaseAppStateSQLEditor = { availableDatabases, selectedDatabaseInfo, diff --git a/apps/src/metabase/helpers/getDatabaseSchema.ts b/apps/src/metabase/helpers/getDatabaseSchema.ts index 62cde3d..232fdbc 100644 --- a/apps/src/metabase/helpers/getDatabaseSchema.ts +++ b/apps/src/metabase/helpers/getDatabaseSchema.ts @@ -1,6 +1,6 @@ import { memoize, RPCs } from 'web' import { FormattedTable } from './types'; -import { getTablesFromSql } from './parseSql'; +import { getTablesFromSqlRegex } from './parseSql'; import _ from 'lodash'; const { getMetabaseState, fetchData } = RPCs; @@ -155,21 +155,31 @@ export const getRelevantTablesForSelectedDb = async (sql: string): Promise tableInfo.name === table.table && tableInfo.schema === table.schema); + for (const tableInfo of tablesFromSql) { + // if schema is empty, assume its public + let {table, schema} = tableInfo; + if (schema === '' || schema === undefined) { + schema = 'public'; + } + // lowercase everything + table = table.toLowerCase(); + schema = schema.toLowerCase(); + // check if its already there in top200. if so don't do anything. again lowercase everything + const relevantTable = top200.find(tableInfo => tableInfo.name.toLowerCase() === table && tableInfo.schema.toLowerCase() === schema); if (!relevantTable) { // check if there in allTables. if so, add it to top200 - const relevantTable = allTables.find(tableInfo => tableInfo.name === table.table && tableInfo.schema === table.schema); + const relevantTable = allTables.find(tableInfo => tableInfo.name.toLowerCase() === table && tableInfo.schema.toLowerCase() === schema); if (relevantTable) { // insert at beginning top200.unshift(relevantTable); } } } + // dedupe (by schema.name) + top200 = _.uniqBy(top200, (tableInfo) => `${tableInfo.schema}.${tableInfo.name}`); // trim to 200 return top200.slice(0, 200); } \ No newline at end of file diff --git a/apps/src/metabase/helpers/parseSql.test.ts b/apps/src/metabase/helpers/parseSql.test.ts new file mode 100644 index 0000000..13988d3 --- /dev/null +++ b/apps/src/metabase/helpers/parseSql.test.ts @@ -0,0 +1,289 @@ +import { getTablesFromSqlRegex, type TableAndSchema } from "./parseSql"; + +describe('getTablesFromSqlRegex', () => { + const sqlStatementsAndResults: { sql: string, results: TableAndSchema[] }[] = [ + // simple select + { + sql: ` + SELECT * + FROM user_activity.events_log + WHERE event_status IS 'active'; + `, + results: [ + { schema: 'user_activity', table: 'events_log' } + ] + }, + // another simple select + { + sql: + ` + SELECT user_id + FROM platform_data.user_profiles; + `, + results: [ + { schema: 'platform_data', table: 'user_profiles' } + ] + } + , + // with statement + { + sql: ` + WITH recent_orders AS ( + SELECT * + FROM sales_data.order_details + ) + SELECT alias.order_id + FROM recent_orders alias; + `, + results: [ + { schema: 'sales_data', table: 'order_details' }, + { schema: '', table: 'recent_orders' } + ] + } + , + // quotes and spaces + { + sql: ` + SELECT + "source"."event_id" AS "EventID", + "source"."user_id" AS "UserID", + "source"."event_type" AS "EventType", + "source"."event_timestamp" AS "EventTimestamp", + "source"."page_viewed" AS "PageViewed", + "source"."button_label" AS "ButtonLabel" + FROM + ( + SELECT + "analytics"."event_tracking"."event_id" AS "event_id", + "analytics"."event_tracking"."user_id" AS "user_id", + "analytics"."event_tracking"."event_type" AS "event_type", + "analytics"."event_tracking"."event_timestamp" AS "event_timestamp", + "analytics"."event_tracking"."page_viewed" AS "page_viewed", + "analytics"."event_tracking"."button_label" AS "button_label" + FROM + "analytics"."event tracking" + ) AS "source" + LIMIT 1048575; + `, + results: [ + { schema: 'analytics', table: 'event tracking' } + ] + } + , + // lots of tables + { + sql: ` + SELECT + monthly_period, + AVG(session_duration) AS avg_duration, + customer_segment, + activity_type + FROM ( + SELECT + customer.customer_id, + session_data.session_start, + session_data.session_end, + TO_CHAR(session_data.session_start, 'YYYY-MM') AS start_period, + TO_CHAR(session_data.session_end, 'YYYY-MM') AS end_period, + session_data.duration_in_minutes, + NULL AS total_spend, + (SELECT segment_definitions.segment_name + FROM purchase_transactions transactions + INNER JOIN transaction_metadata metadata ON metadata.transaction_id = transactions.id + INNER JOIN segment_definitions ON segment_definitions.id = metadata.segment_id + WHERE transactions.type = 'purchase' + AND transactions.status != 'refunded' + AND transactions.customer_id = customer.customer_id + LIMIT 1) AS customer_segment, + CASE + WHEN session_histories.session_data_id IS NULL THEN + CASE + WHEN (EXTRACT(EPOCH FROM (session_data.session_end - session_data.session_start))/86400) > 2 THEN 2 + ELSE (EXTRACT(EPOCH FROM (session_data.session_end - session_data.session_start))/86400) + END + ELSE durations.total_duration + END AS session_duration, + CASE + WHEN session_histories.session_data_id IS NULL THEN 'New_Session' + ELSE 'Returning_Session' + END AS activity_type + FROM customer_sessions customer + INNER JOIN session_details session_data ON session_data.customer_id = customer.customer_id + LEFT JOIN ( + SELECT COUNT(1), session_data_id + FROM session_histories + WHERE reason_code IN ('error-101', 'error-102', 'timeout', 'disconnect') + GROUP BY session_data_id + ) session_histories ON session_histories.session_data_id = session_data.id + LEFT JOIN session_durations durations ON durations.session_data_id = session_data.id + ) as sessions_derived; + `, + results: [ + { schema: '', table: 'purchase_transactions' }, + { schema: '', table: 'transaction_metadata' }, + { schema: '', table: 'segment_definitions' }, + { schema: '', table: 'customer_sessions' }, + { schema: '', table: 'session_details' }, + { schema: '', table: 'session_histories' }, + { schema: '', table: 'session_durations' }, + ] + } + , + // filters example + { + sql: ` + SELECT + created_at, + store_location AS location_name, + CASE + WHEN store_category = 0 THEN 'Retail' + WHEN store_category = 1 THEN 'Warehouse' + WHEN store_category = 2 THEN 'Distribution' + ELSE 'Other' + END AS store_type, + CASE + WHEN store_size = 0 THEN 'Small' + WHEN store_size = 1 THEN 'Medium' + WHEN store_size = 2 THEN 'Large' + END AS store_size, + CASE + WHEN region_code = 10 THEN 'North' + ELSE 'South' + END AS region, + address_line AS address, + unit_number AS unit, + floor_section AS section, + manager_first_name AS first_name, + manager_last_name AS last_name, + contact_number AS contact_number + FROM store_locations + WHERE {{store_type_filter}} + AND {{store_size_filter}} + AND {{created_at_filter}} + AND {{region_filter}} + ORDER BY created_at DESC; + `, + results: [ + { schema: '', table: 'store_locations' } + ] + }, + // optional filter example + { + sql: ` + SELECT count(*) + FROM products + WHERE 1=1 + [[AND id = {{id}}]] + [[AND category = {{category}}]] + `, + results: [ + { schema: '', table: 'products' } + ] + }, + // foreign language example + { + sql: ` + SELECT nombre, apellido + FROM públicó.usuarios + WHERE estado = 'activo'; + `, + results: [ + { schema: 'públicó', table: 'usuarios' } + ] + }, + // join + { + sql: ` + WITH daily_messages AS ( + SELECT + p.login_email_id as email, + ur.profile_id, + DATE(ur.created_at) as "day", + COUNT(*) as "daily_messages" + FROM + public.user_records ur + JOIN + public.profiles p ON ur.profile_id = p.id + WHERE + ur.created_at >= NOW() - INTERVAL '10 days' + AND ur.type = 'user_message' + AND ur.model != 'gpt-4o-mini' + GROUP BY + p.login_email_id, + ur.profile_id, + DATE(ur.created_at) + ), ranked_messages AS ( + SELECT + email, + profile_id, + "day", + daily_messages, + RANK() OVER (PARTITION BY "day" ORDER BY daily_messages DESC) as rank + FROM daily_messages + ) + SELECT + CASE WHEN rank <= 20 THEN email ELSE 'others' END as email, + "day", + SUM(daily_messages) as daily_messages + FROM ranked_messages + GROUP BY "day", CASE WHEN rank <= 20 THEN email ELSE 'others' END + ORDER BY "day" DESC, daily_messages DESC; + `, + results: [ + { schema: 'public', table: 'user_records' }, + { schema: 'public', table: 'profiles' }, + { schema: '', table: 'daily_messages' }, + { schema: '', table: 'ranked_messages' } + ] + }, + // same table multiple times (we actually return both, doesn't matter, dedup is done later anyway) + { + sql: ` + WITH dummy1 AS ( + SELECT * from some_schema.some_table + WHERE some_column = 'some_value' + ), + dummy2 AS ( + SELECT * from some_schema.some_table + WHERE some_column = 'some_value' + ) + SELECT * FROM dummy1 JOIN dummy2 ON dummy1.some_column = dummy2.some_column + ORDER BY some_column; + `, + results: [ + { schema: 'some_schema', table: 'some_table' }, + { schema: 'some_schema', table: 'some_table' }, + { schema: '', table: 'dummy1' }, + { schema: '', table: 'dummy2' } + ] + + }, + // dashes in table example + { + sql: `SELECT * from "some-schema"."some-table";`, + results: [ + { schema: 'some-schema', table: 'some-table' } + ] + }, + // only schema quoted + { + sql: `SELECT * from "some-schema".sometable;`, + results: [ + { schema: 'some-schema', table: 'sometable' } + ] + }, + // only table quoted + { + sql: `SELECT * from someschema."some-table";`, + results: [ + { schema: 'someschema', table: 'some-table' } + ] + }, + ]; + for (const { sql, results } of sqlStatementsAndResults) { + it(`should get the correct tables from sql: ${sql}`, () => { + const tables = getTablesFromSqlRegex(sql); + expect(tables).toEqual(results); + }); + } +}); diff --git a/apps/src/metabase/helpers/parseSql.ts b/apps/src/metabase/helpers/parseSql.ts index 9bd1fd3..c8ac97c 100644 --- a/apps/src/metabase/helpers/parseSql.ts +++ b/apps/src/metabase/helpers/parseSql.ts @@ -1,11 +1,13 @@ import { Parser } from 'node-sql-parser'; -interface TableAndSchema { +export interface TableAndSchema { table: string; schema: string; } -export function getTablesFromSql(sql: string): TableAndSchema[] { +// using regex version so we don't have to deal with metabase filters syntax +// might be a better idea to just use this one instead of the ridiculous regex +/*export*/ function getTablesFromSql(sql: string): TableAndSchema[] { const parser = new Parser(); try { const tableList = parser.tableList(sql); @@ -21,4 +23,38 @@ export function getTablesFromSql(sql: string): TableAndSchema[] { console.warn('Error parsing SQL (maybe malformed):', sql, error); return []; } +} + +export function getTablesFromSqlRegex(sql: string): TableAndSchema[] { + // regex match to find all tables + // tables come after FROM/JOIN/INTO (case insensitive) + // table can be in the form of schema.table or just table + // need to capture both schema (if exists) and table + // have 2 patterns: one is for schema.table and one for "schema with spaces"."table with spaces" + const regex = /(?:FROM|JOIN|INTO)\s+(?:((?:[\w\p{L}]+)|(?:"(?:[\w\s\-\p{L}]+))")\.)?((?:[\w\p{L}]+)|(?:"(?:[\w\s\-\p{L}]+))")\s*/ugi; + const matches = sql.matchAll(regex); + const tables: TableAndSchema[] = []; + + for (const match of matches) { + let [, schema, table] = match; + // remove surrounding quotes if present + if (schema && schema.startsWith('"') && schema.endsWith('"')) { + schema = schema.slice(1, -1); + } + if (table && table.startsWith('"') && table.endsWith('"')) { + table = table.slice(1, -1); + } + if (schema) { + tables.push({ + table: table, + schema: schema + }); + } else { + tables.push({ + table: table, + schema: '' + }); + } + } + return tables; } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 19e5e51..e28129b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3188,6 +3188,20 @@ __metadata: languageName: node linkType: hard +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c + languageName: node + linkType: hard + "@jest/core@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/core@npm:30.0.0-alpha.5" @@ -3230,6 +3244,47 @@ __metadata: languageName: node linkType: hard +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 + languageName: node + linkType: hard + "@jest/environment-jsdom-abstract@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/environment-jsdom-abstract@npm:30.0.0-alpha.5" @@ -3263,6 +3318,18 @@ __metadata: languageName: node linkType: hard +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 + languageName: node + linkType: hard + "@jest/expect-utils@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/expect-utils@npm:30.0.0-alpha.5" @@ -3291,6 +3358,16 @@ __metadata: languageName: node linkType: hard +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e + languageName: node + linkType: hard + "@jest/fake-timers@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/fake-timers@npm:30.0.0-alpha.5" @@ -3305,6 +3382,20 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c + languageName: node + linkType: hard + "@jest/globals@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/globals@npm:30.0.0-alpha.5" @@ -3317,6 +3408,18 @@ __metadata: languageName: node linkType: hard +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea + languageName: node + linkType: hard + "@jest/pattern@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/pattern@npm:30.0.0-alpha.5" @@ -3364,6 +3467,43 @@ __metadata: languageName: node linkType: hard +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 + languageName: node + linkType: hard + "@jest/schemas@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/schemas@npm:30.0.0-alpha.5" @@ -3405,6 +3545,17 @@ __metadata: languageName: node linkType: hard +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 + languageName: node + linkType: hard + "@jest/test-result@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/test-result@npm:30.0.0-alpha.5" @@ -3417,6 +3568,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 + languageName: node + linkType: hard + "@jest/test-sequencer@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/test-sequencer@npm:30.0.0-alpha.5" @@ -3429,6 +3592,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b + languageName: node + linkType: hard + "@jest/transform@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "@jest/transform@npm:30.0.0-alpha.5" @@ -4030,6 +4205,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 + languageName: node + linkType: hard + "@sinonjs/fake-timers@npm:^11.1.0": version: 11.2.2 resolution: "@sinonjs/fake-timers@npm:11.2.2" @@ -5254,9 +5438,11 @@ __metadata: resolution: "apps@workspace:apps" dependencies: "@types/uuid": "npm:^10" + jest: "npm:^29.7.0" lodash: "npm:^4.17.21" react: "npm:^18.3.1" reflect-metadata: "npm:^0.2.2" + ts-jest: "npm:^29.2.5" uuid: "npm:^10.0.0" zustand: "npm:^4.5.5" languageName: unknown @@ -5347,6 +5533,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.3": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -5382,7 +5575,7 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.5.0": +"babel-jest@npm:^29.5.0, babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" dependencies: @@ -5695,6 +5888,15 @@ __metadata: languageName: node linkType: hard +"bs-logger@npm:^0.2.6": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: "npm:2.x" + checksum: 10c0/80e89aaaed4b68e3374ce936f2eb097456a0dddbf11f75238dbd53140b1e39259f0d248a5089ed456f1158984f22191c3658d54a713982f676709fbe1a6fa5a0 + languageName: node + linkType: hard + "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -5851,7 +6053,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -6310,6 +6512,23 @@ __metadata: languageName: node linkType: hard +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f + languageName: node + linkType: hard + "cross-fetch@npm:^3.1.5": version: 3.1.8 resolution: "cross-fetch@npm:3.1.8" @@ -6817,6 +7036,17 @@ __metadata: languageName: node linkType: hard +"ejs@npm:^3.1.10": + version: 3.1.10 + resolution: "ejs@npm:3.1.10" + dependencies: + jake: "npm:^10.8.5" + bin: + ejs: bin/cli.js + checksum: 10c0/52eade9e68416ed04f7f92c492183340582a36482836b11eab97b159fcdcfdedc62233a1bf0bf5e5e1851c501f2dca0e2e9afd111db2599e4e7f53ee29429ae1 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.4.820": version: 1.5.4 resolution: "electron-to-chromium@npm:1.5.4" @@ -7315,7 +7545,7 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0": +"expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" dependencies: @@ -7450,7 +7680,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b @@ -7563,6 +7793,15 @@ __metadata: languageName: node linkType: hard +"filelist@npm:^1.0.4": + version: 1.0.4 + resolution: "filelist@npm:1.0.4" + dependencies: + minimatch: "npm:^5.0.1" + checksum: 10c0/426b1de3944a3d153b053f1c0ebfd02dccd0308a4f9e832ad220707a6d1f1b3c9784d6cadf6b2f68f09a57565f63ebc7bcdc913ccf8012d834f472c46e596f41 + languageName: node + linkType: hard + "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -8857,6 +9096,17 @@ __metadata: languageName: node linkType: hard +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 + languageName: node + linkType: hard + "istanbul-lib-source-maps@npm:^5.0.0": version: 5.0.6 resolution: "istanbul-lib-source-maps@npm:5.0.6" @@ -8891,6 +9141,20 @@ __metadata: languageName: node linkType: hard +"jake@npm:^10.8.5": + version: 10.9.2 + resolution: "jake@npm:10.9.2" + dependencies: + async: "npm:^3.2.3" + chalk: "npm:^4.0.2" + filelist: "npm:^1.0.4" + minimatch: "npm:^3.1.2" + bin: + jake: bin/cli.js + checksum: 10c0/c4597b5ed9b6a908252feab296485a4f87cba9e26d6c20e0ca144fb69e0c40203d34a2efddb33b3d297b8bd59605e6c1f44f6221ca1e10e69175ecbf3ff5fe31 + languageName: node + linkType: hard + "jest-changed-files@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-changed-files@npm:30.0.0-alpha.5" @@ -8902,6 +9166,17 @@ __metadata: languageName: node linkType: hard +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" + dependencies: + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b + languageName: node + linkType: hard + "jest-circus@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-circus@npm:30.0.0-alpha.5" @@ -8930,6 +9205,34 @@ __metadata: languageName: node linkType: hard +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e + languageName: node + linkType: hard + "jest-cli@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-cli@npm:30.0.0-alpha.5" @@ -8955,6 +9258,32 @@ __metadata: languageName: node linkType: hard +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a + languageName: node + linkType: hard + "jest-config@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-config@npm:30.0.0-alpha.5" @@ -8994,6 +9323,44 @@ __metadata: languageName: node linkType: hard +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 + languageName: node + linkType: hard + "jest-diff@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-diff@npm:30.0.0-alpha.5" @@ -9027,6 +9394,15 @@ __metadata: languageName: node linkType: hard +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + "jest-each@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-each@npm:30.0.0-alpha.5" @@ -9040,6 +9416,19 @@ __metadata: languageName: node linkType: hard +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 + languageName: node + linkType: hard + "jest-environment-jsdom@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-environment-jsdom@npm:30.0.0-alpha.5" @@ -9072,6 +9461,20 @@ __metadata: languageName: node linkType: hard +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b + languageName: node + linkType: hard + "jest-get-type@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-get-type@npm:30.0.0-alpha.5" @@ -9151,6 +9554,16 @@ __metadata: languageName: node linkType: hard +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 + languageName: node + linkType: hard + "jest-matcher-utils@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-matcher-utils@npm:30.0.0-alpha.5" @@ -9220,6 +9633,17 @@ __metadata: languageName: node linkType: hard +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac + languageName: node + linkType: hard + "jest-pnp-resolver@npm:^1.2.2": version: 1.2.3 resolution: "jest-pnp-resolver@npm:1.2.3" @@ -9256,6 +9680,16 @@ __metadata: languageName: node linkType: hard +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" + dependencies: + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d + languageName: node + linkType: hard + "jest-resolve@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-resolve@npm:30.0.0-alpha.5" @@ -9273,6 +9707,23 @@ __metadata: languageName: node linkType: hard +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 + languageName: node + linkType: hard + "jest-runner@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-runner@npm:30.0.0-alpha.5" @@ -9302,6 +9753,35 @@ __metadata: languageName: node linkType: hard +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 + languageName: node + linkType: hard + "jest-runtime@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-runtime@npm:30.0.0-alpha.5" @@ -9332,6 +9812,36 @@ __metadata: languageName: node linkType: hard +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 + languageName: node + linkType: hard + "jest-snapshot@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-snapshot@npm:30.0.0-alpha.5" @@ -9361,6 +9871,34 @@ __metadata: languageName: node linkType: hard +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 + languageName: node + linkType: hard + "jest-util@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-util@npm:30.0.0-alpha.5" @@ -9375,7 +9913,7 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.7.0": +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" dependencies: @@ -9403,6 +9941,20 @@ __metadata: languageName: node linkType: hard +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2 + languageName: node + linkType: hard + "jest-watcher@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-watcher@npm:30.0.0-alpha.5" @@ -9419,6 +9971,22 @@ __metadata: languageName: node linkType: hard +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 + languageName: node + linkType: hard + "jest-worker@npm:30.0.0-alpha.5": version: 30.0.0-alpha.5 resolution: "jest-worker@npm:30.0.0-alpha.5" @@ -9473,6 +10041,25 @@ __metadata: languageName: node linkType: hard +"jest@npm:^29.7.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b + languageName: node + linkType: hard + "js-tiktoken@npm:^1.0.12": version: 1.0.12 resolution: "js-tiktoken@npm:1.0.12" @@ -9639,6 +10226,13 @@ __metadata: languageName: node linkType: hard +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b + languageName: node + linkType: hard + "launch-editor@npm:^2.6.0": version: 2.8.0 resolution: "launch-editor@npm:2.8.0" @@ -9737,6 +10331,13 @@ __metadata: languageName: node linkType: hard +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -9838,6 +10439,13 @@ __metadata: languageName: node linkType: hard +"make-error@npm:^1.3.6": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + "make-fetch-happen@npm:^13.0.0": version: 13.0.1 resolution: "make-fetch-happen@npm:13.0.1" @@ -10547,6 +11155,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 + languageName: node + linkType: hard + "minimatch@npm:^6.1.6": version: 6.2.0 resolution: "minimatch@npm:6.2.0" @@ -11533,6 +12150,16 @@ __metadata: languageName: node linkType: hard +"prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 + languageName: node + linkType: hard + "prop-types@npm:^15.6.1, prop-types@npm:^15.6.2": version: 15.8.1 resolution: "prop-types@npm:15.8.1" @@ -12602,7 +13229,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4": +"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -12824,6 +13451,13 @@ __metadata: languageName: unknown linkType: soft +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -12917,7 +13551,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:~0.6.0": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 @@ -13402,6 +14036,43 @@ __metadata: languageName: node linkType: hard +"ts-jest@npm:^29.2.5": + version: 29.2.5 + resolution: "ts-jest@npm:29.2.5" + dependencies: + bs-logger: "npm:^0.2.6" + ejs: "npm:^3.1.10" + fast-json-stable-stringify: "npm:^2.1.0" + jest-util: "npm:^29.0.0" + json5: "npm:^2.2.3" + lodash.memoize: "npm:^4.1.2" + make-error: "npm:^1.3.6" + semver: "npm:^7.6.3" + yargs-parser: "npm:^21.1.1" + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/transform": ^29.0.0 + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/transform": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: 10c0/acb62d168faec073e64b20873b583974ba8acecdb94681164eb346cef82ade8fb481c5b979363e01a97ce4dd1e793baf64d9efd90720bc941ad7fc1c3d6f3f68 + languageName: node + linkType: hard + "tslib@npm:2.4.0": version: 2.4.0 resolution: "tslib@npm:2.4.0"