diff --git a/package.json b/package.json index c1985b8..251d2ea 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "@modelcontextprotocol/sdk": "^1.12.3", "@oclif/core": "^4.3.3", "@salesforce/agents": "^0.15.2", + "@salesforce/apex-node": "^8.1.32", "@salesforce/core": "^8.14.0", "@salesforce/kit": "^3.1.6", "@salesforce/source-deploy-retrieve": "^12.20.1", diff --git a/src/index.ts b/src/index.ts index af68872..11509ae 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,12 +22,13 @@ import * as core from './tools/core/index.js'; import * as orgs from './tools/orgs/index.js'; import * as data from './tools/data/index.js'; import * as users from './tools/users/index.js'; +import * as testing from './tools/testing/index.js'; import * as metadata from './tools/metadata/index.js'; import Cache from './shared/cache.js'; import { Telemetry } from './telemetry.js'; import { SfMcpServer } from './sf-mcp-server.js'; -const TOOLSETS = ['all', 'orgs', 'data', 'users', 'metadata'] as const; +const TOOLSETS = ['all', 'testing', 'orgs', 'data', 'users', 'metadata'] as const; /** * Sanitizes an array of org usernames by replacing specific orgs with a placeholder. @@ -193,6 +194,15 @@ You can also use special values to control access to orgs: users.registerToolAssignPermissionSet(server); } + // ************************ + // testing TOOLS + // ************************ + if (all || enabledToolsets.has('testing')) { + this.logToStderr('Registering testing tools'); + testing.registerToolRunApexTest(server); + testing.registerToolRunAgentTest(server); + } + // ************************ // METADATA TOOLS // ************************ diff --git a/src/tools/testing/index.ts b/src/tools/testing/index.ts new file mode 100644 index 0000000..a1ebf23 --- /dev/null +++ b/src/tools/testing/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './sf-run-apex-tests.js'; +export * from './sf-run-agent-tests.js'; diff --git a/src/tools/testing/sf-run-agent-tests.ts b/src/tools/testing/sf-run-agent-tests.ts new file mode 100644 index 0000000..d5df226 --- /dev/null +++ b/src/tools/testing/sf-run-agent-tests.ts @@ -0,0 +1,86 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { z } from 'zod'; +import { AgentTester } from '@salesforce/agents'; +import { Duration } from '@salesforce/kit'; +import { directoryParam, usernameOrAliasParam } from '../../shared/params.js'; +import { textResponse } from '../../shared/utils.js'; +import { getConnection } from '../../shared/auth.js'; +import { SfMcpServer } from '../../sf-mcp-server.js'; + +const runAgentTestsParam = z.object({ + agentApiName: z.string().describe( + `Agent test to run + if unsure, list all files matching the pattern *.aiEvaluationDefinition-meta.xml + only one test can be executed at a time +` + ), + usernameOrAlias: usernameOrAliasParam, + directory: directoryParam, +}); + +export type AgentRunTests = z.infer; + +/* + * Run Agent tests in a Salesforce org. + * + * Parameters: + * - agentApiName: this will be the aiEvaluationDefinition's name + * - usernameOrAlias: Username or alias of the Salesforce org to run tests in. + * - directory: Directory of the local project. + * + * Returns: + * - textResponse: Test result. + */ +export const registerToolRunAgentTest = (server: SfMcpServer): void => { + server.tool( + 'sf-run-agent-tests', + `Run Agent tests in an org. + +AGENT INSTRUCTIONS: +If the user doesn't specify what to test, take context from the currently open file +This will ONLY run Agent tests, NOT apex tests, lightning tests, flow tests, or any other type of test. + +this should be chosen when a file in the 'aiEvaluationDefinitions' directory is mentioned + +EXAMPLE USAGE: +Run tests for the X agent +Run this test +`, + runAgentTestsParam.shape, + async ({ usernameOrAlias, agentApiName, directory }) => { + if (!usernameOrAlias) + return textResponse( + 'The usernameOrAlias parameter is required, if the user did not specify one use the #sf-get-username tool', + true + ); + + // needed for org allowlist to work + process.chdir(directory); + const connection = await getConnection(usernameOrAlias); + + try { + const agentTester = new AgentTester(connection); + const test = await agentTester.start(agentApiName); + const result = await agentTester.poll(test.runId, { timeout: Duration.minutes(10) }); + return textResponse(`Test result: ${JSON.stringify(result)}`); + } catch (e) { + return textResponse(`Failed to run Agent Tests: ${e instanceof Error ? e.message : 'Unknown error'}`, true); + } + } + ); +}; diff --git a/src/tools/testing/sf-run-apex-tests.ts b/src/tools/testing/sf-run-apex-tests.ts new file mode 100644 index 0000000..b988355 --- /dev/null +++ b/src/tools/testing/sf-run-apex-tests.ts @@ -0,0 +1,103 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { z } from 'zod'; +import { TestLevel, TestResult, TestService } from '@salesforce/apex-node'; +import { directoryParam, usernameOrAliasParam } from '../../shared/params.js'; +import { textResponse } from '../../shared/utils.js'; +import { getConnection } from '../../shared/auth.js'; +import { SfMcpServer } from '../../sf-mcp-server.js'; + +const runApexTestsParam = z.object({ + testLevel: z.enum([TestLevel.RunLocalTests, TestLevel.RunAllTestsInOrg, TestLevel.RunSpecifiedTests]).describe( + `Apex test level + +AGENT INSTRUCTIONS +Choose the correct value based on what tests are meant to be executed in some of these ways: + +RunLocalTests="Run all tests in the org, except the ones that originate from installed managed and unlocked packages." +RunAllTestsInOrg="Run all tests in the org, including tests of managed packages" +RunSpecifiedTests="Run the Apex tests I specify, these will be specified in the classNames parameter" +` + ), + classNames: z.array(z.string()).describe( + `Apex tests classes to run. + if Running all tests, all tests should be listed + if unsure, find apex classes matching the pattern *.cls, that include the @isTest decorator in the file and then join their test names together with ',' +` + ), + usernameOrAlias: usernameOrAliasParam, + directory: directoryParam, +}); + +export type ApexRunTests = z.infer; + +/* + * Run Apex tests in a Salesforce org. + * + * Parameters: + * - testLevel: 'RunSpecifiedTests', 'RunLocalTests', 'RunAllTestsInOrg', used to specify the specific test-level. + * - classNames: if testLevel='RunSpecifiedTests', this will be the specified tests to run + * - usernameOrAlias: Username or alias of the Salesforce org to run tests in. + * - directory: Directory of the local project. + * + * Returns: + * - textResponse: Test result. + */ +export const registerToolRunApexTest = (server: SfMcpServer): void => { + server.tool( + 'sf-run-apex-tests', + `Run Apex tests in an org. + +AGENT INSTRUCTIONS: +If the user doesn't specify what to test, take context from the currently open file +This will ONLY run APEX tests, NOT agent tests, lightning tests, flow tests, or any other type of test. + +this should be chosen when a file in the 'classes' directory is mentioned + +EXAMPLE USAGE: +Run tests A, B, C. +Run the tests, find apex classes matching the pattern *.cls, that include the @isTest decorator in the file and then join their test names together with ',' +Run all tests in the org. +`, + runApexTestsParam.shape, + async ({ testLevel, usernameOrAlias, classNames, directory }) => { + if (testLevel !== TestLevel.RunSpecifiedTests && classNames?.length && classNames?.length >= 1) { + return textResponse("You can't specify which tests to run without setting testLevel='RunSpecifiedTests'", true); + } + + if (!usernameOrAlias) + return textResponse( + 'The usernameOrAlias parameter is required, if the user did not specify one use the #sf-get-username tool', + true + ); + + // needed for org allowlist to work + process.chdir(directory); + + const connection = await getConnection(usernameOrAlias); + try { + const testService = new TestService(connection); + + const payload = await testService.buildAsyncPayload(testLevel, classNames.join(',')); + const result = (await testService.runTestAsynchronous(payload, false)) as TestResult; + return textResponse(`Test result: ${JSON.stringify(result)}`); + } catch (e) { + return textResponse(`Failed to run Apex Tests: ${e instanceof Error ? e.message : 'Unknown error'}`, true); + } + } + ); +}; diff --git a/yarn.lock b/yarn.lock index 29950bf..5324548 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1997,6 +1997,21 @@ nock "^13.5.6" yaml "^2.7.1" +"@salesforce/apex-node@^8.1.32": + version "8.1.32" + resolved "https://registry.yarnpkg.com/@salesforce/apex-node/-/apex-node-8.1.32.tgz#222d123b2ed231c239d796b510aea14740892f55" + integrity sha512-0B8NLj/Y/RdbJsQHv/bkcOBbqemtp3oi8VvSkFbWlU9nj/fMcD6lW7tjud7HBhuj/7YVXjm/bKLkTsjqkJGh1A== + dependencies: + "@salesforce/core" "^8.14.0" + "@salesforce/kit" "^3.2.3" + "@types/istanbul-reports" "^3.0.4" + bfj "8.0.0" + fast-glob "^3.3.2" + faye "1.4.0" + istanbul-lib-coverage "^3.2.2" + istanbul-lib-report "^3.0.1" + istanbul-reports "^3.1.7" + "@salesforce/cli-plugins-testkit@^5.3.39": version "5.3.39" resolved "https://registry.npmjs.org/@salesforce/cli-plugins-testkit/-/cli-plugins-testkit-5.3.39.tgz" @@ -2091,7 +2106,28 @@ resolved "https://registry.npmjs.org/@salesforce/schemas/-/schemas-1.9.0.tgz" integrity sha512-LiN37zG5ODT6z70sL1fxF7BQwtCX9JOWofSU8iliSNIM+WDEeinnoFtVqPInRSNt8I0RiJxIKCrqstsmQRBNvA== -"@salesforce/source-deploy-retrieve@^12.19.5", "@salesforce/source-deploy-retrieve@^12.19.9", "@salesforce/source-deploy-retrieve@^12.20.1": +"@salesforce/source-deploy-retrieve@^12.19.5": + version "12.20.0" + resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.20.0.tgz#52256891fe101fb68aba2eaf66a51757c618ada7" + integrity sha512-P+UF9qNx7oJgYmXMLY8T2bJlZxTeRvFk7AlpVpGhO62YLDrX+wkLQgs+JVnxvz0nlif+qBUuTMCYW4Oj2wpy9g== + dependencies: + "@salesforce/core" "^8.12.0" + "@salesforce/kit" "^3.2.3" + "@salesforce/ts-types" "^2.0.12" + "@salesforce/types" "^1.3.0" + fast-levenshtein "^3.0.0" + fast-xml-parser "^4.5.3" + got "^11.8.6" + graceful-fs "^4.2.11" + ignore "^5.3.2" + isbinaryfile "^5.0.2" + jszip "^3.10.1" + mime "2.6.0" + minimatch "^9.0.5" + proxy-agent "^6.4.0" + yaml "^2.7.1" + +"@salesforce/source-deploy-retrieve@^12.19.9", "@salesforce/source-deploy-retrieve@^12.20.1": version "12.20.1" resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.20.1.tgz#7514d98bd5a54e7a6b992cdb30305eef8288312f" integrity sha512-pCGTgR90MRcpCS7WswMd7CHAgqK6DBssLuu+hL5KMiuthgfFjO8XNTGeHqZBc4xTYYzxm8h5vlN8aqElI4ppXA== @@ -2831,6 +2867,25 @@ resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== +"@types/istanbul-lib-coverage@*": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/json-schema@^7.0.12": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" @@ -3463,11 +3518,27 @@ basic-ftp@^5.0.2: resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz" integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== +bfj@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-8.0.0.tgz#d15931bd5ef1ef5c874a59e6ef00653de8416568" + integrity sha512-6KJe4gFrZ4lhmvWcUIj37yFAs36mi2FZXuTkw6udZ/QsX/znFypW4SatqcLA5K5T4BAWgJZD73UFEJJQxuJjoA== + dependencies: + bluebird "^3.7.2" + check-types "^11.2.3" + hoopy "^0.1.4" + jsonpath "^1.1.1" + tryer "^1.0.1" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + body-parser@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz" @@ -3762,6 +3833,11 @@ check-error@^1.0.3: dependencies: get-func-name "^2.0.2" +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== + chokidar@^3.5.3: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" @@ -4176,7 +4252,7 @@ deep-eql@^4.1.3: dependencies: type-detect "^4.0.0" -deep-is@^0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -4571,6 +4647,18 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" @@ -4773,6 +4861,11 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" @@ -4792,6 +4885,11 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" @@ -4932,12 +5030,23 @@ fast-glob@^3.2.11, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -4997,7 +5106,7 @@ faye-websocket@>=0.9.1: dependencies: websocket-driver ">=0.5.1" -faye@^1.4.0: +faye@1.4.0, faye@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/faye/-/faye-1.4.0.tgz" integrity sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w== @@ -5557,6 +5666,11 @@ help-me@^5.0.0: resolved "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz" integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -6070,7 +6184,7 @@ isomorphic-git@^1.30.1: sha.js "^2.4.9" simple-get "^4.0.1" -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1, istanbul-lib-coverage@^3.2.0: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: version "3.2.2" resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== @@ -6115,6 +6229,15 @@ istanbul-lib-report@^3.0.0: make-dir "^3.0.0" supports-color "^7.1.0" +istanbul-lib-report@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + istanbul-lib-source-maps@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" @@ -6132,6 +6255,14 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +istanbul-reports@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + jackspeak@^2.3.5: version "2.3.6" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" @@ -6276,6 +6407,15 @@ jsonparse@^1.2.0: resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + jsonwebtoken@9.0.2: version "9.0.2" resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz" @@ -6349,6 +6489,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + lie@~3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" @@ -6578,6 +6726,13 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" @@ -6709,7 +6864,7 @@ micromark-util-types@^2.0.0: resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz" integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -7187,6 +7342,18 @@ open@^10.1.0: is-inside-container "^1.0.0" is-wsl "^3.1.0" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.3: version "0.9.3" resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" @@ -7529,6 +7696,11 @@ prelude-ls@^1.2.1: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + prettier@^2.8.8: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" @@ -8502,6 +8674,13 @@ stack-chain@^1.3.7: resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-1.3.7.tgz#d192c9ff4ea6a22c94c4dd459171e3f00cea1285" integrity sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug== +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + statuses@2.0.1, statuses@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" @@ -8765,6 +8944,11 @@ trim-newlines@^3.0.0: resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: version "1.4.3" resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz" @@ -8835,6 +9019,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-detect@4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" @@ -8966,6 +9157,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" @@ -9226,6 +9422,11 @@ wireit@^0.14.12: jsonc-parser "^3.0.0" proper-lockfile "^4.1.2" +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz"