diff --git a/package.json b/package.json index a085c24e..59320016 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "types": "dist/index.d.ts", "scripts": { "build": "rimraf dist/ && tsc -p src/bin && tsc -p src/tsconfig.json && tsc-alias -p src/tsconfig.json && yarn grant-exec-perms && yarn copy-files dist/", + "build:watch": "tsc -p src/tsconfig.json && (concurrently \"tsc -p src/tsconfig.json -w\" \"tsc-alias -p src/tsconfig.json\")", "build:test": "rimraf dist_test/ && tsc -p test/tsconfig.json && tsc-alias -p test/tsconfig.json && yarn copy-files dist_test/", "grant-exec-perms": "node dist/bin/tools/grant-exec-perms.js", "copy-files": "copyfiles -u 1 src/**/*.ftl", @@ -66,6 +67,7 @@ "@types/minimist": "^1.2.2", "@types/node": "^18.14.1", "@types/react": "18.0.9", + "concurrently": "^7.6.0", "copyfiles": "^2.4.1", "husky": "^4.3.8", "lint-staged": "^11.0.0", diff --git a/src/Template.tsx b/src/Template.tsx index 4ee2e0a9..69aaa314 100644 --- a/src/Template.tsx +++ b/src/Template.tsx @@ -3,7 +3,7 @@ import { clsx } from "keycloakify/tools/clsx"; import { usePrepareTemplate } from "keycloakify/lib/usePrepareTemplate"; import { type TemplateProps, defaultTemplateClasses } from "keycloakify/TemplateProps"; import { useGetClassName } from "keycloakify/lib/useGetClassName"; -type KcContext = import("./kcContext/KcContextBase").KcContextBase.Common.Login; +type KcContext = import("./kcContext/KcContextBase").KcContextBase.Common; import type { I18nBase as I18n } from "./i18n"; export default function Template(props: TemplateProps) { diff --git a/src/TemplateProps.ts b/src/TemplateProps.ts index 53c9cba3..bc13f9b7 100644 --- a/src/TemplateProps.ts +++ b/src/TemplateProps.ts @@ -2,7 +2,7 @@ import type { ReactNode } from "react"; import type { KcContextBase } from "keycloakify/kcContext"; import type { I18nBase } from "keycloakify/i18n"; -export type TemplateProps = { +export type TemplateProps = { kcContext: KcContext; i18n: I18n; doUseDefaultCss: boolean; diff --git a/src/bin/keycloakify/generateFtl/generateFtl.ts b/src/bin/keycloakify/generateFtl/generateFtl.ts index 5c28b731..c5c80e71 100644 --- a/src/bin/keycloakify/generateFtl/generateFtl.ts +++ b/src/bin/keycloakify/generateFtl/generateFtl.ts @@ -40,7 +40,7 @@ export const loginThemePageIds = [ export const accountThemePageIds = ["password.ftl"] as const; -export type LoginThemePageId = (typeof loginThemePageIds)[number]; +export type PageId = (typeof loginThemePageIds)[number]; export type AccountThemePageId = (typeof accountThemePageIds)[number]; export type BuildOptionsLike = BuildOptionsLike.Standalone | BuildOptionsLike.ExternalAssets; diff --git a/src/bin/keycloakify/generateKeycloakThemeResources.ts b/src/bin/keycloakify/generateKeycloakThemeResources.ts index adf3a8fb..a8a87ca5 100644 --- a/src/bin/keycloakify/generateKeycloakThemeResources.ts +++ b/src/bin/keycloakify/generateKeycloakThemeResources.ts @@ -72,6 +72,10 @@ export async function generateKeycloakThemeResources(params: { let generateFtlFilesCode_glob: ReturnType["generateFtlFilesCode"] | undefined = undefined; for (const themeType of themeTypes) { + if (themeType === "account") { + continue; + } + const themeDirPath = getThemeDirPath(themeType); copy_app_resources_to_theme_path: { diff --git a/src/kcContext/KcContextBase.ts b/src/kcContext/KcContextBase.ts index 5dec0bae..d77c1ce0 100644 --- a/src/kcContext/KcContextBase.ts +++ b/src/kcContext/KcContextBase.ts @@ -1,4 +1,4 @@ -import type { LoginThemePageId, AccountThemePageId } from "../bin/keycloakify/generateFtl"; +import type { PageId } from "../bin/keycloakify/generateFtl"; import { assert } from "tsafe/assert"; import type { Equals } from "tsafe"; import type { MessageKeyBase } from "../i18n"; @@ -30,73 +30,59 @@ export type KcContextBase = | KcContextBase.LoginConfigTotp | KcContextBase.LogoutConfirm | KcContextBase.UpdateUserProfile - | KcContextBase.IdpReviewUserProfile - | KcContextBase.Password; + | KcContextBase.IdpReviewUserProfile; export declare namespace KcContextBase { - export namespace Common { - export type Login = { - url: { - loginAction: string; - resourcesPath: string; - resourcesCommonPath: string; - loginRestartFlowUrl: string; - loginUrl: string; - }; - realm: { - name: string; - displayName?: string; - displayNameHtml?: string; - internationalizationEnabled: boolean; - registrationEmailAsUsername: boolean; - }; - /** Undefined if !realm.internationalizationEnabled */ - locale?: { - supported: { - url: string; - label: string; - languageTag: string; - }[]; - currentLanguageTag: string; - }; - auth?: { - showUsername?: boolean; - showResetCredentials?: boolean; - showTryAnotherWayLink?: boolean; - attemptedUsername?: string; - }; - scripts: string[]; - message?: { - type: "success" | "warning" | "error" | "info"; - summary: string; - }; - client: { - clientId: string; - name?: string; - description?: string; - }; - isAppInitiatedAction: boolean; - messagesPerField: { - printIfExists: (fieldName: string, x: T) => T | undefined; - existsError: (fieldName: string) => boolean; - get: (fieldName: string) => string; - exists: (fieldName: string) => boolean; - }; + export type Common = { + url: { + loginAction: string; + resourcesPath: string; + resourcesCommonPath: string; + loginRestartFlowUrl: string; + loginUrl: string; }; - - export type Account = { - locale?: { - currentLanguageTag: string; - supported: { languageTag: string; url: string; label: string }[]; - }; - url: { - resourcesPath: string; - resourcesCommonPath: string; - }; + realm: { + name: string; + displayName?: string; + displayNameHtml?: string; + internationalizationEnabled: boolean; + registrationEmailAsUsername: boolean; }; - } + /** Undefined if !realm.internationalizationEnabled */ + locale?: { + supported: { + url: string; + label: string; + languageTag: string; + }[]; + currentLanguageTag: string; + }; + auth?: { + showUsername?: boolean; + showResetCredentials?: boolean; + showTryAnotherWayLink?: boolean; + attemptedUsername?: string; + }; + scripts: string[]; + message?: { + type: "success" | "warning" | "error" | "info"; + summary: string; + }; + client: { + clientId: string; + name?: string; + description?: string; + }; + isAppInitiatedAction: boolean; + messagesPerField: { + printIfExists: (fieldName: string, x: T) => T | undefined; + existsError: (fieldName: string) => boolean; + get: (fieldName: string) => string; + exists: (fieldName: string) => boolean; + }; + }; - export type Login = Common.Login & { + export type Login = Common & { pageId: "login.ftl"; url: { loginResetCredentialsUrl: string; @@ -152,7 +138,7 @@ export declare namespace KcContextBase { }; export namespace RegisterUserProfile { - export type CommonWithLegacy = Common.Login & { + export type CommonWithLegacy = Common & { url: { registrationAction: string; }; @@ -171,7 +157,7 @@ export declare namespace KcContextBase { }; } - export type Info = Common.Login & { + export type Info = Common & { pageId: "info.ftl"; messageHeader?: string; requiredActions?: ExtractAfterStartingWith<"requiredAction.", MessageKeyBase>[]; @@ -183,22 +169,22 @@ export declare namespace KcContextBase { }; }; - export type Error = Common.Login & { + export type Error = Common & { pageId: "error.ftl"; client?: { baseUrl?: string; }; - message: NonNullable; + message: NonNullable; }; - export type LoginResetPassword = Common.Login & { + export type LoginResetPassword = Common & { pageId: "login-reset-password.ftl"; realm: { loginWithEmailAllowed: boolean; }; }; - export type LoginVerifyEmail = Common.Login & { + export type LoginVerifyEmail = Common & { pageId: "login-verify-email.ftl"; //NOTE: Optional because maybe it wasn't defined in older keycloak versions. user?: { @@ -206,18 +192,18 @@ export declare namespace KcContextBase { }; }; - export type Terms = Common.Login & { + export type Terms = Common & { pageId: "terms.ftl"; }; - export type LoginOtp = Common.Login & { + export type LoginOtp = Common & { pageId: "login-otp.ftl"; otpLogin: { userOtpCredentials: { id: string; userLabel: string }[]; }; }; - export type LoginUsername = Common.Login & { + export type LoginUsername = Common & { pageId: "login-username.ftl"; url: { loginResetCredentialsUrl: string; @@ -247,7 +233,7 @@ export declare namespace KcContextBase { }; }; - export type LoginPassword = Common.Login & { + export type LoginPassword = Common & { pageId: "login-password.ftl"; url: { loginResetCredentialsUrl: string; @@ -270,7 +256,7 @@ export declare namespace KcContextBase { }; }; - export type WebauthnAuthenticate = Common.Login & { + export type WebauthnAuthenticate = Common & { pageId: "webauthn-authenticate.ftl"; authenticators: { authenticators: WebauthnAuthenticate.WebauthnAuthenticator[]; @@ -300,12 +286,12 @@ export declare namespace KcContextBase { }; } - export type LoginUpdatePassword = Common.Login & { + export type LoginUpdatePassword = Common & { pageId: "login-update-password.ftl"; username: string; }; - export type LoginUpdateProfile = Common.Login & { + export type LoginUpdateProfile = Common & { pageId: "login-update-profile.ftl"; user: { editUsernameAllowed: boolean; @@ -316,12 +302,12 @@ export declare namespace KcContextBase { }; }; - export type LoginIdpLinkConfirm = Common.Login & { + export type LoginIdpLinkConfirm = Common & { pageId: "login-idp-link-confirm.ftl"; idpAlias: string; }; - export type LoginIdpLinkEmail = Common.Login & { + export type LoginIdpLinkEmail = Common & { pageId: "login-idp-link-email.ftl"; brokerContext: { username: string; @@ -329,11 +315,11 @@ export declare namespace KcContextBase { idpAlias: string; }; - export type LoginPageExpired = Common.Login & { + export type LoginPageExpired = Common & { pageId: "login-page-expired.ftl"; }; - export type LoginConfigTotp = Common.Login & { + export type LoginConfigTotp = Common & { pageId: "login-config-totp.ftl"; mode?: "qr" | "manual" | undefined | null; totp: { @@ -361,7 +347,7 @@ export declare namespace KcContextBase { }; }; - export type LogoutConfirm = Common.Login & { + export type LogoutConfirm = Common & { pageId: "logout-confirm.ftl"; url: { logoutConfirmAction: string; @@ -375,7 +361,7 @@ export declare namespace KcContextBase { }; }; - export type UpdateUserProfile = Common.Login & { + export type UpdateUserProfile = Common & { pageId: "update-user-profile.ftl"; profile: { attributes: Attribute[]; @@ -383,7 +369,7 @@ export declare namespace KcContextBase { }; }; - export type IdpReviewUserProfile = Common.Login & { + export type IdpReviewUserProfile = Common & { pageId: "idp-review-user-profile.ftl"; profile: { context: "IDP_REVIEW"; @@ -391,13 +377,6 @@ export declare namespace KcContextBase { attributesByName: Record; }; }; - - export type Password = Common.Account & { - pageId: "password.ftl"; - url: { - passwordUrl: string; - }; - }; } export type Attribute = { @@ -517,4 +496,4 @@ export declare namespace Validators { }; } -assert>(); +assert>(); diff --git a/src/kcContext/getKcContextFromWindow.ts b/src/kcContext/getKcContextFromWindow.ts index 852e3cd0..93d2aeab 100644 --- a/src/kcContext/getKcContextFromWindow.ts +++ b/src/kcContext/getKcContextFromWindow.ts @@ -4,7 +4,7 @@ import { ftlValuesGlobalName } from "../bin/keycloakify/ftlValuesGlobalName"; export type ExtendsKcContextBase = [KcContextExtended] extends [never] ? KcContextBase - : AndByDiscriminatingKey<"pageId", KcContextExtended & KcContextBase.Common.Login, KcContextBase>; + : AndByDiscriminatingKey<"pageId", KcContextExtended & KcContextBase.Common, KcContextBase>; export function getKcContextFromWindow(): ExtendsKcContextBase | undefined { return typeof window === "undefined" ? undefined : (window as any)[ftlValuesGlobalName]; diff --git a/src/kcContext/kcContextMocks.ts b/src/kcContext/kcContextMocks.ts index f7a5a0e6..2d703d32 100644 --- a/src/kcContext/kcContextMocks.ts +++ b/src/kcContext/kcContextMocks.ts @@ -101,7 +101,7 @@ const attributes: Attribute[] = [ const attributesByName = Object.fromEntries(attributes.map(attribute => [attribute.name, attribute])) as any; -export const kcContextCommonMock: KcContextBase.Common.Login = { +export const kcContextCommonMock: KcContextBase.Common = { "url": { "loginAction": "#", "resourcesPath": pathJoin(PUBLIC_URL, mockTestingResourcesPath), diff --git a/src/lib/useFormValidation.tsx b/src/lib/useFormValidation.tsx index 57ea6205..73190cf1 100644 --- a/src/lib/useFormValidation.tsx +++ b/src/lib/useFormValidation.tsx @@ -14,7 +14,7 @@ import type { I18nBase as I18n } from "../i18n"; */ export function useFormValidation(params: { kcContext: { - messagesPerField: Pick; + messagesPerField: Pick; profile: { attributes: Attribute[]; }; @@ -187,7 +187,7 @@ export function useFormValidation(params: { /** Expect to be used in a component wrapped within a */ function useGetErrors(params: { kcContext: { - messagesPerField: Pick; + messagesPerField: Pick; profile: { attributes: { name: string; value?: string; validators: Validators }[]; }; diff --git a/yarn.lock b/yarn.lock index f05a6c0f..5bad95ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -673,7 +673,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -782,6 +782,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -843,6 +852,21 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concurrently@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.6.0.tgz#531a6f5f30cf616f355a4afb8f8fcb2bba65a49a" + integrity sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw== + dependencies: + chalk "^4.1.0" + date-fns "^2.29.1" + lodash "^4.17.21" + rxjs "^7.0.0" + shell-quote "^1.7.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^17.3.1" + convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" @@ -912,6 +936,11 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== +date-fns@^2.29.1: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.2, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -1501,6 +1530,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -2094,7 +2128,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.1: +rxjs@^7.0.0, rxjs@^7.5.1: version "7.8.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== @@ -2150,6 +2184,11 @@ shebang-regex@^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.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -2200,6 +2239,11 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== + ssri@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.1.tgz#c61f85894bbc6929fc3746f05e31cf5b44c030d5" @@ -2212,7 +2256,7 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2259,7 +2303,7 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -supports-color@8.1.1: +supports-color@8.1.1, supports-color@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -2322,6 +2366,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trough@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" @@ -2562,6 +2611,11 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^16.1.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -2575,6 +2629,19 @@ yargs@^16.1.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.3.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"