diff --git a/packages/ms-vc-api-issuer/__tests__/localAgent.test.ts b/packages/ms-vc-api-issuer/__tests__/localAgent.test.ts index 3d55db285..2e24dd96c 100644 --- a/packages/ms-vc-api-issuer/__tests__/localAgent.test.ts +++ b/packages/ms-vc-api-issuer/__tests__/localAgent.test.ts @@ -3,7 +3,8 @@ import { createObjects } from '@veramo/cli/build/lib/objectCreator' jest.setTimeout(30000) -import vcApiIssuerAgentLogic from './shared/vcApiIssuerAgentLogic' +import vcApiIssuerUsernamePasswordAgentLogic from './shared/vcApiIssuerUsernamePasswordAgentLogic' +import vcApiIssuerClientCredentialAgentLogic from './shared/vcApiIssuerClientCredentialAgentLogic' let agent: any @@ -23,5 +24,6 @@ const getAgent = () => agent const testContext = { getAgent, setup, tearDown } describe('ms-vc-api-isuuer-Local integration tests', () => { - vcApiIssuerAgentLogic(testContext) + vcApiIssuerUsernamePasswordAgentLogic(testContext) + vcApiIssuerClientCredentialAgentLogic(testContext) }) diff --git a/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerAgentLogic.ts b/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerAgentLogic.ts deleted file mode 100644 index ff2e76516..000000000 --- a/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerAgentLogic.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { TAgent } from '@veramo/core' -import { IMsVcApiIssuer } from '../../src' - -type ConfiguredAgent = TAgent - -export default (testContext: { getAgent: () => ConfiguredAgent; setup: () => Promise; tearDown: () => Promise }) => { - describe('Issuer Agent Plugin', () => { - let agent: ConfiguredAgent - - beforeAll(async () => { - await testContext.setup() - agent = testContext.getAgent() - }) - - afterAll(async () => { - await new Promise((resolve) => setTimeout(() => resolve(), 10000)) // avoid jest open handle error - await testContext.tearDown() - }) - - it('should authenticate to Microsoft Azure Active Directory', async () => { - return await expect( - agent.authenticateMsVcApi({ - azClientId: '04c2bd60-cdbf-4935-80dd-110fdf473e6e', - azClientSecret: 'WAM8Q~rE05C9ja2TRiZ3H~TYz2W4TdMe.jpwSc~p', - azTenantId: 'e2a42b2f-7460-4499-afc2-425315ef058a', - credentialManifest: 'https://beta.eu.did.msidentity.com/v1.0/e2a42b2f-7460-4499-afc2-425315ef058a/verifiableCredential/contracts/VerifiedCredentialExpert2' - }) - ).resolves.not.toBeNull() - }) - }) -} diff --git a/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerClientCredentialAgentLogic.ts b/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerClientCredentialAgentLogic.ts new file mode 100644 index 000000000..3eab4a7c1 --- /dev/null +++ b/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerClientCredentialAgentLogic.ts @@ -0,0 +1,36 @@ +import { TAgent, createAgent } from '@veramo/core' +import { IMsVcApiIssuer, MsAuthenticationTypeEnum, MsVcApiIssuer } from '../../src' + +type ConfiguredAgent = TAgent + +export default (testContext: { getAgent: () => ConfiguredAgent; setup: () => Promise; tearDown: () => Promise }) => { + describe('Issuer Agent Plugin', () => { + let agent: TAgent + agent = createAgent({ + plugins:[ + new MsVcApiIssuer({ + authenticationType: MsAuthenticationTypeEnum.ClientCredential, + authenticationArgs: { + azClientId: '', + azClientSecret:'', + azTenantId: '', + credentialManifest:'' + }})] + }) + beforeAll(async () => { + await testContext.setup() + agent = testContext.getAgent() + }) + + afterAll(async () => { + await new Promise((resolve) => setTimeout(() => resolve(), 10000)) // avoid jest open handle error + await testContext.tearDown() + }) + + it('should authenticate to Microsoft Azure Active Directory with ClientCredential', async () => { + return await expect( + agent.authenticateMsVcApi() + ).resolves.not.toBeNull() + }); + }) +} diff --git a/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerUsernamePasswordAgentLogic.ts b/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerUsernamePasswordAgentLogic.ts new file mode 100644 index 000000000..d0b045570 --- /dev/null +++ b/packages/ms-vc-api-issuer/__tests__/shared/vcApiIssuerUsernamePasswordAgentLogic.ts @@ -0,0 +1,41 @@ +import {TAgent, createAgent} from '@veramo/core' +import {MsVcApiIssuer, IMsVcApiIssuer, MsAuthenticationTypeEnum} from '../../src' + + +type ConfiguredAgent = TAgent + +export default (testContext: { getAgent: () => ConfiguredAgent; setup: () => Promise; tearDown: () => Promise }) => { + describe('Issuer Agent Plugin', () => { + let agent: TAgent + agent = createAgent({ + plugins:[ + new MsVcApiIssuer({ + authenticationType: MsAuthenticationTypeEnum.UsernamePassword, + authenticationArgs: { + azTenantId: '', + azClientId: '', + scopes: ["user.read"], + username: '', + password:'', + }})] + }) + beforeAll(async () => { + await testContext.setup() + agent = testContext.getAgent() + }) + + afterAll(async () => { + await new Promise((resolve) => setTimeout(() => resolve(), 10000)) // avoid jest open handle error + await testContext.tearDown() + }) + + + it('should authenticate to Microsoft Azure Active Directory with UsernamePassword', async () => { + const result = await agent.authenticateMsVcApi(); + console.log(result) + return await expect( + agent.authenticateMsVcApi() + ).resolves.not.toBeNull() + }); + }) +} diff --git a/packages/ms-vc-api-issuer/package.json b/packages/ms-vc-api-issuer/package.json index bd54ed5e9..f607b3ba2 100644 --- a/packages/ms-vc-api-issuer/package.json +++ b/packages/ms-vc-api-issuer/package.json @@ -14,6 +14,8 @@ "generate-plugin-schema": "yarn veramo dev generate-plugin-schema" }, "dependencies": { + "@azure/msal-common": "^7.0.0", + "@azure/msal-node": "^1.10.0", "@veramo/core": "3.1.2-next.84", "cross-fetch": "^3.1.5" }, @@ -23,8 +25,7 @@ "jest": "^27.3.1", "prettier": "^2.4.1", "ts-jest": "^27.0.7", - "typescript": "^4.4.3", - "@azure/msal-node": "^1.3.0" + "typescript": "^4.4.3" }, "files": [ "dist/**/*", @@ -41,6 +42,7 @@ "license": "Apache-2.0", "keywords": [ "Microsoft", + "msal", "Active Directory", "Sphereon", "SSI", diff --git a/packages/ms-vc-api-issuer/plugin.schema.json b/packages/ms-vc-api-issuer/plugin.schema.json index 38d0e9f61..42882c51f 100644 --- a/packages/ms-vc-api-issuer/plugin.schema.json +++ b/packages/ms-vc-api-issuer/plugin.schema.json @@ -2,29 +2,6 @@ "IMsVcApiIssuer": { "components": { "schemas": { - "IMsAuthenticationArgs": { - "type": "object", - "properties": { - "azClientId": { - "type": "string" - }, - "azClientSecret": { - "type": "string" - }, - "azTenantId": { - "type": "string" - }, - "credentialManifest": { - "type": "string" - } - }, - "required": [ - "azClientId", - "azClientSecret", - "azTenantId", - "credentialManifest" - ] - }, "IMsAuthenticationResponse": { "type": "object", "properties": { @@ -44,7 +21,7 @@ "authenticateMsVcApi": { "description": "", "arguments": { - "$ref": "#/components/schemas/IMsAuthenticationArgs" + "type": "object" }, "returnType": { "$ref": "#/components/schemas/IMsAuthenticationResponse" diff --git a/packages/ms-vc-api-issuer/src/agent/MsVcApiIssuer.ts b/packages/ms-vc-api-issuer/src/agent/MsVcApiIssuer.ts index a367b0bc3..790351d16 100644 --- a/packages/ms-vc-api-issuer/src/agent/MsVcApiIssuer.ts +++ b/packages/ms-vc-api-issuer/src/agent/MsVcApiIssuer.ts @@ -1,7 +1,14 @@ import { IAgentPlugin } from '@veramo/core' -import { LogLevel, ConfidentialClientApplication } from '@azure/msal-node' -import { schema } from '../index' -import { IMsAuthenticationArgs, IMsAuthenticationResponse, IMsVcApiIssuer, IRequiredContext } from '../types/IMsVcApiIssuer' +import { ConfidentialClientApplication, LogLevel, PublicClientApplication, UsernamePasswordRequest } from '@azure/msal-node' +import { + IMsAuthenticationAuthorizationCodeArgs, + IMsAuthenticationClientCredentialArgs, + IMsAuthenticationOnBehalfOfArgs, + IMsAuthenticationUsernamePasswordArgs, + MsAuthenticationTypeEnum, + schema, +} from '../index' +import { IMsAuthenticationResponse, IMsAuthenticationWrapperArgs, IMsVcApiIssuer } from '../types/IMsVcApiIssuer' /** * {@inheritDoc IMsVcApiIssuer} @@ -11,26 +18,40 @@ export class MsVcApiIssuer implements IAgentPlugin { readonly methods: IMsVcApiIssuer = { authenticateMsVcApi: this.authenticateMsVcApi.bind(this), } - private readonly azClientId: string - private readonly azClientSecret: string - private readonly azTenantId: string - private readonly credentialManifest: string - private msIdentityHostName = '' + private readonly authenticationType: MsAuthenticationTypeEnum + private readonly authenticationArgs: + | IMsAuthenticationClientCredentialArgs + | IMsAuthenticationUsernamePasswordArgs + | IMsAuthenticationAuthorizationCodeArgs + | IMsAuthenticationOnBehalfOfArgs - constructor(options: IMsAuthenticationArgs) { - this.azClientId = options.azClientId - this.azClientSecret = options.azClientSecret - this.azTenantId = options.azTenantId - this.credentialManifest = options.credentialManifest + constructor(options: IMsAuthenticationWrapperArgs) { + this.authenticationType = options.authenticationType + this.authenticationArgs = options.authenticationArgs } /** {@inheritDoc IMsVcApiIssuer.authenticateMsVcApi} */ - public async authenticateMsVcApi(args: IMsAuthenticationArgs, context: IRequiredContext): Promise { + public async authenticateMsVcApi(): Promise { + let accessToken = '' + console.log('authenticationType:',this.authenticationType, 'authenticationArgs:',this.authenticationArgs) + /*this.authenticationType = args.authenticationType + this.authenticationArgs = args.authenticationArgs*/ + if (this.authenticationType === 'ClientCredential') { + accessToken = await this.authenticateWithClientCredential(this.authenticationArgs as IMsAuthenticationClientCredentialArgs) + } else if (this.authenticationType === 'UsernamePassword') { + accessToken = await this.authenticateWithUsernamePassword(this.authenticationArgs as IMsAuthenticationUsernamePasswordArgs) + } else { + throw new Error(`method of authentication ${this.authenticationType} is not supported!`) + } + return accessToken as IMsAuthenticationResponse + } + + private async authenticateWithClientCredential(authneticationArgs: IMsAuthenticationClientCredentialArgs) { var msalConfig = { auth: { - clientId: this.azClientId, - authority: 'https://login.microsoftonline.com/' + this.azTenantId, - clientSecret: this.azClientSecret, + clientId: authneticationArgs.azClientId, + authority: 'https://login.microsoftonline.com/' + authneticationArgs.azTenantId, + clientSecret: authneticationArgs.azClientSecret, }, system: { loggerOptions: { @@ -38,45 +59,61 @@ export class MsVcApiIssuer implements IAgentPlugin { logLevel: LogLevel.Verbose, } } - }; + } - const cca = new ConfidentialClientApplication(msalConfig); + const cca = new ConfidentialClientApplication(msalConfig) const msalClientCredentialRequest = { - scopes: ["3db474b9-6a0c-4840-96ac-1fceb342124f/.default"], + scopes: ['3db474b9-6a0c-4840-96ac-1fceb342124f/.default'], skipCache: false, - }; - - var accessToken = ""; - - await fetch('https://login.microsoftonline.com/' + this.azTenantId + '/v2.0/.well-known/openid-configuration', { method: 'GET' }) - .then(res => res.json()) + } + await fetch('https://login.microsoftonline.com/' + authneticationArgs.azTenantId + '/v2.0/.well-known/openid-configuration', { method: 'GET' }) + .then((res) => res.json()) .then(async (resp) => { - console.log(`tenant_region_scope = ${resp.tenant_region_scope}`); - this.msIdentityHostName = "https://beta.did.msidentity.com/v1.0/"; - if (resp.tenant_region_scope == "EU") { - this.msIdentityHostName = "https://beta.eu.did.msidentity.com/v1.0/"; + console.log(`tenant_region_scope = ${resp.tenant_region_scope}`) + let msIdentityHostName = 'https://beta.did.msidentity.com/v1.0/' + if (resp.tenant_region_scope == 'EU') { + msIdentityHostName = 'https://beta.eu.did.msidentity.com/v1.0/' } // Check that the Credential Manifest URL is in the same tenant Region and throw an error if it's not - if (!this.credentialManifest.startsWith(this.msIdentityHostName)) { - throw new Error(`Error in config file. CredentialManifest URL configured for wrong tenant region. Should start with:` + this.msIdentityHostName); + if (!authneticationArgs.credentialManifest.startsWith(msIdentityHostName)) { + throw new Error(`Error in config file. CredentialManifest URL configured for wrong tenant region. Should start with:` + msIdentityHostName) } - // get the Access Token try { - const result = await cca.acquireTokenByClientCredential(msalClientCredentialRequest); + const result = await cca.acquireTokenByClientCredential(msalClientCredentialRequest) if (result) { - accessToken = result.accessToken; + return result.accessToken } } catch { - console.log("failed to get access token"); + console.log('failed to get access token') resp.status(401).json({ - 'error': 'Could not acquire credentials to access your Azure Key Vault' - }); - return; + error: 'Could not acquire credentials to access your Azure Key Vault', + }) + return } - console.log(`accessToken: ${accessToken}`); - }); - return accessToken as IMsAuthenticationResponse; + return '' + }) + return '' + } + + private async authenticateWithUsernamePassword(authenticationArgs: IMsAuthenticationUsernamePasswordArgs) { + const msalConfig = { + auth: { + clientId: authenticationArgs.azClientId, + authority: 'https://login.microsoftonline.com/' + authenticationArgs.azTenantId, + }, + } + const pca = new PublicClientApplication(msalConfig) + //TODO(sksadjad): see if it's necessary need to fill in the scopes here + return await pca + .acquireTokenByUsernamePassword(authenticationArgs as UsernamePasswordRequest) + .then((response: any) => { + console.log('acquired token by password grant', response) + return response + }) + .catch((error: any) => { + console.log(error) + }) } } diff --git a/packages/ms-vc-api-issuer/src/types/IMsVcApiIssuer.ts b/packages/ms-vc-api-issuer/src/types/IMsVcApiIssuer.ts index a5100a8bd..83fe73034 100644 --- a/packages/ms-vc-api-issuer/src/types/IMsVcApiIssuer.ts +++ b/packages/ms-vc-api-issuer/src/types/IMsVcApiIssuer.ts @@ -1,19 +1,57 @@ import { IAgentContext, IPluginMethodMap } from '@veramo/core' +import { AccountInfo } from '@azure/msal-common' export interface IMsVcApiIssuer extends IPluginMethodMap { - authenticateMsVcApi(args: IMsAuthenticationArgs, context: IRequiredContext): Promise + authenticateMsVcApi(): Promise +} + +export interface IMsAuthenticationWrapperArgs { + authenticationType: MsAuthenticationTypeEnum + authenticationArgs: + | IMsAuthenticationClientCredentialArgs + | IMsAuthenticationUsernamePasswordArgs + | IMsAuthenticationAuthorizationCodeArgs + | IMsAuthenticationOnBehalfOfArgs } export interface IMsAuthenticationArgs { azClientId: string - azClientSecret: string azTenantId: string +} +export interface IMsAuthenticationClientCredentialArgs extends IMsAuthenticationArgs { + azClientSecret: string credentialManifest: string } +export interface IMsAuthenticationUsernamePasswordArgs extends IMsAuthenticationArgs { + password: string, + scopes: string[], + username: string +} + +export interface IMsAuthenticationAuthorizationCodeArgs extends IMsAuthenticationArgs { + redirectUri: string + code: string +} + +export interface IMsAuthenticationOnBehalfOfArgs extends IMsAuthenticationArgs { + oboAssertion: string +} + +export interface IMsAuthenticationSilentFlowArgs extends IMsAuthenticationArgs { + account: AccountInfo +} export enum events { AUTHENTICATED = 'authenticated', } +export enum MsAuthenticationTypeEnum { + ClientCredential= 'ClientCredential', + AuthorizationCode = 'AuthorizationCode', + UsernamePassword = 'UsernamePassword', + BehalfOf = 'BehalfOf', + Silent = 'Silent', +} + export type IRequiredContext = IAgentContext> export type IMsAuthenticationResponse = String diff --git a/yarn.lock b/yarn.lock index 30af44037..d73a16932 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,7 +7,7 @@ resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-7.0.0.tgz#f4b52c6d9591cf8720dcb24c1d21fce2d186f871" integrity sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA== -"@azure/msal-node@^1.3.0": +"@azure/msal-node@^1.10.0": version "1.10.0" resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-1.10.0.tgz#ee3a26201c4899cc6928cc331c31d3568d3cb728" integrity sha512-oSv9mg199FpRTe+fZ3o9NDYpKShOHqeceaNcCHJcKUaAaCojAbfbxD1Cvsti8BEsLKE6x0HcnjilnM1MKmZekA== @@ -5487,7 +5487,7 @@ cbor@^5.1.0: bignumber.js "^9.0.1" nofilter "^1.0.4" -chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -6112,6 +6112,17 @@ cross-fetch@^3.1.5: dependencies: node-fetch "2.6.7" +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -10224,6 +10235,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" @@ -10708,6 +10724,11 @@ nerf-dart@^1.0.0: resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" integrity sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo= +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + nock@*, nock@^13.2.1: version "13.2.2" resolved "https://registry.yarnpkg.com/nock/-/nock-13.2.2.tgz#29a6942250278209c2b3e7a38310f703581b21fa" @@ -11069,6 +11090,21 @@ npm-registry-fetch@^9.0.0: minizlib "^2.0.0" npm-package-arg "^8.0.0" +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -11680,6 +11716,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -11789,6 +11830,11 @@ picomatch@^2.0.4, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -12799,7 +12845,7 @@ semver-regex@^3.1.2: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.3.tgz#b2bcc6f97f63269f286994e297e229b6245d0dc3" integrity sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ== -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -12901,6 +12947,13 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -12908,11 +12961,21 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -13255,6 +13318,15 @@ string.prototype.matchall@^4.0.6: regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" +string.prototype.padend@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + string.prototype.trim@^1.2.1: version "1.2.5" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" @@ -14349,7 +14421,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which@1, which@^1.3.1: +which@1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==