diff --git a/web/app/components/dashboard/new-features-banner.ts b/web/app/components/dashboard/new-features-banner.ts index 8137527f7..4566bd917 100644 --- a/web/app/components/dashboard/new-features-banner.ts +++ b/web/app/components/dashboard/new-features-banner.ts @@ -2,9 +2,11 @@ import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; import window from "ember-window-mock"; import { action } from "@ember/object"; +import Ember from "ember"; -export const NEW_FEATURES_BANNER_LOCAL_STORAGE_ITEM = - "july-20-2023-newFeatureBannerIsShown"; +export const NEW_FEATURES_BANNER_LOCAL_STORAGE_ITEM = Ember.testing + ? "test-newFeatureBannerIsShown" + : "july-20-2023-newFeatureBannerIsShown"; interface DashboardNewFeaturesBannerSignature { Args: {}; diff --git a/web/app/components/footer.ts b/web/app/components/footer.ts index a860dd481..d3db1f117 100644 --- a/web/app/components/footer.ts +++ b/web/app/components/footer.ts @@ -13,3 +13,9 @@ export default class FooterComponent extends Component { return new Date().getFullYear(); } } + +declare module "@glint/environment-ember-loose/registry" { + export default interface Registry { + Footer: typeof FooterComponent; + } +} diff --git a/web/app/components/header/nav.hbs b/web/app/components/header/nav.hbs index 966f82cbe..42c4020c3 100644 --- a/web/app/components/header/nav.hbs +++ b/web/app/components/header/nav.hbs @@ -75,14 +75,16 @@ class="text-body-200" /> + {{#if this.showSignOut}} { @service("config") declare configSvc: ConfigService; @service declare session: SessionService; @@ -49,9 +54,8 @@ export default class HeaderNavComponent extends Component {} + +declare module "@glint/environment-ember-loose/registry" { + export default interface Registry { + HermesLogo: typeof HermesLogoComponent; + } +} diff --git a/web/app/components/support/index.hbs b/web/app/components/support/index.hbs new file mode 100644 index 000000000..8272ef0a8 --- /dev/null +++ b/web/app/components/support/index.hbs @@ -0,0 +1,62 @@ +
+
+ + + Back to the Dashboard + +
+ + +
+ + + + +
+ +
    + {{#each @docs.sections as |section|}} +
  • +

    + {{#if section.titleIcon}} + + {{/if}} + + {{section.title}} + +

    +
      + {{#each section.items as |item|}} +
    • +

      {{item.title}}

      +
      + {{markdown-to-html item.content}} +
      + {{#if item.links}} + + {{/if}} +
    • + {{/each}} +
    +
  • + {{/each}} +
+
+
+
diff --git a/web/app/components/support/index.ts b/web/app/components/support/index.ts new file mode 100644 index 000000000..38ce81451 --- /dev/null +++ b/web/app/components/support/index.ts @@ -0,0 +1,15 @@ +import Component from "@glimmer/component"; + +interface SupportComponentSignature { + Args: { + docs: any; + }; +} + +export default class SupportComponent extends Component {} + +declare module "@glint/environment-ember-loose/registry" { + export default interface Registry { + Support: typeof SupportComponent; + } +} diff --git a/web/app/router.js b/web/app/router.js index 9c7f6cdd1..c7c46fb14 100644 --- a/web/app/router.js +++ b/web/app/router.js @@ -20,5 +20,6 @@ Router.map(function () { }); }); this.route("authenticate"); - this.route('404', { path: '/*path' }) + this.route("404", { path: "/*path" }); + this.route("support"); }); diff --git a/web/app/routes/support.ts b/web/app/routes/support.ts new file mode 100644 index 000000000..d61db2d0a --- /dev/null +++ b/web/app/routes/support.ts @@ -0,0 +1,120 @@ +import Route from "@ember/routing/route"; + +const insertIcon = (icon: string, optionalClassName?: string) => { + return ` + + + + + + `; +}; + +export default class SupportRoute extends Route { + model() { + return { + sections: [ + { + title: "Known limitations", + titleIcon: "alert-diamond", + items: [ + { + title: "Doc suggestions must be accepted off-site", + content: `Unfortunately, Google disables this function for embedded documents like you see in Hermes. To accept suggestions, you'll need to open your document directly in Google. Look for the ${insertIcon( + "external-link" + )} button in the Hermes document sidebar.\nnd ain't that the truth pal.`, + }, + { + title: "Suggestions in the header will lock your document.", + content: + "If this happens, remove the suggestions from your document header, wait a few minutes (for Hermes to notice the change), then refresh. If your document is still locked after 10 minutes, please get in touch.", + }, + { + title: 'You must manually enable "all notifications."', + content: `By default, you'll get emailed about @-mentions and threads involving you. To receive all comments, you'll need to open your doc in Google (${insertIcon( + "external-link", + "with-parentheses" + )}), then [follow these instructions](https://support.google.com/docs/answer/91588).`, + }, + ], + }, + { + title: "Frequency asked questions", + titleIcon: "discussion-square", + items: [ + { + title: "Why am I getting 400 errors from Google?", + content: + "This is usually caused by content blockers or browser security settings. Safe-listing the Hermes domain will typically resolve the issue.", + }, + { + title: "Why did Hermes assign the wrong document number?", + content: + "Generally this happens when a document created outside of Hermes is moved into the Hermes folder. We don't have an automated fix for this yet.", + }, + { + title: "How do I add teams as contributors/approvers?", + content: + "We don't yet support team and group email addresses, so you'll need to invite them off-site. If you want to share a draft, be sure to make it \"Shareable\" first.", + }, + { + title: "How do I delete a document?", + content: `Published docs can't be deleted, only archived (${insertIcon( + "archive", + "with-parentheses" + )}). Drafts, on the other hand, can be deleted using the ${insertIcon( + "trash", + "critical" + )} button the document sidebar.`, + }, + { + title: "Can I transfer or share document ownership?", + content: "Our current implementation doesn't yet support this.", + }, + { + title: "Why aren't drafts showing up in the shared Drive folder?", + content: + "Drafts are kept out of the shared folder until they're published. If you need to find the file on Drive, you'll have to search it by name.", + }, + ], + }, + { + title: "Additional help", + titleIcon: "support", + items: [ + { + title: "Still have a question, bug, or request?", + content: + "HashiCorp employees are encouraged to contact us on Slack. Open-source users should reach out on GitHub Issues.", + links: [ + { + title: "TODO:slackName", + icon: "slack", + url: "TODO:slackURL", + }, + { + title: "TODO:emailName", + icon: "mail", + url: "mailto:TODO:EMAIL", + }, + { + title: "GitHub Issues", + icon: "github", + url: "https://github.com/hashicorp-forge/hermes/issues", + }, + ], + }, + ], + }, + ], + }; + } +} diff --git a/web/app/styles/app.scss b/web/app/styles/app.scss index d086ff9e0..71314b85c 100644 --- a/web/app/styles/app.scss +++ b/web/app/styles/app.scss @@ -3,7 +3,7 @@ @use "./animations"; @use "./typography"; - +@use "routes/support"; @use "components/action"; @use "components/toolbar"; @use "components/tooltip"; diff --git a/web/app/styles/routes/support.scss b/web/app/styles/routes/support.scss new file mode 100644 index 000000000..38992d2e7 --- /dev/null +++ b/web/app/styles/routes/support.scss @@ -0,0 +1,70 @@ +.hermes-support { + .header-link { + @apply flex items-center space-x-2 text-color-foreground-faint; + + &:hover { + @apply text-color-foreground-primary; + } + } + + .page-card { + @apply w-full px-24 pt-14 pb-20 text-body-300; + } + + .hermes-support-header { + @apply flex items-center space-x-3 mb-12; + } + + .content-sections { + @apply space-y-14; + + a { + @apply underline text-color-foreground-faint; + + &:hover { + @apply text-color-foreground-primary; + } + } + } + + .content-section > h2 { + @apply flex items-center space-x-2.5 mb-4; + + svg { + @apply text-color-foreground-action; + } + } + + .content-section-items { + @apply space-y-6; + + .links { + @apply mt-5 space-y-1.5; + + svg { + @apply text-color-foreground-primary; + } + + a { + @apply flex space-x-2 items-center; + } + } + } + + .inline-icon { + @apply border border-color-border-primary bg-color-palette-neutral-100 rounded; + @apply inline-flex py-1 px-[7px]; + + // Some tweaks to make the icon align with the text + @apply relative translate-y-0.5 mx-px -my-1; + + &.with-parentheses { + // Bring the icon closer to the parentheses + @apply -mx-0.5; + } + + &.critical { + @apply bg-color-surface-critical border-color-border-critical text-color-foreground-critical-on-surface; + } + } +} diff --git a/web/app/templates/support.hbs b/web/app/templates/support.hbs new file mode 100644 index 000000000..dcd63ce18 --- /dev/null +++ b/web/app/templates/support.hbs @@ -0,0 +1,4 @@ +{{page-title "Support"}} +{{set-body-class "bg-color-page-faint hermes-support"}} + + diff --git a/web/package.json b/web/package.json index 0c3a4ab6f..f162df1b9 100644 --- a/web/package.json +++ b/web/package.json @@ -76,6 +76,7 @@ "ember-cli-htmlbars": "^5.7.2", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-mirage": "^2.4.0", + "ember-cli-showdown": "^7.0.0", "ember-cli-sri": "^2.1.1", "ember-cli-string-helpers": "^6.1.0", "ember-cli-terser": "^4.0.2", diff --git a/web/tailwind.config.js b/web/tailwind.config.js index 91f0be734..54e7d3c57 100644 --- a/web/tailwind.config.js +++ b/web/tailwind.config.js @@ -65,6 +65,7 @@ module.exports = { "var(--token-color-surface-interactive-hover)", "color-surface-primary": "var(--token-color-surface-primary)", "color-surface-strong": "var(--token-color-surface-strong)", + "color-surface-success": "var(--token-color-surface-success)", "color-surface-warning": "var(--token-color-surface-warning)", // Border @@ -74,6 +75,7 @@ module.exports = { "color-border-faint": "var(--token-color-border-faint)", "color-border-primary": "var(--token-color-border-primary)", "color-border-strong": "var(--token-color-border-strong)", + "color-border-success": "var(--token-color-border-success)", "color-border-warning": "var(--token-color-border-warning)", // Page @@ -94,6 +96,11 @@ module.exports = { "color-foreground-high-contrast": "var(--token-color-foreground-high-contrast)", "color-foreground-highlight": "var(--token-color-foreground-highlight)", + "color-foreground-highlight-on-surface": + "var(--token-color-foreground-highlight-on-surface)", + "color-foreground-success": "var(--token-color-foreground-success)", + "color-foreground-success-on-surface": + "var(--token-color-foreground-success-on-surface)", "color-foreground-primary": "var(--token-color-foreground-primary)", "color-foreground-strong": "var(--token-color-foreground-strong)", "color-foreground-warning": "var(--token-color-foreground-warning)", diff --git a/web/tests/acceptance/support-test.ts b/web/tests/acceptance/support-test.ts new file mode 100644 index 000000000..7dba7daf9 --- /dev/null +++ b/web/tests/acceptance/support-test.ts @@ -0,0 +1,17 @@ +import { visit } from "@ember/test-helpers"; +import { setupApplicationTest } from "ember-qunit"; +import { module, test } from "qunit"; +import { MirageTestContext, setupMirage } from "ember-cli-mirage/test-support"; +import { getPageTitle } from "ember-page-title/test-support"; + +interface AuthenticateRouteTestContext extends MirageTestContext {} + +module("Acceptance | support", function (hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + test("the page title is correct", async function (this: AuthenticateRouteTestContext, assert) { + await visit("/support"); + assert.equal(getPageTitle(), "Support | Hermes"); + }); +}); diff --git a/web/tests/integration/components/header/nav-test.ts b/web/tests/integration/components/header/nav-test.ts index 9b3cbbb06..9303335a3 100644 --- a/web/tests/integration/components/header/nav-test.ts +++ b/web/tests/integration/components/header/nav-test.ts @@ -6,6 +6,10 @@ import { setupWindowMock } from "ember-window-mock/test-support"; import AuthenticatedUserService from "hermes/services/authenticated-user"; import { setupMirage } from "ember-cli-mirage/test-support"; import window from "ember-window-mock"; +import { NEW_NAV_ITEM_LOCAL_STORAGE_KEY } from "hermes/components/header/nav"; + +const HIGHLIGHTED_NEW_TEXT_SELECTOR = + ".highlighted-new .hds-dropdown-list-item__interactive-text"; module("Integration | Component | header/nav", function (hooks) { setupRenderingTest(hooks); @@ -27,10 +31,7 @@ module("Integration | Component | header/nav", function (hooks) { }); test("it renders correctly", async function (assert) { - await render(hbs` - {{! @glint-nocheck: not typesafe yet }} - - `); + await render(hbs``); assert.dom(".header-nav").exists(); assert.dom('[data-test-nav-link="all"]').hasAttribute("href", "/all"); @@ -44,25 +45,21 @@ module("Integration | Component | header/nav", function (hooks) { assert.dom("[data-test-user-menu-title]").hasText("Foo Bar"); assert.dom("[data-test-user-menu-email]").hasText("foo@example.com"); + assert.dom('[data-test-user-menu-item="support"]').hasText("Support"); assert .dom('[data-test-user-menu-item="email-notifications"]') .hasText("Email notifications"); - assert.dom('[data-test-user-menu-item="sign-out"]').hasText("Sign out"); }); test("it shows an icon when the user menu has something to highlight", async function (assert) { - await render(hbs` - {{! @glint-nocheck: not typesafe yet }} - - `); + window.localStorage.removeItem(NEW_NAV_ITEM_LOCAL_STORAGE_KEY); - assert.equal( - window.localStorage.getItem("emailNotificationsHighlightIsShown"), - null - ); + await render(hbs``); - assert.dom("[data-test-user-menu-highlight]").exists("highlight is shown"); + assert + .dom("[data-test-user-menu-highlight]") + .exists("the highlight dot is shown"); await click("[data-test-user-menu-toggle]"); @@ -71,7 +68,7 @@ module("Integration | Component | header/nav", function (hooks) { .doesNotExist("highlight is hidden when the menu is open"); assert - .dom(".highlighted-new .hds-dropdown-list-item__interactive-text") + .dom(HIGHLIGHTED_NEW_TEXT_SELECTOR) .hasPseudoElementStyle( "after", { content: '"New"' }, @@ -83,7 +80,7 @@ module("Integration | Component | header/nav", function (hooks) { await click("[data-test-user-menu-toggle]"); assert - .dom(".highlighted-new") - .doesNotExist("highlight is hidden after the menu is closed"); + .dom(HIGHLIGHTED_NEW_TEXT_SELECTOR) + .doesNotExist('the "highlighted-new" class is removed'); }); }); diff --git a/web/tsconfig.json b/web/tsconfig.json index 6c9ea2f9e..6fdc126a6 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -25,6 +25,7 @@ "tests/**/*", "types/**/*", "node_modules/@gavant/glint-template-types/types/ember-animated/*", + "node_modules/@gavant/glint-template-types/types/ember-cli-showdown/markdown-to-html.d.ts", "node_modules/@gavant/glint-template-types/types/ember-click-outside/modifier.d.ts", "node_modules/@gavant/glint-template-types/types/ember-concurrency/perform.d.ts", "node_modules/@gavant/glint-template-types/types/ember-on-helper/on-document.d.ts", diff --git a/web/types/glint/index.d.ts b/web/types/glint/index.d.ts index 1b658895e..8933b7b7f 100644 --- a/web/types/glint/index.d.ts +++ b/web/types/glint/index.d.ts @@ -38,6 +38,7 @@ import { AnimatedIfCurly } from "ember-animated/components/animated-if"; import { FlashMessageComponent } from "ember-cli-flash/flash-message"; import OnClickOutsideModifier from "ember-click-outside/modifiers/on-click-outside"; import { HdsFormErrorComponent } from "hds/form/error"; +import { MarkdownToHtmlCurly } from "ember-cli-showdown/components/markdown-to-html"; declare module "@glint/environment-ember-loose/registry" { export default interface Registry { @@ -45,6 +46,7 @@ declare module "@glint/environment-ember-loose/registry" { "will-destroy": typeof WillDestroyModifier; "on-document": typeof OnDocumentHelper; "click-outside": typeof OnClickOutsideModifier; + "markdown-to-html": typeof MarkdownToHtmlCurly AnimatedContainer: typeof AnimatedContainer; AnimatedValue: typeof AnimatedValue; AnimatedOrphans: typeof AnimatedOrphans; diff --git a/web/yarn.lock b/web/yarn.lock index 1898832ff..415a8bb38 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -3986,7 +3986,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.0.0, ansi-styles@npm:^3.2.1": +"ansi-styles@npm:^3.0.0, ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" dependencies: @@ -6412,6 +6412,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:^5.0.0": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + "can-symlink@npm:^1.0.0": version: 1.0.0 resolution: "can-symlink@npm:1.0.0" @@ -6704,6 +6711,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^5.0.0": + version: 5.0.0 + resolution: "cliui@npm:5.0.0" + dependencies: + string-width: ^3.1.0 + strip-ansi: ^5.2.0 + wrap-ansi: ^5.1.0 + checksum: 0bb8779efe299b8f3002a73619eaa8add4081eb8d1c17bc4fedc6240557fb4eacdc08fe87c39b002eacb6cfc117ce736b362dbfd8bf28d90da800e010ee97df4 + languageName: node + linkType: hard + "cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -7282,6 +7300,13 @@ __metadata: languageName: node linkType: hard +"decamelize@npm:^1.2.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa + languageName: node + linkType: hard + "decode-uri-component@npm:^0.2.0": version: 0.2.2 resolution: "decode-uri-component@npm:0.2.2" @@ -7699,7 +7724,7 @@ __metadata: languageName: node linkType: hard -"ember-auto-import@npm:^2.6.0": +"ember-auto-import@npm:^2.6.0, ember-auto-import@npm:^2.6.3": version: 2.6.3 resolution: "ember-auto-import@npm:2.6.3" dependencies: @@ -8126,6 +8151,20 @@ __metadata: languageName: node linkType: hard +"ember-cli-showdown@npm:^7.0.0": + version: 7.0.0 + resolution: "ember-cli-showdown@npm:7.0.0" + dependencies: + ember-auto-import: ^2.6.3 + ember-cli-babel: ^7.26.11 + ember-cli-htmlbars: ^6.2.0 + showdown: ^1.8.6 + peerDependencies: + ember-source: ^3.12.0 || >4.0.0 + checksum: 3fe9aa3ad7aa0660792155d2a3ab3ae47573685bc4cd781f1855d81c774714cf6f52c4975525140060d44f76878c2556e143191b86fd3a15c7dd721246342f16 + languageName: node + linkType: hard + "ember-cli-sri@npm:^2.1.1": version: 2.1.1 resolution: "ember-cli-sri@npm:2.1.1" @@ -9101,6 +9140,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^7.0.1": + version: 7.0.3 + resolution: "emoji-regex@npm:7.0.3" + checksum: 9159b2228b1511f2870ac5920f394c7e041715429a68459ebe531601555f11ea782a8e1718f969df2711d38c66268174407cbca57ce36485544f695c2dfdc96e + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -10615,7 +10661,7 @@ __metadata: languageName: node linkType: hard -"get-caller-file@npm:^2.0.5": +"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 @@ -11174,6 +11220,7 @@ __metadata: ember-cli-inject-live-reload: ^2.1.0 ember-cli-mirage: ^2.4.0 ember-cli-postcss: ^8.0.0 + ember-cli-showdown: ^7.0.0 ember-cli-sri: ^2.1.1 ember-cli-string-helpers: ^6.1.0 ember-cli-terser: ^4.0.2 @@ -15456,6 +15503,13 @@ __metadata: languageName: node linkType: hard +"require-main-filename@npm:^2.0.0": + version: 2.0.0 + resolution: "require-main-filename@npm:2.0.0" + checksum: e9e294695fea08b076457e9ddff854e81bffbe248ed34c1eec348b7abbd22a0d02e8d75506559e2265e96978f3c4720bd77a6dad84755de8162b357eb6c778c7 + languageName: node + linkType: hard + "require-relative@npm:^0.8.7": version: 0.8.7 resolution: "require-relative@npm:0.8.7" @@ -16103,6 +16157,17 @@ __metadata: languageName: node linkType: hard +"showdown@npm:^1.8.6": + version: 1.9.1 + resolution: "showdown@npm:1.9.1" + dependencies: + yargs: ^14.2 + bin: + showdown: bin/showdown.js + checksum: d6aac199cb28c2b89bce804eddda928c816e5a2b0e0e6dfe66db8ced6968e237995bf1d547046c9970b804e5c3181b1a55740883e1332c837024668f9c031a01 + languageName: node + linkType: hard + "side-channel@npm:^1.0.4": version: 1.0.4 resolution: "side-channel@npm:1.0.4" @@ -16612,6 +16677,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^3.0.0, string-width@npm:^3.1.0": + version: 3.1.0 + resolution: "string-width@npm:3.1.0" + dependencies: + emoji-regex: ^7.0.1 + is-fullwidth-code-point: ^2.0.0 + strip-ansi: ^5.1.0 + checksum: 57f7ca73d201682816d573dc68bd4bb8e1dff8dc9fcf10470fdfc3474135c97175fec12ea6a159e67339b41e86963112355b64529489af6e7e70f94a7caf08b2 + languageName: node + linkType: hard + "string.prototype.matchall@npm:^4.0.5": version: 4.0.8 resolution: "string.prototype.matchall@npm:4.0.8" @@ -16704,7 +16780,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^5.1.0, strip-ansi@npm:^5.2.0": +"strip-ansi@npm:^5.0.0, strip-ansi@npm:^5.1.0, strip-ansi@npm:^5.2.0": version: 5.2.0 resolution: "strip-ansi@npm:5.2.0" dependencies: @@ -18066,6 +18142,13 @@ __metadata: languageName: node linkType: hard +"which-module@npm:^2.0.0": + version: 2.0.1 + resolution: "which-module@npm:2.0.1" + checksum: 1967b7ce17a2485544a4fdd9063599f0f773959cca24176dbe8f405e55472d748b7c549cd7920ff6abb8f1ab7db0b0f1b36de1a21c57a8ff741f4f1e792c52be + languageName: node + linkType: hard + "which@npm:^1.2.14, which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" @@ -18154,6 +18237,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^5.1.0": + version: 5.1.0 + resolution: "wrap-ansi@npm:5.1.0" + dependencies: + ansi-styles: ^3.2.0 + string-width: ^3.0.0 + strip-ansi: ^5.0.0 + checksum: 9b48c862220e541eb0daa22661b38b947973fc57054e91be5b0f2dcc77741a6875ccab4ebe970a394b4682c8dfc17e888266a105fb8b0a9b23c19245e781ceae + languageName: node + linkType: hard + "wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -18258,6 +18352,16 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^15.0.1": + version: 15.0.3 + resolution: "yargs-parser@npm:15.0.3" + dependencies: + camelcase: ^5.0.0 + decamelize: ^1.2.0 + checksum: 06611c1893fa9f1c25ae79df3c6e2edbac7c8d75257a4b55b8432cbc87ee03eda86bea0537f65b4b8a0d9684c83fa6e9ef61ef720a1e5cc8a9aa6893b54ee4c3 + languageName: node + linkType: hard + "yargs-parser@npm:^20.2.2": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" @@ -18272,6 +18376,25 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^14.2": + version: 14.2.3 + resolution: "yargs@npm:14.2.3" + dependencies: + cliui: ^5.0.0 + decamelize: ^1.2.0 + find-up: ^3.0.0 + get-caller-file: ^2.0.1 + require-directory: ^2.1.1 + require-main-filename: ^2.0.0 + set-blocking: ^2.0.0 + string-width: ^3.0.0 + which-module: ^2.0.0 + y18n: ^4.0.0 + yargs-parser: ^15.0.1 + checksum: 684fcb1896e6c873c31c09c5c16445d6253dfe505aa879cff56d49425f5bca44f2ab8d7a1c949f3b932ae8654128425e89770e5e2f2c3d816e5816b9eb6efb6f + languageName: node + linkType: hard + "yargs@npm:^16.2.0": version: 16.2.0 resolution: "yargs@npm:16.2.0"