From 437c750c349ae7e8d537cc18ae8807eb9c4aba45 Mon Sep 17 00:00:00 2001 From: Dave Vause Date: Mon, 16 Oct 2023 11:26:55 -0400 Subject: [PATCH] Cloud Data Connect (#2) * Add function for cloud connect * Add API for CSV MatchReport * Add custom user-agent to API request headers * Add repository url to package.json * Update publish script * Update npmignore * Update package version * Update JSDoc * Update imports/exports * Update README.md * CSV & TSC MatchKey reports - Add support for TSV. - Add request validation. - Add support for 'responseFormat' of json, html, or text. - Add unit tests. * CloudDatabaseMatchKeyReports - Implement CloudDatabaseMatchKeyReport API - Request validation. - Rename "CSV..." classes to "DelimitedFile" to make it more clear it supports both CSV and TSV - Refactoring. --------- Co-authored-by: Interzoid --- README.md | 247 +++- docs/assets/highlight.css | 21 + docs/assets/navigation.js | 2 +- docs/assets/search.js | 2 +- docs/enums/Category.html | 110 ++ docs/enums/Process.html | 123 ++ docs/enums/Source.html | 267 ++++ docs/functions/getAccountInfo.html | 14 +- docs/functions/getAddressMatchKey.html | 14 +- .../getCloudDatabaseMatchKeyReport.html | 72 + docs/functions/getCompanyNameMatchKey.html | 14 +- .../getDelimitedFileMatchKeyReport.html | 77 + docs/functions/getFullNameMatchKey.html | 14 +- docs/functions/getFullNameMatchScore.html | 14 +- docs/functions/getOrganizationMatchScore.html | 14 +- docs/index.html | 96 +- docs/interfaces/AddressMatchKeyRequest.html | 20 +- docs/interfaces/CloudWorkloadRequest.html | 198 +++ docs/interfaces/CloudWorkloadResponse.html | 101 ++ .../CompanyNameMatchKeyRequest.html | 20 +- .../DelimitedFileMatchKeyReportRequest.html | 158 ++ .../DelimitedFileMatchKeyReportResponse.html | 115 ++ docs/interfaces/FullNameMatchKeyRequest.html | 18 +- docs/interfaces/InterzoidRequest.html | 20 +- docs/interfaces/InterzoidResponse.html | 18 +- docs/interfaces/MatchKeyResponse.html | 20 +- docs/interfaces/MatchScoreRequest.html | 20 +- docs/interfaces/MatchScoreResponse.html | 20 +- docs/modules.html | 24 +- package-lock.json | 1265 +++++++++-------- package.json | 14 +- src/api/AccountInfo.ts | 2 +- src/api/AddressMatchKey.ts | 2 +- src/api/CloudDatabaseMatchKeyReport.ts | 148 ++ src/api/CompanyNameMatchKey.ts | 2 +- src/api/DelimitedFileMatchKeyReport.ts | 108 ++ src/api/FullNameMatchKey.ts | 2 +- src/api/FullNameMatchScore.ts | 2 +- src/api/InterzoidApi.ts | 34 +- src/api/OrganizationMatchScore.ts | 2 +- src/index.ts | 18 + src/interfaces/Category.ts | 11 + src/interfaces/CloudWorkloadRequest.ts | 32 + src/interfaces/CloudWorkloadResponse.ts | 14 + .../DelimitedFileMatchKeyReportRequest.ts | 22 + .../DelimitedFileMatchKeyReportResponse.ts | 14 + src/interfaces/MatchCluster.ts | 18 + src/interfaces/Process.ts | 16 + src/interfaces/Source.ts | 43 + tests/api/CloudWorkloadMatchKeyReport.test.ts | 91 ++ tests/api/DelimitedFileMatchKeyReport.test.ts | 69 + ...ore.test.ts => FullNameMatchScore.test.ts} | 7 +- tests/api/OrganizationMatchScore.test.ts | 4 +- 53 files changed, 3063 insertions(+), 730 deletions(-) create mode 100644 docs/enums/Category.html create mode 100644 docs/enums/Process.html create mode 100644 docs/enums/Source.html create mode 100644 docs/functions/getCloudDatabaseMatchKeyReport.html create mode 100644 docs/functions/getDelimitedFileMatchKeyReport.html create mode 100644 docs/interfaces/CloudWorkloadRequest.html create mode 100644 docs/interfaces/CloudWorkloadResponse.html create mode 100644 docs/interfaces/DelimitedFileMatchKeyReportRequest.html create mode 100644 docs/interfaces/DelimitedFileMatchKeyReportResponse.html create mode 100644 src/api/CloudDatabaseMatchKeyReport.ts create mode 100644 src/api/DelimitedFileMatchKeyReport.ts create mode 100644 src/interfaces/Category.ts create mode 100644 src/interfaces/CloudWorkloadRequest.ts create mode 100644 src/interfaces/CloudWorkloadResponse.ts create mode 100644 src/interfaces/DelimitedFileMatchKeyReportRequest.ts create mode 100644 src/interfaces/DelimitedFileMatchKeyReportResponse.ts create mode 100644 src/interfaces/MatchCluster.ts create mode 100644 src/interfaces/Process.ts create mode 100644 src/interfaces/Source.ts create mode 100644 tests/api/CloudWorkloadMatchKeyReport.test.ts create mode 100644 tests/api/DelimitedFileMatchKeyReport.test.ts rename tests/api/{NameMatchScore.test.ts => FullNameMatchScore.test.ts} (88%) diff --git a/README.md b/README.md index 6efafb7..1a7ece2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Interzoid Data Matching Node.js SDK -This is a Node.js SDK for Interzoid's Generative-AI powered data matching, data quality, data cleansing, and data normalization for organization and individual name data. Functions include the generation of similarity keys for identifying and matching inconsistent name data, as well as comparing and scoring data for matching purposes. +**Version: 1.1.0** + +This is a Node.js SDK for Interzoid's Generative-AI powered data matching, data quality, data cleansing, and data normalization for organization and individual name data. Functions include the generation of similarity keys (also called match keys) for identifying and matching inconsistent name data, as well as comparing and scoring data for matching purposes. The concept is that the same similarity key will be algorithmically generated for different permutations of the same data content, such as GE, Gen Elec, General Electric all generating the same similarity key. Then, these similarity keys can be used as the basis of matching data, identifying duplicates, and resolving inconsistencies that can otherwise degrade the usefulness and value of data-driven applications, processes, or anything else that makes use of data. These similarity keys form the basis of many of the different functions available in the SDK that make use of Generative AI, Machine Learning, specialized algorithms, and extensive knowledge bases - all in the Cloud - to provide its results. These include functions that generate similarity keys for custom use, functions that score matches for certain use cases, and functions that process and perform matching functions with entire database tables and datasets. #### Table of Contents 1. [API Key](#api-key) @@ -13,8 +15,16 @@ This is a Node.js SDK for Interzoid's Generative-AI powered data matching, data 2. [Match Score Functions](#match-score-functions) 1. [Full Name Match Score](#full-name-match-score) 2. [Organization Name Match Score](#organization-name-match-score) - 3. [Interzoid Account Information (Remaining Credits)](#account-information) - +4. [Interzoid Cloud Data Connect](#cloud-data-connect) + 1. [Introduction](#introduction) + 2. [Matching Process](#matching-process) + 3. [Sources](#source) + 4. [Processing Categories](#category) + 5. [Connection Strings](#connection-strings) + 6. [Match and write keys to a new cloud database table](#match-and-write-results-to-a-new-table) + 7. [Match Key Report for a cloud database table](#match-key-report-for-a-cloud-database-table) + 8. [Text File Match Key Report](#text-file-match-key-report) +5. [Interzoid Account Information (Remaining Credits)](#account-information) --- ## API Key @@ -33,6 +43,7 @@ npm install @interzoid/data-matching --- ## Data Matching APIs + Interzoid uses algorithmically generated similarity keys leveraging Generative AI, Large Language Models (LLMs), Machine Learning, specialized algorithms, and extensive knowledge bases to intelligently match data within or across data sources. Match rates can increase significantly when similarity keys are used with important data. To learn more about the technology behind these APIs and to better understand how to make use of similarity keys, please visit https://docs.interzoid.com/entries/understanding-data-matching @@ -43,7 +54,7 @@ To learn more about the technology behind these APIs and to better understand ho This API provides a hashed similarity key from the input data used to match with other similar full name data. Use the generated similarity key, rather than the actual data itself, to match and/or sort individual name data by similarity as similar individual names will generate the same similarity key. This avoids the problems of data inconsistency, misspellings, and name variations when matching within a single dataset, and can also help matching across datasets or for more advanced searching. ```typescript -import { getFullNameMatchKey } from 'interzoid'; +import { getFullNameMatchKey } from '@interzoid/data-matching'; async function fullNameMatch() { const result = await getFullNameMatchKey({apiKey: 'your-interzoid-api-key', fullName: 'John Smith'}); @@ -75,7 +86,7 @@ The optional `algorithm` parameter provides multiple matching algorithms: - The default value for the optional `algorithm` parameter is `wide`. ```typescript -import { getCompanyNameMatchKey } from 'interzoid'; +import { getCompanyNameMatchKey } from '@interzoid/data-matching'; async function companyNameMatch() { const result = await getCompanyNameMatchKey({apiKey: 'your-interzoid-api-key', company: 'Microsoft', algorithm: 'medium'}); @@ -94,15 +105,16 @@ async function companyNameMatch() { --- #### Address Match Key + This API provides a hashed similarity key from the input data used to match with other similar address data. Use the generated similarity key, rather than the actual data itself, to match and/or sort address data by similarity, as similar addresses will generate the same similarity key. This avoids the problems of data inconsistency, misspellings, and address element variations when matching either withing a single dataset, or across datasets. It also provides for broader searching capabilities. -You can choose from two matching algorithms, `wide` and `narrow`. +You can choose from two matching algorithms, `wide` and `narrow`. - `narrow` considers a unit number (suite, apartment, unit, etc.) when generating similarity keys. This ensures individual units are identified separately when comparing generated keys. - `wide` parameter will not consider the unit numbers, generating matching similarity keys based on the primary address only. - The default value for the optional `algorithm` parameter is `narrow`. ```typescript -import { getAddressMatchKey } from 'interzoid'; +import { getAddressMatchKey } from '@interzoid/data-matching'; async function addressMatch() { const result = await getAddressMatchKey({apiKey: 'your-interzoid-api-key', address: '500 main street', algorithm: 'narrow'}); @@ -130,7 +142,7 @@ We provide two operations for match scoring: Organization name and Full name. Th This API provides a match score (likelihood of matching) between two individual names on a scale of 0-100, where 100 is the highest possible match. ```typescript -import { getFullNameMatchScore } from 'interzoid'; +import { getFullNameMatchScore } from '@interzoid/data-matching'; async function fullNameMatchScore() { const result = await getFullNameMatchScore({apiKey: 'your-interzoid-api-key', value1: 'John Smith', value2: 'John Smyth'}); @@ -150,10 +162,10 @@ async function fullNameMatchScore() { --- #### Organization Name Match Score -This API provides a match score (likelihood of matching) from 0-100 between two organization names. +This API provides a match score (likelihood of matching) ranging from 0 to 100 between two organization names. ```typescript -import { getOrganizationMatchScore } from 'interzoid'; +import { getOrganizationMatchScore } from '@interzoid/data-matching'; async function organizationNameMatchScore() { const result = await getOrganizationNameMatchScore({apiKey: 'your-interzoid-api-key', value1: 'Apple', value2: 'Apple Inc.'}); @@ -172,14 +184,222 @@ async function organizationNameMatchScore() { --- -#### Account Information +## Cloud Data Connect + +### Introduction + +Interzoid's Cloud Data Connect is a set of functions that allow you to match data in your cloud database or delimited text file such as CSV and TSV with Interzoid's data matching algorithms. + + +### Matching Process + +The `process` parameter determines the type of matching process to run. The package provides an `enum` called [`Process`](src/interfaces/Process.ts) that contains the available options. + +| Process | Description | +|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `Process.MATCH_REPORT` | Generate a report of all found clusters of similar data that share the same generated similarity key. | +| `Process.CREATE_TABLE` | Creates a new table in the source database with all the similarity keys for each record in the source table, so they can be used for additional queries. | +| `Process.GEN_SQL` | Generate the SQL INSERT statements to store the similarity keys in a database for ability to review before execution. | +| `Process.KEYS_ONLY` | Output a generated similarity key for every record in the dataset. | + + +### Source + +The `source` parameter determines the type of data source containing the data you are performing matching functions with. The package provides an `enum` called [`Source`](src/interfaces/Source.ts) that contains the available options. Some commonly used examples are: + +| Source | Description | +|---------------------|--------------------------------------| +| `Source.MYSQL` | Match data in a MySQL database. | +| `Source.POSTGRES` | Match data in a PostgreSQL database. | +| `Source.MARIADB` | Match data in a MariaDB database. | +| `Source.DATABRICKS` | Match data in a Databricks table. | +| `Source.CSV` | Match data in a CSV file. | + +Please see the [source code](src/interfaces/Source.ts) for a complete list of available options. + + +### Category + +The `category` parameter determines the type of data you're matching. The package provides an `enum` called [`Category`](src/interfaces/Category.ts) that contains the available options. + +| Category | Description | +|-----------------------|-------------------------| +| `Category.COMPANY` | Match company names. | +| `Category.INDIVIDUAL` | Match individual names. | +| `Category.ADDRESS` | Match addresses. | + +### Connection Strings + +The `connection` parameter is a connection string for your database. The format of the connection string depends on the database you're connecting to. + +Please see [this page](https://connect.interzoid.com/connection-strings) for examples of connection strings for various databases. + +### Match and write results to a new table + +Set the `process` parameter to `CREATE_TABLE` to create a new table in your database with the match keys. The `newTable` parameter is the name of the new table to create. This table will be created by the process, and will contain the original data and the similarity key. + +**Do not create the table manually; the process will handle the creation.** + +You'll have to grant the user you're connecting with the ability to create a new table in the database in addition to the ability to read from the table you're matching. + +```typescript +import { getCloudDatabaseMatchKeyReport, Process, Category, Source } from '@interzoid/data-matching'; + +async function databaseMatchKeyReport() { + const result = await getCloudDatabaseMatchKeyReport({ + apiKey: 'your-interzoid-api-key', + process: Process.CREATE_TABLE, + category: Category.COMPANY, + source: Source.MYSQL, + connection: 'db_user:db_password@tcp(db_host)/database', + table: 'companies', // table to match + column: 'companyname', // column to match + reference: 'id', // optional reference column + newTable: 'companies_match_keys' // new table to create + }); + console.log(result); +} +``` + +#### Response +``` +"Creating new table...Table companies_match_keys created successfully." +``` + +--- + +### Match Key Report for a cloud database table + +#### Response options + +* Set `json` to `true` to return a JSON object with arrays of match clusters. +* Set `html` to `true` to return results in plain text with clusters separated by html `
` tags. +* Don't set either to return results in plain text with clusters separated by newlines. + +```typescript +import { getCloudDatabaseMatchKeyReport, Source, Process, Category } from '@interzoid/data-matching'; + +async function databaseMatchKeyReport() { + const result = await getCloudDatabaseMatchKeyReport({ + apiKey: 'your-interzoid-api-key', + process: Process.MATCH_REPORT, + category: Category.COMPANY, + source: Source.MYSQL, + connection: 'db_user:db_password@tcp(db_host)/database', + table: 'companies', + column: 'companyname', + reference: 'id', + json: true, + }); + console.log(JSON.stringify(result, null, 2)); +} +``` + +#### Sample Response + +```json +{ + "Status": "success", + "Message": "", + "MatchClusters": [ + [ + { + "Data": "Cisco", + "Reference": "", + "SimKey": "3AmCGk2yvEJ7XUxUmB3dFHxRiVzy4Squ89J-4_lDrxQ" + }, + { + "Data": "Cisco Systems", + "Reference": "30", + "SimKey": "3AmCGk2yvEJ7XUxUmB3dFHxRiVzy4Squ89J-4_lDrxQ" + } + ], + [ + { + "Data": "Netflix", + "Reference": "15", + "SimKey": "8c6BY0KP9MYiDezQaKL3bH3iHfDU2wCMMTD9v0EeZJ8" + }, + { + "Data": "\"Netflix, Inc.\"", + "Reference": "34", + "SimKey": "8c6BY0KP9MYiDezQaKL3bH3iHfDU2wCMMTD9v0EeZJ8" + } + ] + ] + } +``` + +--- + +### Text File Match Key Report + +Provide a URL to a delimited file (CSV or TSV) and the API will return a match key report for the data in the file. + +```typescript +import { getDelimitedFileMatchKeyReport, Process, Source, Category } from '@interzoid/data-matching'; + +async function csvFileMatchReport() { + const result = await getDelimitedFileMatchKeyReport({ + apiKey: 'your-interzoid-api-key', + process: Process.MATCH_REPORT, + category: Category.COMPANY, + source: Source.CSV, + table: Source.CSV, + connection: 'https://dl.interzoid.com/csv/companies.csv', + column: '1', // column number to match + json: true, + }); + console.log(JSON.stringify(result, null, 2)); +} + +``` + +#### Result + +```json +{ + "Status": "success", + "Message": "", + "MatchClusters": [ + [ + { + "Data": "Good Year Tire & Rubber", + "Reference": "", + "SimKey": "140xAiUxvDysV56LZzogzDwLuYLd2U7E5sVAXd1nKd8" + }, + { + "Data": "Goodyear Tire Inc", + "Reference": "Transportaions", + "SimKey": "140xAiUxvDysV56LZzogzDwLuYLd2U7E5sVAXd1nKd8" + } + ], + [ + { + "Data": "Pederson Tooling Inc.", + "Reference": "Transportaions", + "SimKey": "7oOMieCdoyxjt7_oKbE2xGngnZGdG75CFU5pEfhU5z8" + }, + { + "Data": "Peterson Tools", + "Reference": "Services", + "SimKey": "7oOMieCdoyxjt7_oKbE2xGngnZGdG75CFU5pEfhU5z8" + } + ] + ] +} +``` + +--- + +## Account Information This API retrieves the current amount of remaining purchased (or trial) credits for a license key. Using this function does **not** deduct credits from your account. ```typescript -import { getRemainingCredits } from 'interzoid'; +import { getRemainingCredits } from '@interzoid/data-matching'; async function remainingCredits() { const result = getRemainingCredits({apiKey: 'your-interzoid-api-key'}); @@ -187,11 +407,10 @@ async function remainingCredits() { } ``` -##### Result +#### Result ```json { "credits": "9998", "code": "Success" } ``` - diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index a537f8e..08ca6e6 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -15,6 +15,12 @@ --dark-hl-6: #4FC1FF; --light-hl-7: #0451A5; --dark-hl-7: #9CDCFE; + --light-hl-8: #008000; + --dark-hl-8: #6A9955; + --light-hl-9: #098658; + --dark-hl-9: #B5CEA8; + --light-hl-10: #EE0000; + --dark-hl-10: #D7BA7D; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -28,6 +34,9 @@ --hl-5: var(--light-hl-5); --hl-6: var(--light-hl-6); --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); --code-background: var(--light-code-background); } } @@ -40,6 +49,9 @@ --hl-5: var(--dark-hl-5); --hl-6: var(--dark-hl-6); --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); --code-background: var(--dark-code-background); } } @@ -52,6 +64,9 @@ --hl-5: var(--light-hl-5); --hl-6: var(--light-hl-6); --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); --code-background: var(--light-code-background); } @@ -64,6 +79,9 @@ --hl-5: var(--dark-hl-5); --hl-6: var(--dark-hl-6); --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); --code-background: var(--dark-code-background); } @@ -75,4 +93,7 @@ .hl-5 { color: var(--hl-5); } .hl-6 { color: var(--hl-6); } .hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } pre, code { background: var(--code-background); } diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 74c4b24..a4c2729 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE5XSsQrCMBCA4XfJLAqiDt1EEERU0FEcQnq1wTapzRWs4rtbFZTE5hrn/vmuIbe/MYQLsohN47gEY1YcRbqEegvnCgyyHis4ps13qRDKhAswg/a0n2KeNf1JqphFw/Hk3vvgM50XXNVrnkPIAH9ODZlXWRY6wdNS/OJ5+qplTLluFAiaQisDXeK7osjvdQjRjTrBndAlULf+qULJrr+0Mgo9Ak6F0JXChUr0F0wqJVA2pwd2YVuTkUPZC+7j7IomW1baw7aUNO3ussd1sz/Q1zOEsK+QhjflkSt55U+gE2+PfwYcHoDCaL7HBAAA" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE52UTU8CMRCG/8ueiSRGieFGICTE+BE5eDAeandYGrqdtZ0mgvG/u4AK26WzxWv3eZ93O2n78pkRfFA2zMaCoEC7znpZJWhZr4Dxpev/rl8sqdT1x5UyeTa8+er9JR8tSnAuDP4sx3Nz9FZCGNuvxlOjPLe19k6QXN7C+gnePTg6WJQhsAtRV/dPo0315fXgSD7W6PNntCuNIufUp8AzxK5C4yDFvCdZNZaVMOt7UULKUOI4VzIBrUpFkE+VPspVaIkr6479u5QZYUKOq516rVOnGWE5/Wyb3qBiz1cIJQqZobQoTnnYDmMMoU7hXKIFbtctKlXZ9ZcNjJMWQCMp0RuamQUehAtvJKk63W8STdfgKlA1H6CYrknxyt3zMBEk3oQLznZEzyQ6qtovRayiTfJq5oZGKpgEXxXe0Ig/xM6Q7g5XinYH8uIHWwijNmIr6JSfhlsFr98Ha59H5QcAAA==" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 43b778a..e0638f4 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE61Y227jNhD9F/lV65hDW7bytihQICjaAi3QF8MoBIlOhMiSK8nbZg3/e0ldTFKa0cXZlxiKz5y5nEOK5tXJs38L53l/dd7jNHKevbXrpMFJOM/Oqyi/RlEuiuLXoAzffhEfjutc8kR+dbykYRlnafHUBy3fylMikWESFIWQ3I5zc3H6n7LTOUg/fpP/GE6BAGek+fmSJOM5uqgZCb6GYXZJy5f0mBEj0oBH6/4zzHIxofIKNyPJ7/lrkMbfA8U2lgjHDiaDjXfP1jHKH+KfiyjKe6o4LUV+DEJRPOHIwURsBbqvoI6fSb3QYUYK1zkHuUhLugGqiOQ1y+Py7TS7DCPwhxRyjk3XT62ijdIllEX0JS6+xOmbkPWJaFZJphOQ9TzgBho93RFhzfEA/UKH4mIMNPOIM8bKGXfHAwWRDhmtZp5LJpVmOqW7Kw/YhIBO98ixIZhLvjACcUWoLmbLMVjGTC3GizKF0KjiLF8H6JC6mOmjL+IT0THKubjj8Xn3iiV3hWh6I4sGPW26k0vIRRSX6KuKqOIe8OlCevpW7/OBJdYDTVf4W5BcBJtOurgHDEhs1TuUGOYmhs8nplcxkXjm+h0qhFJ2ZO1aqBmr1zoyjpMu2oDxCX9i/SJ556/gaWWMrGGskkdWMVWMqfaLyv09i6OBZdzFzDhYk55GOTFLm131ih3tiTZwDzTncIjbCKfsu4ho6WHTUHkRz4ykPriSNxL/Oc9X55vIC/nDTQJhyZe+jDzGIonUr/+6Jledkk+K69B895cIyyxXiBrytHLc/crlbLn2/cPB3bcR1RfVPyqY3Lb3DIMxCyY32T1gMLBgXD5xDMYt2Fo+rTHY2oJt5NMGg20smCefPAzmWbCtfNpisK0F28mnnQvekvvMgu0smBRl77tst9ysPAvm2+NV02aoDqwjRKUELoWtBQOqRGarwThVJLP1YGruDNWX2ZIwNXqGSsxsVZhHJrd1YWr+DLUDs6VhSgKGOoLZ6jClAvNc4MsVdLLbAkEl0BZDgi0QVALt0EXQWSxKBuajSFshUDoAag+wJYI1NU6wFQIlA6A+AlshUDoAvqptiWBLjhNsiWBHj9OWCJQOgDoJbIn4imqd2wpxJQOgTuK2QhzIhnhnR+NkQ7xWqNq45Y4tjwEv9QYut+D7/dTV+bvZ1rft++TqbOWf201v4upJMTdRJ3WCeBcfeXsu0CSeJvEoEn3roON2Om6nkK4j9woi/hy/q4OADvZ1sN8E8+bTqz+lB6tPKQhOWr+INSUzGmENKWwbEqqy+/WOwcMMHjYcp3ADo5W7tKYi+2hf7EacISysmlaaIXNO8Kh7iPpNbhBxo4DNSOBQI2DwrAmeV1EG9VV3XN2F63CjCqp6FWxb1SQw5kiNURIgolhNGD3QJN1pmAzGFChDdRmaHzuaY605BgaZGZftOM9G81DCxu2REFEUDE3AHydoj94Gg9EJpwaqPdUnYAYBo/Yv3TxmS2MPgsESGgakC8MVQA2yN3wwnUDtmkV86jrQEI3tiLD26sMIM3ZLoIzXXlwYRRqrBtB1J98z5/gskjiVoP3hdvsfj8EsoBIcAAA="; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE62cUXPayg6A/wu8cnLi3fXa9I2TpD2ZpKEH0nZ6OxnGBSf1DeAcG5Lbdvrfr9cYLBlpbUNekoFoJa0+SSs7hl+dJH5JO2++/uo8RstZ541Wvc4yWISdN52HcDWYzZIwTd8Hq+n3q/BHp9dZJ/PsT/fr5XQVxcv0z32hk++rxTyTnM6DNA0z3Z3O7x6t/ixePAXLHzfZG3YThGALM2/X83m9japUCwOD6TReL1eXy/uYCVEpcKjf42mchA08z+VaGBkmD8Ey+hkYbXWGaNkWxs7DebSIVuHsbTTfBXoUPsXJirZoWdAmz+bxenYerIJvQdrIrGWB1axw9c5upSxG4b/rMC3tRctVmNwH0zD9k5a0GnJORbnDYLO+pepuuQyY6HWegiRcrvgNcE7MH+IkWn1ftHYDLHwVR54iWONNvdiuKl1YpbM/ovSPaPk9TEwKtnIJZgLRvSzZwEs3z4jpRscB6rvlUhqGZTOHZEadO/XZcYBDbIbUetMuSxq5BjOlegZZ0oQRbZ4j94WCtsq7YCFNhNtFaxxWN1qyqHcKgiil0qfsTCCDVJVpHvo0WjA7JnV2d/J0vPecZbvCrPlGuoV0s+g2diEJZ9GKPKoYL3YLjnZkj28+vVhKbE+oOeHnYL4OneZKu7sFFsTIX5th0dawON4wX8WM4Zb1a3OEI1tTu0iqRfWiAbleaXe7oD7CR9QvYbd9BTdzo6aGKU8OqWLOGUjbcn1gKez6VS2yIV4nUxJLQyvdnQY6PxpskQMVrMJseiKLsqlzQMeru5c+f0zmRzm31fDari2M8Fk8Xy+Wx/iH1by2k0l4H2ZKpuHxju6ren1nN3X8Nk6yqBzna0XTa7vKn2RNXWx5tLVytXH34w+/Bsua97/xKlitycOgqZnuTsUBJO1H1fvsGj14OCoI3VLH67uX94f5Os28Oi6EVU2v4SrMtEvj0884mllO1apMixtYbMWROqn6gtvcc7Z2T3yt7Am1uQlDj2u0yv1pjdnSwcMZZ5eYzZqaRne5zD3Tz3HyOI8DW5pQcs2D+pTEU+ZeJ6u4Wy5ibiFRrh8wVPEe1I5RbVzgR07egZohs1UE4uUyzO+Vt4wBXHe8G6vg27xlELZLXiMG3Mhl2791tmpjfjevtfMALjveiWX4ctueAVh1vAv/TdsmYbHieNNFx2pher/HHWjacv+aNd72zrXdHUvf549SUvA1Bk1ecd1oSfvefpi0eFA3PrZzoW5gtDnSaESsc8cvuVcPwnC5XmQeFG/bwYJ/k56fjy7GY5uWbinDOL11hbRwNnz/YXDzxWqhlDnEwuXN+eWny/OPg2urESTW2E4Z8TE+9zcmNm82jfaH4fj2XRZLXkkXiNA+Fm6Q+t9/Gf9TDQJUvv17e83jm+Hnt9eDqwuLdijT3sL54Hbw1+jy7MoWHSTU3sbg83gy+DgajgaTBiho6aOs1gEiRA+zNzofN91iRfRwe002B+UOt5Stn4wvRp8uRg3MIeH2Nt8Nh++uL3ItZ9fDj+dNwmpb8woe1AWaXXBARxmMLgfnf9l6yk7iYO2T8VVd46oKHmDr8mw0HA/f3jbLHkb8gJz9z8dRzsKWqkDmUAu11Yek2ls5G55djYaDs7+t2YClDrAy/mTTnv+1vdZbq9bbNlrLeeBD5V7IRnHxbtOJ4P3g9uzvyejiw3B0a9HUrcjRzm49Ii1dXXwZT4Y319VJDJmBQgfYeHdxQ2Q6slCKHKD/bHQxuL2YZDPAdXUQQUYqcjWW7nrZDD8L/9d586vznE3n5hbJm444kSf9TP4+Cucz84zuxomeebprYTTcFX/7FE5XcWIkNiJ/nnZ6X097yjmRnn931/u6XZH/IX8jF3OyVw4l5iAxkb0SlJhAYjJ7JSkxicRU9kpRYgqJudkrlxJzkZjOXmlKTCMxL3vlUWIeEvOzVz4l5iOxDMrXfk/qE+EhqT6Orgm2c0rIORUMOQenJ9wT4SssiUk4JuIOycLBMBwTdEdSxjEOR7FeYiCOy3uJmTgm9g7J2MFYHBN+h8TsYDKOz1vHcBxDwSFzwsGARA6ITAuBCYmckN+T4qR/6mLJSq3khPqkJCYkDAdBVqnAiIQBIchCFZiRMCAEXauYkdBsPAVmJAwIQRa2wIyEASFI7gIzEn0+npiRPGXjKTEjaUAIMpckZiTzhqZJnZWWljPySEnMSOaMyN4hMSOZM+qTkpiRNCAkmSESM5IGhCQzRGJGkq8jiRlJA0KSuSQxI2VASKrXKIxIGQ5SUYKYkDIYpEsJYkAqP3TIYleVY0exG1cYkDIUJNkWFAakNJvGCgNSHpvGCgNShoIkE0lhQCoHRJ1DCvNxT9ksdjEg12Erw8WEXMNBkbnpYkSu4aDI3HQxIjcfDciMcyvDgeGgyJ7kYkSu4aDInuRiRK7hoOiRAyNyDQdFJp2LEbl9NulczEgbEIpMOo0ZaYerNo0RacFVm8aEtOSqTWNAWrGJpDEg7TIjkq6Mb5obUzSmo3M6ZFloTEf7bA5rTEcbBIrsxBrT8QwCl8x2D9PxDAOXzHYP4/EMBJfMdg/z8QwFl8x2DwPyDAWXzHYPA/Ly+ZrMdg8j8gwIl8x2rzJkGxAuPWZjRp4B4ZI0PczIMyBckpGHGfkGhCYZ+ZiRb0BokpGPGfkGhCYZ+ZiRb0BokpGPGfkGhCYZ+ZiRb0BokpGPGfn5ZRDJyMeMfANCk4z8yrWQzx0vPkbkGw6avmzCiPo5IhJmHyPqGw4eCbOPEfUNB4+E2d8gyi+us6vqVTi73FxkZ5fJu8++/epMikvv/vYi/1enn/343etkzSr7/bu84DavjIVidf5452P4I9k+7FIq80tlPqek/GRTuS67EtstzC4TczeyCzFGw1P0aP6nC5Y7YLlTLHeL3/7mdzbf579l8VqpzW+3z5l5SSfBOomTYLL4kf47hwZdVRr0WD9LBU9xunrIYod0SKBDWnQks5TwQIPVumY1ad4FCljihYLM+CQNkyydkAoPqPA4FT/XSbjvvwYR9NkI5murK0HcfC5u5YNH5UIB3JWyoF8km+ZcmJp/DL8U/xgmMl6ClFdczleUbJ8VKLUo4Jo+5bTE08ckDqbfZ99QPABInwO5ecoOVAxwWxQVI4r6V1w6bZ/kAX6LUo3LhnD70UpgHjB0ChSaN5uvN/KW1uMAVxzBqiqfxQK7AN3HZZcmYZZTk+JZqnKxB3pP37J487Ah8Bc0XiGK3lRko+KKaZo+I/SgCfhs+NJnc78WFgKALzlqM/Mx8CSaPuKuAaLscbudbZ+3vY/mAJl53pYAJ0D+SucQlfv1JIGbkmvw5gOdm1vLgApwxuEobBfashG0N4cj8xAuq83NA6nY54LxEK6CzTcrRPlXL4B9g21bFuNzHCoA5rk2lCnI+9ms+J4ATANtBuSKRdl+eaNIgkDySiz5gQoGtFleWZUvylZQtQ01FJ+DA/0GHBm8jhh86wStB+Qq1/cf4vhhnh+hkxwaMUiAPuRxpbKnhpwoQFvxuKNw8+85EAuAxOUWZbLRczRbB3gpsKe5BIu2j3FTZzewrbh6AQqIPgNSXHEMNs9eAr8hN87vLO3SSbyco+TTcFjn6nMRJFFQGRFAWfs16ybp496sBmrQ54owT9EJUXLwmoDLr3zxdPeQHggwiJUqTknNodpo2RtSBIia5CCVPWOfsgPyxLFuIS9R6owDAITV/ULDvhMC9HbBZc1i+9QliCDsNsWkp7nWtYimSZzG9ytm4teg/fmskr0WA3bvcem3DF/2ZisFfHe5hk21IgWQa47Y7uMRIFhgnSrGYZ/rSuCxcmAZYHK5ZNut3E9WCWIluS1v8+O++CwgWA5KVXJZsneQCBBnwW03jRbVoxl0P8FxTZfxy/08eMQnF3DT4zrK9rMbwE9QiLLoBu42p1m/i2ehQZAAI7W9AOS82E9K4LvL1fKqMqiDSPkclu13IYD9AlOCGxW232QAlsEhhczBu17nKXrKZqZlJvT17vfv/wMp+2orEU0AAA=="; \ No newline at end of file diff --git a/docs/enums/Category.html b/docs/enums/Category.html new file mode 100644 index 0000000..28bd72c --- /dev/null +++ b/docs/enums/Category.html @@ -0,0 +1,110 @@ +Category | @interzoid/data-matching
+
+ +
+
+
+
+ +

Enumeration Category

+
+

Category

+
+
+
+
+
+ +
+
+

Enumeration Members

+
+
+

Enumeration Members

+
+ +
ADDRESS: "address"
+

Address

+
+
+
+ +
COMPANY: "company"
+

Company

+
+
+
+ +
INDIVIDUAL: "individual"
+

Individual

+
+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/Process.html b/docs/enums/Process.html new file mode 100644 index 0000000..e8815cd --- /dev/null +++ b/docs/enums/Process.html @@ -0,0 +1,123 @@ +Process | @interzoid/data-matching
+
+ +
+
+
+
+ +

Enumeration Process

+
+

The process defines the report or action that will occur with the dataset. + Process

+
+
+
+
+
+ +
+
+

Enumeration Members

+
+
+

Enumeration Members

+
+ +
CREATE_TABLE: "createtable"
+

will actually create a new table in the source database with all the similarity keys +for each record in the source table, so they can be used for additional queries.

+
+
+
+ +
GEN_SQL: "gensql"
+

similar to KEYS_ONLY, however it generates the SQL INSERT statements to store the +similarity keys in a database.

+
+
+
+ +
KEYS_ONLY: "keysonly"
+

outputs a generated similarity key for every record in the dataset.

+
+
+
+ +
MATCH_REPORT: "matchreport"
+

will generate a report of all found clusters of similar data.

+
+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/Source.html b/docs/enums/Source.html new file mode 100644 index 0000000..fad169e --- /dev/null +++ b/docs/enums/Source.html @@ -0,0 +1,267 @@ +Source | @interzoid/data-matching
+
+ +
+
+
+
+ +

Enumeration Source

+
+

Source

+
+
+
+
+
+ +
+
+

Enumeration Members

+
+ +
AWS_AURORA_MYSQL: "AWS Aurora MySQL"
+

AWS Aurora MySQL

+
+
+
+ +
AWS_AURORA_POSTGRES: "AWS Aurora Postgres"
+

AWS Aurora Postgres

+
+
+
+ +
AWS_RDS_MYSQL: "AWS RDS MySQL"
+

AWS RDS MySQL

+
+
+
+ +
AWS_RDS_POSTGRES: "AWS RDS Postgres"
+

AWS RDS Postgres

+
+
+
+ +
AWS_RDS_SQL_SERVER: "AWS RDS SQL Server"
+

AWS RDS SQL Server

+
+
+
+ +
AZURE_MYSQL: "Azure MySQL"
+

Azure MySQL

+
+
+
+ +
AZURE_SQL: "Azure SQL"
+

Azure SQL

+
+
+
+ +
COCKROACHDB: "CockroachDB"
+

CockroachDB

+
+
+
+ +
CSV: "CSV"
+

CSV File

+
+
+
+ +
DATABRICKS: "databricks"
+

Databricks

+
+
+
+ +
GOOGLE_SQL_CLOUD_MYSQL: "Google SQL CLoud MySQL"
+

Google SQL CLoud MySQL

+
+
+
+ +
GOOGLE_SQL_CLOUD_POSTGRES: "Google SQL Cloud Postgres"
+

Google SQL Cloud Postgres

+
+
+
+ +
MARIADB: "mariadb"
+

MariaDB

+
+
+
+ +
MARIADB_SKYSQL: "MariaDB SkySQL"
+

MariaDB SkySQL

+
+
+
+ +
MICROSOFT_SQL_SERVER: "Microsoft SQL Server"
+

Microsoft SQL Server

+
+
+
+ +
MYSQL: "mysql"
+

MySQL

+
+
+
+ +
POSTGRES: "Postgres"
+

Postgres

+
+
+
+ +
SNOWFLAKE: "snowflake"
+

Snowflake

+
+
+
+ +
TSV: "TSV"
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/getAccountInfo.html b/docs/functions/getAccountInfo.html index 273ffb3..0d7fdfd 100644 --- a/docs/functions/getAccountInfo.html +++ b/docs/functions/getAccountInfo.html @@ -35,7 +35,7 @@

Returns Promise<
+
  • Defined in api/AccountInfo.ts:10
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/functions/getAddressMatchKey.html b/docs/functions/getAddressMatchKey.html index bce1ea6..2cbff14 100644 --- a/docs/functions/getAddressMatchKey.html +++ b/docs/functions/getAddressMatchKey.html @@ -40,7 +40,7 @@

    Returns Promise<
    +
  • Defined in api/AddressMatchKey.ts:15
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/functions/getCloudDatabaseMatchKeyReport.html b/docs/functions/getCloudDatabaseMatchKeyReport.html new file mode 100644 index 0000000..9e0c308 --- /dev/null +++ b/docs/functions/getCloudDatabaseMatchKeyReport.html @@ -0,0 +1,72 @@ +getCloudDatabaseMatchKeyReport | @interzoid/data-matching
    +
    + +
    + +
    +

    Generated using TypeDoc

    +
    \ No newline at end of file diff --git a/docs/functions/getCompanyNameMatchKey.html b/docs/functions/getCompanyNameMatchKey.html index caa9813..6e9c739 100644 --- a/docs/functions/getCompanyNameMatchKey.html +++ b/docs/functions/getCompanyNameMatchKey.html @@ -41,7 +41,7 @@

    Returns Promise<
    +
  • Defined in api/CompanyNameMatchKey.ts:16
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/functions/getDelimitedFileMatchKeyReport.html b/docs/functions/getDelimitedFileMatchKeyReport.html new file mode 100644 index 0000000..b179978 --- /dev/null +++ b/docs/functions/getDelimitedFileMatchKeyReport.html @@ -0,0 +1,77 @@ +getDelimitedFileMatchKeyReport | @interzoid/data-matching
    +
    + +
    +
    +
    +
    + +

    Function getDelimitedFileMatchKeyReport

    +
    +
    +
    +
    +

    Generated using TypeDoc

    +
    \ No newline at end of file diff --git a/docs/functions/getFullNameMatchKey.html b/docs/functions/getFullNameMatchKey.html index 03cebde..272ee48 100644 --- a/docs/functions/getFullNameMatchKey.html +++ b/docs/functions/getFullNameMatchKey.html @@ -40,7 +40,7 @@

    Returns Promise<
    +
  • Defined in api/FullNameMatchKey.ts:15
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/functions/getFullNameMatchScore.html b/docs/functions/getFullNameMatchScore.html index 40440dc..807fa4c 100644 --- a/docs/functions/getFullNameMatchScore.html +++ b/docs/functions/getFullNameMatchScore.html @@ -35,7 +35,7 @@

    Returns Promise<
    +
  • Defined in api/FullNameMatchScore.ts:10
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/functions/getOrganizationMatchScore.html b/docs/functions/getOrganizationMatchScore.html index b8a8c2d..909474b 100644 --- a/docs/functions/getOrganizationMatchScore.html +++ b/docs/functions/getOrganizationMatchScore.html @@ -35,7 +35,7 @@

    Returns Promise<
    +
  • Defined in api/OrganizationMatchScore.ts:10
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index f0dddff..29a6a56 100644 --- a/docs/index.html +++ b/docs/index.html @@ -28,9 +28,18 @@

    @interzoid/data-matching

  • Organization Name Match Score
  • -
  • Interzoid Account Information (Remaining Credits)
  • +
  • Interzoid Cloud Data Connect
      +
    1. Introduction
    2. +
    3. Matching Processes
    4. +
    5. Connection Strings
    6. +
    7. Match and write results to a new table
    8. +
    9. Match Key Report for a delimited (CSV or TSV) text file
    10. +
    11. Delimited File Match Key Report
    12. +
    +
  • +
  • Interzoid Account Information (Remaining Credits)

  • API Key

    Please visit https://www.interzoid.com/register-api-account to register for an API key and receive free usage credits.

    @@ -42,7 +51,7 @@

    @interzoid/data-matching

    Data Matching APIs

    Interzoid uses algorithmically generated similarity keys leveraging Generative AI, Large Language Models (LLMs) and Machine Learning to intelligently match data within or across data sources.

    To learn more about the technology behind these APIs, please visit https://docs.interzoid.com/entries/understanding-data-matching

    Match Key Functions

    Full Name Match Key

    This API provides a hashed similarity key from the input data used to match with other similar full name data. Use the generated similarity key, rather than the actual data itself, to match and/or sort individual name data by similarity. This avoids the problems of data inconsistency, misspellings, and name variations when matching within a single dataset, and can also help matching across datasets or for more advanced searching.

    -
    import { getFullNameMatchKey } from 'interzoid';

    async function fullNameMatch() {
    const result = await getFullNameMatchKey({apiKey: 'your-interzoid-api-key', fullName: 'John Smith'});
    console.log('result');
    } +
    import { getFullNameMatchKey } from '@intezoid/data-matching';

    async function fullNameMatch() {
    const result = await getFullNameMatchKey({apiKey: 'your-interzoid-api-key', fullName: 'John Smith'});
    console.log('result');
    }
    Result
    {
    "simKey": "N1Ai4RfV0SRJf2dJwDO0Cvzh4xCgQG",
    "code": "Success",
    "credits": "9999"
    }
    @@ -56,7 +65,7 @@

    @interzoid/data-matching

  • Your business case will dictate which algorithm is ideal.
  • The default value for the optional algorithm parameter is wide.
  • -
    import { getCompanyNameMatchKey } from 'interzoid';

    async function companyNameMatch() {
    const result = await getCompanyNameMatchKey({apiKey: 'your-interzoid-api-key', company: 'Microsoft', algorithm: 'medium'});
    console.log(result);
    } +
    import { getCompanyNameMatchKey } from '@intezoid/data-matching';

    async function companyNameMatch() {
    const result = await getCompanyNameMatchKey({apiKey: 'your-interzoid-api-key', company: 'Microsoft', algorithm: 'medium'});
    console.log(result);
    }
    Result
    {
    "simKey": "cZdRqd6Ya6FBDPmFpn4_USiTu2DVoYO32ANw1Z5NYN0",
    "code": "Success",
    "credits": "9999"
    }
    @@ -68,29 +77,63 @@

    @interzoid/data-matching

  • wide parameter will not consider the unit numbers, generating matching similarity keys based on the primary address only.
  • The default value for the optional algorithm parameter is narrow.
  • -
    import { getAddressMatchKey } from 'interzoid';

    async function addressMatch() {
    const result = await getAddressMatchKey({apiKey: 'your-interzoid-api-key', address: '500 main street', algorithm: 'narrow'});
    console.log(result);
    } +
    import { getAddressMatchKey } from '@intezoid/data-matching';

    async function addressMatch() {
    const result = await getAddressMatchKey({apiKey: 'your-interzoid-api-key', address: '500 main street', algorithm: 'narrow'});
    console.log(result);
    }
    Result
    {
    "simKey": "T8O0ROaEgJIFhqcgg7SyCBjRryRVa43oMO2sMlq9r0s",
    "code": "Success",
    "credits": "9999"
    }

    Match Score Functions

    We provide 2 operations for match scoring: Organization name and Full name. The request params for these operations are identical--provide 2 values and the API returns a matching score.

    Full Name Match Score

    This API provides a match score (likelihood of matching) between two individual names on a scale of 0-100, where 100 is the highest possible match.

    -
    import { getFullNameMatchScore } from 'interzoid';

    async function fullNameMatchScore() {
    const result = await getFullNameMatchScore({apiKey: 'your-interzoid-api-key', value1: 'John Smith', value2: 'John Smyth'});
    console.log(result);
    } +
    import { getFullNameMatchScore } from '@intezoid/data-matching';

    async function fullNameMatchScore() {
    const result = await getFullNameMatchScore({apiKey: 'your-interzoid-api-key', value1: 'John Smith', value2: 'John Smyth'});
    console.log(result);
    }
    Result
    {
    "score": "80",
    "code": "Success",
    "credits": "9999"
    }

    Organization Name Match Score

    This API provides a match score (likelihood of matching) from 0-100 between two organization names.

    -
    import { getOrganizationMatchScore } from 'interzoid';

    async function organizationNameMatchScore() {
    const result = await getOrganizationNameMatchScore({apiKey: 'your-interzoid-api-key', value1: 'Apple', value2: 'Apple Inc.'});
    console.log(result);
    } +
    import { getOrganizationMatchScore } from '@intezoid/data-matching';

    async function organizationNameMatchScore() {
    const result = await getOrganizationNameMatchScore({apiKey: 'your-interzoid-api-key', value1: 'Apple', value2: 'Apple Inc.'});
    console.log(result);
    }
    Result
    {
    "score": "95",
    "code": "Success",
    "credits": "9998"
    }

    -

    Account Information

    This API retrieves the current amount of remaining purchased (or trial) credits for a license key.

    +

    Cloud Data Connect

    Introduction

    Interzoid's Cloud Data Connect is a set of functions that allow you to match data in your cloud database with Interzoid's data matching algorithms.

    +

    Matching Processes

    The process parameter determines the type of matching process to run. The package provides an enum called Process that contains the available options.

    +

    The options are:

    +
      +
    • Process.MATCH_REPORT - returns a match key report for the data in the table
    • +
    • Process.CREATE_TABLE - creates a new table with the source data and similarity keys
    • +
    • Process.GEN_SQL - generates SQL statements to insert the source data and similarity keys
    • +
    • Process.KEYS_ONLY - returns only the similarity keys for the data in the table
    • +
    +

    Connection Strings

    The connection parameter is a connection string for your database. The format of the connection string depends on the database you're connecting to. Please see this page for examples of connection strings for various databases.

    +

    Match and write results to a new table

    Set the process parameter to CREATE_TABLE to create a new table in your database with the match keys. The newTable parameter is the name of the new table to create. This table will be created by the process, and will contain the original data and the similarity key.

    +

    Don't create the table yourself, the process will create it for you.

    +

    You'll have to grant the user you're connecting with the ability to create a new table in the database in addition to the ability to read from the table you're matching.

    +
    import { Category, getCloudDatabaseMatchKeyReport, Process, Source } from '@intezoid/data-matching';

    async function databaseMatchKeyReport() {
    const result = await getCloudDatabaseMatchKeyReport({
    apiKey: 'your-interzoid-api-key',
    process: Process.CREATE_TABLE,
    category: Category.COMPANY,
    source: Source.MYSQL,
    connection: 'db_user:db_password@tcp(db_host)/database',
    table: 'companies', // table to match
    column: 'companyname', // column to match
    reference: 'id', // optional reference column
    newTable: 'companies_match_keys' // new table to create
    });
    console.log(result);
    } +
    +

    Response

    "Creating new table...Table companies_match_keys created successfully."
    +
    +
    +

    Match Key Report for a cloud database table

    Response options

      +
    • Set json to true to return a JSON object with arrays of match clusters.
    • +
    • Set html to true to return results in plain text with clusters separated by html <br> tags.
    • +
    • Don't set either to return results in plain text with clusters separated by newlines.
    • +
    +
    import { getCloudDatabaseMatchKeyReport, Source, Process, Category } from '@intezoid/data-matching';

    async function databaseMatchKeyReport() {
    const result = await getCloudDatabaseMatchKeyReport({
    apiKey: 'your-interzoid-api-key',
    process: Process.MATCH_REPORT,
    category: Category.COMPANY,
    source: Source.MYSQL,
    connection: 'db_user:db_password@tcp(db_host)/database',
    table: 'companies',
    column: 'companyname',
    reference: 'id',
    json: true,
    });
    console.log(JSON.stringify(result, null, 2));
    } +
    +

    Sample Response

    {
    "Status": "success",
    "Message": "",
    "MatchClusters": [
    [
    {
    "Data": "Cisco",
    "Reference": "",
    "SimKey": "3AmCGk2yvEJ7XUxUmB3dFHxRiVzy4Squ89J-4_lDrxQ"
    },
    {
    "Data": "Cisco Systems",
    "Reference": "30",
    "SimKey": "3AmCGk2yvEJ7XUxUmB3dFHxRiVzy4Squ89J-4_lDrxQ"
    }
    ],
    [
    {
    "Data": "Netflix",
    "Reference": "15",
    "SimKey": "8c6BY0KP9MYiDezQaKL3bH3iHfDU2wCMMTD9v0EeZJ8"
    },
    {
    "Data": "\"Netflix, Inc.\"",
    "Reference": "34",
    "SimKey": "8c6BY0KP9MYiDezQaKL3bH3iHfDU2wCMMTD9v0EeZJ8"
    }
    ]
    ]
    } +
    +
    +

    Delimited File Match Key Report

    Provide a URL to a delimited file (CSV or TSV) and the API will return a match key report for the data in the file.

    +
    import { getDelimitedFileMatchKeyReport, Process, Source } from '@intezoid/data-matching';

    async function csvdFileMatchReport() {
    const result = await getDelimitedFileMatchKeyReport({
    apiKey: 'your-interzoid-api-key',
    category: 'company',
    source: Source.CSV,
    connection: 'https://dl.interzoid.com/csv/companies.csv',
    table: Source.CSV,
    column: '1', // column number to match
    process: Process.MATCH_REPORT,
    json: true,
    });
    console.log(JSON.stringify(result, null, 2));
    }
    +
    +

    Result

    {
    "Status": "success",
    "Message": "",
    "MatchClusters": [
    [
    {
    "Data": "Good Year Tire & Rubber",
    "Reference": "",
    "SimKey": "140xAiUxvDysV56LZzogzDwLuYLd2U7E5sVAXd1nKd8"
    },
    {
    "Data": "Goodyear Tire Inc",
    "Reference": "Transportaions",
    "SimKey": "140xAiUxvDysV56LZzogzDwLuYLd2U7E5sVAXd1nKd8"
    }
    ],
    [
    {
    "Data": "Pederson Tooling Inc.",
    "Reference": "Transportaions",
    "SimKey": "7oOMieCdoyxjt7_oKbE2xGngnZGdG75CFU5pEfhU5z8"
    },
    {
    "Data": "Peterson Tools",
    "Reference": "Services",
    "SimKey": "7oOMieCdoyxjt7_oKbE2xGngnZGdG75CFU5pEfhU5z8"
    }
    ]
    ]
    } +
    +
    +

    Account Information

    This API retrieves the current amount of remaining purchased (or trial) credits for a license key.

    Using this function does not deduct credits from your account.

    -
    import { getRemainingCredits } from 'interzoid';

    async function remainingCredits() {
    const result = getRemainingCredits({apiKey: 'your-interzoid-api-key'});
    console.log(result);
    } +
    import { getRemainingCredits } from '@intezoid/data-matching';

    async function remainingCredits() {
    const result = getRemainingCredits({apiKey: 'your-interzoid-api-key'});
    console.log(result);
    }
    -
    Result
    {
    "credits": "9998",
    "code": "Success"
    } +

    Result

    {
    "credits": "9998",
    "code": "Success"
    }
    +
  • Result
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/AddressMatchKeyRequest.html b/docs/interfaces/AddressMatchKeyRequest.html index 685c551..74380e3 100644 --- a/docs/interfaces/AddressMatchKeyRequest.html +++ b/docs/interfaces/AddressMatchKeyRequest.html @@ -27,7 +27,7 @@

    Hierarchy

    • AddressMatchKeyRequest
    +
  • Defined in interfaces/AddressMatchKeyRequest.ts:10
  • @@ -48,7 +48,7 @@
    +
  • Defined in interfaces/AddressMatchKeyRequest.ts:11
  • algorithm?: "wide" | "narrow"
    @@ -56,7 +56,7 @@
    +
  • Defined in interfaces/AddressMatchKeyRequest.ts:12
  • apiKey: string
    @@ -65,7 +65,7 @@
    +
  • Defined in interfaces/InterzoidRequest.ts:7
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/CloudWorkloadRequest.html b/docs/interfaces/CloudWorkloadRequest.html new file mode 100644 index 0000000..d5abdd8 --- /dev/null +++ b/docs/interfaces/CloudWorkloadRequest.html @@ -0,0 +1,198 @@ +CloudWorkloadRequest | @interzoid/data-matching
    +
    + +
    +
    +
    +
    + +

    Interface CloudWorkloadRequest

    +
    +

    CloudDatasetMatchRequest represents the request to the Cloud Data Matching API. + CloudWorkloadRequest

    +
    +
    +
    +

    Hierarchy

    +
    +
    +
    +
    + +
    +
    +

    Properties

    +
    + +
    apiKey: string
    +

    The API key to use for the request

    +
    +
    +
    + +
    category: Category
    +

    This category type indicates which set of Machine Learning and matching algorithms to make use of based on type of data content.

    +
    +
    +
    + +
    column: string
    +

    Column name within the table to access the source data. This is a number for CSV or TSV files, starting with number 1 from the left side of the file.

    +
    +
    +
    + +
    connection: string
    +

    Connection string to access database, or in the case of a CSV or TSV file, use the full URL of the location of the file.

    +
    +
    +
    + +
    html?: boolean
    +

    Set to 'true' to pad line breaks into the output results for better readability ina browser when run from the address bar.

    +
    +
    +
    + +
    json?: boolean
    +

    If true, the output will be in JSON format.

    +
    +
    +
    + +
    newTable?: string
    +

    The name of the new table if the output results are written to a new table. Required if process is CREATE_TABLE.

    +
    +
    +
    + +
    process: Process
    +

    Process to perform

    +
    +
    +
    + +
    reference?: string
    +

    An additional column from the source table to display in the output results, such as a primary key.

    +
    +
    +
    + +
    source: Source
    +

    Source of data, such as 'MySQL', 'Snowflake', 'Postgres', etc.

    +
    +
    +
    + +
    table: string
    +

    Table name to access the source data. Use "CSV" or "TSV" for delimited text files.

    +
    +
    +
    +
    +

    Generated using TypeDoc

    +
    \ No newline at end of file diff --git a/docs/interfaces/CloudWorkloadResponse.html b/docs/interfaces/CloudWorkloadResponse.html new file mode 100644 index 0000000..d73202d --- /dev/null +++ b/docs/interfaces/CloudWorkloadResponse.html @@ -0,0 +1,101 @@ +CloudWorkloadResponse | @interzoid/data-matching
    +
    + +
    +
    +
    +
    + +

    Interface CloudWorkloadResponse

    +
    +

    Hierarchy

    +
      +
    • CloudWorkloadResponse
    +
    +
    +
    + +
    +
    +

    Properties

    +
    +
    +

    Properties

    +
    + +
    MatchClusters?: MatchCluster[]
    +
    + +
    Message: string
    +
    + +
    Status: string
    +
    +
    +

    Generated using TypeDoc

    +
    \ No newline at end of file diff --git a/docs/interfaces/CompanyNameMatchKeyRequest.html b/docs/interfaces/CompanyNameMatchKeyRequest.html index 14d3eb1..3fbd341 100644 --- a/docs/interfaces/CompanyNameMatchKeyRequest.html +++ b/docs/interfaces/CompanyNameMatchKeyRequest.html @@ -27,7 +27,7 @@

    Hierarchy

    • CompanyNameMatchKeyRequest
    +
  • Defined in interfaces/CompanyNameMatchKeyRequest.ts:10
  • @@ -48,7 +48,7 @@
    +
  • Defined in interfaces/CompanyNameMatchKeyRequest.ts:12
  • apiKey: string
    @@ -57,7 +57,7 @@
    +
  • Defined in interfaces/InterzoidRequest.ts:7
  • company: string
    @@ -65,7 +65,7 @@
    +
  • Defined in interfaces/CompanyNameMatchKeyRequest.ts:11
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/DelimitedFileMatchKeyReportRequest.html b/docs/interfaces/DelimitedFileMatchKeyReportRequest.html new file mode 100644 index 0000000..ddf1834 --- /dev/null +++ b/docs/interfaces/DelimitedFileMatchKeyReportRequest.html @@ -0,0 +1,158 @@ +DelimitedFileMatchKeyReportRequest | @interzoid/data-matching
    +
    + +
    +
    +
    +
    + +

    Interface DelimitedFileMatchKeyReportRequest

    +
    +

    CsvMatchKeyReportRequest represents the request to the CSV or TSV Match Key Report API. + DelimitedFileMatchKeyReportRequest

    +
    +
    +
    +

    Hierarchy

    +
    +
    +
    +
    + +
    +
    +

    Properties

    +
    + +
    apiKey: string
    +

    The API key to use for the request

    +
    +
    +
    + +
    category: Category
    +

    This category type indicates which set of Machine Learning and matching algorithms to make use of based on type of data content.

    +
    +
    +
    + +
    csvUrl: string
    +

    The full URL of the location of the CSV file.

    +
    +
    +
    + +
    matchColumn: number
    +

    The column number of the CSV file to match against.

    +
    +
    +
    + +
    referenceColumn?: number
    +

    An additional column from the source table to display in the output results, such as a primary key.

    +
    +
    +
    + +
    responseFormat?: "json" | "text" | "html"
    +

    The format of the response. If not specified, defaults to 'text'.

    +
    +
    +
    + +
    source: CSV | TSV
    +

    The source type of the data.

    +
    +
    +
    +
    +

    Generated using TypeDoc

    +
    \ No newline at end of file diff --git a/docs/interfaces/DelimitedFileMatchKeyReportResponse.html b/docs/interfaces/DelimitedFileMatchKeyReportResponse.html new file mode 100644 index 0000000..f55516d --- /dev/null +++ b/docs/interfaces/DelimitedFileMatchKeyReportResponse.html @@ -0,0 +1,115 @@ +DelimitedFileMatchKeyReportResponse | @interzoid/data-matching
    +
    + +
    +
    +
    +
    + +

    Interface DelimitedFileMatchKeyReportResponse

    +
    +

    CsvMatchKeyReportResponse represents the response from the CSV Match Key Report API. + DelimitedFileMatchKeyReportResponse

    +
    +
    +
    +

    Hierarchy

    +
      +
    • DelimitedFileMatchKeyReportResponse
    +
    +
    +
    + +
    +
    +

    Properties

    +
    +
    +

    Properties

    +
    + +
    MatchClusters: MatchCluster[]
    +

    The match clusters

    +
    +
    +
    + +
    Message: string
    +

    The response message

    +
    +
    +
    + +
    Status: string
    +

    The response code

    +
    +
    +
    +
    +

    Generated using TypeDoc

    +
    \ No newline at end of file diff --git a/docs/interfaces/FullNameMatchKeyRequest.html b/docs/interfaces/FullNameMatchKeyRequest.html index 059a356..2c0cde4 100644 --- a/docs/interfaces/FullNameMatchKeyRequest.html +++ b/docs/interfaces/FullNameMatchKeyRequest.html @@ -27,7 +27,7 @@

    Hierarchy

    • FullNameMatchKeyRequest
    +
  • Defined in interfaces/FullNameMatchKeyRequest.ts:10
  • @@ -48,7 +48,7 @@
    +
  • Defined in interfaces/InterzoidRequest.ts:7
  • fullName: string
    @@ -56,7 +56,7 @@
    +
  • Defined in interfaces/FullNameMatchKeyRequest.ts:11
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/InterzoidRequest.html b/docs/interfaces/InterzoidRequest.html index a3b2a95..c21e347 100644 --- a/docs/interfaces/InterzoidRequest.html +++ b/docs/interfaces/InterzoidRequest.html @@ -28,9 +28,11 @@

    Hierarchy

  • AddressMatchKeyRequest
  • CompanyNameMatchKeyRequest
  • FullNameMatchKeyRequest
  • -
  • MatchScoreRequest
  • @@ -49,7 +51,7 @@
    +
  • Defined in interfaces/InterzoidRequest.ts:7
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/InterzoidResponse.html b/docs/interfaces/InterzoidResponse.html index 8054630..87d23b7 100644 --- a/docs/interfaces/InterzoidResponse.html +++ b/docs/interfaces/InterzoidResponse.html @@ -28,7 +28,7 @@

    Hierarchy

  • MatchKeyResponse
  • MatchScoreResponse
  • +
  • Defined in interfaces/InterzoidResponse.ts:7
  • @@ -48,7 +48,7 @@
    +
  • Defined in interfaces/InterzoidResponse.ts:8
  • credits: string
    @@ -56,7 +56,7 @@
    +
  • Defined in interfaces/InterzoidResponse.ts:9
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/MatchKeyResponse.html b/docs/interfaces/MatchKeyResponse.html index e121158..884bc6d 100644 --- a/docs/interfaces/MatchKeyResponse.html +++ b/docs/interfaces/MatchKeyResponse.html @@ -27,7 +27,7 @@

    Hierarchy

    • MatchKeyResponse
    +
  • Defined in interfaces/MatchKeyResponse.ts:9
  • @@ -49,7 +49,7 @@
    +
  • Defined in interfaces/InterzoidResponse.ts:8
  • credits: string
    @@ -58,7 +58,7 @@
    +
  • Defined in interfaces/InterzoidResponse.ts:9
  • simKey: string
    @@ -66,7 +66,7 @@
    +
  • Defined in interfaces/MatchKeyResponse.ts:10
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/MatchScoreRequest.html b/docs/interfaces/MatchScoreRequest.html index 11e5703..22f53e4 100644 --- a/docs/interfaces/MatchScoreRequest.html +++ b/docs/interfaces/MatchScoreRequest.html @@ -27,7 +27,7 @@

    Hierarchy

    • MatchScoreRequest
    +
  • Defined in interfaces/MatchScoreRequest.ts:9
  • @@ -49,7 +49,7 @@
    +
  • Defined in interfaces/InterzoidRequest.ts:7
  • value1: string
    @@ -57,12 +57,12 @@
    +
  • Defined in interfaces/MatchScoreRequest.ts:10
  • value2: string
    +
  • Defined in interfaces/MatchScoreRequest.ts:11
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/MatchScoreResponse.html b/docs/interfaces/MatchScoreResponse.html index c90cce7..b4624f8 100644 --- a/docs/interfaces/MatchScoreResponse.html +++ b/docs/interfaces/MatchScoreResponse.html @@ -27,7 +27,7 @@

    Hierarchy

    • MatchScoreResponse
    +
  • Defined in interfaces/MatchScoreResponse.ts:9
  • @@ -49,7 +49,7 @@
    +
  • Defined in interfaces/InterzoidResponse.ts:8
  • credits: string
    @@ -58,7 +58,7 @@
    +
  • Defined in interfaces/InterzoidResponse.ts:9
  • score: string
    @@ -66,7 +66,7 @@
    +
  • Defined in interfaces/MatchScoreResponse.ts:10
  • +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index 17039a1..d467ebc 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -16,9 +16,19 @@

    @interzoid/data-matching

    Index

    +

    Enumerations

    +
    +

    Interfaces

    AddressMatchKeyRequest +CloudWorkloadRequest +CloudWorkloadResponse CompanyNameMatchKeyRequest +DelimitedFileMatchKeyReportRequest +DelimitedFileMatchKeyReportResponse FullNameMatchKeyRequest InterzoidRequest InterzoidResponse @@ -30,7 +40,9 @@

    Interfaces

    Functions

    getAccountInfo getAddressMatchKey +getCloudDatabaseMatchKeyReport getCompanyNameMatchKey +getDelimitedFileMatchKeyReport getFullNameMatchKey getFullNameMatchScore getOrganizationMatchScore @@ -53,8 +65,15 @@

    Theme

    +
  • Loading...
  • Generated using TypeDoc

    \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 393b97c..7eec25c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,24 @@ { "name": "@interzoid/data-matching", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@interzoid/data-matching", - "version": "1.0.0", + "version": "1.1.0", + "license": "MIT", "dependencies": { "axios": "^1.5.0", "qs": "^6.11.2" }, "devDependencies": { - "@types/jest": "^29.5.4", + "@types/jest": "^29.5.5", "@types/qs": "^6.9.8", - "@typescript-eslint/eslint-plugin": "^6.5.0", - "@typescript-eslint/parser": "^6.5.0", - "eslint": "^8.48.0", - "jest": "^29.6.4", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "eslint": "^8.50.0", + "jest": "^29.7.0", "prettier": "^3.0.2", "ts-jest": "^29.1.1", "typedoc": "^0.25.1", @@ -749,9 +750,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -899,16 +900,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -916,15 +917,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -932,21 +933,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -963,37 +964,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1003,47 +1004,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1057,9 +1058,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1104,12 +1105,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1119,14 +1120,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1134,9 +1135,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1147,9 +1148,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1325,9 +1326,9 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", + "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", "dev": true, "dependencies": { "@types/node": "*" @@ -1358,9 +1359,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", - "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", + "version": "29.5.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", + "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1368,9 +1369,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/node": { @@ -1386,9 +1387,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", "dev": true }, "node_modules/@types/stack-utils": { @@ -1413,16 +1414,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", - "integrity": "sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/type-utils": "6.6.0", - "@typescript-eslint/utils": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1448,15 +1449,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.6.0.tgz", - "integrity": "sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4" }, "engines": { @@ -1476,13 +1477,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", - "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0" + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1493,13 +1494,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz", - "integrity": "sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/utils": "6.6.0", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1520,9 +1521,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1533,13 +1534,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", - "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1560,17 +1561,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.6.0.tgz", - "integrity": "sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", "semver": "^7.5.4" }, "engines": { @@ -1585,12 +1586,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", - "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/types": "6.7.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1739,12 +1740,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2108,6 +2109,27 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2273,15 +2295,15 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", + "@eslint/js": "8.50.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -2459,16 +2481,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3073,15 +3095,15 @@ } }, "node_modules/jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", + "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.4" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -3099,13 +3121,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -3113,28 +3135,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3144,22 +3166,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -3178,31 +3199,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3223,24 +3244,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -3250,33 +3271,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3292,9 +3313,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -3304,8 +3325,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3317,37 +3338,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -3356,7 +3377,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3365,14 +3386,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3405,17 +3426,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3425,43 +3446,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3470,17 +3491,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -3488,13 +3509,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3503,9 +3524,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -3513,20 +3534,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -3534,9 +3555,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -3551,9 +3572,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -3561,7 +3582,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3580,18 +3601,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -3599,13 +3620,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4219,9 +4240,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -4337,9 +4358,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -5607,9 +5628,9 @@ } }, "@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true }, "@humanwhocodes/config-array": { @@ -5719,29 +5740,29 @@ "dev": true }, "@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "requires": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -5749,92 +5770,92 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "requires": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" } }, "@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "requires": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" } }, "@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "requires": { "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "requires": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" } }, "@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -5848,9 +5869,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -5878,33 +5899,33 @@ } }, "@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "requires": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "requires": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -5915,9 +5936,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -6069,9 +6090,9 @@ } }, "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", + "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", "dev": true, "requires": { "@types/node": "*" @@ -6102,9 +6123,9 @@ } }, "@types/jest": { - "version": "29.5.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", - "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", + "version": "29.5.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", + "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", "dev": true, "requires": { "expect": "^29.0.0", @@ -6112,9 +6133,9 @@ } }, "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "@types/node": { @@ -6130,9 +6151,9 @@ "dev": true }, "@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", "dev": true }, "@types/stack-utils": { @@ -6157,16 +6178,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", - "integrity": "sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/type-utils": "6.6.0", - "@typescript-eslint/utils": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -6176,54 +6197,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.6.0.tgz", - "integrity": "sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", - "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0" + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" } }, "@typescript-eslint/type-utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz", - "integrity": "sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/utils": "6.6.0", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", - "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6232,27 +6253,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.6.0.tgz", - "integrity": "sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", - "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/types": "6.7.2", "eslint-visitor-keys": "^3.4.1" } }, @@ -6357,12 +6378,12 @@ } }, "babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "requires": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -6621,6 +6642,21 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -6735,15 +6771,15 @@ "dev": true }, "eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", + "@eslint/js": "8.50.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -6866,16 +6902,16 @@ "dev": true }, "expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "requires": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" } }, "fast-deep-equal": { @@ -7311,152 +7347,151 @@ } }, "jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "requires": { - "@jest/core": "^29.6.4", + "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.4" + "jest-cli": "^29.7.0" } }, "jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "requires": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "requires": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "requires": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" } }, "jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } }, "jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" } }, "jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "requires": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" } }, "jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "requires": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "jest-get-type": { @@ -7466,9 +7501,9 @@ "dev": true }, "jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -7479,38 +7514,38 @@ "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "requires": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" } }, "jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" } }, "jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", @@ -7519,20 +7554,20 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" } }, "jest-pnp-resolver": { @@ -7549,73 +7584,73 @@ "dev": true }, "jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "requires": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" } }, "jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "requires": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "requires": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -7623,21 +7658,21 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -7645,27 +7680,27 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" } }, "jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -7677,9 +7712,9 @@ } }, "jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -7687,7 +7722,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "dependencies": { "camelcase": { @@ -7699,29 +7734,29 @@ } }, "jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "requires": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -8177,9 +8212,9 @@ "dev": true }, "pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { "@jest/schemas": "^29.6.3", @@ -8249,9 +8284,9 @@ "dev": true }, "resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dev": true, "requires": { "is-core-module": "^2.13.0", diff --git a/package.json b/package.json index ac7055f..f36e76a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@interzoid/data-matching", - "version": "1.0.2", + "version": "1.1.0", "author": "Interzoid, Inc. https://interzoid.com", "description": "Interzoid SDK for Typescript, Generative-AI powered data matching, data quality, and data normalization for organization and individual name data", "keywords": [ @@ -19,7 +19,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "build": "tsc", + "build": "rm -rf dist && tsc", "test": "jest", "lint": "eslint 'src/**/*.ts'", "lint:fix": "eslint 'src/**/*.ts' --fix", @@ -30,12 +30,12 @@ "qs": "^6.11.2" }, "devDependencies": { - "@types/jest": "^29.5.4", + "@types/jest": "^29.5.5", "@types/qs": "^6.9.8", - "@typescript-eslint/eslint-plugin": "^6.5.0", - "@typescript-eslint/parser": "^6.5.0", - "eslint": "^8.48.0", - "jest": "^29.6.4", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "eslint": "^8.50.0", + "jest": "^29.7.0", "prettier": "^3.0.2", "ts-jest": "^29.1.1", "typedoc": "^0.25.1", diff --git a/src/api/AccountInfo.ts b/src/api/AccountInfo.ts index 33d4d0a..860765f 100644 --- a/src/api/AccountInfo.ts +++ b/src/api/AccountInfo.ts @@ -10,5 +10,5 @@ import { InterzoidRequest } from '../interfaces/InterzoidRequest'; export async function getAccountInfo( request: InterzoidRequest, ): Promise { - return InterzoidApi.doGetRequest('getremainingcredits', request.apiKey); + return InterzoidApi.doApiGetRequest('getremainingcredits', request.apiKey); } diff --git a/src/api/AddressMatchKey.ts b/src/api/AddressMatchKey.ts index a3be158..2d0616c 100644 --- a/src/api/AddressMatchKey.ts +++ b/src/api/AddressMatchKey.ts @@ -23,7 +23,7 @@ export async function getAddressMatchKey( const algorithm = request.algorithm || 'narrow'; const resource = 'getaddressmatchadvanced'; - const resp = await InterzoidApi.doGetRequest(resource, request.apiKey, { + const resp = await InterzoidApi.doApiGetRequest(resource, request.apiKey, { address: request.address, algorithm: algorithm, }); diff --git a/src/api/CloudDatabaseMatchKeyReport.ts b/src/api/CloudDatabaseMatchKeyReport.ts new file mode 100644 index 0000000..dec4b2c --- /dev/null +++ b/src/api/CloudDatabaseMatchKeyReport.ts @@ -0,0 +1,148 @@ +import { CloudWorkloadRequest } from '../interfaces/CloudWorkloadRequest'; +import { InterzoidApi } from './InterzoidApi'; +import { CloudWorkloadResponse } from '../interfaces/CloudWorkloadResponse'; +import { Category } from '../interfaces/Category'; +import { Process } from '../interfaces/Process'; +import { Source } from '../interfaces/Source'; + +/** + * This API calculates similarity keys for data in a cloud connected database. + * + * @param {CloudWorkloadRequest} request - Request object + * @returns {Promise} - Response object + */ +export async function getCloudDatabaseMatchKeyReport( + request: CloudWorkloadRequest, +) { + const validationResult = isValidRequest(request); + if (!validationResult.isValid) { + throw new Error(validationResult.errors.join(' ')); + } + + const params = { + function: 'match', + process: request.process ?? Process.MATCH_REPORT, + table: request.table, + source: request.source, + connection: request.connection, + category: request.category, + column: request.column, + reference: request.reference, + json: request.json, + html: request.html, + newtable: request.newTable, + apikey: request.apiKey, + }; + + const response = await InterzoidApi.doCloudConnectRequest(params); + return response as CloudWorkloadResponse; +} + +function isValidRequest(obj: any): { + isValid: boolean; + errors: string[]; +} { + let isValid = true; + const errors: string[] = []; + + // Validate apiKey + if (!obj?.apiKey || typeof obj.apiKey !== 'string') { + isValid = false; + errors.push("Invalid 'apiKey'."); + } + + // Validate process + if ( + !obj?.process || + !Object.values(Process).includes(obj.process as Process) + ) { + isValid = false; + errors.push( + `Invalid 'process'. It must be one of the following: ${Object.values( + Process, + ).join(', ')}`, + ); + } else { + if (obj.process === Process.CREATE_TABLE && !obj.newTable) { + isValid = false; + errors.push( + "Invalid 'newTable'. It is required when process is CREATE_TABLE.", + ); + } + } + + // Validate category + if ( + !obj?.category || + !Object.values(Category).includes(obj.category as Category) + ) { + isValid = false; + errors.push( + `Invalid 'category'. It must be one of the following: ${Object.values( + Category, + ).join(', ')}`, + ); + } + + // Validate connection + if (!obj?.connection || typeof obj.connection !== 'string') { + isValid = false; + errors.push("Invalid 'connection'. Must be a string."); + } + + // Validate source + if (!obj?.source || !Object.values(Source).includes(obj.source as Source)) { + isValid = false; + errors.push( + `Invalid 'source'. It must be one of the following: ${Object.values( + Source, + ).join(', ')}`, + ); + } + + // Validate table + if (!obj?.table || typeof obj.table !== 'string') { + isValid = false; + errors.push("Invalid 'table'. Must be a string."); + } + + // Validate column + if (!obj?.column || typeof obj.column !== 'string') { + isValid = false; + errors.push("Invalid 'column'. Must be a string."); + } + + // Validate reference + if (obj?.reference && typeof obj.reference !== 'string') { + isValid = false; + errors.push("Invalid 'reference'. Must be a string."); + } + + // Validate newTable + if (obj?.newTable && typeof obj.newTable !== 'string') { + isValid = false; + errors.push("Invalid 'newTable'. Must be a string."); + } + + // Validate process is CREATE_TABLE when newTable is provided + if (obj?.newTable && obj.process !== Process.CREATE_TABLE) { + isValid = false; + errors.push( + "Invalid 'newTable'. It is only valid when process is CREATE_TABLE.", + ); + } + + // Validate json + if (obj?.json && typeof obj.json !== 'boolean') { + isValid = false; + errors.push("Invalid 'json'. Must be a boolean."); + } + + // Validate html + if (obj?.html && typeof obj.html !== 'boolean') { + isValid = false; + errors.push("Invalid 'html'. Must be a boolean."); + } + + return { isValid, errors }; +} diff --git a/src/api/CompanyNameMatchKey.ts b/src/api/CompanyNameMatchKey.ts index 8638535..b554e5b 100644 --- a/src/api/CompanyNameMatchKey.ts +++ b/src/api/CompanyNameMatchKey.ts @@ -24,7 +24,7 @@ export async function getCompanyNameMatchKey( const resource = 'getcompanymatchadvanced'; const algorithm = request.algorithm || 'wide'; - const resp = await InterzoidApi.doGetRequest(resource, request.apiKey, { + const resp = await InterzoidApi.doApiGetRequest(resource, request.apiKey, { company: request.company, algorithm: algorithm, }); diff --git a/src/api/DelimitedFileMatchKeyReport.ts b/src/api/DelimitedFileMatchKeyReport.ts new file mode 100644 index 0000000..40b3c91 --- /dev/null +++ b/src/api/DelimitedFileMatchKeyReport.ts @@ -0,0 +1,108 @@ +import { DelimitedFileMatchKeyReportRequest } from '../interfaces/DelimitedFileMatchKeyReportRequest'; +import { InterzoidApi } from './InterzoidApi'; +import { DelimitedFileMatchKeyReportResponse } from '../interfaces/DelimitedFileMatchKeyReportResponse'; +import { Source } from '../interfaces/Source'; +import { Process } from '../interfaces/Process'; +import { Category } from '../interfaces/Category'; + +/** + * getDelimitedFileMatchKeyReport reads a CSV or TSV file from a URL and returns a report of matching keys. + * @param {DelimitedFileMatchKeyReportRequest} request + * @returns {Promise} response + */ +export async function getDelimitedFileMatchKeyReport( + request: DelimitedFileMatchKeyReportRequest, +): Promise { + const validationResult = isValidCsvMatchKeyReportRequest(request); + if (!validationResult.isValid) { + throw new Error(validationResult.errors.join(' ')); + } + + const params = { + function: 'match', + process: Process.MATCH_REPORT, + table: request.source, + source: request.source, + connection: request.csvUrl, + category: request.category, + column: request.matchColumn, + reference: request.referenceColumn, + json: request.responseFormat === 'json', + html: request.responseFormat === 'html', + apikey: request.apiKey, + }; + + const response = await InterzoidApi.doCloudConnectRequest(params); + return response as DelimitedFileMatchKeyReportResponse; +} + +function isValidCsvMatchKeyReportRequest(obj: any): { + isValid: boolean; + errors: string[]; +} { + let isValid = true; + const errors: string[] = []; + + // Validate apiKey + if (!obj?.apiKey || typeof obj.apiKey !== 'string') { + isValid = false; + errors.push("Invalid 'apiKey'."); + } + + // Validate csvUrl + if (!obj?.csvUrl || typeof obj.csvUrl !== 'string') { + isValid = false; + errors.push("Invalid 'csvUrl'."); + } + + // Validate source + if ( + !obj?.source || + (obj.source !== Source.CSV && obj.source !== Source.TSV) + ) { + isValid = false; + errors.push("Invalid 'source'. It must be either 'CSV' or 'TSV'."); + } + + // Validate category + if ( + !obj?.category || + !Object.values(Category).includes(obj.category as Category) + ) { + isValid = false; + errors.push( + `Invalid 'category'. It must be one of the following: ${Object.values( + Category, + ).join(', ')}`, + ); + } + + // Validate matchColumn + if (typeof obj?.matchColumn !== 'number') { + isValid = false; + errors.push( + "Invalid 'matchColumn'. It must be the number of a column in your CSV or TSV file.", + ); + } + + // Validate optional properties + if ( + obj?.referenceColumn !== undefined && + typeof obj.referenceColumn !== 'number' + ) { + isValid = false; + errors.push("Invalid 'referenceColumn'. If provided, it must be a number."); + } + + if ( + obj?.responseFormat && + !['json', 'html', 'text'].includes(obj.responseFormat) + ) { + isValid = false; + errors.push( + "Invalid 'responseFormat'. If provided, it must be either 'json', 'html', or 'text'.", + ); + } + + return { isValid, errors }; +} diff --git a/src/api/FullNameMatchKey.ts b/src/api/FullNameMatchKey.ts index 2c3a495..6c2a89d 100644 --- a/src/api/FullNameMatchKey.ts +++ b/src/api/FullNameMatchKey.ts @@ -22,7 +22,7 @@ export async function getFullNameMatchKey( const resource = 'getfullnamematch'; - const resp = await InterzoidApi.doGetRequest(resource, request.apiKey, { + const resp = await InterzoidApi.doApiGetRequest(resource, request.apiKey, { fullname: request.fullName, }); return resp as MatchKeyResponse; diff --git a/src/api/FullNameMatchScore.ts b/src/api/FullNameMatchScore.ts index bbc352f..57729d0 100644 --- a/src/api/FullNameMatchScore.ts +++ b/src/api/FullNameMatchScore.ts @@ -18,7 +18,7 @@ export async function getFullNameMatchScore( } const resource = 'getfullnamematchscore'; - const resp = await InterzoidApi.doGetRequest(resource, request.apiKey, { + const resp = await InterzoidApi.doApiGetRequest(resource, request.apiKey, { fullname1: request.value1, fullname2: request.value2, }); diff --git a/src/api/InterzoidApi.ts b/src/api/InterzoidApi.ts index 6deccb7..ea543a3 100644 --- a/src/api/InterzoidApi.ts +++ b/src/api/InterzoidApi.ts @@ -3,11 +3,15 @@ import qs from 'qs'; /** * Interzoid API client + * @class InterzoidApi + * @version 1.0.0 */ export class InterzoidApi { - private static readonly baseUrl = 'https://api.interzoid.com/'; + private static readonly API_BASE_URL: string = 'https://api.interzoid.com/'; + private static readonly CONNECT_BASE_URL: string = + 'https://connect.interzoid.com/'; - public static async doGetRequest( + static async doApiGetRequest( resource: string, apiKey: string, params?: object, @@ -23,13 +27,35 @@ export class InterzoidApi { }, }; - const requestUri = this.baseUrl + resource; + const requestUri = this.API_BASE_URL + resource; + return await this.get(requestUri, config); + } - let response: AxiosResponse; + static async doCloudConnectRequest(params: object) { + const config: AxiosRequestConfig = { + params: params, + headers: { + 'User-Agent': 'axios/data-matching-npm/1.0.0', + }, + paramsSerializer: (params: object) => { + return qs.stringify(params); + }, + }; + const requestUri = this.CONNECT_BASE_URL + 'run'; + return await this.get(requestUri, config); + } + + private static async get( + requestUri: string, + config: AxiosRequestConfig, + ) { + let response: AxiosResponse; try { response = await axios.get(requestUri, config); + // console.log(response.status); } catch (error) { + ``; throw new Error(`Network or server error: ${error}`); } diff --git a/src/api/OrganizationMatchScore.ts b/src/api/OrganizationMatchScore.ts index d5299eb..f39b60f 100644 --- a/src/api/OrganizationMatchScore.ts +++ b/src/api/OrganizationMatchScore.ts @@ -18,7 +18,7 @@ export async function getOrganizationMatchScore( } const resource = 'getorgmatchscore'; - const resp = await InterzoidApi.doGetRequest(resource, request.apiKey, { + const resp = await InterzoidApi.doApiGetRequest(resource, request.apiKey, { org1: request.value1, org2: request.value2, }); diff --git a/src/index.ts b/src/index.ts index 1ef4585..b10032e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,8 @@ import { getFullNameMatchKey } from './api/FullNameMatchKey'; import { getAccountInfo } from './api/AccountInfo'; import { getFullNameMatchScore } from './api/FullNameMatchScore'; import { getOrganizationMatchScore } from './api/OrganizationMatchScore'; +import { getDelimitedFileMatchKeyReport } from './api/DelimitedFileMatchKeyReport'; +import { getCloudDatabaseMatchKeyReport } from './api/CloudDatabaseMatchKeyReport'; import { AddressMatchKeyRequest } from './interfaces/AddressMatchKeyRequest'; import { CompanyNameMatchKeyRequest } from './interfaces/CompanyNameMatchKeyRequest'; import { FullNameMatchKeyRequest } from './interfaces/FullNameMatchKeyRequest'; @@ -12,6 +14,13 @@ import { MatchScoreRequest } from './interfaces/MatchScoreRequest'; import { MatchScoreResponse } from './interfaces/MatchScoreResponse'; import { InterzoidRequest } from './interfaces/InterzoidRequest'; import { InterzoidResponse } from './interfaces/InterzoidResponse'; +import { DelimitedFileMatchKeyReportRequest } from './interfaces/DelimitedFileMatchKeyReportRequest'; +import { DelimitedFileMatchKeyReportResponse } from './interfaces/DelimitedFileMatchKeyReportResponse'; +import { CloudWorkloadRequest } from './interfaces/CloudWorkloadRequest'; +import { CloudWorkloadResponse } from './interfaces/CloudWorkloadResponse'; +import { Category } from './interfaces/Category'; +import { Source } from './interfaces/Source'; +import { Process } from './interfaces/Process'; export { getAddressMatchKey, @@ -20,12 +29,21 @@ export { getAccountInfo, getFullNameMatchScore, getOrganizationMatchScore, + getDelimitedFileMatchKeyReport, + getCloudDatabaseMatchKeyReport, AddressMatchKeyRequest, CompanyNameMatchKeyRequest, FullNameMatchKeyRequest, MatchKeyResponse, MatchScoreRequest, MatchScoreResponse, + DelimitedFileMatchKeyReportRequest, + DelimitedFileMatchKeyReportResponse, InterzoidRequest, InterzoidResponse, + CloudWorkloadRequest, + CloudWorkloadResponse, + Category, + Source, + Process, }; diff --git a/src/interfaces/Category.ts b/src/interfaces/Category.ts new file mode 100644 index 0000000..bd14226 --- /dev/null +++ b/src/interfaces/Category.ts @@ -0,0 +1,11 @@ +/** + * @enum {string} Category + * @property {string} ADDRESS - Address + * @property {string} COMPANY - Company + * @property {string} INDIVIDUAL - Individual + */ +export enum Category { + ADDRESS = 'address', + COMPANY = 'company', + INDIVIDUAL = 'individual', +} diff --git a/src/interfaces/CloudWorkloadRequest.ts b/src/interfaces/CloudWorkloadRequest.ts new file mode 100644 index 0000000..4622b95 --- /dev/null +++ b/src/interfaces/CloudWorkloadRequest.ts @@ -0,0 +1,32 @@ +import { InterzoidRequest } from './InterzoidRequest'; +import { Source } from './Source'; +import { Process } from './Process'; +import { Category } from './Category'; + +/** + * CloudDatasetMatchRequest represents the request to the Cloud Data Matching API. + * @interface CloudWorkloadRequest + * @extends {InterzoidRequest} + * @property {Process} process - Process to perform + * @property {Category} category - This category type indicates which set of Machine Learning and matching algorithms to make use of based on type of data content. + * @property {Source} source - Source of data, such as 'MySQL', 'Snowflake', 'Postgres', etc. + * @property {string} connection - Connection string to access database, or in the case of a CSV or TSV file, use the full URL of the location of the file. + * @property {string} table - Table name to access the source data. Use "CSV" or "TSV" for delimited text files. + * @property {string} column - Column name within the table to access the source data. This is a number for CSV or TSV files, starting with number 1 from the left side of the file. + * @property {string} [reference] - An additional column from the source table to display in the output results, such as a primary key. + * @property {string} [newTable] - The name of the new table if the output results are written to a new table. Required if process is CREATE_TABLE. + * @property {boolean} [json] - If true, the output will be in JSON format. + * @property {boolean} [html] - Set to 'true' to pad line breaks into the output results for better readability ina browser when run from the address bar. + */ +export interface CloudWorkloadRequest extends InterzoidRequest { + process: Process; + category: Category; + source: Source; + connection: string; + table: string; + column: string; + reference?: string; + newTable?: string; //required if process is CREATE_TABLE + json?: boolean; + html?: boolean; +} diff --git a/src/interfaces/CloudWorkloadResponse.ts b/src/interfaces/CloudWorkloadResponse.ts new file mode 100644 index 0000000..bfefa4e --- /dev/null +++ b/src/interfaces/CloudWorkloadResponse.ts @@ -0,0 +1,14 @@ +import { MatchCluster } from './MatchCluster'; + +/** + * CloudWorkloadResponse interface + * @interface CloudWorkloadResponse + * @property {string} Status - Response status + * @property {string} Message - Response message + * @property {MatchCluster[]} [MatchClusters] - Match clusters + */ +export interface CloudWorkloadResponse { + Status: string; + Message: string; + MatchClusters?: MatchCluster[]; +} diff --git a/src/interfaces/DelimitedFileMatchKeyReportRequest.ts b/src/interfaces/DelimitedFileMatchKeyReportRequest.ts new file mode 100644 index 0000000..2840001 --- /dev/null +++ b/src/interfaces/DelimitedFileMatchKeyReportRequest.ts @@ -0,0 +1,22 @@ +import { InterzoidRequest } from './InterzoidRequest'; +import { Category } from './Category'; +import { Source } from './Source'; + +/** + * CsvMatchKeyReportRequest represents the request to the CSV or TSV Match Key Report API. + * @interface DelimitedFileMatchKeyReportRequest + * @property {Source.CSV | Source.TSV} source - The source type of the data. + * @property {Category} category - This category type indicates which set of Machine Learning and matching algorithms to make use of based on type of data content. + * @property {string} csvUrl - The full URL of the location of the CSV file. + * @property {number} matchColumn - The column number of the CSV file to match against. + * @property {number} [referenceColumn] - An additional column from the source table to display in the output results, such as a primary key. + * @property {'json' | 'html' | 'text'} [responseFormat] - The format of the response. If not specified, defaults to 'text'. + */ +export interface DelimitedFileMatchKeyReportRequest extends InterzoidRequest { + source: Source.CSV | Source.TSV; + category: Category; + csvUrl: string; + matchColumn: number; + referenceColumn?: number; + responseFormat?: 'json' | 'html' | 'text'; +} diff --git a/src/interfaces/DelimitedFileMatchKeyReportResponse.ts b/src/interfaces/DelimitedFileMatchKeyReportResponse.ts new file mode 100644 index 0000000..8dc9071 --- /dev/null +++ b/src/interfaces/DelimitedFileMatchKeyReportResponse.ts @@ -0,0 +1,14 @@ +import { MatchCluster } from './MatchCluster'; + +/** + * CsvMatchKeyReportResponse represents the response from the CSV Match Key Report API. + * @interface DelimitedFileMatchKeyReportResponse + * @property {string} Status - The response code + * @property {string} Message - The response message + * @property {MatchCluster[]} MatchClusters - The match clusters + */ +export interface DelimitedFileMatchKeyReportResponse { + Status: string; + Message: string; + MatchClusters: MatchCluster[]; +} diff --git a/src/interfaces/MatchCluster.ts b/src/interfaces/MatchCluster.ts new file mode 100644 index 0000000..46b2882 --- /dev/null +++ b/src/interfaces/MatchCluster.ts @@ -0,0 +1,18 @@ +/** + * Represents an individual item in a match cluster. + * @interface MatchClusterItem + * @property {string} Data - The data + * @property {string} Reference - The reference + * @property {string} SimKey - The similarity key + */ +export interface MatchClusterItem { + Data: string; + Reference: string; + SimKey: string; +} + +/** + * Represents a group of related match cluster items. + * @type MatchCluster - An array of {MatchClusterItem} + */ +export type MatchCluster = MatchClusterItem[]; diff --git a/src/interfaces/Process.ts b/src/interfaces/Process.ts new file mode 100644 index 0000000..7c4eb52 --- /dev/null +++ b/src/interfaces/Process.ts @@ -0,0 +1,16 @@ +/** + * The process defines the report or action that will occur with the dataset. + * @enum {string} Process + * @property {string} MATCH_REPORT - will generate a report of all found clusters of similar data. + * @property {string} KEYS_ONLY - outputs a generated similarity key for every record in the dataset. + * @property {string} GEN_SQL - similar to KEYS_ONLY, however it generates the SQL INSERT statements to store the + * similarity keys in a database. + * @property {string} CREATE_TABLE - will create a new table in the source database with all the similarity keys + * for each record in the source table, so they can be used for additional queries. + */ +export enum Process { + MATCH_REPORT = 'matchreport', + KEYS_ONLY = 'keysonly', + GEN_SQL = 'gensql', + CREATE_TABLE = 'createtable', +} diff --git a/src/interfaces/Source.ts b/src/interfaces/Source.ts new file mode 100644 index 0000000..6f4a900 --- /dev/null +++ b/src/interfaces/Source.ts @@ -0,0 +1,43 @@ +/** + * @enum {string} Source + * @property {string} POSTGRES - Postgres + * @property {string} MYSQL - MySQL + * @property {string} SNOWFLAKE - Snowflake + * @property {string} DATABRICKS - Databricks + * @property {string} AWS_AURORA_POSTGRES - AWS Aurora Postgres + * @property {string} AWS_AURORA_MYSQL - AWS Aurora MySQL + * @property {string} AWS_RDS_POSTGRES - AWS RDS Postgres + * @property {string} AWS_RDS_MYSQL - AWS RDS MySQL + * @property {string} AWS_RDS_SQL_SERVER - AWS RDS SQL Server + * @property {string} GOOGLE_SQL_CLOUD_POSTGRES - Google SQL Cloud Postgres + * @property {string} GOOGLE_SQL_CLOUD_MYSQL - Google SQL CLoud MySQL + * @property {string} MARIADB - MariaDB + * @property {string} MARIADB_SKYSQL - MariaDB SkySQL + * @property {string} MICROSOFT_SQL_SERVER - Microsoft SQL Server + * @property {string} AZURE_SQL - Azure SQL + * @property {string} AZURE_MYSQL - Azure MySQL + * @property {string} COCKROACHDB - CockroachDB + * @property {string} CSV - CSV File + * @property {string} TSV_FILE - TSV File + */ +export enum Source { + POSTGRES = 'Postgres', + MYSQL = 'mysql', + SNOWFLAKE = 'snowflake', + DATABRICKS = 'databricks', + AWS_AURORA_POSTGRES = 'AWS Aurora Postgres', + AWS_AURORA_MYSQL = 'AWS Aurora MySQL', + AWS_RDS_POSTGRES = 'AWS RDS Postgres', + AWS_RDS_MYSQL = 'AWS RDS MySQL', + AWS_RDS_SQL_SERVER = 'AWS RDS SQL Server', + GOOGLE_SQL_CLOUD_POSTGRES = 'Google SQL Cloud Postgres', + GOOGLE_SQL_CLOUD_MYSQL = 'Google SQL CLoud MySQL', + MARIADB = 'mariadb', + MARIADB_SKYSQL = 'MariaDB SkySQL', + MICROSOFT_SQL_SERVER = 'Microsoft SQL Server', + AZURE_SQL = 'Azure SQL', + AZURE_MYSQL = 'Azure MySQL', + COCKROACHDB = 'CockroachDB', + CSV = 'CSV', + TSV = 'TSV', +} diff --git a/tests/api/CloudWorkloadMatchKeyReport.test.ts b/tests/api/CloudWorkloadMatchKeyReport.test.ts new file mode 100644 index 0000000..2e7b47c --- /dev/null +++ b/tests/api/CloudWorkloadMatchKeyReport.test.ts @@ -0,0 +1,91 @@ +import axios, { AxiosHeaders } from 'axios'; +import { + Category, + CloudWorkloadRequest, + getCloudDatabaseMatchKeyReport, + Process, + Source, +} from '../../src'; + +jest.mock('axios'); + +describe('CloudWorkloadMatchKeyReport', () => { + const mockedAxios = axios as jest.Mocked; + + it('returns a response when the request is valid', async () => { + const request: CloudWorkloadRequest = { + process: Process.MATCH_REPORT, + category: Category.COMPANY, + source: Source.MYSQL, + connection: 'mysql://user:pass@host:port/db', + table: 'companies', + column: 'companyname', + reference: 'id', + json: true, + html: false, + apiKey: 'test-api-key', + }; + const mockResponse = { + data: { Status: 'success', Message: '', MatchClusters: [] }, + status: 200, + statusText: 'OK', + headers: {}, + config: { + headers: new AxiosHeaders(), + }, + }; + mockedAxios.get.mockResolvedValueOnce(mockResponse); + const result = await getCloudDatabaseMatchKeyReport(request); + expect(result.Status).toEqual('success'); + }); + + it('throws an error when the request is invalid', () => { + const request: any = { + apiKey: 'test-api-key', + process: Process.CREATE_TABLE, + category: Category.COMPANY, + source: Source.MYSQL, + connection: 'mysql://user:pass@host:port/db', + table: 'companies', + column: 'companyname', + // missing newTable. required when process is CREATE_TABLE + }; + expect(() => getCloudDatabaseMatchKeyReport(request)).rejects.toThrow( + "Invalid 'newTable'. It is required when process is CREATE_TABLE.", + ); + }); + + it('throws an error when the request is invalid', () => { + const request: any = { + apiKey: 'test-api-key', + process: 'Match Report', // invalid process + category: Category.COMPANY, + source: Source.MYSQL, + connection: 'mysql://user:pass@host:port/db', + table: 'companies', + column: 'companyname', + }; + expect(() => getCloudDatabaseMatchKeyReport(request)).rejects.toThrow( + `Invalid 'process'. It must be one of the following: ${Object.values( + Process, + ).join(', ')}`, + ); + }); + + it('throws an error when the request is invalid', () => { + const request: any = { + apiKey: 'test-api-key', + process: Process.MATCH_REPORT, + category: 'Person', // invalid category + source: Source.MYSQL, + connection: 'mysql://user:pass@host:port/db', + table: 'companies', + column: 'companyname', + }; + expect(() => getCloudDatabaseMatchKeyReport(request)).rejects.toThrow( + `Invalid 'category'. It must be one of the following: ${Object.values( + Category, + ).join(', ')}`, + ); + }); +}); diff --git a/tests/api/DelimitedFileMatchKeyReport.test.ts b/tests/api/DelimitedFileMatchKeyReport.test.ts new file mode 100644 index 0000000..5e5e959 --- /dev/null +++ b/tests/api/DelimitedFileMatchKeyReport.test.ts @@ -0,0 +1,69 @@ +import axios, { AxiosHeaders } from 'axios'; + +import { + DelimitedFileMatchKeyReportRequest, + getDelimitedFileMatchKeyReport, +} from '../../src'; +import { Category } from '../../src/interfaces/Category'; +import { Source } from '../../src/interfaces/Source'; + +jest.mock('axios'); + +describe('getCsvMatchKeyReport', () => { + const mockedAxios = axios as jest.Mocked; + + it('returns a response when the request is valid', async () => { + const request: DelimitedFileMatchKeyReportRequest = { + category: Category.COMPANY, + source: Source.CSV, + csvUrl: 'https://dl.interzoid.com/csv/companies.csv', + matchColumn: 1, + apiKey: 'test-api-key', + responseFormat: 'json', + }; + const mockResponse = { + data: { Status: 'success', Message: '', MatchClusters: [] }, + status: 200, + statusText: 'OK', + headers: {}, + config: { + headers: new AxiosHeaders(), + }, + }; + mockedAxios.get.mockResolvedValueOnce(mockResponse); + const result = await getDelimitedFileMatchKeyReport(request); + expect(result.Status).toEqual('success'); + }); + + it('throws an error when the request is invalid', async () => { + const request: DelimitedFileMatchKeyReportRequest = { + category: Category.COMPANY, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + source: 'AWS Aurora MySQL', + csvUrl: 'https://dl.interzoid.com/csv/companies.csv', + matchColumn: 1, + apiKey: 'test-api-key', + responseFormat: 'json', + }; + await expect(getDelimitedFileMatchKeyReport(request)).rejects.toThrow( + `Invalid 'source'. It must be either 'CSV' or 'TSV'.`, + ); + }); + + it('throws an error when the request is invalid', async () => { + const request: DelimitedFileMatchKeyReportRequest = { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + category: 'Person', + source: Source.CSV, + csvUrl: 'https://dl.interzoid.com/csv/companies.csv', + matchColumn: 1, + apiKey: 'test-api-key', + responseFormat: 'json', + }; + await expect(getDelimitedFileMatchKeyReport(request)).rejects.toThrow( + `Invalid 'category'. It must be one of the following: address, company, individual`, + ); + }); +}); diff --git a/tests/api/NameMatchScore.test.ts b/tests/api/FullNameMatchScore.test.ts similarity index 88% rename from tests/api/NameMatchScore.test.ts rename to tests/api/FullNameMatchScore.test.ts index 0807aa5..33d43c5 100644 --- a/tests/api/NameMatchScore.test.ts +++ b/tests/api/FullNameMatchScore.test.ts @@ -1,6 +1,9 @@ import axios, { AxiosHeaders, AxiosResponse } from 'axios'; -import { MatchScoreRequest, MatchScoreResponse } from '../../src'; -import { getFullNameMatchScore } from '../../src/api/FullNameMatchScore'; +import { + getFullNameMatchScore, + MatchScoreRequest, + MatchScoreResponse, +} from '../../src'; jest.mock('axios'); diff --git a/tests/api/OrganizationMatchScore.test.ts b/tests/api/OrganizationMatchScore.test.ts index 0a94ea0..ec73afa 100644 --- a/tests/api/OrganizationMatchScore.test.ts +++ b/tests/api/OrganizationMatchScore.test.ts @@ -1,9 +1,9 @@ import axios, { AxiosHeaders, AxiosResponse } from 'axios'; import { + getOrganizationMatchScore, MatchScoreRequest, MatchScoreResponse, -} from '../../src' -import { getOrganizationMatchScore } from '../../src/api/OrganizationMatchScore' +} from '../../src'; jest.mock('axios');