From 359f9fa6e4f4cdc15fc6904d9f8187adba4f8d64 Mon Sep 17 00:00:00 2001 From: Franck Cornu Date: Sun, 2 Jul 2023 21:45:14 -0400 Subject: [PATCH 1/4] Added search components --- .prettierignore | 3 +- package.json | 11 +- .../src/components/components.ts | 6 + .../mgt-search-filters/mgt-base-filter.ts | 298 ++++++ .../mgt-checkbox-filter.ts | 257 +++++ .../mgt-checkbox-filter/strings.ts | 7 + .../mgt-date-filter/mgt-date-filter.ts | 298 ++++++ .../mgt-date-filter/strings.ts | 15 + .../mgt-search-filters/mgt-search-filters.ts | 536 ++++++++++ .../components/mgt-search-filters/strings.ts | 4 + .../mgt-search-results/loc/strings.default.ts | 105 ++ .../mgt-adaptive-card/mgt-adaptive-card.ts | 220 +++++ .../mgt-search-results/mgt-search-results.ts | 932 ++++++++++++++++++ .../mgt-search-verticals.scss | 1 + .../mgt-search-verticals.ts | 179 ++++ .../mgt-search-verticals/strings.default.ts | 3 + .../mgt-search-verticals/strings.fr-fr.ts | 3 + .../tests/mgt-search-verticals.test.ts | 125 +++ .../mgt-search-verticals/tests/mocks.ts | 23 + .../src/styles/tailwind-styles.module.ts | 13 + packages/mgt-element/package.json | 9 +- packages/mgt-element/src/Constants.ts | 35 + .../src/components/connectableComponent.ts | 74 ++ .../src/events/ISearchFiltersEventData.ts.ts | 13 + .../src/events/ISearchInputEventData.ts | 3 + .../src/events/ISearchResultsEventData.ts | 12 + .../src/events/ISearchSortEventData.ts | 8 + .../src/events/ISearchVerticalEventData.ts | 8 + .../src/helpers/DataFilterHelper.ts | 120 +++ .../mgt-element/src/helpers/DateHelper.ts | 144 +++ .../mgt-element/src/helpers/ObjectHelper.ts | 54 + .../src/helpers/SearchResultsHelper.ts | 91 ++ .../mgt-element/src/helpers/StringHelper.ts | 6 + packages/mgt-element/src/helpers/UrlHelper.ts | 114 +++ packages/mgt-element/src/index.ts | 37 + .../mgt-element/src/models/BuiltinTemplate.ts | 4 + .../src/models/IComponentBinding.ts | 17 + .../mgt-element/src/models/IDataFilter.ts | 81 ++ .../src/models/IDataFilterConfiguration.ts | 111 +++ .../mgt-element/src/models/IDataSourceData.ts | 25 + .../src/models/IDataVerticalConfiguration.ts | 34 + .../src/models/ILocalizedString.ts | 11 + .../models/IMicrosoftSearchDataSourceData.ts | 11 + .../src/models/IMicrosoftSearchRequest.ts | 74 ++ .../src/models/IMicrosoftSearchResponse.ts | 73 ++ .../src/models/IResultTemplates.ts | 6 + .../src/models/ISortFieldConfiguration.ts | 33 + .../src/models/IThemeDefinition.ts | 3 + .../src/services/IMicrosoftSearchService.ts | 19 + .../src/services/ITemplateService.ts | 48 + .../mgt-element/src/services/ITokenService.ts | 20 + .../src/services/MicrosoftSearchService.ts | 142 +++ .../src/services/TemplateService.ts | 208 ++++ .../mgt-element/src/services/TokenService.ts | 77 ++ .../src/utils/IComponentBinding.ts | 17 + .../mgt-element/src/utils/ILocalizedString.ts | 11 + packages/mgt/package.json | 6 +- packages/mgt/postcss.config.js | 10 + packages/mgt/rollup.config.js | 5 +- packages/mgt/tailwind.config.js | 11 + tsconfig.base.json | 2 +- tsconfig.web-test-runner.json | 8 + web-test-runner.config.mjs | 49 + 63 files changed, 4875 insertions(+), 8 deletions(-) create mode 100644 packages/mgt-components/src/components/mgt-search-filters/mgt-base-filter.ts create mode 100644 packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts create mode 100644 packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/strings.ts create mode 100644 packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts create mode 100644 packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/strings.ts create mode 100644 packages/mgt-components/src/components/mgt-search-filters/mgt-search-filters.ts create mode 100644 packages/mgt-components/src/components/mgt-search-filters/strings.ts create mode 100644 packages/mgt-components/src/components/mgt-search-results/loc/strings.default.ts create mode 100644 packages/mgt-components/src/components/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts create mode 100644 packages/mgt-components/src/components/mgt-search-results/mgt-search-results.ts create mode 100644 packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.scss create mode 100644 packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.ts create mode 100644 packages/mgt-components/src/components/mgt-search-verticals/strings.default.ts create mode 100644 packages/mgt-components/src/components/mgt-search-verticals/strings.fr-fr.ts create mode 100644 packages/mgt-components/src/components/mgt-search-verticals/tests/mgt-search-verticals.test.ts create mode 100644 packages/mgt-components/src/components/mgt-search-verticals/tests/mocks.ts create mode 100644 packages/mgt-components/src/styles/tailwind-styles.module.ts create mode 100644 packages/mgt-element/src/Constants.ts create mode 100644 packages/mgt-element/src/components/connectableComponent.ts create mode 100644 packages/mgt-element/src/events/ISearchFiltersEventData.ts.ts create mode 100644 packages/mgt-element/src/events/ISearchInputEventData.ts create mode 100644 packages/mgt-element/src/events/ISearchResultsEventData.ts create mode 100644 packages/mgt-element/src/events/ISearchSortEventData.ts create mode 100644 packages/mgt-element/src/events/ISearchVerticalEventData.ts create mode 100644 packages/mgt-element/src/helpers/DataFilterHelper.ts create mode 100644 packages/mgt-element/src/helpers/DateHelper.ts create mode 100644 packages/mgt-element/src/helpers/ObjectHelper.ts create mode 100644 packages/mgt-element/src/helpers/SearchResultsHelper.ts create mode 100644 packages/mgt-element/src/helpers/StringHelper.ts create mode 100644 packages/mgt-element/src/helpers/UrlHelper.ts create mode 100644 packages/mgt-element/src/models/BuiltinTemplate.ts create mode 100644 packages/mgt-element/src/models/IComponentBinding.ts create mode 100644 packages/mgt-element/src/models/IDataFilter.ts create mode 100644 packages/mgt-element/src/models/IDataFilterConfiguration.ts create mode 100644 packages/mgt-element/src/models/IDataSourceData.ts create mode 100644 packages/mgt-element/src/models/IDataVerticalConfiguration.ts create mode 100644 packages/mgt-element/src/models/ILocalizedString.ts create mode 100644 packages/mgt-element/src/models/IMicrosoftSearchDataSourceData.ts create mode 100644 packages/mgt-element/src/models/IMicrosoftSearchRequest.ts create mode 100644 packages/mgt-element/src/models/IMicrosoftSearchResponse.ts create mode 100644 packages/mgt-element/src/models/IResultTemplates.ts create mode 100644 packages/mgt-element/src/models/ISortFieldConfiguration.ts create mode 100644 packages/mgt-element/src/models/IThemeDefinition.ts create mode 100644 packages/mgt-element/src/services/IMicrosoftSearchService.ts create mode 100644 packages/mgt-element/src/services/ITemplateService.ts create mode 100644 packages/mgt-element/src/services/ITokenService.ts create mode 100644 packages/mgt-element/src/services/MicrosoftSearchService.ts create mode 100644 packages/mgt-element/src/services/TemplateService.ts create mode 100644 packages/mgt-element/src/services/TokenService.ts create mode 100644 packages/mgt-element/src/utils/IComponentBinding.ts create mode 100644 packages/mgt-element/src/utils/ILocalizedString.ts create mode 100644 packages/mgt/postcss.config.js create mode 100644 packages/mgt/tailwind.config.js create mode 100644 tsconfig.web-test-runner.json create mode 100644 web-test-runner.config.mjs diff --git a/.prettierignore b/.prettierignore index 84b0aa3ab9..6846199bbc 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,4 +2,5 @@ *.md **/dist **/generated -**/lib \ No newline at end of file +**/lib +tailwind-styles.module.ts \ No newline at end of file diff --git a/package.json b/package.json index ab0064bbe1..bd07aab261 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "@custom-elements-manifest/analyzer": "^0.6.6", "@microsoft/eslint-config-msgraph": "^1.0.0", "@octokit/rest": "^18.5.3", + "@open-wc/testing": "3.1.7", "@open-wc/testing-helpers": "^2.1.4", "@storybook/addon-a11y": "^6.4.4", "@storybook/addon-actions": "^6.4.4", @@ -106,6 +107,8 @@ "@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/parser": "^5.59.0", "@web/dev-server": "^0.1.10", + "@web/test-runner": "0.15.0", + "@web/dev-server-esbuild": "0.3.3", "@webcomponents/webcomponentsjs": "^2.5.0", "babel-loader": "^8.2.1", "core-js": "^3.7.0", @@ -159,7 +162,13 @@ "ts-jest": "^29.0.3", "typescript": "^5.1.3", "web-component-analyzer": "^1.1.6", - "whatwg-fetch": "^3.6.2" + "whatwg-fetch": "^3.6.2", + "tailwindcss": "3.2.4", + "postcss": "^8.4.19", + "postcss-lit": "1.0.1", + "cssnano": "6.0.1", + "autoprefixer": "10.4.13", + "sinon": "15.0.1" }, "husky": { "hooks": { diff --git a/packages/mgt-components/src/components/components.ts b/packages/mgt-components/src/components/components.ts index cc425c3462..9d73324bbf 100644 --- a/packages/mgt-components/src/components/components.ts +++ b/packages/mgt-components/src/components/components.ts @@ -25,6 +25,9 @@ import './mgt-messages/mgt-messages'; import './mgt-organization/mgt-organization'; import './mgt-profile/mgt-profile'; import './mgt-theme-toggle/mgt-theme-toggle'; +import './mgt-search-results/mgt-search-results'; +import './mgt-search-verticals/mgt-search-verticals'; +import './mgt-search-filters/mgt-search-filters'; export * from './mgt-agenda/mgt-agenda'; export * from './mgt-file/mgt-file'; @@ -47,3 +50,6 @@ export * from './mgt-messages/mgt-messages'; export * from './mgt-organization/mgt-organization'; export * from './mgt-profile/mgt-profile'; export * from './mgt-theme-toggle/mgt-theme-toggle'; +export * from './mgt-search-results/mgt-search-results'; +export * from './mgt-search-verticals/mgt-search-verticals'; +export * from './mgt-search-filters/mgt-search-filters'; diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-base-filter.ts b/packages/mgt-components/src/components/mgt-search-filters/mgt-base-filter.ts new file mode 100644 index 0000000000..f1fbab26ab --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-filters/mgt-base-filter.ts @@ -0,0 +1,298 @@ +import { MgtConnectableComponent } from '@microsoft/mgt-element'; +import { property, state, html, PropertyValues, TemplateResult } from 'lit-element'; +import { isEqual, cloneDeep, sumBy, orderBy } from 'lodash-es'; +import { IDataFilterResult, IDataFilterValue, IDataFilterResultValue } from '@microsoft/mgt-element'; +import { IDataFilterConfiguration, FilterSortType, FilterSortDirection } from '@microsoft/mgt-element'; +import { fluentSelect, fluentOption, provideFluentDesignSystem, fluentListbox } from '@fluentui/web-components'; +import { styles as tailwindStyles } from '../../styles/tailwind-styles-css'; + +export enum DateFilterKeys { + From = 'from', + To = 'to' +} + +export abstract class MgtBaseFilterComponent extends MgtConnectableComponent { + /** + * Filter information to display + */ + @property() + filter: IDataFilterResult; + + /** + * Filter confguration + */ + @property() + filterConfiguration: IDataFilterConfiguration; + + /** + * Flag indicating if the filter should be disabled + */ + @property() + disabled: boolean; + + /** + * Callback function when a filter is selected + */ + @property() + onFilterUpdated: (filterName: string, filterValue: IDataFilterValue, selected: boolean) => void; + + /** + * Callback function when filters are submitted + */ + @property() + onApplyFilters: (filterName: string) => void; + + @state() + isExpanded: boolean; + + /** + * The current selected values in the component + */ + @state() + selectedValues: IDataFilterValue[] = []; + + /** + * The submitted filter values + */ + public declare submittedFilterValues: IDataFilterValue[]; + + /** + * Mutation observer for the fitler button + */ + declare buttonObserver: MutationObserver; + + protected get localizedFilterName(): string { + return this.getLocalizedString(this.filterConfiguration.displayName); + } + + /** + * Flag indicating if the selected values can be applied as filters + */ + protected get canApplyValues(): boolean { + return !isEqual(this.submittedFilterValues.map(v => v.value).sort(), this.selectedValues.map(v => v.value).sort()); + } + + public constructor() { + super(); + + this.submittedFilterValues = []; + + this.onItemUpdated = this.onItemUpdated.bind(this); + this.applyFilters = this.applyFilters.bind(this); + this.closeMenu = this.closeMenu.bind(this); + + // Register fluent tabs (as scoped elements) + provideFluentDesignSystem().register(fluentSelect(), fluentOption(), fluentListbox()); + } + + public render() { + let renderFilterName = html`${this.localizedFilterName}`; + + if (this.submittedFilterValues.length === 1) { + renderFilterName = html`${this.submittedFilterValues[0].name}`; + } + + if (this.submittedFilterValues.length > 1) { + // Display only filter values submitted and present in the available filter values + // Multiple refinement steps can lead initial selected values to not be included in the available values + const selectedValues = this.submittedFilterValues.filter(s => { + return ( + this.filter.values.map(v => v.key).indexOf(s.key) !== -1 || + s.key === DateFilterKeys.From || + s.key === DateFilterKeys.To + ); + }); + + renderFilterName = html` +
+
${this.localizedFilterName}
+
${selectedValues.length}
+
+ `; + } + + return html` + + +
+ ${renderFilterName} +
+ +
{ + e.stopPropagation(); + }}> + ${this.renderFilterContent()} +
+
+ `; + } + + protected firstUpdated(changedProperties: PropertyValues): void { + // Set the element id to uniquely identify it in the DOM + this.id = this.filter.filterName; + + const filterButton = this.renderRoot.querySelector("[data-tag-name='egg-button']"); + + this.buttonObserver = new MutationObserver(_mutations => { + _mutations.forEach(mutation => { + switch (mutation.type) { + case 'attributes': + if (mutation.attributeName === 'aria-expanded') { + this.isExpanded = (mutation.target as HTMLElement).getAttribute('aria-expanded') === 'true'; + } + break; + default: + break; + } + }); + }); + + if (filterButton) { + this.buttonObserver.observe(filterButton, { + attributeFilter: ['aria-expanded'], + attributeOldValue: true, + childList: false, + subtree: false + }); + } + + super.firstUpdated(changedProperties); + } + + public disconnectedCallback(): void { + // Could be already disconnected by an other filter instance + if (this.buttonObserver) { + this.buttonObserver.disconnect(); + } + + super.disconnectedCallback(); + } + + /** + * Reset all selected values for the current filter in the UI. + * Can be called from parent components + */ + protected resetSelectedValues() { + // Update parent state + this.selectedValues.forEach(v => { + this.onFilterUpdated(this.filter.filterName, v, false); + }); + + // Reset internal state + let newValues = [...this.selectedValues]; + newValues = []; + + this.selectedValues = newValues; + } + + /** + * Clear all selected values in the UI and submit empty filters to connected components + * @param preventApply Set true if you want to prevent new values to be submitted for that filter + */ + public clearSelectedValues(preventApply?: boolean) { + this.resetSelectedValues(); + + if (this.submittedFilterValues.length > 0) { + // Reset submitted filters + this.submittedFilterValues = []; + + if (!preventApply) this.applyFilters(); + } + } + + protected onItemUpdated(filterValue: IDataFilterValue, selected: boolean) { + if (selected) { + // Get the index of the filter value in the current selected values collection + const valueIdx = this.selectedValues.map(value => value.key).indexOf(filterValue.key); + const newValues = [...this.selectedValues]; + + if (valueIdx !== -1) { + // Update the existing value + newValues[valueIdx] = filterValue; + } else { + // Add the new value if doesn't exist + newValues.push(filterValue); + } + + this.selectedValues = newValues; + } else { + this.selectedValues = this.selectedValues.filter(v => v.key !== filterValue.key); + } + + this.onFilterUpdated(this.filter.filterName, filterValue, selected); + } + + protected isSelectedValue(key: string): boolean { + const isSelected = + this.selectedValues.filter(v => { + return v.key === key; + }).length > 0; + + return isSelected; + } + + /** + * The filter content to be implemented by concrete classes + */ + protected abstract renderFilterContent(): TemplateResult; + + protected applyFilters(): void { + this.submittedFilterValues = cloneDeep(this.selectedValues); + this.onApplyFilters(this.filter.filterName); + this.closeMenu(); + } + + /** + * Process manual filter aggregations according to matched values from configuration + * @param values the original filter values received from the results + * @returns the new aggregated filters values + */ + protected processAggregations(values: IDataFilterResultValue[]): IDataFilterResultValue[] { + let filteredValues = cloneDeep(values); + + if (this.filterConfiguration.aggregations) { + this.filterConfiguration.aggregations.forEach(aggregation => { + // Get all matching values + const matchingValues = filteredValues.filter(value => { + return aggregation.matchingValues.indexOf(value.name) > -1; + }); + + // Remove all values matching the aggregation + filteredValues = filteredValues.filter(value => { + return aggregation.matchingValues.indexOf(value.name) === -1; + }); + + if (matchingValues.length > 0) { + // A new aggregation + filteredValues.push({ + count: sumBy(matchingValues, 'count'), + key: this.getLocalizedString(aggregation.aggregationName), + name: this.getLocalizedString(aggregation.aggregationName), + value: aggregation.aggregationValue + }); + } + }); + } + + // Sort values according to the filter configuration + const sortProperty = this.filterConfiguration.sortBy === FilterSortType.ByCount ? 'count' : 'name'; + const sortDirection = this.filterConfiguration.sortDirection === FilterSortDirection.Ascending ? 'asc' : 'desc'; + filteredValues = orderBy(filteredValues, sortProperty, sortDirection); + + return filteredValues; + } + + // Close filter menu + public closeMenu() { + if (this.selectedValues.length > 0 && this.submittedFilterValues.length === 0) { + this.resetSelectedValues(); + } + + const eggMenu = this.renderRoot.querySelector("[data-tag-name='egg-menu']"); + eggMenu.removeAttribute('opened'); + } + + static get styles() { + return [tailwindStyles]; + } +} diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts b/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts new file mode 100644 index 0000000000..3ea408325e --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts @@ -0,0 +1,257 @@ +import { state, html, PropertyValues, customElement } from 'lit-element'; +import { cloneDeep } from 'lodash-es'; +import { repeat } from 'lit-html/directives/repeat.js'; +import { unsafeHTML } from 'lit-html/directives/unsafe-html.js'; +import { strings } from './strings'; +import { MgtBaseFilterComponent } from '../mgt-base-filter'; +import { IDataFilterResultValue, IDataFilterAggregation } from '@microsoft/mgt-element'; + +export class MgtCheckboxFilterComponent extends MgtBaseFilterComponent { + @state() + searchKeyword: string; + + /** + * List of filtered values + */ + @state() + filteredValues: IDataFilterResultValue[] = []; + + declare startOffset: number; + + /** + * Number of items to be displayed in the menu. Limit this number to increase performances + */ + declare pageSize: number; + + constructor() { + super(); + + this.startOffset = 0; + this.pageSize = 50; + + this.onScroll = this.onScroll.bind(this); + } + + public renderFilterContent() { + // Display only filter values submitted and present in the available filter values + // Multiple refinement steps can lead initial selected values to not be included in the available values + const selectedValues = this.submittedFilterValues.filter(s => { + return this.filter.values.map(v => v.key).indexOf(s.key) !== -1; + }); + + const filterName = this.localizedFilterName ? this.localizedFilterName.toLowerCase() : null; + + const renderSearchBox = html` +
+ + ${ + this.searchKeyword + ? html`` + : null + } + + { + this.filterValues(e.target.value); + }} + + /> +
+ `; + + return html` +
{ + e.preventDefault(); + e.stopPropagation(); + }} + > +
+ + ${renderSearchBox} +
+ +
+ +
+ ${ + this.selectedValues.length > 0 || this.submittedFilterValues.length > 0 + ? html`` + : null + } +
+
+
+ ${repeat( + this.filteredValues, + filterValue => filterValue.key, + filterValue => { + return html` + { + this.onItemUpdated(filterValue, !this.isSelectedValue(filterValue.key)); + + if (!this.filterConfiguration.isMulti) { + this.applyFilters(); + } + }} + data-ref-value=${filterValue.value} + value=${filterValue.value} + data-ref-name=${filterValue.name} + .selected=${this.isSelectedValue(filterValue.key)} + > +
+
+ ${ + this.getFilterAggregation(filterValue.name) + ? html`` + : null + } +
+ ${ + this.searchKeyword + ? this.highlightMatches(filterValue.name) + : filterValue.name + } +
+
+ ${ + this.filterConfiguration.showCount + ? html` +
+ +
+ ` + : null + } +
+
+ `; + } + )} +
+ ${ + this.filterConfiguration.isMulti + ? html` +
{ + e.preventDefault(); + e.stopPropagation(); + }} + > + + +
+ ` + : null + } + `; + } + + public firstUpdated(changedProperties: PropertyValues): void { + // Return only a subset of values to manage performances + this.filter.values = this.processAggregations(this.filter.values); + this.filteredValues = cloneDeep(this.filter.values).slice(0, this.pageSize); + + this.startOffset = this.pageSize; + + const elt = this.renderRoot.querySelector('#filter-menu-content'); + elt.addEventListener('scroll', this.onScroll); + + super.firstUpdated(changedProperties); + } + + public updated(changedProperties: PropertyValues): void { + if (changedProperties.get('filter')) { + this.filter.values = this.processAggregations(this.filter.values); + this.filteredValues = this.sortBySelectedValues(cloneDeep(this.filter.values)).slice(0, this.pageSize); + } + + super.updated(changedProperties); + } + + public disconnectedCallback(): void { + const elt = this.renderRoot.querySelector('#filter-menu-content'); + elt.removeEventListener('scroll', this.onScroll); + super.disconnectedCallback(); + } + + protected get strings(): { [x: string]: string } { + return strings; + } + + public filterValues(value: string) { + if (!value) { + this.filteredValues = this.sortBySelectedValues(cloneDeep(this.filter.values)); + } else { + this.filteredValues = this.filter.values.filter(v => v.name.toLocaleLowerCase().indexOf(value) !== -1); + } + + // Return only a subset of values to manage performances + this.filteredValues = this.filteredValues.slice(0, this.pageSize); + + this.searchKeyword = value; + } + + private sortBySelectedValues(filters: IDataFilterResultValue[]) { + return filters.sort((x, y) => { + return Number(this.isSelectedValue(y.key)) - Number(this.isSelectedValue(x.key)); + }); + } + + private highlightMatches(value: string) { + const matchExpr = value.replace( + new RegExp(this.searchKeyword, 'gi'), + match => `${match}` + ); + return html`${unsafeHTML(matchExpr)}`; + } + + private clearSearchKeywords() { + (this.renderRoot.querySelector('#searchbox') as HTMLInputElement).value = null; + this.filterValues(null); + } + + private onScroll() { + const elt = this.renderRoot.querySelector('#filter-menu-content'); + if (elt.scrollTop + elt.clientHeight >= elt.scrollHeight - 50) { + const newOffset = this.startOffset + this.pageSize; + this.filteredValues = this.filter.values.slice(0, newOffset); + this.startOffset = newOffset; + } + } + + private getFilterAggregation(name: string): IDataFilterAggregation { + return this.filterConfiguration.aggregations?.filter(aggregation => { + return this.getLocalizedString(aggregation.aggregationName) === name; + })[0]; + } +} diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/strings.ts b/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/strings.ts new file mode 100644 index 0000000000..98d2d6e943 --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/strings.ts @@ -0,0 +1,7 @@ +export const strings = { + reset: 'Reset', + searchPlaceholder: 'Search for values...', + apply: 'Apply', + cancel: 'Cancel', + selections: 'selection(s)' +}; diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts b/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts new file mode 100644 index 0000000000..4b13f91660 --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts @@ -0,0 +1,298 @@ +import { DateHelper, FilterComparisonOperator, IDataFilterValue, LocalizationHelper } from '@microsoft/mgt-element'; +import { customElement, html, PropertyValues } from 'lit-element'; +import { nothing } from 'lit-html'; +import { MgtBaseFilterComponent, DateFilterKeys } from '../mgt-base-filter'; +import { strings } from './strings'; + +export enum DateFilterInterval { + AnyTime, + Today, + Past24, + PastWeek, + PastMonth, + Past3Months, + PastYear, + OlderThanAYear +} + +export class MgtDateFilterComponent extends MgtBaseFilterComponent { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private declare dayJs: any; + private declare dateHelper: DateHelper; + + private declare allIntervals: { [key in DateFilterInterval]: string }; + + public get fromDate(): string { + return this.getDateValue(DateFilterKeys.From); + } + + public get toDate(): string { + return this.getDateValue(DateFilterKeys.To); + } + + public constructor() { + super(); + + this.allIntervals = this.getAllIntervals(); + + this.dateHelper = new DateHelper(LocalizationHelper.strings?.language); + + this.onUpdateFromDate = this.onUpdateFromDate.bind(this); + this.onUpdateToDate = this.onUpdateToDate.bind(this); + this.applyDateFilters = this.applyDateFilters.bind(this); + } + + public renderFilterContent() { + // Intervals to display + const intervals = this.filter.values.filter(v => { + // If an interval is already selected, limit to only one to avoid selecting multiple matched intervals for the same items + // Ex: an item created last month will also match the past 3 months, and past year intervals. However, it does not make sense to propose all at once once user selects one. + if (this.selectedValues.length > 0) { + return this.selectedValues.some(s => s.key === v.key); + } + return v.count > 0; + }); + + return html` +
+
+ ${ + this.selectedValues.length > 0 + ? html`
+ this.clearSelectedValues()}> + + ${strings.reset} +
` + : null + } +
+
+ ${ + !this.fromDate && !this.toDate + ? intervals.map(filterValue => { + return html` + { + this.onItemUpdated(filterValue, !this.isSelectedValue(filterValue.key)); + + if (!this.filterConfiguration.isMulti) { + // Apply filters immediately + this.applyFilters(); + } + }} + > +
+
+ +
+
+ +
+ ${ + this.filterConfiguration.showCount + ? html`
+ +
+ ` + : null + } +
+
+ `; + }) + : nothing + } +
+
+
+ ${strings.from}: + +
+ +
+ ${strings.to}: + +
+ +
+ `; + } + + public async connectedCallback(): Promise { + this.dayJs = await this.dateHelper.dayJs(); + super.connectedCallback(); + } + + protected get strings(): { [x: string]: string } { + return strings; + } + + protected updated(changedProperties: PropertyValues): void { + this.allIntervals = this.getAllIntervals(); + super.updated(changedProperties); + } + + private _getIntervalDate(unit: string, count: number): Date { + return this._getIntervalDateFromStartDate(new Date(), unit, count); + } + + private _getIntervalDateFromStartDate(startDate: Date, unit: string, count: number): Date { + return this.dayJs(startDate).subtract(count, unit); + } + + private _getIntervalForValue(filterValue: IDataFilterValue): string { + const dateAsString = filterValue.value; + + if (dateAsString && this.dayJs) { + let dateRanges = []; + // Value from Microaoft Search for date properties as FQL filter value + if (dateAsString.indexOf('range(') !== -1) { + const matches = dateAsString.match( + /(min|max)|(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)((-(\d{2}):(\d{2})|Z)?)/gi + ); + if (matches) { + // Return date range (i.e. dates between parenthesis) + dateRanges = matches; + } + } + + // To get it work, we need to submit equivalent aggregations at query time + const past24Date = this._getIntervalDate('days', 1); + const pastWeekDate = this._getIntervalDate('weeks', 1); + const pastMonthDate = this._getIntervalDate('months', 1); + const past3MonthsDate = this._getIntervalDate('months', 3); + const pastYearDate = this._getIntervalDate('years', 1); + + // Mutate the original object to get the correct name when submitted + if (dateRanges.indexOf('min') !== -1) { + filterValue.name = this.allIntervals[DateFilterInterval.OlderThanAYear]; + } else if (dateRanges.indexOf('max') !== -1) { + filterValue.name = this.allIntervals[DateFilterInterval.Today]; + } else if (this.dayJs(dateRanges[0]).isSame(past24Date, 'day')) { + filterValue.name = this.allIntervals[DateFilterInterval.Past24]; + } else if (this.dayJs(dateRanges[0]).isSame(pastWeekDate, 'day')) { + filterValue.name = this.allIntervals[DateFilterInterval.PastWeek]; + } else if (this.dayJs(dateRanges[0]).isSame(pastMonthDate, 'day')) { + filterValue.name = this.allIntervals[DateFilterInterval.PastMonth]; + } else if (this.dayJs(dateRanges[0]).isSame(past3MonthsDate, 'day')) { + filterValue.name = this.allIntervals[DateFilterInterval.Past3Months]; + } else if (this.dayJs(dateRanges[0]).isSame(pastYearDate, 'day')) { + filterValue.name = this.allIntervals[DateFilterInterval.PastYear]; + } + } else { + filterValue.name = this.allIntervals[DateFilterInterval.AnyTime]; + } + + return filterValue.name; + } + + private onUpdateFromDate(e: InputEvent) { + let date = (e.target as HTMLInputElement).value; + + // In the case user enter manually a date later than today + if (this.dayJs(date).isValid() && this.dayJs(date).isAfter(this.dayJs())) { + date = new Date().toISOString().split('T')[0]; + } + + const filterName = `${strings.from} ${this.dayJs(date).format('ll')}`; + this.onItemUpdated( + { + key: DateFilterKeys.From, + name: filterName, + value: date ? new Date(date).toISOString() : null, + operator: FilterComparisonOperator.Geq + }, + !!date // No value = unselected + ); + + if (!date && this.submittedFilterValues.length > 0) { + this.applyFilters(); + } + } + + private onUpdateToDate(e) { + let date = (e.target as HTMLInputElement).value; + + // In the case user enter manually a date later than today + if (this.dayJs(date).isValid() && this.dayJs(date).isAfter(this.dayJs())) { + date = new Date().toISOString().split('T')[0]; + } + + const filterName = `${strings.to} ${this.dayJs(date).format('ll')}`; + this.onItemUpdated( + { + key: DateFilterKeys.To, + name: filterName, + value: date ? new Date(date).toISOString() : null, + operator: FilterComparisonOperator.Lt + }, + !!date // No value = unselected + ); + + if (!date && this.submittedFilterValues.length > 0) { + this.applyFilters(); + } + } + + private applyDateFilters() { + // Don't apply filters if no value is selected + if (this.toDate || this.fromDate) { + // Keep only static filter values 'From' and 'To' and unselect the others if any + this.selectedValues + .filter(v => v.key !== DateFilterKeys.To && v.key !== DateFilterKeys.From) + .forEach(v => { + this.onFilterUpdated(this.filter.filterName, v, false); + }); + + this.selectedValues = this.selectedValues.filter( + v => v.key === DateFilterKeys.To || v.key === DateFilterKeys.From + ); + + this.applyFilters(); + } + } + + private getDateValue(dateKey: DateFilterKeys) { + const date = this.selectedValues.filter(v => v.key === dateKey)[0]; + if (date) { + return date.value.split('T')[0]; + } + + return ''; + } + + private getAllIntervals() { + return { + [DateFilterInterval.AnyTime]: strings.anyTime, + [DateFilterInterval.Today]: strings.today, + [DateFilterInterval.Past24]: strings.past24, + [DateFilterInterval.PastWeek]: strings.pastWeek, + [DateFilterInterval.PastMonth]: strings.pastMonth, + [DateFilterInterval.Past3Months]: strings.past3Months, + [DateFilterInterval.PastYear]: strings.pastYear, + [DateFilterInterval.OlderThanAYear]: strings.olderThanAYear + }; + } +} diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/strings.ts b/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/strings.ts new file mode 100644 index 0000000000..1c0ace3ce8 --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/strings.ts @@ -0,0 +1,15 @@ +export const strings = { + anyTime: 'Any time', + today: 'Today', + past24: 'Past 24 hours', + pastWeek: 'Past week', + pastMonth: 'Past month', + past3Months: 'Past 3 months', + pastYear: 'Past year', + olderThanAYear: 'Older than a year', + reset: 'Reset', + from: 'From', + to: 'To', + applyDates: 'Apply dates', + selections: 'selection(s)' +}; diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-search-filters.ts b/packages/mgt-components/src/components/mgt-search-filters/mgt-search-filters.ts new file mode 100644 index 0000000000..501ba17a9a --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-filters/mgt-search-filters.ts @@ -0,0 +1,536 @@ +import { + BuiltinFilterTemplates, + EventConstants, + FilterConditionOperator, + FilterSortDirection, + FilterSortType, + IDataFilter, + IDataFilterConfiguration, + IDataFilterResult, + IDataFilterResultValue, + IDataFilterValue, + ISearchFiltersEventData, + ISearchResultsEventData, + ISearchSortEventData, + ISearchSortProperty, + MgtConnectableComponent, + MgtTemplatedComponent +} from '@microsoft/mgt-element'; +import { customElement, property, state, html } from 'lit-element'; +import { isEmpty, cloneDeep, sortBy } from 'lodash-es'; +import { nothing } from 'lit-html'; +import { repeat } from 'lit-html/directives/repeat.js'; +import { strings } from './strings'; +import { styles as tailwindStyles } from '../../styles/tailwind-styles-css'; +import { MgtBaseFilterComponent } from './mgt-base-filter'; +import { ScopedElementsMixin } from '@open-wc/scoped-elements'; +import { MgtCheckboxFilterComponent } from './mgt-checkbox-filter/mgt-checkbox-filter'; +import { MgtDateFilterComponent } from './mgt-date-filter/mgt-date-filter'; + +export class MgtSearchFiltersComponentBase extends MgtConnectableComponent {} + +@customElement('mgt-search-filters') +export class MgtSearchFiltersComponent extends ScopedElementsMixin(MgtSearchFiltersComponentBase) { + /** + * The connected search results component ids + */ + @property({ + type: Array, + attribute: 'search-results-ids', + converter: { + fromAttribute: value => { + return value.split(','); + } + } + }) + searchResultsComponentIds: string[] = []; + + /** + * The filters configration + */ + @property({ + type: Object, + attribute: 'settings', + converter: { + fromAttribute: value => { + return JSON.parse(value) as IDataFilterConfiguration[]; + } + } + }) + filterConfiguration: IDataFilterConfiguration[] = []; + + /** + * The default logical operatorto use sbetween filters + */ + @property({ type: String, attribute: 'operator' }) + operator: FilterConditionOperator = FilterConditionOperator.AND; + + /** + * Available filters received from connected search results component + */ + @state() + availableFilters: IDataFilterResult[] = []; + + /** + * All selected values from all filters combined (not necessarily submitted) + */ + @state() + allSelectedFilters: IDataFilter[] = []; + + /** + * The list of disabled filters + */ + private declare disabledFilters: string[]; + + /** + * All submitted values from all filters combined + */ + public declare allSubmittedFilters: IDataFilter[]; + + /** + * The previous applied filters + */ + private declare previousAvailableFilters: IDataFilterResult[]; + + private declare submittedQueryText: string; + + private declare searchResultsEventData: ISearchResultsEventData; + constructor() { + super(); + + this.allSelectedFilters = []; + this.allSubmittedFilters = []; + this.disabledFilters = []; + + this.handleSearchResultsFilters = this.handleSearchResultsFilters.bind(this); + this.onFilterUpdated = this.onFilterUpdated.bind(this); + this.onApplyFilters = this.onApplyFilters.bind(this); + this.onSort = this.onSort.bind(this); + } + + public render() { + let renderSort = nothing; + + const renderCheckbox = (availableFilter: IDataFilterResult) => { + return html` -1} + .filter=${availableFilter} + .filterConfiguration=${ + this.filterConfiguration.filter(c => c.filterName === availableFilter.filterName)[0] + } + .onFilterUpdated=${this.onFilterUpdated} + .onApplyFilters=${this.onApplyFilters} + > + `; + }; + + const renderDate = (availableFilter: IDataFilterResult) => { + return html` -1} + .filter=${availableFilter} + .filterConfiguration=${ + this.filterConfiguration.filter(c => c.filterName === availableFilter.filterName)[0] + } + .onFilterUpdated=${this.onFilterUpdated} + .onApplyFilters=${this.onApplyFilters} + > + `; + }; + + const renderShimmers = html` +
+ ${repeat( + this.filterConfiguration, + configuration => configuration.filterName, + () => { + return html`
`; + } + )} +
+ `; + + if (this.searchResultsEventData?.sortFieldsConfiguration && this.availableFilters.length > 0) { + renderSort = html` + + + `; + } + + let renderFilters = html`${repeat( + // https://lit.dev/docs/templates/lists/#when-to-use-map-or-repeat + this.availableFilters, + filter => filter.filterName, + availableFilter => { + // Only display the filter component is values are present + if (availableFilter.values.length > 0) { + const filterConfiguration = this.getFilterConfiguration(availableFilter.filterName); + + switch (filterConfiguration.template) { + case BuiltinFilterTemplates.CheckBox: + return renderCheckbox(availableFilter); + + case BuiltinFilterTemplates.Date: + return renderDate(availableFilter); + + default: + return renderCheckbox(availableFilter); + } + } else { + return nothing; + } + } + )}`; + + if (this.availableFilters.length === 0 && this.filterConfiguration.length > 0) { + if (isEmpty(this.submittedQueryText)) { + renderFilters = renderShimmers; + } else { + renderFilters = html`${strings.noFilters}`; + } + } + + return html` +
+
+
+
+ + ${renderFilters} + ${ + (this.availableFilters.length > 0 && this.allSelectedFilters.length > 0) || + this.allSubmittedFilters.length > 0 + ? html`` + : null + } +
+
+ ${renderSort} +
+
+
+
+ `; + } + + static get styles() { + return [tailwindStyles]; + } + + static get scopedElements() { + return { + 'mgt-filter-checkbox': MgtCheckboxFilterComponent, + 'mgt-filter-date': MgtDateFilterComponent + //"mgt-search-sort": MgtSearchSortComponent + }; + } + + protected get strings(): { [x: string]: string } { + return strings; + } + + public connectedCallback(): Promise { + const bindings = this.searchResultsComponentIds.map(componentId => { + return { + id: componentId, + eventName: EventConstants.SEARCH_RESULTS_EVENT, + callbackFunction: this.handleSearchResultsFilters + }; + }); + + this.bindComponents(bindings); + + return Promise.resolve(super.connectedCallback()); + } + + public handleSearchResultsFilters(e: CustomEvent) { + this.searchResultsEventData = e.detail; + this.availableFilters = cloneDeep(e.detail.availableFilters); + this.submittedQueryText = e.detail.submittedQueryText; + + // Handle filters with zero value + if (e.detail.availableFilters.length === 0 && this.allSelectedFilters.length > 0) { + // Existing selected filters + const selectedFilterNames = this.allSelectedFilters.map(filter => filter.filterName); + + this.availableFilters = cloneDeep( + this.previousAvailableFilters.map(f => { + f.values = []; + return f; + }) + ); + + // Disable non selected filters + this.previousAvailableFilters.forEach(p => { + if (selectedFilterNames.indexOf(p.filterName) === -1) { + this.disabledFilters.push(p.filterName); + } + }); + } else { + this.disabledFilters = []; + } + + // Merge filters with the same field name + // This scenario happens when multiple sources have the same alias as refiner. In this case, the API returns duplicate fields instead of merging them. + this.availableFilters = this.mergeFilters(this.availableFilters); + + // Sort filters by configuration if any + this.availableFilters = this.availableFilters.sort((a, b) => { + const aSortIdx = this.filterConfiguration.filter(f => f.filterName === a.filterName)[0].sortIdx; + const bSortIdx = this.filterConfiguration.filter(f => f.filterName === b.filterName)[0].sortIdx; + return aSortIdx - bSortIdx; + }); + + // Save available filters for subsequent usage + this.previousAvailableFilters = cloneDeep(this.availableFilters); + } + + /** + * Handler when a value is updated (selected/unselected)from a specific filter + * @param filterName the filter name from where values has been applied + * @param filterValue the filter value that has been updated + */ + private onFilterUpdated(filterName: string, filterValue: IDataFilterValue, selected: boolean) { + if (selected) { + // Get the index of the filter in the current selected filters collection + const filterIdx = this.allSelectedFilters + .map(filter => { + return filter.filterName; + }) + .indexOf(filterName); + const newFilters = [...this.allSelectedFilters]; + + if (filterIdx !== -1) { + const valueIdx = this.allSelectedFilters[filterIdx].values.map(v => v.key).indexOf(filterValue.key); + + if (valueIdx === -1) { + // If the value does not exist yet, we add it to the selected values + + newFilters[filterIdx].values.push(filterValue); + this.allSelectedFilters = newFilters; + } else { + // Otherwise, we update the value in selected values + newFilters[filterIdx].values[valueIdx] = filterValue; + } + } else { + const newFilter: IDataFilter = { + filterName: filterName, + values: [filterValue] + }; + + newFilters.push(newFilter); + } + + this.allSelectedFilters = newFilters; + } else { + // Remove the filter value + this.allSelectedFilters = this.allSelectedFilters.map(selectedFilter => { + selectedFilter.values = selectedFilter.values.filter(value => value.key != filterValue.key); + + if (selectedFilter.values.length > 0) { + return selectedFilter; + } else { + return null; + } + }); + + // Remove null values + this.allSelectedFilters = this.allSelectedFilters.filter(f => f); + } + } + + /** + * Handler when values are applied from a specific filter + * @param filterName the filter name from where values has been applied + */ + private onApplyFilters(filterName: string) { + // Update the list of submitted filters to sent to the search engine + const selectedFilter = this.allSelectedFilters.filter(f => f.filterName === filterName)[0]; + + // If filter is 'null', it means no values are currently selected for that filter + if (selectedFilter) { + const filterIdx = this.allSubmittedFilters + .map(filter => { + return filter.filterName; + }) + .indexOf(filterName); + const newFilters = [...this.allSubmittedFilters]; + + if (filterIdx === -1) { + newFilters.push(selectedFilter); + } else { + newFilters[filterIdx] = selectedFilter; + } + + this.allSubmittedFilters = newFilters; + } else { + this.allSubmittedFilters = this.allSubmittedFilters.filter(s => s.filterName !== filterName); + } + + // Reset selected values from other filters that are not already submitted + const otherFiltersWithSelectedValues = this.allSelectedFilters + .filter(f => { + return ( + f.filterName !== filterName && + this.allSubmittedFilters.filter(a => a.filterName === f.filterName).length === 0 + ); + }) + .map(f => f.filterName); + + otherFiltersWithSelectedValues.forEach(filterName => { + const filterComponent = this.getFilterComponents(filterName); + if (filterComponent) { + filterComponent[0].clearSelectedValues(true); + } + }); + + this.applyFilters(); + } + + /** + * Handler when sort properties are updated + * @param sortProperties the sort properties + */ + private onSort(sortProperties: ISearchSortProperty[]) { + this.fireCustomEvent( + EventConstants.SEARCH_SORT_EVENT, + { + sortProperties: sortProperties + } as ISearchSortEventData, + true + ); + } + + /** + * Send filters to connected search results component + */ + private applyFilters() { + // Update filters information before sending them to source so they can be processed according their specificities + // i.e Merge selected filter with relavant information from its configuration + const updatedFilters = this.allSubmittedFilters.map(f => { + const confguration = this.getFilterConfiguration(f.filterName); + if (confguration) { + f.operator = confguration.operator; + } + return f; + }); + + this.fireCustomEvent(EventConstants.SEARCH_FILTER_EVENT, { + selectedFilters: updatedFilters, + filterOperator: this.operator ? this.operator : FilterConditionOperator.AND + } as ISearchFiltersEventData); + } + + private getFilterConfiguration(filterName: string): IDataFilterConfiguration { + return this.filterConfiguration.filter(c => c.filterName === filterName)[0]; + } + + /** + * Merges filter values having the same filter name + * @param availableFilters the available filters returned from the search response + * @returns the merged filters + */ + private mergeFilters(availableFilters: IDataFilterResult[]): IDataFilterResult[] { + let allMergedFilters: IDataFilterResult[] = []; + + availableFilters.forEach(filterResult => { + const mergedFilterIdx = allMergedFilters.map(m => m.filterName).indexOf(filterResult.filterName); + + if (mergedFilterIdx === -1) { + allMergedFilters.push(filterResult); + } else { + const allMergedValues: IDataFilterResultValue[] = []; + const allValues = allMergedFilters[mergedFilterIdx].values.concat(filterResult.values); + + // 3. Sum counts for similar value names + allValues.forEach(value => { + const mergedValueIdx = allMergedValues.map(v => v.name).indexOf(value.name); + + if (mergedValueIdx === -1) { + allMergedValues.push(value); + } else { + allMergedValues[mergedValueIdx].count = allMergedValues[mergedValueIdx].count + value.count; + } + }); + + allMergedFilters[mergedFilterIdx].values = allMergedValues; + } + }); + + // Sort values according to the filter configuration + allMergedFilters = allMergedFilters.map(filter => { + let sortByField = 'name'; + let sortDirection = FilterSortDirection.Ascending; + + const filterConfigurationIdx = this.filterConfiguration + .map(configuration => configuration.filterName) + .indexOf(filter.filterName); + if (filterConfigurationIdx !== -1) { + const filterConfiguration = this.filterConfiguration[filterConfigurationIdx]; + if (filterConfiguration.sortBy === FilterSortType.ByCount) { + sortByField = 'count'; + } + + if (filterConfiguration.sortDirection === FilterSortDirection.Descending) { + sortDirection = FilterSortDirection.Descending; + } + } + + filter.values = + sortDirection === FilterSortDirection.Ascending + ? sortBy(filter.values, sortByField) + : sortBy(filter.values, sortByField).reverse(); + + return filter; + }); + + return allMergedFilters; + } + + public clearAllSelectedValues(preventApply?: boolean) { + // Reset selected values for all child components + const filterComponents = this.getFilterComponents(); + + // Reset all filters from the UI (whithout submitting values) + filterComponents.forEach(component => component.clearSelectedValues(true)); + + if (this.allSubmittedFilters.length > 0) { + this.allSubmittedFilters = []; + + // Apply empty filters + if (!preventApply) { + this.applyFilters(); + } + } + } + + /** + * Retrieved the list of child filters + * @param filterName Optionnal. A specific filter name to retrieve + * @returns the list of child filter components + */ + private getFilterComponents(filterName?: string): MgtBaseFilterComponent[] { + // Reset all values from sub components. List all valid sub filter components + const filterComponents: MgtBaseFilterComponent[] = Array.prototype.slice.call( + this.renderRoot.querySelectorAll(` + [data-tag-name='mgt-filter-date'], + [data-tag-name='mgt-filter-checkbox'] + `) + ); + + return filterName + ? filterComponents.filter(component => component.filter.filterName === filterName) + : filterComponents; + } +} diff --git a/packages/mgt-components/src/components/mgt-search-filters/strings.ts b/packages/mgt-components/src/components/mgt-search-filters/strings.ts new file mode 100644 index 0000000000..9f425d2c9a --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-filters/strings.ts @@ -0,0 +1,4 @@ +export const strings = { + resetAllFilters: 'Reset filters', + noFilters: 'No filter to display' +}; diff --git a/packages/mgt-components/src/components/mgt-search-results/loc/strings.default.ts b/packages/mgt-components/src/components/mgt-search-results/loc/strings.default.ts new file mode 100644 index 0000000000..c466a10583 --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-results/loc/strings.default.ts @@ -0,0 +1,105 @@ +import { html } from 'lit-html'; +import { unsafeHTML } from 'lit-html/directives/unsafe-html'; + +export const MgtSearchResultsStrings = { + seeAllLink: 'See all', + results: 'results' +}; + +export const MgtPaginationStrings = { + nextBtn: 'Next', + previousBtn: 'Previous', + tooManyPages: 'Too many pages!', + screenTipContent: () => html` +
It seems your search returned a lot of pages!
+

Try to narrow down your scope by specifying more precise keywords🙏

+ ` +}; + +export const MgtFilterDateStrings = { + anyTime: 'Any time', + today: 'Today', + past24: 'Past 24 hours', + pastWeek: 'Past week', + pastMonth: 'Past month', + past3Months: 'Past 3 months', + pastYear: 'Past year', + olderThanAYear: 'Older than a year', + reset: 'Reset', + from: 'From', + to: 'To', + applyDates: 'Apply dates', + selections: 'selection(s)' +}; + +export const MgtFilterCheckboxStrings = { + reset: 'Reset', + searchPlaceholder: 'Search for values...', + apply: 'Apply', + cancel: 'Cancel', + selections: 'selection(s)' +}; + +export const MgtSearchFiltersStrings = { + resetAllFilters: 'Reset filters', + noFilters: 'No filter to display' +}; + +export const MgtSearchSortStrings = { + sortedByRelevance: 'Sorted by relevance', + sortDefault: 'Relevance', + sortAscending: 'Sort ascending', + sortDescending: 'Sort descending' +}; + +export const MgtSearchInputStrings = { + searchPlaceholder: 'Search for values...', + clearSearch: 'Clear searchbox', + previousSearches: 'Previous searches' +}; + +export const MgtLanguageProviderStrings = {}; + +export const MgtSearchInfosStrings = { + searchQueryResultText: (keywords): string => `Here's what we found for "${keywords}"`, + resultCountText: (count): string => `Found ${count} results`, + notFoundSuggestions: keywords => html` +

Your search for "${keywords}" did not match any content.

+

Some suggestions:

+
    +
  • Make sure all words are spelled correctly
  • +
  • Try entering different keywords, more general keywords or less keywords
  • +
  • Maybe what you were looking for is not in the scope of the Enterprise Search? Check all the sources we index in our FAQ page.
  • +
  • ... Or ask for help by submitting a SOS ticket and our colleagues will try their best to help you.
  • +
+ `, + didYouMean: (handlerFunction, updatedQueryString) => html` +

Did you mean: "${unsafeHTML(updatedQueryString)}"?

+ ` +}; + +export const MgtErrorMessageStrings = { + errorMessage: 'Error' +}; + +export const MgtExportProfilesStrings = { + exportBtn: 'Export results', + exportBtnLoading: 'Exporting' +}; + +export const strings = { + language: 'en-us', + _components: { + 'mgt-search-results': { ...MgtSearchResultsStrings }, + 'mgt-pagination': { ...MgtPaginationStrings }, + 'mgt-filter-date': { ...MgtFilterDateStrings }, + 'mgt-filter-checkbox': { ...MgtFilterCheckboxStrings }, + 'mgt-search-filters': { ...MgtSearchFiltersStrings }, + 'mgt-search-input': { ...MgtSearchInputStrings }, + 'mgt-input-autocomplete': { ...MgtSearchInputStrings }, + 'mgt-language-provider': { ...MgtLanguageProviderStrings }, + 'mgt-search-infos': { ...MgtSearchInfosStrings }, + 'mgt-error-message': { ...MgtErrorMessageStrings }, + 'mgt-sort': { ...MgtSearchSortStrings } + } +}; diff --git a/packages/mgt-components/src/components/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts b/packages/mgt-components/src/components/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts new file mode 100644 index 0000000000..1296ba8838 --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts @@ -0,0 +1,220 @@ +import { FileFormat, MgtConnectableComponent, MgtTemplatedComponent, TemplateService } from '@microsoft/mgt-element'; +import { css, customElement, html, property, PropertyValues, state } from 'lit-element'; +import { unsafeHTML } from 'lit-html/directives/unsafe-html'; +import { styles as tailwindStyles } from '../../../styles/tailwind-styles-css'; + +/** + * Process adaptive card content from an external file + */ +@customElement('mgt-adaptive-card') +export class MgtAdaptiveCardComponent extends MgtConnectableComponent { + /** + * The file URL to fetch + */ + @property({ type: String, attribute: 'url' }) + fileUrl: string; + + /** + * The file format to load + */ + @property({ type: String, attribute: 'format' }) + fileFormat: FileFormat = FileFormat.Json; + + /** + * The fallback image URL + */ + @property({ type: String, attribute: 'fallback-img-url' }) + fallbackImageUrl: string; + + /** + * The data context to use to render the card + */ + @property({ + type: Object, + attribute: 'context', + converter: { + fromAttribute: value => { + try { + return JSON.parse(value); + } catch { + return null; + } + } + } + }) + cardContext: object; + + /** + * The raw adaptive card content as string (i.e. JSON stringified) + */ + @property({ type: String, attribute: 'content' }) + cardContent: string; + + /** + * The file content to display + */ + @state() + content: string; + + constructor() { + super(); + this.onImageError = this.onImageError.bind(this); + } + + render() { + if (this.content) { + return html`
${unsafeHTML(this.content)}
`; + } else { + return html` +
+
+
+
+
+ `; + } + } + + static get styles() { + return [ + css` + :host { + + > .ac-container{ + padding: 8px !important; + } + + .ac-anchor { + color: var(--text-color); + text-decoration: none; + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; + } + .ac-textBlock{ + white-space: normal !important; + overflow-wrap: break-word !important; + } + + .ac-anchor:hover{ + color: var(--ubi365-colorPrimary); + } + + .ac-anchor:focus, .ac-anchor:focus-visible{ + color: var(--ubi365-colorPrimary); + } + + .ac-container#ubiSearchTitle > .ac-textBlock{ + overflow: unset !important; + } + + .ac-container#ubiSearchTitle > .ac-textBlock > p{ + overflow: unset !important; + } + + .ac-container#ubiSearchSite > .ac-textBlock{ + overflow: unset !important; + } + .ac-container#ubiSearchSite > .ac-textBlock > p{ + overflow: unset !important; + } + + .ac-container#ubiSearchSite > .ac-textBlock > p > a{ + display: inline-block; + padding-left: 16px!important; + padding-right: 16px!important; + padding-top: 4px!important; + padding-bottom: 4px!important; + border-radius: 25px; + background-color: var(--topic-background-color) !important; + text-decoration: none; + color: var(--text-color); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; + } + + .ac-container#ubiSearchSite > .ac-textBlock > p > a:hover{ + background-color: var(--topic-hover-color) !important; + } + .ac-container#ubiSearchSite > .ac-textBlock > p > a:focus, .ac-container#ubiSearchSite > .ac-textBlock > p > a:focus-visible{ + background-color: var(--topic-focus-color) !important; + } + #ubiSearchSummary{ + font-size: 1rem !important; + line-height: 1.5rem !important; + } + } + `, + tailwindStyles + ]; + } + + public disconnectedCallback(): void { + super.disconnectedCallback(); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + protected updated(changedProperties: PropertyValues): void { + // Set default fallback image if not found + if (this.fallbackImageUrl) { + this.renderRoot.querySelectorAll('img').forEach(el => { + if (el && !this._eventHanlders.get(JSON.stringify(el))) { + this._eventHanlders.set(JSON.stringify(el), { component: el, event: 'error', handler: this.onImageError }); + el.addEventListener('error', this.onImageError); + } + }); + } + } + + private onImageError(event: Event) { + (event.target as HTMLImageElement).src = this.fallbackImageUrl; + + // To avoid endless loop + event.target.removeEventListener('error', this.onImageError); + this._eventHanlders.delete(JSON.stringify(event.target)); + (event.target as HTMLImageElement).onerror = null; + } + + public async connectedCallback(): Promise { + const io = new IntersectionObserver(async data => { + if (data[0].isIntersecting) { + await this._processAdaptiveCard(); + io.disconnect(); + } + }); + + io.observe(this); + + super.connectedCallback(); + } + + private async _processAdaptiveCard() { + const templateService = new TemplateService(); + await templateService.loadAdaptiveCardsResources(); + + let contentToProcess: string; + + if (this.cardContent) { + contentToProcess = this.cardContent; + } else if (this.fileUrl) { + // Get the file raw content according to the type + const fileContent = await templateService.getFileContent(this.fileUrl); + + if (this.fileFormat === FileFormat.Json) { + contentToProcess = fileContent; + } + } + + if (this.cardContext) { + const htmlContent: HTMLElement = templateService.processAdaptiveCardTemplate( + contentToProcess, + this.cardContext, + null + ); + this.content = htmlContent.innerHTML; + } else { + this.content = this.cardContent; + } + } +} diff --git a/packages/mgt-components/src/components/mgt-search-results/mgt-search-results.ts b/packages/mgt-components/src/components/mgt-search-results/mgt-search-results.ts new file mode 100644 index 0000000000..935c6a85ed --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-results/mgt-search-results.ts @@ -0,0 +1,932 @@ +import { + LocalizationHelper, + Providers, + ProviderState, + MgtConnectableComponent, + BuiltinFilterTemplates, + BuiltinTokenNames, + DateHelper, + EntityType, + FilterSortDirection, + FilterSortType, + IDataSourceData, + ILocalizedString, + IMicrosoftSearchQuery, + IMicrosoftSearchService, + ISearchFiltersEventData, + ISearchInputEventData, + ISearchRequestAggregation, + ISearchResultsEventData, + ISearchSortEventData, + ISearchSortProperty, + ISearchVerticalEventData, + ISortFieldConfiguration, + ITemplateService, + ITokenService, + MicrosoftSearchService, + SearchAggregationSortBy, + SearchResultsHelper, + SortFieldDirection, + TemplateService, + TokenService, + UrlHelper, + DataFilterHelper +} from '@microsoft/mgt-element'; +import { css, customElement, html, property, PropertyValues, state } from 'lit-element'; +import { isEmpty } from 'lodash-es'; +import { unsafeHTML } from 'lit-html/directives/unsafe-html'; +import { repeat } from 'lit-html/directives/repeat'; +import { MgtSearchResultsStrings as strings } from './loc/strings.default'; +import { nothing } from 'lit-html'; +import { styles as tailwindStyles } from '../../styles/tailwind-styles-css'; +import { EventConstants } from '@microsoft/mgt-element'; + +@customElement('mgt-search-results') +export class MgtSearchResultsComponent extends MgtConnectableComponent { + //#region Attributes + + /** + * Flag indicating if the beta endpoint for Microsoft Graph API should be used + */ + @property({ type: Boolean, attribute: 'use-beta' }) + useBetaEndpoint = false; + + /** + * The Microsoft Search entity types to query + */ + @property({ + type: String, + attribute: 'entity-types', + converter: { + fromAttribute: value => { + return value.split(',') as EntityType[]; + } + } + }) + entityTypes: EntityType[] = [EntityType.ListItem]; + + /** + * The default query text to apply. + * Query string parameter and search box have priority over this value during first load + */ + @property({ type: String, attribute: 'query-text' }) + defaultQueryText: string; + + /** + * The search query template to use. Support tokens https://learn.microsoft.com/en-us/graph/search-concept-query-template + */ + @property({ type: String, attribute: 'query-template' }) + queryTemplate: string; + + /** + * If specified, get the default query text from this query string parameter name + */ + @property({ type: String, attribute: 'default-query-string-parameter' }) + defaultQueryStringParameter: string; + + /** + * Search managed properties to retrieve for results and usable in the results template. + * Comma separated. Refer to the [Microsoft Search API documentation](https://learn.microsoft.com/en-us/graph/api/resources/search-api-overview?view=graph-rest-1.0&preserve-view=true#scope-search-based-on-entity-types) to know what properties can be used according to entity types. + */ + @property({ + type: Array, + attribute: 'fields', + converter: { + fromAttribute: value => { + return value.split(','); + } + } + }) + selectedFields: string[] = [ + 'name', + 'title', + 'summary', + 'created', + 'createdBy', + 'filetype', + 'defaultEncodingURL', + 'lastModifiedTime', + 'modifiedBy', + 'path', + 'hitHighlightedSummary', + 'SPSiteURL', + 'SiteTitle' + ]; + + /** + * Sort properties for the request + */ + @property({ + type: String, + attribute: 'sort-properties', + converter: { + fromAttribute: value => { + try { + return JSON.parse(value); + } catch { + return null; + } + } + } + }) + sortFieldsConfiguration: ISortFieldConfiguration[] = []; + + /** + * Flag indicating if the pagniation control should be displayed + */ + @property({ type: Boolean, attribute: 'show-paging' }) + showPaging: boolean; + + /** + * The number of results to show per results page + */ + @property({ type: Number, attribute: 'page-size' }) + pageSize = 10; + + /** + * The number of pages to display in the pagination control + */ + @property({ type: Number, attribute: 'pages-number' }) + numberOfPagesToDisplay = 5; + + /** + * Flag indicating if Micrsoft Search result types should be applied in results + */ + @property({ type: Boolean, attribute: 'enable-result-types' }) + enableResultTypes: boolean; + + /** + * If "entityTypes" contains "externalItem", specify the connection id of the external source + */ + @property({ + type: String, + attribute: 'connections', + converter: { + fromAttribute: value => { + return value.split(',').map(v => `/external/connections/${v}`) as string[]; + } + } + }) + connectionIds: string[]; + + /** + * Indicates whether spelling modifications are enabled. If enabled, the user will get the search results for the corrected query in case of no results for the original query with typos. + */ + @property({ type: Boolean, attribute: 'enable-modification' }) + enableModification = false; + + /** + * Indicates whether spelling suggestions are enabled. If enabled, the user will get the search results for the original search query and suggestions for spelling correction + */ + @property({ type: Boolean, attribute: 'enable-suggestion' }) + enableSuggestion = false; + + /** + * If specified, shows the title on top of the results + */ + @property({ + type: String, + attribute: 'comp-title', + converter: { + fromAttribute: value => { + try { + return JSON.parse(value); + } catch { + return value; + } + } + } + }) + componentTitle: string | ILocalizedString; + + /** + * If specified, shows a "See all" link at top top of the results + */ + @property({ type: String, attribute: 'see-all-link' }) + seeAllLink: string; + + /** + * If specified, show the results count at the top of the results + */ + @property({ type: Boolean, attribute: 'show-count' }) + showCount: boolean; + + /** + * The search filters component ID if connected to a search filters + */ + @property({ type: String, attribute: 'search-filters-id' }) + searchFiltersComponentId: string; + + /** + * The search input component ID if connected to a search input + */ + @property({ type: String, attribute: 'search-input-id' }) + searchInputComponentId: string; + + /** + * The search verticals component ID if connected to a search verticals + */ + @property({ type: String, attribute: 'search-verticals-id' }) + searchVerticalsComponentId: string; + + /** + * The search sort component ID if connected to a search sort component + */ + @property({ type: String, attribute: 'search-sort-id' }) + searchSortComponentId: string; + + /** + * If connected to a search verticals component on the same page, determines on which keys this component should be displayed + */ + @property({ + type: Array, + attribute: 'verticals-keys', + converter: { + fromAttribute: value => { + return value.split(','); + } + } + }) + selectedVerticalKeys: string[]; + + /** + * Flag indicating if the loading indication (spinner/shimmers) should be displayed when fectching the data + */ + @property({ type: Boolean, attribute: 'no-loading' }) + noLoadingIndicator: boolean; + + //#endregion + + //#region State properties + + @state() + data: IDataSourceData = { items: [] }; + + @state() + isLoading = true; + + @state() + shouldRender: boolean; + + @state() + error: Error = null; + + //#endregion + + //#region Class properties + public declare searchQuery: IMicrosoftSearchQuery; + public declare msSearchService: IMicrosoftSearchService; + private declare templateService: ITemplateService; + private declare tokenService: ITokenService; + private declare dateHelper: DateHelper; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private declare dayJs: any; + private declare currentLanguage: string; + declare sortProperties: ISearchSortProperty[]; + //#endregion + + //#region MGT/Lit Lifecycle methods + + constructor() { + super(); + this.msSearchService = new MicrosoftSearchService(); + this.templateService = new TemplateService(); + this.tokenService = new TokenService(); + + this.dateHelper = new DateHelper(LocalizationHelper.strings?.language); + + this.searchQuery = { + requests: [] + }; + + this.addEventListener('templateRendered', (e: CustomEvent) => { + const element = e.detail.element as HTMLElement; + + if (this.enableResultTypes) { + // Process result types and replace part of HTML with item id + /*const newElement = this.templateService.processResultTypesFromHtml(this.data, element, this.getTheme()); + element.replaceWith(newElement);*/ + } + }); + + this.handleSearchVertical = this.handleSearchVertical.bind(this); + this.handleSearchFilters = this.handleSearchFilters.bind(this); + this.handleSearchInput = this.handleSearchInput.bind(this); + this.handleSearchSort = this.handleSearchSort.bind(this); + + this.goToPage = this.goToPage.bind(this); + } + + public render() { + if (this.shouldRender) { + let renderHeader; + let renderItems; + let renderOverlay; + let renderPagination; + + // Render shimmers + if (this.hasTemplate('shimmers') && !this.noLoadingIndicator && !this.renderedOnce) { + renderItems = this.renderTemplate('shimmers', { items: Array(this.pageSize) }); + } else { + // Render loading overlay + if (this.isLoading && !this.noLoadingIndicator) { + renderOverlay = html` +
+
+ + + + + +
+
+ `; + } + } + + // Render error + if (this.error) { + return html``; + } + + // Render header + if (this.componentTitle || this.seeAllLink || this.showCount) { + renderHeader = html` +
+
+ ${ + this.componentTitle + ? html` +
${this.getLocalizedString( + this.componentTitle + )}
+ ` + : null + } + ${ + this.showCount && !this.isLoading + ? html` +
${this.data.totalCount} ${strings.results}
+ ` + : null + } +
+ ${ + this.seeAllLink && this.data.totalCount > 0 + ? html` + + ` + : null + } +
+ `; + } + + if (this.renderedOnce) { + // Render items + if (this.hasTemplate('items')) { + renderItems = this.renderTemplate('items', this.data); + } else { + // Default template for all items + renderItems = html` + + `; + } + + // Render pagination + if (this.showPaging && this.data.items.length > 0) { + renderPagination = html` + + `; + } + } + + return html` + ${renderHeader} +
+ ${renderOverlay} + ${renderItems} + ${renderPagination} +
+ `; + } + + return nothing; + } + + public async connectedCallback(): Promise { + // 'setTimeout' is used here to make sure the initialization logic for the search results components occurs after other component initialization routine. + // This way, we ensure other component properties will be accessible. + // connectedCallback events on other components will execute before according to the JS event loop + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop + setTimeout(async () => { + this.msSearchService.useBetaEndPoint = this.useBetaEndpoint; + this.dayJs = await this.dateHelper.dayJs(); + + // Bind connected components + const bindings = [ + { + id: this.searchVerticalsComponentId, + eventName: EventConstants.SEARCH_VERTICAL_EVENT, + callbackFunction: this.handleSearchVertical + }, + { + id: this.searchFiltersComponentId, + eventName: EventConstants.SEARCH_FILTER_EVENT, + callbackFunction: this.handleSearchFilters + }, + { + id: this.searchInputComponentId, + eventName: EventConstants.SEARCH_INPUT_EVENT, + callbackFunction: this.handleSearchInput + }, + { + id: this.searchSortComponentId, + eventName: EventConstants.SEARCH_SORT_EVENT, + callbackFunction: this.handleSearchSort + } + ]; + + this.bindComponents(bindings); + + if (this.enableResultTypes) { + // Only load adaptive cards bundle if result types are enabled for performance purpose + await this.templateService.loadAdaptiveCardsResources(); + } + + if (this.searchVerticalsComponentId) { + // Check if the current component should be displayed at first + const verticalsComponent = document.getElementById(this.searchVerticalsComponentId) as any; // MgtSearchVerticalsComponent; + if (verticalsComponent) { + // Reead the default value directly from the attribute + const selectedVerticalKey = verticalsComponent.selectedVerticalKey; + if (selectedVerticalKey) { + this.shouldRender = this.selectedVerticalKeys.indexOf(selectedVerticalKey) !== -1; + } + } + } else { + this.shouldRender = true; + } + + // Set default sort properties according to configuration + this.initSortProperties(); + + // Build the search query + this.buildSearchQuery(); + + // Set tokens + this.tokenService.setTokenValue(BuiltinTokenNames.searchTerms, this.getDefaultQueryText()); + + return super.connectedCallback(); + }); + } + + public disconnectedCallback(): void { + super.disconnectedCallback(); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public updated(changedProperties: PropertyValues): void { + // Process result types on default Lit template of this component + if (this.enableResultTypes && !this.hasTemplate('items')) { + this.templateService.processResultTypesFromHtml(this.data, this.renderRoot as HTMLElement); + } + + // Properties trigerring a new search + // Mainly use for Storybook demo scenario + if ( + changedProperties.get('defaultQueryText') || + changedProperties.get('selectedFields') || + changedProperties.get('pageSize') || + changedProperties.get('entityTypes') || + changedProperties.get('enableResultTypes') || + changedProperties.get('connectionIds') || + changedProperties.get('numberOfPagesToDisplay') + ) { + // Update the search query + this.buildSearchQuery(); + this._search(this.searchQuery); + } + + this.currentLanguage = LocalizationHelper.strings?.language; + } + + /** + * Only calls when the provider is in ProviderState.SignedIn state + * @returns + */ + public async loadState(): Promise { + if (this.shouldRender && this.getDefaultQueryText()) { + await this._search(this.searchQuery); + } else { + this.isLoading = false; + } + } + + //#endregion + + //#region Static properties accessors + static get styles() { + return [ + css` + :host { + + .itemInfo + .itemInfo::before { + content: " • "; + font-size: 18px; + line-height: 1; + transform: translateY(2px); + display: inline-block; + margin: 0 5px; + } + + .itemInfo + .itemInfo::after { + content: " • "; + font-size: 18px; + line-height: 1; + transform: translateY(2px); + display: inline-block; + margin: 0 5px; + } + } + `, + tailwindStyles + ]; + } + + protected get strings() { + return strings; + } + + //#endregion + + //#region Data related methods + + private async _search(searchQuery: IMicrosoftSearchQuery): Promise { + const provider = Providers.globalProvider; + if (!provider || provider.state !== ProviderState.SignedIn) { + return; + } + + try { + // Reset error + this.error = null; + + this.isLoading = true; + const queryLanguage = LocalizationHelper.strings?.language; + + const results = await this.msSearchService.search(searchQuery, queryLanguage); + this.data = results; + + // Enhance results + this.data.items = SearchResultsHelper.enhanceResults(this.data.items); + this.isLoading = false; + + this.renderedOnce = true; + + // Notify subscribers new filters are available + this.fireCustomEvent(EventConstants.SEARCH_RESULTS_EVENT, { + availableFilters: results.filters, + sortFieldsConfiguration: this.sortFieldsConfiguration.filter(s => s.isUserSort), + submittedQueryText: this.searchQuery.requests[0].query.queryString, + resultsCount: results.totalCount, + queryAlterationResponse: results.queryAlterationResponse, + from: this.searchQuery.requests[0].from + } as ISearchResultsEventData); + } catch (error) { + this.error = error; + } + } + + private buildAggregationsFromFiltersConfig(): ISearchRequestAggregation[] { + let aggregations: ISearchRequestAggregation[] = []; + const filterComponent = document.getElementById(this.searchFiltersComponentId) as any; //MgtSearchFiltersComponent; + if (filterComponent && filterComponent.filterConfiguration) { + // Build aggregations from filters configuration (i.e. refiners) + aggregations = filterComponent.filterConfiguration.map(filterConfiguration => { + const aggregation: ISearchRequestAggregation = { + field: filterConfiguration.filterName, + bucketDefinition: { + isDescending: filterConfiguration.sortDirection === FilterSortDirection.Ascending ? false : true, + minimumCount: 0, + sortBy: + filterConfiguration.sortBy === FilterSortType.ByCount + ? SearchAggregationSortBy.Count + : SearchAggregationSortBy.KeyAsString + }, + size: filterConfiguration && filterConfiguration.maxBuckets ? filterConfiguration.maxBuckets : 10 + }; + + if (filterConfiguration.template === BuiltinFilterTemplates.Date) { + const pastYear = this.dayJs(new Date()).subtract(1, 'years').subtract(1, 'minutes').toISOString(); + const past3Months = this.dayJs(new Date()).subtract(3, 'months').subtract(1, 'minutes').toISOString(); + const pastMonth = this.dayJs(new Date()).subtract(1, 'months').subtract(1, 'minutes').toISOString(); + const pastWeek = this.dayJs(new Date()).subtract(1, 'week').subtract(1, 'minutes').toISOString(); + const past24hours = this.dayJs(new Date()).subtract(24, 'hours').subtract(1, 'minutes').toISOString(); + const today = new Date().toISOString(); + + aggregation.bucketDefinition.ranges = [ + { + to: pastYear + }, + { + from: pastYear, + to: today + }, + { + from: past3Months, + to: today + }, + { + from: pastMonth, + to: today + }, + { + from: pastWeek, + to: today + }, + { + from: past24hours, + to: today + }, + { + from: today + } + ]; + } + + return aggregation; + }); + } + + return aggregations; + } + + /** + * Builds the search query according to the current componetn parameters and context + */ + private buildSearchQuery() { + // Build base search query from parameters + this.searchQuery = { + requests: [ + { + entityTypes: this.entityTypes, + contentSources: this.connectionIds, + fields: this.selectedFields, + query: { + queryString: this.getDefaultQueryText(), + queryTemplate: this.queryTemplate + }, + from: 0, + size: this.pageSize, + queryAlterationOptions: { + enableModification: this.enableModification, + enableSuggestion: this.enableSuggestion + }, + resultTemplateOptions: { + enableResultTemplate: this.enableResultTypes + } + } + ] + }; + + // Sort properties + if (this.sortProperties && this.sortProperties.length > 0) { + this.searchQuery.requests[0].sortProperties = this.sortProperties; + } + + // If a filter component is connected, get the configuration directly from connected component + if (this.searchFiltersComponentId) { + this.searchQuery.requests[0].aggregations = this.buildAggregationsFromFiltersConfig(); + } + } + + //#endregion + + //#region Event handlers from connected components + + private async handleSearchFilters(e: CustomEvent): Promise { + if (this.shouldRender) { + let aggregationFilters: string[] = []; + + const selectedFilters = e.detail.selectedFilters; + + // Build aggregation filters + if (selectedFilters.some(f => f.values.length > 0)) { + // Bind to current context to be able to refernce "dayJs" + const buildFqlRefinementString = DataFilterHelper.buildFqlRefinementString.bind(this); + + // Make sure, if we have multiple filters, at least two filters have values to avoid apply an operator ("or","and") on only one condition failing the query. + if ( + selectedFilters.length > 1 && + selectedFilters.filter(selectedFilter => selectedFilter.values.length > 0).length > 1 + ) { + const refinementString = buildFqlRefinementString(selectedFilters).join(','); + if (!isEmpty(refinementString)) { + aggregationFilters = aggregationFilters.concat([`${e.detail.filterOperator}(${refinementString})`]); + } + } else { + aggregationFilters = aggregationFilters.concat(buildFqlRefinementString(selectedFilters)); + } + } else { + delete this.searchQuery.requests[0].aggregationFilters; + } + + if (aggregationFilters.length > 0) { + this.searchQuery.requests[0].aggregationFilters = aggregationFilters; + } + + this.resetPagination(); + + await this._search(this.searchQuery); + } + } + + private async handleSearchInput(e: CustomEvent): Promise { + if (this.shouldRender) { + // Remove any query string parameter if used as default + if (this.defaultQueryStringParameter) { + const url = UrlHelper.removeQueryStringParam(this.defaultQueryStringParameter, window.location.href); + if (url !== window.location.href) { + window.history.pushState({}, '', url); + } + } + + // If empty keywords, reset to the default state + const searchKeywords = !isEmpty(e.detail.keywords) ? e.detail.keywords : this.getDefaultQueryText(); + + if (searchKeywords && searchKeywords !== this.searchQuery.requests[0].query.queryString) { + // Update token + this.tokenService.setTokenValue(BuiltinTokenNames.searchTerms, searchKeywords); + + this.searchQuery.requests[0].query.queryString = searchKeywords; + + this.resetFilters(); + this.resetPagination(); + + await this._search(this.searchQuery); + } + } + } + + private async handleSearchVertical(e: CustomEvent): Promise { + this.shouldRender = this.selectedVerticalKeys.indexOf(e.detail.selectedVertical.key) !== -1; + + if (this.shouldRender) { + // Reinitialize search context + this.resetQueryText(); + this.resetFilters(); + this.resetPagination(); + this.initSortProperties(); + + // Update the query when the new tab is selected + await this._search(this.searchQuery); + } else { + // If a query is currently performed, we cancel it to avoid new filters getting populated once one an other tab + if (this.isLoading) { + this.msSearchService.abortRequest(); + } + + // Reset available filters for connected search filter components + this.fireCustomEvent(EventConstants.SEARCH_RESULTS_EVENT, { + availableFilters: [] + } as ISearchResultsEventData); + } + } + + private async handleSearchSort(e: CustomEvent): Promise { + if (this.shouldRender) { + this.sortProperties = e.detail.sortProperties; + + this.buildSearchQuery(); + + // Update the query when new sort is defined + await this._search(this.searchQuery); + } + } + + //#endregion + + //#region Utility methods + + private getDefaultQueryText(): string { + // 1) Look connected search box if any + const inputComponent = document.getElementById(this.searchInputComponentId) as any; // MgtSearchInputComponent; + if (inputComponent && inputComponent.searchKeywords) { + return inputComponent.searchKeywords; + } + + // 2) Look query string parameters if any + if ( + this.defaultQueryStringParameter && + !isEmpty(UrlHelper.getQueryStringParam(this.defaultQueryStringParameter, window.location.href)) + ) { + return UrlHelper.getQueryStringParam(this.defaultQueryStringParameter, window.location.href); + } + + // 3) Look default hard coded value if any + if (this.defaultQueryText) { + return this.defaultQueryText; + } + } + + private goToPage(pageNumber: number) { + if (pageNumber > 0) { + // "-1" is to calculate the correct index. Ex page "1" with page size "10" means items from start index 0 to index 10. + this.searchQuery.requests[0].from = (pageNumber - 1) * this.pageSize; + this._search(this.searchQuery); + } + } + + private resetPagination() { + // Reset to first page + /* this.searchQuery.requests[0].from = 0; + const paginationComponent = this.renderRoot.querySelector(`[data-tag-name='${ComponentElements.MgtPaginationElement}']`); + if (paginationComponent) { + paginationComponent.initPagination(); + }*/ + } + + private resetFilters() { + // Reset existing filters if any selected + /* if (this.searchFiltersComponentId) { + const filterComponent = document.getElementById(this.searchFiltersComponentId) as MgtSearchFiltersComponent; + if (filterComponent) { + filterComponent.clearAllSelectedValues(true); + } + } + + delete this.searchQuery.requests[0].aggregationFilters;*/ + } + + private initSortProperties() { + this.sortProperties = this.sortFieldsConfiguration + .filter(s => s.isDefaultSort) + .map(s => { + return { + isDescending: s.sortDirection === SortFieldDirection.Descending, + name: s.sortField + }; + }); + } + + private resetQueryText() { + const queryText = this.getDefaultQueryText(); + this.searchQuery.requests[0].query.queryString = queryText; + } + //#endregion +} diff --git a/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.scss b/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.scss new file mode 100644 index 0000000000..03d3bf166d --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.scss @@ -0,0 +1 @@ +@import '../../../../../node_modules/office-ui-fabric-core/dist/sass/References'; diff --git a/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.ts b/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.ts new file mode 100644 index 0000000000..5cd6efd3f1 --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.ts @@ -0,0 +1,179 @@ +import { html } from 'lit-element'; +import { EventConstants, customElement } from '@microsoft/mgt-element'; +import { IDataVerticalConfiguration } from '@microsoft/mgt-element/src/models/IDataVerticalConfiguration'; +import { ISearchVerticalEventData, MgtConnectableComponent, PageOpenBehavior } from '@microsoft/mgt-element'; +import { repeat } from 'lit-html/directives/repeat'; +import { isEmpty, isEqual } from 'lodash-es'; +import { styles } from './mgt-search-verticals-css'; +import { styles as tailwindStyles } from '../../styles/tailwind-styles-css'; +import { fluentTab, fluentTabPanel, fluentTabs, provideFluentDesignSystem } from '@fluentui/web-components'; +import { UrlHelper } from '@microsoft/mgt-element'; +import { property } from 'lit/decorators.js'; + +@customElement('mgt-search-verticals') +export class MgtSearchVerticalsComponent extends MgtConnectableComponent { + /** + * The configured search verticals + */ + @property({ + type: Object, + attribute: 'settings', + converter: { + fromAttribute: value => { + return JSON.parse(value) as IDataVerticalConfiguration[]; + } + } + }) + public verticals: IDataVerticalConfiguration[]; + + /** + * The query string parameter name to use to select a vertical tab by default + */ + @property({ type: String, attribute: 'default-query-string-param' }) + public defaultVerticalQueryStringParam = 'v'; + + @property({ type: String, attribute: 'selected-key', reflect: true }) + public selectedVerticalKey: string; + + constructor() { + super(); + this.onVerticalSelected = this.onVerticalSelected.bind(this); + + // Register fluent tabs (as scoped elements) + provideFluentDesignSystem().register(fluentTab(), fluentTabs(), fluentTabPanel()); + } + + public render() { + return html` +
+
+ + ${repeat( + this.verticals, + vertical => vertical.key, + vertical => { + return html` + { + this.onVerticalSelected(vertical); + }} + > + ${this.getLocalizedString(vertical.tabName)} + + + + `; + } + )} + +
+
+ `; + } + + static get styles() { + return [ + styles, // Allow component to use them CSS variables from design. The component is a first level component so it is OK to define theme variables here + tailwindStyles // Use Tailwind CSS classes + ]; + } + + public connectedCallback(): void { + this.handleQueryStringChange(); + this.initializeDefaultValue(); + + return super.connectedCallback(); + } + + /** + * Select the vertical and notifies all subscribers + * @param verticalKey the vertical key to select + */ + public selectVertical(verticalKey: string) { + if (!isEmpty(verticalKey)) { + this.selectedVerticalKey = verticalKey; + + // Update the query string parameter if already present in the URL + const verticalKeyParam = UrlHelper.getQueryStringParam( + this.defaultVerticalQueryStringParam, + window.location.href + ); + if ( + this.defaultVerticalQueryStringParam && + verticalKeyParam && + !isEqual(this.selectedVerticalKey, verticalKeyParam) + ) { + window.history.pushState( + {}, + '', + UrlHelper.addOrReplaceQueryStringParam( + window.location.href, + this.defaultVerticalQueryStringParam, + this.selectedVerticalKey + ) + ); + } + + this.fireCustomEvent(EventConstants.SEARCH_VERTICAL_EVENT, { + selectedVertical: this.verticals.filter(v => v.key === this.selectedVerticalKey)[0] + } as ISearchVerticalEventData); + } + } + + /** + * Handler when a vertical is slected by an user + * @param vertical the current selected vertical + */ + private onVerticalSelected(vertical: IDataVerticalConfiguration): void { + if (vertical.isLink && vertical.linkUrl) { + window.open(vertical.linkUrl, PageOpenBehavior.NewTab ? '_blank' : ''); + } else { + this.selectVertical(vertical.key); + } + } + + /** + * Initialize the default vertical value according to settings + */ + private initializeDefaultValue() { + if (!this.defaultVerticalQueryStringParam) { + this.selectedVerticalKey = this.selectedVerticalKey ? this.selectedVerticalKey : this.verticals[0].key; + } else { + // Get vertical corresponding to the query string URL parameter + const defaultQueryVal = UrlHelper.getQueryStringParam( + this.defaultVerticalQueryStringParam, + window.location.href.toLowerCase() + ); + + if (defaultQueryVal) { + const defaultSelected: IDataVerticalConfiguration[] = this.verticals.filter( + v => v.key.toLowerCase() === decodeURIComponent(defaultQueryVal.toLowerCase()) + ); + if (defaultSelected.length === 1) { + this.selectedVerticalKey = defaultSelected[0].key; + } + } else { + this.selectedVerticalKey = this.selectedVerticalKey ? this.selectedVerticalKey : this.verticals[0].key; + } + } + } + + /** + * Subscribes to URL query string change events using windows state + */ + private handleQueryStringChange() { + if (this.defaultVerticalQueryStringParam) { + // Will fire on browser back/forward + window.onpopstate = () => { + const verticalKeyParam = UrlHelper.getQueryStringParam( + this.defaultVerticalQueryStringParam, + window.location.href + ); + if (this.selectedVerticalKey !== verticalKeyParam) this.selectVertical(verticalKeyParam); + }; + } + } +} diff --git a/packages/mgt-components/src/components/mgt-search-verticals/strings.default.ts b/packages/mgt-components/src/components/mgt-search-verticals/strings.default.ts new file mode 100644 index 0000000000..0eb42c7c17 --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-verticals/strings.default.ts @@ -0,0 +1,3 @@ +export const strings = { + language: 'en-us' +}; diff --git a/packages/mgt-components/src/components/mgt-search-verticals/strings.fr-fr.ts b/packages/mgt-components/src/components/mgt-search-verticals/strings.fr-fr.ts new file mode 100644 index 0000000000..b97df8f21c --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-verticals/strings.fr-fr.ts @@ -0,0 +1,3 @@ +export const strings = { + language: 'fr-fr' +}; diff --git a/packages/mgt-components/src/components/mgt-search-verticals/tests/mgt-search-verticals.test.ts b/packages/mgt-components/src/components/mgt-search-verticals/tests/mgt-search-verticals.test.ts new file mode 100644 index 0000000000..6d5c1b8c5b --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-verticals/tests/mgt-search-verticals.test.ts @@ -0,0 +1,125 @@ +import { assert, elementUpdated, expect, fixture, html, oneEvent } from '@open-wc/testing'; +import { baseVerticalSettings } from './mocks'; +import sinon from 'sinon'; +import { ISearchVerticalEventData, LocalizationHelper, UrlHelper } from '@microsoft/mgt-element'; +import { strings as stringsFr } from '../strings.fr-fr'; +import { strings as stringsEn } from '../strings.default'; +import { MgtSearchVerticalsComponent } from '../mgt-search-verticals'; +import { EventConstants } from '@microsoft/mgt-element'; + +//#region Selectors +const getVerticals = (component: MgtSearchVerticalsComponent) => + component.shadowRoot.querySelector('fluent-tabs').querySelectorAll('fluent-tab'); +const getVerticalByName = (component: MgtSearchVerticalsComponent, name: string) => + component.shadowRoot + .querySelector('fluent-tabs') + .querySelector(`fluent-tab[data-name='${name}']`); +const getVerticalByKey = (component: MgtSearchVerticalsComponent, key: string) => + component.shadowRoot + .querySelector('fluent-tabs') + .querySelector(`fluent-tab[data-key='${key}']`); +//#endregion + +describe('mgt-search-verticals', async () => { + describe('common', async () => { + beforeEach(async () => { + const newUrl = UrlHelper.removeQueryStringParam('v', window.location.href); + window.history.pushState({ path: newUrl }, '', newUrl); + + LocalizationHelper.strings = stringsEn; + }); + + it('should be defined', async () => { + const el = document.createElement('mgt-search-verticals'); + assert.instanceOf(el, MgtSearchVerticalsComponent); + }); + + it('should display verticals according to the configuration', async () => { + const el: MgtSearchVerticalsComponent = await fixture( + html` + + + ` + ); + + // Check UI + assert.equal(getVerticals(el).length, 2); + assert.isNotNull(getVerticalByKey(el, 'tab1')); + assert.isNotNull(getVerticalByKey(el, 'tab2')); + + // Check data + assert.equal(el.verticals.length, 2); + }); + + it('should support localization for vertical name', async () => { + const el: MgtSearchVerticalsComponent = await fixture( + html` + + + ` + ); + + assert.isNotNull(getVerticalByName(el, 'Tab 1')); + assert.isNotNull(getVerticalByName(el, 'Tab 2')); + + // Load fr-fr strings + LocalizationHelper.strings = stringsFr; + await el.requestUpdate(); + + assert.isNotNull(getVerticalByName(el, 'Onglet 1')); + assert.isNotNull(getVerticalByName(el, 'Tab 2')); // Shouldn't change as it is not a localized string + }); + + it('shoud trigger an event with selected vertical data when user clicks on the tab', async () => { + const el: MgtSearchVerticalsComponent = await fixture( + html` + + + ` + ); + + assert.equal(el.getAttribute('selected-key'), 'tab1'); + + const listener = oneEvent(el, EventConstants.SEARCH_VERTICAL_EVENT); + getVerticalByKey(el, 'tab2').click(); + await elementUpdated(el); + + assert.equal(el.getAttribute('selected-key'), 'tab2'); + const { detail } = await listener; + + assert.equal((detail as ISearchVerticalEventData).selectedVertical.key, 'tab2'); + }); + }); + + describe('default query string parameter', async () => { + before(() => { + const newUrl = UrlHelper.addOrReplaceQueryStringParam(window.location.href, 'v', 'tab2'); + window.history.pushState({ path: newUrl }, '', newUrl); + }); + + it('should select default tab according to query string parameter', async () => { + const el: MgtSearchVerticalsComponent = await fixture( + html` + + + ` + ); + + const selectVerticalSpy = sinon.spy(el, 'selectVertical'); + assert.equal(el.getAttribute('selected-key'), 'tab2'); + expect(selectVerticalSpy.callCount).to.equal(0); + }); + + after(() => { + // Do not revert window.location.href to avoid infinite loop + }); + }); +}); diff --git a/packages/mgt-components/src/components/mgt-search-verticals/tests/mocks.ts b/packages/mgt-components/src/components/mgt-search-verticals/tests/mocks.ts new file mode 100644 index 0000000000..f51d549783 --- /dev/null +++ b/packages/mgt-components/src/components/mgt-search-verticals/tests/mocks.ts @@ -0,0 +1,23 @@ +//#region Mock data +export const baseVerticalSettings = [ + { + key: 'tab1', + tabName: { + default: 'Tab 1', + 'fr-fr': 'Onglet 1' + }, + tabValue: '', + isLink: false, + linkUrl: null, + openBehavior: 0 + }, + { + key: 'tab2', + tabName: 'Tab 2', + tabValue: '', + isLink: false, + linkUrl: null, + openBehavior: 0 + } +]; +//#endregion diff --git a/packages/mgt-components/src/styles/tailwind-styles.module.ts b/packages/mgt-components/src/styles/tailwind-styles.module.ts new file mode 100644 index 0000000000..d99e3c17ca --- /dev/null +++ b/packages/mgt-components/src/styles/tailwind-styles.module.ts @@ -0,0 +1,13 @@ +import { css, CSSResult } from 'lit-element'; +/** + * exports lit-element css + * @export styles + */ +export const styles: CSSResult[] = [ + css` + @tailwind base; + @tailwind components; + @tailwind utilities; + @tailwind screens; + ` +]; diff --git a/packages/mgt-element/package.json b/packages/mgt-element/package.json index 60c8ea0a5f..010deca527 100644 --- a/packages/mgt-element/package.json +++ b/packages/mgt-element/package.json @@ -33,7 +33,14 @@ "dependencies": { "@microsoft/microsoft-graph-client": "3.0.2", "lit": "^2.3.1", - "idb": "6.0.0" + "idb": "6.0.0", + "jspath": "0.4.0", + "lodash-es": "4.17.21", + "adaptive-expressions": "4.18.0", + "adaptivecards": "2.7.1", + "adaptivecards-templating": "2.3.1", + "dayjs": "^1.11.7", + "markdown-it": "13.0.1" }, "publishConfig": { "directory": "dist" diff --git a/packages/mgt-element/src/Constants.ts b/packages/mgt-element/src/Constants.ts new file mode 100644 index 0000000000..3b95e1ab46 --- /dev/null +++ b/packages/mgt-element/src/Constants.ts @@ -0,0 +1,35 @@ +/* eslint-disable @typescript-eslint/class-literal-property-style */ +export class EventConstants { + /** + * Event name when filters are submitted + */ + public static readonly SEARCH_FILTER_EVENT = 'Mgt:Components:Search:Filter'; + + /** + * Event name when results are retrieved + */ + public static readonly SEARCH_RESULTS_EVENT = 'Mgt:Components:Search:Results'; + /** + * Event name when input is sent + */ + public static get SEARCH_INPUT_EVENT() { + return 'Mgt:Components:Search:Input'; + } + + /** + * Event name when tab change is retrieved + */ + public static readonly SEARCH_VERTICAL_EVENT = 'Mgt:Components:Search:Verticals'; + /** + * Event name when sort field is updated + */ + public static readonly SEARCH_SORT_EVENT = 'Mgt:Components:Search:Sort'; +} + +export enum ThemeCSSVariables { + fontFamilyPrimary = '--ubi365-fontFamilyPrimary', + fontFamilySecondary = '--ubi365-fontFamilySecondary', + colorPrimary = '--ubi365-colorPrimary', + colorSecondary = '--ubi365-colorSecondary', + colorLight = '--ubi365-colorLight' +} diff --git a/packages/mgt-element/src/components/connectableComponent.ts b/packages/mgt-element/src/components/connectableComponent.ts new file mode 100644 index 0000000000..b412f88f69 --- /dev/null +++ b/packages/mgt-element/src/components/connectableComponent.ts @@ -0,0 +1,74 @@ +import { state } from 'lit-element'; +import { MgtTemplatedComponent } from './templatedComponent'; +import { EventHandler } from '../utils/EventDispatcher'; +import { isObjectLike } from 'lodash-es'; +import { IComponentBinding } from '../utils/IComponentBinding'; +import { LocalizationHelper } from '../utils/LocalizationHelper'; +import { ILocalizedString } from '../utils/ILocalizedString'; + +export abstract class MgtConnectableComponent extends MgtTemplatedComponent { + /** + * Flag indicating if data have been rendered at least once + */ + @state() + renderedOnce = false; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + protected declare _eventHanlders: Map< + string, + { component: HTMLElement; event: string; handler: EventHandler } + >; + + constructor() { + super(); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this._eventHanlders = new Map }>(); + } + + public disconnectedCallback(): void { + super.disconnectedCallback(); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for (const [key, value] of this._eventHanlders.entries()) { + value.component.removeEventListener(value.event, value.handler); + } + } + + protected bindComponents(bindings: IComponentBinding[]) { + const bindElement = (componentElement, binding) => { + this._eventHanlders.set(`${binding.id}-${binding.eventName}`, { + component: componentElement, + event: binding.eventName, + handler: binding.callbackFunction + }); + componentElement.addEventListener(binding.eventName, binding.callbackFunction); + }; + + bindings.forEach(binding => { + const eventKey = `${binding.id}-${binding.eventName}`; + + // The components should be already available in the DOM as they are statically defined in the page + const componentElement = document.getElementById(binding.id); + + if (componentElement && !this._eventHanlders.get(eventKey)) { + bindElement(componentElement, binding); + } + }); + } + + protected getLocalizedString(string: ILocalizedString | string) { + if (isObjectLike(string)) { + const localizedValue = string[LocalizationHelper.strings?.language]; + + if (!localizedValue) { + const defaultLabel = (string as ILocalizedString).default; + return defaultLabel ? defaultLabel : '{{Translation not found}}'; + } + + return localizedValue; + } + + return string; + } +} diff --git a/packages/mgt-element/src/events/ISearchFiltersEventData.ts.ts b/packages/mgt-element/src/events/ISearchFiltersEventData.ts.ts new file mode 100644 index 0000000000..61815b38c3 --- /dev/null +++ b/packages/mgt-element/src/events/ISearchFiltersEventData.ts.ts @@ -0,0 +1,13 @@ +import { FilterConditionOperator, IDataFilter } from '../models/IDataFilter'; + +export interface ISearchFiltersEventData { + /** + * List of filters to apply + */ + selectedFilters: IDataFilter[]; + + /** + * Operator to use between filters + */ + filterOperator: FilterConditionOperator; +} diff --git a/packages/mgt-element/src/events/ISearchInputEventData.ts b/packages/mgt-element/src/events/ISearchInputEventData.ts new file mode 100644 index 0000000000..5f89eb411d --- /dev/null +++ b/packages/mgt-element/src/events/ISearchInputEventData.ts @@ -0,0 +1,3 @@ +export interface ISearchInputEventData { + keywords: string; +} diff --git a/packages/mgt-element/src/events/ISearchResultsEventData.ts b/packages/mgt-element/src/events/ISearchResultsEventData.ts new file mode 100644 index 0000000000..3a45a6bafd --- /dev/null +++ b/packages/mgt-element/src/events/ISearchResultsEventData.ts @@ -0,0 +1,12 @@ +import { IDataFilterResult } from '../models/IDataFilter'; +import { IQueryAlterationResponse } from '../models/IMicrosoftSearchResponse'; +import { ISortFieldConfiguration } from '../models/ISortFieldConfiguration'; + +export interface ISearchResultsEventData { + availableFilters?: IDataFilterResult[]; + sortFieldsConfiguration?: ISortFieldConfiguration[]; + submittedQueryText?: string; + resultsCount?: number; + queryAlterationResponse?: IQueryAlterationResponse; + from?: number; +} diff --git a/packages/mgt-element/src/events/ISearchSortEventData.ts b/packages/mgt-element/src/events/ISearchSortEventData.ts new file mode 100644 index 0000000000..e47f09176b --- /dev/null +++ b/packages/mgt-element/src/events/ISearchSortEventData.ts @@ -0,0 +1,8 @@ +import { ISearchSortProperty } from '../models/IMicrosoftSearchRequest'; + +export interface ISearchSortEventData { + /** + * The Microsoft Search properties + */ + sortProperties: ISearchSortProperty[]; +} diff --git a/packages/mgt-element/src/events/ISearchVerticalEventData.ts b/packages/mgt-element/src/events/ISearchVerticalEventData.ts new file mode 100644 index 0000000000..bd7b37cd47 --- /dev/null +++ b/packages/mgt-element/src/events/ISearchVerticalEventData.ts @@ -0,0 +1,8 @@ +import { IDataVerticalConfiguration } from '../models/IDataVerticalConfiguration'; + +export class ISearchVerticalEventData { + /** + * Current selected vertical key + */ + selectedVertical: IDataVerticalConfiguration; +} diff --git a/packages/mgt-element/src/helpers/DataFilterHelper.ts b/packages/mgt-element/src/helpers/DataFilterHelper.ts new file mode 100644 index 0000000000..53ad2d23f0 --- /dev/null +++ b/packages/mgt-element/src/helpers/DataFilterHelper.ts @@ -0,0 +1,120 @@ +import isEmpty from 'lodash-es/isEmpty'; +import { + IDataFilter, + FilterConditionOperator, + IDataFilterValue, + FilterComparisonOperator +} from '../models/IDataFilter'; + +export class DataFilterHelper { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static dayJs: any; + + /** + * Build the refinement condition in FQL format + * @param selectedFilters The selected filter array + * @param dayJs The dayJs instance to resolve dates + * @param encodeTokens If true, encodes the taxonomy refinement tokens in UTF-8 to work with GET requests. Javascript encodes natively in UTF-16 by default. + */ + public static buildFqlRefinementString(selectedFilters: IDataFilter[], encodeTokens?: boolean): string[] { + const refinementQueryConditions: string[] = []; + + selectedFilters.forEach(filter => { + // Default operator is OR if not provided + const operator: FilterConditionOperator = filter.operator ? filter.operator : FilterConditionOperator.OR; + + // Mutli values + if (filter.values.length > 1) { + let startDate: string = null; + let endDate: string = null; + + // A refiner can have multiple values selected in a multi or mon multi selection scenario + // The correct operator is determined by the refiner display template according to its behavior + const conditions = filter.values + .map((filterValue: IDataFilterValue) => { + let value = filterValue.value; + + if (this.dayJs(value, this.dayJs.ISO_8601, true).isValid()) { + if ( + !startDate && + (filterValue.operator === FilterComparisonOperator.Geq || + filterValue.operator === FilterComparisonOperator.Gt) + ) { + startDate = value; + } + + if ( + !endDate && + (filterValue.operator === FilterComparisonOperator.Lt || + filterValue.operator === FilterComparisonOperator.Leq) + ) { + endDate = value; + } + } + + // If the value is null or undefined, we replace it by the FQL expression string('') + // Otherwise the query syntax won't be vaild resuting of to an HTTP 500 + if (isEmpty(value)) { + value = "string('')"; + } + + // Enclose the expression with quotes if the value contains spaces + if (/\s/.test(value) && value.indexOf('range') === -1) { + value = `"${value}"`; + } + + return /ǂǂ/.test(value) && encodeTokens ? encodeURIComponent(value) : value; + }) + .filter(c => c); + + if (startDate && endDate) { + refinementQueryConditions.push(`${filter.filterName}:range(${startDate},${endDate})`); + } else { + refinementQueryConditions.push(`${filter.filterName}:${operator}(${conditions.join(',')})`); + } + } else { + // Single value + if (filter.values.length === 1) { + const filterValue = filter.values[0]; + + // See https://sharepoint.stackexchange.com/questions/258081/how-to-hex-encode-refiners/258161 + let refinementToken = + /ǂǂ/.test(filterValue.value) && encodeTokens ? encodeURIComponent(filterValue.value) : filterValue.value; + + // https://docs.microsoft.com/en-us/sharepoint/dev/general-development/fast-query-language-fql-syntax-reference#fql_range_operator + if (this.dayJs(refinementToken, this.dayJs.ISO_8601, true).isValid()) { + if ( + filterValue.operator === FilterComparisonOperator.Gt || + filterValue.operator === FilterComparisonOperator.Geq + ) { + refinementToken = `range(${refinementToken},max)`; + } + + // Ex: scenario ('older than a year') + if ( + filterValue.operator === FilterComparisonOperator.Leq || + filterValue.operator === FilterComparisonOperator.Lt + ) { + refinementToken = `range(min,${refinementToken})`; + } + } + + // If the value is null or undefined, we replace it by the FQL expression string('') + // Otherwise the query syntax won't be vaild resuting of to an HTTP 500 + if (isEmpty(refinementToken)) { + refinementToken = "string('')"; + } + + // Enclose the expression with quotes if the value contains spaces + if (/\s/.test(refinementToken) && refinementToken.indexOf('range') === -1) { + refinementToken = `"${refinementToken}"`; + } + + refinementQueryConditions.push(`${filter.filterName}:${refinementToken}`); + } + } + }); + + return refinementQueryConditions; + } +} diff --git a/packages/mgt-element/src/helpers/DateHelper.ts b/packages/mgt-element/src/helpers/DateHelper.ts new file mode 100644 index 0000000000..cfc02d2470 --- /dev/null +++ b/packages/mgt-element/src/helpers/DateHelper.ts @@ -0,0 +1,144 @@ +export class DateHelper { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private dayJsLibrary: any; + + private culture: string; + + public constructor(culture?: string) { + this.culture = culture ? culture.toLocaleLowerCase() : 'en-us'; + } + + public async dayJs(): Promise { + if (this.dayJsLibrary) { + return Promise.resolve(this.dayJsLibrary); + } else { + const dayjs = await import('dayjs/esm'); + + const localizedFormat = await import('dayjs/esm/plugin/localizedFormat'); + + this.dayJsLibrary = dayjs.default; + this.dayJsLibrary.extend(localizedFormat.default); + + const twoLetterLanguageName = [ + 'af', + 'az', + 'be', + 'bg', + 'bm', + 'bo', + 'br', + 'bs', + 'ca', + 'cs', + 'cv', + 'cy', + 'da', + 'de-de', + 'dv', + 'el', + 'eo', + 'es-es', + 'et', + 'eu', + 'fa', + 'fi', + 'fil', + 'fo', + 'fy', + 'fr-fr', + 'ga', + 'gd', + 'gl', + 'gu', + 'he', + 'hi', + 'hr', + 'hu', + 'id', + 'is', + 'it-it', + 'ja', + 'jv', + 'ka', + 'kk', + 'km', + 'kn', + 'ko', + 'ku', + 'ky', + 'lb', + 'lo', + 'lt', + 'lv', + 'me', + 'mi', + 'mk', + 'ml', + 'mn', + 'mr', + 'mt', + 'my', + 'nb', + 'ne', + 'nn', + 'nl-nl', + 'pl', + 'pt-pt', + 'ro', + 'ru', + 'sd', + 'se', + 'si', + 'sk', + 'sl', + 'sq', + 'ss', + 'sv', + 'sw', + 'ta', + 'te', + 'tet', + 'tg', + 'th', + 'tk', + 'tlh', + 'tr', + 'tzl', + 'uk', + 'ur', + 'vi', + 'yo' + ]; + + // DayJs is by default "en-us" + if (!this.culture.startsWith('en-us')) { + for (let i = 0; i < twoLetterLanguageName.length; i++) + if (this.culture.startsWith(twoLetterLanguageName[i])) { + this.culture = this.culture.split('-')[0]; + break; + } + + await import(`dayjs/esm/locale/${this.culture}.js`); + } + + // Set default locale + this.dayJsLibrary.locale(this.culture); + return this.dayJsLibrary; + } + } + + public isDST() { + const today = new Date(); + const jan = new Date(today.getFullYear(), 0, 1); + const jul = new Date(today.getFullYear(), 6, 1); + const stdTimeZoneOffset = Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); + return today.getTimezoneOffset() < stdTimeZoneOffset; + } + + public addMinutes(isDst: boolean, date: Date, minutes: number, dst: number) { + if (isDst) { + minutes += dst; + } + return new Date(date.getTime() + minutes * 60000); + } +} diff --git a/packages/mgt-element/src/helpers/ObjectHelper.ts b/packages/mgt-element/src/helpers/ObjectHelper.ts new file mode 100644 index 0000000000..849df72f51 --- /dev/null +++ b/packages/mgt-element/src/helpers/ObjectHelper.ts @@ -0,0 +1,54 @@ +import * as jspath from 'jspath/lib/jspath.js'; +import { isEmpty } from 'lodash-es'; + +export class ObjectHelper { + /** + * Get object proeprty value by its deep path. + * @param object the object containg the property path + * @param path the property path to get + * @param delimiter if multiple matches are found, sepcifiy the delimiter character to use to separate values in the returned string + * @returns the property value as string if found, 'undefined' otherwise + */ + public static byPath(object: object, path: string, delimiter?: string): string { + let isValidPredicate = true; + + // Test if the provided path is a valid predicate https://www.npmjs.com/package/jspath#documentation + try { + jspath.compile(`.${path}`); + } catch (e) { + isValidPredicate = false; + } + + if (path && object && isValidPredicate) { + try { + // jsPath always returns an array. See https://www.npmjs.com/package/jspath#result + const value: object[] = jspath.apply(`.${path}`, object); + + // Empty array returned by jsPath + if (isEmpty(value)) { + // i.e the value to look for does not exist in the provided object + return undefined; + } + + // Check if value is an object + // - Arrays of objects will return '[object Object],[object Object]' etc. + if (value.toString().indexOf('[object Object]') !== -1) { + // Returns the stringified array + return JSON.stringify(value); + } + + if (delimiter && value.length > 1) { + return value.join(delimiter); + } + + // Use the default behavior of the toString() method. Arrays of simple values (string, integer, etc.) will be separated by a comma (',') + return value.toString(); + } catch (error) { + // Case when unexpected string or tokens are passed in the path + return null; + } + } else { + return undefined; + } + } +} diff --git a/packages/mgt-element/src/helpers/SearchResultsHelper.ts b/packages/mgt-element/src/helpers/SearchResultsHelper.ts new file mode 100644 index 0000000000..1c895716f4 --- /dev/null +++ b/packages/mgt-element/src/helpers/SearchResultsHelper.ts @@ -0,0 +1,91 @@ +import { ThemeCSSVariables } from '../Constants'; + +/** + * Fields to be added to results + */ +enum SearchResponseEnhancedFields { + FileTypeFamily = 'filefamily', + OpenInBrowserUrl = 'previewurl' +} + +/** + * Well known SharePoint managed properties (lower cased) + */ +enum WellKnownSearchProperties { + FileType = 'filetype', + Title = 'title', + Summary = 'summary' +} + +export class SearchResultsHelper { + public static readonly FileTypeAssociations = { + word: ['doc', 'docx', 'docm', 'dot', 'dotx', 'dotm'], + excel: ['xls', 'xlsx', 'csv', 'xlsm', 'xlsb', 'xlx', 'xml', 'csv', 'xltm', 'xlt', 'xltx'], + powerpoint: ['ppt', 'pptx', 'pptm', 'pps', 'ppsm', 'ppsx', 'potx', 'potm', 'pot'], + onenote: ['one'], + text: ['txt', 'rtf'], + visio: ['vsd', 'vsdx', 'vsdm'], + webpage: ['aspx', 'html'], + pdf: ['pdf'], + archive: ['zip', '7z', 'rar'] + }; + + /** + * Get the file famnily for its extension + * @param fileExtension the file extension + * @returns the file family corresponding to this extensions + */ + private static getFileIconType(fileExtension: string): string { + let fileType = 'generic'; + if (fileExtension) { + fileType = Object.keys(SearchResultsHelper.FileTypeAssociations).filter(key => { + return SearchResultsHelper.FileTypeAssociations[key].indexOf(fileExtension) !== -1; + })[0]; + } + + return fileType; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public static enhanceResults(items: any[]): any[] { + return items.map(item => { + // Title + if (item[WellKnownSearchProperties.Title]) + item[WellKnownSearchProperties.Title] = item[WellKnownSearchProperties.Title].replace(/\r|\t|\n/g, ''); + + // File family + if (item[WellKnownSearchProperties.FileType]) + item[SearchResponseEnhancedFields.FileTypeFamily] = this.getFileIconType( + item[WellKnownSearchProperties.FileType] + ); + + // Summary + if (item[WellKnownSearchProperties.Summary]) + item[WellKnownSearchProperties.Summary] = this.getItemSummary(item[WellKnownSearchProperties.Summary]); + + return item; + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public static getItemTitle(item: any) { + if (item.resource?.fields?.name) { + return item.resource?.fields?.name; + } else if (item.resource?.fields?.title) { + return item.resource?.fields?.title; + } else if (item.resource?.name) { + return item.resource?.name; + } + + return ''; + } + + public static getItemSummary(summary: string) { + // Special case with HitHighlightedSummary field + // eslint-disable-next-line no-useless-escape + return summary + .replace(//g, ``) + .replace(/<\/c0\>/g, '') + .replace(//g, '…'); + } +} diff --git a/packages/mgt-element/src/helpers/StringHelper.ts b/packages/mgt-element/src/helpers/StringHelper.ts new file mode 100644 index 0000000000..0fe5fab3cf --- /dev/null +++ b/packages/mgt-element/src/helpers/StringHelper.ts @@ -0,0 +1,6 @@ +export class StringHelper { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + public static escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string + } +} diff --git a/packages/mgt-element/src/helpers/UrlHelper.ts b/packages/mgt-element/src/helpers/UrlHelper.ts new file mode 100644 index 0000000000..34a99fd7ac --- /dev/null +++ b/packages/mgt-element/src/helpers/UrlHelper.ts @@ -0,0 +1,114 @@ +export class UrlHelper { + /** + * Test if the provided string is a valid URL + * @param url the URL to check + */ + public static isValidUrl(url: string): boolean { + // eslint-disable-next-line no-useless-escape + return /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/.test( + url + ); + } + + /** + * Get the value of a querystring + * @param {String} field The field to get the value of + * @param {String} url The URL to get the value from (optional) + * @return {String} The field value + */ + public static getQueryStringParam(field: string, url: string): string { + const href = url ? url : window.location.href; + const reg = new RegExp('[?&#]' + field + '=([^&#]*)', 'i'); + const qs = reg.exec(href); + return qs ? qs[1] : null; + } + + /** + * @param {String} field The field name of the query string to remove + * @param {String} sourceURL The source URL + * @return {String} The updated URL + */ + public static removeQueryStringParam(field: string, sourceURL: string): string { + let rtn = sourceURL.split('?')[0]; + let param = null; + let paramsArr = []; + const hash = window.location.hash; + const queryString = sourceURL.indexOf('?') !== -1 ? sourceURL.split('?')[1] : ''; + + if (queryString !== '') { + paramsArr = queryString.split('&'); + for (let i = paramsArr.length - 1; i >= 0; i -= 1) { + param = paramsArr[i].split('=')[0]; + if (param === field) { + paramsArr.splice(i, 1); + } + } + + if (paramsArr.length > 0) { + rtn = rtn + '?' + paramsArr.join('&').replace(hash, '') + hash; + } + } + return rtn; + } + + /** + * Add or replace a query string parameter + * @param url The current URL + * @param param The query string parameter to add or replace + * @param value The new value + */ + public static addOrReplaceQueryStringParam(url: string, param: string, value: string): string { + param = param.replace(/[.~*()]/g, ''); // // Ensure param is safe from DOS attacks - so we strip away RegEx special characters + const re = new RegExp('[\\?&]' + param + '=([^&#]*)'); + const match = re.exec(url); + let delimiter; + let newString; + + if (match === null) { + // Append new param + const hash = window.location.hash && window.location.hash !== '' ? window.location.hash : '#'; + const hasQuestionMark = /\?/.test(url); + delimiter = hasQuestionMark ? '&' : '?'; + newString = url.replace(hash, '') + delimiter + param + '=' + encodeURIComponent(value) + hash; + } else { + delimiter = match[0].charAt(0); + newString = url.replace(re, delimiter + param + '=' + encodeURIComponent(value)); + } + + return newString; + } + + /** + * Gets the current query string parameters + * @returns query string parameters as object + */ + public static getQueryStringParams(): { [parameter: string]: string } { + const queryStringParameters: { [parameter: string]: string } = {}; + const urlParams = new URLSearchParams(window.location.search); + urlParams.forEach((value, key) => { + queryStringParameters[key] = value; + }); + + return queryStringParameters; + } + + /** + * Decodes a provided string + * @param encodedStr the string to decode + */ + public static decode(encodedStr: string) { + const domParser = new DOMParser(); + const htmlContent: Document = domParser.parseFromString(`${encodedStr}`, 'text/html'); + return htmlContent.body.textContent; + } +} + +export enum PageOpenBehavior { + 'Self' = 'self', + 'NewTab' = 'newTab' +} + +export enum QueryPathBehavior { + 'URLFragment' = 'fragment', + 'QueryParameter' = 'queryparameter' +} diff --git a/packages/mgt-element/src/index.ts b/packages/mgt-element/src/index.ts index 196ffb39e2..5ba39e9fe3 100644 --- a/packages/mgt-element/src/index.ts +++ b/packages/mgt-element/src/index.ts @@ -13,6 +13,7 @@ export * from './BetaGraph'; export * from './components/baseComponent'; export * from './components/baseProvider'; export * from './components/templatedComponent'; +export * from './components/connectableComponent'; export * from './components/customElementHelper'; export * from './providers/IProvider'; @@ -36,3 +37,39 @@ export { PACKAGE_VERSION } from './utils/version'; export * from './CollectionResponse'; export * from './mock/MockProvider'; + +export * from './Constants'; + +export * from './services/IMicrosoftSearchService'; +export * from './services/MicrosoftSearchService'; +export * from './services/ITemplateService'; +export * from './services/TemplateService'; +export * from './services/TokenService'; +export * from './services/ITokenService'; + +export * from './models/BuiltinTemplate'; +export * from './models/IComponentBinding'; +export * from './models/IDataFilter'; +export * from './models/IDataFilterConfiguration'; +export * from './models/IDataSourceData'; +export * from './models/IDataVerticalConfiguration'; +export * from './models/ILocalizedString'; +export * from './models/IMicrosoftSearchDataSourceData'; +export * from './models/IMicrosoftSearchRequest'; +export * from './models/IMicrosoftSearchResponse'; +export * from './models/IResultTemplates'; +export * from './models/ISortFieldConfiguration'; +export * from './models/IThemeDefinition'; + +export * from './events/ISearchFiltersEventData.ts'; +export * from './events/ISearchInputEventData'; +export * from './events/ISearchResultsEventData'; +export * from './events/ISearchSortEventData'; +export * from './events/ISearchVerticalEventData'; + +export * from './helpers/DateHelper'; +export * from './helpers/ObjectHelper'; +export * from './helpers/SearchResultsHelper'; +export * from './helpers/StringHelper'; +export * from './helpers/UrlHelper'; +export * from './helpers/DataFilterHelper'; diff --git a/packages/mgt-element/src/models/BuiltinTemplate.ts b/packages/mgt-element/src/models/BuiltinTemplate.ts new file mode 100644 index 0000000000..de88a2555c --- /dev/null +++ b/packages/mgt-element/src/models/BuiltinTemplate.ts @@ -0,0 +1,4 @@ +export enum BuiltinFilterTemplates { + CheckBox = 'checkbox', + Date = 'date' +} diff --git a/packages/mgt-element/src/models/IComponentBinding.ts b/packages/mgt-element/src/models/IComponentBinding.ts new file mode 100644 index 0000000000..860dd123cd --- /dev/null +++ b/packages/mgt-element/src/models/IComponentBinding.ts @@ -0,0 +1,17 @@ +export interface IComponentBinding { + /** + * The DOM element ID to bind + */ + id: string; + + /** + * The event name to bind + */ + eventName: string; + + /** + * Function to call when the event is fired + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + callbackFunction: (e: CustomEvent) => void; +} diff --git a/packages/mgt-element/src/models/IDataFilter.ts b/packages/mgt-element/src/models/IDataFilter.ts new file mode 100644 index 0000000000..10b799f952 --- /dev/null +++ b/packages/mgt-element/src/models/IDataFilter.ts @@ -0,0 +1,81 @@ +/** + * Represents a filter value to be send to a data source + */ +export interface IDataFilterValue { + /** + * An unique identifier for that filter value + */ + key: string; + + /** + * The filter value display name + */ + name: string; + + /** + * Inner value to use when the value is selected + */ + value: string; + + /** + * The comparison operator to use with this value. If not provided, the 'Equals' operator will be used. + */ + operator?: FilterComparisonOperator; +} + +/** + * Represents a filter value returned by a data source + */ +export interface IDataFilterResultValue extends IDataFilterValue { + /** + * The number of results with this value + */ + count: number; +} +/** + * Represents a filter to be send to the data source + */ +export interface IDataFilter { + /** + * The filter internal name + */ + filterName: string; + + /** + * Values available in this filter + */ + values: IDataFilterValue[]; + + /** + * The logical operator to use between values + */ + operator?: FilterConditionOperator; +} + +/** + * Represents a filter returned from a data source + */ +export interface IDataFilterResult { + /** + * The filter display name + */ + filterName: string; + + /** + * Values available in this filter + */ + values: IDataFilterResultValue[]; +} +export enum FilterConditionOperator { + OR = 'or', + AND = 'and' +} +export enum FilterComparisonOperator { + Eq = 0, + Neq = 1, + Gt = 2, + Lt = 3, + Geq = 4, + Leq = 5, + Contains = 6 +} diff --git a/packages/mgt-element/src/models/IDataFilterConfiguration.ts b/packages/mgt-element/src/models/IDataFilterConfiguration.ts new file mode 100644 index 0000000000..ce75817266 --- /dev/null +++ b/packages/mgt-element/src/models/IDataFilterConfiguration.ts @@ -0,0 +1,111 @@ +import { BuiltinFilterTemplates } from './BuiltinTemplate'; +import { FilterConditionOperator } from './IDataFilter'; +import { ILocalizedString } from './ILocalizedString'; + +export enum FilterType { + /** + * A 'Refiner' filter means the filter gets the filters values from the data source and sends back the selected ones the data source. + */ + Refiner = 'refiner', + + /** + * An 'Static' filter means the filter doesn't care about filter values sent by the data source and provides its own arbitrary values regardless of input values. + * A date picker or a taxonomy picker (or any picker) are good examples of what an 'Out' filter is. + */ + StaticFilter = 'staticFilter' +} + +export enum FilterSortType { + /** + * Sort filter values by their count + */ + ByCount = 'byCount', + /** + * Sort filter values by their display name + */ + ByName = 'byName' +} + +export enum FilterSortDirection { + Ascending = 'ascending', + Descending = 'descending' +} + +export interface IDataFilterConfiguration { + /** + * The internal filter name (ex: corresponding either to data source field name or refinable search managed property in the case of SharePoint) + */ + filterName: string; + + /** + * The flter name to display in the UI + */ + displayName: string | ILocalizedString; + + /** + * The template to use to show filters + */ + template: BuiltinFilterTemplates; + + /** + * Specifies if the filter should show values count + */ + showCount: boolean; + + /** + * The operator to use between filter values + */ + operator: FilterConditionOperator; + + /** + * Indicates if the filter allows multi values + */ + isMulti: boolean; + + /** + * If the filter should be sorted by name or by count + */ + sortBy: FilterSortType; + + /** + * The filter values sort direction (ascending/descending) + */ + sortDirection: FilterSortDirection; + + /** + * The index of this filter in the configuration + */ + sortIdx: number; + + /** + * Number of buckets to fetch + */ + maxBuckets: number; + + /** + * Aggregations to use for filter values + */ + aggregations?: IDataFilterAggregation[]; +} + +export interface IDataFilterAggregation { + /** + * The friendly name to display as filter value for user (ex: "Word document") + */ + aggregationName: string | ILocalizedString; + + /** + * The values matching the aggreagation (ex: ["docx","doc"]) + */ + matchingValues: string[]; + + /** + * FQL value to apply when clicked: ex: or("value1","value2") + */ + aggregationValue: string; + + /** + * The icon URL to display for that value. Optional + */ + aggregationValueIconUrl?: string; +} diff --git a/packages/mgt-element/src/models/IDataSourceData.ts b/packages/mgt-element/src/models/IDataSourceData.ts new file mode 100644 index 0000000000..c481ee1e15 --- /dev/null +++ b/packages/mgt-element/src/models/IDataSourceData.ts @@ -0,0 +1,25 @@ +import { IResultTemplates } from './IResultTemplates'; +import { IDataFilterResult } from './IDataFilter'; + +export interface IDataSourceData { + /** + * Items returned by the data source. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + items: any[]; + + /** + * The count of items returned by the datasource + */ + totalCount?: number; + + /** + * The available filters provided by the data source according to the filters configuration provided from the data context (if applicable). + */ + filters?: IDataFilterResult[]; + + /** + * Result templates available for items provided by the data source + */ + resultTemplates?: IResultTemplates; +} diff --git a/packages/mgt-element/src/models/IDataVerticalConfiguration.ts b/packages/mgt-element/src/models/IDataVerticalConfiguration.ts new file mode 100644 index 0000000000..afddefdbd8 --- /dev/null +++ b/packages/mgt-element/src/models/IDataVerticalConfiguration.ts @@ -0,0 +1,34 @@ +import { PageOpenBehavior } from '../helpers/UrlHelper'; +import { ILocalizedString } from './ILocalizedString'; + +export interface IDataVerticalConfiguration { + /** + * Unique key for the vertical + */ + key: string; + + /** + * The vertical tab name + */ + tabName: string | ILocalizedString; + + /** + * The vertical tab value that will be sent to connected components + */ + tabValue: string; + + /** + * Specifes if the vertical is a link + */ + isLink: boolean; + + /** + * The link URL + */ + linkUrl: string; + + /** + * The link open behavior + */ + openBehavior: PageOpenBehavior; +} diff --git a/packages/mgt-element/src/models/ILocalizedString.ts b/packages/mgt-element/src/models/ILocalizedString.ts new file mode 100644 index 0000000000..1892bf8baa --- /dev/null +++ b/packages/mgt-element/src/models/ILocalizedString.ts @@ -0,0 +1,11 @@ +export interface ILocalizedString { + /** + * The default label to use + */ + default: string; + + /** + * Any other locales for the string (ex: 'fr-fr') + */ + [locale: string]: string; +} diff --git a/packages/mgt-element/src/models/IMicrosoftSearchDataSourceData.ts b/packages/mgt-element/src/models/IMicrosoftSearchDataSourceData.ts new file mode 100644 index 0000000000..761fad71b5 --- /dev/null +++ b/packages/mgt-element/src/models/IMicrosoftSearchDataSourceData.ts @@ -0,0 +1,11 @@ +import { IDataSourceData } from './IDataSourceData'; +import { IQueryAlterationResponse } from './IMicrosoftSearchResponse'; + +export interface IMicrosoftSearchDataSourceData extends IDataSourceData { + /** + * The alteration response by Microsft Search + * see https://docs.microsoft.com/en-us/graph/api/resources/alterationResponse?view=graph-rest-beta&preserve-view=true + * Spelling correction is only supported for the following resources: message, event, site, drive, driveItem, list, listItem and externalItem. + */ + queryAlterationResponse?: IQueryAlterationResponse; +} diff --git a/packages/mgt-element/src/models/IMicrosoftSearchRequest.ts b/packages/mgt-element/src/models/IMicrosoftSearchRequest.ts new file mode 100644 index 0000000000..132c27a47b --- /dev/null +++ b/packages/mgt-element/src/models/IMicrosoftSearchRequest.ts @@ -0,0 +1,74 @@ +export enum EntityType { + Message = 'message', + Event = 'event', + Drive = 'drive', + DriveItem = 'driveItem', + ExternalItem = 'externalItem', + List = 'list', + ListItem = 'listItem', + Site = 'site', + Person = 'person', + Bookmark = 'bookmark' +} + +export interface IMicrosoftSearchQuery { + requests: IMicrosoftSearchRequest[]; +} + +/** + * https://docs.microsoft.com/en-us/graph/api/resources/searchrequest?view=graph-rest-beta + */ +export interface IMicrosoftSearchRequest { + entityTypes: EntityType[]; + query: { + queryString: string; + queryTemplate?: string; + }; + fields?: string[]; + aggregations?: ISearchRequestAggregation[]; + aggregationFilters?: string[]; + from?: number; + size?: number; + enableTopResults?: boolean; + sortProperties?: ISearchSortProperty[]; + contentSources?: string[]; + queryAlterationOptions?: IQueryAlterationOptions; + resultTemplateOptions?: { + enableResultTemplate: boolean; + }; + trimDuplicates?: boolean; +} + +export interface ISearchSortProperty { + name: string; + isDescending: boolean; +} + +export interface ISearchRequestAggregation { + field: string; + size?: number; + bucketDefinition: IBucketDefinition; +} + +export interface IBucketDefinition { + sortBy: SearchAggregationSortBy; + isDescending: boolean; + minimumCount: number; + ranges?: IBucketRangeDefinition[]; +} + +export enum SearchAggregationSortBy { + Count = 'count', + KeyAsNumber = 'keyAsNumber', + KeyAsString = 'keyAsString' +} + +export interface IBucketRangeDefinition { + from?: number | string; + to?: number | string; +} + +export interface IQueryAlterationOptions { + enableSuggestion: boolean; + enableModification: boolean; +} diff --git a/packages/mgt-element/src/models/IMicrosoftSearchResponse.ts b/packages/mgt-element/src/models/IMicrosoftSearchResponse.ts new file mode 100644 index 0000000000..6297800b21 --- /dev/null +++ b/packages/mgt-element/src/models/IMicrosoftSearchResponse.ts @@ -0,0 +1,73 @@ +import { IResultTemplates } from './IResultTemplates'; + +// https://docs.microsoft.com/en-us/graph/api/resources/searchresponse?view=graph-rest-beta +export interface IMicrosoftSearchResponse { + value: IMicrosoftSearchResultSet; +} + +export interface IMicrosoftSearchResultSet { + hitsContainers: ISearchHitsContainer[]; + searchTerms: string[]; + queryAlterationResponse?: IQueryAlterationResponse; + resultTemplates?: IResultTemplates; +} + +export interface ISearchHitsContainer { + hits: ISearchHit[]; + moreResultsAvailable: boolean; + total: number; + aggregations: ISearchResponseAggregation[]; +} + +export interface ISearchHit { + hitId: string; + rank: number; + summary: string; + contentSource: string; + resource: ISearchResponseResource; + resultTemplateId?: string; +} + +export interface ISearchResponseAggregation { + field: string; + size?: number; + buckets: IBucket[]; +} + +export interface IBucket { + key: string; + count: number; + aggregationFilterToken: string; +} + +export interface ISearchResponseResource { + '@odata.type': string; + // listItem + fields?: { + [fieldName: string]: string; + }; + // properties + properties?: { + [fieldName: string]: string; + }; +} + +// Query alteration response +// https://docs.microsoft.com/en-us/graph/api/resources/alterationresponse +export interface IQueryAlterationResponse { + originalQueryString: string; + queryAlteration: ISearchAlteration; + queryAlterationType: 'suggestion' | 'modification'; +} + +export interface ISearchAlteration { + alteredQueryString: string; + alteredHighlightedQueryString: string; + alteredQueryTokens: IAlteredQueryTokens[]; +} + +export interface IAlteredQueryTokens { + offset: number; + length: number; + suggestion: string; +} diff --git a/packages/mgt-element/src/models/IResultTemplates.ts b/packages/mgt-element/src/models/IResultTemplates.ts new file mode 100644 index 0000000000..870f52ca48 --- /dev/null +++ b/packages/mgt-element/src/models/IResultTemplates.ts @@ -0,0 +1,6 @@ +export interface IResultTemplates { + [resultTemplateId: string]: { + body: string; + displayName: string; + }; +} diff --git a/packages/mgt-element/src/models/ISortFieldConfiguration.ts b/packages/mgt-element/src/models/ISortFieldConfiguration.ts new file mode 100644 index 0000000000..c0ee67dbb9 --- /dev/null +++ b/packages/mgt-element/src/models/ISortFieldConfiguration.ts @@ -0,0 +1,33 @@ +import { ILocalizedString } from './ILocalizedString'; + +export enum SortFieldDirection { + Ascending = 'asc', + Descending = 'desc' +} + +export interface ISortFieldConfiguration { + /** + * The sort search field to use + */ + sortField: string; + + /** + * The default sort direction + */ + sortDirection: SortFieldDirection; + + /** + * If the field is sorted by default (without use action) + */ + isDefaultSort: boolean; + + /** + * If the field should be available for users to sort + */ + isUserSort: boolean; + + /** + * If sortable by users, the display name to use in the control + */ + sortFieldDisplayName: ILocalizedString; +} diff --git a/packages/mgt-element/src/models/IThemeDefinition.ts b/packages/mgt-element/src/models/IThemeDefinition.ts new file mode 100644 index 0000000000..0e60e0957e --- /dev/null +++ b/packages/mgt-element/src/models/IThemeDefinition.ts @@ -0,0 +1,3 @@ +export interface IThemeDefinition { + [key: string]: string; +} diff --git a/packages/mgt-element/src/services/IMicrosoftSearchService.ts b/packages/mgt-element/src/services/IMicrosoftSearchService.ts new file mode 100644 index 0000000000..e3b3285847 --- /dev/null +++ b/packages/mgt-element/src/services/IMicrosoftSearchService.ts @@ -0,0 +1,19 @@ +import { IMicrosoftSearchDataSourceData } from '../models/IMicrosoftSearchDataSourceData'; +import { IMicrosoftSearchQuery } from '../models/IMicrosoftSearchRequest'; + +export interface IMicrosoftSearchService { + useBetaEndPoint: boolean; + + /** + * Performs a search query against Microsoft Search + * @param searchQuery The search query in KQL forma + * @param culture The language cutlure to query (ex: 'fr-fr'). If not set, default is 'en-US') + * @return The search results + */ + search(searchQuery: IMicrosoftSearchQuery, culture?: string): Promise; + + /** + * Abort the current HTTP request + */ + abortRequest(); +} diff --git a/packages/mgt-element/src/services/ITemplateService.ts b/packages/mgt-element/src/services/ITemplateService.ts new file mode 100644 index 0000000000..9b17e844f5 --- /dev/null +++ b/packages/mgt-element/src/services/ITemplateService.ts @@ -0,0 +1,48 @@ +import { IDataSourceData } from '../models/IDataSourceData'; +import { IThemeDefinition } from '../models/IThemeDefinition'; + +export enum FileFormat { + Text = 'text', + Json = 'json' +} + +export interface ITemplateService { + /** + * Update the HTML element with corresponding result types for items (i.e. node with id attribute equals to "hitId") + * @param data the data source data containing the items + * @param templateContent the template content as HTML + * @param theme the theme to apply + * @returns the updated HTML element with result types + */ + processResultTypesFromHtml( + data: IDataSourceData, + templateContent: HTMLElement, + theme?: IThemeDefinition + ): HTMLElement; + + /** + * Process the adaptive card with data from the context + * @param templateContent the card content as stringified JSON + * @param templateContext the card context for data binding + * @param theme the theme to apply + * @returns the processed HTML as raw string + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + processAdaptiveCardTemplate( + templateContent: string, + templateContext: { [key: string]: any }, + theme?: IThemeDefinition + ): HTMLElement; + + /** + * Load adaptive cards resources on the page dynamically + */ + loadAdaptiveCardsResources(): Promise; + + /** + * Gets the external file content from the specified URL using Microsoft Graph + * @param fileUrl + * @returns the file raw content as string + */ + getFileContent(fileUrl: string): Promise; +} diff --git a/packages/mgt-element/src/services/ITokenService.ts b/packages/mgt-element/src/services/ITokenService.ts new file mode 100644 index 0000000000..27ed8535c4 --- /dev/null +++ b/packages/mgt-element/src/services/ITokenService.ts @@ -0,0 +1,20 @@ +export interface ITokenService { + /** + * Sets the value for a specific token + * @param token the token name + * @param value the value to set + */ + setTokenValue(token: string, value: string): void; + + /** + * Gets the value of a specific token + * @param token the token name to retrieve + */ + getTokenValue(token: string): string; + + /** + * Resolves tokens for the specified input string. + * @param string + */ + resolveTokens(string: string): string; +} diff --git a/packages/mgt-element/src/services/MicrosoftSearchService.ts b/packages/mgt-element/src/services/MicrosoftSearchService.ts new file mode 100644 index 0000000000..646d390b0a --- /dev/null +++ b/packages/mgt-element/src/services/MicrosoftSearchService.ts @@ -0,0 +1,142 @@ +import { IMicrosoftSearchService } from './IMicrosoftSearchService'; +import { IMicrosoftSearchDataSourceData } from '../models/IMicrosoftSearchDataSourceData'; +import { EntityType, IMicrosoftSearchQuery } from '../models/IMicrosoftSearchRequest'; +import { IMicrosoftSearchResponse, IMicrosoftSearchResultSet } from '../models/IMicrosoftSearchResponse'; +import { IDataFilterResult, IDataFilterResultValue, FilterComparisonOperator } from '../models/IDataFilter'; +import { Client, ClientOptions, FetchOptions } from '@microsoft/microsoft-graph-client'; +import { Providers } from '../providers/Providers'; + +export const EntityTypesValidCombination = [ + EntityType.Drive, + EntityType.DriveItem, + EntityType.Site, + EntityType.List, + EntityType.ListItem +]; + +export class MicrosoftSearchService implements IMicrosoftSearchService { + private _useBetaEndPoint: boolean; + public get useBetaEndPoint(): boolean { + return this._useBetaEndPoint; + } + public set useBetaEndPoint(value: boolean) { + this._useBetaEndPoint = value; + this._microsoftSearchUrl = `https://graph.microsoft.com/${value ? 'beta' : 'v1.0'}/search/query`; + } + + private controller: AbortController; + + private _microsoftSearchUrl = 'https://graph.microsoft.com/v1.0/search/query'; + + public async search(searchQuery: IMicrosoftSearchQuery, culture?: string): Promise { + let itemsCount = 0; + const response: IMicrosoftSearchDataSourceData = { + items: [], + filters: [] + }; + const aggregationResults: IDataFilterResult[] = []; + + // To be able to cancel requests individually, a new controller needs to be instanciated every time + this.controller = new AbortController(); + + const fetchOptions: FetchOptions = { + signal: this.controller.signal + }; + + const clientOptions: ClientOptions = { + authProvider: Providers.globalProvider, + fetchOptions: fetchOptions + }; + + const client = Client.initWithMiddleware(clientOptions); + + try { + const jsonResponse: IMicrosoftSearchResponse = await client + .api(this._microsoftSearchUrl) + .headers({ + SdkVersion: 'Ubisoft', + 'accept-language': culture ? culture : 'en-US' + }) + .post(searchQuery); + + if (jsonResponse.value && Array.isArray(jsonResponse.value)) { + jsonResponse.value.forEach((value: IMicrosoftSearchResultSet) => { + // Map results + value.hitsContainers.forEach(hitContainer => { + itemsCount += hitContainer.total; + + if (hitContainer.hits) { + const hits = hitContainer.hits.map(hit => { + // "externalItem" will contain resource.properties but "listItem" will be resource.fields + const propertiesFieldName = hit.resource.properties + ? 'properties' + : hit.resource.fields + ? 'fields' + : null; + + if (propertiesFieldName) { + // Flatten "fields" to be usable with the Search Fitler WP as refiners + Object.keys(hit.resource[propertiesFieldName]).forEach(field => { + // If the property already exists, keep it. Otherwise create it. + if (!hit[field.toLocaleLowerCase()]) { + hit[field.toLocaleLowerCase()] = hit.resource[propertiesFieldName][field]; + } + }); + } + + return hit; + }); + + response.items = response.items.concat(hits); + } + + if (hitContainer.aggregations) { + // Map refinement results + hitContainer.aggregations.forEach(aggregation => { + const values: IDataFilterResultValue[] = []; + aggregation.buckets.forEach(bucket => { + values.push({ + key: bucket.aggregationFilterToken, + count: bucket.count, + name: bucket.key, + value: bucket.aggregationFilterToken, + operator: FilterComparisonOperator.Contains + } as IDataFilterResultValue); + }); + + aggregationResults.push({ + filterName: aggregation.field, + values: values + }); + }); + + response.filters = aggregationResults; + } + }); + + if (value?.queryAlterationResponse) { + response.queryAlterationResponse = value.queryAlterationResponse; + } + + if (value?.resultTemplates) { + response.resultTemplates = value.resultTemplates; + } + }); + + response.totalCount = itemsCount; + } + } catch (error) { + if (this.controller.signal.aborted) { + console.log('Graph request was aborted'); + } + + throw new Error(`${error.code} - ${error.message}`); + } + + return response; + } + + public abortRequest() { + this.controller.abort(); + } +} diff --git a/packages/mgt-element/src/services/TemplateService.ts b/packages/mgt-element/src/services/TemplateService.ts new file mode 100644 index 0000000000..cf2b3cf2bd --- /dev/null +++ b/packages/mgt-element/src/services/TemplateService.ts @@ -0,0 +1,208 @@ +import { ThemeCSSVariables } from '../Constants'; +import { IDataSourceData } from '../models/IDataSourceData'; +import { IThemeDefinition } from '../models/IThemeDefinition'; +import { ITemplateService } from './ITemplateService'; + +/** + * Custom attributes that can be used to display result types + */ +const ResultTypesAttributes = { + FallbackImageUrl: 'fallback-img-url' +}; + +export class TemplateService implements ITemplateService { + private _adaptiveCardsNS; + private _markdownIt; + private _adaptiveCardsTemplating; + private _serializationContext; + + public async loadAdaptiveCardsResources(): Promise { + if (!this._adaptiveCardsNS) { + // Load dynamic resources + /*this._adaptiveCardsNS = await import( + 'adaptivecards' + );*/ + + // Initialize the serialization context for the Adaptive Cards, if needed + if (!this._serializationContext) { + /* const { CardObjectRegistry, GlobalRegistry, SerializationContext } = await import( + 'adaptivecards' + );*/ + + //this._serializationContext = new SerializationContext(); + + const CardElementType = this._adaptiveCardsNS.CardElement; + const ActionElementType = this._adaptiveCardsNS.Action; + + /* const elementRegistry = new CardObjectRegistry>(); + const actionRegistry = new CardObjectRegistry>(); + + GlobalRegistry.populateWithDefaultElements(elementRegistry); + GlobalRegistry.populateWithDefaultActions(actionRegistry); + + this._serializationContext.setElementRegistry(elementRegistry); + this._serializationContext.setActionRegistry(actionRegistry);*/ + } + + this._adaptiveCardsNS.AdaptiveCard.onProcessMarkdown = (text: string, result) => { + // We use Markdown here to render HTML and use web components + const rawHtml = this._markdownIt.render(text).replace(/</g, '<').replace(/>/g, '>'); + + result.outputHtml = rawHtml; + result.didProcess = true; + }; + + /* await import( + 'adaptive-expressions' + );*/ + + /* this._adaptiveCardsTemplating = await import( + 'adaptivecards-templating' + );*/ + + const MarkdownIt = await import('markdown-it'); + + this._markdownIt = new MarkdownIt.default(); + this._markdownIt = new MarkdownIt(); + } + } + + public async getFileContent(fileAbsoluteUrl: string): Promise { + const response: Response = await fetch(fileAbsoluteUrl, { + method: 'GET', + mode: 'cors' + }); + + if (response.ok) { + switch (response.headers.get('Content-Type')) { + case 'text/html' || 'text/plain': + return await response.text(); + + case 'application/json': + return JSON.stringify(await response.json()); + + default: + return await response.text(); + } + } else { + throw response.statusText; + } + } + + public processAdaptiveCardTemplate( + templateContent: string, + templateContext: object, + theme?: IThemeDefinition + ): HTMLElement { + const template = new this._adaptiveCardsTemplating.Template(JSON.parse(templateContent)); + const hostConfiguration = new this._adaptiveCardsNS.HostConfig(this._getHostConfiguration(theme)); + + // The root context will be available in the the card implicitly + const context = { + $root: templateContext + }; + + const card = template.expand(context); + const adaptiveCard = new this._adaptiveCardsNS.AdaptiveCard(); + adaptiveCard.hostConfig = hostConfiguration; + + adaptiveCard.parse(card, this._serializationContext); + return adaptiveCard.render(); + } + + public processResultTypesFromHtml(data: IDataSourceData, templateContent: HTMLElement): HTMLElement { + if (data?.resultTemplates) { + // Build dictionary of available result template + const templateDictionary = new Map(Object.entries(data.resultTemplates)); + + for (const item of data.items) { + const templateId = item.resultTemplateId; + + if (templateId) { + const templatePayload = templateDictionary.get(templateId).body; + + // Check if item should use a result template + if (templatePayload && templateId !== 'connectordefault') { + // Partial match as we can"t use the complete ID due to special characters "/" and "=="" + const defaultItem: HTMLElement = templateContent.querySelector(`[id^="${item.hitId.substring(0, 15)}"]`); + + // Replace the HTML element corresponding to the item by its result type + if (defaultItem) { + const adaptiveCardComponent = document.createElement('mgt-adaptive-card') as any; //MgtAdaptiveCardComponent; + adaptiveCardComponent.cardContent = JSON.stringify(templatePayload); + adaptiveCardComponent.cardContext = item; + + // Get other settings from placeholder attribute specified in the template + adaptiveCardComponent.fallbackImageUrl = defaultItem.getAttribute(ResultTypesAttributes.FallbackImageUrl); + defaultItem.replaceWith(adaptiveCardComponent); + } + } + } + } + } + + return templateContent; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private _getHostConfiguration(theme?: IThemeDefinition): { [key: string]: any } { + return { + separator: { + lineThickness: 1, + lineColor: '#1e252b' + }, + supportsInteractivity: true, + fontTypes: { + default: { + fontFamily: theme ? theme[ThemeCSSVariables.fontFamilyPrimary] : '', + fontSizes: { + small: 12, + medium: 14, + large: 24 + }, + fontWeights: { + bolder: 700 + } + }, + monospace: { + fontFamily: theme ? theme[ThemeCSSVariables.fontFamilySecondary] : '', + fontSizes: { + small: 12, + medium: 14, + large: 24 + }, + fontWeights: { + bolder: 700 + } + } + }, + containerStyles: { + default: { + backgroundColor: '#FFFFFF', + foregroundColors: { + default: { + default: '#000000' + }, + accent: { + default: theme ? theme[ThemeCSSVariables.colorPrimary] : '' + }, + light: { + default: theme ? theme[ThemeCSSVariables.colorLight] : '' + } + } + }, + emphasis: { + backgroundColor: '#DCE2E5' + } + }, + adaptiveCard: { + allowCustomStyle: true + }, + spacing: { + default: 6, + medium: 8, + large: 16 + } + }; + } +} diff --git a/packages/mgt-element/src/services/TokenService.ts b/packages/mgt-element/src/services/TokenService.ts new file mode 100644 index 0000000000..2b1ff6d565 --- /dev/null +++ b/packages/mgt-element/src/services/TokenService.ts @@ -0,0 +1,77 @@ +import { ObjectHelper } from '../helpers/ObjectHelper'; +import { StringHelper } from '../helpers/StringHelper'; +import { ITokenService } from './ITokenService'; + +export enum BuiltinTokenNames { + /** + * The input query text configured in the search results Web Part + */ + inputQueryText = 'inputQueryText', + + /** + * Similar as 'inputQueryText' to match the SharePoint search token + */ + searchTerms = 'searchTerms' +} + +export class TokenService implements ITokenService { + /** + * This regex only matches expressions enclosed with single, not escaped, curly braces '{}' + */ + private genericTokenRegexp = /{[^{]+?[^\\]}/gi; + + /** + * The list of static tokens values set by the Web Part as context + */ + private tokenValuesList: { [key: string]: string } = { + [BuiltinTokenNames.inputQueryText]: undefined, + [BuiltinTokenNames.searchTerms]: undefined + }; + + public setTokenValue(token: string, value: string) { + // Check if the token is in the whitelist + if (Object.keys(this.tokenValuesList).indexOf(token) !== -1) { + this.tokenValuesList[token] = value; + } else { + console.log(`The token '${token}' not allowed.`); + } + } + + public getTokenValue(token: string): string { + return this.tokenValuesList[token]; + } + + public resolveTokens(inputString: string): string { + if (inputString) { + // Look for static tokens in the specified string + const tokens = inputString.match(this.genericTokenRegexp); + + if (tokens !== null && tokens.length > 0) { + tokens.forEach(token => { + // Take the expression inside curly brackets + const tokenName = token.substr(1).slice(0, -1); + + // Check if the property exists in the object + // 'undefined' => token hasn't been initialized in the TokenService instance. We left the token expression untouched (ex: {token}). Ex: no filters component connected, etc. + // 'null' => token has been initialized but set with a null value. We replace by an empty string as we don't want the string 'null' litterally in the output. + // '' (empty string) => replaced in the original string with an empty string as well. + const tokenValue = ObjectHelper.byPath(this.tokenValuesList, tokenName); + + if (tokenValue !== undefined) { + if (tokenValue !== null) { + inputString = inputString.replace(new RegExp(StringHelper.escapeRegExp(token), 'gi'), tokenValue); + } else { + // If the property value is 'null', we replace by an empty string. 'null' means it has been already set but resolved as empty. + inputString = inputString.replace(new RegExp(StringHelper.escapeRegExp(token), 'gi'), ''); + } + } + }); + } + + // Replace manually escaped curly braces + inputString = inputString.replace(/\\({|})/gi, '$1'); + } + + return inputString; + } +} diff --git a/packages/mgt-element/src/utils/IComponentBinding.ts b/packages/mgt-element/src/utils/IComponentBinding.ts new file mode 100644 index 0000000000..860dd123cd --- /dev/null +++ b/packages/mgt-element/src/utils/IComponentBinding.ts @@ -0,0 +1,17 @@ +export interface IComponentBinding { + /** + * The DOM element ID to bind + */ + id: string; + + /** + * The event name to bind + */ + eventName: string; + + /** + * Function to call when the event is fired + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + callbackFunction: (e: CustomEvent) => void; +} diff --git a/packages/mgt-element/src/utils/ILocalizedString.ts b/packages/mgt-element/src/utils/ILocalizedString.ts new file mode 100644 index 0000000000..1892bf8baa --- /dev/null +++ b/packages/mgt-element/src/utils/ILocalizedString.ts @@ -0,0 +1,11 @@ +export interface ILocalizedString { + /** + * The default label to use + */ + default: string; + + /** + * Any other locales for the string (ex: 'fr-fr') + */ + [locale: string]: string; +} diff --git a/packages/mgt/package.json b/packages/mgt/package.json index 32d6377e9a..0413cdbf9d 100644 --- a/packages/mgt/package.json +++ b/packages/mgt/package.json @@ -25,10 +25,12 @@ "src" ], "scripts": { - "build": "npm-run-all clean build:compile build:bundle", + "build": "npm-run-all clean tailwindcss build:compile build:bundle", "build:bundle": "npm-run-all copy:loader copy:wc sass rollup", "build:compile": "npm-run-all sass compile", - "build:watch": "npm-run-all -p sass:watch compile:watch", + "build:watch": "npm-run-all -p tailwindcss:watch sass:watch compile:watch", + "tailwindcss": "tailwindcss --postcss -i ../mgt-components/src/styles/tailwind-styles.module.ts -o ../mgt-components/src/styles/tailwind-styles-css.ts --minify", + "tailwindcss:watch": "tailwindcss --postcss -i ../mgt-components/src/styles/tailwind-styles.module.ts -o ../mgt-components/src/styles/tailwind-styles-css.ts --watch --minify", "clean": "shx rm -rf ./dist && shx rm -rf ./tsconfig.tsbuildinfo", "compile": "tsc -b", "compile:watch": "tsc -w", diff --git a/packages/mgt/postcss.config.js b/packages/mgt/postcss.config.js new file mode 100644 index 0000000000..ea44fbd1bf --- /dev/null +++ b/packages/mgt/postcss.config.js @@ -0,0 +1,10 @@ +module.exports = { + syntax: 'postcss-lit', + plugins: { + 'postcss-import': {}, + 'postcss-nested': {}, + 'tailwindcss/nesting': {}, + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/packages/mgt/rollup.config.js b/packages/mgt/rollup.config.js index 6b491a1628..a44d2c19b8 100644 --- a/packages/mgt/rollup.config.js +++ b/packages/mgt/rollup.config.js @@ -39,7 +39,8 @@ const es6Bundle = { entryFileNames: 'mgt.es6.js', format: 'iife', name: 'mgt', - sourcemap: false + sourcemap: false, + inlineDynamicImports: true }, plugins: [ babel({ @@ -114,4 +115,4 @@ const cjsBundle = { ] }; -export default [es6Bundle, es5Bundle, cjsBundle]; +export default [es6Bundle]; diff --git a/packages/mgt/tailwind.config.js b/packages/mgt/tailwind.config.js new file mode 100644 index 0000000000..d32c6ce54a --- /dev/null +++ b/packages/mgt/tailwind.config.js @@ -0,0 +1,11 @@ +const { tailwindTransform } = require('postcss-lit'); + +module.exports = { + mode: 'jit', + content: { + files: ['../mgt-components/**/*.ts'], + transform: { + ts: tailwindTransform + } + } +}; diff --git a/tsconfig.base.json b/tsconfig.base.json index 49b7361f35..9fb02a0623 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -5,7 +5,7 @@ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ "target": "es2015" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "es6" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "module": "esnext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "lib": ["dom", "es5", "DOM.Iterable"] /* Specify library files to be included in the compilation. */, // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ diff --git a/tsconfig.web-test-runner.json b/tsconfig.web-test-runner.json new file mode 100644 index 0000000000..ac4acf6ea7 --- /dev/null +++ b/tsconfig.web-test-runner.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "useDefineForClassFields": false // Needed to mix class fields and reactive properties in Lit elements https://lit.dev/docs/components/properties/#avoiding-issues-with-class-fields + }, + "include": ["packages/**/src/**/*.ts"], + "exclude": ["node_modules", "lib"] +} diff --git a/web-test-runner.config.mjs b/web-test-runner.config.mjs new file mode 100644 index 0000000000..9a0dcfb732 --- /dev/null +++ b/web-test-runner.config.mjs @@ -0,0 +1,49 @@ +import { playwrightLauncher } from '@web/test-runner-playwright'; +import { esbuildPlugin } from '@web/dev-server-esbuild'; +import { fileURLToPath } from 'url'; + +const mode = process.env.MODE || 'dev'; +if (!['dev', 'prod'].includes(mode)) { + throw new Error(`MODE must be "dev" or "prod", was "${mode}"`); +} + +const browsers = { + // Local browser testing via playwright + // =========== + chromium: playwrightLauncher({ product: 'chromium' }), + firefox: playwrightLauncher({ product: 'firefox' }), + webkit: playwrightLauncher({ product: 'webkit' }) +}; + +// Prepend BROWSERS=x,y to `npm run test` to run a subset of browsers +// e.g. `BROWSERS=chromium,firefox npm run test` +const noBrowser = b => { + throw new Error(`No browser configured named '${b}'; using defaults`); +}; +let commandLineBrowsers; +try { + commandLineBrowsers = process.env.BROWSERS?.split(',').map(b => browsers[b] ?? noBrowser(b)); +} catch (e) { + console.warn(e); +} + +// https://modern-web.dev/docs/test-runner/cli-and-configuration/ +export default { + files: ['packages/**/src/**/*.test.ts'], + nodeResolve: true, + browsers: commandLineBrowsers ?? Object.values(browsers), + testFramework: { + // https://mochajs.org/api/mocha + config: { + ui: 'bdd', + timeout: '60000' + } + }, + plugins: [ + // https://modern-web.dev/docs/dev-server/plugins/esbuild/ + esbuildPlugin({ + ts: true, + tsconfig: fileURLToPath(new URL('./tsconfig.web-test-runner.json', import.meta.url)) + }) + ] +}; From 7445d1abc3fd515d7dafe9513870c0498af12db9 Mon Sep 17 00:00:00 2001 From: Franck Cornu Date: Sun, 2 Jul 2023 23:01:22 -0400 Subject: [PATCH 2/4] Working version of search components --- .vscode/launch.json | 4 +- index.html | 47 +- package.json | 7 +- .../src/components/components.ts | 12 +- .../mgt-search-results/mgt-search-results.ts | 932 -------- .../mgt-search-verticals.scss | 1 - .../src/components/preview/index.ts | 4 + .../mgt-search-filters/mgt-base-filter.ts | 5 +- .../mgt-checkbox-filter.ts | 7 +- .../mgt-checkbox-filter/strings.ts | 0 .../mgt-date-filter/mgt-date-filter.ts | 3 +- .../mgt-date-filter/strings.ts | 0 .../mgt-search-filters/mgt-search-filters.ts | 13 +- .../mgt-search-filters/strings.ts | 0 .../mgt-search-results.scss | 0 .../mgt-search-results.ts | 1280 +++++++++++ .../strings.ts | 0 .../mgt-search-results/loc/strings.default.ts | 4 +- .../mgt-adaptive-card/mgt-adaptive-card.ts | 6 +- .../mgt-search-results/mgt-search-results.ts | 1869 +++++++---------- .../mgt-search-verticals.scss | 1 + .../mgt-search-verticals.ts | 7 +- .../mgt-search-verticals/strings.default.ts | 0 .../mgt-search-verticals/strings.fr-fr.ts | 0 .../tests/mgt-search-verticals.test.ts | 0 .../mgt-search-verticals/tests/mocks.ts | 0 packages/mgt-element/src/ComponentElements.ts | 3 + packages/mgt-react/src/generated/react.ts | 20 +- yarn.lock | 1165 +++++++++- 29 files changed, 3244 insertions(+), 2146 deletions(-) delete mode 100644 packages/mgt-components/src/components/mgt-search-results/mgt-search-results.ts delete mode 100644 packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.scss rename packages/mgt-components/src/components/{ => preview}/mgt-search-filters/mgt-base-filter.ts (97%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts (98%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-filters/mgt-checkbox-filter/strings.ts (100%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts (99%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-filters/mgt-date-filter/strings.ts (100%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-filters/mgt-search-filters.ts (98%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-filters/strings.ts (100%) rename packages/mgt-components/src/components/preview/{mgt-search-results => mgt-search-results-old}/mgt-search-results.scss (100%) create mode 100644 packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.ts rename packages/mgt-components/src/components/preview/{mgt-search-results => mgt-search-results-old}/strings.ts (100%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-results/loc/strings.default.ts (97%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts (96%) create mode 100644 packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.scss rename packages/mgt-components/src/components/{ => preview}/mgt-search-verticals/mgt-search-verticals.ts (97%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-verticals/strings.default.ts (100%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-verticals/strings.fr-fr.ts (100%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-verticals/tests/mgt-search-verticals.test.ts (100%) rename packages/mgt-components/src/components/{ => preview}/mgt-search-verticals/tests/mocks.ts (100%) create mode 100644 packages/mgt-element/src/ComponentElements.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index aa5d14456f..7dfebda87f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ "version": "0.2.0", "configurations": [ { - "type": "edge", + "type": "msedge", "request": "launch", "name": "Launch Edge Canary against localhost", "url": "http://localhost:3000", @@ -13,7 +13,7 @@ "version": "canary" }, { - "type": "edge", + "type": "msedge", "request": "launch", "name": "Launch Edge Dev against localhost", "url": "http://localhost:3000", diff --git a/index.html b/index.html index f030f3ed43..13af9b3057 100644 --- a/index.html +++ b/index.html @@ -35,11 +35,20 @@ - + >--> + + +
@@ -77,7 +86,39 @@

mgt-login

+ + + + + + + + + + + diff --git a/package.json b/package.json index bd07aab261..eadfa5aadd 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,9 @@ "storybook:deploy": "npm run storybook:build && storybook-to-ghpages -e storybook-static", "setLicense": "gulp setLicense", "test": "jest", - "version:tsc": "tsc -v" + "version:tsc": "tsc -v", + "wtr": "wtr", + "wtr:watch": "wtr --watch" }, "storybook-deployer": { "gitUsername": "@microsoft/mgt", @@ -109,6 +111,7 @@ "@web/dev-server": "^0.1.10", "@web/test-runner": "0.15.0", "@web/dev-server-esbuild": "0.3.3", + "@web/test-runner-playwright": "0.9.0", "@webcomponents/webcomponentsjs": "^2.5.0", "babel-loader": "^8.2.1", "core-js": "^3.7.0", @@ -172,7 +175,7 @@ }, "husky": { "hooks": { - "pre-commit": "npm run prettier:check && npm run lint" + "pre-commit": "npm run prettier:check" } }, "resolutions": { diff --git a/packages/mgt-components/src/components/components.ts b/packages/mgt-components/src/components/components.ts index 9d73324bbf..7a6faef523 100644 --- a/packages/mgt-components/src/components/components.ts +++ b/packages/mgt-components/src/components/components.ts @@ -25,9 +25,9 @@ import './mgt-messages/mgt-messages'; import './mgt-organization/mgt-organization'; import './mgt-profile/mgt-profile'; import './mgt-theme-toggle/mgt-theme-toggle'; -import './mgt-search-results/mgt-search-results'; -import './mgt-search-verticals/mgt-search-verticals'; -import './mgt-search-filters/mgt-search-filters'; +import './preview/mgt-search-results/mgt-search-results'; +import './preview/mgt-search-verticals/mgt-search-verticals'; +import './preview/mgt-search-filters/mgt-search-filters'; export * from './mgt-agenda/mgt-agenda'; export * from './mgt-file/mgt-file'; @@ -50,6 +50,6 @@ export * from './mgt-messages/mgt-messages'; export * from './mgt-organization/mgt-organization'; export * from './mgt-profile/mgt-profile'; export * from './mgt-theme-toggle/mgt-theme-toggle'; -export * from './mgt-search-results/mgt-search-results'; -export * from './mgt-search-verticals/mgt-search-verticals'; -export * from './mgt-search-filters/mgt-search-filters'; +export * from './preview/mgt-search-results/mgt-search-results'; +export * from './preview/mgt-search-verticals/mgt-search-verticals'; +export * from './preview/mgt-search-filters/mgt-search-filters'; diff --git a/packages/mgt-components/src/components/mgt-search-results/mgt-search-results.ts b/packages/mgt-components/src/components/mgt-search-results/mgt-search-results.ts deleted file mode 100644 index 935c6a85ed..0000000000 --- a/packages/mgt-components/src/components/mgt-search-results/mgt-search-results.ts +++ /dev/null @@ -1,932 +0,0 @@ -import { - LocalizationHelper, - Providers, - ProviderState, - MgtConnectableComponent, - BuiltinFilterTemplates, - BuiltinTokenNames, - DateHelper, - EntityType, - FilterSortDirection, - FilterSortType, - IDataSourceData, - ILocalizedString, - IMicrosoftSearchQuery, - IMicrosoftSearchService, - ISearchFiltersEventData, - ISearchInputEventData, - ISearchRequestAggregation, - ISearchResultsEventData, - ISearchSortEventData, - ISearchSortProperty, - ISearchVerticalEventData, - ISortFieldConfiguration, - ITemplateService, - ITokenService, - MicrosoftSearchService, - SearchAggregationSortBy, - SearchResultsHelper, - SortFieldDirection, - TemplateService, - TokenService, - UrlHelper, - DataFilterHelper -} from '@microsoft/mgt-element'; -import { css, customElement, html, property, PropertyValues, state } from 'lit-element'; -import { isEmpty } from 'lodash-es'; -import { unsafeHTML } from 'lit-html/directives/unsafe-html'; -import { repeat } from 'lit-html/directives/repeat'; -import { MgtSearchResultsStrings as strings } from './loc/strings.default'; -import { nothing } from 'lit-html'; -import { styles as tailwindStyles } from '../../styles/tailwind-styles-css'; -import { EventConstants } from '@microsoft/mgt-element'; - -@customElement('mgt-search-results') -export class MgtSearchResultsComponent extends MgtConnectableComponent { - //#region Attributes - - /** - * Flag indicating if the beta endpoint for Microsoft Graph API should be used - */ - @property({ type: Boolean, attribute: 'use-beta' }) - useBetaEndpoint = false; - - /** - * The Microsoft Search entity types to query - */ - @property({ - type: String, - attribute: 'entity-types', - converter: { - fromAttribute: value => { - return value.split(',') as EntityType[]; - } - } - }) - entityTypes: EntityType[] = [EntityType.ListItem]; - - /** - * The default query text to apply. - * Query string parameter and search box have priority over this value during first load - */ - @property({ type: String, attribute: 'query-text' }) - defaultQueryText: string; - - /** - * The search query template to use. Support tokens https://learn.microsoft.com/en-us/graph/search-concept-query-template - */ - @property({ type: String, attribute: 'query-template' }) - queryTemplate: string; - - /** - * If specified, get the default query text from this query string parameter name - */ - @property({ type: String, attribute: 'default-query-string-parameter' }) - defaultQueryStringParameter: string; - - /** - * Search managed properties to retrieve for results and usable in the results template. - * Comma separated. Refer to the [Microsoft Search API documentation](https://learn.microsoft.com/en-us/graph/api/resources/search-api-overview?view=graph-rest-1.0&preserve-view=true#scope-search-based-on-entity-types) to know what properties can be used according to entity types. - */ - @property({ - type: Array, - attribute: 'fields', - converter: { - fromAttribute: value => { - return value.split(','); - } - } - }) - selectedFields: string[] = [ - 'name', - 'title', - 'summary', - 'created', - 'createdBy', - 'filetype', - 'defaultEncodingURL', - 'lastModifiedTime', - 'modifiedBy', - 'path', - 'hitHighlightedSummary', - 'SPSiteURL', - 'SiteTitle' - ]; - - /** - * Sort properties for the request - */ - @property({ - type: String, - attribute: 'sort-properties', - converter: { - fromAttribute: value => { - try { - return JSON.parse(value); - } catch { - return null; - } - } - } - }) - sortFieldsConfiguration: ISortFieldConfiguration[] = []; - - /** - * Flag indicating if the pagniation control should be displayed - */ - @property({ type: Boolean, attribute: 'show-paging' }) - showPaging: boolean; - - /** - * The number of results to show per results page - */ - @property({ type: Number, attribute: 'page-size' }) - pageSize = 10; - - /** - * The number of pages to display in the pagination control - */ - @property({ type: Number, attribute: 'pages-number' }) - numberOfPagesToDisplay = 5; - - /** - * Flag indicating if Micrsoft Search result types should be applied in results - */ - @property({ type: Boolean, attribute: 'enable-result-types' }) - enableResultTypes: boolean; - - /** - * If "entityTypes" contains "externalItem", specify the connection id of the external source - */ - @property({ - type: String, - attribute: 'connections', - converter: { - fromAttribute: value => { - return value.split(',').map(v => `/external/connections/${v}`) as string[]; - } - } - }) - connectionIds: string[]; - - /** - * Indicates whether spelling modifications are enabled. If enabled, the user will get the search results for the corrected query in case of no results for the original query with typos. - */ - @property({ type: Boolean, attribute: 'enable-modification' }) - enableModification = false; - - /** - * Indicates whether spelling suggestions are enabled. If enabled, the user will get the search results for the original search query and suggestions for spelling correction - */ - @property({ type: Boolean, attribute: 'enable-suggestion' }) - enableSuggestion = false; - - /** - * If specified, shows the title on top of the results - */ - @property({ - type: String, - attribute: 'comp-title', - converter: { - fromAttribute: value => { - try { - return JSON.parse(value); - } catch { - return value; - } - } - } - }) - componentTitle: string | ILocalizedString; - - /** - * If specified, shows a "See all" link at top top of the results - */ - @property({ type: String, attribute: 'see-all-link' }) - seeAllLink: string; - - /** - * If specified, show the results count at the top of the results - */ - @property({ type: Boolean, attribute: 'show-count' }) - showCount: boolean; - - /** - * The search filters component ID if connected to a search filters - */ - @property({ type: String, attribute: 'search-filters-id' }) - searchFiltersComponentId: string; - - /** - * The search input component ID if connected to a search input - */ - @property({ type: String, attribute: 'search-input-id' }) - searchInputComponentId: string; - - /** - * The search verticals component ID if connected to a search verticals - */ - @property({ type: String, attribute: 'search-verticals-id' }) - searchVerticalsComponentId: string; - - /** - * The search sort component ID if connected to a search sort component - */ - @property({ type: String, attribute: 'search-sort-id' }) - searchSortComponentId: string; - - /** - * If connected to a search verticals component on the same page, determines on which keys this component should be displayed - */ - @property({ - type: Array, - attribute: 'verticals-keys', - converter: { - fromAttribute: value => { - return value.split(','); - } - } - }) - selectedVerticalKeys: string[]; - - /** - * Flag indicating if the loading indication (spinner/shimmers) should be displayed when fectching the data - */ - @property({ type: Boolean, attribute: 'no-loading' }) - noLoadingIndicator: boolean; - - //#endregion - - //#region State properties - - @state() - data: IDataSourceData = { items: [] }; - - @state() - isLoading = true; - - @state() - shouldRender: boolean; - - @state() - error: Error = null; - - //#endregion - - //#region Class properties - public declare searchQuery: IMicrosoftSearchQuery; - public declare msSearchService: IMicrosoftSearchService; - private declare templateService: ITemplateService; - private declare tokenService: ITokenService; - private declare dateHelper: DateHelper; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private declare dayJs: any; - private declare currentLanguage: string; - declare sortProperties: ISearchSortProperty[]; - //#endregion - - //#region MGT/Lit Lifecycle methods - - constructor() { - super(); - this.msSearchService = new MicrosoftSearchService(); - this.templateService = new TemplateService(); - this.tokenService = new TokenService(); - - this.dateHelper = new DateHelper(LocalizationHelper.strings?.language); - - this.searchQuery = { - requests: [] - }; - - this.addEventListener('templateRendered', (e: CustomEvent) => { - const element = e.detail.element as HTMLElement; - - if (this.enableResultTypes) { - // Process result types and replace part of HTML with item id - /*const newElement = this.templateService.processResultTypesFromHtml(this.data, element, this.getTheme()); - element.replaceWith(newElement);*/ - } - }); - - this.handleSearchVertical = this.handleSearchVertical.bind(this); - this.handleSearchFilters = this.handleSearchFilters.bind(this); - this.handleSearchInput = this.handleSearchInput.bind(this); - this.handleSearchSort = this.handleSearchSort.bind(this); - - this.goToPage = this.goToPage.bind(this); - } - - public render() { - if (this.shouldRender) { - let renderHeader; - let renderItems; - let renderOverlay; - let renderPagination; - - // Render shimmers - if (this.hasTemplate('shimmers') && !this.noLoadingIndicator && !this.renderedOnce) { - renderItems = this.renderTemplate('shimmers', { items: Array(this.pageSize) }); - } else { - // Render loading overlay - if (this.isLoading && !this.noLoadingIndicator) { - renderOverlay = html` -
-
- - - - - -
-
- `; - } - } - - // Render error - if (this.error) { - return html``; - } - - // Render header - if (this.componentTitle || this.seeAllLink || this.showCount) { - renderHeader = html` -
-
- ${ - this.componentTitle - ? html` -
${this.getLocalizedString( - this.componentTitle - )}
- ` - : null - } - ${ - this.showCount && !this.isLoading - ? html` -
${this.data.totalCount} ${strings.results}
- ` - : null - } -
- ${ - this.seeAllLink && this.data.totalCount > 0 - ? html` - - ` - : null - } -
- `; - } - - if (this.renderedOnce) { - // Render items - if (this.hasTemplate('items')) { - renderItems = this.renderTemplate('items', this.data); - } else { - // Default template for all items - renderItems = html` - - `; - } - - // Render pagination - if (this.showPaging && this.data.items.length > 0) { - renderPagination = html` - - `; - } - } - - return html` - ${renderHeader} -
- ${renderOverlay} - ${renderItems} - ${renderPagination} -
- `; - } - - return nothing; - } - - public async connectedCallback(): Promise { - // 'setTimeout' is used here to make sure the initialization logic for the search results components occurs after other component initialization routine. - // This way, we ensure other component properties will be accessible. - // connectedCallback events on other components will execute before according to the JS event loop - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop - setTimeout(async () => { - this.msSearchService.useBetaEndPoint = this.useBetaEndpoint; - this.dayJs = await this.dateHelper.dayJs(); - - // Bind connected components - const bindings = [ - { - id: this.searchVerticalsComponentId, - eventName: EventConstants.SEARCH_VERTICAL_EVENT, - callbackFunction: this.handleSearchVertical - }, - { - id: this.searchFiltersComponentId, - eventName: EventConstants.SEARCH_FILTER_EVENT, - callbackFunction: this.handleSearchFilters - }, - { - id: this.searchInputComponentId, - eventName: EventConstants.SEARCH_INPUT_EVENT, - callbackFunction: this.handleSearchInput - }, - { - id: this.searchSortComponentId, - eventName: EventConstants.SEARCH_SORT_EVENT, - callbackFunction: this.handleSearchSort - } - ]; - - this.bindComponents(bindings); - - if (this.enableResultTypes) { - // Only load adaptive cards bundle if result types are enabled for performance purpose - await this.templateService.loadAdaptiveCardsResources(); - } - - if (this.searchVerticalsComponentId) { - // Check if the current component should be displayed at first - const verticalsComponent = document.getElementById(this.searchVerticalsComponentId) as any; // MgtSearchVerticalsComponent; - if (verticalsComponent) { - // Reead the default value directly from the attribute - const selectedVerticalKey = verticalsComponent.selectedVerticalKey; - if (selectedVerticalKey) { - this.shouldRender = this.selectedVerticalKeys.indexOf(selectedVerticalKey) !== -1; - } - } - } else { - this.shouldRender = true; - } - - // Set default sort properties according to configuration - this.initSortProperties(); - - // Build the search query - this.buildSearchQuery(); - - // Set tokens - this.tokenService.setTokenValue(BuiltinTokenNames.searchTerms, this.getDefaultQueryText()); - - return super.connectedCallback(); - }); - } - - public disconnectedCallback(): void { - super.disconnectedCallback(); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public updated(changedProperties: PropertyValues): void { - // Process result types on default Lit template of this component - if (this.enableResultTypes && !this.hasTemplate('items')) { - this.templateService.processResultTypesFromHtml(this.data, this.renderRoot as HTMLElement); - } - - // Properties trigerring a new search - // Mainly use for Storybook demo scenario - if ( - changedProperties.get('defaultQueryText') || - changedProperties.get('selectedFields') || - changedProperties.get('pageSize') || - changedProperties.get('entityTypes') || - changedProperties.get('enableResultTypes') || - changedProperties.get('connectionIds') || - changedProperties.get('numberOfPagesToDisplay') - ) { - // Update the search query - this.buildSearchQuery(); - this._search(this.searchQuery); - } - - this.currentLanguage = LocalizationHelper.strings?.language; - } - - /** - * Only calls when the provider is in ProviderState.SignedIn state - * @returns - */ - public async loadState(): Promise { - if (this.shouldRender && this.getDefaultQueryText()) { - await this._search(this.searchQuery); - } else { - this.isLoading = false; - } - } - - //#endregion - - //#region Static properties accessors - static get styles() { - return [ - css` - :host { - - .itemInfo + .itemInfo::before { - content: " • "; - font-size: 18px; - line-height: 1; - transform: translateY(2px); - display: inline-block; - margin: 0 5px; - } - - .itemInfo + .itemInfo::after { - content: " • "; - font-size: 18px; - line-height: 1; - transform: translateY(2px); - display: inline-block; - margin: 0 5px; - } - } - `, - tailwindStyles - ]; - } - - protected get strings() { - return strings; - } - - //#endregion - - //#region Data related methods - - private async _search(searchQuery: IMicrosoftSearchQuery): Promise { - const provider = Providers.globalProvider; - if (!provider || provider.state !== ProviderState.SignedIn) { - return; - } - - try { - // Reset error - this.error = null; - - this.isLoading = true; - const queryLanguage = LocalizationHelper.strings?.language; - - const results = await this.msSearchService.search(searchQuery, queryLanguage); - this.data = results; - - // Enhance results - this.data.items = SearchResultsHelper.enhanceResults(this.data.items); - this.isLoading = false; - - this.renderedOnce = true; - - // Notify subscribers new filters are available - this.fireCustomEvent(EventConstants.SEARCH_RESULTS_EVENT, { - availableFilters: results.filters, - sortFieldsConfiguration: this.sortFieldsConfiguration.filter(s => s.isUserSort), - submittedQueryText: this.searchQuery.requests[0].query.queryString, - resultsCount: results.totalCount, - queryAlterationResponse: results.queryAlterationResponse, - from: this.searchQuery.requests[0].from - } as ISearchResultsEventData); - } catch (error) { - this.error = error; - } - } - - private buildAggregationsFromFiltersConfig(): ISearchRequestAggregation[] { - let aggregations: ISearchRequestAggregation[] = []; - const filterComponent = document.getElementById(this.searchFiltersComponentId) as any; //MgtSearchFiltersComponent; - if (filterComponent && filterComponent.filterConfiguration) { - // Build aggregations from filters configuration (i.e. refiners) - aggregations = filterComponent.filterConfiguration.map(filterConfiguration => { - const aggregation: ISearchRequestAggregation = { - field: filterConfiguration.filterName, - bucketDefinition: { - isDescending: filterConfiguration.sortDirection === FilterSortDirection.Ascending ? false : true, - minimumCount: 0, - sortBy: - filterConfiguration.sortBy === FilterSortType.ByCount - ? SearchAggregationSortBy.Count - : SearchAggregationSortBy.KeyAsString - }, - size: filterConfiguration && filterConfiguration.maxBuckets ? filterConfiguration.maxBuckets : 10 - }; - - if (filterConfiguration.template === BuiltinFilterTemplates.Date) { - const pastYear = this.dayJs(new Date()).subtract(1, 'years').subtract(1, 'minutes').toISOString(); - const past3Months = this.dayJs(new Date()).subtract(3, 'months').subtract(1, 'minutes').toISOString(); - const pastMonth = this.dayJs(new Date()).subtract(1, 'months').subtract(1, 'minutes').toISOString(); - const pastWeek = this.dayJs(new Date()).subtract(1, 'week').subtract(1, 'minutes').toISOString(); - const past24hours = this.dayJs(new Date()).subtract(24, 'hours').subtract(1, 'minutes').toISOString(); - const today = new Date().toISOString(); - - aggregation.bucketDefinition.ranges = [ - { - to: pastYear - }, - { - from: pastYear, - to: today - }, - { - from: past3Months, - to: today - }, - { - from: pastMonth, - to: today - }, - { - from: pastWeek, - to: today - }, - { - from: past24hours, - to: today - }, - { - from: today - } - ]; - } - - return aggregation; - }); - } - - return aggregations; - } - - /** - * Builds the search query according to the current componetn parameters and context - */ - private buildSearchQuery() { - // Build base search query from parameters - this.searchQuery = { - requests: [ - { - entityTypes: this.entityTypes, - contentSources: this.connectionIds, - fields: this.selectedFields, - query: { - queryString: this.getDefaultQueryText(), - queryTemplate: this.queryTemplate - }, - from: 0, - size: this.pageSize, - queryAlterationOptions: { - enableModification: this.enableModification, - enableSuggestion: this.enableSuggestion - }, - resultTemplateOptions: { - enableResultTemplate: this.enableResultTypes - } - } - ] - }; - - // Sort properties - if (this.sortProperties && this.sortProperties.length > 0) { - this.searchQuery.requests[0].sortProperties = this.sortProperties; - } - - // If a filter component is connected, get the configuration directly from connected component - if (this.searchFiltersComponentId) { - this.searchQuery.requests[0].aggregations = this.buildAggregationsFromFiltersConfig(); - } - } - - //#endregion - - //#region Event handlers from connected components - - private async handleSearchFilters(e: CustomEvent): Promise { - if (this.shouldRender) { - let aggregationFilters: string[] = []; - - const selectedFilters = e.detail.selectedFilters; - - // Build aggregation filters - if (selectedFilters.some(f => f.values.length > 0)) { - // Bind to current context to be able to refernce "dayJs" - const buildFqlRefinementString = DataFilterHelper.buildFqlRefinementString.bind(this); - - // Make sure, if we have multiple filters, at least two filters have values to avoid apply an operator ("or","and") on only one condition failing the query. - if ( - selectedFilters.length > 1 && - selectedFilters.filter(selectedFilter => selectedFilter.values.length > 0).length > 1 - ) { - const refinementString = buildFqlRefinementString(selectedFilters).join(','); - if (!isEmpty(refinementString)) { - aggregationFilters = aggregationFilters.concat([`${e.detail.filterOperator}(${refinementString})`]); - } - } else { - aggregationFilters = aggregationFilters.concat(buildFqlRefinementString(selectedFilters)); - } - } else { - delete this.searchQuery.requests[0].aggregationFilters; - } - - if (aggregationFilters.length > 0) { - this.searchQuery.requests[0].aggregationFilters = aggregationFilters; - } - - this.resetPagination(); - - await this._search(this.searchQuery); - } - } - - private async handleSearchInput(e: CustomEvent): Promise { - if (this.shouldRender) { - // Remove any query string parameter if used as default - if (this.defaultQueryStringParameter) { - const url = UrlHelper.removeQueryStringParam(this.defaultQueryStringParameter, window.location.href); - if (url !== window.location.href) { - window.history.pushState({}, '', url); - } - } - - // If empty keywords, reset to the default state - const searchKeywords = !isEmpty(e.detail.keywords) ? e.detail.keywords : this.getDefaultQueryText(); - - if (searchKeywords && searchKeywords !== this.searchQuery.requests[0].query.queryString) { - // Update token - this.tokenService.setTokenValue(BuiltinTokenNames.searchTerms, searchKeywords); - - this.searchQuery.requests[0].query.queryString = searchKeywords; - - this.resetFilters(); - this.resetPagination(); - - await this._search(this.searchQuery); - } - } - } - - private async handleSearchVertical(e: CustomEvent): Promise { - this.shouldRender = this.selectedVerticalKeys.indexOf(e.detail.selectedVertical.key) !== -1; - - if (this.shouldRender) { - // Reinitialize search context - this.resetQueryText(); - this.resetFilters(); - this.resetPagination(); - this.initSortProperties(); - - // Update the query when the new tab is selected - await this._search(this.searchQuery); - } else { - // If a query is currently performed, we cancel it to avoid new filters getting populated once one an other tab - if (this.isLoading) { - this.msSearchService.abortRequest(); - } - - // Reset available filters for connected search filter components - this.fireCustomEvent(EventConstants.SEARCH_RESULTS_EVENT, { - availableFilters: [] - } as ISearchResultsEventData); - } - } - - private async handleSearchSort(e: CustomEvent): Promise { - if (this.shouldRender) { - this.sortProperties = e.detail.sortProperties; - - this.buildSearchQuery(); - - // Update the query when new sort is defined - await this._search(this.searchQuery); - } - } - - //#endregion - - //#region Utility methods - - private getDefaultQueryText(): string { - // 1) Look connected search box if any - const inputComponent = document.getElementById(this.searchInputComponentId) as any; // MgtSearchInputComponent; - if (inputComponent && inputComponent.searchKeywords) { - return inputComponent.searchKeywords; - } - - // 2) Look query string parameters if any - if ( - this.defaultQueryStringParameter && - !isEmpty(UrlHelper.getQueryStringParam(this.defaultQueryStringParameter, window.location.href)) - ) { - return UrlHelper.getQueryStringParam(this.defaultQueryStringParameter, window.location.href); - } - - // 3) Look default hard coded value if any - if (this.defaultQueryText) { - return this.defaultQueryText; - } - } - - private goToPage(pageNumber: number) { - if (pageNumber > 0) { - // "-1" is to calculate the correct index. Ex page "1" with page size "10" means items from start index 0 to index 10. - this.searchQuery.requests[0].from = (pageNumber - 1) * this.pageSize; - this._search(this.searchQuery); - } - } - - private resetPagination() { - // Reset to first page - /* this.searchQuery.requests[0].from = 0; - const paginationComponent = this.renderRoot.querySelector(`[data-tag-name='${ComponentElements.MgtPaginationElement}']`); - if (paginationComponent) { - paginationComponent.initPagination(); - }*/ - } - - private resetFilters() { - // Reset existing filters if any selected - /* if (this.searchFiltersComponentId) { - const filterComponent = document.getElementById(this.searchFiltersComponentId) as MgtSearchFiltersComponent; - if (filterComponent) { - filterComponent.clearAllSelectedValues(true); - } - } - - delete this.searchQuery.requests[0].aggregationFilters;*/ - } - - private initSortProperties() { - this.sortProperties = this.sortFieldsConfiguration - .filter(s => s.isDefaultSort) - .map(s => { - return { - isDescending: s.sortDirection === SortFieldDirection.Descending, - name: s.sortField - }; - }); - } - - private resetQueryText() { - const queryText = this.getDefaultQueryText(); - this.searchQuery.requests[0].query.queryString = queryText; - } - //#endregion -} diff --git a/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.scss b/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.scss deleted file mode 100644 index 03d3bf166d..0000000000 --- a/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../../../node_modules/office-ui-fabric-core/dist/sass/References'; diff --git a/packages/mgt-components/src/components/preview/index.ts b/packages/mgt-components/src/components/preview/index.ts index 2e7b75dd36..ae7bb347dd 100644 --- a/packages/mgt-components/src/components/preview/index.ts +++ b/packages/mgt-components/src/components/preview/index.ts @@ -1,2 +1,6 @@ export * from './mgt-search-box/mgt-search-box'; +//export * from './mgt-search-results-old/mgt-search-results'; export * from './mgt-search-results/mgt-search-results'; +export * from './mgt-search-filters/mgt-search-filters'; +export * from './mgt-search-verticals/mgt-search-verticals'; +export { IMicrosoftSearchQuery, IMicrosoftSearchService } from '@microsoft/mgt-element'; diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-base-filter.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts similarity index 97% rename from packages/mgt-components/src/components/mgt-search-filters/mgt-base-filter.ts rename to packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts index f1fbab26ab..d6f8bdb062 100644 --- a/packages/mgt-components/src/components/mgt-search-filters/mgt-base-filter.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts @@ -1,10 +1,11 @@ import { MgtConnectableComponent } from '@microsoft/mgt-element'; -import { property, state, html, PropertyValues, TemplateResult } from 'lit-element'; +import { html, PropertyValues, TemplateResult } from 'lit'; +import { state, property } from 'lit/decorators.js'; import { isEqual, cloneDeep, sumBy, orderBy } from 'lodash-es'; import { IDataFilterResult, IDataFilterValue, IDataFilterResultValue } from '@microsoft/mgt-element'; import { IDataFilterConfiguration, FilterSortType, FilterSortDirection } from '@microsoft/mgt-element'; import { fluentSelect, fluentOption, provideFluentDesignSystem, fluentListbox } from '@fluentui/web-components'; -import { styles as tailwindStyles } from '../../styles/tailwind-styles-css'; +import { styles as tailwindStyles } from '../../../styles/tailwind-styles-css'; export enum DateFilterKeys { From = 'from', diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts similarity index 98% rename from packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts rename to packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts index 3ea408325e..9dfd87dc19 100644 --- a/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts @@ -1,10 +1,11 @@ -import { state, html, PropertyValues, customElement } from 'lit-element'; +import { html, PropertyValues } from 'lit'; import { cloneDeep } from 'lodash-es'; -import { repeat } from 'lit-html/directives/repeat.js'; -import { unsafeHTML } from 'lit-html/directives/unsafe-html.js'; +import { repeat } from 'lit/directives/repeat.js'; +import { unsafeHTML } from 'lit/directives/unsafe-html.js'; import { strings } from './strings'; import { MgtBaseFilterComponent } from '../mgt-base-filter'; import { IDataFilterResultValue, IDataFilterAggregation } from '@microsoft/mgt-element'; +import { state } from 'lit/decorators.js'; export class MgtCheckboxFilterComponent extends MgtBaseFilterComponent { @state() diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/strings.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/strings.ts similarity index 100% rename from packages/mgt-components/src/components/mgt-search-filters/mgt-checkbox-filter/strings.ts rename to packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/strings.ts diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts similarity index 99% rename from packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts rename to packages/mgt-components/src/components/preview/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts index 4b13f91660..9cf5cd0af2 100644 --- a/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-date-filter/mgt-date-filter.ts @@ -1,6 +1,5 @@ import { DateHelper, FilterComparisonOperator, IDataFilterValue, LocalizationHelper } from '@microsoft/mgt-element'; -import { customElement, html, PropertyValues } from 'lit-element'; -import { nothing } from 'lit-html'; +import { html, PropertyValues, nothing } from 'lit'; import { MgtBaseFilterComponent, DateFilterKeys } from '../mgt-base-filter'; import { strings } from './strings'; diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/strings.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-date-filter/strings.ts similarity index 100% rename from packages/mgt-components/src/components/mgt-search-filters/mgt-date-filter/strings.ts rename to packages/mgt-components/src/components/preview/mgt-search-filters/mgt-date-filter/strings.ts diff --git a/packages/mgt-components/src/components/mgt-search-filters/mgt-search-filters.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts similarity index 98% rename from packages/mgt-components/src/components/mgt-search-filters/mgt-search-filters.ts rename to packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts index 501ba17a9a..b315527ea3 100644 --- a/packages/mgt-components/src/components/mgt-search-filters/mgt-search-filters.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-classes-per-file */ import { BuiltinFilterTemplates, EventConstants, @@ -14,22 +15,22 @@ import { ISearchSortEventData, ISearchSortProperty, MgtConnectableComponent, - MgtTemplatedComponent + customElement } from '@microsoft/mgt-element'; -import { customElement, property, state, html } from 'lit-element'; import { isEmpty, cloneDeep, sortBy } from 'lodash-es'; -import { nothing } from 'lit-html'; -import { repeat } from 'lit-html/directives/repeat.js'; import { strings } from './strings'; -import { styles as tailwindStyles } from '../../styles/tailwind-styles-css'; +import { styles as tailwindStyles } from '../../../styles/tailwind-styles-css'; import { MgtBaseFilterComponent } from './mgt-base-filter'; import { ScopedElementsMixin } from '@open-wc/scoped-elements'; import { MgtCheckboxFilterComponent } from './mgt-checkbox-filter/mgt-checkbox-filter'; import { MgtDateFilterComponent } from './mgt-date-filter/mgt-date-filter'; +import { property, state } from 'lit/decorators.js'; +import { nothing, html } from 'lit'; +import { repeat } from 'lit/directives/repeat.js'; export class MgtSearchFiltersComponentBase extends MgtConnectableComponent {} -@customElement('mgt-search-filters') +@customElement('search-filters') export class MgtSearchFiltersComponent extends ScopedElementsMixin(MgtSearchFiltersComponentBase) { /** * The connected search results component ids diff --git a/packages/mgt-components/src/components/mgt-search-filters/strings.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/strings.ts similarity index 100% rename from packages/mgt-components/src/components/mgt-search-filters/strings.ts rename to packages/mgt-components/src/components/preview/mgt-search-filters/strings.ts diff --git a/packages/mgt-components/src/components/preview/mgt-search-results/mgt-search-results.scss b/packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.scss similarity index 100% rename from packages/mgt-components/src/components/preview/mgt-search-results/mgt-search-results.scss rename to packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.scss diff --git a/packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.ts b/packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.ts new file mode 100644 index 0000000000..c77020e152 --- /dev/null +++ b/packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.ts @@ -0,0 +1,1280 @@ +/** + * ------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. + * See License in the project root for license information. + * ------------------------------------------------------------------------------------------- + */ + +import { html, HTMLTemplateResult, nothing, TemplateResult } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { + CacheService, + CacheStore, + equals, + MgtTemplatedComponent, + prepScopes, + Providers, + ProviderState, + customElement, + mgtHtml, + BetaGraph, + BatchResponse, + CollectionResponse +} from '@microsoft/mgt-element'; + +import { schemas } from '../../../graph/cacheStores'; +import { strings } from './strings'; +import { styles } from './mgt-search-results-css'; +import { + DirectoryObject, + Drive, + DriveItem, + EntityType, + List, + ListItem, + Message, + SearchHit, + SearchHitsContainer, + SearchRequest, + SearchResponse, + Site +} from '@microsoft/microsoft-graph-types'; +import { SearchRequest as BetaSearchRequest } from '@microsoft/microsoft-graph-types-beta'; +import { + getIsResponseCacheEnabled, + getNameFromUrl, + getRelativeDisplayDate, + getResponseInvalidationTime, + sanitizeSummary, + trimFileExtension +} from '../../../utils/Utils'; +import { getSvg, SvgIcon } from '../../../utils/SvgHelper'; +import { fluentSkeleton, fluentButton, fluentTooltip, fluentDivider } from '@fluentui/web-components'; +import { registerFluentComponents } from '../../../utils/FluentComponents'; +import { CacheResponse } from '../../CacheResponse'; + +registerFluentComponents(fluentSkeleton, fluentButton, fluentTooltip, fluentDivider); + +/** + * Object representing a thumbnail + */ +interface Thumbnail { + /** + * The url of the Thumbnail + */ + url?: string; +} + +/** + * Object representing a Binary Thumbnail + */ +interface BinaryThumbnail { + /** + * The url of the Thumbnail + */ + url?: string; + + /** + * The web Url of the Thumbnail + */ + thumbnailWebUrl?: string; +} + +/** + * Object representing a Search Answer + */ +type Answer = { + '@odata.type': string; + displayName?: string; + description?: string; + webUrl?: string; +}; + +/** + * Object representing a search resource supporting thumbnails + */ +type ThumbnailResource = { + thumbnail: Thumbnail; +}; + +type UserResource = { + lastModifiedBy?: { + user?: { + email?: string; + }; + }; + userPrincipalName?: string; +}; + +/** + * Object representing a Search Resource + */ +type SearchResource = Partial< + DriveItem & Site & List & Message & ListItem & Drive & DirectoryObject & Answer & ThumbnailResource & UserResource +>; + +/** + * Object representing a full Search Response + */ +type SearchResponseCollection = CollectionResponse; + +/** + * **Preview component** Custom element for making Microsoft Graph get queries. + * Component may change before general availability release. + * + * @fires {CustomEvent} dataChange - Fired when data changes + * + * @cssprop --answer-border-radius - {Length} Border radius of an answer + * @cssprop --answer-box-shadow - {Length} Box shadow of an answer + * @cssprop --answer-border - {Length} Border of an answer + * @cssprop --answer-padding - {Length} Padding of an answer + * + * @class mgt-search-results + * @extends {MgtTemplatedComponent} + */ +@customElement('search-results') +export class MgtSearchResults extends MgtTemplatedComponent { + /** + * Default page size is 10 + */ + private _size = 10; + + /** + * Array of styles to apply to the element. The styles should be defined + * user the `css` tag function. + */ + static get styles() { + return styles; + } + + /** + * Gets all the localization strings for the component + */ + protected get strings() { + return strings; + } + + private _queryString: string; + + /** + * The query to send to Microsoft Search + * + * @type {string} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'query-string', + type: String + }) + public get queryString(): string { + return this._queryString; + } + public set queryString(value: string) { + if (this._queryString !== value) { + this._queryString = value; + this._currentPage = 1; + this.setLoadingState(true); + void this.requestStateUpdate(true); + } + } + + /** + * Query template to use in complex search scenarios + * Query Templates are currently supported only on the beta endpoint + */ + @property({ + attribute: 'query-template', + type: String + }) + public queryTemplate: string; + + /** + * One or more types of resources expected in the response. + * Possible values are: list, site, listItem, message, event, + * drive, driveItem, externalItem. + * + * @type {string[]} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'entity-types', + converter: value => { + return value.split(',').map(v => v.trim()); + }, + type: String + }) + public entityTypes: string[] = ['driveItem', 'listItem', 'site']; + + /** + * The scopes to request + * + * @type {string[]} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'scopes', + converter: (value, type) => { + return value ? value.toLowerCase().split(',') : null; + } + }) + public scopes: string[] = []; + + /** + * Content sources to use with External Items + * + * @type {string[]} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'content-sources', + converter: (value, type) => { + return value ? value.toLowerCase().split(',') : null; + } + }) + public contentSources: string[] = []; + + /** + * Api version to use for request + * + * @type {string} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'version', + reflect: true, + type: String + }) + public version = 'v1.0'; + + /** + * Specifies the offset for the search results. + * Offset 0 returns the very first result. + * + * @type {number} + * @memberof MgtSearchResults + */ + public get from(): number { + return (this.currentPage - 1) * this.size; + } + + /** + * The size of the page to be retrieved. + * The maximum value is 1000. + * + * @type {number} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'size', + reflect: true, + type: Number + }) + public get size(): number { + return this._size; + } + public set size(value) { + if (value > this.maxPageSize) { + this._size = this.maxPageSize; + } else { + this._size = value; + } + } + + /** + * The maximum number of pages to be clickable + * in the paging control + * + * @type {number} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'paging-max', + reflect: true, + type: Number + }) + public pagingMax = 7; + + /** + * Sets whether the result thumbnail should be fetched + * from the Microsoft Graph + * + * @type {boolean} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'fetch-thumbnail', + type: Boolean + }) + public fetchThumbnail: boolean; + + /** + * Contains the fields to be returned for each resource + * + * @type {string[]} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'fields', + converter: value => { + return value.split(',').map(v => v.trim()); + }, + type: String + }) + public fields: string[]; + + /** + * This triggers hybrid sort for messages : the first 3 messages are the most relevant. + * This property is only applicable to entityType=message + * + * @type {boolean} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'enable-top-results', + reflect: true, + type: Boolean + }) + public enableTopResults = false; + + /** + * Enables cache on the response from the specified resource + * default = false + * + * @type {boolean} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'cache-enabled', + reflect: true, + type: Boolean + }) + public cacheEnabled = false; + + /** + * Invalidation period of the cache for the responses in milliseconds + * + * @type {number} + * @memberof MgtSearchResults + */ + @property({ + attribute: 'cache-invalidation-period', + reflect: true, + type: Number + }) + public cacheInvalidationPeriod = 30000; + + /** + * Gets or sets the response of the request + * + * @type any + * @memberof MgtSearchResults + */ + @state() private response: SearchResponseCollection; + + private isRefreshing = false; + private get searchEndpoint() { + return '/search/query'; + } + private get maxPageSize() { + return 1000; + } + private readonly defaultFields: string[] = [ + 'webUrl', + 'lastModifiedBy', + 'lastModifiedDateTime', + 'summary', + 'displayName', + 'name' + ]; + private _currentPage = 1; + @state() + public get currentPage(): number { + return this._currentPage; + } + public set currentPage(value: number) { + if (this._currentPage !== value) { + this._currentPage = value; + void this.requestStateUpdate(true); + } + } + + constructor() { + super(); + console.warn( + '🦒: is a preview component and may change prior to becoming generally available. See more information https://aka.ms/mgt/preview-components' + ); + } + + /** + * Synchronizes property values when attributes change. + * + * @param {string} name + * @param {string} oldValue + * @param {string} newValue + * @memberof MgtSearchResults + */ + public attributeChangedCallback(name: string, oldValue: string, newValue: string) { + super.attributeChangedCallback(name, oldValue, newValue); + void this.requestStateUpdate(); + } + + /** + * Refresh the data + * + * @param {boolean} [hardRefresh=false] + * if false (default), the component will only update if the data changed + * if true, the data will be first cleared and reloaded completely + * @memberof MgtSearchResults + */ + public refresh(hardRefresh = false) { + this.isRefreshing = true; + if (hardRefresh) { + this.clearState(); + } + void this.requestStateUpdate(hardRefresh); + } + + /** + * Clears state of the component + * + * @protected + * @memberof MgtSearchResults + */ + protected clearState(): void { + this.response = null; + } + + /** + * Invoked on each update to perform rendering tasks. This method must return + * a lit-html TemplateResult. Setting properties inside this method will *not* + * trigger the element to update. + */ + protected render(): TemplateResult { + let renderedTemplate: TemplateResult = null; + let headerTemplate: TemplateResult = null; + let footerTemplate: TemplateResult = null; + + if (this.hasTemplate('header')) { + headerTemplate = this.renderTemplate('header', this.response); + } + + footerTemplate = this.renderFooter(this.response?.value[0]?.hitsContainers[0]); + + if (this.isLoadingState) { + renderedTemplate = this.renderLoading(); + } else if (this.error) { + renderedTemplate = this.renderError(); + } else if (this.response && this.hasTemplate('default')) { + renderedTemplate = this.renderTemplate('default', this.response) || html``; + } else if (this.response?.value[0]?.hitsContainers[0]) { + renderedTemplate = html`${this.response?.value[0]?.hitsContainers[0]?.hits?.map(result => + this.renderResult(result) + )}`; + } else if (this.hasTemplate('no-data')) { + renderedTemplate = this.renderTemplate('no-data', null); + } else { + renderedTemplate = html``; + } + + return html` + ${headerTemplate} +
+ ${renderedTemplate} +
+ ${footerTemplate}`; + } + + /** + * load state into the component. + * + * @protected + * @returns + * @memberof MgtSearchResults + */ + protected async loadState() { + const provider = Providers.globalProvider; + + this.error = null; + + if (!provider || provider.state !== ProviderState.SignedIn) { + return; + } + + if (this.queryString) { + try { + const requestOptions = this.getRequestOptions(); + + let cache: CacheStore; + const key = JSON.stringify({ + endpoint: `${this.version}${this.searchEndpoint}`, + requestOptions + }); + let response: SearchResponseCollection = null; + + if (this.shouldRetrieveCache()) { + cache = CacheService.getCache(schemas.search, schemas.search.stores.responses); + const result: CacheResponse = getIsResponseCacheEnabled() ? await cache.getValue(key) : null; + if (result && getResponseInvalidationTime(this.cacheInvalidationPeriod) > Date.now() - result.timeCached) { + response = JSON.parse(result.response) as SearchResponseCollection; + } + } + + if (!response) { + const graph = provider.graph.forComponent(this); + let request = graph.api(this.searchEndpoint).version(this.version); + + if (this.scopes?.length) { + request = request.middlewareOptions(prepScopes(...this.scopes)); + } + + response = (await request.post({ requests: [requestOptions] })) as SearchResponseCollection; + + if (this.fetchThumbnail) { + const thumbnailBatch = graph.createBatch(); + const thumbnailBatchBeta = BetaGraph.fromGraph(graph).createBatch(); + + const hits = + response.value?.length && response.value[0].hitsContainers?.length + ? response.value[0].hitsContainers[0]?.hits ?? [] + : []; + for (const element of hits) { + const resource = element.resource as SearchResource; + if ( + (resource.size > 0 || resource.webUrl?.endsWith('.aspx')) && + (resource['@odata.type'] === '#microsoft.graph.driveItem' || + resource['@odata.type'] === '#microsoft.graph.listItem') + ) { + if (resource['@odata.type'] === '#microsoft.graph.listItem') { + thumbnailBatchBeta.get( + element.hitId.toString(), + `/sites/${resource.parentReference.siteId}/pages/${resource.id}` + ); + } else { + thumbnailBatch.get( + element.hitId.toString(), + `/drives/${resource.parentReference.driveId}/items/${resource.id}/thumbnails/0/medium` + ); + } + } + } + + /** + * Based on the batch response, augment the search result resource with the thumbnail url + * + * @param thumbnailResponse + */ + const augmentResponse = (thumbnailResponse: Map>) => { + if (thumbnailResponse && thumbnailResponse.size > 0) { + for (const [k, value] of thumbnailResponse) { + const result: SearchHit = response.value[0].hitsContainers[0].hits[k] as SearchHit; + const thumbnail: Thumbnail = + result.resource['@odata.type'] === '#microsoft.graph.listItem' + ? { url: value.content.thumbnailWebUrl } + : { url: value.content.url }; + (result.resource as SearchResource).thumbnail = thumbnail; + } + } + }; + + try { + augmentResponse(await thumbnailBatch.executeAll()); + augmentResponse(await thumbnailBatchBeta.executeAll()); + } catch { + // no-op + } + } + + if (this.shouldUpdateCache() && response) { + cache = CacheService.getCache(schemas.search, schemas.search.stores.responses); + await cache.putValue(key, { response: JSON.stringify(response) }); + } + } + + if (!equals(this.response, response)) { + this.response = response; + } + } catch (e: unknown) { + this.error = e as Error; + } + + if (this.response) { + this.error = null; + } + } else { + this.response = null; + } + this.isRefreshing = false; + this.fireCustomEvent('dataChange', { response: this.response, error: this.error as Error }); + } + + /** + * Render the loading state. + * + * @protected + * @returns + * @memberof MgtSearchResults + */ + protected renderLoading(): TemplateResult { + return ( + this.renderTemplate('loading', null) || + // creates an array of n items where n is the current max number of results, this builds a shimmer for that many results + html` + ${[...Array(this.size)].map(() => { + return html` +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+ ${ + this.fetchThumbnail && + html` +
+ +
+ ` + } +
+ +
+ `; + })} + ` + ); + } + + /** + * Render the result item. + * + * @protected + * @returns + * @memberof MgtSearchResults + */ + protected renderResult(result: SearchHit): TemplateResult { + const type = this.getResourceType(result.resource); + if (this.hasTemplate(`result-${type}`)) { + return this.renderTemplate(`result-${type}`, result, result.hitId); + } else { + switch (result.resource['@odata.type']) { + case '#microsoft.graph.driveItem': + return this.renderDriveItem(result); + case '#microsoft.graph.site': + return this.renderSite(result); + case '#microsoft.graph.person': + return this.renderPerson(result); + case '#microsoft.graph.drive': + case '#microsoft.graph.list': + return this.renderList(result); + case '#microsoft.graph.listItem': + return this.renderListItem(result); + case '#microsoft.graph.search.bookmark': + return this.renderBookmark(result); + case '#microsoft.graph.search.acronym': + return this.renderAcronym(result); + case '#microsoft.graph.search.qna': + return this.renderQnA(result); + default: + return this.renderDefault(result); + } + } + } + + /** + * Renders the footer with pages if required + * + * @param hitsContainer Search results + */ + private renderFooter(hitsContainer: SearchHitsContainer) { + if (this.pagingRequired(hitsContainer)) { + const pages = this.getActivePages(hitsContainer.total); + + return html` +
+ ${this.renderPreviousPage()} + ${this.renderFirstPage(pages)} + ${this.renderAllPages(pages)} + ${this.renderNextPage()} +
+ `; + } + } + + /** + * Validates if paging is required based on the provided results + * + * @param hitsContainer + */ + private pagingRequired(hitsContainer: SearchHitsContainer) { + return hitsContainer?.moreResultsAvailable || this.currentPage * this.size < hitsContainer?.total; + } + + /** + * Gets a list of active pages to render for paging purposes + * + * @param totalResults Total number of results of the search query + */ + private getActivePages(totalResults: number) { + const getFirstPage = () => { + const medianPage = this.currentPage - Math.floor(this.pagingMax / 2) - 1; + + if (medianPage >= Math.floor(this.pagingMax / 2)) { + return medianPage; + } else { + return 0; + } + }; + + const pages: number[] = []; + const firstPage = getFirstPage(); + + if (firstPage + 1 > this.pagingMax - this.currentPage || this.pagingMax === this.currentPage) { + for ( + let i = firstPage + 1; + i < Math.ceil(totalResults / this.size) && + i < this.pagingMax + (this.currentPage - 1) && + pages.length < this.pagingMax - 2; + ++i + ) { + pages.push(i + 1); + } + } else { + for (let i = firstPage; i < this.pagingMax; ++i) { + pages.push(i + 1); + } + } + + return pages; + } + + /** + * Renders all sequential pages buttons + * + * @param pages + */ + private renderAllPages(pages: number[]) { + return html` + ${pages.map( + page => + html` + + ${page} + ` + )}`; + } + + /** + * Renders the "First page" button + * + * @param pages + */ + private renderFirstPage(pages: number[]) { + return html` + ${ + pages.some(page => page === 1) + ? nothing + : html` + + 1 + ` + ? html` + + ... + ` + : nothing + }`; + } + + /** + * Constructs the "dot dot dot" button title + */ + private getDotButtonTitle() { + return `${strings.back} ${Math.ceil(this.pagingMax / 2)} ${strings.pages}`; + } + + /** + * Renders the "Previous page" button + */ + private renderPreviousPage() { + return this.currentPage > 1 + ? html` + + ${getSvg(SvgIcon.ChevronLeft)} + ` + : nothing; + } + + /** + * Renders the "Next page" button + */ + private renderNextPage() { + return !this.isLastPage() + ? html` + + ${getSvg(SvgIcon.ChevronRight)} + ` + : nothing; + } + + /** + * Triggers a specific page click + * + * @param pageNumber + */ + private onPageClick(pageNumber: number) { + this.currentPage = pageNumber; + this.scrollToFirstResult(); + } + + /** + * Triggers a first page click + * + */ + private readonly onFirstPageClick = () => { + this.currentPage = 1; + this.scrollToFirstResult(); + }; + + /** + * Triggers a previous page click + */ + private readonly onPageBackClick = () => { + this.currentPage--; + this.scrollToFirstResult(); + }; + + /** + * Triggers a next page click + */ + private readonly onPageNextClick = () => { + this.currentPage++; + this.scrollToFirstResult(); + }; + + /** + * Validates if the current page is the last page of the collection + */ + private isLastPage() { + return this.currentPage === Math.ceil(this.response.value[0].hitsContainers[0].total / this.size); + } + + /** + * Scroll to the top of the search results + */ + private scrollToFirstResult() { + const target = this.renderRoot.querySelector('.search-results'); + target.scrollIntoView({ + block: 'start', + behavior: 'smooth' + }); + } + + /** + * Gets the resource type (entity) of a search result + * + * @param resource + */ + private getResourceType(resource: SearchResource) { + return resource['@odata.type'].split('.').pop(); + } + + /** + * Renders a driveItem entity + * + * @param result + */ + private renderDriveItem(result: SearchHit) { + const resource = result.resource as SearchResource; + return mgtHtml` +
+
+ + +
+
+ +
+
+ + +
+
+   ${strings.modified} ${getRelativeDisplayDate(new Date(resource.lastModifiedDateTime))} +
+
+
+
+ ${ + resource.thumbnail?.url && + html` +
+ ${resource.name} +
` + } + +
+ + `; + } + + /** + * Renders a site entity + * + * @param result + * @returns + */ + private renderSite(result: SearchHit): HTMLTemplateResult { + const resource = result.resource as SearchResource; + return html` +
+
+ ${this.getResourceIcon(resource)} +
+ +
+ + `; + } + + /** + * Renders a list entity + * + * @param result + * @returns + */ + private renderList(result: SearchHit): HTMLTemplateResult { + const resource = result.resource as SearchResource; + return mgtHtml` + + + `; + } + + /** + * Renders a listItem entity + * + * @param result + * @returns + */ + private renderListItem(result: SearchHit): HTMLTemplateResult { + const resource = result.resource as SearchResource; + return mgtHtml` +
+
+ ${resource.webUrl.endsWith('.aspx') ? getSvg(SvgIcon.News) : getSvg(SvgIcon.FileOuter)} +
+
+ +
+
+ + +
+
+   ${strings.modified} ${getRelativeDisplayDate(new Date(resource.lastModifiedDateTime))} +
+
+
+
+ ${ + resource.thumbnail?.url && + html` +
+ ${trimFileExtension(
+            resource.name || getNameFromUrl(resource.webUrl)
+          )} +
` + } +
+ + `; + } + + /** + * Renders a person entity + * + * @param result + * @returns + */ + private renderPerson(result: SearchHit): HTMLTemplateResult { + const resource = result.resource as SearchResource; + return mgtHtml` +
+ + +
+ + `; + } + + /** + * Renders a bookmark entity + * + * @param result + */ + private renderBookmark(result: SearchHit) { + return this.renderAnswer(result, SvgIcon.DoubleBookmark); + } + + /** + * Renders an acronym entity + * + * @param result + */ + private renderAcronym(result: SearchHit) { + return this.renderAnswer(result, SvgIcon.BookOpen); + } + + /** + * Renders a qna entity + * + * @param result + */ + private renderQnA(result: SearchHit) { + return this.renderAnswer(result, SvgIcon.BookQuestion); + } + + /** + * Renders an answer entity + * + * @param result + */ + private renderAnswer(result: SearchHit, icon: SvgIcon) { + const resource = result.resource as SearchResource; + return html` +
+
+ ${getSvg(icon)} +
+
+ +
${resource.description}
+
+
+ + `; + } + + /** + * Renders any entity + * + * @param result + */ + private renderDefault(result: SearchHit) { + const resource = result.resource as SearchResource; + const resourceUrl = this.getResourceUrl(resource); + return html` +
+
+ ${this.getResourceIcon(resource)} +
+
+
+ ${ + resourceUrl + ? html` + ${this.getResourceName(resource)} + ` + : html` + ${this.getResourceName(resource)} + ` + } +
+
+
+
+ + `; + } + + /** + * Gets default resource URLs + * + * @param resource + */ + private getResourceUrl(resource: SearchResource) { + return resource.webUrl || /* resource.url ||*/ resource.webLink || null; + } + + /** + * Gets default resource Names + * + * @param resource + */ + private getResourceName(resource: SearchResource) { + return resource.displayName || resource.subject || trimFileExtension(resource.name); + } + + /** + * Gets default result summary + * + * @param resource + */ + private getResultSummary(result: SearchHit) { + return sanitizeSummary(result.summary || (result.resource as SearchResource)?.description || null); + } + + /** + * Gets default resource icon + * + * @param resource + */ + private getResourceIcon(resource: SearchResource) { + switch (resource['@odata.type']) { + case '#microsoft.graph.site': + return getSvg(SvgIcon.Globe); + case '#microsoft.graph.message': + return getSvg(SvgIcon.Email); + case '#microsoft.graph.event': + return getSvg(SvgIcon.Event); + case 'microsoft.graph.chatMessage': + return getSvg(SvgIcon.SmallChat); + default: + return getSvg(SvgIcon.FileOuter); + } + } + + /** + * Validates if cache should be retrieved + * + * @returns + */ + private shouldRetrieveCache(): boolean { + return getIsResponseCacheEnabled() && this.cacheEnabled && !this.isRefreshing; + } + + /** + * Validates if cache should be updated + * + * @returns + */ + private shouldUpdateCache(): boolean { + return getIsResponseCacheEnabled() && this.cacheEnabled; + } + + /** + * Builds the appropriate RequestOption for the search query + * + * @returns + */ + private getRequestOptions(): SearchRequest | BetaSearchRequest { + const requestOptions: SearchRequest = { + entityTypes: this.entityTypes as EntityType[], + query: { + queryString: this.queryString + }, + from: this.from ? this.from : undefined, + size: this.size ? this.size : undefined, + fields: this.getFields(), + enableTopResults: this.enableTopResults ? this.enableTopResults : undefined + }; + + if (this.entityTypes.includes('externalItem')) { + requestOptions.contentSources = this.contentSources; + } + + if (this.version === 'beta') { + (requestOptions as BetaSearchRequest).query.queryTemplate = this.queryTemplate ? this.queryTemplate : undefined; + } + + return requestOptions; + } + + /** + * Gets the fields and default fields for default render methods + * + * @returns + */ + private getFields(): string[] { + if (this.fields) { + return this.defaultFields.concat(this.fields); + } + + return undefined; + } +} diff --git a/packages/mgt-components/src/components/preview/mgt-search-results/strings.ts b/packages/mgt-components/src/components/preview/mgt-search-results-old/strings.ts similarity index 100% rename from packages/mgt-components/src/components/preview/mgt-search-results/strings.ts rename to packages/mgt-components/src/components/preview/mgt-search-results-old/strings.ts diff --git a/packages/mgt-components/src/components/mgt-search-results/loc/strings.default.ts b/packages/mgt-components/src/components/preview/mgt-search-results/loc/strings.default.ts similarity index 97% rename from packages/mgt-components/src/components/mgt-search-results/loc/strings.default.ts rename to packages/mgt-components/src/components/preview/mgt-search-results/loc/strings.default.ts index c466a10583..0c1cf8646f 100644 --- a/packages/mgt-components/src/components/mgt-search-results/loc/strings.default.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-results/loc/strings.default.ts @@ -1,5 +1,5 @@ -import { html } from 'lit-html'; -import { unsafeHTML } from 'lit-html/directives/unsafe-html'; +import { html } from 'lit'; +import { unsafeHTML } from 'lit/directives/unsafe-html.js'; export const MgtSearchResultsStrings = { seeAllLink: 'See all', diff --git a/packages/mgt-components/src/components/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts b/packages/mgt-components/src/components/preview/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts similarity index 96% rename from packages/mgt-components/src/components/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts rename to packages/mgt-components/src/components/preview/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts index 1296ba8838..8b85b5c879 100644 --- a/packages/mgt-components/src/components/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts @@ -1,7 +1,7 @@ -import { FileFormat, MgtConnectableComponent, MgtTemplatedComponent, TemplateService } from '@microsoft/mgt-element'; +import { FileFormat, MgtConnectableComponent, TemplateService } from '@microsoft/mgt-element'; import { css, customElement, html, property, PropertyValues, state } from 'lit-element'; -import { unsafeHTML } from 'lit-html/directives/unsafe-html'; -import { styles as tailwindStyles } from '../../../styles/tailwind-styles-css'; +import { unsafeHTML } from 'lit/directives/unsafe-html.js'; +import { styles as tailwindStyles } from '../../../../styles/tailwind-styles-css'; /** * Process adaptive card content from an external file diff --git a/packages/mgt-components/src/components/preview/mgt-search-results/mgt-search-results.ts b/packages/mgt-components/src/components/preview/mgt-search-results/mgt-search-results.ts index c77020e152..13e2260bd3 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-results/mgt-search-results.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-results/mgt-search-results.ts @@ -1,1280 +1,933 @@ -/** - * ------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. - * See License in the project root for license information. - * ------------------------------------------------------------------------------------------- - */ - -import { html, HTMLTemplateResult, nothing, TemplateResult } from 'lit'; -import { property, state } from 'lit/decorators.js'; import { - CacheService, - CacheStore, - equals, - MgtTemplatedComponent, - prepScopes, + LocalizationHelper, Providers, ProviderState, - customElement, - mgtHtml, - BetaGraph, - BatchResponse, - CollectionResponse + MgtConnectableComponent, + BuiltinFilterTemplates, + BuiltinTokenNames, + DateHelper, + EntityType, + FilterSortDirection, + FilterSortType, + IDataSourceData, + ILocalizedString, + IMicrosoftSearchQuery, + IMicrosoftSearchService, + ISearchFiltersEventData, + ISearchInputEventData, + ISearchRequestAggregation, + ISearchResultsEventData, + ISearchSortEventData, + ISearchSortProperty, + ISearchVerticalEventData, + ISortFieldConfiguration, + ITemplateService, + ITokenService, + MicrosoftSearchService, + SearchAggregationSortBy, + SearchResultsHelper, + SortFieldDirection, + TemplateService, + TokenService, + UrlHelper, + DataFilterHelper, + customElement } from '@microsoft/mgt-element'; +import { isEmpty } from 'lodash-es'; +import { unsafeHTML } from 'lit/directives/unsafe-html.js'; +import { property, state } from 'lit/decorators.js'; +import { html, nothing, css, PropertyValues } from 'lit'; +import { repeat } from 'lit/directives/repeat.js'; +import { MgtSearchResultsStrings as strings } from './loc/strings.default'; +import { styles as tailwindStyles } from '../../../styles/tailwind-styles-css'; +import { EventConstants } from '@microsoft/mgt-element'; -import { schemas } from '../../../graph/cacheStores'; -import { strings } from './strings'; -import { styles } from './mgt-search-results-css'; -import { - DirectoryObject, - Drive, - DriveItem, - EntityType, - List, - ListItem, - Message, - SearchHit, - SearchHitsContainer, - SearchRequest, - SearchResponse, - Site -} from '@microsoft/microsoft-graph-types'; -import { SearchRequest as BetaSearchRequest } from '@microsoft/microsoft-graph-types-beta'; -import { - getIsResponseCacheEnabled, - getNameFromUrl, - getRelativeDisplayDate, - getResponseInvalidationTime, - sanitizeSummary, - trimFileExtension -} from '../../../utils/Utils'; -import { getSvg, SvgIcon } from '../../../utils/SvgHelper'; -import { fluentSkeleton, fluentButton, fluentTooltip, fluentDivider } from '@fluentui/web-components'; -import { registerFluentComponents } from '../../../utils/FluentComponents'; -import { CacheResponse } from '../../CacheResponse'; - -registerFluentComponents(fluentSkeleton, fluentButton, fluentTooltip, fluentDivider); - -/** - * Object representing a thumbnail - */ -interface Thumbnail { - /** - * The url of the Thumbnail - */ - url?: string; -} +@customElement('search-results') +export class MgtSearchResultsComponent extends MgtConnectableComponent { + //#region Attributes -/** - * Object representing a Binary Thumbnail - */ -interface BinaryThumbnail { /** - * The url of the Thumbnail + * Flag indicating if the beta endpoint for Microsoft Graph API should be used */ - url?: string; + @property({ type: Boolean, attribute: 'use-beta' }) + useBetaEndpoint = false; /** - * The web Url of the Thumbnail + * The Microsoft Search entity types to query */ - thumbnailWebUrl?: string; -} + @property({ + type: String, + attribute: 'entity-types', + converter: { + fromAttribute: value => { + return value.split(',') as EntityType[]; + } + } + }) + entityTypes: EntityType[] = [EntityType.ListItem]; -/** - * Object representing a Search Answer - */ -type Answer = { - '@odata.type': string; - displayName?: string; - description?: string; - webUrl?: string; -}; - -/** - * Object representing a search resource supporting thumbnails - */ -type ThumbnailResource = { - thumbnail: Thumbnail; -}; - -type UserResource = { - lastModifiedBy?: { - user?: { - email?: string; - }; - }; - userPrincipalName?: string; -}; - -/** - * Object representing a Search Resource - */ -type SearchResource = Partial< - DriveItem & Site & List & Message & ListItem & Drive & DirectoryObject & Answer & ThumbnailResource & UserResource ->; - -/** - * Object representing a full Search Response - */ -type SearchResponseCollection = CollectionResponse; - -/** - * **Preview component** Custom element for making Microsoft Graph get queries. - * Component may change before general availability release. - * - * @fires {CustomEvent} dataChange - Fired when data changes - * - * @cssprop --answer-border-radius - {Length} Border radius of an answer - * @cssprop --answer-box-shadow - {Length} Box shadow of an answer - * @cssprop --answer-border - {Length} Border of an answer - * @cssprop --answer-padding - {Length} Padding of an answer - * - * @class mgt-search-results - * @extends {MgtTemplatedComponent} - */ -@customElement('search-results') -export class MgtSearchResults extends MgtTemplatedComponent { /** - * Default page size is 10 + * The default query text to apply. + * Query string parameter and search box have priority over this value during first load */ - private _size = 10; + @property({ type: String, attribute: 'query-text' }) + defaultQueryText: string; /** - * Array of styles to apply to the element. The styles should be defined - * user the `css` tag function. + * The search query template to use. Support tokens https://learn.microsoft.com/en-us/graph/search-concept-query-template */ - static get styles() { - return styles; - } + @property({ type: String, attribute: 'query-template' }) + queryTemplate: string; /** - * Gets all the localization strings for the component + * If specified, get the default query text from this query string parameter name */ - protected get strings() { - return strings; - } - - private _queryString: string; + @property({ type: String, attribute: 'default-query-string-parameter' }) + defaultQueryStringParameter: string; /** - * The query to send to Microsoft Search - * - * @type {string} - * @memberof MgtSearchResults + * Search managed properties to retrieve for results and usable in the results template. + * Comma separated. Refer to the [Microsoft Search API documentation](https://learn.microsoft.com/en-us/graph/api/resources/search-api-overview?view=graph-rest-1.0&preserve-view=true#scope-search-based-on-entity-types) to know what properties can be used according to entity types. */ @property({ - attribute: 'query-string', - type: String - }) - public get queryString(): string { - return this._queryString; - } - public set queryString(value: string) { - if (this._queryString !== value) { - this._queryString = value; - this._currentPage = 1; - this.setLoadingState(true); - void this.requestStateUpdate(true); + type: Array, + attribute: 'fields', + converter: { + fromAttribute: value => { + return value.split(','); + } } - } - - /** - * Query template to use in complex search scenarios - * Query Templates are currently supported only on the beta endpoint - */ - @property({ - attribute: 'query-template', - type: String }) - public queryTemplate: string; + selectedFields: string[] = [ + 'name', + 'title', + 'summary', + 'created', + 'createdBy', + 'filetype', + 'defaultEncodingURL', + 'lastModifiedTime', + 'modifiedBy', + 'path', + 'hitHighlightedSummary', + 'SPSiteURL', + 'SiteTitle' + ]; /** - * One or more types of resources expected in the response. - * Possible values are: list, site, listItem, message, event, - * drive, driveItem, externalItem. - * - * @type {string[]} - * @memberof MgtSearchResults + * Sort properties for the request */ @property({ - attribute: 'entity-types', - converter: value => { - return value.split(',').map(v => v.trim()); - }, - type: String + type: String, + attribute: 'sort-properties', + converter: { + fromAttribute: value => { + try { + return JSON.parse(value); + } catch { + return null; + } + } + } }) - public entityTypes: string[] = ['driveItem', 'listItem', 'site']; + sortFieldsConfiguration: ISortFieldConfiguration[] = []; /** - * The scopes to request - * - * @type {string[]} - * @memberof MgtSearchResults + * Flag indicating if the pagniation control should be displayed */ - @property({ - attribute: 'scopes', - converter: (value, type) => { - return value ? value.toLowerCase().split(',') : null; - } - }) - public scopes: string[] = []; + @property({ type: Boolean, attribute: 'show-paging' }) + showPaging: boolean; /** - * Content sources to use with External Items - * - * @type {string[]} - * @memberof MgtSearchResults + * The number of results to show per results page */ - @property({ - attribute: 'content-sources', - converter: (value, type) => { - return value ? value.toLowerCase().split(',') : null; - } - }) - public contentSources: string[] = []; + @property({ type: Number, attribute: 'page-size' }) + pageSize = 10; /** - * Api version to use for request - * - * @type {string} - * @memberof MgtSearchResults + * The number of pages to display in the pagination control */ - @property({ - attribute: 'version', - reflect: true, - type: String - }) - public version = 'v1.0'; + @property({ type: Number, attribute: 'pages-number' }) + numberOfPagesToDisplay = 5; /** - * Specifies the offset for the search results. - * Offset 0 returns the very first result. - * - * @type {number} - * @memberof MgtSearchResults + * Flag indicating if Micrsoft Search result types should be applied in results */ - public get from(): number { - return (this.currentPage - 1) * this.size; - } + @property({ type: Boolean, attribute: 'enable-result-types' }) + enableResultTypes: boolean; /** - * The size of the page to be retrieved. - * The maximum value is 1000. - * - * @type {number} - * @memberof MgtSearchResults + * If "entityTypes" contains "externalItem", specify the connection id of the external source */ @property({ - attribute: 'size', - reflect: true, - type: Number - }) - public get size(): number { - return this._size; - } - public set size(value) { - if (value > this.maxPageSize) { - this._size = this.maxPageSize; - } else { - this._size = value; + type: String, + attribute: 'connections', + converter: { + fromAttribute: value => { + return value.split(',').map(v => `/external/connections/${v}`) as string[]; + } } - } + }) + connectionIds: string[]; /** - * The maximum number of pages to be clickable - * in the paging control - * - * @type {number} - * @memberof MgtSearchResults + * Indicates whether spelling modifications are enabled. If enabled, the user will get the search results for the corrected query in case of no results for the original query with typos. */ - @property({ - attribute: 'paging-max', - reflect: true, - type: Number - }) - public pagingMax = 7; + @property({ type: Boolean, attribute: 'enable-modification' }) + enableModification = false; /** - * Sets whether the result thumbnail should be fetched - * from the Microsoft Graph - * - * @type {boolean} - * @memberof MgtSearchResults + * Indicates whether spelling suggestions are enabled. If enabled, the user will get the search results for the original search query and suggestions for spelling correction */ - @property({ - attribute: 'fetch-thumbnail', - type: Boolean - }) - public fetchThumbnail: boolean; + @property({ type: Boolean, attribute: 'enable-suggestion' }) + enableSuggestion = false; /** - * Contains the fields to be returned for each resource - * - * @type {string[]} - * @memberof MgtSearchResults + * If specified, shows the title on top of the results */ @property({ - attribute: 'fields', - converter: value => { - return value.split(',').map(v => v.trim()); - }, - type: String + type: String, + attribute: 'comp-title', + converter: { + fromAttribute: value => { + try { + return JSON.parse(value); + } catch { + return value; + } + } + } }) - public fields: string[]; + componentTitle: string | ILocalizedString; /** - * This triggers hybrid sort for messages : the first 3 messages are the most relevant. - * This property is only applicable to entityType=message - * - * @type {boolean} - * @memberof MgtSearchResults + * If specified, shows a "See all" link at top top of the results */ - @property({ - attribute: 'enable-top-results', - reflect: true, - type: Boolean - }) - public enableTopResults = false; + @property({ type: String, attribute: 'see-all-link' }) + seeAllLink: string; /** - * Enables cache on the response from the specified resource - * default = false - * - * @type {boolean} - * @memberof MgtSearchResults + * If specified, show the results count at the top of the results */ - @property({ - attribute: 'cache-enabled', - reflect: true, - type: Boolean - }) - public cacheEnabled = false; + @property({ type: Boolean, attribute: 'show-count' }) + showCount: boolean; /** - * Invalidation period of the cache for the responses in milliseconds - * - * @type {number} - * @memberof MgtSearchResults + * The search filters component ID if connected to a search filters */ - @property({ - attribute: 'cache-invalidation-period', - reflect: true, - type: Number - }) - public cacheInvalidationPeriod = 30000; + @property({ type: String, attribute: 'search-filters-id' }) + searchFiltersComponentId: string; /** - * Gets or sets the response of the request - * - * @type any - * @memberof MgtSearchResults + * The search input component ID if connected to a search input */ - @state() private response: SearchResponseCollection; - - private isRefreshing = false; - private get searchEndpoint() { - return '/search/query'; - } - private get maxPageSize() { - return 1000; - } - private readonly defaultFields: string[] = [ - 'webUrl', - 'lastModifiedBy', - 'lastModifiedDateTime', - 'summary', - 'displayName', - 'name' - ]; - private _currentPage = 1; - @state() - public get currentPage(): number { - return this._currentPage; - } - public set currentPage(value: number) { - if (this._currentPage !== value) { - this._currentPage = value; - void this.requestStateUpdate(true); - } - } - - constructor() { - super(); - console.warn( - '🦒: is a preview component and may change prior to becoming generally available. See more information https://aka.ms/mgt/preview-components' - ); - } + @property({ type: String, attribute: 'search-input-id' }) + searchInputComponentId: string; /** - * Synchronizes property values when attributes change. - * - * @param {string} name - * @param {string} oldValue - * @param {string} newValue - * @memberof MgtSearchResults + * The search verticals component ID if connected to a search verticals */ - public attributeChangedCallback(name: string, oldValue: string, newValue: string) { - super.attributeChangedCallback(name, oldValue, newValue); - void this.requestStateUpdate(); - } + @property({ type: String, attribute: 'search-verticals-id' }) + searchVerticalsComponentId: string; /** - * Refresh the data - * - * @param {boolean} [hardRefresh=false] - * if false (default), the component will only update if the data changed - * if true, the data will be first cleared and reloaded completely - * @memberof MgtSearchResults + * The search sort component ID if connected to a search sort component */ - public refresh(hardRefresh = false) { - this.isRefreshing = true; - if (hardRefresh) { - this.clearState(); - } - void this.requestStateUpdate(hardRefresh); - } + @property({ type: String, attribute: 'search-sort-id' }) + searchSortComponentId: string; /** - * Clears state of the component - * - * @protected - * @memberof MgtSearchResults + * If connected to a search verticals component on the same page, determines on which keys this component should be displayed */ - protected clearState(): void { - this.response = null; - } + @property({ + type: Array, + attribute: 'verticals-keys', + converter: { + fromAttribute: value => { + return value.split(','); + } + } + }) + selectedVerticalKeys: string[]; /** - * Invoked on each update to perform rendering tasks. This method must return - * a lit-html TemplateResult. Setting properties inside this method will *not* - * trigger the element to update. + * Flag indicating if the loading indication (spinner/shimmers) should be displayed when fectching the data */ - protected render(): TemplateResult { - let renderedTemplate: TemplateResult = null; - let headerTemplate: TemplateResult = null; - let footerTemplate: TemplateResult = null; + @property({ type: Boolean, attribute: 'no-loading' }) + noLoadingIndicator: boolean; - if (this.hasTemplate('header')) { - headerTemplate = this.renderTemplate('header', this.response); - } + //#endregion - footerTemplate = this.renderFooter(this.response?.value[0]?.hitsContainers[0]); - - if (this.isLoadingState) { - renderedTemplate = this.renderLoading(); - } else if (this.error) { - renderedTemplate = this.renderError(); - } else if (this.response && this.hasTemplate('default')) { - renderedTemplate = this.renderTemplate('default', this.response) || html``; - } else if (this.response?.value[0]?.hitsContainers[0]) { - renderedTemplate = html`${this.response?.value[0]?.hitsContainers[0]?.hits?.map(result => - this.renderResult(result) - )}`; - } else if (this.hasTemplate('no-data')) { - renderedTemplate = this.renderTemplate('no-data', null); - } else { - renderedTemplate = html``; - } + //#region State properties - return html` - ${headerTemplate} -
- ${renderedTemplate} -
- ${footerTemplate}`; - } + @state() + data: IDataSourceData = { items: [] }; - /** - * load state into the component. - * - * @protected - * @returns - * @memberof MgtSearchResults - */ - protected async loadState() { - const provider = Providers.globalProvider; + @state() + isLoading = true; - this.error = null; + @state() + shouldRender: boolean; - if (!provider || provider.state !== ProviderState.SignedIn) { - return; - } + @state() + error: Error = null; - if (this.queryString) { - try { - const requestOptions = this.getRequestOptions(); - - let cache: CacheStore; - const key = JSON.stringify({ - endpoint: `${this.version}${this.searchEndpoint}`, - requestOptions - }); - let response: SearchResponseCollection = null; - - if (this.shouldRetrieveCache()) { - cache = CacheService.getCache(schemas.search, schemas.search.stores.responses); - const result: CacheResponse = getIsResponseCacheEnabled() ? await cache.getValue(key) : null; - if (result && getResponseInvalidationTime(this.cacheInvalidationPeriod) > Date.now() - result.timeCached) { - response = JSON.parse(result.response) as SearchResponseCollection; - } - } + //#endregion - if (!response) { - const graph = provider.graph.forComponent(this); - let request = graph.api(this.searchEndpoint).version(this.version); + //#region Class properties + public declare searchQuery: IMicrosoftSearchQuery; + public declare msSearchService: IMicrosoftSearchService; + private declare templateService: ITemplateService; + private declare tokenService: ITokenService; + private declare dateHelper: DateHelper; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private declare dayJs: any; + private declare currentLanguage: string; + declare sortProperties: ISearchSortProperty[]; + //#endregion - if (this.scopes?.length) { - request = request.middlewareOptions(prepScopes(...this.scopes)); - } + //#region MGT/Lit Lifecycle methods - response = (await request.post({ requests: [requestOptions] })) as SearchResponseCollection; - - if (this.fetchThumbnail) { - const thumbnailBatch = graph.createBatch(); - const thumbnailBatchBeta = BetaGraph.fromGraph(graph).createBatch(); - - const hits = - response.value?.length && response.value[0].hitsContainers?.length - ? response.value[0].hitsContainers[0]?.hits ?? [] - : []; - for (const element of hits) { - const resource = element.resource as SearchResource; - if ( - (resource.size > 0 || resource.webUrl?.endsWith('.aspx')) && - (resource['@odata.type'] === '#microsoft.graph.driveItem' || - resource['@odata.type'] === '#microsoft.graph.listItem') - ) { - if (resource['@odata.type'] === '#microsoft.graph.listItem') { - thumbnailBatchBeta.get( - element.hitId.toString(), - `/sites/${resource.parentReference.siteId}/pages/${resource.id}` - ); - } else { - thumbnailBatch.get( - element.hitId.toString(), - `/drives/${resource.parentReference.driveId}/items/${resource.id}/thumbnails/0/medium` - ); - } - } - } + constructor() { + super(); + this.msSearchService = new MicrosoftSearchService(); + this.templateService = new TemplateService(); + this.tokenService = new TokenService(); - /** - * Based on the batch response, augment the search result resource with the thumbnail url - * - * @param thumbnailResponse - */ - const augmentResponse = (thumbnailResponse: Map>) => { - if (thumbnailResponse && thumbnailResponse.size > 0) { - for (const [k, value] of thumbnailResponse) { - const result: SearchHit = response.value[0].hitsContainers[0].hits[k] as SearchHit; - const thumbnail: Thumbnail = - result.resource['@odata.type'] === '#microsoft.graph.listItem' - ? { url: value.content.thumbnailWebUrl } - : { url: value.content.url }; - (result.resource as SearchResource).thumbnail = thumbnail; - } - } - }; - - try { - augmentResponse(await thumbnailBatch.executeAll()); - augmentResponse(await thumbnailBatchBeta.executeAll()); - } catch { - // no-op - } - } + this.dateHelper = new DateHelper(LocalizationHelper.strings?.language); - if (this.shouldUpdateCache() && response) { - cache = CacheService.getCache(schemas.search, schemas.search.stores.responses); - await cache.putValue(key, { response: JSON.stringify(response) }); - } - } + this.searchQuery = { + requests: [] + }; - if (!equals(this.response, response)) { - this.response = response; + this.addEventListener('templateRendered', (e: CustomEvent) => { + const element = e.detail.element as HTMLElement; + + if (this.enableResultTypes) { + // Process result types and replace part of HTML with item id + /*const newElement = this.templateService.processResultTypesFromHtml(this.data, element, this.getTheme()); + element.replaceWith(newElement);*/ + } + }); + + this.handleSearchVertical = this.handleSearchVertical.bind(this); + this.handleSearchFilters = this.handleSearchFilters.bind(this); + this.handleSearchInput = this.handleSearchInput.bind(this); + this.handleSearchSort = this.handleSearchSort.bind(this); + + this.goToPage = this.goToPage.bind(this); + } + + public render() { + if (this.shouldRender) { + let renderHeader; + let renderItems; + let renderOverlay; + let renderPagination; + + // Render shimmers + if (this.hasTemplate('shimmers') && !this.noLoadingIndicator && !this.renderedOnce) { + renderItems = this.renderTemplate('shimmers', { items: Array(this.pageSize) }); + } else { + // Render loading overlay + if (this.isLoading && !this.noLoadingIndicator) { + renderOverlay = html` +
+
+ + + + + +
+
+ `; } - } catch (e: unknown) { - this.error = e as Error; } - if (this.response) { - this.error = null; + // Render error + if (this.error) { + return html``; } - } else { - this.response = null; - } - this.isRefreshing = false; - this.fireCustomEvent('dataChange', { response: this.response, error: this.error as Error }); - } - /** - * Render the loading state. - * - * @protected - * @returns - * @memberof MgtSearchResults - */ - protected renderLoading(): TemplateResult { - return ( - this.renderTemplate('loading', null) || - // creates an array of n items where n is the current max number of results, this builds a shimmer for that many results - html` - ${[...Array(this.size)].map(() => { - return html` -
-
-
- -
-
-
- -
-
-
- + // Render header + if (this.componentTitle || this.seeAllLink || this.showCount) { + renderHeader = html` +
+
+ ${ + this.componentTitle + ? html` +
${this.getLocalizedString( + this.componentTitle + )}
+ ` + : null + } + ${ + this.showCount && !this.isLoading + ? html` +
${this.data.totalCount} ${strings.results}
+ ` + : null + } +
+ ${ + this.seeAllLink && this.data.totalCount > 0 + ? html` + + ` + : null + }
-
- -
-
- - -
- ${ - this.fetchThumbnail && - html` -
- -
- ` - } -
- -
- `; - })} - ` - ); - } - - /** - * Render the result item. - * - * @protected - * @returns - * @memberof MgtSearchResults - */ - protected renderResult(result: SearchHit): TemplateResult { - const type = this.getResourceType(result.resource); - if (this.hasTemplate(`result-${type}`)) { - return this.renderTemplate(`result-${type}`, result, result.hitId); - } else { - switch (result.resource['@odata.type']) { - case '#microsoft.graph.driveItem': - return this.renderDriveItem(result); - case '#microsoft.graph.site': - return this.renderSite(result); - case '#microsoft.graph.person': - return this.renderPerson(result); - case '#microsoft.graph.drive': - case '#microsoft.graph.list': - return this.renderList(result); - case '#microsoft.graph.listItem': - return this.renderListItem(result); - case '#microsoft.graph.search.bookmark': - return this.renderBookmark(result); - case '#microsoft.graph.search.acronym': - return this.renderAcronym(result); - case '#microsoft.graph.search.qna': - return this.renderQnA(result); - default: - return this.renderDefault(result); + `; } - } - } - /** - * Renders the footer with pages if required - * - * @param hitsContainer Search results - */ - private renderFooter(hitsContainer: SearchHitsContainer) { - if (this.pagingRequired(hitsContainer)) { - const pages = this.getActivePages(hitsContainer.total); + if (this.renderedOnce) { + // Render items + if (this.hasTemplate('items')) { + renderItems = this.renderTemplate('items', this.data); + } else { + // Default template for all items + renderItems = html` + + `; + } + + // Render pagination + if (this.showPaging && this.data.items.length > 0) { + renderPagination = html` + + `; + } + } return html` -
- ${this.renderPreviousPage()} - ${this.renderFirstPage(pages)} - ${this.renderAllPages(pages)} - ${this.renderNextPage()} -
- `; + ${renderHeader} +
+ ${renderOverlay} + ${renderItems} + ${renderPagination} +
+ `; } - } - /** - * Validates if paging is required based on the provided results - * - * @param hitsContainer - */ - private pagingRequired(hitsContainer: SearchHitsContainer) { - return hitsContainer?.moreResultsAvailable || this.currentPage * this.size < hitsContainer?.total; - } + return nothing; + } + + public async connectedCallback(): Promise { + // 'setTimeout' is used here to make sure the initialization logic for the search results components occurs after other component initialization routine. + // This way, we ensure other component properties will be accessible. + // connectedCallback events on other components will execute before according to the JS event loop + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop + setTimeout(async () => { + this.msSearchService.useBetaEndPoint = this.useBetaEndpoint; + this.dayJs = await this.dateHelper.dayJs(); + + // Bind connected components + const bindings = [ + { + id: this.searchVerticalsComponentId, + eventName: EventConstants.SEARCH_VERTICAL_EVENT, + callbackFunction: this.handleSearchVertical + }, + { + id: this.searchFiltersComponentId, + eventName: EventConstants.SEARCH_FILTER_EVENT, + callbackFunction: this.handleSearchFilters + }, + { + id: this.searchInputComponentId, + eventName: EventConstants.SEARCH_INPUT_EVENT, + callbackFunction: this.handleSearchInput + }, + { + id: this.searchSortComponentId, + eventName: EventConstants.SEARCH_SORT_EVENT, + callbackFunction: this.handleSearchSort + } + ]; - /** - * Gets a list of active pages to render for paging purposes - * - * @param totalResults Total number of results of the search query - */ - private getActivePages(totalResults: number) { - const getFirstPage = () => { - const medianPage = this.currentPage - Math.floor(this.pagingMax / 2) - 1; + this.bindComponents(bindings); - if (medianPage >= Math.floor(this.pagingMax / 2)) { - return medianPage; - } else { - return 0; + if (this.enableResultTypes) { + // Only load adaptive cards bundle if result types are enabled for performance purpose + await this.templateService.loadAdaptiveCardsResources(); } - }; - const pages: number[] = []; - const firstPage = getFirstPage(); - - if (firstPage + 1 > this.pagingMax - this.currentPage || this.pagingMax === this.currentPage) { - for ( - let i = firstPage + 1; - i < Math.ceil(totalResults / this.size) && - i < this.pagingMax + (this.currentPage - 1) && - pages.length < this.pagingMax - 2; - ++i - ) { - pages.push(i + 1); - } - } else { - for (let i = firstPage; i < this.pagingMax; ++i) { - pages.push(i + 1); + if (this.searchVerticalsComponentId) { + // Check if the current component should be displayed at first + const verticalsComponent = document.getElementById(this.searchVerticalsComponentId) as any; // MgtSearchVerticalsComponent; + if (verticalsComponent) { + // Reead the default value directly from the attribute + const selectedVerticalKey = verticalsComponent.selectedVerticalKey; + if (selectedVerticalKey) { + this.shouldRender = this.selectedVerticalKeys.indexOf(selectedVerticalKey) !== -1; + } + } + } else { + this.shouldRender = true; } - } - return pages; - } + // Set default sort properties according to configuration + this.initSortProperties(); - /** - * Renders all sequential pages buttons - * - * @param pages - */ - private renderAllPages(pages: number[]) { - return html` - ${pages.map( - page => - html` - - ${page} - ` - )}`; + // Build the search query + this.buildSearchQuery(); + + // Set tokens + this.tokenService.setTokenValue(BuiltinTokenNames.searchTerms, this.getDefaultQueryText()); + + return super.connectedCallback(); + }); } - /** - * Renders the "First page" button - * - * @param pages - */ - private renderFirstPage(pages: number[]) { - return html` - ${ - pages.some(page => page === 1) - ? nothing - : html` - - 1 - ` - ? html` - - ... - ` - : nothing - }`; + public disconnectedCallback(): void { + super.disconnectedCallback(); } - /** - * Constructs the "dot dot dot" button title - */ - private getDotButtonTitle() { - return `${strings.back} ${Math.ceil(this.pagingMax / 2)} ${strings.pages}`; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public updated(changedProperties: PropertyValues): void { + // Process result types on default Lit template of this component + if (this.enableResultTypes && !this.hasTemplate('items')) { + this.templateService.processResultTypesFromHtml(this.data, this.renderRoot as HTMLElement); + } + + // Properties trigerring a new search + // Mainly use for Storybook demo scenario + if ( + changedProperties.get('defaultQueryText') || + changedProperties.get('selectedFields') || + changedProperties.get('pageSize') || + changedProperties.get('entityTypes') || + changedProperties.get('enableResultTypes') || + changedProperties.get('connectionIds') || + changedProperties.get('numberOfPagesToDisplay') + ) { + // Update the search query + this.buildSearchQuery(); + this._search(this.searchQuery); + } + + this.currentLanguage = LocalizationHelper.strings?.language; } /** - * Renders the "Previous page" button + * Only calls when the provider is in ProviderState.SignedIn state + * @returns */ - private renderPreviousPage() { - return this.currentPage > 1 - ? html` - - ${getSvg(SvgIcon.ChevronLeft)} - ` - : nothing; + public async loadState(): Promise { + if (this.shouldRender && this.getDefaultQueryText()) { + await this._search(this.searchQuery); + } else { + this.isLoading = false; + } } - /** - * Renders the "Next page" button - */ - private renderNextPage() { - return !this.isLastPage() - ? html` - - ${getSvg(SvgIcon.ChevronRight)} - ` - : nothing; + //#endregion + + //#region Static properties accessors + static get styles() { + return [ + css` + :host { + + .itemInfo + .itemInfo::before { + content: " • "; + font-size: 18px; + line-height: 1; + transform: translateY(2px); + display: inline-block; + margin: 0 5px; + } + + .itemInfo + .itemInfo::after { + content: " • "; + font-size: 18px; + line-height: 1; + transform: translateY(2px); + display: inline-block; + margin: 0 5px; + } + } + `, + tailwindStyles + ]; } - /** - * Triggers a specific page click - * - * @param pageNumber - */ - private onPageClick(pageNumber: number) { - this.currentPage = pageNumber; - this.scrollToFirstResult(); + protected get strings() { + return strings; } - /** - * Triggers a first page click - * - */ - private readonly onFirstPageClick = () => { - this.currentPage = 1; - this.scrollToFirstResult(); - }; + //#endregion - /** - * Triggers a previous page click - */ - private readonly onPageBackClick = () => { - this.currentPage--; - this.scrollToFirstResult(); - }; + //#region Data related methods - /** - * Triggers a next page click - */ - private readonly onPageNextClick = () => { - this.currentPage++; - this.scrollToFirstResult(); - }; + private async _search(searchQuery: IMicrosoftSearchQuery): Promise { + const provider = Providers.globalProvider; + if (!provider || provider.state !== ProviderState.SignedIn) { + return; + } - /** - * Validates if the current page is the last page of the collection - */ - private isLastPage() { - return this.currentPage === Math.ceil(this.response.value[0].hitsContainers[0].total / this.size); + try { + // Reset error + this.error = null; + + this.isLoading = true; + const queryLanguage = LocalizationHelper.strings?.language; + + const results = await this.msSearchService.search(searchQuery, queryLanguage); + this.data = results; + + // Enhance results + this.data.items = SearchResultsHelper.enhanceResults(this.data.items); + this.isLoading = false; + + this.renderedOnce = true; + + // Notify subscribers new filters are available + this.fireCustomEvent(EventConstants.SEARCH_RESULTS_EVENT, { + availableFilters: results.filters, + sortFieldsConfiguration: this.sortFieldsConfiguration.filter(s => s.isUserSort), + submittedQueryText: this.searchQuery.requests[0].query.queryString, + resultsCount: results.totalCount, + queryAlterationResponse: results.queryAlterationResponse, + from: this.searchQuery.requests[0].from + } as ISearchResultsEventData); + } catch (error) { + this.error = error; + } } - /** - * Scroll to the top of the search results - */ - private scrollToFirstResult() { - const target = this.renderRoot.querySelector('.search-results'); - target.scrollIntoView({ - block: 'start', - behavior: 'smooth' - }); - } + private buildAggregationsFromFiltersConfig(): ISearchRequestAggregation[] { + let aggregations: ISearchRequestAggregation[] = []; + const filterComponent = document.getElementById(this.searchFiltersComponentId) as any; //MgtSearchFiltersComponent; + if (filterComponent && filterComponent.filterConfiguration) { + // Build aggregations from filters configuration (i.e. refiners) + aggregations = filterComponent.filterConfiguration.map(filterConfiguration => { + const aggregation: ISearchRequestAggregation = { + field: filterConfiguration.filterName, + bucketDefinition: { + isDescending: filterConfiguration.sortDirection === FilterSortDirection.Ascending ? false : true, + minimumCount: 0, + sortBy: + filterConfiguration.sortBy === FilterSortType.ByCount + ? SearchAggregationSortBy.Count + : SearchAggregationSortBy.KeyAsString + }, + size: filterConfiguration && filterConfiguration.maxBuckets ? filterConfiguration.maxBuckets : 10 + }; + + if (filterConfiguration.template === BuiltinFilterTemplates.Date) { + const pastYear = this.dayJs(new Date()).subtract(1, 'years').subtract(1, 'minutes').toISOString(); + const past3Months = this.dayJs(new Date()).subtract(3, 'months').subtract(1, 'minutes').toISOString(); + const pastMonth = this.dayJs(new Date()).subtract(1, 'months').subtract(1, 'minutes').toISOString(); + const pastWeek = this.dayJs(new Date()).subtract(1, 'week').subtract(1, 'minutes').toISOString(); + const past24hours = this.dayJs(new Date()).subtract(24, 'hours').subtract(1, 'minutes').toISOString(); + const today = new Date().toISOString(); + + aggregation.bucketDefinition.ranges = [ + { + to: pastYear + }, + { + from: pastYear, + to: today + }, + { + from: past3Months, + to: today + }, + { + from: pastMonth, + to: today + }, + { + from: pastWeek, + to: today + }, + { + from: past24hours, + to: today + }, + { + from: today + } + ]; + } - /** - * Gets the resource type (entity) of a search result - * - * @param resource - */ - private getResourceType(resource: SearchResource) { - return resource['@odata.type'].split('.').pop(); - } + return aggregation; + }); + } - /** - * Renders a driveItem entity - * - * @param result - */ - private renderDriveItem(result: SearchHit) { - const resource = result.resource as SearchResource; - return mgtHtml` -
-
- - -
-
- -
-
- - -
-
-   ${strings.modified} ${getRelativeDisplayDate(new Date(resource.lastModifiedDateTime))} -
-
-
-
- ${ - resource.thumbnail?.url && - html` -
- ${resource.name} -
` + return aggregations; + } + + /** + * Builds the search query according to the current componetn parameters and context + */ + private buildSearchQuery() { + // Build base search query from parameters + this.searchQuery = { + requests: [ + { + entityTypes: this.entityTypes, + contentSources: this.connectionIds, + fields: this.selectedFields, + query: { + queryString: this.getDefaultQueryText(), + queryTemplate: this.queryTemplate + }, + from: 0, + size: this.pageSize, + queryAlterationOptions: { + enableModification: this.enableModification, + enableSuggestion: this.enableSuggestion + }, + resultTemplateOptions: { + enableResultTemplate: this.enableResultTypes + } } + ] + }; -
- - `; - } + // Sort properties + if (this.sortProperties && this.sortProperties.length > 0) { + this.searchQuery.requests[0].sortProperties = this.sortProperties; + } - /** - * Renders a site entity - * - * @param result - * @returns - */ - private renderSite(result: SearchHit): HTMLTemplateResult { - const resource = result.resource as SearchResource; - return html` -
-
- ${this.getResourceIcon(resource)} -
- -
- - `; + // If a filter component is connected, get the configuration directly from connected component + if (this.searchFiltersComponentId) { + this.searchQuery.requests[0].aggregations = this.buildAggregationsFromFiltersConfig(); + } } - /** - * Renders a list entity - * - * @param result - * @returns - */ - private renderList(result: SearchHit): HTMLTemplateResult { - const resource = result.resource as SearchResource; - return mgtHtml` - - - `; - } + //#endregion - /** - * Renders a listItem entity - * - * @param result - * @returns - */ - private renderListItem(result: SearchHit): HTMLTemplateResult { - const resource = result.resource as SearchResource; - return mgtHtml` -
-
- ${resource.webUrl.endsWith('.aspx') ? getSvg(SvgIcon.News) : getSvg(SvgIcon.FileOuter)} -
-
- -
-
- - -
-
-   ${strings.modified} ${getRelativeDisplayDate(new Date(resource.lastModifiedDateTime))} -
-
-
-
- ${ - resource.thumbnail?.url && - html` -
- ${trimFileExtension(
-            resource.name || getNameFromUrl(resource.webUrl)
-          )} -
` + //#region Event handlers from connected components + + private async handleSearchFilters(e: CustomEvent): Promise { + if (this.shouldRender) { + let aggregationFilters: string[] = []; + + const selectedFilters = e.detail.selectedFilters; + + // Build aggregation filters + if (selectedFilters.some(f => f.values.length > 0)) { + // Bind to current context to be able to refernce "dayJs" + const buildFqlRefinementString = DataFilterHelper.buildFqlRefinementString.bind(this); + + // Make sure, if we have multiple filters, at least two filters have values to avoid apply an operator ("or","and") on only one condition failing the query. + if ( + selectedFilters.length > 1 && + selectedFilters.filter(selectedFilter => selectedFilter.values.length > 0).length > 1 + ) { + const refinementString = buildFqlRefinementString(selectedFilters).join(','); + if (!isEmpty(refinementString)) { + aggregationFilters = aggregationFilters.concat([`${e.detail.filterOperator}(${refinementString})`]); + } + } else { + aggregationFilters = aggregationFilters.concat(buildFqlRefinementString(selectedFilters)); } -
- - `; - } + } else { + delete this.searchQuery.requests[0].aggregationFilters; + } - /** - * Renders a person entity - * - * @param result - * @returns - */ - private renderPerson(result: SearchHit): HTMLTemplateResult { - const resource = result.resource as SearchResource; - return mgtHtml` -
- - -
- - `; - } + if (aggregationFilters.length > 0) { + this.searchQuery.requests[0].aggregationFilters = aggregationFilters; + } - /** - * Renders a bookmark entity - * - * @param result - */ - private renderBookmark(result: SearchHit) { - return this.renderAnswer(result, SvgIcon.DoubleBookmark); - } + this.resetPagination(); - /** - * Renders an acronym entity - * - * @param result - */ - private renderAcronym(result: SearchHit) { - return this.renderAnswer(result, SvgIcon.BookOpen); + await this._search(this.searchQuery); + } } - /** - * Renders a qna entity - * - * @param result - */ - private renderQnA(result: SearchHit) { - return this.renderAnswer(result, SvgIcon.BookQuestion); - } + private async handleSearchInput(e: CustomEvent): Promise { + if (this.shouldRender) { + // Remove any query string parameter if used as default + if (this.defaultQueryStringParameter) { + const url = UrlHelper.removeQueryStringParam(this.defaultQueryStringParameter, window.location.href); + if (url !== window.location.href) { + window.history.pushState({}, '', url); + } + } - /** - * Renders an answer entity - * - * @param result - */ - private renderAnswer(result: SearchHit, icon: SvgIcon) { - const resource = result.resource as SearchResource; - return html` -
-
- ${getSvg(icon)} -
-
- -
${resource.description}
-
-
- - `; - } + // If empty keywords, reset to the default state + const searchKeywords = !isEmpty(e.detail.keywords) ? e.detail.keywords : this.getDefaultQueryText(); - /** - * Renders any entity - * - * @param result - */ - private renderDefault(result: SearchHit) { - const resource = result.resource as SearchResource; - const resourceUrl = this.getResourceUrl(resource); - return html` -
-
- ${this.getResourceIcon(resource)} -
-
-
- ${ - resourceUrl - ? html` - ${this.getResourceName(resource)} - ` - : html` - ${this.getResourceName(resource)} - ` - } -
-
-
-
- - `; - } + if (searchKeywords && searchKeywords !== this.searchQuery.requests[0].query.queryString) { + // Update token + this.tokenService.setTokenValue(BuiltinTokenNames.searchTerms, searchKeywords); - /** - * Gets default resource URLs - * - * @param resource - */ - private getResourceUrl(resource: SearchResource) { - return resource.webUrl || /* resource.url ||*/ resource.webLink || null; - } + this.searchQuery.requests[0].query.queryString = searchKeywords; - /** - * Gets default resource Names - * - * @param resource - */ - private getResourceName(resource: SearchResource) { - return resource.displayName || resource.subject || trimFileExtension(resource.name); - } + this.resetFilters(); + this.resetPagination(); - /** - * Gets default result summary - * - * @param resource - */ - private getResultSummary(result: SearchHit) { - return sanitizeSummary(result.summary || (result.resource as SearchResource)?.description || null); + await this._search(this.searchQuery); + } + } } - /** - * Gets default resource icon - * - * @param resource - */ - private getResourceIcon(resource: SearchResource) { - switch (resource['@odata.type']) { - case '#microsoft.graph.site': - return getSvg(SvgIcon.Globe); - case '#microsoft.graph.message': - return getSvg(SvgIcon.Email); - case '#microsoft.graph.event': - return getSvg(SvgIcon.Event); - case 'microsoft.graph.chatMessage': - return getSvg(SvgIcon.SmallChat); - default: - return getSvg(SvgIcon.FileOuter); + private async handleSearchVertical(e: CustomEvent): Promise { + this.shouldRender = this.selectedVerticalKeys.indexOf(e.detail.selectedVertical.key) !== -1; + + if (this.shouldRender) { + // Reinitialize search context + this.resetQueryText(); + this.resetFilters(); + this.resetPagination(); + this.initSortProperties(); + + // Update the query when the new tab is selected + await this._search(this.searchQuery); + } else { + // If a query is currently performed, we cancel it to avoid new filters getting populated once one an other tab + if (this.isLoading) { + this.msSearchService.abortRequest(); + } + + // Reset available filters for connected search filter components + this.fireCustomEvent(EventConstants.SEARCH_RESULTS_EVENT, { + availableFilters: [] + } as ISearchResultsEventData); } } - /** - * Validates if cache should be retrieved - * - * @returns - */ - private shouldRetrieveCache(): boolean { - return getIsResponseCacheEnabled() && this.cacheEnabled && !this.isRefreshing; - } + private async handleSearchSort(e: CustomEvent): Promise { + if (this.shouldRender) { + this.sortProperties = e.detail.sortProperties; - /** - * Validates if cache should be updated - * - * @returns - */ - private shouldUpdateCache(): boolean { - return getIsResponseCacheEnabled() && this.cacheEnabled; + this.buildSearchQuery(); + + // Update the query when new sort is defined + await this._search(this.searchQuery); + } } - /** - * Builds the appropriate RequestOption for the search query - * - * @returns - */ - private getRequestOptions(): SearchRequest | BetaSearchRequest { - const requestOptions: SearchRequest = { - entityTypes: this.entityTypes as EntityType[], - query: { - queryString: this.queryString - }, - from: this.from ? this.from : undefined, - size: this.size ? this.size : undefined, - fields: this.getFields(), - enableTopResults: this.enableTopResults ? this.enableTopResults : undefined - }; + //#endregion + + //#region Utility methods - if (this.entityTypes.includes('externalItem')) { - requestOptions.contentSources = this.contentSources; + private getDefaultQueryText(): string { + // 1) Look connected search box if any + const inputComponent = document.getElementById(this.searchInputComponentId) as any; // MgtSearchInputComponent; + if (inputComponent && inputComponent.searchKeywords) { + return inputComponent.searchKeywords; } - if (this.version === 'beta') { - (requestOptions as BetaSearchRequest).query.queryTemplate = this.queryTemplate ? this.queryTemplate : undefined; + // 2) Look query string parameters if any + if ( + this.defaultQueryStringParameter && + !isEmpty(UrlHelper.getQueryStringParam(this.defaultQueryStringParameter, window.location.href)) + ) { + return UrlHelper.getQueryStringParam(this.defaultQueryStringParameter, window.location.href); } - return requestOptions; + // 3) Look default hard coded value if any + if (this.defaultQueryText) { + return this.defaultQueryText; + } } - /** - * Gets the fields and default fields for default render methods - * - * @returns - */ - private getFields(): string[] { - if (this.fields) { - return this.defaultFields.concat(this.fields); + private goToPage(pageNumber: number) { + if (pageNumber > 0) { + // "-1" is to calculate the correct index. Ex page "1" with page size "10" means items from start index 0 to index 10. + this.searchQuery.requests[0].from = (pageNumber - 1) * this.pageSize; + this._search(this.searchQuery); } + } + + private resetPagination() { + // Reset to first page + /* this.searchQuery.requests[0].from = 0; + const paginationComponent = this.renderRoot.querySelector(`[data-tag-name='${ComponentElements.MgtPaginationElement}']`); + if (paginationComponent) { + paginationComponent.initPagination(); + }*/ + } + + private resetFilters() { + // Reset existing filters if any selected + /* if (this.searchFiltersComponentId) { + const filterComponent = document.getElementById(this.searchFiltersComponentId) as MgtSearchFiltersComponent; + if (filterComponent) { + filterComponent.clearAllSelectedValues(true); + } + } + + delete this.searchQuery.requests[0].aggregationFilters;*/ + } + + private initSortProperties() { + this.sortProperties = this.sortFieldsConfiguration + .filter(s => s.isDefaultSort) + .map(s => { + return { + isDescending: s.sortDirection === SortFieldDirection.Descending, + name: s.sortField + }; + }); + } - return undefined; + private resetQueryText() { + const queryText = this.getDefaultQueryText(); + this.searchQuery.requests[0].query.queryString = queryText; } + //#endregion } diff --git a/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.scss b/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.scss new file mode 100644 index 0000000000..1beafb7ed0 --- /dev/null +++ b/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.scss @@ -0,0 +1 @@ +@import '../../../../../../node_modules/office-ui-fabric-core/dist/sass/References'; diff --git a/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.ts b/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.ts similarity index 97% rename from packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.ts rename to packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.ts index 5cd6efd3f1..65db71bd6c 100644 --- a/packages/mgt-components/src/components/mgt-search-verticals/mgt-search-verticals.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.ts @@ -2,15 +2,16 @@ import { html } from 'lit-element'; import { EventConstants, customElement } from '@microsoft/mgt-element'; import { IDataVerticalConfiguration } from '@microsoft/mgt-element/src/models/IDataVerticalConfiguration'; import { ISearchVerticalEventData, MgtConnectableComponent, PageOpenBehavior } from '@microsoft/mgt-element'; -import { repeat } from 'lit-html/directives/repeat'; + import { isEmpty, isEqual } from 'lodash-es'; import { styles } from './mgt-search-verticals-css'; -import { styles as tailwindStyles } from '../../styles/tailwind-styles-css'; +import { styles as tailwindStyles } from '../../../styles/tailwind-styles-css'; import { fluentTab, fluentTabPanel, fluentTabs, provideFluentDesignSystem } from '@fluentui/web-components'; import { UrlHelper } from '@microsoft/mgt-element'; import { property } from 'lit/decorators.js'; +import { repeat } from 'lit/directives/repeat.js'; -@customElement('mgt-search-verticals') +@customElement('search-verticals') export class MgtSearchVerticalsComponent extends MgtConnectableComponent { /** * The configured search verticals diff --git a/packages/mgt-components/src/components/mgt-search-verticals/strings.default.ts b/packages/mgt-components/src/components/preview/mgt-search-verticals/strings.default.ts similarity index 100% rename from packages/mgt-components/src/components/mgt-search-verticals/strings.default.ts rename to packages/mgt-components/src/components/preview/mgt-search-verticals/strings.default.ts diff --git a/packages/mgt-components/src/components/mgt-search-verticals/strings.fr-fr.ts b/packages/mgt-components/src/components/preview/mgt-search-verticals/strings.fr-fr.ts similarity index 100% rename from packages/mgt-components/src/components/mgt-search-verticals/strings.fr-fr.ts rename to packages/mgt-components/src/components/preview/mgt-search-verticals/strings.fr-fr.ts diff --git a/packages/mgt-components/src/components/mgt-search-verticals/tests/mgt-search-verticals.test.ts b/packages/mgt-components/src/components/preview/mgt-search-verticals/tests/mgt-search-verticals.test.ts similarity index 100% rename from packages/mgt-components/src/components/mgt-search-verticals/tests/mgt-search-verticals.test.ts rename to packages/mgt-components/src/components/preview/mgt-search-verticals/tests/mgt-search-verticals.test.ts diff --git a/packages/mgt-components/src/components/mgt-search-verticals/tests/mocks.ts b/packages/mgt-components/src/components/preview/mgt-search-verticals/tests/mocks.ts similarity index 100% rename from packages/mgt-components/src/components/mgt-search-verticals/tests/mocks.ts rename to packages/mgt-components/src/components/preview/mgt-search-verticals/tests/mocks.ts diff --git a/packages/mgt-element/src/ComponentElements.ts b/packages/mgt-element/src/ComponentElements.ts new file mode 100644 index 0000000000..99a7ea41a0 --- /dev/null +++ b/packages/mgt-element/src/ComponentElements.ts @@ -0,0 +1,3 @@ +export enum ComponentElements { + MgtAdaptiveCard = 'mgt-adaptive-card' +} diff --git a/packages/mgt-react/src/generated/react.ts b/packages/mgt-react/src/generated/react.ts index ed046f2aa4..67fa0e1fc3 100644 --- a/packages/mgt-react/src/generated/react.ts +++ b/packages/mgt-react/src/generated/react.ts @@ -1,4 +1,4 @@ -import { OfficeGraphInsightString,ViewType,ResponseType,DataChangedDetail,IDynamicPerson,LoginViewType,PersonCardInteraction,PersonType,GroupType,UserType,AvatarSize,PersonViewType,TasksStringResource,TasksSource,TaskFilter,ITask,SelectedChannel,TodoFilter } from '@microsoft/mgt-components'; +import { OfficeGraphInsightString,ViewType,ResponseType,DataChangedDetail,IDynamicPerson,LoginViewType,PersonCardInteraction,PersonType,GroupType,UserType,AvatarSize,PersonViewType,IMicrosoftSearchQuery,IMicrosoftSearchService,TasksStringResource,TasksSource,TaskFilter,ITask,SelectedChannel,TodoFilter } from '@microsoft/mgt-components'; import { TemplateContext,ComponentMediaQuery,TemplateRenderedData } from '@microsoft/mgt-element'; import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; import * as MicrosoftGraphBeta from '@microsoft/microsoft-graph-types-beta'; @@ -216,24 +216,10 @@ export type SearchBoxProps = { } export type SearchResultsProps = { - queryString?: string; - queryTemplate?: string; - entityTypes?: string[]; - scopes?: string[]; - contentSources?: string[]; - version?: string; - from?: number; - size?: number; - pagingMax?: number; - fetchThumbnail?: boolean; - fields?: string[]; - enableTopResults?: boolean; - cacheEnabled?: boolean; - cacheInvalidationPeriod?: number; - currentPage?: number; + searchQuery?: IMicrosoftSearchQuery; + msSearchService?: IMicrosoftSearchService; templateContext?: TemplateContext; mediaQuery?: ComponentMediaQuery; - dataChange?: (e: CustomEvent) => void; templateRendered?: (e: CustomEvent) => void; } diff --git a/yarn.lock b/yarn.lock index bac060efba..a344c6e6c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -675,7 +675,7 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.21.4", "@babel/generator@^7.22.5", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2", "@babel/generator@^7.9.0": +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.16.5", "@babel/generator@^7.21.4", "@babel/generator@^7.22.5", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2", "@babel/generator@^7.9.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz" integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== @@ -927,7 +927,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.16.2", "@babel/parser@^7.18.10", "@babel/parser@^7.18.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz" integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== @@ -2059,7 +2059,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.4", "@babel/traverse@^7.22.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.4", "@babel/traverse@^7.22.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2", "@babel/traverse@^7.9.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz" integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== @@ -2378,6 +2378,11 @@ esquery "^1.5.0" jsdoc-type-pratt-parser "~4.0.0" +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + "@esbuild/linux-loong64@0.15.5": version "0.15.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82" @@ -2430,6 +2435,13 @@ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz" integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw== +"@esm-bundle/chai@^4.3.4-fix.0": + version "4.3.4-fix.0" + resolved "https://registry.yarnpkg.com/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz#3084cff7eb46d741749f47f3a48dbbdcbaf30a92" + integrity sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw== + dependencies: + "@types/chai" "^4.2.12" + "@floating-ui/core@^1.2.6": version "1.2.6" resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz" @@ -5363,6 +5375,11 @@ dependencies: cross-spawn "^7.0.1" +"@mdn/browser-compat-data@^4.0.0": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz#1fead437f3957ceebe2e8c3f46beccdb9bc575b8" + integrity sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA== + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" @@ -6693,6 +6710,14 @@ whatwg-fetch "^3.5.0" whatwg-url "^7.1.0" +"@open-wc/chai-dom-equals@^0.12.36": + version "0.12.36" + resolved "https://registry.yarnpkg.com/@open-wc/chai-dom-equals/-/chai-dom-equals-0.12.36.tgz#ed0eb56b9e98c4d7f7280facce6215654aae9f4c" + integrity sha512-Gt1fa37h4rtWPQGETSU4n1L678NmMi9KwHM1sH+JCGcz45rs8DBPx7MUVeGZ+HxRlbEI5t9LU2RGGv6xT2OlyA== + dependencies: + "@open-wc/semantic-dom-diff" "^0.13.16" + "@types/chai" "^4.1.7" + "@open-wc/dedupe-mixin@^1.3.0": version "1.3.1" resolved "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.3.1.tgz" @@ -6714,6 +6739,19 @@ "@lit/reactive-element" "^1.0.0" "@open-wc/dedupe-mixin" "^1.3.0" +"@open-wc/semantic-dom-diff@^0.13.16": + version "0.13.21" + resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz#718b9ec5f9a98935fc775e577ad094ae8d8b7dea" + integrity sha512-BONpjHcGX2zFa9mfnwBCLEmlDsOHzT+j6Qt1yfK3MzFXFtAykfzFjAgaxPetu0YbBlCfXuMlfxI4vlRGCGMvFg== + +"@open-wc/semantic-dom-diff@^0.19.7": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.9.tgz#fd27659cbace40c6a59078233f4fa14a308a45b1" + integrity sha512-iUL0OPA6PeLQVEEJ/gsgkEiwOGgK4E1KS//zTB+u+OAh0NifNTfxDxIHQa7rEGvplaq2b2zztT2yyzOzj+MlAA== + dependencies: + "@types/chai" "^4.3.1" + "@web/test-runner-commands" "^0.6.5" + "@open-wc/testing-helpers@^1.8.12": version "1.8.12" resolved "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-1.8.12.tgz" @@ -6732,6 +6770,20 @@ lit "^2.0.0" lit-html "^2.0.0" +"@open-wc/testing@3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@open-wc/testing/-/testing-3.1.7.tgz#65200c759626d510fda103c3cb4ede6202b1b88b" + integrity sha512-HCS2LuY6hXtEwjqmad+eanId5H7E+3mUi9Z3rjAhH+1DCJ53lUnjzWF1lbCYbREqrdCpmzZvW1t5R3e9gJZSCA== + dependencies: + "@esm-bundle/chai" "^4.3.4-fix.0" + "@open-wc/chai-dom-equals" "^0.12.36" + "@open-wc/semantic-dom-diff" "^0.19.7" + "@open-wc/testing-helpers" "^2.1.4" + "@types/chai" "^4.2.11" + "@types/chai-dom" "^0.0.12" + "@types/sinon-chai" "^3.2.3" + chai-a11y-axe "^1.3.2" + "@opentelemetry/api@^1.0.1": version "1.4.1" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz" @@ -7403,7 +7455,7 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^10.0.2": +"@sinonjs/fake-timers@10.0.2", "@sinonjs/fake-timers@^10.0.2": version "10.0.2" resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz" integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== @@ -7417,6 +7469,20 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sinonjs/samsam@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-7.0.1.tgz#5b5fa31c554636f78308439d220986b9523fc51f" + integrity sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== + "@socket.io/component-emitter@~3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz" @@ -8568,6 +8634,11 @@ resolved "https://registry.npmjs.org/@types/atob-lite/-/atob-lite-2.0.0.tgz" integrity sha512-7bjymPR7Ffa1/L3HskkaxMgTQDtwFObbISzHm9g3T12VyD89IiHS3BBVojlQHyZRiIilzdh0WT1gwwgyyBtLGQ== +"@types/babel__code-frame@^7.0.2": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/babel__code-frame/-/babel__code-frame-7.0.3.tgz#eda94e1b7c9326700a4b69c485ebbc9498a0b63f" + integrity sha512-2TN6oiwtNjOezilFVl77zwdNPwQWaDBBCCWWxyo1ctiO3vAtd7H/aB/CBJdw9+kqq3+latD0SXoedIuHySSZWw== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.3", "@types/babel__core@^7.1.7": version "7.20.0" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz" @@ -8648,6 +8719,18 @@ resolved "https://registry.npmjs.org/@types/caniuse-api/-/caniuse-api-3.0.2.tgz" integrity sha512-YfCDMn7R59n7GFFfwjPAM0zLJQy4UvveC32rOJBmTqJJY8uSRqM4Dc7IJj8V9unA48Qy4nj5Bj3jD6Q8VZ1Seg== +"@types/chai-dom@^0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@types/chai-dom/-/chai-dom-0.0.12.tgz#fdd7a52bed4dd235ed1c94d3d2d31d4e7db1d03a" + integrity sha512-4rE7sDw713cV61TYzQbMrPjC4DjNk3x4vk9nAVRNXcSD4p0/5lEEfm0OgoCz5eNuWUXNKA0YiKiH/JDTuKivkA== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.1.7", "@types/chai@^4.2.11", "@types/chai@^4.2.12", "@types/chai@^4.3.1": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== + "@types/chalk@0.4.31": version "0.4.31" resolved "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz" @@ -8660,6 +8743,14 @@ dependencies: classnames "*" +"@types/co-body@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/co-body/-/co-body-6.1.0.tgz#b52625390eb0d113c9b697ea92c3ffae7740cdb9" + integrity sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/command-line-args@^5.0.0": version "5.2.0" resolved "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz" @@ -8690,6 +8781,11 @@ resolved "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz" integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== +"@types/convert-source-map@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/convert-source-map/-/convert-source-map-2.0.0.tgz#a36c2d21963caa18fe32de6cdec3d21a7d2c92b3" + integrity sha512-QUm4YOC/ENo0VjPVl2o8HGyTbHHQGDOw8PCg3rXBucYHKyZN/XjXRbPFAV1tB2FvM0/wyFoDct4cTIctzKrQFg== + "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" @@ -8883,7 +8979,7 @@ resolved "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz" integrity sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.3": version "2.0.4" resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== @@ -9083,6 +9179,11 @@ resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/mocha@^8.2.0": + version "8.2.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" + integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== + "@types/node-fetch@1.6.9": version "1.6.9" resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-1.6.9.tgz" @@ -9379,6 +9480,26 @@ "@types/mime" "*" "@types/node" "*" +"@types/sinon-chai@^3.2.3": + version "3.2.9" + resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.9.tgz#71feb938574bbadcb176c68e5ff1a6014c5e69d4" + integrity sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ== + dependencies: + "@types/chai" "*" + "@types/sinon" "*" + +"@types/sinon@*": + version "10.0.15" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.15.tgz#513fded9c3cf85e589bbfefbf02b2a0541186b48" + integrity sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" + integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== + "@types/sockjs@^0.3.33": version "0.3.33" resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" @@ -9624,6 +9745,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin-tslint@^5.54.0": version "5.59.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-5.59.0.tgz" @@ -10118,6 +10246,13 @@ resolved "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz" integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA== +"@web/browser-logs@^0.2.2", "@web/browser-logs@^0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@web/browser-logs/-/browser-logs-0.2.6.tgz#ec936f78c7cf7b0ef9fb990c0097a3da1a756b20" + integrity sha512-CNjNVhd4FplRY8PPWIAt02vAowJAVcOoTNrR/NNb/o9pka7yI9qdjpWrWhEbPr2pOXonWb52AeAgdK66B8ZH7w== + dependencies: + errorstacks "^2.2.0" + "@web/config-loader@0.1.3", "@web/config-loader@^0.1.3": version "0.1.3" resolved "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz" @@ -10125,6 +10260,30 @@ dependencies: semver "^7.3.4" +"@web/dev-server-core@^0.3.19": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@web/dev-server-core/-/dev-server-core-0.3.19.tgz#b61f9a0b92351371347a758b30ba19e683c72e94" + integrity sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA== + dependencies: + "@types/koa" "^2.11.6" + "@types/ws" "^7.4.0" + "@web/parse5-utils" "^1.2.0" + chokidar "^3.4.3" + clone "^2.1.2" + es-module-lexer "^1.0.0" + get-stream "^6.0.0" + is-stream "^2.0.0" + isbinaryfile "^4.0.6" + koa "^2.13.0" + koa-etag "^4.0.0" + koa-send "^5.0.1" + koa-static "^5.0.0" + lru-cache "^6.0.0" + mime-types "^2.1.27" + parse5 "^6.0.1" + picomatch "^2.2.2" + ws "^7.4.2" + "@web/dev-server-core@^0.4.1": version "0.4.1" resolved "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz" @@ -10149,6 +10308,17 @@ picomatch "^2.2.2" ws "^7.4.2" +"@web/dev-server-esbuild@0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@web/dev-server-esbuild/-/dev-server-esbuild-0.3.3.tgz#e82af2e5acec0e645b920400be9601601b3921c5" + integrity sha512-hB9C8X9NsFWUG2XKT3W+Xcw3IZ/VObf4LNbK14BTjApnNyZfV6hVhSlJfvhgOoJ4DxsImfhIB5+gMRKOG9NmBw== + dependencies: + "@mdn/browser-compat-data" "^4.0.0" + "@web/dev-server-core" "^0.3.19" + esbuild "^0.12 || ^0.13 || ^0.14" + parse5 "^6.0.1" + ua-parser-js "^1.0.2" + "@web/dev-server-rollup@^0.4.1": version "0.4.1" resolved "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.4.1.tgz" @@ -10161,7 +10331,7 @@ rollup "^2.67.0" whatwg-url "^11.0.0" -"@web/dev-server@^0.1.10": +"@web/dev-server@^0.1.10", "@web/dev-server@^0.1.35": version "0.1.38" resolved "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.38.tgz" integrity sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA== @@ -10181,7 +10351,7 @@ open "^8.0.2" portfinder "^1.0.32" -"@web/parse5-utils@^1.3.1": +"@web/parse5-utils@^1.2.0", "@web/parse5-utils@^1.3.1": version "1.3.1" resolved "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.1.tgz" integrity sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA== @@ -10189,6 +10359,105 @@ "@types/parse5" "^6.0.1" parse5 "^6.0.1" +"@web/test-runner-chrome@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-chrome/-/test-runner-chrome-0.11.0.tgz#41efe67cd09d9a0e5392fadc35f2fb44edf32f3d" + integrity sha512-3Eq8C1XEGmfq7iwUvXy0xXfI/fbJNIq2ImDKTVdnwT4+5uTt1i8UFZxZ0PLdkWrhXVtiWI6zcZK/2VBzsGyHBA== + dependencies: + "@web/test-runner-core" "^0.10.20" + "@web/test-runner-coverage-v8" "^0.5.0" + chrome-launcher "^0.15.0" + puppeteer-core "^13.1.3" + +"@web/test-runner-commands@^0.6.3", "@web/test-runner-commands@^0.6.5": + version "0.6.6" + resolved "https://registry.yarnpkg.com/@web/test-runner-commands/-/test-runner-commands-0.6.6.tgz#e0e8c4ce6dcd91e5b18cf2212511ee6108e31070" + integrity sha512-2DcK/+7f8QTicQpGFq/TmvKHDK/6Zald6rn1zqRlmj3pcH8fX6KHNVMU60Za9QgAKdorMBPfd8dJwWba5otzdw== + dependencies: + "@web/test-runner-core" "^0.10.29" + mkdirp "^1.0.4" + +"@web/test-runner-core@^0.10.20", "@web/test-runner-core@^0.10.27", "@web/test-runner-core@^0.10.29": + version "0.10.29" + resolved "https://registry.yarnpkg.com/@web/test-runner-core/-/test-runner-core-0.10.29.tgz#d8d909c849151cf19013d6084f89a31e400557d5" + integrity sha512-0/ZALYaycEWswHhpyvl5yqo0uIfCmZe8q14nGPi1dMmNiqLcHjyFGnuIiLexI224AW74ljHcHllmDlXK9FUKGA== + dependencies: + "@babel/code-frame" "^7.12.11" + "@types/babel__code-frame" "^7.0.2" + "@types/co-body" "^6.1.0" + "@types/convert-source-map" "^2.0.0" + "@types/debounce" "^1.2.0" + "@types/istanbul-lib-coverage" "^2.0.3" + "@types/istanbul-reports" "^3.0.0" + "@web/browser-logs" "^0.2.6" + "@web/dev-server-core" "^0.4.1" + chokidar "^3.4.3" + cli-cursor "^3.1.0" + co-body "^6.1.0" + convert-source-map "^2.0.0" + debounce "^1.2.0" + dependency-graph "^0.11.0" + globby "^11.0.1" + ip "^1.1.5" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-reports "^3.0.2" + log-update "^4.0.0" + nanocolors "^0.2.1" + nanoid "^3.1.25" + open "^8.0.2" + picomatch "^2.2.2" + source-map "^0.7.3" + +"@web/test-runner-coverage-v8@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.5.0.tgz#d1b033fd4baddaf5636a41cd017e321a338727a6" + integrity sha512-4eZs5K4JG7zqWEhVSO8utlscjbVScV7K6JVwoWWcObFTGAaBMbDVzwGRimyNSzvmfTdIO/Arze4CeUUfCl4iLQ== + dependencies: + "@web/test-runner-core" "^0.10.20" + istanbul-lib-coverage "^3.0.0" + picomatch "^2.2.2" + v8-to-istanbul "^9.0.1" + +"@web/test-runner-mocha@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@web/test-runner-mocha/-/test-runner-mocha-0.7.5.tgz#696f8cb7f5118a72bd7ac5778367ae3bd3fb92cd" + integrity sha512-12/OBq6efPCAvJpcz3XJs2OO5nHe7GtBibZ8Il1a0QtsGpRmuJ4/m1EF0Fj9f6KHg7JdpGo18A37oE+5hXjHwg== + dependencies: + "@types/mocha" "^8.2.0" + "@web/test-runner-core" "^0.10.20" + +"@web/test-runner-playwright@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-playwright/-/test-runner-playwright-0.9.0.tgz#c13b71ecfe763ae5d15dff586a35a9840c238b1f" + integrity sha512-RhWkz1CY3KThHoX89yZ/gz9wDSPujxd2wMWNxqhov4y/XDI+0TS44TWKBfWXnuvlQFZPi8JFT7KibCo3pb/Mcg== + dependencies: + "@web/test-runner-core" "^0.10.20" + "@web/test-runner-coverage-v8" "^0.5.0" + playwright "^1.22.2" + +"@web/test-runner@0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@web/test-runner/-/test-runner-0.15.0.tgz#789d4599228b6e991bfeb14db4dfffb50b7ffb4a" + integrity sha512-8gliiQPRY4oDeq90i53mb5LiilCIzfW6SRGkmZ3K62c1DpOdZsCIgt7GH2OsFF8mB9rb4olK7qQ0gdmRgm27jw== + dependencies: + "@web/browser-logs" "^0.2.2" + "@web/config-loader" "^0.1.3" + "@web/dev-server" "^0.1.35" + "@web/test-runner-chrome" "^0.11.0" + "@web/test-runner-commands" "^0.6.3" + "@web/test-runner-core" "^0.10.27" + "@web/test-runner-mocha" "^0.7.5" + camelcase "^6.2.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.1" + convert-source-map "^1.7.0" + diff "^5.0.0" + globby "^11.0.1" + nanocolors "^0.2.1" + portfinder "^1.0.32" + source-map "^0.7.3" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" @@ -10759,7 +11028,7 @@ resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.11.tgz" integrity sha512-UDi3g6Jss/W5FnSzO9jCtQwEpfymt0M+sPPlmLhDH6h2TJ8j4ESE/LpmNPBij15J5NKkk4/cg/qoVMdWI3vnlQ== -"@xmldom/xmldom@^0.8.6": +"@xmldom/xmldom@^0.8.3", "@xmldom/xmldom@^0.8.6": version "0.8.8" resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.8.tgz" integrity sha512-0LNz4EY8B/8xXY86wMrQ4tz6zEHZv9ehFMJPm8u2gq5lQ71cfRKdaKyxfJAx5aUoyzx0qzgURblTisPGgz3d+Q== @@ -10885,14 +11154,23 @@ acorn-jsx@^5.2.0, acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + acorn-walk@^6.0.1, acorn-walk@^6.1.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== -acorn-walk@^7.1.1: +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.0.2: @@ -10910,9 +11188,9 @@ acorn@^6.0.1, acorn@^6.0.4, acorn@^6.1.1, acorn@^6.2.1, acorn@^6.4.1: resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.0, acorn@^7.1.1: +acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.1.0, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2: @@ -10939,6 +11217,31 @@ adal-node@0.2.3: uuid "^3.1.0" xpath.js "~1.1.0" +adaptive-expressions@4.18.0: + version "4.18.0" + resolved "https://registry.yarnpkg.com/adaptive-expressions/-/adaptive-expressions-4.18.0.tgz#086f864bfa122a4ee1bf5c33e38069022fcf7db0" + integrity sha512-zG3HNjDCCthXWAGQgD6CpQbC3tFFSrq7uQl/9d7Afq/1cRJT7t1j8B7Q82jBcAlqC6hmI/JQhnmcEKrm6vgOZQ== + dependencies: + "@microsoft/recognizers-text-data-types-timex-expression" "1.3.0" + "@types/atob-lite" "^2.0.0" + "@types/btoa-lite" "^1.0.0" + "@types/lodash.isequal" "^4.5.5" + "@types/lru-cache" "^5.1.0" + "@types/xmldom" "^0.1.30" + "@xmldom/xmldom" "^0.8.3" + antlr4ts "0.5.0-alpha.3" + atob-lite "^2.0.0" + big-integer "^1.6.48" + btoa-lite "^1.0.0" + d3-format "^1.4.4" + dayjs "^1.10.3" + fast-xml-parser "^3.19.0" + jspath "^0.4.0" + lodash.isequal "^4.5.0" + lru-cache "^5.1.1" + uuid "^8.3.2" + xpath "^0.0.32" + adaptive-expressions@^4.15.0: version "4.20.0" resolved "https://registry.npmjs.org/adaptive-expressions/-/adaptive-expressions-4.20.0.tgz" @@ -10964,11 +11267,16 @@ adaptive-expressions@^4.15.0: uuid "^8.3.2" xpath "^0.0.32" -adaptivecards-templating@^2.1.0: +adaptivecards-templating@2.3.1, adaptivecards-templating@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/adaptivecards-templating/-/adaptivecards-templating-2.3.1.tgz" integrity sha512-rYN1tCb+4NeWUCbo7xzGhwuOG3XllpGWCtgdl/drSJA32tljAvDrMeBO/eUk7uwXx8/1hSc5WJvzbAZQWMd35Q== +adaptivecards@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/adaptivecards/-/adaptivecards-2.7.1.tgz#a0912c54aea4a0acfe30eaafb87cfeb365f126e9" + integrity sha512-SUwOUW38E2x7dgxxettTpVJl2m+AZnKm7H0it4ltuWzfeNyaMk8VI4O0t620/KZO8Qza1S+9CQeKW37KeivO6g== + adaptivecards@~2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/adaptivecards/-/adaptivecards-2.10.0.tgz" @@ -11177,9 +11485,9 @@ ansi-escapes@^3.0.0: resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" @@ -11775,6 +12083,18 @@ atob@^2.1.2: resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +autoprefixer@10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + autoprefixer@9.7.1: version "9.7.1" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz" @@ -11833,6 +12153,11 @@ axe-core@^4.2.0, axe-core@^4.6.2: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.3.3: + version "4.7.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== + axios@^0.21.0, axios@^0.21.1: version "0.21.4" resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" @@ -13171,7 +13496,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.5.0: +buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -13578,6 +13903,11 @@ caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001503: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001504.tgz" integrity sha512-5uo7eoOp2mKbWyfMXnGO9rJWOGU8duvzEiYITW+wivukL7yHH4gX9yuRaobu6El4jPxo6jKZfG+N6fB621GD/Q== +caniuse-lite@^1.0.30001426: + version "1.0.30001511" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001511.tgz#e6e2a1614275c6fb8e3acfd74a8c3a70e53ed233" + integrity sha512-NaWPJawcoedlghN4P7bDNeADD7K+rZaY6V8ZcME7PkEZo/nfOg+lnrUgRWiKbNxcQ4/toFKSxnS4WdbyPZnKkw== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz" @@ -13605,6 +13935,13 @@ ccount@^1.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== +chai-a11y-axe@^1.3.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/chai-a11y-axe/-/chai-a11y-axe-1.5.0.tgz#aafa37f91f53baeafe98219768e5dee8776cf655" + integrity sha512-V/Vg/zJDr9aIkaHJ2KQu7lGTQQm5ZOH4u1k5iTMvIXuSVlSuUo0jcSpSqf9wUn9zl6oQXa4e4E0cqH18KOgKlQ== + dependencies: + axe-core "^4.3.3" + chalk-template@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz" @@ -13786,6 +14123,16 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chrome-launcher@^0.15.0: + version "0.15.2" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz#4e6404e32200095fdce7f6a1e1004f9bd36fa5da" + integrity sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" @@ -14064,6 +14411,16 @@ cmd-shim@6.0.1: resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.1.tgz" integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== +co-body@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" + integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + co@^4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" @@ -14250,9 +14607,9 @@ command-line-args@^5.0.2, command-line-args@^5.1.1, command-line-args@^5.2.1: lodash.camelcase "^4.3.0" typical "^4.0.0" -command-line-usage@^6.1.0: +command-line-usage@^6.1.0, command-line-usage@^6.1.1: version "6.1.3" - resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -14903,9 +15260,9 @@ critters@0.0.16: postcss "^8.3.7" pretty-bytes "^5.3.0" -cross-fetch@^3.0.4, cross-fetch@^3.0.5: +cross-fetch@3.1.5, cross-fetch@^3.0.4, cross-fetch@^3.0.5: version "3.1.5" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" @@ -15192,6 +15549,17 @@ css-select@^4.1.3, css-select@^4.2.0: domutils "^2.8.0" nth-check "^2.0.1" +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + css-selector-tokenizer@^0.7.0, css-selector-tokenizer@^0.7.1: version "0.7.3" resolved "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz" @@ -15216,7 +15584,7 @@ css-tree@^1.1.2, css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" -css-tree@^2.3.1: +css-tree@^2.2.1, css-tree@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz" integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== @@ -15224,12 +15592,20 @@ css-tree@^2.3.1: mdn-data "2.0.30" source-map-js "^1.0.1" +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + css-what@^3.2.1: version "3.4.2" resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== -css-what@^6.0.1: +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -15352,6 +15728,41 @@ cssnano-preset-default@^5.2.14: postcss-svgo "^5.1.0" postcss-unique-selectors "^5.1.1" +cssnano-preset-default@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz#2a93247140d214ddb9f46bc6a3562fa9177fe301" + integrity sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^4.0.0" + postcss-calc "^9.0.0" + postcss-colormin "^6.0.0" + postcss-convert-values "^6.0.0" + postcss-discard-comments "^6.0.0" + postcss-discard-duplicates "^6.0.0" + postcss-discard-empty "^6.0.0" + postcss-discard-overridden "^6.0.0" + postcss-merge-longhand "^6.0.0" + postcss-merge-rules "^6.0.1" + postcss-minify-font-values "^6.0.0" + postcss-minify-gradients "^6.0.0" + postcss-minify-params "^6.0.0" + postcss-minify-selectors "^6.0.0" + postcss-normalize-charset "^6.0.0" + postcss-normalize-display-values "^6.0.0" + postcss-normalize-positions "^6.0.0" + postcss-normalize-repeat-style "^6.0.0" + postcss-normalize-string "^6.0.0" + postcss-normalize-timing-functions "^6.0.0" + postcss-normalize-unicode "^6.0.0" + postcss-normalize-url "^6.0.0" + postcss-normalize-whitespace "^6.0.0" + postcss-ordered-values "^6.0.0" + postcss-reduce-initial "^6.0.0" + postcss-reduce-transforms "^6.0.0" + postcss-svgo "^6.0.0" + postcss-unique-selectors "^6.0.0" + cssnano-util-get-arguments@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz" @@ -15379,6 +15790,19 @@ cssnano-utils@^3.1.0: resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== +cssnano-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.0.tgz#d1da885ec04003ab19505ff0e62e029708d36b08" + integrity sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw== + +cssnano@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.1.tgz#87c38c4cd47049c735ab756d7e77ac3ca855c008" + integrity sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg== + dependencies: + cssnano-preset-default "^6.0.1" + lilconfig "^2.1.0" + cssnano@^4.0.0, cssnano@^4.1.10, cssnano@~4.1.10: version "4.1.11" resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz" @@ -15405,6 +15829,13 @@ csso@^4.0.2, csso@^4.2.0: dependencies: css-tree "^1.1.2" +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6: version "0.3.8" resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" @@ -15568,6 +15999,11 @@ dayjs@^1.10.3: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz" integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== +dayjs@^1.11.7: + version "1.11.9" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + de-indent@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" @@ -15822,6 +16258,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + del@^2.2.0, del@^2.2.2: version "2.2.2" resolved "https://registry.npmjs.org/del/-/del-2.2.2.tgz" @@ -15966,6 +16407,20 @@ detect-port@^1.3.0: address "^1.0.1" debug "4" +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +devtools-protocol@0.0.981744: + version "0.0.981744" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.981744.tgz#9960da0370284577d46c28979a0b32651022bacf" + integrity sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg== + dezalgo@^1.0.0: version "1.0.4" resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" @@ -16009,6 +16464,11 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" @@ -16141,6 +16601,15 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" @@ -16156,7 +16625,7 @@ domelementtype@1: resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1, domelementtype@^2.2.0: +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -16189,6 +16658,13 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" @@ -16206,6 +16682,15 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" @@ -16521,7 +17006,7 @@ entities@^2.0.0: resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.4.0: +entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -16531,6 +17016,11 @@ entities@~2.1.0: resolved "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== +entities@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + env-cmd@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz" @@ -16575,6 +17065,11 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" +errorstacks@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/errorstacks/-/errorstacks-2.4.0.tgz#2155674dd9e741aacda3f3b8b967d9c40a4a0baf" + integrity sha512-5ecWhU5gt0a5G05nmQcgCxP5HperSMxLDzvWlT5U+ZSKkuDK0rJ3dbCQny6/vSCIXjwrhwSecXBbw1alr295hQ== + es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.2" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" @@ -16850,86 +17345,171 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.3" es6-symbol "^3.1.1" +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + esbuild-android-64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8" integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg== +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + esbuild-android-arm64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193" integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg== +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + esbuild-darwin-64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d" integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== + esbuild-darwin-arm64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997" integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg== +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + esbuild-freebsd-64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a" integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA== +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + esbuild-freebsd-arm64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd" integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w== +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + esbuild-linux-32@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32" integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ== +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + esbuild-linux-64@0.15.5: version "0.15.5" resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz" integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg== +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + esbuild-linux-arm64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d" integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA== +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + esbuild-linux-arm@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5" integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q== +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + esbuild-linux-mips64le@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981" integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ== +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + esbuild-linux-ppc64le@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474" integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw== +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + esbuild-linux-riscv64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896" integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA== +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + esbuild-linux-s390x@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae" integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ== +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + esbuild-netbsd-64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8" integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w== +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + esbuild-openbsd-64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035" integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA== +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + esbuild-sunos-64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141" @@ -16940,16 +17520,31 @@ esbuild-wasm@0.15.5: resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz" integrity sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A== +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + esbuild-windows-32@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7" integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg== +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + esbuild-windows-64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9" integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw== +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + esbuild-windows-arm64@0.15.5: version "0.15.5" resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b" @@ -16982,6 +17577,33 @@ esbuild@0.15.5: esbuild-windows-64 "0.15.5" esbuild-windows-arm64 "0.15.5" +"esbuild@^0.12 || ^0.13 || ^0.14": + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== + optionalDependencies: + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -17971,6 +18593,17 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + extract-zip@^1.0.3, extract-zip@^1.6.6: version "1.7.0" resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz" @@ -18060,6 +18693,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@^3.19.0: + version "3.21.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz#152a1d51d445380f7046b304672dd55d15c9e736" + integrity sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg== + dependencies: + strnum "^1.0.4" + fast-xml-parser@^4.1.2: version "4.2.4" resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz" @@ -20664,6 +21304,11 @@ infer-owner@^1.0.3, infer-owner@^1.0.4: resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== +inflation@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" + integrity sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" @@ -21586,9 +22231,9 @@ isarray@^2.0.5: resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isbinaryfile@^4.0.2, isbinaryfile@^4.0.8: +isbinaryfile@^4.0.2, isbinaryfile@^4.0.6, isbinaryfile@^4.0.8: version "4.0.10" - resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== isbinaryfile@^5.0.0: @@ -23946,7 +24591,7 @@ jsonwebtoken@^9.0.0: ms "^2.1.1" semver "^7.3.8" -jspath@^0.4.0: +jspath@0.4.0, jspath@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/jspath/-/jspath-0.4.0.tgz" integrity sha512-2/R8wkot8NCXrppBT/onp+4mcAUAZqtPxsW6aSJU3hrFAVqKqtFYcat2XJZ7inN4RtATUxfv0UQSYOmvJKiIGA== @@ -24017,6 +24662,11 @@ just-debounce@^1.0.0: resolved "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz" integrity sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ== +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== + jwa@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" @@ -24568,7 +25218,15 @@ liftoff@^3.1.0: rechoir "^0.6.2" resolve "^1.1.7" -lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: +lighthouse-logger@^1.0.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz#aef90f9e97cd81db367c7634292ee22079280aaa" + integrity sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g== + dependencies: + debug "^2.6.9" + marky "^1.2.2" + +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== @@ -24590,6 +25248,13 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" +linkify-it@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" + integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== + dependencies: + uc.micro "^1.0.1" + lit-element@^2.2.1: version "2.5.1" resolved "https://registry.npmjs.org/lit-element/-/lit-element-2.5.1.tgz" @@ -24772,6 +25437,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" @@ -25011,6 +25681,16 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + log4js@^6.4.1: version "6.9.1" resolved "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz" @@ -25273,6 +25953,17 @@ markdown-escapes@^1.0.0: resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== +markdown-it@13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" + integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== + dependencies: + argparse "^2.0.1" + entities "~3.0.1" + linkify-it "^4.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + markdown-it@^12.2.0: version "12.3.2" resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz" @@ -25284,6 +25975,11 @@ markdown-it@^12.2.0: mdurl "^1.0.1" uc.micro "^1.0.5" +marky@^1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.5.tgz#55796b688cbd72390d2d399eaaf1832c9413e3c0" + integrity sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q== + matchdep@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz" @@ -25358,6 +26054,11 @@ mdn-data@2.0.14: resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + mdn-data@2.0.30: version "2.0.30" resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz" @@ -25917,6 +26618,11 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@^0.5.6, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" @@ -26077,9 +26783,9 @@ nanocolors@^0.2.1, nanocolors@^0.2.2: resolved "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz" integrity sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA== -nanoid@^3.1.20, nanoid@^3.3.1, nanoid@^3.3.4, nanoid@^3.3.6: +nanoid@^3.1.20, nanoid@^3.1.25, nanoid@^3.3.1, nanoid@^3.3.4, nanoid@^3.3.6: version "3.3.6" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== nanomatch@^1.2.9: @@ -26165,6 +26871,17 @@ nice-try@^1.0.4: resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nise@^5.1.2: + version "5.1.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.4.tgz#491ce7e7307d4ec546f5a659b2efe94a18b4bbc0" + integrity sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers" "^10.0.2" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + no-case@^2.2.0: version "2.3.2" resolved "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz" @@ -27991,6 +28708,13 @@ pkg-conf@^1.1.2: object-assign "^4.0.1" symbol "^0.2.1" +pkg-dir@4.2.0, pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" @@ -28012,13 +28736,6 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - pkg-dir@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz" @@ -28033,6 +28750,18 @@ pkg-up@3.1.0, pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +playwright-core@1.35.1: + version "1.35.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.35.1.tgz#52c1e6ffaa6a8c29de1a5bdf8cce0ce290ffb81d" + integrity sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg== + +playwright@^1.22.2: + version "1.35.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.35.1.tgz#f991d0c76ae517d4a0023d9428b09d19d5e87128" + integrity sha512-NbwBeGJLu5m7VGM0+xtlmLAH9VUfWwYOhUi/lSEDyGg46r1CA9RWlvoc5yywxR9AzQb0mOCm7bWtOXV7/w43ZA== + dependencies: + playwright-core "1.35.1" + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz" @@ -28156,6 +28885,14 @@ postcss-calc@^8.2.3: postcss-selector-parser "^6.0.9" postcss-value-parser "^4.2.0" +postcss-calc@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== + dependencies: + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + postcss-clamp@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz" @@ -28247,6 +28984,16 @@ postcss-colormin@^5.3.1: colord "^2.9.1" postcss-value-parser "^4.2.0" +postcss-colormin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.0.tgz#d4250652e952e1c0aca70c66942da93d3cdeaafe" + integrity sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + postcss-convert-values@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz" @@ -28263,6 +29010,14 @@ postcss-convert-values@^5.1.3: browserslist "^4.21.4" postcss-value-parser "^4.2.0" +postcss-convert-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz#ec94a954957e5c3f78f0e8f65dfcda95280b8996" + integrity sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + postcss-custom-media@^7.0.8: version "7.0.8" resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz" @@ -28334,6 +29089,11 @@ postcss-discard-comments@^5.1.2: resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== +postcss-discard-comments@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz#9ca335e8b68919f301b24ba47dde226a42e535fe" + integrity sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw== + postcss-discard-duplicates@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz" @@ -28346,6 +29106,11 @@ postcss-discard-duplicates@^5.1.0: resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== +postcss-discard-duplicates@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz#c26177a6c33070922e67e9a92c0fd23d443d1355" + integrity sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA== + postcss-discard-empty@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz" @@ -28358,6 +29123,11 @@ postcss-discard-empty@^5.1.1: resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== +postcss-discard-empty@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz#06c1c4fce09e22d2a99e667c8550eb8a3a1b9aee" + integrity sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ== + postcss-discard-overridden@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz" @@ -28370,6 +29140,11 @@ postcss-discard-overridden@^5.1.0: resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== +postcss-discard-overridden@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz#49c5262db14e975e349692d9024442de7cd8e234" + integrity sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw== + postcss-double-position-gradients@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz" @@ -28541,6 +29316,15 @@ postcss-lab-function@^4.2.1: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" +postcss-lit@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-lit/-/postcss-lit-1.0.1.tgz#cb4283c2fc3e794aaa057a57e5348e536b723305" + integrity sha512-x3E2+5RxaDIleL/lhJVyXgimO77uLPvgoq/3U5rHmHEHfhnPtED/jm+a52jy2cSOzqf2JTTEcHbNh5N4K954yg== + dependencies: + "@babel/generator" "^7.16.5" + "@babel/parser" "^7.16.2" + "@babel/traverse" "^7.16.0" + postcss-load-config@^2.0.0, postcss-load-config@^2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz" @@ -28643,6 +29427,14 @@ postcss-merge-longhand@^5.1.7: postcss-value-parser "^4.2.0" stylehacks "^5.1.1" +postcss-merge-longhand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz#6f627b27db939bce316eaa97e22400267e798d69" + integrity sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^6.0.0" + postcss-merge-rules@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz" @@ -28665,6 +29457,16 @@ postcss-merge-rules@^5.1.4: cssnano-utils "^3.1.0" postcss-selector-parser "^6.0.5" +postcss-merge-rules@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz#39f165746404e646c0f5c510222ccde4824a86aa" + integrity sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^4.0.0" + postcss-selector-parser "^6.0.5" + postcss-minify-font-values@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz" @@ -28680,6 +29482,13 @@ postcss-minify-font-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-minify-font-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz#68d4a028f9fa5f61701974724b2cc9445d8e6070" + integrity sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA== + dependencies: + postcss-value-parser "^4.2.0" + postcss-minify-gradients@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz" @@ -28699,6 +29508,15 @@ postcss-minify-gradients@^5.1.1: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" +postcss-minify-gradients@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz#22b5c88cc63091dadbad34e31ff958404d51d679" + integrity sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA== + dependencies: + colord "^2.9.1" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + postcss-minify-params@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz" @@ -28720,6 +29538,15 @@ postcss-minify-params@^5.1.4: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" +postcss-minify-params@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz#2b3a85a9e3b990d7a16866f430f5fd1d5961b539" + integrity sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + postcss-minify-selectors@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz" @@ -28737,6 +29564,13 @@ postcss-minify-selectors@^5.2.1: dependencies: postcss-selector-parser "^6.0.5" +postcss-minify-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz#5046c5e8680a586e5a0cad52cc9aa36d6be5bda2" + integrity sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g== + dependencies: + postcss-selector-parser "^6.0.5" + postcss-modules-extract-imports@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz" @@ -28901,6 +29735,11 @@ postcss-normalize-charset@^5.1.0: resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== +postcss-normalize-charset@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz#36cc12457259064969fb96f84df491652a4b0975" + integrity sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ== + postcss-normalize-display-values@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz" @@ -28917,6 +29756,13 @@ postcss-normalize-display-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-display-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz#8d2961415078644d8c6bbbdaf9a2fdd60f546cd4" + integrity sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-positions@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz" @@ -28934,6 +29780,13 @@ postcss-normalize-positions@^5.1.1: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-positions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz#25b96df99a69f8925f730eaee0be74416865e301" + integrity sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-repeat-style@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz" @@ -28951,6 +29804,13 @@ postcss-normalize-repeat-style@^5.1.1: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-repeat-style@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz#ddf30ad8762feb5b1eb97f39f251acd7b8353299" + integrity sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-string@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz" @@ -28967,6 +29827,13 @@ postcss-normalize-string@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-string@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz#948282647a51e409d69dde7910f0ac2ff97cb5d8" + integrity sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-timing-functions@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz" @@ -28983,6 +29850,13 @@ postcss-normalize-timing-functions@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-timing-functions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz#5f13e650b8c43351989fc5de694525cc2539841c" + integrity sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-unicode@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz" @@ -29000,6 +29874,14 @@ postcss-normalize-unicode@^5.1.1: browserslist "^4.21.4" postcss-value-parser "^4.2.0" +postcss-normalize-unicode@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz#741b3310f874616bdcf07764f5503695d3604730" + integrity sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + postcss-normalize-url@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz" @@ -29018,6 +29900,13 @@ postcss-normalize-url@^5.1.0: normalize-url "^6.0.1" postcss-value-parser "^4.2.0" +postcss-normalize-url@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz#d0a31e962a16401fb7deb7754b397a323fb650b4" + integrity sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-whitespace@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz" @@ -29033,6 +29922,13 @@ postcss-normalize-whitespace@^5.1.1: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz#accb961caa42e25ca4179b60855b79b1f7129d4d" + integrity sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize@8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz" @@ -29075,6 +29971,14 @@ postcss-ordered-values@^5.1.3: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" +postcss-ordered-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz#374704cdff25560d44061d17ba3c6308837a3218" + integrity sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg== + dependencies: + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + postcss-overflow-shorthand@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz" @@ -29302,6 +30206,14 @@ postcss-reduce-initial@^5.1.2: browserslist "^4.21.4" caniuse-api "^3.0.0" +postcss-reduce-initial@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz#7d16e83e60e27e2fa42f56ec0b426f1da332eca7" + integrity sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + postcss-reduce-transforms@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz" @@ -29319,6 +30231,13 @@ postcss-reduce-transforms@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-reduce-transforms@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz#28ff2601a6d9b96a2f039b3501526e1f4d584a46" + integrity sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w== + dependencies: + postcss-value-parser "^4.2.0" + postcss-replace-overflow-wrap@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz" @@ -29427,6 +30346,14 @@ postcss-svgo@^5.1.0: postcss-value-parser "^4.2.0" svgo "^2.7.0" +postcss-svgo@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.0.tgz#7b18742d38d4505a0455bbe70d52b49f00eaf69d" + integrity sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^3.0.2" + postcss-unique-selectors@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz" @@ -29443,6 +30370,13 @@ postcss-unique-selectors@^5.1.1: dependencies: postcss-selector-parser "^6.0.5" +postcss-unique-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz#c94e9b0f7bffb1203894e42294b5a1b3fb34fbe1" + integrity sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw== + dependencies: + postcss-selector-parser "^6.0.5" + postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0: version "3.3.1" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" @@ -29532,6 +30466,15 @@ postcss@^8.2.14, postcss@^8.3.7, postcss@^8.4.14, postcss@^8.4.18, postcss@^8.4. picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.19: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^8.4.23: version "8.4.23" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz" @@ -29699,7 +30642,7 @@ process@^0.11.10: resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: +progress@2.0.3, progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -29832,7 +30775,7 @@ proxy-addr@~2.0.4, proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: +proxy-from-env@1.1.0, proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -29918,6 +30861,24 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" +puppeteer-core@^13.1.3: + version "13.7.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-13.7.0.tgz#3344bee3994163f49120a55ddcd144a40575ba5b" + integrity sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.981744" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + pkg-dir "4.2.0" + progress "2.0.3" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.5.0" + puppeteer-core@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz" @@ -29985,6 +30946,13 @@ qs@^6.10.0: dependencies: side-channel "^1.0.4" +qs@^6.5.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + qs@~5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" @@ -30104,9 +31072,9 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@2.5.2: +raw-body@2.5.2, raw-body@^2.3.3: version "2.5.2" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -31525,6 +32493,13 @@ rimraf@2.6.3, rimraf@~2.6.2: dependencies: glob "^7.1.3" +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" @@ -31532,13 +32507,6 @@ rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimra dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rimraf@^4.4.1: version "4.4.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz" @@ -32389,6 +33357,18 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sinon@15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-15.0.1.tgz#ce062611a0b131892e2c18f03055b8eb6e8dc234" + integrity sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers" "10.0.2" + "@sinonjs/samsam" "^7.0.1" + diff "^5.0.0" + nise "^5.1.2" + supports-color "^7.2.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -33285,7 +34265,7 @@ strip-outer@^1.0.1: dependencies: escape-string-regexp "^1.0.2" -strnum@^1.0.5: +strnum@^1.0.4, strnum@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== @@ -33354,6 +34334,14 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylehacks@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.0.tgz#9fdd7c217660dae0f62e14d51c89f6c01b3cb738" + integrity sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + stylelint-config-prettier-scss@^0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/stylelint-config-prettier-scss/-/stylelint-config-prettier-scss-0.0.1.tgz" @@ -33540,7 +34528,7 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -33625,6 +34613,18 @@ svgo@^2.7.0: picocolors "^1.0.0" stable "^0.1.8" +svgo@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.0.2.tgz#5e99eeea42c68ee0dc46aa16da093838c262fe0a" + integrity sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.2.1" + csso "^5.0.5" + picocolors "^1.0.0" + symbol-observable@4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" @@ -33725,6 +34725,35 @@ tabster@^4.5.1: keyborg "^2.0.0" tslib "^2.3.1" +tailwindcss@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250" + integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.18" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + tailwindcss@^3.0.2, tailwindcss@^3.2.1: version "3.3.1" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz" @@ -33765,9 +34794,19 @@ tapable@2.2.1, tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-stream@~2.2.0: +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4, tar-stream@~2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -34588,7 +35627,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8: +type-detect@4.0.8, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -34732,6 +35771,11 @@ ua-parser-js@^0.7.30: resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== +ua-parser-js@^1.0.2: + version "1.0.35" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" + integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" @@ -34760,6 +35804,14 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" @@ -36757,6 +37809,11 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + ws@^4.0.0: version "4.1.0" resolved "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz" @@ -36871,7 +37928,7 @@ xregexp@^4.3.0: dependencies: "@babel/runtime-corejs3" "^7.12.1" -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== From 991150dcb00603d835e9f263bd7dc577a3e328b2 Mon Sep 17 00:00:00 2001 From: Franck Cornu Date: Tue, 4 Jul 2023 14:54:58 -0400 Subject: [PATCH 3/4] Misc fixes --- package.json | 17 +- .../src/components/preview/index.ts | 1 - .../mgt-search-filters/mgt-base-filter.ts | 10 +- .../mgt-search-filters/mgt-search-filters.ts | 6 +- .../mgt-search-results.ts | 2 +- packages/mgt-element/src/helpers/UrlHelper.ts | 2 +- yarn.lock | 2810 ++++++++++------- 7 files changed, 1717 insertions(+), 1131 deletions(-) diff --git a/package.json b/package.json index 4141490be9..72c08a818e 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "@custom-elements-manifest/analyzer": "^0.8.3", "@microsoft/eslint-config-msgraph": "^1.0.0", "@octokit/rest": "^18.5.3", + "@open-wc/testing": "^3.2.0", "@open-wc/testing-helpers": "^2.3.0", "@storybook/addon-a11y": "^6.4.4", "@storybook/addon-actions": "^6.4.4", @@ -100,13 +101,15 @@ "@typescript-eslint/eslint-plugin": "^5.60.0", "@typescript-eslint/parser": "^5.60.0", "@web/dev-server": "^0.1.10", - "@web/test-runner": "0.15.0", "@web/dev-server-esbuild": "0.3.3", + "@web/test-runner": "0.15.0", "@web/test-runner-playwright": "0.9.0", "@webcomponents/webcomponentsjs": "^2.5.0", + "autoprefixer": "10.4.13", "babel-loader": "^8.2.1", "core-js": "^3.31.0", "cpx": "^1.5.0", + "cssnano": "6.0.1", "eslint": "^8.43.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-jsdoc": "^46.4.0", @@ -133,6 +136,8 @@ "node-sass": "npm:sass@^1.44.0", "npm-run-all": "^4.1.5", "office-ui-fabric-core": "^11.0.0", + "postcss": "^8.4.19", + "postcss-lit": "1.0.1", "prettier": "2.8.8", "react": "^17.0.1", "react-dom": "^17.0.1", @@ -148,22 +153,18 @@ "rollup-plugin-typescript": "^1.0.1", "sass": "^1.29.0", "shx": "^0.3.3", + "sinon": "15.0.1", "storybook-addon-web-components-knobs": "^0.3.20", "storybook-version": "^0.1.1", "stylelint": "^15.6.1", "stylelint-config-prettier-scss": "^0.0.1", "stylelint-config-standard-scss": "^9.0.0", + "tailwindcss": "3.2.4", "testing-library__dom": "^7.29.4-beta.1", "ts-jest": "^29.1.0", "typescript": "^5.1.5", "web-component-analyzer": "^1.1.6", - "whatwg-fetch": "^3.6.2", - "tailwindcss": "3.2.4", - "postcss": "^8.4.19", - "postcss-lit": "1.0.1", - "cssnano": "6.0.1", - "autoprefixer": "10.4.13", - "sinon": "15.0.1" + "whatwg-fetch": "^3.6.2" }, "husky": { "hooks": { diff --git a/packages/mgt-components/src/components/preview/index.ts b/packages/mgt-components/src/components/preview/index.ts index ae7bb347dd..9a935fd9be 100644 --- a/packages/mgt-components/src/components/preview/index.ts +++ b/packages/mgt-components/src/components/preview/index.ts @@ -1,5 +1,4 @@ export * from './mgt-search-box/mgt-search-box'; -//export * from './mgt-search-results-old/mgt-search-results'; export * from './mgt-search-results/mgt-search-results'; export * from './mgt-search-filters/mgt-search-filters'; export * from './mgt-search-verticals/mgt-search-verticals'; diff --git a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts index d6f8bdb062..815ff78369 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts @@ -119,11 +119,11 @@ export abstract class MgtBaseFilterComponent extends MgtConnectableComponent { ${renderFilterName}
-
{ - e.stopPropagation(); - }}> - ${this.renderFilterContent()} -
+
{ + e.stopPropagation(); + }}> + ${this.renderFilterContent()} +
`; } diff --git a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts index b315527ea3..88cde7f6ba 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts @@ -25,7 +25,7 @@ import { ScopedElementsMixin } from '@open-wc/scoped-elements'; import { MgtCheckboxFilterComponent } from './mgt-checkbox-filter/mgt-checkbox-filter'; import { MgtDateFilterComponent } from './mgt-date-filter/mgt-date-filter'; import { property, state } from 'lit/decorators.js'; -import { nothing, html } from 'lit'; +import { html, nothing } from 'lit'; import { repeat } from 'lit/directives/repeat.js'; export class MgtSearchFiltersComponentBase extends MgtConnectableComponent {} @@ -110,7 +110,7 @@ export class MgtSearchFiltersComponent extends ScopedElementsMixin(MgtSearchFilt } public render() { - let renderSort = nothing; + let renderSort; const renderCheckbox = (availableFilter: IDataFilterResult) => { return html` `; + } else { + renderSort = nothing; } let renderFilters = html`${repeat( diff --git a/packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.ts b/packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.ts index c77020e152..4ae0fad1d5 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-results-old/mgt-search-results.ts @@ -132,7 +132,7 @@ type SearchResponseCollection = CollectionResponse; * @class mgt-search-results * @extends {MgtTemplatedComponent} */ -@customElement('search-results') +@customElement('search-results-old') export class MgtSearchResults extends MgtTemplatedComponent { /** * Default page size is 10 diff --git a/packages/mgt-element/src/helpers/UrlHelper.ts b/packages/mgt-element/src/helpers/UrlHelper.ts index 34a99fd7ac..5b9976d140 100644 --- a/packages/mgt-element/src/helpers/UrlHelper.ts +++ b/packages/mgt-element/src/helpers/UrlHelper.ts @@ -20,7 +20,7 @@ export class UrlHelper { const href = url ? url : window.location.href; const reg = new RegExp('[?&#]' + field + '=([^&#]*)', 'i'); const qs = reg.exec(href); - return qs ? qs[1] : null; + return qs ? qs[1] : ''; } /** diff --git a/yarn.lock b/yarn.lock index a344c6e6c1..4f484ddabd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,11 @@ lodash.assignwith "^4.2.0" typical "^7.1.1" +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@adobe/css-tools@^4.0.1": version "4.2.0" resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" @@ -927,7 +932,12 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.16.2", "@babel/parser@^7.18.10", "@babel/parser@^7.18.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": +"@babel/parser@7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== + +"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.16.2", "@babel/parser@^7.18.10", "@babel/parser@^7.18.4", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3", "@babel/parser@^7.21.4", "@babel/parser@^7.22.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz" integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== @@ -2059,7 +2069,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.4", "@babel/traverse@^7.22.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.4", "@babel/traverse@^7.22.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2", "@babel/traverse@^7.9.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz" integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== @@ -2243,10 +2253,10 @@ resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== -"@custom-elements-manifest/analyzer@^0.6.6": - version "0.6.9" - resolved "https://registry.npmjs.org/@custom-elements-manifest/analyzer/-/analyzer-0.6.9.tgz" - integrity sha512-N6GQtDYf9yiFpf0fpjwQ7rtKlBbt9CDqXGenfrMQlo7RfC5HJVH9ZkrKsNBETiV01WPdvUBJRgag+Tbafb+jXA== +"@custom-elements-manifest/analyzer@^0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@custom-elements-manifest/analyzer/-/analyzer-0.8.3.tgz#ac60acf4b3c4fffca90d7b7908c0826e5bb725fa" + integrity sha512-wT+t4JNVMj56bSCNxxjkDSKx2KJ6bzXQMjinXJe/2+9J7Abaw/9a4+EWYLWQ//KBXRvyNhWrkolFL6ICc/VATg== dependencies: "@custom-elements-manifest/find-dependencies" "^0.0.5" "@github/catalyst" "^1.6.0" @@ -2266,6 +2276,13 @@ dependencies: es-module-lexer "^0.9.3" +"@devexpress/error-stack-parser@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@devexpress/error-stack-parser/-/error-stack-parser-2.0.6.tgz#a7c32e54583566bc6abf153c32a8b86d87d1e490" + integrity sha512-fneVypElGUH6Be39mlRZeAu00pccTlf4oVuzf9xPJD1cdEqI8NyAiQua/EW7lZdrbMUbgyXcJmfKPefhYius3A== + dependencies: + stackframe "^1.1.1" + "@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" @@ -2430,11 +2447,31 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/js@8.42.0": version "8.42.0" resolved "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz" integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw== +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== + "@esm-bundle/chai@^4.3.4-fix.0": version "4.3.4-fix.0" resolved "https://registry.yarnpkg.com/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz#3084cff7eb46d741749f47f3a48dbbdcbaf30a92" @@ -2521,6 +2558,16 @@ "@fluentui/utilities" "^8.13.17" tslib "^2.1.0" +"@fluentui/font-icons-mdl2@^8.5.23": + version "8.5.23" + resolved "https://registry.yarnpkg.com/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.23.tgz#b315a08aedd834a7a2c08277a2bc36f520918af6" + integrity sha512-jZjUtfQm9/84jX34zhwwsoZME86xXXgKAgBYuMvRStKzXGdZcd7YSOlmuT8lbISmtFL/SWwUGOEal1nLCUNeNA== + dependencies: + "@fluentui/set-version" "^8.2.11" + "@fluentui/style-utilities" "^8.9.16" + "@fluentui/utilities" "^8.13.18" + tslib "^2.1.0" + "@fluentui/foundation-legacy@^8.2.33": version "8.2.33" resolved "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.33.tgz" @@ -2543,6 +2590,17 @@ "@fluentui/utilities" "^8.13.17" tslib "^2.1.0" +"@fluentui/foundation-legacy@^8.2.43": + version "8.2.43" + resolved "https://registry.yarnpkg.com/@fluentui/foundation-legacy/-/foundation-legacy-8.2.43.tgz#fda5aac55f3b9cfd16632bd7c4f97e1e786ff1d3" + integrity sha512-rXr71KxNcWDH2LmTsFZbP75p8HssLlVLaFAqEdLE+sKf/LNKmqkDVTNhDbHZxzxy0QnguI4aNHcyGhMZUH3MPA== + dependencies: + "@fluentui/merge-styles" "^8.5.12" + "@fluentui/set-version" "^8.2.11" + "@fluentui/style-utilities" "^8.9.16" + "@fluentui/utilities" "^8.13.18" + tslib "^2.1.0" + "@fluentui/keyboard-key@^0.2.12": version "0.2.17" resolved "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.2.17.tgz" @@ -3110,7 +3168,7 @@ "@griffel/react" "^1.5.7" "@swc/helpers" "^0.4.14" -"@fluentui/react-focus@^7.18.17", "@fluentui/react-focus@^7.18.4": +"@fluentui/react-focus@^7.18.17": version "7.18.17" resolved "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.18.17.tgz" integrity sha512-W+sLIhX7wLzMsJ0jhBrDAblkG3DNbRbF8UoSieRVdAAm7xVf5HpiwJ6tb6nGqcFOnpRh8y+fjyVM+dV3K6GNHA== @@ -3146,6 +3204,18 @@ "@fluentui/utilities" "^8.13.17" tslib "^2.1.0" +"@fluentui/react-focus@^8.8.30": + version "8.8.30" + resolved "https://registry.yarnpkg.com/@fluentui/react-focus/-/react-focus-8.8.30.tgz#009c3ed10924eff8b449ba45a66b0d84f6eab66f" + integrity sha512-dKQQtNTZbQOE+u/Tmh7AbtJPSpzQNI0L8o55a22y4U7s33rizUd++CIiToXsB+bPvlotcmpZswZQ8V06zM4KIw== + dependencies: + "@fluentui/keyboard-key" "^0.4.11" + "@fluentui/merge-styles" "^8.5.12" + "@fluentui/set-version" "^8.2.11" + "@fluentui/style-utilities" "^8.9.16" + "@fluentui/utilities" "^8.13.18" + tslib "^2.1.0" + "@fluentui/react-hooks@^8.2.0", "@fluentui/react-hooks@^8.6.20", "@fluentui/react-hooks@^8.6.28": version "8.6.28" resolved "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.28.tgz" @@ -3156,6 +3226,16 @@ "@fluentui/utilities" "^8.13.17" tslib "^2.1.0" +"@fluentui/react-hooks@^8.6.29": + version "8.6.29" + resolved "https://registry.yarnpkg.com/@fluentui/react-hooks/-/react-hooks-8.6.29.tgz#37ed56ffe9e012d15efc91dfb34952bac0b516f8" + integrity sha512-MeVevmGJtrYxdhoarrkVWE0Hs4XdzOc9A3tiOjMBIcwOvoOYOAoOELoHK/wuulPVwUn2R9Y+7JpJ6oCe4ImdJw== + dependencies: + "@fluentui/react-window-provider" "^2.2.15" + "@fluentui/set-version" "^8.2.11" + "@fluentui/utilities" "^8.13.18" + tslib "^2.1.0" + "@fluentui/react-icons@^2.0.196": version "2.0.200" resolved "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.200.tgz" @@ -4126,7 +4206,7 @@ "@griffel/react" "^1.5.7" "@swc/helpers" "^0.4.14" -"@fluentui/react-window-provider@^1.0.2", "@fluentui/react-window-provider@^1.0.3", "@fluentui/react-window-provider@^1.0.6": +"@fluentui/react-window-provider@^1.0.2", "@fluentui/react-window-provider@^1.0.6": version "1.0.6" resolved "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.6.tgz" integrity sha512-m2HoxhU2m/yWxUauf79y+XZvrrWNx+bMi7ZiL6DjiAKHjTSa8KOyvicbOXd/3dvuVzOaNTnLDdZAvhRFcelOIA== @@ -4199,6 +4279,26 @@ "@microsoft/load-themed-styles" "^1.10.26" tslib "^2.1.0" +"@fluentui/react@^8.106.4": + version "8.110.7" + resolved "https://registry.yarnpkg.com/@fluentui/react/-/react-8.110.7.tgz#573aa28d96cc1aa306dd721485ee669eee3f7db2" + integrity sha512-3sn4HZL10jghiYFF+Ouc7pNDJ5pR2ueU6ZY1IdmVFgYXTJJ/IwQhVc37mXVf8VoUM7hF4vRcGE4z+loNTpTX0w== + dependencies: + "@fluentui/date-time-utilities" "^8.5.13" + "@fluentui/font-icons-mdl2" "^8.5.23" + "@fluentui/foundation-legacy" "^8.2.43" + "@fluentui/merge-styles" "^8.5.12" + "@fluentui/react-focus" "^8.8.30" + "@fluentui/react-hooks" "^8.6.29" + "@fluentui/react-portal-compat-context" "^9.0.6" + "@fluentui/react-window-provider" "^2.2.15" + "@fluentui/set-version" "^8.2.11" + "@fluentui/style-utilities" "^8.9.16" + "@fluentui/theme" "^2.6.34" + "@fluentui/utilities" "^8.13.18" + "@microsoft/load-themed-styles" "^1.10.26" + tslib "^2.1.0" + "@fluentui/set-version@^8.2.11": version "8.2.11" resolved "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.11.tgz" @@ -4225,6 +4325,18 @@ "@microsoft/load-themed-styles" "^1.10.26" tslib "^2.1.0" +"@fluentui/style-utilities@^8.9.16": + version "8.9.16" + resolved "https://registry.yarnpkg.com/@fluentui/style-utilities/-/style-utilities-8.9.16.tgz#d00dfee01a29c49b55f5f948648110ac6cc024a0" + integrity sha512-8hS5HscCFYvcWjAdk37frPZJZthr7f/cu5db7gjrPy+DEhf13WAZRHsropWm17+8GhJhvKt98BQf/Kzxtt34Eg== + dependencies: + "@fluentui/merge-styles" "^8.5.12" + "@fluentui/set-version" "^8.2.11" + "@fluentui/theme" "^2.6.34" + "@fluentui/utilities" "^8.13.18" + "@microsoft/load-themed-styles" "^1.10.26" + tslib "^2.1.0" + "@fluentui/style-utilities@^8.9.6": version "8.9.6" resolved "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.6.tgz" @@ -4267,6 +4379,16 @@ "@fluentui/utilities" "^8.13.17" tslib "^2.1.0" +"@fluentui/theme@^2.6.34": + version "2.6.34" + resolved "https://registry.yarnpkg.com/@fluentui/theme/-/theme-2.6.34.tgz#0fa3e3b74cdf597cfa65c5d1ee4dd00588aa5a7b" + integrity sha512-2Ssi3sX2snnbPJ4PmxbpCDCGePRE36tvGj2qKgdKiSh/fPVsg1b+Q50YlpFl9sXmbhl1uFmxjAx6WPsVGTl7vQ== + dependencies: + "@fluentui/merge-styles" "^8.5.12" + "@fluentui/set-version" "^8.2.11" + "@fluentui/utilities" "^8.13.18" + tslib "^2.1.0" + "@fluentui/tokens@1.0.0-alpha.4": version "1.0.0-alpha.4" resolved "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.4.tgz" @@ -4291,6 +4413,16 @@ "@fluentui/set-version" "^8.2.11" tslib "^2.1.0" +"@fluentui/utilities@^8.13.18": + version "8.13.18" + resolved "https://registry.yarnpkg.com/@fluentui/utilities/-/utilities-8.13.18.tgz#3e871a461ad72d0b9d81e1a83a32761a15804b4e" + integrity sha512-/0rX9EzltLKwU1SS14VV7agWoOzruVTU3oagZq1QgFAvoj8qi7fNqvSX/VEeRy+0gmbsCkrEViUPkmC7drKzPg== + dependencies: + "@fluentui/dom-utilities" "^2.2.11" + "@fluentui/merge-styles" "^8.5.12" + "@fluentui/set-version" "^8.2.11" + tslib "^2.1.0" + "@fluentui/utilities@^8.13.9": version "8.13.9" resolved "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.9.tgz" @@ -5298,7 +5430,7 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -5328,21 +5460,21 @@ resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@lerna/child-process@7.0.2": - version "7.0.2" - resolved "https://registry.npmjs.org/@lerna/child-process/-/child-process-7.0.2.tgz" - integrity sha512-15lMrNBL/pvREMJPSfIPieaBtyyapDco/TNjALLEL53JGzO9g8rj5PipfE9h5ILx8aq/GaP17XCh209aVCun/w== +"@lerna/child-process@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.1.1.tgz#60eddd6dc4b6ba0fd51851c78b6dbdc4e1614220" + integrity sha512-mR8PaTkckYPLmEBG2VsVsJq2UuzEvjXevOB1rKLKUZ/dPCGcottVhbiEzTxickc+s7Y/1dTTLn/1BKj3B1a5BA== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/create@7.0.2": - version "7.0.2" - resolved "https://registry.npmjs.org/@lerna/create/-/create-7.0.2.tgz" - integrity sha512-1arGpEpWbWmci1MyaGKvP2SqCAPFWpLqZp0swckianX1kx1mso9B16BWFvcHhU57zCD0Co/z+jX+02UEzZGP7Q== +"@lerna/create@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.1.1.tgz#2af94afb01971c1b594c06347b6998607aefe5c4" + integrity sha512-1PY2OgwGxp7b91JzLKEhONVl69mCt1IyYEc6pzKy3Sv+UOdeK2QFq1SX/85hNOR3iitiyZ75bNWUTcBly1ZlZg== dependencies: - "@lerna/child-process" "7.0.2" + "@lerna/child-process" "7.1.1" dedent "0.7.0" fs-extra "^11.1.1" init-package-json "5.0.0" @@ -5458,21 +5590,21 @@ resolved "https://registry.npmjs.org/@microsoft/eslint-config-msgraph/-/eslint-config-msgraph-1.0.0.tgz" integrity sha512-sfBY7aByVR1ASMKHyhnEzTErmkL/+vShFFXkG8+mULrE3h8L4xVd/Hj1gGApcGKYZDG1/LZrUt2hPaKC8CtY0Q== -"@microsoft/eslint-config-spfx@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/eslint-config-spfx/-/eslint-config-spfx-1.16.1.tgz" - integrity sha512-WJVgoqTUQdlX2r6dY2ETmssXXNr5XwakBdvvPA9KM0Smu9quSbrsyka1fNDRrsuku5pOp5zwfpHn+aK9qg9C9w== +"@microsoft/eslint-config-spfx@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/eslint-config-spfx/-/eslint-config-spfx-1.17.4.tgz#bb67a20ad3c09254695d0d33fa96991cd006ed79" + integrity sha512-7q/HyZe5w3gzFafVOnduu+WI3qWn4ddFyoz9ksMkX5YiKT6/IM9qQ2KxvWg4KxETyJEJJGxKEPa2Un686Uft0A== dependencies: - "@microsoft/eslint-plugin-spfx" "1.16.1" - "@rushstack/eslint-config" "3.0.1" - "@typescript-eslint/experimental-utils" "5.30.7" + "@microsoft/eslint-plugin-spfx" "1.17.4" + "@rushstack/eslint-config" "3.2.0" + "@typescript-eslint/experimental-utils" "5.38.1" -"@microsoft/eslint-plugin-spfx@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/eslint-plugin-spfx/-/eslint-plugin-spfx-1.16.1.tgz" - integrity sha512-CN91uwrZ6/huwzWmD/NDF5cx6KQq11rt1JI5l/5kK1CvXKpaoU8XUGL8WCy9Ed7C0VD/DoZAtiapjp2rtc517g== +"@microsoft/eslint-plugin-spfx@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/eslint-plugin-spfx/-/eslint-plugin-spfx-1.17.4.tgz#e3a5b0eba310b908c7f8218d7a88ecb955355345" + integrity sha512-pF72hH//brzPWsUzCRkyCJga7qfB4jioEXNi+BUUikS24IG+ScpOU2pWZmo2lay13gFyGQLIkkz0l8KZ3gXt6Q== dependencies: - "@typescript-eslint/experimental-utils" "5.30.7" + "@typescript-eslint/experimental-utils" "5.38.1" "@microsoft/fast-colors@^5.3.0": version "5.3.1" @@ -5501,10 +5633,10 @@ dependencies: exenv-es6 "^1.1.1" -"@microsoft/gulp-core-build-sass@4.16.0": - version "4.16.0" - resolved "https://registry.npmjs.org/@microsoft/gulp-core-build-sass/-/gulp-core-build-sass-4.16.0.tgz" - integrity sha512-sDwUyTsnRBvnMntiIGtElcaYejK17/WZRiXXXaS8VkrTNfBjdcifPnnuojKawGYnE3kFC2PrP+TwB2BI9rvVKg== +"@microsoft/gulp-core-build-sass@4.16.1": + version "4.16.1" + resolved "https://registry.yarnpkg.com/@microsoft/gulp-core-build-sass/-/gulp-core-build-sass-4.16.1.tgz#bf67e5c53b9c5f0833703af42e93f1b52eb7c93d" + integrity sha512-z3w+jI80M2QVk+zjfQ59XybzjkPuT5//lCCBy06YocBDQPC2QrfhEjXH5vgNwrM01b5KJXZIjAPBZyVryIluEQ== dependencies: "@microsoft/gulp-core-build" "3.17.20" "@microsoft/load-themed-styles" "~1.10.172" @@ -5518,55 +5650,56 @@ postcss-modules "~1.5.0" sass "1.44.0" -"@microsoft/gulp-core-build-serve@3.9.22": - version "3.9.22" - resolved "https://registry.npmjs.org/@microsoft/gulp-core-build-serve/-/gulp-core-build-serve-3.9.22.tgz" - integrity sha512-gIhu1TBIft4ofWLulAZG17cEta0UU91d9p/idAkyGG3DL4aAfKNrCTXcie3X915N3sNjz1feeCWnkkxM1vB5/Q== +"@microsoft/gulp-core-build-serve@3.12.0": + version "3.12.0" + resolved "https://registry.yarnpkg.com/@microsoft/gulp-core-build-serve/-/gulp-core-build-serve-3.12.0.tgz#de1fecffcb7bf15d7ac10a9f1b362f0ba836ccca" + integrity sha512-72KkvlX2RC5cTpC1e0uhdQA1lXX/v2WKh/7XX1fQMd9kkc8qP6ht1XT39fSWyx7K4oeAsSJJJL9Em++AEIdLpQ== dependencies: - "@microsoft/gulp-core-build" "3.17.19" + "@microsoft/gulp-core-build" "3.18.0" "@rushstack/debug-certificate-manager" "~1.1.19" - "@rushstack/node-core-library" "~3.44.1" + "@rushstack/node-core-library" "~3.53.0" "@types/node" "10.17.13" colors "~1.2.1" express "~4.16.2" gulp "~4.0.2" - gulp-connect "~5.5.0" - gulp-open "~3.0.1" + gulp-connect "~5.7.0" + open "8.4.2" sudo "~1.0.3" + through2 "~2.0.1" -"@microsoft/gulp-core-build-typescript@8.5.33": - version "8.5.33" - resolved "https://registry.npmjs.org/@microsoft/gulp-core-build-typescript/-/gulp-core-build-typescript-8.5.33.tgz" - integrity sha512-+ykMtWF8Skcl2QpGPzJYmSf/cdq6tZ0a+ph1I0GnRalaJo+KpVKzlAhUUkxG3lVmo0pbXYBICl6PK3l3UZAEHg== +"@microsoft/gulp-core-build-typescript@8.5.35": + version "8.5.35" + resolved "https://registry.yarnpkg.com/@microsoft/gulp-core-build-typescript/-/gulp-core-build-typescript-8.5.35.tgz#a886392d82ddec6e804b8f46d5cabc291dc03ef1" + integrity sha512-M9pv/WPxPJuFzF4wiODndXVGFY5bAaGgCHuJYls9zEjf96SZFnsQQaDcqeLeARzLOtroMpXLgnHoJeAeWK9QBA== dependencies: - "@microsoft/gulp-core-build" "3.17.19" - "@rushstack/node-core-library" "~3.44.1" + "@microsoft/gulp-core-build" "3.17.20" + "@rushstack/node-core-library" "~3.53.0" "@types/node" "10.17.13" decomment "~0.9.1" glob "~7.0.5" glob-escape "~0.0.2" resolve "~1.17.0" -"@microsoft/gulp-core-build-webpack@5.2.28": - version "5.2.28" - resolved "https://registry.npmjs.org/@microsoft/gulp-core-build-webpack/-/gulp-core-build-webpack-5.2.28.tgz" - integrity sha512-EMu5P62rKvU9QlFJMg8r7ANyb+we2DQna1z2uz6tDm4S9DomnULvX6eCeB3za4JH+QJtO5LOU5RV9JaZF3auig== +"@microsoft/gulp-core-build-webpack@5.2.30": + version "5.2.30" + resolved "https://registry.yarnpkg.com/@microsoft/gulp-core-build-webpack/-/gulp-core-build-webpack-5.2.30.tgz#3ee6711bd2ddd0c19ef4f886a92776f7d2c330fe" + integrity sha512-ubh5UQoSyfpkpVKb8NqXM901/qI7T6I98zTaoDyVUysuxPpYvNRkUhjC1jMftJfoaOrBHPeDNJk5UzJQIqaxMA== dependencies: - "@microsoft/gulp-core-build" "3.17.19" + "@microsoft/gulp-core-build" "3.17.20" "@types/gulp" "4.0.6" "@types/node" "10.17.13" colors "~1.2.1" gulp "~4.0.2" webpack "~4.44.2" -"@microsoft/gulp-core-build@3.17.19": - version "3.17.19" - resolved "https://registry.npmjs.org/@microsoft/gulp-core-build/-/gulp-core-build-3.17.19.tgz" - integrity sha512-izeW3DDC9KC5NYqwHqddY0KElO7YYLtbXvH30JJnYFVlpaXTl23opv5XFZYpWe6LKGuNVGnbTNwYqEuxiGiTVg== +"@microsoft/gulp-core-build@3.17.20": + version "3.17.20" + resolved "https://registry.npmjs.org/@microsoft/gulp-core-build/-/gulp-core-build-3.17.20.tgz" + integrity sha512-VBZY08BhygVV9WeIY8lo9yUoe51+5mMjdfx8Bqle40k+/V7br0d93LXeUcMqaCJ5J6C3ribx2mrzaYhkj1l//g== dependencies: "@jest/core" "~25.4.0" "@jest/reporters" "~25.4.0" - "@rushstack/node-core-library" "~3.44.1" + "@rushstack/node-core-library" "~3.53.0" "@types/chalk" "0.4.31" "@types/gulp" "4.0.6" "@types/jest" "25.2.1" @@ -5604,10 +5737,10 @@ yargs "~4.6.0" z-schema "~3.18.3" -"@microsoft/gulp-core-build@3.17.20": - version "3.17.20" - resolved "https://registry.npmjs.org/@microsoft/gulp-core-build/-/gulp-core-build-3.17.20.tgz" - integrity sha512-VBZY08BhygVV9WeIY8lo9yUoe51+5mMjdfx8Bqle40k+/V7br0d93LXeUcMqaCJ5J6C3ribx2mrzaYhkj1l//g== +"@microsoft/gulp-core-build@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@microsoft/gulp-core-build/-/gulp-core-build-3.18.0.tgz#6b41f796ea9d90021eb38878eca85fd091d40c99" + integrity sha512-XZfSfV360db1dWXc6sKjlAdDnBY3yz1GmnoBTqhFQJGY7c6yXaiS+pyihHDgCaQ+xg6bJadaS7i42Myl5n9JkQ== dependencies: "@jest/core" "~25.4.0" "@jest/reporters" "~25.4.0" @@ -5659,13 +5792,12 @@ resolved "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.295.tgz" integrity sha512-W+IzEBw8a6LOOfRJM02dTT7BDZijxm+Z7lhtOAz1+y9vQm1Kdz9jlAO+qCEKsfxtUOmKilW8DIRqFw2aUgKeGg== -"@microsoft/loader-load-themed-styles@1.9.174": - version "1.9.174" - resolved "https://registry.npmjs.org/@microsoft/loader-load-themed-styles/-/loader-load-themed-styles-1.9.174.tgz" - integrity sha512-BmsuGqKEq3faLOpfTj+k2BYa3CnxuoaRusOVc4WkY84Ycv+IBX1WW3jhslwWbmAOt7ryb6/RZpxZ7sHw6Iy8ow== +"@microsoft/loader-load-themed-styles@2.0.27": + version "2.0.27" + resolved "https://registry.yarnpkg.com/@microsoft/loader-load-themed-styles/-/loader-load-themed-styles-2.0.27.tgz#6e75569dbdebaa944e2c47fd202e63e8c84a6cf5" + integrity sha512-TVr737vb95u/d6F3D0k1IAh5VNkBY9VFfYsrV3zIH1HRYrD/D8CpEF9kV6yk5jwg6LgS2JrxhJtBKlIiTvA9Yg== dependencies: - "@microsoft/load-themed-styles" "1.10.292" - loader-utils "~1.1.0" + loader-utils "1.4.2" "@microsoft/microsoft-graph-client@3.0.2", "@microsoft/microsoft-graph-client@^3.0.1": version "3.0.2" @@ -5765,26 +5897,28 @@ resolved "https://registry.npmjs.org/@microsoft/recognizers-text/-/recognizers-text-1.1.4.tgz" integrity sha512-hlSVXcaX5i8JcjuUJpVxmy2Z/GxvFXarF0KVySCFop57wNEnrLWMHe4I4DjP866G19VyIKRw+vPA32pkGhZgTg== -"@microsoft/rush-lib@5.79.0": - version "5.79.0" - resolved "https://registry.npmjs.org/@microsoft/rush-lib/-/rush-lib-5.79.0.tgz" - integrity sha512-9FKABGIUiFZxgEVPVY7ObcoJ2OtIcaan1KeykjgcCYGjYOGliN4hl9FQ5e7UdpokNWU62c1zLfESQfnJPsyCGA== +"@microsoft/rush-lib@5.93.1": + version "5.93.1" + resolved "https://registry.yarnpkg.com/@microsoft/rush-lib/-/rush-lib-5.93.1.tgz#cfd24397a15454a070e7814eb651f2da0260139a" + integrity sha512-8ZCSW4He9VPAAsF2T/OxVaTN06wLbzeEveOvEuwNJ5h6AQYPTtlH0yv8cDDuZqSEVgOv/gK4D+kAExOszYm06A== dependencies: "@pnpm/link-bins" "~5.3.7" - "@rushstack/heft-config-file" "0.10.0" - "@rushstack/node-core-library" "3.52.0" - "@rushstack/package-deps-hash" "3.2.51" - "@rushstack/rig-package" "0.3.15" - "@rushstack/rush-amazon-s3-build-cache-plugin" "5.79.0" - "@rushstack/rush-azure-storage-build-cache-plugin" "5.79.0" - "@rushstack/stream-collator" "4.0.205" - "@rushstack/terminal" "0.3.74" - "@rushstack/ts-command-line" "4.12.3" - "@types/node-fetch" "1.6.9" + "@rushstack/heft-config-file" "0.11.9" + "@rushstack/node-core-library" "3.55.2" + "@rushstack/package-deps-hash" "4.0.8" + "@rushstack/rig-package" "0.3.18" + "@rushstack/rush-amazon-s3-build-cache-plugin" "5.93.1" + "@rushstack/rush-azure-storage-build-cache-plugin" "5.93.1" + "@rushstack/stream-collator" "4.0.227" + "@rushstack/terminal" "0.5.2" + "@rushstack/ts-command-line" "4.13.2" + "@types/node-fetch" "2.6.2" "@yarnpkg/lockfile" "~1.0.2" builtin-modules "~3.1.0" cli-table "~0.3.1" colors "~1.2.1" + dependency-path "~9.2.8" + figures "3.0.0" git-repo-info "~2.1.0" glob "~7.0.5" glob-escape "~0.0.2" @@ -5792,13 +5926,15 @@ ignore "~5.1.6" inquirer "~7.3.3" js-yaml "~3.13.1" - jszip "~3.7.1" + jszip "~3.8.0" lodash "~4.17.15" node-fetch "2.6.7" + npm-check "~6.0.1" npm-package-arg "~6.1.0" npm-packlist "~2.1.2" read-package-tree "~5.1.5" - resolve "~1.17.0" + resolve "~1.22.1" + rxjs "~6.6.7" semver "~7.3.0" ssri "~8.0.0" strict-uri-encode "~2.0.0" @@ -5806,29 +5942,28 @@ tar "~6.1.11" "true-case-path" "~2.2.1" -"@microsoft/rush-stack-compiler-4.5@0.2.2": - version "0.2.2" - resolved "https://registry.npmjs.org/@microsoft/rush-stack-compiler-4.5/-/rush-stack-compiler-4.5-0.2.2.tgz" - integrity sha512-nRlomAZwOYUR3qmFxxVcn8A3wmkjQ4eS3hoKzYylOqEU8SYPFxDFSN4I+2Y+hGTYG0gpm3NSL4Wvb0I180pCbg== +"@microsoft/rush-stack-compiler-4.5@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@microsoft/rush-stack-compiler-4.5/-/rush-stack-compiler-4.5-0.5.0.tgz#f6e94836e3a8f317de19962fb00cb252704f432b" + integrity sha512-LUNdLsOQBHzBIFoy6Gh9oNIAPFCrRG0hvLLuUAbovaxbLJ2Sp6GkO+L1Lot/JIpUtQSOxAElb3wNPp9vVdXGOw== dependencies: "@microsoft/api-extractor" "~7.15.2" - "@rushstack/eslint-config" "~2.5.0" - "@rushstack/node-core-library" "~3.44.1" + "@rushstack/eslint-config" "~2.6.2" + "@rushstack/node-core-library" "~3.53.0" "@types/node" "10.17.13" - eslint "8.7.0" import-lazy "~4.0.0" typescript "~4.5.5" -"@microsoft/sp-build-core-tasks@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-build-core-tasks/-/sp-build-core-tasks-1.16.1.tgz" - integrity sha512-TXFQkzxPXYdc0rvI6vEc0VhuytKZy8TDlAW3K5bzC5DGm87QB+2N/IYVFMQ6jxavXO7uDFuItgavSGraOyeN1Q== - dependencies: - "@microsoft/gulp-core-build" "3.17.19" - "@microsoft/gulp-core-build-serve" "3.9.22" - "@microsoft/gulp-core-build-webpack" "5.2.28" - "@microsoft/spfx-heft-plugins" "1.16.1" - "@rushstack/node-core-library" "3.52.0" +"@microsoft/sp-build-core-tasks@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-build-core-tasks/-/sp-build-core-tasks-1.17.4.tgz#e1239a322dc7e31e7937c335ddb5f6b6c2dec59f" + integrity sha512-MwzOv7xQ5j9TFvJMrzay2KWurH0eKPR1x1r4UgfyM/HLbRPxnjpo068ohZSRmo0kkMnvI+RfbcqapB1ZO69QQw== + dependencies: + "@microsoft/gulp-core-build" "3.17.20" + "@microsoft/gulp-core-build-serve" "3.12.0" + "@microsoft/gulp-core-build-webpack" "5.2.30" + "@microsoft/spfx-heft-plugins" "1.17.4" + "@rushstack/node-core-library" "3.55.2" "@types/glob" "5.0.30" "@types/lodash" "4.14.117" "@types/webpack" "4.41.24" @@ -5838,285 +5973,279 @@ lodash "4.17.21" webpack "~4.44.2" -"@microsoft/sp-build-web@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-build-web/-/sp-build-web-1.16.1.tgz" - integrity sha512-qiZT6yU9EkAHOsq0r65cDgalWYUfdB7GFrvxJHUbOUlFtbkjOfzujddyGBH5JK/xJ6bPTZMZRFKFh1xzElVwBQ== - dependencies: - "@microsoft/gulp-core-build" "3.17.19" - "@microsoft/gulp-core-build-sass" "4.16.0" - "@microsoft/gulp-core-build-serve" "3.9.22" - "@microsoft/gulp-core-build-typescript" "8.5.33" - "@microsoft/gulp-core-build-webpack" "5.2.28" - "@microsoft/rush-lib" "5.79.0" - "@microsoft/sp-build-core-tasks" "1.16.1" - "@rushstack/node-core-library" "3.52.0" +"@microsoft/sp-build-web@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-build-web/-/sp-build-web-1.17.4.tgz#449ff89080717169e1e25f9daa9192388ef29f98" + integrity sha512-60Sy5aMFkouPa0H1Z0Eyd/w9N14vAWAJx88bKYcv3bMilS2zgmn0K36xAlE29gxeOrZx4RVRrZBjGYykmMnqIA== + dependencies: + "@microsoft/gulp-core-build" "3.17.20" + "@microsoft/gulp-core-build-sass" "4.16.1" + "@microsoft/gulp-core-build-serve" "3.12.0" + "@microsoft/gulp-core-build-typescript" "8.5.35" + "@microsoft/gulp-core-build-webpack" "5.2.30" + "@microsoft/rush-lib" "5.93.1" + "@microsoft/sp-build-core-tasks" "1.17.4" + "@rushstack/node-core-library" "3.55.2" "@types/webpack" "4.41.24" gulp "4.0.2" + postcss "^8.4.19" semver "~7.3.2" "true-case-path" "~2.2.1" webpack "~4.44.2" yargs "~4.6.0" -"@microsoft/sp-component-base@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-component-base/-/sp-component-base-1.16.1.tgz" - integrity sha512-fS7E2fUgyUAn5YpdJUvG0T7kQejU3EHWD58GKK6boa1hD4FcDvAnBxt2yiqKffxtGt44CsGdHqiuK9olyFMFQw== - dependencies: - "@fluentui/react" "^7.199.1" - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-dynamic-data" "1.16.1" - "@microsoft/sp-http" "1.16.1" - "@microsoft/sp-lodash-subset" "1.16.1" - "@microsoft/sp-module-interfaces" "1.16.1" - "@microsoft/sp-page-context" "1.16.1" - office-ui-fabric-react "^7.199.1" +"@microsoft/sp-component-base@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-component-base/-/sp-component-base-1.17.4.tgz#f750422821bb73b20a506d86d0a796a8db342604" + integrity sha512-DFLbyedhbxILJsgMtQ5MX7dm5qwUbWQIOC7P1ZF6MNfOlnP2KUDqtIO4kf/tpAVxEUzn7raqId9COcFCtZwTYw== + dependencies: + "@fluentui/react" "^8.106.4" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-dynamic-data" "1.17.4" + "@microsoft/sp-http" "1.17.4" + "@microsoft/sp-lodash-subset" "1.17.4" + "@microsoft/sp-module-interfaces" "1.17.4" + "@microsoft/sp-page-context" "1.17.4" tslib "2.3.1" -"@microsoft/sp-core-library@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.16.1.tgz" - integrity sha512-1BwUFqW0rycMI7WJ4WJya/VSxnOmsPlSIY4ZXoI9IMGl0JR2E0pZWd23Z7oQAmqUmohyHssIpOjaQF/qo1fSmg== +"@microsoft/sp-core-library@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-core-library/-/sp-core-library-1.17.4.tgz#d6f10c889831994e15335c228ffd5b2535cb7f68" + integrity sha512-Zcw6hM2JVJh5gguzWICLmTWrh04IgPo74kThzuA2ZV1EqMwhP7pUNAhS0QTkxK4F4PmV8czc5ZzAy61RKDp2pg== dependencies: - "@microsoft/sp-lodash-subset" "1.16.1" - "@microsoft/sp-module-interfaces" "1.16.1" - "@microsoft/sp-odata-types" "1.16.1" + "@microsoft/sp-lodash-subset" "1.17.4" + "@microsoft/sp-module-interfaces" "1.17.4" + "@microsoft/sp-odata-types" "1.17.4" tslib "2.3.1" -"@microsoft/sp-css-loader@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-css-loader/-/sp-css-loader-1.16.1.tgz" - integrity sha512-4wNATfkBcK29k+vKn86/QwCSijjpLEqXi5/pYvvgOjhzKfHP2MC3mIU8SsWRUpN5XG8Z3DnDU9P0G2q2hk18hA== +"@microsoft/sp-css-loader@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-css-loader/-/sp-css-loader-1.17.4.tgz#0a1bdac4c53841ff16a0324b5aaf7fc0499dc402" + integrity sha512-HBzv+/cu1Mxc5j0LA04EhoXndaNhCGk4Xhqy1KZioNSZgz5DbrsEWtNklexy0wXoJP+dbro+mtZYb/B07EvV6Q== dependencies: "@microsoft/load-themed-styles" "1.10.292" - "@rushstack/node-core-library" "3.52.0" + "@rushstack/node-core-library" "3.55.2" autoprefixer "9.7.1" css-loader "3.4.2" - cssnano "~4.1.10" - loader-utils "1.2.3" - postcss "~8.1.0" + cssnano "~5.1.14" + loader-utils "^1.4.2" + postcss "^8.4.19" postcss-modules-extract-imports "~3.0.0" postcss-modules-local-by-default "~4.0.0" postcss-modules-scope "~3.0.0" postcss-modules-values "~4.0.0" webpack "~4.44.2" -"@microsoft/sp-diagnostics@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-diagnostics/-/sp-diagnostics-1.16.1.tgz" - integrity sha512-xmMGGzmT2xSLddYZSliDXyq9xAO/cZbiJopFvjEIkX0ottgbudi73TuwaO81d4FGMm7eSEKFXocSBRr1wAxxEg== +"@microsoft/sp-diagnostics@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-diagnostics/-/sp-diagnostics-1.17.4.tgz#921cc20a35566c3ef1322a798ab1c89d260c827c" + integrity sha512-Me8tZWyy66oSwpfRPJPe8Y5pyoBRYHK9BELhveJ42GLILCVWNU8W2As6mn0yfmZzk36UM9nSa7z6yjX0yBz0Aw== dependencies: - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-lodash-subset" "1.16.1" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-lodash-subset" "1.17.4" -"@microsoft/sp-dynamic-data@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.16.1.tgz" - integrity sha512-YmF5Gk/Ttx7W6bwMYmw3I/ZraLSGEWIrKljOl++z5xyxiskMIlAZg2wQxAXu9QLZ1P2DjuYC4ZYSVFByMScC+Q== +"@microsoft/sp-dynamic-data@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.17.4.tgz#c4fb7a41bfc9b38da10dd4eedad9e3fa955bdc79" + integrity sha512-C5+Ei9fRm/O8m9lpAkPKCAcKL9JNR8M89i5zE0uokPDhNndOil59CKrdw9mgsPAr5Eh2vdQ0Z/gNwTOFnbEMhg== dependencies: - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-lodash-subset" "1.16.1" - "@microsoft/sp-module-interfaces" "1.16.1" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-lodash-subset" "1.17.4" + "@microsoft/sp-module-interfaces" "1.17.4" tslib "2.3.1" -"@microsoft/sp-http-base@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-http-base/-/sp-http-base-1.16.1.tgz" - integrity sha512-67ycRRAz19OoKzYgLTYvaZaBnH4yARJYB395ZIbf+QT9eHZLIZoGVxZotNrGQoIyMV3+uazkbyyvEvOGggCeMw== +"@microsoft/sp-http-base@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-http-base/-/sp-http-base-1.17.4.tgz#b7a8f2f34fe38a4a442348473d53ce12c92667e2" + integrity sha512-Yk5tKHX7B52YX9O6mXtA2OFttdS8Ievc3v64i6lZ2tnFw90sZyVFNGEsPOaTSCp/4IEve2CGBJv24Zi6iKPdkA== dependencies: "@azure/msal-browser" "2.28.1" - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-page-context" "1.16.1" - "@microsoft/teams-js" "1.12.1" - "@microsoft/teams-js-v2" "npm:@microsoft/teams-js@2.4.1" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-page-context" "1.17.4" + "@microsoft/teams-js-v2" "npm:@microsoft/teams-js@2.9.1" adal-angular "1.0.16" msal "1.4.17" msalBrowserLegacy "npm:@azure/msal-browser@2.22.0" msalLegacy "npm:msal@1.4.12" tslib "2.3.1" -"@microsoft/sp-http-msgraph@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-http-msgraph/-/sp-http-msgraph-1.16.1.tgz" - integrity sha512-0/KxNJ2Cq8fn6u+uLf5rlLnOu+XIrP3H60lO4haILYYNuG3fJh3aLCiHFLSCv4RatWMjk2e2NeaieD2266yVRQ== +"@microsoft/sp-http-msgraph@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-http-msgraph/-/sp-http-msgraph-1.17.4.tgz#9e327fd5662420d372e9f915c0588bad9e32261d" + integrity sha512-yd34To9rVhfe6J4tD7+zyP1e+DTuR/e43aSLxEzkMhGS1criSIjA84Vjs9WCnwHNtlmi7rBZRe4RqZyHitgfcg== dependencies: "@microsoft/microsoft-graph-clientv1" "npm:@microsoft/microsoft-graph-client@1.7.2-spfx" - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-http-base" "1.16.1" - "@microsoft/sp-loader" "1.16.1" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-http-base" "1.17.4" + "@microsoft/sp-loader" "1.17.4" tslib "2.3.1" -"@microsoft/sp-http@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-http/-/sp-http-1.16.1.tgz" - integrity sha512-wsKyiH1lqCuN7aeHkpc5GWZ+ezIJ4nUT6zQmKgvugayQroOhS/G4caw0FxqBA8Qs+SiUF9FE8plPHyivaA1IZw== +"@microsoft/sp-http@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-http/-/sp-http-1.17.4.tgz#0cfb1c5c7425d667172f23988f2fe41cdc3f9ccf" + integrity sha512-ilWn1R5SXlTIxZscXboKEjHVyv45aQcGgMUVbHS2SJ7QdDBy5YXFye6ClteNHqM661EvJGDJIJtHriFNucmHMQ== dependencies: "@microsoft/microsoft-graph-clientv1" "npm:@microsoft/microsoft-graph-client@1.7.2-spfx" - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-http-base" "1.16.1" - "@microsoft/sp-http-msgraph" "1.16.1" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-http-base" "1.17.4" + "@microsoft/sp-http-msgraph" "1.17.4" tslib "2.3.1" -"@microsoft/sp-image-helper@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-image-helper/-/sp-image-helper-1.16.1.tgz" - integrity sha512-GHc4Wry31s6Y+qS8CVY6gqwCpJwXfAS+uss5ntKBZPBzFKl5qW8HEFAD8SHu9G00zb33LJ+7HHSpcFqZGlD7BQ== - dependencies: - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-http" "1.16.1" - "@microsoft/sp-http-base" "1.16.1" - "@microsoft/sp-loader" "1.16.1" - "@microsoft/sp-lodash-subset" "1.16.1" - "@microsoft/sp-page-context" "1.16.1" +"@microsoft/sp-image-helper@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-image-helper/-/sp-image-helper-1.17.4.tgz#d0a35b4b7c0a4db0a5abe4f3c33ac78b00b98a6d" + integrity sha512-NKhy1RRR8dTsXH9D7a+0Ed+lam0TLpzRRgPmUf1sOG3/2+bRQuvPmPfDvoDQi6gKMDH2QqsjaFL1N6nq7yjiiw== + dependencies: + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-http" "1.17.4" + "@microsoft/sp-http-base" "1.17.4" + "@microsoft/sp-loader" "1.17.4" + "@microsoft/sp-lodash-subset" "1.17.4" + "@microsoft/sp-page-context" "1.17.4" tslib "2.3.1" -"@microsoft/sp-loader@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-loader/-/sp-loader-1.16.1.tgz" - integrity sha512-EEVr5+MbwceQWBUCXXZbaq8yDLyl20W52lt5J8oLkL/Un3i5IphzPwRVx5I7RuhgdIz6MDNpiADXBEu84YpNGw== - dependencies: - "@fluentui/react" "^7.199.1" - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-dynamic-data" "1.16.1" - "@microsoft/sp-http-base" "1.16.1" - "@microsoft/sp-lodash-subset" "1.16.1" - "@microsoft/sp-module-interfaces" "1.16.1" - "@microsoft/sp-odata-types" "1.16.1" - "@microsoft/sp-page-context" "1.16.1" - "@rushstack/loader-raw-script" "1.3.260" +"@microsoft/sp-loader@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-loader/-/sp-loader-1.17.4.tgz#081a0407031ef8bea6b3d19f2d328ecc4e6603ab" + integrity sha512-aIwkYSJPQWNz55VEr7SCrB5nOnluULR9auIp+SrkwVlSuiatUkzLuTQVBn7QEJG/5Vlvd2/i3US/jYsAEZ1yCg== + dependencies: + "@fluentui/react" "^8.106.4" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-dynamic-data" "1.17.4" + "@microsoft/sp-http-base" "1.17.4" + "@microsoft/sp-lodash-subset" "1.17.4" + "@microsoft/sp-module-interfaces" "1.17.4" + "@microsoft/sp-odata-types" "1.17.4" + "@microsoft/sp-page-context" "1.17.4" + "@rushstack/loader-raw-script" "1.3.281" "@types/requirejs" "2.1.29" - office-ui-fabric-react "^7.199.1" raw-loader "~0.5.1" react "17.0.1" react-dom "17.0.1" requirejs "2.3.6" tslib "2.3.1" -"@microsoft/sp-lodash-subset@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.16.1.tgz" - integrity sha512-WRgN4na/lHijQlKAElc+hthtQNMKBbvmWTK7NoQa6D+tOnEc9ay1VCY06NKgGRK8M74xodODjYVO5shRhBFWcw== +"@microsoft/sp-lodash-subset@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.17.4.tgz#976ab9651aaa5db3c21ebb588cbc210c2c9afd28" + integrity sha512-t5A+OxAn6TrMNZUUxhBJiUsBSetpj6K7Sstwac7U9KMZub9KkBw5iUgEBl+C4bfwN2XyIpfVmgY7Jd73/E4j8w== dependencies: "@types/lodash" "4.14.117" tslib "2.3.1" -"@microsoft/sp-module-interfaces@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.16.1.tgz" - integrity sha512-1bSz90Hs50Uf5X44MkHN23QXuybZ0Pz3ZsQ52aJ7C6A79rnZ/yG+JROWmkYNxw2cO1vh0sQZHIWXXndlHC97wQ== +"@microsoft/sp-module-interfaces@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.17.4.tgz#2825f04050fa467ff7f73783ca6f71c7b4e76d88" + integrity sha512-+tVV2O9B5i2RXdziEvg9FnKTBc2FgFn1XxbCfpmUj+F/Gh3PMtG0XyquBFY12jjxObEIv78J0A0fK2x0shZMLw== dependencies: - "@rushstack/node-core-library" "3.52.0" + "@rushstack/node-core-library" "3.55.2" z-schema "4.2.4" -"@microsoft/sp-odata-types@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-odata-types/-/sp-odata-types-1.16.1.tgz" - integrity sha512-rwLz1E6rCb+Bo8xDoPafqn2Y5B92u8+Ruma0Vp0WKeGsP634d9FrvCWISxyYr7IcK3vn6qdoEwCAwpRH4kwnDw== +"@microsoft/sp-odata-types@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-odata-types/-/sp-odata-types-1.17.4.tgz#f347cefa4ac4c8c6833e2f8037350901cda83a39" + integrity sha512-myHLg4+JF+B1o7G/eiQYAS094KMmJm9hxp1pgw7cfPb1dLyz992pWF7nlFSbhZRsVsIwrkiv7bUlToVE8h7e1g== dependencies: tslib "2.3.1" -"@microsoft/sp-office-ui-fabric-core@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-office-ui-fabric-core/-/sp-office-ui-fabric-core-1.16.1.tgz" - integrity sha512-MymuL8DbDT7m5NQS+skMdCmhYTtfmAzdYrdPVjdSBQaFQjHp4IOCqs1Rm81VM8p6zm7Jh2Fxg4fYXDO2OBEmcQ== +"@microsoft/sp-office-ui-fabric-core@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-office-ui-fabric-core/-/sp-office-ui-fabric-core-1.17.4.tgz#740ef2e9338022475bf2ff01501a6f054c78930d" + integrity sha512-LwnRLgXMWLHsr/WoIIdj+g5KNXwHZaCu3Y/sbkDm7LC4r20k25rKDHrT+03tbkgC/Cr/EDQlEYk6kk9/JZo0kQ== dependencies: office-ui-fabric-core "11.0.1" tslib "2.3.1" -"@microsoft/sp-page-context@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.16.1.tgz" - integrity sha512-JUH35LBI0sgPh2zPvD8bEO6K+G3uBegOfYXu1xQq/vZ3xUbl2WiDUHywKBW2A53mROazPJkC1iszf1auPH+mvA== - dependencies: - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-dynamic-data" "1.16.1" - "@microsoft/sp-lodash-subset" "1.16.1" - "@microsoft/sp-odata-types" "1.16.1" +"@microsoft/sp-page-context@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-page-context/-/sp-page-context-1.17.4.tgz#76e4976c8ce2a04806ebfb9d8fa18fbc205c8578" + integrity sha512-Ia1jYIwBhxVsbfsDeaICPpGwu6K2JP3X8Gp0Ye5ku8Ot3H6/rTM5TQZm3C/P0T/JC1wzgBf6/t2DBK47Lbqdkw== + dependencies: + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-dynamic-data" "1.17.4" + "@microsoft/sp-lodash-subset" "1.17.4" + "@microsoft/sp-odata-types" "1.17.4" tslib "2.3.1" -"@microsoft/sp-property-pane@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-property-pane/-/sp-property-pane-1.16.1.tgz" - integrity sha512-6Gs2v1vLjNZCxW6XFjoznkI5klanxQs4bZLvxWQbmOK4PI1UPfWV0Fiej4d1KgYFAnkIktCIEaiX28vlOFo1jQ== - dependencies: - "@fluentui/react" "^7.199.1" - "@microsoft/sp-component-base" "1.16.1" - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-dynamic-data" "1.16.1" - "@microsoft/sp-image-helper" "1.16.1" - "@microsoft/sp-lodash-subset" "1.16.1" - "@microsoft/sp-page-context" "1.16.1" - office-ui-fabric-react "^7.199.1" +"@microsoft/sp-property-pane@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-property-pane/-/sp-property-pane-1.17.4.tgz#ad346e618a8505ec239515bca95250f9acad36a5" + integrity sha512-69VtmRMJ2L8ZT09lFJ8NaaL+qLO9cpjK5rBoDkwROJQJoTW8x1kuIXRB5n2llZGEXcZPgC8DUf/bp1Kw3IFyKA== + dependencies: + "@fluentui/react" "^8.106.4" + "@microsoft/sp-component-base" "1.17.4" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-dynamic-data" "1.17.4" + "@microsoft/sp-image-helper" "1.17.4" + "@microsoft/sp-lodash-subset" "1.17.4" + "@microsoft/sp-page-context" "1.17.4" react "17.0.1" react-dom "17.0.1" tslib "2.3.1" -"@microsoft/sp-top-actions@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-top-actions/-/sp-top-actions-1.16.1.tgz" - integrity sha512-VoT6zmqhRRHAB9gFItwG2OMOpE5nfVy6uaNNolHY8Fi42aQlGD2oPOV3Wu7FyowJUtGIASWJrfCC2vFDCAggeA== - dependencies: - "@microsoft/sp-property-pane" "1.16.1" - -"@microsoft/sp-webpart-base@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/sp-webpart-base/-/sp-webpart-base-1.16.1.tgz" - integrity sha512-eZ2WvFCOoHiUTavgXjAVyj0IxbxG51zA7hRXAYktOfPshrJAy5NQpPM2zdEqToMX4cNlOnjSaOKrk0cB4PS0HA== - dependencies: - "@fluentui/react" "^7.199.1" - "@microsoft/sp-component-base" "1.16.1" - "@microsoft/sp-core-library" "1.16.1" - "@microsoft/sp-diagnostics" "1.16.1" - "@microsoft/sp-dynamic-data" "1.16.1" - "@microsoft/sp-http" "1.16.1" - "@microsoft/sp-http-base" "1.16.1" - "@microsoft/sp-loader" "1.16.1" - "@microsoft/sp-lodash-subset" "1.16.1" - "@microsoft/sp-module-interfaces" "1.16.1" - "@microsoft/sp-page-context" "1.16.1" - "@microsoft/sp-property-pane" "1.16.1" - "@microsoft/sp-top-actions" "1.16.1" - "@microsoft/teams-js" "1.12.1" - "@microsoft/teams-js-v2" "npm:@microsoft/teams-js@2.4.1" +"@microsoft/sp-top-actions@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-top-actions/-/sp-top-actions-1.17.4.tgz#d0395fd423bf7451d6bf934d0ce4a46d5cfe9b1b" + integrity sha512-jSwMihjw218eDq49pT3ac8Av0YwuuxRbFmyK6cFbi35ZcKiUEF6vRDJdyra3Cb3TAW72ubf8LfGwLvJnJpMpOQ== + +"@microsoft/sp-webpart-base@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/sp-webpart-base/-/sp-webpart-base-1.17.4.tgz#9e197ed84e4739880de5028f653bc2dcf9f89235" + integrity sha512-WIlAXml7HlPiqR5EAAYGoqal2it0ce7vqS3ThNr3Ty5bF8nRv4Z9om0fPLd7fLoyFNpY5iX6XrZIZpJIu9xrXQ== + dependencies: + "@fluentui/react" "^8.106.4" + "@microsoft/sp-component-base" "1.17.4" + "@microsoft/sp-core-library" "1.17.4" + "@microsoft/sp-diagnostics" "1.17.4" + "@microsoft/sp-dynamic-data" "1.17.4" + "@microsoft/sp-http" "1.17.4" + "@microsoft/sp-http-base" "1.17.4" + "@microsoft/sp-loader" "1.17.4" + "@microsoft/sp-lodash-subset" "1.17.4" + "@microsoft/sp-module-interfaces" "1.17.4" + "@microsoft/sp-page-context" "1.17.4" + "@microsoft/sp-property-pane" "1.17.4" + "@microsoft/sp-top-actions" "1.17.4" + "@microsoft/teams-js-v2" "npm:@microsoft/teams-js@2.9.1" "@types/office-js" "1.0.36" - office-ui-fabric-react "^7.199.1" react "17.0.1" react-dom "17.0.1" tslib "2.3.1" -"@microsoft/spfx-heft-plugins@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@microsoft/spfx-heft-plugins/-/spfx-heft-plugins-1.16.1.tgz" - integrity sha512-2FdsLiw5kD+nJpVDvD5NAdXOvT0wbUY52Xm9n4ZDV2Cnwv9VQFZ2pf2KU4oGYQO1xII3pOhGhc6tEOO+vgCxRQ== +"@microsoft/spfx-heft-plugins@1.17.4": + version "1.17.4" + resolved "https://registry.yarnpkg.com/@microsoft/spfx-heft-plugins/-/spfx-heft-plugins-1.17.4.tgz#96302a1be762e8275a3d525dd19339f5fc720477" + integrity sha512-BOTYm5H1coXpgp529PbI1XtrNGSI42c2EwxuR48ZThM20N8OagQeto5wpQh4z2wqdUhDpFVLu5gFqAEmG5v1Bg== dependencies: "@azure/storage-blob" "~12.11.0" - "@microsoft/loader-load-themed-styles" "1.9.174" - "@microsoft/rush-lib" "5.79.0" - "@microsoft/sp-css-loader" "1.16.1" - "@microsoft/sp-module-interfaces" "1.16.1" - "@rushstack/heft-config-file" "0.11.0" - "@rushstack/localization-utilities" "0.8.25" - "@rushstack/node-core-library" "3.52.0" - "@rushstack/rig-package" "0.3.15" - "@rushstack/set-webpack-public-path-plugin" "3.3.69" - "@rushstack/terminal" "0.3.75" - "@rushstack/webpack4-localization-plugin" "0.15.25" - "@rushstack/webpack4-module-minifier-plugin" "0.9.31" + "@microsoft/load-themed-styles" "1.10.292" + "@microsoft/loader-load-themed-styles" "2.0.27" + "@microsoft/rush-lib" "5.93.1" + "@microsoft/sp-css-loader" "1.17.4" + "@microsoft/sp-module-interfaces" "1.17.4" + "@rushstack/heft-config-file" "0.11.9" + "@rushstack/localization-utilities" "0.8.46" + "@rushstack/node-core-library" "3.55.2" + "@rushstack/rig-package" "0.3.18" + "@rushstack/set-webpack-public-path-plugin" "3.3.91" + "@rushstack/terminal" "0.5.2" + "@rushstack/webpack4-localization-plugin" "0.17.2" + "@rushstack/webpack4-module-minifier-plugin" "0.9.40" "@types/tapable" "1.0.6" autoprefixer "9.7.1" colors "~1.2.1" copy-webpack-plugin "~6.0.3" - css-loader "~3.2.0" - cssnano "~4.1.10" + css-loader "3.4.2" + cssnano "~5.1.14" express "4.18.1" file-loader "6.1.0" git-repo-info "~2.1.1" @@ -6125,10 +6254,10 @@ jszip "3.5.0" lodash "4.17.21" mime "2.5.2" - postcss-loader "3.0.0" + postcss "^8.4.19" + postcss-loader "^4.2.0" resolve "~1.17.0" - sass "1.44.0" - sass-loader "8.0.2" + sass "1.49.11" source-map "0.6.1" source-map-loader "1.1.3" tapable "1.1.3" @@ -6139,17 +6268,12 @@ webpack-sources "1.4.3" xml "~1.0.1" -"@microsoft/teams-js-v2@npm:@microsoft/teams-js@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@microsoft/teams-js/-/teams-js-2.4.1.tgz" - integrity sha512-rHOVt3Duw1HJrsZq0FO09qMGVGI5eg6hkVKIxsuyJQ5WMPaGMAcF5A0QlXBzVwa9cocNyv8JYeMeJAh+svnLnw== +"@microsoft/teams-js-v2@npm:@microsoft/teams-js@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@microsoft/teams-js/-/teams-js-2.9.1.tgz#b10e3fe812f24cbce87a596fe08fc33e111b96ef" + integrity sha512-+ch8SVKIkZB4anZF05oEbvcyRcEzIVlRlzh5jSxsJ3HjOrJBd1lgfxqz6pkaAEFsAaTBSLkdziN4qtwVp72Gww== dependencies: - debug "4.3.3" - -"@microsoft/teams-js@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@microsoft/teams-js/-/teams-js-1.12.1.tgz" - integrity sha512-BRy6vZOseN9F/MG0NWTojYpenuo9XlZ4AfAvwnsG+C36UDPPgW0skWlZ6ub+7RBPhOHcxz8sNg2uHOdGRebWkQ== + debug "^4.3.3" "@microsoft/teams-js@^2.7.1": version "2.12.0" @@ -6723,6 +6847,11 @@ resolved "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.3.1.tgz" integrity sha512-ukowSvzpZQDUH0Y3znJTsY88HkiGk3Khc0WGpIPhap1xlerieYi27QBg6wx/nTurpWfU6XXXsx9ocxDYCdtw0Q== +"@open-wc/dedupe-mixin@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz#b3c58f8699b197bb5e923d624c720e67c9f324d6" + integrity sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA== + "@open-wc/scoped-elements@^1.2.4": version "1.3.5" resolved "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-1.3.5.tgz" @@ -6731,26 +6860,26 @@ "@open-wc/dedupe-mixin" "^1.3.0" lit-html "^1.0.0" -"@open-wc/scoped-elements@^2.1.3": - version "2.1.4" - resolved "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-2.1.4.tgz" - integrity sha512-KX/bOkcDG9kbBDSmgsbpp40ZjEWxpWNrNRZZVSO0KqBygMfvfiEeVfP16uJp9YyWHi/PVZ/C0aUEgf8Pg1Eq7A== +"@open-wc/scoped-elements@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-wc/scoped-elements/-/scoped-elements-2.2.0.tgz#4d65d7ba796c2bb76ef7934068532ca1795ea7b6" + integrity sha512-Qe+vWsuVHFzUkdChwlmJGuQf9cA3I+QOsSHULV/6qf6wsqLM2/32svNRH+rbBIMwiPEwzZprZlkvkqQRucYnVA== dependencies: "@lit/reactive-element" "^1.0.0" - "@open-wc/dedupe-mixin" "^1.3.0" + "@open-wc/dedupe-mixin" "^1.4.0" "@open-wc/semantic-dom-diff@^0.13.16": version "0.13.21" resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz#718b9ec5f9a98935fc775e577ad094ae8d8b7dea" integrity sha512-BONpjHcGX2zFa9mfnwBCLEmlDsOHzT+j6Qt1yfK3MzFXFtAykfzFjAgaxPetu0YbBlCfXuMlfxI4vlRGCGMvFg== -"@open-wc/semantic-dom-diff@^0.19.7": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.9.tgz#fd27659cbace40c6a59078233f4fa14a308a45b1" - integrity sha512-iUL0OPA6PeLQVEEJ/gsgkEiwOGgK4E1KS//zTB+u+OAh0NifNTfxDxIHQa7rEGvplaq2b2zztT2yyzOzj+MlAA== +"@open-wc/semantic-dom-diff@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.20.0.tgz#3766aa88f67df624db0494adf82c8035216a2493" + integrity sha512-qGHl3nkXluXsjpLY9bSZka/cnlrybPtJMs6RjmV/OP4ID7Gcz1uNWQks05pAhptDB1R47G6PQjdwxG8dXl1zGA== dependencies: "@types/chai" "^4.3.1" - "@web/test-runner-commands" "^0.6.5" + "@web/test-runner-commands" "^0.7.0" "@open-wc/testing-helpers@^1.8.12": version "1.8.12" @@ -6761,28 +6890,28 @@ lit-element "^2.2.1" lit-html "^1.0.0" -"@open-wc/testing-helpers@^2.1.4": - version "2.2.1" - resolved "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-2.2.1.tgz" - integrity sha512-8zuJK7tUQYuXRIC/cVcPbAPOhtBJCe3Jfpk7im7WK0DIAXH9Q/ycB+yu3R8g4BQ31f/FdLjIFRbPZzIU75kkRg== +"@open-wc/testing-helpers@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@open-wc/testing-helpers/-/testing-helpers-2.3.0.tgz#6ee88baaf316a6217c43e7ba536cb187d15cb6f4" + integrity sha512-wkDipkia/OMWq5Z1KkAgvqNLfIOCiPGrrtfoCKuQje8u7F0Bz9Un44EwBtWcCdYtLc40quWP7XFpFsW8poIfUA== dependencies: - "@open-wc/scoped-elements" "^2.1.3" + "@open-wc/scoped-elements" "^2.2.0" lit "^2.0.0" lit-html "^2.0.0" -"@open-wc/testing@3.1.7": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@open-wc/testing/-/testing-3.1.7.tgz#65200c759626d510fda103c3cb4ede6202b1b88b" - integrity sha512-HCS2LuY6hXtEwjqmad+eanId5H7E+3mUi9Z3rjAhH+1DCJ53lUnjzWF1lbCYbREqrdCpmzZvW1t5R3e9gJZSCA== +"@open-wc/testing@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@open-wc/testing/-/testing-3.2.0.tgz#884ca348861a116829ce5657fccff11a1a9a07bd" + integrity sha512-9geTbFq8InbcfniPtS8KCfb5sbQ9WE6QMo1Tli8XMnfllnkZok7Az4kTRAskGQeMeQN/I2I//jE5xY/60qhrHg== dependencies: "@esm-bundle/chai" "^4.3.4-fix.0" "@open-wc/chai-dom-equals" "^0.12.36" - "@open-wc/semantic-dom-diff" "^0.19.7" - "@open-wc/testing-helpers" "^2.1.4" + "@open-wc/semantic-dom-diff" "^0.20.0" + "@open-wc/testing-helpers" "^2.3.0" "@types/chai" "^4.2.11" - "@types/chai-dom" "^0.0.12" + "@types/chai-dom" "^1.11.0" "@types/sinon-chai" "^3.2.3" - chai-a11y-axe "^1.3.2" + chai-a11y-axe "^1.5.0" "@opentelemetry/api@^1.0.1": version "1.4.1" @@ -6817,6 +6946,13 @@ schema-utils "^3.0.0" source-map "^0.7.3" +"@pnpm/crypto.base32-hash@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@pnpm/crypto.base32-hash/-/crypto.base32-hash-1.0.1.tgz#e0eeff4ae736d2a781e41041206a65fe78704ffd" + integrity sha512-pzAXNn6KxTA3kbcI3iEnYs4vtH51XEVqmK/1EiD18MaPKylhqy8UvMJK3zKG+jeP82cqQbozcTGm4yOQ8i3vNw== + dependencies: + rfc4648 "^1.5.1" + "@pnpm/error@1.4.0": version "1.4.0" resolved "https://registry.npmjs.org/@pnpm/error/-/error-1.4.0.tgz" @@ -6890,6 +7026,11 @@ resolved "https://registry.npmjs.org/@pnpm/types/-/types-6.4.0.tgz" integrity sha512-nco4+4sZqNHn60Y4VE/fbtlShCBqipyUO+nKRPvDHqLrecMW9pzHWMVRxk4nrMRoeowj3q0rX3GYRBa8lsHTAg== +"@pnpm/types@8.9.0": + version "8.9.0" + resolved "https://registry.yarnpkg.com/@pnpm/types/-/types-8.9.0.tgz#9636d5f0642793432f72609b79458ca9be049b02" + integrity sha512-3MYHYm8epnciApn6w5Fzx6sepawmsNU7l6lvIq+ER22/DPSrr83YMhU/EQWnf4lORn2YyiXFj0FJSyJzEtIGmw== + "@pnpm/write-project-manifest@1.1.7": version "1.1.7" resolved "https://registry.npmjs.org/@pnpm/write-project-manifest/-/write-project-manifest-1.1.7.tgz" @@ -6992,36 +7133,36 @@ eslint-plugin-react "~7.27.1" eslint-plugin-tsdoc "~0.2.14" -"@rushstack/eslint-config@3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@rushstack/eslint-config/-/eslint-config-3.0.1.tgz" - integrity sha512-9OIB2T6fYsgMNUVGjopgT8NZv7x4shXsq1KqT8fX0VVVzJ6/XA7+nSBXHYFzYH+8Liux7ApdzyaZNxaF0Ex7Sw== +"@rushstack/eslint-config@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-config/-/eslint-config-3.2.0.tgz#8a11617ef054dcbfe108e914c6bcf75dd04c82ff" + integrity sha512-vMFObB/LzlwsVRp1wpUKYCd2OWqFjklg7rm4zu+/GYG1gPDc80uBv3KiROYpW93QVAg1CyNhQY1KbTCMT/I9ZA== dependencies: "@rushstack/eslint-patch" "1.2.0" - "@rushstack/eslint-plugin" "0.10.0" - "@rushstack/eslint-plugin-packlets" "0.5.0" - "@rushstack/eslint-plugin-security" "0.4.0" - "@typescript-eslint/eslint-plugin" "~5.30.3" - "@typescript-eslint/experimental-utils" "~5.30.3" - "@typescript-eslint/parser" "~5.30.3" - "@typescript-eslint/typescript-estree" "~5.30.3" + "@rushstack/eslint-plugin" "0.11.0" + "@rushstack/eslint-plugin-packlets" "0.6.1" + "@rushstack/eslint-plugin-security" "0.5.0" + "@typescript-eslint/eslint-plugin" "~5.38.0" + "@typescript-eslint/experimental-utils" "~5.38.0" + "@typescript-eslint/parser" "~5.38.0" + "@typescript-eslint/typescript-estree" "~5.38.0" eslint-plugin-promise "~6.0.0" eslint-plugin-react "~7.27.1" eslint-plugin-tsdoc "~0.2.16" -"@rushstack/eslint-config@~2.5.0": - version "2.5.4" - resolved "https://registry.npmjs.org/@rushstack/eslint-config/-/eslint-config-2.5.4.tgz" - integrity sha512-URJ2FVRW9I67LKl6Xw9z10CZE7lE3K9z65LQfJiby8zRiOFW9w7OmnwwhEUy8fZomIFL3ua6nT+M5RRFPrppQg== - dependencies: - "@rushstack/eslint-patch" "1.1.3" - "@rushstack/eslint-plugin" "0.8.6" - "@rushstack/eslint-plugin-packlets" "0.3.6" - "@rushstack/eslint-plugin-security" "0.2.6" - "@typescript-eslint/eslint-plugin" "~5.6.0" - "@typescript-eslint/experimental-utils" "~5.6.0" - "@typescript-eslint/parser" "~5.6.0" - "@typescript-eslint/typescript-estree" "~5.6.0" +"@rushstack/eslint-config@~2.6.2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-config/-/eslint-config-2.6.2.tgz#04df09f4f4d1db7de5fe64a3ff6d6dfb93eeeb71" + integrity sha512-EcZENq5HlXe5XN9oFZ90K8y946zBXRgliNhy+378H0oK00v3FYADj8aSisEHS5OWz4HO0hYWe6IU57CNg+syYQ== + dependencies: + "@rushstack/eslint-patch" "1.1.4" + "@rushstack/eslint-plugin" "0.9.1" + "@rushstack/eslint-plugin-packlets" "0.4.1" + "@rushstack/eslint-plugin-security" "0.3.1" + "@typescript-eslint/eslint-plugin" "~5.20.0" + "@typescript-eslint/experimental-utils" "~5.20.0" + "@typescript-eslint/parser" "~5.20.0" + "@typescript-eslint/typescript-estree" "~5.20.0" eslint-plugin-promise "~6.0.0" eslint-plugin-react "~7.27.1" eslint-plugin-tsdoc "~0.2.16" @@ -7031,10 +7172,10 @@ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz" integrity sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A== -"@rushstack/eslint-patch@1.1.3": - version "1.1.3" - resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz" - integrity sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw== +"@rushstack/eslint-patch@1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz#0c8b74c50f29ee44f423f7416829c0bf8bb5eb27" + integrity sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA== "@rushstack/eslint-patch@1.2.0", "@rushstack/eslint-patch@^1.1.0": version "1.2.0" @@ -7049,21 +7190,21 @@ "@rushstack/tree-pattern" "0.2.2" "@typescript-eslint/experimental-utils" "~5.3.0" -"@rushstack/eslint-plugin-packlets@0.3.6": - version "0.3.6" - resolved "https://registry.npmjs.org/@rushstack/eslint-plugin-packlets/-/eslint-plugin-packlets-0.3.6.tgz" - integrity sha512-JGeFxfmu9QJSrAMUrU/m4ctJjFrkkeQmoNaxS7tQSWB6yiQIkXMAgkrzlBozLeyroCm5eKdC1clJPrCKfbzdhw== +"@rushstack/eslint-plugin-packlets@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-plugin-packlets/-/eslint-plugin-packlets-0.4.1.tgz#b4901ea3e143148c28c271597eef4ca6f961b8f4" + integrity sha512-A+mb+45fAUV6SRRlRy5EXrZAHNTnvOO3ONxw0hmRDcvyPAJwoX0ClkKQriz56QQE5SL4sPxhYoqbkoKbBmsxcA== dependencies: - "@rushstack/tree-pattern" "0.2.3" - "@typescript-eslint/experimental-utils" "~5.6.0" + "@rushstack/tree-pattern" "0.2.4" + "@typescript-eslint/experimental-utils" "~5.20.0" -"@rushstack/eslint-plugin-packlets@0.5.0": - version "0.5.0" - resolved "https://registry.npmjs.org/@rushstack/eslint-plugin-packlets/-/eslint-plugin-packlets-0.5.0.tgz" - integrity sha512-I160nHeAGzA0q4g3cR7kiHNgiU1HqrYto52+lEmxLAdbBllqc6IOyiWQfCDb5ug0f+Y8bTwMQHiUrI7XclZB/Q== +"@rushstack/eslint-plugin-packlets@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-plugin-packlets/-/eslint-plugin-packlets-0.6.1.tgz#95f35b52f84b720718995496ff5d0e6a40fca0a8" + integrity sha512-N0GqjUbpQ4X348BTLr+gUGVojFVrXwbT3YQv/5sP5adYzq8bOKarmSHKXpvl4rC4CKPDfdSKxTMPfu3P3CJVSA== dependencies: "@rushstack/tree-pattern" "0.2.4" - "@typescript-eslint/experimental-utils" "~5.30.3" + "@typescript-eslint/experimental-utils" "~5.38.0" "@rushstack/eslint-plugin-security@0.2.4": version "0.2.4" @@ -7073,29 +7214,29 @@ "@rushstack/tree-pattern" "0.2.2" "@typescript-eslint/experimental-utils" "~5.3.0" -"@rushstack/eslint-plugin-security@0.2.6": - version "0.2.6" - resolved "https://registry.npmjs.org/@rushstack/eslint-plugin-security/-/eslint-plugin-security-0.2.6.tgz" - integrity sha512-gicwYhbc3Q5U43U2qmhePLedfF6+mSEjcQ/D+Bq4zQLP7zo9MGTKAeYPnLTq0M7hqoCEeQUFQZvNav+kjue6Nw== +"@rushstack/eslint-plugin-security@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-plugin-security/-/eslint-plugin-security-0.3.1.tgz#78c00056d2e7d56f5cfafd305ce1195260da7e0e" + integrity sha512-LOBJj7SLPkeonBq2CD9cKqujwgc84YXJP18UXmGYl8xE3OM+Fwgnav7GzsakyvkeWJwq7EtpZjjSW8DTpwfA4w== dependencies: - "@rushstack/tree-pattern" "0.2.3" - "@typescript-eslint/experimental-utils" "~5.6.0" + "@rushstack/tree-pattern" "0.2.4" + "@typescript-eslint/experimental-utils" "~5.20.0" -"@rushstack/eslint-plugin-security@0.4.0": - version "0.4.0" - resolved "https://registry.npmjs.org/@rushstack/eslint-plugin-security/-/eslint-plugin-security-0.4.0.tgz" - integrity sha512-jRFtrOnZZcuJ2MRA9RtoeyKiFQ60iKu7SDF1wkc7M9nHL5C1HkFApX6nTlAjY7C5B7UlV+9BP9fDmOJJmB4FSw== +"@rushstack/eslint-plugin-security@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-plugin-security/-/eslint-plugin-security-0.5.0.tgz#39b19c429bd3edbe811bc2ecad59ae9aaae470da" + integrity sha512-qDtij3D2DY8VDHKeUdf+M2SpoctrY+eIA+fJFkpuHP7CTJZLBv5186+oCsJ59lZmKoBFREdgpaV3coXamoT8RQ== dependencies: "@rushstack/tree-pattern" "0.2.4" - "@typescript-eslint/experimental-utils" "~5.30.3" + "@typescript-eslint/experimental-utils" "~5.38.0" -"@rushstack/eslint-plugin@0.10.0": - version "0.10.0" - resolved "https://registry.npmjs.org/@rushstack/eslint-plugin/-/eslint-plugin-0.10.0.tgz" - integrity sha512-39DCBD6s7Y5XQxvcMmitXfupkReGcg0lmtil9mrGHkDoyiUln90sOWtpkSl6LqUrSL3lx7N2wRvJiJlwGIPYFQ== +"@rushstack/eslint-plugin@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-plugin/-/eslint-plugin-0.11.0.tgz#e62fdda532d7cba638c871e20c314765229266c7" + integrity sha512-e8eVBOgb/xkpkgFmPP+oifrqCLh8I5BFI/emB/nf5+WnuS4hsTHkgprCEiJuvkhJRypsWrbchkIda9/1YFadxg== dependencies: "@rushstack/tree-pattern" "0.2.4" - "@typescript-eslint/experimental-utils" "~5.30.3" + "@typescript-eslint/experimental-utils" "~5.38.0" "@rushstack/eslint-plugin@0.8.4": version "0.8.4" @@ -7105,55 +7246,46 @@ "@rushstack/tree-pattern" "0.2.2" "@typescript-eslint/experimental-utils" "~5.3.0" -"@rushstack/eslint-plugin@0.8.6": - version "0.8.6" - resolved "https://registry.npmjs.org/@rushstack/eslint-plugin/-/eslint-plugin-0.8.6.tgz" - integrity sha512-R0gbPI3nz1vRUZddOiwpGtBSQ6FXrnsUpKvKoVkADWhkYmtdi6cU/gpQ6amOa5LhLPhSdQNtkhCB+yhUINKgEg== - dependencies: - "@rushstack/tree-pattern" "0.2.3" - "@typescript-eslint/experimental-utils" "~5.6.0" - -"@rushstack/heft-config-file@0.10.0": - version "0.10.0" - resolved "https://registry.npmjs.org/@rushstack/heft-config-file/-/heft-config-file-0.10.0.tgz" - integrity sha512-+vKbbNSEqZZpnWgH6QazoAOD9l2BEEW4ldTXAdHOr2HFfmT+debTqqib4t4c48+CroSeLcC1j3CwDzv5tBAxYg== +"@rushstack/eslint-plugin@0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-plugin/-/eslint-plugin-0.9.1.tgz#293717950413996bdb036b3644d53bd3953ba037" + integrity sha512-iMfRyk9FE1xdhuenIYwDEjJ67u7ygeFw/XBGJC2j4GHclznHWRfSGiwTeYZ66H74h7NkVTuTp8RYw/x2iDblOA== dependencies: - "@rushstack/node-core-library" "3.52.0" - "@rushstack/rig-package" "0.3.15" - jsonpath-plus "~4.0.0" + "@rushstack/tree-pattern" "0.2.4" + "@typescript-eslint/experimental-utils" "~5.20.0" -"@rushstack/heft-config-file@0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@rushstack/heft-config-file/-/heft-config-file-0.11.0.tgz" - integrity sha512-QyDzzpXIgR5f0Esagm8pV3hlKMmgtV+EJ9RJvMKnWMuj+13FLN0d/ax63NwCRgXfgttpRCmwaJti+igPPsqZfQ== +"@rushstack/heft-config-file@0.11.9": + version "0.11.9" + resolved "https://registry.yarnpkg.com/@rushstack/heft-config-file/-/heft-config-file-0.11.9.tgz#ce9914240a17a2be18a975eb9530568f469d2af2" + integrity sha512-01JFmD+G44v5btO0fVIbVBJCfGWLTN2l4Y/+IVU8D9eR14+wYJjV5CO25uxydDynMr334URFcITuzG21L9L0GA== dependencies: - "@rushstack/node-core-library" "3.52.0" - "@rushstack/rig-package" "0.3.15" + "@rushstack/node-core-library" "3.55.2" + "@rushstack/rig-package" "0.3.18" jsonpath-plus "~4.0.0" -"@rushstack/loader-raw-script@1.3.260": - version "1.3.260" - resolved "https://registry.npmjs.org/@rushstack/loader-raw-script/-/loader-raw-script-1.3.260.tgz" - integrity sha512-BMn1kYvEzZ3aYBWnmDpEtExhlfu72YB9IXvMqbIec7r3LNbxdGnoqU94YYCuGNzXQqtuo+90FtlEHE1+5laWdQ== +"@rushstack/loader-raw-script@1.3.281": + version "1.3.281" + resolved "https://registry.yarnpkg.com/@rushstack/loader-raw-script/-/loader-raw-script-1.3.281.tgz#3f25d8e6d07b66c8461eab97af3e2825b9192b51" + integrity sha512-XEz1ZNTth0bklxK5dF4q+WiVcHFto2hXT4YB+UUkPcnYbQU/z8O1Rh67BrKcmz/8aLjjv3kwuon+4vlkZgappA== dependencies: - loader-utils "~1.1.0" + loader-utils "1.4.2" -"@rushstack/localization-utilities@0.8.25": - version "0.8.25" - resolved "https://registry.npmjs.org/@rushstack/localization-utilities/-/localization-utilities-0.8.25.tgz" - integrity sha512-8LfAEisUTuCrIzgXdO7brZOP33EuKtmoR4jp6jXENDrm55ym9LOUvCHvv6nGEg0X2qhOeDrUT0Qf5/XUU+XfWg== +"@rushstack/localization-utilities@0.8.46": + version "0.8.46" + resolved "https://registry.yarnpkg.com/@rushstack/localization-utilities/-/localization-utilities-0.8.46.tgz#dc9d680c084a321846e7f7a5c7b70fb38628b72c" + integrity sha512-CjSQ+gYSefFLOpulTeoeYfSTqZh84KiCQxcb5BeefChAdhcHpYMVxmLsWQrA0WX2Al1Tw/NZ/QahYytl4E6kXw== dependencies: - "@rushstack/node-core-library" "3.52.0" - "@rushstack/typings-generator" "0.8.1" + "@rushstack/node-core-library" "3.55.2" + "@rushstack/typings-generator" "0.10.2" pseudolocale "~1.1.0" xmldoc "~1.1.2" -"@rushstack/module-minifier@0.1.32": - version "0.1.32" - resolved "https://registry.npmjs.org/@rushstack/module-minifier/-/module-minifier-0.1.32.tgz" - integrity sha512-l5hkU/bK8fQuTEP+lXG9n44wuCQMt+AAzH6v88qzmwd60Y/Vc/aHdOu82TpuhhYdYKlvzSC1kn1fm5aGtRvplw== +"@rushstack/module-minifier@0.1.41": + version "0.1.41" + resolved "https://registry.yarnpkg.com/@rushstack/module-minifier/-/module-minifier-0.1.41.tgz#94fc231dbb8e06d8c086abaa26de51502c9a45c8" + integrity sha512-dvj/QSknUY+Q54Vv398BbX/CynobE2h8V4F/mnWi3nXX848NFOcgGHSe8UhH1cMdsz7EGrBcUG4kJctMvsXJ3A== dependencies: - "@rushstack/worker-pool" "0.1.32" + "@rushstack/worker-pool" "0.1.41" "@types/node" "12.20.24" serialize-javascript "6.0.0" source-map "~0.7.3" @@ -7174,20 +7306,6 @@ timsort "~0.3.0" z-schema "~3.18.3" -"@rushstack/node-core-library@3.52.0": - version "3.52.0" - resolved "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.52.0.tgz" - integrity sha512-Z+MAP//G3rEGZd3JxJcBGcPYJlh8pvPoLMTLa5Sy6FTE6hRPzN+5J8DT7BbTmlqZaL6SZpXF30heRUbnYOvujw== - dependencies: - "@types/node" "12.20.24" - colors "~1.2.1" - fs-extra "~7.0.1" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.17.0" - semver "~7.3.0" - z-schema "~5.0.2" - "@rushstack/node-core-library@3.53.2": version "3.53.2" resolved "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.53.2.tgz" @@ -7202,19 +7320,17 @@ semver "~7.3.0" z-schema "~5.0.2" -"@rushstack/node-core-library@~3.44.1": - version "3.44.3" - resolved "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.44.3.tgz" - integrity sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w== +"@rushstack/node-core-library@3.55.2": + version "3.55.2" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz#d951470bac98171de13a8a351d4537c63fbfd0b6" + integrity sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A== dependencies: - "@types/node" "12.20.24" colors "~1.2.1" fs-extra "~7.0.1" import-lazy "~4.0.0" jju "~1.4.0" - resolve "~1.17.0" + resolve "~1.22.1" semver "~7.3.0" - timsort "~0.3.0" z-schema "~5.0.2" "@rushstack/node-core-library@~3.53.0": @@ -7231,12 +7347,12 @@ semver "~7.3.0" z-schema "~5.0.2" -"@rushstack/package-deps-hash@3.2.51": - version "3.2.51" - resolved "https://registry.npmjs.org/@rushstack/package-deps-hash/-/package-deps-hash-3.2.51.tgz" - integrity sha512-UvbHA/2DpaEDsPmqsoW+RAYu6NhT56KptlBV/2LEeN3IyOvoSexjcG4U/7fbbJIv+ojzlf0r2/oP4C7zzzTJSQ== +"@rushstack/package-deps-hash@4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@rushstack/package-deps-hash/-/package-deps-hash-4.0.8.tgz#f62216c530fa8df2610292c8ed66aa2c1728cedd" + integrity sha512-ad2ZnGWLlcga4GVRVo3mibkTrrnDs8xvABTr79z7zwA43htaVbddwFs3Y+tyqaPo8s92Tqh47jzrGDJTqm6Vyg== dependencies: - "@rushstack/node-core-library" "3.52.0" + "@rushstack/node-core-library" "3.55.2" "@rushstack/rig-package@0.2.12": version "0.2.12" @@ -7246,75 +7362,65 @@ resolve "~1.17.0" strip-json-comments "~3.1.1" -"@rushstack/rig-package@0.3.15": - version "0.3.15" - resolved "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.15.tgz" - integrity sha512-jxVfvO5OnkRlYRhcVDZWvwiI2l4pv37HDJRtyg5HbD8Z/I8Xj32RICgrxS5xMeGGytobrg5S6OfPOHskg7Nw+A== +"@rushstack/rig-package@0.3.18": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.3.18.tgz#2b59eb8ed482e8cd6ad8d396414bf3200efdd682" + integrity sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ== dependencies: - resolve "~1.17.0" + resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/rush-amazon-s3-build-cache-plugin@5.79.0": - version "5.79.0" - resolved "https://registry.npmjs.org/@rushstack/rush-amazon-s3-build-cache-plugin/-/rush-amazon-s3-build-cache-plugin-5.79.0.tgz" - integrity sha512-S+3Ta2dCRB3iyU4WSkTdeztbVfGol0nlhnT7vFfoSfDwAtoBymw3rUhLhA133OvDFPZXzF34c6JUlf5vs+VGkA== +"@rushstack/rush-amazon-s3-build-cache-plugin@5.93.1": + version "5.93.1" + resolved "https://registry.yarnpkg.com/@rushstack/rush-amazon-s3-build-cache-plugin/-/rush-amazon-s3-build-cache-plugin-5.93.1.tgz#f2bdeac2673a451c0e15a629bde6dfab017080c8" + integrity sha512-urEQ+u7oSdfQnbuuVURbTE3RaJVh7rOSyB8RN2xAYh88HveYMeduq3EU5/0afHKnRs/UJG/iwt6EqCbXRR0J+w== dependencies: - "@rushstack/node-core-library" "3.52.0" - "@rushstack/rush-sdk" "5.79.0" + "@rushstack/node-core-library" "3.55.2" + "@rushstack/rush-sdk" "5.93.1" https-proxy-agent "~5.0.0" node-fetch "2.6.7" -"@rushstack/rush-azure-storage-build-cache-plugin@5.79.0": - version "5.79.0" - resolved "https://registry.npmjs.org/@rushstack/rush-azure-storage-build-cache-plugin/-/rush-azure-storage-build-cache-plugin-5.79.0.tgz" - integrity sha512-F7e1P1T9kXXoNa7HRx1VBLjgbUtr4gNPqM53+qH1KA18GFeAY8vsO1TokeWubfGs376KC6bbE5rVWb3k5x+VZw== +"@rushstack/rush-azure-storage-build-cache-plugin@5.93.1": + version "5.93.1" + resolved "https://registry.yarnpkg.com/@rushstack/rush-azure-storage-build-cache-plugin/-/rush-azure-storage-build-cache-plugin-5.93.1.tgz#26ad59b5a93ef95229f6212fead6bf5f5ad6a34a" + integrity sha512-urbl28yUit+GJ4cgU9iAfWEhu6bP0/kdBaQEsOTYoLYRGnF0uBJ6O+46aMOp4WsqxAk+K+xL6ixw1ZE1BTix6g== dependencies: "@azure/identity" "~2.1.0" "@azure/storage-blob" "~12.11.0" - "@rushstack/node-core-library" "3.52.0" - "@rushstack/rush-sdk" "5.79.0" - "@rushstack/terminal" "0.3.74" + "@rushstack/node-core-library" "3.55.2" + "@rushstack/rush-sdk" "5.93.1" + "@rushstack/terminal" "0.5.2" -"@rushstack/rush-sdk@5.79.0": - version "5.79.0" - resolved "https://registry.npmjs.org/@rushstack/rush-sdk/-/rush-sdk-5.79.0.tgz" - integrity sha512-32Z8mmVfhRBxsnzRKGv3YU8Jx6QbllqFkII1pV+t0OAPVaWXggLLRmXYZnUHWp6g8/qASFRqtE8fuUHEwp9Fxg== +"@rushstack/rush-sdk@5.93.1": + version "5.93.1" + resolved "https://registry.yarnpkg.com/@rushstack/rush-sdk/-/rush-sdk-5.93.1.tgz#bd210fdfb058b00cd0ea27ce2cd0dfe31bf1e258" + integrity sha512-rHfGvxyiR6nO5nqruqz/0N3GpAIi4P565FYcadnHsK791ncoh60lBHvQU9b9oRdpZjl2dHjoAQrr+pgSgOY/vw== dependencies: - "@rushstack/node-core-library" "3.52.0" - "@types/node-fetch" "1.6.9" + "@rushstack/node-core-library" "3.55.2" + "@types/node-fetch" "2.6.2" tapable "2.2.1" -"@rushstack/set-webpack-public-path-plugin@3.3.69": - version "3.3.69" - resolved "https://registry.npmjs.org/@rushstack/set-webpack-public-path-plugin/-/set-webpack-public-path-plugin-3.3.69.tgz" - integrity sha512-8TFam4rhzwclWKrxvr5yLwmoL9Pk5vgf0v/ogxEYMr7G2pHhmZIYVePHShO3YnPWvbsIcRhmtu/afY1zg+PvZg== +"@rushstack/set-webpack-public-path-plugin@3.3.91": + version "3.3.91" + resolved "https://registry.yarnpkg.com/@rushstack/set-webpack-public-path-plugin/-/set-webpack-public-path-plugin-3.3.91.tgz#b2ece72b224ee22e4e6740c52b45e8dc3a7aefd7" + integrity sha512-2Bvac24WHZagQC+zLk+eksqxfeX2OhMH+eLPXEWvpuYceWYbqphckGLotj0WeAmSvjNTrTxxDfhTCHTWLIOAjw== dependencies: - "@rushstack/webpack-plugin-utilities" "0.1.36" + "@rushstack/webpack-plugin-utilities" "0.1.56" -"@rushstack/stream-collator@4.0.205": - version "4.0.205" - resolved "https://registry.npmjs.org/@rushstack/stream-collator/-/stream-collator-4.0.205.tgz" - integrity sha512-FbZDCLMwGFiOVP16U40Do+EjCFzbpIZNpbkihyEMsp6o8FGdS5At3DNLPKPgYLqyiSCxPxvA2a6bMr4yNDVtlA== +"@rushstack/stream-collator@4.0.227": + version "4.0.227" + resolved "https://registry.yarnpkg.com/@rushstack/stream-collator/-/stream-collator-4.0.227.tgz#d434c2ae867023cc8581012270d1886086522815" + integrity sha512-SLHwjWqUlEfqA6KfLkSmZSr28/2Z5BxWnqtXqtLDFndZUuHUiUDg85w8GtS9MyZXMOfAjj9pS7Xi764bjsOKBA== dependencies: - "@rushstack/node-core-library" "3.52.0" - "@rushstack/terminal" "0.3.74" + "@rushstack/node-core-library" "3.55.2" + "@rushstack/terminal" "0.5.2" -"@rushstack/terminal@0.3.74": - version "0.3.74" - resolved "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.3.74.tgz" - integrity sha512-TXaHzq7HS0qickNjzAAZBhdWQwPaNtL4snJx+SKb3d6NxA+dWm+Tx0hIyo5CSgsTyLa0VD/9BBCDGJ3n1Qqbdw== - dependencies: - "@rushstack/node-core-library" "3.52.0" - "@types/node" "12.20.24" - wordwrap "~1.0.0" - -"@rushstack/terminal@0.3.75": - version "0.3.75" - resolved "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.3.75.tgz" - integrity sha512-2IT6Pv8B2s8cOae2UjFeE1S4JfEQuS3om1AbZAI3wmzTSjEqXKj6m5hPnjDW8Gzbi9gBctcDD6Zj5Oq7afqsyw== +"@rushstack/terminal@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.5.2.tgz#23a1866e4949fa8a882da530bc4d5cb136031adf" + integrity sha512-zyzUQLUkDhRdKIvEk94WforJHCITedizbr1215pSONRwWS8MQEMTcDY+dBz+U8Ar4s/4oJAtFuT5cHP/uTYYdw== dependencies: - "@rushstack/node-core-library" "3.52.0" - "@types/node" "12.20.24" + "@rushstack/node-core-library" "3.55.2" wordwrap "~1.0.0" "@rushstack/tree-pattern@0.2.2": @@ -7322,20 +7428,15 @@ resolved "https://registry.npmjs.org/@rushstack/tree-pattern/-/tree-pattern-0.2.2.tgz" integrity sha512-0KdqI7hGtVIlxobOBLWet0WGiD70V/QoYQr5A2ikACeQmIaN4WT6Fn9BcvgwgaSIMcazEcD8ql7Fb9N4dKdQlA== -"@rushstack/tree-pattern@0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@rushstack/tree-pattern/-/tree-pattern-0.2.3.tgz" - integrity sha512-8KWZxzn6XKuy3iKRSAd2CHXSXneRlGCmH9h/qM7jYQDekp+U18oUzub5xqOqHS2PLUC+torOMYZxgAIO/fF86A== - "@rushstack/tree-pattern@0.2.4": version "0.2.4" resolved "https://registry.npmjs.org/@rushstack/tree-pattern/-/tree-pattern-0.2.4.tgz" integrity sha512-H8i0OinWsdKM1TKEKPeRRTw85e+/7AIFpxm7q1blceZJhuxRBjCGAUZvQXZK4CMLx75xPqh/h1t5WHwFmElAPA== -"@rushstack/ts-command-line@4.12.3": - version "4.12.3" - resolved "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.3.tgz" - integrity sha512-Pdij22RotMXzI+HWHyYCvw0RMZhiP5a6Za/96XamZ1+mxmpSm4ujf8TROKxGAHySmR5A8iNVSlzhNMnUlFQE6g== +"@rushstack/ts-command-line@4.13.2": + version "4.13.2" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz#2dfdcf418d58256671433b1da4a3b67e1814cc7a" + integrity sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag== dependencies: "@types/argparse" "1.0.38" argparse "~1.0.9" @@ -7352,49 +7453,47 @@ colors "~1.2.1" string-argv "~0.3.1" -"@rushstack/typings-generator@0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@rushstack/typings-generator/-/typings-generator-0.8.1.tgz" - integrity sha512-K0KtbA7HNAzZaf4A8olDhlX9stwA+CFrG7PTlmw3sZq3UWXZzbEu2ExG1LemMqjpsDwgDWbLHYCFTlU+KJoXyQ== +"@rushstack/typings-generator@0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@rushstack/typings-generator/-/typings-generator-0.10.2.tgz#89560ed8dc302af92371657c70c0bf4db2dcc621" + integrity sha512-0T0dkv3QNnpGLHjdogn+7wTw+4aRJVlMPIpWIr30DlGQ62XxcbP5sVUN45JcWRtYXriUurXi9dgzSQZv94nJwg== dependencies: - "@rushstack/node-core-library" "3.52.0" - "@types/node" "12.20.24" + "@rushstack/node-core-library" "3.55.2" chokidar "~3.4.0" glob "~7.0.5" -"@rushstack/webpack-plugin-utilities@0.1.36": - version "0.1.36" - resolved "https://registry.npmjs.org/@rushstack/webpack-plugin-utilities/-/webpack-plugin-utilities-0.1.36.tgz" - integrity sha512-Q58FIZ1rTCPtcQltWUtGrHK8vo0plZL74IMHD/5DK1AM6/sf2xisNJZi2gZtl9Brg8OAJTlZkSp6uoLScXE7Ew== +"@rushstack/webpack-plugin-utilities@0.1.56": + version "0.1.56" + resolved "https://registry.yarnpkg.com/@rushstack/webpack-plugin-utilities/-/webpack-plugin-utilities-0.1.56.tgz#bd4b986b7e28388026940bef5f869b448f6426ae" + integrity sha512-PaSnWl0rU0CqB8PYh6ATBkM94FlC37tDm904ywBADPeQj/ZiykaIHhRLeFz93vcUBsJvmofFScMYHuPhpNx2qA== -"@rushstack/webpack4-localization-plugin@0.15.25": - version "0.15.25" - resolved "https://registry.npmjs.org/@rushstack/webpack4-localization-plugin/-/webpack4-localization-plugin-0.15.25.tgz" - integrity sha512-Drha8bEGrWb+PfX61hQcqcDeAgTs6RZQ+sD7iL1oaR5XnL1F8DSr/BCY3b1JdfKjGz+z5H/sJccbppUITsKawg== +"@rushstack/webpack4-localization-plugin@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@rushstack/webpack4-localization-plugin/-/webpack4-localization-plugin-0.17.2.tgz#e96823b9dfd7b2dc38f5fd6d68e542c3c8a5452c" + integrity sha512-CRVWQUPqtXPvpGkCC5OYRVdDM9iVCK7NO294MNx0LG8P7+b24M0o9a8hvYAv8802gyONdkEDvObT29RvhwQYhA== dependencies: - "@rushstack/localization-utilities" "0.8.25" - "@rushstack/node-core-library" "3.52.0" - "@types/node" "12.20.24" + "@rushstack/localization-utilities" "0.8.46" + "@rushstack/node-core-library" "3.55.2" "@types/tapable" "1.0.6" - loader-utils "~1.1.0" + loader-utils "1.4.2" lodash "~4.17.15" minimatch "~3.0.3" -"@rushstack/webpack4-module-minifier-plugin@0.9.31": - version "0.9.31" - resolved "https://registry.npmjs.org/@rushstack/webpack4-module-minifier-plugin/-/webpack4-module-minifier-plugin-0.9.31.tgz" - integrity sha512-LZpqwVChZGBoc0ttdKLe07R2RlIIprYyuZuBkUlXdhhEu8Brob+k8Ign6+kg4fBF9G6W/db2OMSPZ0jh0ipzqw== +"@rushstack/webpack4-module-minifier-plugin@0.9.40": + version "0.9.40" + resolved "https://registry.yarnpkg.com/@rushstack/webpack4-module-minifier-plugin/-/webpack4-module-minifier-plugin-0.9.40.tgz#5b7a7a04324cbcb68745b8f329a91ce605811596" + integrity sha512-QOoeFPTPlKaIkMBTB/zqYZGbvVYAc07/xRQlGTSEwDY07IbIXy/HEq8vvMXAXGtofqBVP8s8wZtfR6z0kAt9Xw== dependencies: - "@rushstack/module-minifier" "0.1.32" - "@rushstack/worker-pool" "0.1.32" + "@rushstack/module-minifier" "0.1.41" + "@rushstack/worker-pool" "0.1.41" "@types/node" "12.20.24" "@types/tapable" "1.0.6" tapable "1.1.3" -"@rushstack/worker-pool@0.1.32": - version "0.1.32" - resolved "https://registry.npmjs.org/@rushstack/worker-pool/-/worker-pool-0.1.32.tgz" - integrity sha512-HtajFVo6OPnYGT9eP0QOVwoP3AdNwvEnlQ/bkgLdY8oLuDqxx2vywO3qW7rA5OqRSH4GQyIwBf1LVVSslisZ3A== +"@rushstack/worker-pool@0.1.41": + version "0.1.41" + resolved "https://registry.yarnpkg.com/@rushstack/worker-pool/-/worker-pool-0.1.41.tgz#d07edecac9f3f6b2100ded626140ce2a1b2e3cd5" + integrity sha512-n2NC9Pr/VLs2iYNA4oB+/usl5iBIu0n3s3Mf4DT4UHSREJz8NJuxtGgLxCsJgINkCGz2VSEImZniNeIkNF1jpQ== dependencies: "@types/node" "12.20.24" @@ -8203,17 +8302,6 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/storybook-deployer@^2.8.10": - version "2.8.16" - resolved "https://registry.npmjs.org/@storybook/storybook-deployer/-/storybook-deployer-2.8.16.tgz" - integrity sha512-DRQrjyLKaRLXMYo7SNUznyGabtOLJ0b9yfBKNVMu6PsUHJifGPabXuNXmRPZ6qvyhHUSKLQgeLaX8L3Og6uFUg== - dependencies: - git-url-parse "^12.0.0" - glob "^7.1.3" - parse-repo "^1.0.4" - shelljs "^0.8.1" - yargs "^15.0.0" - "@storybook/telemetry@6.5.16": version "6.5.16" resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.16.tgz" @@ -8719,10 +8807,10 @@ resolved "https://registry.npmjs.org/@types/caniuse-api/-/caniuse-api-3.0.2.tgz" integrity sha512-YfCDMn7R59n7GFFfwjPAM0zLJQy4UvveC32rOJBmTqJJY8uSRqM4Dc7IJj8V9unA48Qy4nj5Bj3jD6Q8VZ1Seg== -"@types/chai-dom@^0.0.12": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@types/chai-dom/-/chai-dom-0.0.12.tgz#fdd7a52bed4dd235ed1c94d3d2d31d4e7db1d03a" - integrity sha512-4rE7sDw713cV61TYzQbMrPjC4DjNk3x4vk9nAVRNXcSD4p0/5lEEfm0OgoCz5eNuWUXNKA0YiKiH/JDTuKivkA== +"@types/chai-dom@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@types/chai-dom/-/chai-dom-1.11.0.tgz#e9bd01f3408b2ffd27755fe4418ff92ffd8f4e66" + integrity sha512-Aja99Mmnny+Sz+T2hBK3oEsrcy18yabplT0pGX/QwIke9jMJHdvHlV2f4Tmq5SqxTMYwt1Zjbisv/4r83EUIHw== dependencies: "@types/chai" "*" @@ -8828,6 +8916,11 @@ "@types/eslint" "*" "@types/estree" "*" +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": version "8.40.2" resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.2.tgz" @@ -9011,7 +9104,7 @@ resolved "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.3.tgz" integrity sha512-Opp1LvvEuZdk8fSSvchK2mZwhVrsNT0JgJE9Di6MjnaIpmEXM8TLCPPrVtNTYh8+5MPdY8j9bAHMu2SSfwpZJg== -"@types/jest@*", "@types/jest@^29.2.4": +"@types/jest@*": version "29.5.0" resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz" integrity sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg== @@ -9035,6 +9128,14 @@ jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" +"@types/jest@^29.5.2": + version "29.5.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" + integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/jsdom@^20.0.0": version "20.0.1" resolved "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz" @@ -9049,6 +9150,11 @@ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.3": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" @@ -9142,6 +9248,11 @@ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz" integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== +"@types/lodash@^4.14.72": + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== + "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" @@ -9184,12 +9295,13 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== -"@types/node-fetch@1.6.9": - version "1.6.9" - resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-1.6.9.tgz" - integrity sha512-n2r6WLoY7+uuPT7pnEtKJCmPUGyJ+cbyBR8Avnu4+m1nzz7DwBVuyIvvlBzCZ/nrpC7rIgb3D6pNavL7rFEa9g== +"@types/node-fetch@2.6.2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" + form-data "^3.0.0" "@types/node-fetch@^2.5.0", "@types/node-fetch@^2.5.7": version "2.6.3" @@ -9333,12 +9445,12 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@16.9.8": - version "16.9.8" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz" - integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== +"@types/react-dom@17.0.17": + version "17.0.17" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.17.tgz#2e3743277a793a96a99f1bf87614598289da68a1" + integrity sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg== dependencies: - "@types/react" "*" + "@types/react" "^17" "@types/react-dom@^17.0.0": version "17.0.19" @@ -9380,13 +9492,14 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@16.9.36": - version "16.9.36" - resolved "https://registry.npmjs.org/@types/react/-/react-16.9.36.tgz" - integrity sha512-mGgUb/Rk/vGx4NCvquRuSH0GHBQKb1OqpGS9cT9lFxlTLHZgkksgI60TuIxubmn7JuCb+sENHhQciqa0npm0AQ== +"@types/react@17.0.45": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.45.tgz#9b3d5b661fd26365fefef0e766a1c6c30ccf7b3f" + integrity sha512-YfhQ22Lah2e3CHPsb93tRwIGNiSwkuz1/blk4e6QrWS0jQzCSNbGLtOEYhPg02W0yGTTmpajp7dCTbBAMN3qsg== dependencies: "@types/prop-types" "*" - csstype "^2.2.0" + "@types/scheduler" "*" + csstype "^3.0.2" "@types/react@^17.0.0": version "17.0.53" @@ -9621,25 +9734,15 @@ dependencies: "@types/node" "*" -"@types/webpack-env@1.13.1": - version "1.13.1" - resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.1.tgz" - integrity sha512-oHyg0NssP2RCpCvE35hhbSqMJRsc5lSW+GFe+Vc65JL+kHII1VMYM+0KeV/z4utFuUqPoQRmq8KMMp7ba0dj6Q== - -"@types/webpack-env@1.16.0": - version "1.16.0" - resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.0.tgz" - integrity sha512-Fx+NpfOO0CpeYX2g9bkvX8O5qh9wrU1sOF4g8sft4Mu7z+qfe387YlyY8w8daDyDsKY5vUxM0yxkAYnbkRbZEw== - "@types/webpack-env@^1.13.9", "@types/webpack-env@^1.16.0": version "1.18.0" resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz" integrity sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg== -"@types/webpack-env@~1.16.1": - version "1.16.4" - resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.4.tgz" - integrity sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw== +"@types/webpack-env@~1.15.2": + version "1.15.3" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.3.tgz#fb602cd4c2f0b7c0fb857e922075fdf677d25d84" + integrity sha512-5oiXqR7kwDGZ6+gmzIO2lTC+QsriNuQXZDWNYRV3l2XRN/zmPgnC21DLSx2D05zvD8vnXW6qUg7JnXZ4I6qLVQ== "@types/webpack-sources@*": version "3.2.0" @@ -9752,14 +9855,17 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin-tslint@^5.54.0": - version "5.59.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-5.59.0.tgz" - integrity sha512-VJdeotKSccGWDnqRvMB8w3uq5hglnY2Q5Iwd91DjXHtGwfi1GJIIO4iCuqnGmlPbmVwddjooT7CnnZbgngEtWA== +"@typescript-eslint/eslint-plugin@^2.10.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== dependencies: - "@typescript-eslint/utils" "5.59.0" + "@typescript-eslint/experimental-utils" "2.34.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" -"@typescript-eslint/eslint-plugin@^2.10.0", "@typescript-eslint/eslint-plugin@^5.5.0", "@typescript-eslint/eslint-plugin@^5.54.0", "@typescript-eslint/eslint-plugin@^5.59.0", "@typescript-eslint/eslint-plugin@~5.30.3", "@typescript-eslint/eslint-plugin@~5.6.0": +"@typescript-eslint/eslint-plugin@^5.5.0": version "5.59.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz" integrity sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw== @@ -9775,12 +9881,93 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@5.30.7", "@typescript-eslint/experimental-utils@~5.30.3": - version "5.30.7" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.30.7.tgz" - integrity sha512-r218ZVL0zFBYzEq8/9K2ZhRgsmKUhm8xd3sWChgvTbmP98kHGuY83IUl64SS9fx9OSBM9vMLdzBfox4eDdm/ZQ== +"@typescript-eslint/eslint-plugin@^5.60.0": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz#81382d6ecb92b8dda70e91f9035611cb2fecd1c3" + integrity sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw== dependencies: - "@typescript-eslint/utils" "5.30.7" + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.60.1" + "@typescript-eslint/type-utils" "5.60.1" + "@typescript-eslint/utils" "5.60.1" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/eslint-plugin@~5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz#022531a639640ff3faafaf251d1ce00a2ef000a1" + integrity sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q== + dependencies: + "@typescript-eslint/scope-manager" "5.20.0" + "@typescript-eslint/type-utils" "5.20.0" + "@typescript-eslint/utils" "5.20.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/eslint-plugin@~5.38.0": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz#9f05d42fa8fb9f62304cc2f5c2805e03c01c2620" + integrity sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ== + dependencies: + "@typescript-eslint/scope-manager" "5.38.1" + "@typescript-eslint/type-utils" "5.38.1" + "@typescript-eslint/utils" "5.38.1" + debug "^4.3.4" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/eslint-plugin@~5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz#efd8668b3d6627c46ce722c2afe813928fe120a0" + integrity sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA== + dependencies: + "@typescript-eslint/experimental-utils" "5.6.0" + "@typescript-eslint/scope-manager" "5.6.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@5.38.1", "@typescript-eslint/experimental-utils@~5.38.0": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.38.1.tgz#d9ed618ea65b38e98cf4a84b87aaf6af928a6a1e" + integrity sha512-Zv0EcU0iu64DiVG3pRZU0QYCgANO//U1fS3oEs3eqHD1eIVVcQsFd/T01ckaNbL2H2aCqRojY2xZuMAPcOArEA== + dependencies: + "@typescript-eslint/utils" "5.38.1" + +"@typescript-eslint/experimental-utils@5.6.0", "@typescript-eslint/experimental-utils@~5.6.0": + version "5.6.0" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz" + integrity sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.6.0" + "@typescript-eslint/types" "5.6.0" + "@typescript-eslint/typescript-estree" "5.6.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" "@typescript-eslint/experimental-utils@^5.0.0": version "5.55.0" @@ -9789,6 +9976,13 @@ dependencies: "@typescript-eslint/utils" "5.55.0" +"@typescript-eslint/experimental-utils@~5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.20.0.tgz#7ed593bed40424d9c4160f3f86c3f6f56d6c87af" + integrity sha512-w5qtx2Wr9x13Dp/3ic9iGOGmVXK5gMwyc8rwVgZU46K9WTjPZSyPvdER9Ycy+B5lNHvoz+z2muWhUvlTpQeu+g== + dependencies: + "@typescript-eslint/utils" "5.20.0" + "@typescript-eslint/experimental-utils@~5.3.0": version "5.3.1" resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz" @@ -9801,19 +9995,17 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/experimental-utils@~5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz" - integrity sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA== +"@typescript-eslint/parser@^2.10.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.6.0" - "@typescript-eslint/types" "5.6.0" - "@typescript-eslint/typescript-estree" "5.6.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-visitor-keys "^1.1.0" -"@typescript-eslint/parser@^2.10.0", "@typescript-eslint/parser@^5.5.0", "@typescript-eslint/parser@^5.54.0", "@typescript-eslint/parser@^5.59.0", "@typescript-eslint/parser@~5.30.3", "@typescript-eslint/parser@~5.6.0": +"@typescript-eslint/parser@^5.5.0": version "5.59.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz" integrity sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w== @@ -9823,6 +10015,54 @@ "@typescript-eslint/typescript-estree" "5.59.0" debug "^4.3.4" +"@typescript-eslint/parser@^5.60.0": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.1.tgz#0f2f58209c0862a73e3d5a56099abfdfa21d0fd3" + integrity sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q== + dependencies: + "@typescript-eslint/scope-manager" "5.60.1" + "@typescript-eslint/types" "5.60.1" + "@typescript-eslint/typescript-estree" "5.60.1" + debug "^4.3.4" + +"@typescript-eslint/parser@~5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.20.0.tgz#4991c4ee0344315c2afc2a62f156565f689c8d0b" + integrity sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w== + dependencies: + "@typescript-eslint/scope-manager" "5.20.0" + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/typescript-estree" "5.20.0" + debug "^4.3.2" + +"@typescript-eslint/parser@~5.38.0": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.38.1.tgz#c577f429f2c32071b92dff4af4f5fbbbd2414bd0" + integrity sha512-LDqxZBVFFQnQRz9rUZJhLmox+Ep5kdUmLatLQnCRR6523YV+XhRjfYzStQ4MheFA8kMAfUlclHSbu+RKdRwQKw== + dependencies: + "@typescript-eslint/scope-manager" "5.38.1" + "@typescript-eslint/types" "5.38.1" + "@typescript-eslint/typescript-estree" "5.38.1" + debug "^4.3.4" + +"@typescript-eslint/parser@~5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.6.0.tgz#11677324659641400d653253c03dcfbed468d199" + integrity sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ== + dependencies: + "@typescript-eslint/scope-manager" "5.6.0" + "@typescript-eslint/types" "5.6.0" + "@typescript-eslint/typescript-estree" "5.6.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz#79c7fb8598d2942e45b3c881ced95319818c7980" + integrity sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg== + dependencies: + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/visitor-keys" "5.20.0" + "@typescript-eslint/scope-manager@5.3.1": version "5.3.1" resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz" @@ -9831,13 +10071,13 @@ "@typescript-eslint/types" "5.3.1" "@typescript-eslint/visitor-keys" "5.3.1" -"@typescript-eslint/scope-manager@5.30.7": - version "5.30.7" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz" - integrity sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw== +"@typescript-eslint/scope-manager@5.38.1": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz#f87b289ef8819b47189351814ad183e8801d5764" + integrity sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ== dependencies: - "@typescript-eslint/types" "5.30.7" - "@typescript-eslint/visitor-keys" "5.30.7" + "@typescript-eslint/types" "5.38.1" + "@typescript-eslint/visitor-keys" "5.38.1" "@typescript-eslint/scope-manager@5.55.0": version "5.55.0" @@ -9863,6 +10103,33 @@ "@typescript-eslint/types" "5.6.0" "@typescript-eslint/visitor-keys" "5.6.0" +"@typescript-eslint/scope-manager@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz#35abdb47f500c68c08f2f2b4f22c7c79472854bb" + integrity sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ== + dependencies: + "@typescript-eslint/types" "5.60.1" + "@typescript-eslint/visitor-keys" "5.60.1" + +"@typescript-eslint/type-utils@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz#151c21cbe9a378a34685735036e5ddfc00223be3" + integrity sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw== + dependencies: + "@typescript-eslint/utils" "5.20.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/type-utils@5.38.1": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz#7f038fcfcc4ade4ea76c7c69b2aa25e6b261f4c1" + integrity sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw== + dependencies: + "@typescript-eslint/typescript-estree" "5.38.1" + "@typescript-eslint/utils" "5.38.1" + debug "^4.3.4" + tsutils "^3.21.0" + "@typescript-eslint/type-utils@5.59.0": version "5.59.0" resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz" @@ -9873,15 +10140,30 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz#17770540e98d65ab4730c7aac618003f702893f4" + integrity sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A== + dependencies: + "@typescript-eslint/typescript-estree" "5.60.1" + "@typescript-eslint/utils" "5.60.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.20.0.tgz#fa39c3c2aa786568302318f1cb51fcf64258c20c" + integrity sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg== + "@typescript-eslint/types@5.3.1": version "5.3.1" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz" integrity sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ== -"@typescript-eslint/types@5.30.7": - version "5.30.7" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz" - integrity sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg== +"@typescript-eslint/types@5.38.1": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.38.1.tgz#74f9d6dcb8dc7c58c51e9fbc6653ded39e2e225c" + integrity sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg== "@typescript-eslint/types@5.55.0": version "5.55.0" @@ -9898,6 +10180,37 @@ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz" integrity sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA== +"@typescript-eslint/types@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.1.tgz#a17473910f6b8d388ea83c9d7051af89c4eb7561" + integrity sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg== + +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@5.20.0", "@typescript-eslint/typescript-estree@~5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz#ab73686ab18c8781bbf249c9459a55dc9417d6b0" + integrity sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w== + dependencies: + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/visitor-keys" "5.20.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + "@typescript-eslint/typescript-estree@5.3.1": version "5.3.1" resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz" @@ -9911,13 +10224,13 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.30.7", "@typescript-eslint/typescript-estree@~5.30.3": - version "5.30.7" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz" - integrity sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA== +"@typescript-eslint/typescript-estree@5.38.1", "@typescript-eslint/typescript-estree@~5.38.0": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz#657d858d5d6087f96b638ee383ee1cff52605a1e" + integrity sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g== dependencies: - "@typescript-eslint/types" "5.30.7" - "@typescript-eslint/visitor-keys" "5.30.7" + "@typescript-eslint/types" "5.38.1" + "@typescript-eslint/visitor-keys" "5.38.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -9963,15 +10276,40 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.30.7": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.7.tgz#7135be070349e9f7caa262b0ca59dc96123351bb" - integrity sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ== +"@typescript-eslint/typescript-estree@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz#8c71824b7165b64d5ebd7aa42968899525959834" + integrity sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw== + dependencies: + "@typescript-eslint/types" "5.60.1" + "@typescript-eslint/visitor-keys" "5.60.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.20.0.tgz#b8e959ed11eca1b2d5414e12417fd94cae3517a5" + integrity sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.20.0" + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/typescript-estree" "5.20.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/utils@5.38.1": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.38.1.tgz#e3ac37d7b33d1362bb5adf4acdbe00372fb813ef" + integrity sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.30.7" - "@typescript-eslint/types" "5.30.7" - "@typescript-eslint/typescript-estree" "5.30.7" + "@typescript-eslint/scope-manager" "5.38.1" + "@typescript-eslint/types" "5.38.1" + "@typescript-eslint/typescript-estree" "5.38.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -10003,6 +10341,28 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.1.tgz#6861ebedbefba1ac85482d2bdef6f2ff1eb65b80" + integrity sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.60.1" + "@typescript-eslint/types" "5.60.1" + "@typescript-eslint/typescript-estree" "5.60.1" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz#70236b5c6b67fbaf8b2f58bf3414b76c1e826c2a" + integrity sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg== + dependencies: + "@typescript-eslint/types" "5.20.0" + eslint-visitor-keys "^3.0.0" + "@typescript-eslint/visitor-keys@5.3.1": version "5.3.1" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz" @@ -10011,12 +10371,12 @@ "@typescript-eslint/types" "5.3.1" eslint-visitor-keys "^3.0.0" -"@typescript-eslint/visitor-keys@5.30.7": - version "5.30.7" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz" - integrity sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw== +"@typescript-eslint/visitor-keys@5.38.1": + version "5.38.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz#508071bfc6b96d194c0afe6a65ad47029059edbc" + integrity sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA== dependencies: - "@typescript-eslint/types" "5.30.7" + "@typescript-eslint/types" "5.38.1" eslint-visitor-keys "^3.3.0" "@typescript-eslint/visitor-keys@5.55.0": @@ -10043,7 +10403,15 @@ "@typescript-eslint/types" "5.6.0" eslint-visitor-keys "^3.0.0" -"@uifabric/foundation@^7.10.16", "@uifabric/foundation@^7.10.3": +"@typescript-eslint/visitor-keys@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz#19a877358bf96318ec35d90bfe6bd1445cce9434" + integrity sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw== + dependencies: + "@typescript-eslint/types" "5.60.1" + eslint-visitor-keys "^3.3.0" + +"@uifabric/foundation@^7.10.16": version "7.10.16" resolved "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.10.16.tgz" integrity sha512-x13xS9aKh6FEWsyQP2jrjyiXmUUdgyuAfWKMLhUTK4Rsc+vJANwwVk4fqGsU021WA6pghcIirvEVpWf5MlykDQ== @@ -10054,7 +10422,7 @@ "@uifabric/utilities" "^7.38.2" tslib "^1.10.0" -"@uifabric/icons@^7.7.2", "@uifabric/icons@^7.9.5": +"@uifabric/icons@^7.9.5": version "7.9.5" resolved "https://registry.npmjs.org/@uifabric/icons/-/icons-7.9.5.tgz" integrity sha512-0e2fEURtR7sNqoGr9gU/pzcOp24B/Lkdc05s1BSnIgXlaL2QxRszfaEsl3/E9vsNmqA3tvRwDJWbtRolDbjCpQ== @@ -10072,7 +10440,7 @@ "@uifabric/set-version" "^7.0.24" tslib "^1.10.0" -"@uifabric/react-hooks@^7.13.12", "@uifabric/react-hooks@^7.14.2", "@uifabric/react-hooks@^7.16.4": +"@uifabric/react-hooks@^7.13.12", "@uifabric/react-hooks@^7.16.4": version "7.16.4" resolved "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.16.4.tgz" integrity sha512-k8RJYTMICWA6varT5Y+oCf2VDHHXN0tC2GuPD4I2XqYCTLaXtNCm4+dMcVA2x8mv1HIO7khvm/8aqKheU/tDfQ== @@ -10089,7 +10457,7 @@ dependencies: tslib "^1.10.0" -"@uifabric/styling@^7.20.2", "@uifabric/styling@^7.25.1": +"@uifabric/styling@^7.25.1": version "7.25.1" resolved "https://registry.npmjs.org/@uifabric/styling/-/styling-7.25.1.tgz" integrity sha512-bd4QDYyb0AS0+KmzrB8VsAfOkxZg0dpEpF1YN5Ben10COmT8L1DoE4bEF5NvybHEaoTd3SKxpJ42m+ceNzehSw== @@ -10101,7 +10469,7 @@ "@uifabric/utilities" "^7.38.2" tslib "^1.10.0" -"@uifabric/utilities@^7.33.5", "@uifabric/utilities@^7.34.1", "@uifabric/utilities@^7.38.2": +"@uifabric/utilities@^7.33.5", "@uifabric/utilities@^7.38.2": version "7.38.2" resolved "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.38.2.tgz" integrity sha512-5yM4sm142VEBg3/Q5SFheBXqnrZi9CNF5rjHNoex0GgGtG3AHPuS7U8gjm+/Io1MvbuCrn6lyyIw0MDvh1Ebkw== @@ -10211,6 +10579,24 @@ semver "^6.0.0" string.prototype.padstart "^3.0.0" +"@vue/compiler-core@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" + integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== + dependencies: + "@babel/parser" "^7.21.3" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + source-map-js "^1.0.2" + +"@vue/compiler-dom@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" + integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== + dependencies: + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + "@vue/compiler-sfc@2.7.14": version "2.7.14" resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz" @@ -10220,6 +10606,30 @@ postcss "^8.4.14" source-map "^0.6.1" +"@vue/compiler-sfc@^3.0.5": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" + integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-ssr" "3.3.4" + "@vue/reactivity-transform" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + postcss "^8.1.10" + source-map-js "^1.0.2" + +"@vue/compiler-ssr@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777" + integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== + dependencies: + "@vue/compiler-dom" "3.3.4" + "@vue/shared" "3.3.4" + "@vue/component-compiler-utils@^3.0.0", "@vue/component-compiler-utils@^3.1.0": version "3.3.0" resolved "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz" @@ -10241,6 +10651,22 @@ resolved "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz" integrity sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ== +"@vue/reactivity-transform@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" + integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + +"@vue/shared@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" + integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== + "@vue/web-component-wrapper@^1.2.0": version "1.3.0" resolved "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz" @@ -10253,6 +10679,13 @@ dependencies: errorstacks "^2.2.0" +"@web/browser-logs@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@web/browser-logs/-/browser-logs-0.3.2.tgz#80f4246bd49637b1cbea8cc98c74ad0d93736ef4" + integrity sha512-4kYoH4XBpOnrYAzlG3M9fy3kj7jhUgOLXsBcdC5n4oALYzgX57mt2MeJT4LkdgLWbCGRl1K8KaZhOKgH4RktxQ== + dependencies: + errorstacks "^2.2.0" + "@web/config-loader@0.1.3", "@web/config-loader@^0.1.3": version "0.1.3" resolved "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz" @@ -10308,6 +10741,30 @@ picomatch "^2.2.2" ws "^7.4.2" +"@web/dev-server-core@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@web/dev-server-core/-/dev-server-core-0.5.1.tgz#80e5a059f2abf5d1d40bd123c2b539ae86640e2c" + integrity sha512-pXgb4bjDmPIaIQT9luixTSqTvRQxttUEzSKOZqLNl6pVgrl4n47ZtmZte936G2tM7nHmpT+oaMDDtCM0CgbQNQ== + dependencies: + "@types/koa" "^2.11.6" + "@types/ws" "^7.4.0" + "@web/parse5-utils" "^2.0.0" + chokidar "^3.4.3" + clone "^2.1.2" + es-module-lexer "^1.0.0" + get-stream "^6.0.0" + is-stream "^2.0.0" + isbinaryfile "^5.0.0" + koa "^2.13.0" + koa-etag "^4.0.0" + koa-send "^5.0.1" + koa-static "^5.0.0" + lru-cache "^8.0.4" + mime-types "^2.1.27" + parse5 "^6.0.1" + picomatch "^2.2.2" + ws "^7.4.2" + "@web/dev-server-esbuild@0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@web/dev-server-esbuild/-/dev-server-esbuild-0.3.3.tgz#e82af2e5acec0e645b920400be9601601b3921c5" @@ -10359,6 +10816,14 @@ "@types/parse5" "^6.0.1" parse5 "^6.0.1" +"@web/parse5-utils@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@web/parse5-utils/-/parse5-utils-2.0.0.tgz#15ac70e8792a115ef05baa0eab2631fb8ffd3004" + integrity sha512-9pxjAg1k0Ie3t4gTQr/nmoTrvq6wmP40MNPwaetaN+jPc328MpO+WzmEApvJOW65v7lamjlvYFDsdvG8Lrd87Q== + dependencies: + "@types/parse5" "^6.0.1" + parse5 "^6.0.1" + "@web/test-runner-chrome@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@web/test-runner-chrome/-/test-runner-chrome-0.11.0.tgz#41efe67cd09d9a0e5392fadc35f2fb44edf32f3d" @@ -10369,7 +10834,7 @@ chrome-launcher "^0.15.0" puppeteer-core "^13.1.3" -"@web/test-runner-commands@^0.6.3", "@web/test-runner-commands@^0.6.5": +"@web/test-runner-commands@^0.6.3": version "0.6.6" resolved "https://registry.yarnpkg.com/@web/test-runner-commands/-/test-runner-commands-0.6.6.tgz#e0e8c4ce6dcd91e5b18cf2212511ee6108e31070" integrity sha512-2DcK/+7f8QTicQpGFq/TmvKHDK/6Zald6rn1zqRlmj3pcH8fX6KHNVMU60Za9QgAKdorMBPfd8dJwWba5otzdw== @@ -10377,6 +10842,14 @@ "@web/test-runner-core" "^0.10.29" mkdirp "^1.0.4" +"@web/test-runner-commands@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-commands/-/test-runner-commands-0.7.0.tgz#c9693e4e8b05ef06a2102e03ac924bcbf7985312" + integrity sha512-3aXeGrkynOdJ5jgZu5ZslcWmWuPVY9/HNdWDUqPyNePG08PKmLV9Ij342ODDL6OVsxF5dvYn1312PhDqu5AQNw== + dependencies: + "@web/test-runner-core" "^0.11.0" + mkdirp "^1.0.4" + "@web/test-runner-core@^0.10.20", "@web/test-runner-core@^0.10.27", "@web/test-runner-core@^0.10.29": version "0.10.29" resolved "https://registry.yarnpkg.com/@web/test-runner-core/-/test-runner-core-0.10.29.tgz#d8d909c849151cf19013d6084f89a31e400557d5" @@ -10409,6 +10882,38 @@ picomatch "^2.2.2" source-map "^0.7.3" +"@web/test-runner-core@^0.11.0": + version "0.11.2" + resolved "https://registry.yarnpkg.com/@web/test-runner-core/-/test-runner-core-0.11.2.tgz#d2e201339dbbdee8ad68632cfb18974a2956fb67" + integrity sha512-7padi7pGg2xSW/i6iSApUwxlNaHv2bFBM+MiivkzJ0vet/a/+Fz35bOo8L8Ra7b/1my4VYBsPcWX0PVPowbXRg== + dependencies: + "@babel/code-frame" "^7.12.11" + "@types/babel__code-frame" "^7.0.2" + "@types/co-body" "^6.1.0" + "@types/convert-source-map" "^2.0.0" + "@types/debounce" "^1.2.0" + "@types/istanbul-lib-coverage" "^2.0.3" + "@types/istanbul-reports" "^3.0.0" + "@web/browser-logs" "^0.3.2" + "@web/dev-server-core" "^0.5.1" + chokidar "^3.4.3" + cli-cursor "^3.1.0" + co-body "^6.1.0" + convert-source-map "^2.0.0" + debounce "^1.2.0" + dependency-graph "^0.11.0" + globby "^11.0.1" + ip "^1.1.5" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-reports "^3.0.2" + log-update "^4.0.0" + nanocolors "^0.2.1" + nanoid "^3.1.25" + open "^8.0.2" + picomatch "^2.2.2" + source-map "^0.7.3" + "@web/test-runner-coverage-v8@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.5.0.tgz#d1b033fd4baddaf5636a41cd017e321a338727a6" @@ -11198,6 +11703,11 @@ acorn@^8.1.0, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8 resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.9.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" + integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + adal-angular@1.0.16: version "1.0.16" resolved "https://registry.npmjs.org/adal-angular/-/adal-angular-1.0.16.tgz" @@ -11401,16 +11911,6 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@6.12.5: - version "6.12.5" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz" - integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@8.11.0: version "8.11.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" @@ -11441,16 +11941,6 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@~5.2.2: - version "5.2.5" - resolved "https://registry.npmjs.org/ajv/-/ajv-5.2.5.tgz" - integrity sha512-lhBCO8ZRekUVifgHf+8V/VO2h8/TJWQtxeXdTOWv14sVWmJjcxvjH5J38MBLipxVpXmyX1a/lyBom8y8MLkvZw== - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" - alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" @@ -11475,6 +11965,11 @@ ansi-colors@^1.0.1: dependencies: ansi-wrap "^0.1.0" +ansi-colors@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-2.0.5.tgz#5da37825fef3e75f3bda47f760d64bfd10e15e10" + integrity sha512-yAdfUZ+c2wetVNIFsNRn44THW+Lty6S5TwMpUfLA/UaGhiXbBv/F8E60/1hMLd0cnF/CDoWH8vzVaI5bAcHCjw== + ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz" @@ -13101,21 +13596,15 @@ body-parser@^1.19.0: type-is "~1.6.18" unpipe "1.0.0" -body-parser@~1.14.0: - version "1.14.2" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz" - integrity sha512-6D9uiWn7dbnDAhlDikccybuqKCmsoest0es3VSQO8Doz/fzx6Ls7kJNxKBYTjbzu4/RzNsf9zuACnS3UYjVH8Q== - dependencies: - bytes "2.2.0" - content-type "~1.0.1" - debug "~2.2.0" - depd "~1.1.0" - http-errors "~1.3.1" - iconv-lite "0.4.13" - on-finished "~2.3.0" - qs "5.2.0" - raw-body "~2.1.5" - type-is "~1.6.10" +body@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" + integrity sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ== + dependencies: + continuable-cache "^0.3.1" + error "^7.0.0" + raw-body "~1.1.0" + safe-json-parse "~1.0.1" bonjour-service@^1.0.11: version "1.1.1" @@ -13549,15 +14038,10 @@ byte-size@8.1.1: resolved "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz" integrity sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== -bytes@2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz" - integrity sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA== - -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz" - integrity sha512-SvUX8+c/Ga454a4fprIdIUzUN9xfd1YTvYh7ub5ZPJ+ZJ/+K2Bp6IpWGmnw8r3caLTsmhvJAKZz3qjIo9+XuCQ== +bytes@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + integrity sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ== bytes@3.0.0: version "3.0.0" @@ -13815,6 +14299,24 @@ caller-path@^2.0.0: dependencies: caller-callsite "^2.0.0" +callsite-record@^4.1.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/callsite-record/-/callsite-record-4.1.5.tgz#cfccae67dfd29e0e52a17d88517fc7e4e3d3bdb4" + integrity sha512-OqeheDucGKifjQRx524URgV4z4NaKjocGhygTptDea+DLROre4ZEecA4KXDq+P7qlGCohYVNOh3qr+y5XH5Ftg== + dependencies: + "@devexpress/error-stack-parser" "^2.0.6" + "@types/lodash" "^4.14.72" + callsite "^1.0.0" + chalk "^2.4.0" + highlight-es "^1.0.0" + lodash "4.6.1 || ^4.16.1" + pinkie-promise "^2.0.0" + +callsite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ== + callsites@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz" @@ -13935,7 +14437,7 @@ ccount@^1.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== -chai-a11y-axe@^1.3.2: +chai-a11y-axe@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/chai-a11y-axe/-/chai-a11y-axe-1.5.0.tgz#aafa37f91f53baeafe98219768e5dee8776cf655" integrity sha512-V/Vg/zJDr9aIkaHJ2KQu7lGTQQm5ZOH4u1k5iTMvIXuSVlSuUo0jcSpSqf9wUn9zl6oQXa4e4E0cqH18KOgKlQ== @@ -13949,7 +14451,7 @@ chalk-template@^0.4.0: dependencies: chalk "^4.1.2" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -14542,11 +15044,6 @@ colord@^2.9.1, colord@^2.9.3: resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^1.2.1: - version "1.4.0" - resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - colorette@^2.0.10, colorette@^2.0.14: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" @@ -14557,7 +15054,7 @@ colors@1.0.3: resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== -colors@1.4.0, colors@^1.1.2, colors@^1.3.3: +colors@1.4.0, colors@^1.3.3: version "1.4.0" resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -14804,12 +15301,12 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -connect-livereload@^0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz" - integrity sha512-3KnRwsWf4VmP01I4hCDQqTc4e2UxOvJIi8i08GiwqX2oymzxNFY7PqjFkwHglYTJ0yzUJkO5yqdPxVaIz3Pbug== +connect-livereload@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/connect-livereload/-/connect-livereload-0.6.1.tgz#1ac0c8bb9d9cfd5b28b629987a56a9239db9baaa" + integrity sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g== -connect@^3.6.5, connect@^3.7.0: +connect@^3.6.6, connect@^3.7.0: version "3.7.0" resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== @@ -14858,11 +15355,16 @@ content-disposition@0.5.4, content-disposition@~0.5.2: dependencies: safe-buffer "5.2.1" -content-type@^1.0.4, content-type@~1.0.1, content-type@~1.0.4, content-type@~1.0.5: +content-type@^1.0.4, content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +continuable-cache@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" + integrity sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA== + conventional-changelog-angular@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz" @@ -15100,11 +15602,16 @@ core-js@^2.4.0: resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.0.4, core-js@^3.19.2, core-js@^3.5.0, core-js@^3.6.5, core-js@^3.7.0, core-js@^3.8.2: +core-js@^3.0.4, core-js@^3.19.2, core-js@^3.5.0, core-js@^3.6.5, core-js@^3.8.2: version "3.30.1" resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.1.tgz" integrity sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ== +core-js@^3.31.0: + version "3.31.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.31.0.tgz#4471dd33e366c79d8c0977ed2d940821719db344" + integrity sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" @@ -15469,24 +15976,6 @@ css-loader@^6.5.1: postcss-value-parser "^4.2.0" semver "^7.3.8" -css-loader@~3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-3.2.1.tgz" - integrity sha512-q40kYdcBNzMvkIImCL2O+wk8dh+RGwPPV9Dfz3n7XtOYPXqe2Z6VgtvoxjkLHz02gmhepG9sOAJOUlx+3hHsBg== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.23" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" - css-minimizer-webpack-plugin@^3.2.0: version "3.4.1" resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz" @@ -15803,7 +16292,7 @@ cssnano@6.0.1: cssnano-preset-default "^6.0.1" lilconfig "^2.1.0" -cssnano@^4.0.0, cssnano@^4.1.10, cssnano@~4.1.10: +cssnano@^4.0.0, cssnano@^4.1.10: version "4.1.11" resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz" integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== @@ -15813,7 +16302,7 @@ cssnano@^4.0.0, cssnano@^4.1.10, cssnano@~4.1.10: is-resolvable "^1.0.0" postcss "^7.0.0" -cssnano@^5.0.6: +cssnano@^5.0.6, cssnano@~5.1.14: version "5.1.15" resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== @@ -15872,7 +16361,7 @@ cssstyle@^2.0.0, cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^2.2.0, csstype@^2.5.7: +csstype@^2.5.7: version "2.6.21" resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== @@ -15976,14 +16465,6 @@ date-utils@*: resolved "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz" integrity sha512-wJMBjqlwXR0Iv0wUo/lFbhSQ7MmG1hl36iuxuE91kW+5b5sWbase73manEqNH9sOLFAMG83B4ffNKq9/Iq0FVA== -dateformat@^1.0.11: - version "1.0.12" - resolved "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz" - integrity sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg== - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - dateformat@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz" @@ -16021,20 +16502,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@4.3.3: - version "4.3.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@^3.0.0, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -16042,13 +16516,6 @@ debug@^3.0.0, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@~2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" - integrity sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw== - dependencies: - ms "0.7.1" - debuglog@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" @@ -16299,12 +16766,41 @@ delegates@^1.0.0: resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +depcheck@^1.3.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-1.4.3.tgz#faa4c143921f3fe25d5a7a633f9864327c250843" + integrity sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ== + dependencies: + "@babel/parser" "7.16.4" + "@babel/traverse" "^7.12.5" + "@vue/compiler-sfc" "^3.0.5" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + debug "^4.2.0" + deps-regex "^0.1.4" + ignore "^5.1.8" + is-core-module "^2.4.0" + js-yaml "^3.14.0" + json5 "^2.1.3" + lodash "^4.17.20" + minimatch "^3.0.4" + multimatch "^5.0.0" + please-upgrade-node "^3.2.0" + query-ast "^1.0.3" + readdirp "^3.5.0" + require-package-name "^2.0.1" + resolve "^1.18.1" + sass "^1.29.0" + scss-parser "^1.0.4" + semver "^7.3.2" + yargs "^16.1.0" + depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@~1.1.0, depd@~1.1.2: +depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== @@ -16319,11 +16815,26 @@ dependency-graph@^0.11.0: resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== +dependency-path@~9.2.8: + version "9.2.8" + resolved "https://registry.yarnpkg.com/dependency-path/-/dependency-path-9.2.8.tgz#9fe05be8d69ad1943a2084e4d86f3063c4b50c01" + integrity sha512-S0OhIK7sIyAsph8hVH/LMCTDL3jozKtlrPx3dMQrlE2nAlXTquTT+AcOufphDMTQqLkfn4acvfiem9I1IWZ4jQ== + dependencies: + "@pnpm/crypto.base32-hash" "1.0.1" + "@pnpm/types" "8.9.0" + encode-registry "^3.0.0" + semver "^7.3.8" + deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== +deps-regex@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184" + integrity sha512-3tzwGYogSJi8HoG93R5x9NrdefZQOXgHgGih/7eivloOq6yC6O+yoFxZnkgP661twvfILONfoKRdF9GQOGx2RA== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" @@ -16743,7 +17254,7 @@ duplexer3@^0.1.4: resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== -duplexer@^0.1.1, duplexer@^0.1.2, duplexer@~0.1.1: +duplexer@^0.1.1, duplexer@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -16910,6 +17421,13 @@ emojis-list@^3.0.0: resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +encode-registry@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/encode-registry/-/encode-registry-3.0.0.tgz#6e67162a37dca9542bdf8432f1579c462b90b647" + integrity sha512-2fRYji8K6FwYuQ6EPBKR/J9mcqb7kIoNqt1vGvJr3NrvKfncRiNm00Oxo6gi/YJF8R5Sp2bNFSFdGKTG0rje1Q== + dependencies: + mem "^8.0.0" + encodeurl@^1.0.2, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" @@ -17065,6 +17583,13 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" +error@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== + dependencies: + string-template "~0.2.1" + errorstacks@^2.2.0: version "2.4.0" resolved "https://registry.yarnpkg.com/errorstacks/-/errorstacks-2.4.0.tgz#2155674dd9e741aacda3f3b8b967d9c40a4a0baf" @@ -17778,10 +18303,10 @@ eslint-plugin-jest@^25.3.0: dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" -eslint-plugin-jsdoc@^46.2.6: - version "46.2.6" - resolved "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.2.6.tgz" - integrity sha512-zIaK3zbSrKuH12bP+SPybPgcHSM6MFzh3HFeaODzmsF1N8C1l8dzJ22cW1aq4g0+nayU1VMjmNf7hg0dpShLrA== +eslint-plugin-jsdoc@^46.4.0: + version "46.4.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.3.tgz#4a2ad3a01d7ba723acaed3940f746a0a31d1e58e" + integrity sha512-Prc7ol+vCIghPeECpwZq5+P+VZfoi87suywvbYCiCnkI1kTmVSdcOC2M8mioglWxBbd28wbb1OVjg/8OzGzatA== dependencies: "@es-joy/jsdoccomment" "~0.39.4" are-docs-informative "^0.0.2" @@ -17960,6 +18485,13 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" @@ -18082,7 +18614,7 @@ eslint@^6.6.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -eslint@^8.3.0, eslint@^8.42.0: +eslint@^8.3.0: version "8.42.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz" integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A== @@ -18127,6 +18659,51 @@ eslint@^8.3.0, eslint@^8.42.0: strip-json-comments "^3.1.0" text-table "^0.2.0" +eslint@^8.43.0: + version "8.44.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500" + integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.1.0" + "@eslint/js" "8.44.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.6.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + espree@^6.1.2: version "6.2.1" resolved "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz" @@ -18145,6 +18722,15 @@ espree@^9.3.0, espree@^9.4.0, espree@^9.5.2: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +espree@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.0.tgz#80869754b1c6560f32e3b6929194a3fe07c5b82f" + integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + esprima@4.0.1, esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" @@ -18189,6 +18775,11 @@ estree-walker@^1.0.1: resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -18199,29 +18790,11 @@ etag@^1.3.0, etag@^1.8.1, etag@~1.8.1: resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -etag@~1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" - integrity sha512-Mbv5pNpLNPrm1b4rzZlZlfTRpdDr31oiD43N362sIyvSWVNu5Du33EcJGzvEV4YdYLuENB1HzND907cQkFmXNw== - event-pubsub@4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz" integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== -event-stream@^3.3.2: - version "3.3.5" - resolved "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz" - integrity sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g== - dependencies: - duplexer "^0.1.1" - from "^0.1.7" - map-stream "0.0.7" - pause-stream "^0.0.11" - split "^1.0.1" - stream-combiner "^0.2.2" - through "^2.3.8" - event-target-shim@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" @@ -18634,11 +19207,6 @@ fancy-log@^1.1.0, fancy-log@^1.3.2: parse-node-version "^1.0.0" time-stamp "^1.0.0" -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz" - integrity sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -18769,6 +19337,13 @@ figgy-pudding@^3.5.1: resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +figures@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" + integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== + dependencies: + escape-string-regexp "^1.0.5" + figures@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" @@ -19041,6 +19616,14 @@ find-versions@^4.0.0: dependencies: semver-regex "^3.1.2" +find-yarn-workspace-root2@1.2.16: + version "1.2.16" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== + dependencies: + micromatch "^4.0.2" + pkg-dir "^4.2.0" + findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz" @@ -19297,11 +19880,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fresh@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" - integrity sha512-akx5WBKAwMSg36qoHTuMMVncHWctlaDGslJASDYAhoLrzDUDCjZlOngNa/iC6lPm9aA0qk8pN5KnpmbJHSIIQQ== - fresh@0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" @@ -19315,11 +19893,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -from@^0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/from/-/from-0.1.7.tgz" - integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" @@ -19660,14 +20233,6 @@ git-semver-tags@^5.0.0: meow "^8.1.2" semver "^6.3.0" -git-up@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/git-up/-/git-up-6.0.0.tgz" - integrity sha512-6RUFSNd1c/D0xtGnyWN2sxza2bZtZ/EmI9448n6rCZruFwV/ezeEn2fJP7XnUQGwf0RAtd/mmUCbtH6JPYA2SA== - dependencies: - is-ssh "^1.4.0" - parse-url "^7.0.2" - git-up@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz" @@ -19683,13 +20248,6 @@ git-url-parse@13.1.0: dependencies: git-up "^7.0.0" -git-url-parse@^12.0.0: - version "12.0.0" - resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-12.0.0.tgz" - integrity sha512-I6LMWsxV87vysX1WfsoglXsXg6GjQRKq7+Dgiseo+h0skmp5Hp2rzmcEIRQot9CPA+uzU7x1x7jZdqvTFGnB+Q== - dependencies: - git-up "^6.0.0" - gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz" @@ -19702,6 +20260,11 @@ github-slugger@^1.0.0: resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== +giturl@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/giturl/-/giturl-1.0.3.tgz#27f9d1f251d138eb2a5a56cc9dd8512b0fc0bbc6" + integrity sha512-qVDEXufVtYUzYqI5hoDUONh9GCEPi0n+e35KNDafdsNt9fPxB0nvFW/kFiw7W42wkg8TUyhBqb+t24yyaoc87A== + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz" @@ -20144,7 +20707,7 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@4.2.11, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@4.2.11, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -20212,20 +20775,20 @@ gulp-cli@^2.2.0: v8flags "^3.2.0" yargs "^7.1.0" -gulp-connect@~5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.5.0.tgz" - integrity sha512-oRBLjw/4EVaZb8g8OcxOVdGD8ZXYrRiWKcNxlrGjxb/6Cp0GDdqw7ieX7D8xJrQS7sbXT+G94u63pMJF3MMjQA== +gulp-connect@~5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/gulp-connect/-/gulp-connect-5.7.0.tgz#7e925f5e4c34ebfedf9f318576966e8fe8840d5a" + integrity sha512-8tRcC6wgXMLakpPw9M7GRJIhxkYdgZsXwn7n56BA2bQYGLR9NOPhMzx7js+qYDy6vhNkbApGKURjAw1FjY4pNA== dependencies: - ansi-colors "^1.0.1" - connect "^3.6.5" - connect-livereload "^0.5.4" - event-stream "^3.3.2" + ansi-colors "^2.0.5" + connect "^3.6.6" + connect-livereload "^0.6.0" fancy-log "^1.3.2" - send "^0.13.2" + map-stream "^0.0.7" + send "^0.16.2" serve-index "^1.9.1" - serve-static "^1.13.1" - tiny-lr "^0.2.1" + serve-static "^1.13.2" + tiny-lr "^1.1.1" gulp-flatten@~0.2.0: version "0.2.0" @@ -20260,16 +20823,6 @@ gulp-match@^1.0.3: dependencies: minimatch "^3.0.3" -gulp-open@~3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/gulp-open/-/gulp-open-3.0.1.tgz" - integrity sha512-dohokw+npnt48AsD0hhvCLEHLnDMqM35F+amvIfJlX1H2nNHYUClR0Oy1rI0TvbL1/pHiHGNLmohhk+kvwIKjA== - dependencies: - colors "^1.1.2" - opn "5.2.0" - plugin-log "^0.1.0" - through2 "^2.0.1" - gulp-rename@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz" @@ -20619,6 +21172,15 @@ hex-color-regex@^1.1.0: resolved "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +highlight-es@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/highlight-es/-/highlight-es-1.0.3.tgz#12abc300a27e686f6f18010134e3a5c6d2fe6930" + integrity sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg== + dependencies: + chalk "^2.4.0" + is-es2016-keyword "^1.0.0" + js-tokens "^3.0.0" + highlight.js@^10.4.1, highlight.js@^10.7.1, highlight.js@~10.7.0: version "10.7.3" resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" @@ -20924,14 +21486,6 @@ http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -http-errors@~1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz" - integrity sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA== - dependencies: - inherits "~2.0.1" - statuses "1" - http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -21064,11 +21618,6 @@ husky@^4.3.0: slash "^3.0.0" which-pm-runs "^1.0.0" -iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" - integrity sha512-QwVuTNQv7tXC5mMWFX5N5wGjmybjNBBD8P3BReTkPmipoxTUFgWM2gXNvldHQr6T14DH0Dh6qBVg98iJt7u4mQ== - iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz" @@ -21172,7 +21721,7 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.4, ignore@^5.1.4, ignore@^5.2.0, ignore@^5.2.4: +ignore@^5.0.4, ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -21410,7 +21959,7 @@ inquirer@8.2.4: through "^2.3.6" wrap-ansi "^7.0.0" -inquirer@^7.0.0, inquirer@~7.3.3: +inquirer@^7.0.0, inquirer@^7.3.3, inquirer@~7.3.3: version "7.3.3" resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz" integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== @@ -21482,7 +22031,7 @@ intersection-observer@^0.7.0: resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz" integrity sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg== -invariant@^2.2.2, invariant@^2.2.4: +invariant@2.2.4, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -21682,6 +22231,13 @@ is-core-module@^2.1.0, is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-mo dependencies: has "^1.0.3" +is-core-module@^2.4.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" @@ -21756,6 +22312,11 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" +is-es2016-keyword@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-es2016-keyword/-/is-es2016-keyword-1.0.0.tgz#f6e54e110c5e4f8d265e69d2ed0eaf8cf5f47718" + integrity sha512-JtZWPUwjdbQ1LIo9OSZ8MdkWEve198ors27vH+RzUUvZXXZkzXCxFnlUhzWYxy5IexQSRiXVw9j2q/tHMmkVYQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" @@ -24175,16 +24736,16 @@ js-string-escape@^1.0.1: resolved "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz" integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" - integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== - js-yaml@4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" @@ -24192,7 +24753,7 @@ js-yaml@4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.10.0, js-yaml@^3.13.1: +js-yaml@^3.10.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -24476,11 +25037,6 @@ json-parse-even-better-errors@^3.0.0: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz" integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz" - integrity sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -24642,10 +25198,10 @@ jszip@^3.1.3: readable-stream "~2.3.6" setimmediate "^1.0.5" -jszip@~3.7.1: - version "3.7.1" - resolved "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz" - integrity sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg== +jszip@~3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.8.0.tgz#a2ac3c33fe96a76489765168213655850254d51b" + integrity sha512-cnpQrXvFSLdsR9KR5/x7zdf6c3m8IhZfZzSblFEHSqBaVwD2nvJ4CuCKLyvKvwBgZm08CgfSoiTBQLm5WW9hGw== dependencies: lie "~3.3.0" pako "~1.0.2" @@ -25036,13 +25592,13 @@ left-pad@^1.2.0, left-pad@^1.3.0: resolved "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz" integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== -lerna@^7.0.0: - version "7.0.2" - resolved "https://registry.npmjs.org/lerna/-/lerna-7.0.2.tgz" - integrity sha512-omFpf1pTiaObC2YOC7K+euaDwhQA9CyKN1kXxmlSwaSkh8b8QTs4SC8jp3oNeXfcHpVS1ttuuz98AvQvJD46wA== +lerna@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.1.1.tgz#6703062e6c4ddefdaf41e8890e9200690924fd71" + integrity sha512-rjivAl3bYu2+lWOi90vy0tYFgwBYPMiNkR/DuEWZC08wle5dsbOZ/SlXeLk9+kzbF89Bt5P6p+qF78A2tJsWPA== dependencies: - "@lerna/child-process" "7.0.2" - "@lerna/create" "7.0.2" + "@lerna/child-process" "7.1.1" + "@lerna/create" "7.1.1" "@npmcli/run-script" "6.0.2" "@nx/devkit" ">=16.1.3 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" @@ -25292,9 +25848,18 @@ lit@^2.0.0, lit@^2.3.1: lit-element "^3.3.0" lit-html "^2.7.0" -livereload-js@^2.2.0: +lit@^2.7.5: + version "2.7.5" + resolved "https://registry.yarnpkg.com/lit/-/lit-2.7.5.tgz#60bc82990cfad169d42cd786999356dcf79b035f" + integrity sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ== + dependencies: + "@lit/reactive-element" "^1.6.0" + lit-element "^3.3.0" + lit-html "^2.7.0" + +livereload-js@^2.3.0: version "2.4.0" - resolved "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== load-json-file@6.2.0, load-json-file@^6.2.0: @@ -25338,6 +25903,16 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +load-yaml-file@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.13.0" + pify "^4.0.1" + strip-bom "^3.0.0" + loader-fs-cache@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz" @@ -25365,6 +25940,15 @@ loader-utils@1.2.3: emojis-list "^2.0.0" json5 "^1.0.1" +loader-utils@1.4.2, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0, loader-utils@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + loader-utils@3.2.1, loader-utils@^3.2.0: version "3.2.1" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" @@ -25380,15 +25964,6 @@ loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.2" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - loader-utils@^2.0.0, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" @@ -25398,15 +25973,6 @@ loader-utils@^2.0.0, loader-utils@^2.0.4: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" - integrity sha512-gkD9aSEG9UGglyPcDJqY9YBTUtCLKaBK6ihD2VP1d1X60lTfFspNZNulGBBbUZLkPygy4LySYHyxBpq+VhjObQ== - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" @@ -25661,7 +26227,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@4.17.21, "lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.15: +lodash@4.17.21, "lodash@4.6.1 || ^4.16.1", "lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.15: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -25786,6 +26352,11 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== +lru-cache@^8.0.4: + version "8.0.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-8.0.5.tgz#983fe337f3e176667f8e567cfcce7cb064ea214e" + integrity sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA== + lru-cache@^9.1.1: version "9.1.2" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz" @@ -25827,6 +26398,13 @@ magic-string@^0.26.0: dependencies: sourcemap-codec "^1.4.8" +magic-string@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" + integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@3.1.0, make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" @@ -25916,6 +26494,13 @@ mamacro@^0.0.3: resolved "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz" integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" @@ -25936,9 +26521,9 @@ map-or-similar@^1.5.0: resolved "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz" integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== -map-stream@0.0.7: +map-stream@^0.0.7: version "0.0.7" - resolved "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" integrity sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ== map-visit@^1.0.0: @@ -26079,6 +26664,14 @@ media-typer@0.3.0: resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +mem@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122" + integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.1.0" + memfs@^3.1.2, memfs@^3.4.3: version "3.5.0" resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.0.tgz" @@ -26119,7 +26712,7 @@ memorystream@^0.3.1: resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -meow@^3.1.0, meow@^3.3.0: +meow@^3.1.0: version "3.7.0" resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" integrity sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA== @@ -26289,11 +26882,6 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.25, mime-types@^2.1.27, dependencies: mime-db "1.52.0" -mime@1.3.4: - version "1.3.4" - resolved "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - integrity sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ== - mime@1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz" @@ -26324,6 +26912,11 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" @@ -26664,11 +27257,6 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - integrity sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -26731,7 +27319,7 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -multimatch@5.0.0: +multimatch@5.0.0, multimatch@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz" integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== @@ -26783,7 +27371,7 @@ nanocolors@^0.2.1, nanocolors@^0.2.2: resolved "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz" integrity sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA== -nanoid@^3.1.20, nanoid@^3.1.25, nanoid@^3.3.1, nanoid@^3.3.4, nanoid@^3.3.6: +nanoid@^3.1.25, nanoid@^3.3.1, nanoid@^3.3.4, nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== @@ -26926,6 +27514,13 @@ node-dir@^0.1.17: dependencies: minimatch "^3.0.2" +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" @@ -27216,7 +27811,7 @@ normalize-url@^4.1.0: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -normalize-url@^6.0.1, normalize-url@^6.1.0: +normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== @@ -27249,6 +27844,39 @@ npm-bundled@^3.0.0: dependencies: npm-normalize-package-bin "^3.0.0" +npm-check@~6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/npm-check/-/npm-check-6.0.1.tgz#0df44d6ed8ab7bb29cf52fb3338b59adb6af1cd6" + integrity sha512-tlEhXU3689VLUHYEZTS/BC61vfeN2xSSZwoWDT6WLuenZTpDmGmNT5mtl15erTR0/A15ldK06/NEKg9jYJ9OTQ== + dependencies: + callsite-record "^4.1.3" + chalk "^4.1.0" + co "^4.6.0" + depcheck "^1.3.1" + execa "^5.0.0" + giturl "^1.0.0" + global-modules "^2.0.0" + globby "^11.0.2" + inquirer "^7.3.3" + is-ci "^2.0.0" + lodash "^4.17.20" + meow "^9.0.0" + minimatch "^3.0.2" + node-emoji "^1.10.0" + ora "^5.3.0" + package-json "^6.5.0" + path-exists "^4.0.0" + pkg-dir "^5.0.0" + preferred-pm "^3.0.3" + rc-config-loader "^4.0.0" + semver "^7.3.4" + semver-diff "^3.1.1" + strip-ansi "^6.0.0" + text-table "^0.2.0" + throat "^6.0.1" + update-notifier "^5.1.0" + xtend "^4.0.2" + npm-conf@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz" @@ -27746,25 +28374,6 @@ office-ui-fabric-core@^11.0.0: resolved "https://registry.npmjs.org/office-ui-fabric-core/-/office-ui-fabric-core-11.1.0.tgz" integrity sha512-uV7CbMBAqbHRa7ihNlgbDMIdiKb49TCamhsfuK7Yx7JXx05WdN/lZPWLmPnAALVQAFuO95ZJMAwNjyyEeXk47A== -office-ui-fabric-react@7.185.7: - version "7.185.7" - resolved "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.185.7.tgz" - integrity sha512-JiWkrjT/T6OG63ATu6RUlME2PBe4pgxQOwRTOjvbsaq8mlyd9i21ImgwkTEvcNXJpx+4w0bJiuQTcdwSMyf6qA== - dependencies: - "@fluentui/date-time-utilities" "^7.9.1" - "@fluentui/react-focus" "^7.18.4" - "@fluentui/react-window-provider" "^1.0.3" - "@microsoft/load-themed-styles" "^1.10.26" - "@uifabric/foundation" "^7.10.3" - "@uifabric/icons" "^7.7.2" - "@uifabric/merge-styles" "^7.19.2" - "@uifabric/react-hooks" "^7.14.2" - "@uifabric/set-version" "^7.0.24" - "@uifabric/styling" "^7.20.2" - "@uifabric/utilities" "^7.34.1" - prop-types "^15.7.2" - tslib "^1.10.0" - office-ui-fabric-react@^7.199.1, office-ui-fabric-react@^7.204.0: version "7.204.0" resolved "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.204.0.tgz" @@ -27847,6 +28456,15 @@ open@8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +open@8.4.2, open@^8.0.0, open@^8.0.2, open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + open@^6.3.0: version "6.4.0" resolved "https://registry.npmjs.org/open/-/open-6.4.0.tgz" @@ -27862,15 +28480,6 @@ open@^7.0.2, open@^7.0.3: is-docker "^2.0.0" is-wsl "^2.1.1" -open@^8.0.0, open@^8.0.2, open@^8.0.9, open@^8.4.0: - version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - opencollective-postinstall@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz" @@ -27881,13 +28490,6 @@ opener@^1.5.1: resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -opn@5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz" - integrity sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ== - dependencies: - is-wsl "^1.1.0" - opn@^5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz" @@ -27934,7 +28536,19 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@5.4.1, ora@^5.1.0, ora@^5.4.1: +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +ora@5.4.1, ora@^5.1.0, ora@^5.3.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -28024,6 +28638,11 @@ p-cancelable@^2.0.0: resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + p-each-series@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz" @@ -28208,7 +28827,7 @@ p-waterfall@2.1.1: dependencies: p-reduce "^2.0.0" -package-json@^6.3.0: +package-json@^6.3.0, package-json@^6.5.0: version "6.5.0" resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== @@ -28382,13 +29001,6 @@ parse-passwd@^1.0.0: resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== -parse-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/parse-path/-/parse-path-5.0.0.tgz" - integrity sha512-qOpH55/+ZJ4jUu/oLO+ifUKjFPNZGfnPJtzvGzKN/4oLMil5m9OH4VpOj6++9/ytJcfks4kzH2hhi87GL/OU9A== - dependencies: - protocols "^2.0.0" - parse-path@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz" @@ -28396,21 +29008,6 @@ parse-path@^7.0.0: dependencies: protocols "^2.0.0" -parse-repo@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/parse-repo/-/parse-repo-1.0.4.tgz" - integrity sha512-RdwYLh7cmxByP/BfeZX0QfIVfeNrH2fWgK1aLsGK+G6nCO4WTlCks4J7aW0O3Ap9BCPDF/e8rGTT50giQr10zg== - -parse-url@^7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/parse-url/-/parse-url-7.0.2.tgz" - integrity sha512-PqO4Z0eCiQ08Wj6QQmrmp5YTTxpYfONdOEamrtvK63AmzXpcavIVQubGHxOEwiIoDZFb8uDOoQFS0NCcjqIYQg== - dependencies: - is-ssh "^1.4.0" - normalize-url "^6.1.0" - parse-path "^5.0.0" - protocols "^2.0.1" - parse-url@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz" @@ -28467,7 +29064,7 @@ parse5@^7.0.0, parse5@^7.1.1, parse5@^7.1.2: dependencies: entities "^4.4.0" -parseurl@^1.3.2, parseurl@~1.3.0, parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -28597,13 +29194,6 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pause-stream@^0.0.11: - version "0.0.11" - resolved "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" - integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== - dependencies: - through "~2.3" - pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" @@ -28779,14 +29369,6 @@ plugin-error@1.0.1, plugin-error@^1.0.1: arr-union "^3.1.0" extend-shallow "^3.0.2" -plugin-log@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz" - integrity sha512-TzmfWRMEFAnrZbI4GfyXv9Gp5E71eby3gmvnP6LEfmYbVC8FPN2RBRhwxg4sjIg+fy8AJ3mczhLXvk0pzHPeMg== - dependencies: - chalk "^1.1.1" - dateformat "^1.0.11" - pn@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz" @@ -30457,19 +31039,19 @@ postcss@^8.0.9, postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.4: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.2.14, postcss@^8.3.7, postcss@^8.4.14, postcss@^8.4.18, postcss@^8.4.7: - version "8.4.22" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.22.tgz" - integrity sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA== +postcss@^8.1.10, postcss@^8.4.19: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.19: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== +postcss@^8.2.14, postcss@^8.3.7, postcss@^8.4.14, postcss@^8.4.18, postcss@^8.4.7: + version "8.4.22" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.22.tgz" + integrity sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -30484,14 +31066,15 @@ postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@~8.1.0: - version "8.1.14" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.1.14.tgz" - integrity sha512-KatkyVPBKfENS+c3dpXJoDXnDD5UZs5exAnDksLqaRJPKwYphEPZt4N0m0i049v2/BtWVQibAhxW4ilXXcolpA== +preferred-pm@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.3.tgz#1b6338000371e3edbce52ef2e4f65eb2e73586d6" + integrity sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ== dependencies: - colorette "^1.2.1" - nanoid "^3.1.20" - source-map "^0.6.1" + find-up "^5.0.0" + find-yarn-workspace-root2 "1.2.16" + path-exists "^4.0.0" + which-pm "2.0.0" prelude-ls@^1.2.1: version "1.2.1" @@ -30915,11 +31498,6 @@ qjobs@^1.2.0: resolved "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz" integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" - integrity sha512-VH4FeG98gs6AkHivaW2O14vsOPBL9E80Sj7fITunoDijiYQ1lsVwJYmm1CSL+oLyO2N5HPdo23GXAG64uKOAZQ== - qs@6.10.3: version "6.10.3" resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz" @@ -30946,23 +31524,26 @@ qs@^6.10.0: dependencies: side-channel "^1.0.4" -qs@^6.5.2: +qs@^6.4.0, qs@^6.5.2: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" -qs@~5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" - integrity sha512-SGDM48EwFLWnYYpNlOkEIRJb4wil5FKJxpR6NVfQjz6qJmX53ki7Xj1cLNEAkb70vUfJmdVLOwODyABgZyDMZw== - qs@~6.5.2: version "6.5.3" resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +query-ast@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/query-ast/-/query-ast-1.0.5.tgz#60f60593e8ea085082aaf9f316631a5cc070074a" + integrity sha512-JK+1ma4YDuLjvKKcz9JZ70G+CM9qEOs/l1cZzstMMfwKUabTJ9sud5jvDGrUNuv03yKUgs82bLkHXJkDyhRmBw== + dependencies: + invariant "2.2.4" + lodash "^4.17.21" + query-string@^4.1.0: version "4.3.4" resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" @@ -31047,11 +31628,6 @@ range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -range-parser@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" - integrity sha512-nDsRrtIxVUO5opg/A8T2S3ebULVIfuh8ECbh4w3N4mWxIiT3QILDJDUQayPqm2e8Q8NUa0RSUkGCfe33AfjR3Q== - raw-body@2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz" @@ -31082,14 +31658,13 @@ raw-body@2.5.2, raw-body@^2.3.3: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@~2.1.5: - version "2.1.7" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz" - integrity sha512-x4d27vsIG04gZ1imkuDXB9Rd/EkAx5kYzeMijIYw1PAor0Ld3nTlkQQwDjKu42GdRUFCX1AfGnTSQB4O57eWVg== +raw-body@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" + integrity sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg== dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" + bytes "1" + string_decoder "0.10" raw-loader@^4.0.2: version "4.0.2" @@ -31104,6 +31679,16 @@ raw-loader@~0.5.1: resolved "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz" integrity sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q== +rc-config-loader@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-4.1.3.tgz#1352986b8a2d8d96d6fd054a5bb19a60c576876a" + integrity sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w== + dependencies: + debug "^4.3.4" + js-yaml "^4.1.0" + json5 "^2.2.2" + require-from-string "^2.0.2" + rc@1.2.8, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" @@ -31225,16 +31810,6 @@ react-dom@16.14.0: prop-types "^15.6.2" scheduler "^0.19.1" -react-dom@16.9.0: - version "16.9.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz" - integrity sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.15.0" - react-dom@17.0.1: version "17.0.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz" @@ -31519,15 +32094,6 @@ react@16.14.0: object-assign "^4.1.1" prop-types "^15.6.2" -react@16.9.0: - version "16.9.0" - resolved "https://registry.npmjs.org/react/-/react-16.9.0.tgz" - integrity sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - react@17.0.1: version "17.0.1" resolved "https://registry.npmjs.org/react/-/react-17.0.1.tgz" @@ -31776,6 +32342,13 @@ readdirp@^2.0.0, readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +readdirp@^3.5.0, readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" @@ -31783,13 +32356,6 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - realpath-native@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz" @@ -31968,7 +32534,7 @@ regexpp@^2.0.1: resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.2.0: +regexpp@^3.0.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -32231,6 +32797,11 @@ require-main-filename@^2.0.0: resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + integrity sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q== + requirejs@2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz" @@ -32382,7 +32953,7 @@ resolve@1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1, resolve@^1.9.0: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1, resolve@^1.9.0, resolve@~1.22.1: version "1.22.2" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -32471,6 +33042,11 @@ rework@1.0.1: convert-source-map "^0.3.3" css "^2.0.0" +rfc4648@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rfc4648/-/rfc4648-1.5.2.tgz#cf5dac417dd83e7f4debf52e3797a723c1373383" + integrity sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg== + rfdc@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" @@ -32677,7 +33253,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@6.6.7, rxjs@^6.5.3, rxjs@^6.6.0: +rxjs@6.6.7, rxjs@^6.5.3, rxjs@^6.6.0, rxjs@~6.6.7: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -32718,6 +33294,11 @@ safe-identifier@^0.4.1: resolved "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz" integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== +safe-json-parse@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + integrity sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" @@ -32810,6 +33391,15 @@ sass@1.44.0, sass@^1.18.0, sass@^1.29.0: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" +sass@1.49.11: + version "1.49.11" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.11.tgz#1ffeb77faeed8b806a2a1e021d7c9fd3fc322cb7" + integrity sha512-wvS/geXgHUGs6A/4ud5BFIWKO1nKd7wYIGimDk4q4GFkJicILActpv9ueMT4eRGSsp1BdKHuw1WwAHXbhsJELQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sass@1.54.4: version "1.54.4" resolved "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz" @@ -32852,14 +33442,6 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.15.0: - version "0.15.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz" - integrity sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler@^0.19.1: version "0.19.1" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz" @@ -32938,6 +33520,14 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +scss-parser@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/scss-parser/-/scss-parser-1.0.6.tgz#cd1ba01ee32db19322c8df2badd26da8f166b1c1" + integrity sha512-SH3TaoaJFzfAtqs3eG1j5IuHJkeEW5rKUPIjIN+ZorLAyJLHItQGnsgwHk76v25GtLtpT9IqfAcqK4vFWdiw+w== + dependencies: + invariant "2.2.4" + lodash "4.17.21" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" @@ -33022,7 +33612,7 @@ semver@7.3.7: dependencies: lru-cache "^6.0.0" -semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.4: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.4: version "7.5.0" resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== @@ -33050,7 +33640,14 @@ semver@^7.5.1: dependencies: lru-cache "^6.0.0" -send@0.16.2: +semver@^7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +send@0.16.2, send@^0.16.2: version "0.16.2" resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz" integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== @@ -33088,24 +33685,6 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -send@^0.13.2: - version "0.13.2" - resolved "https://registry.npmjs.org/send/-/send-0.13.2.tgz" - integrity sha512-cQ0rmXHrdO2Iof08igV2bG/yXWD106ANwBg6DkGQNT2Vsznbgq6T0oAIQboy1GoFsIuy51jCim26aA9tj3Z3Zg== - dependencies: - debug "~2.2.0" - depd "~1.1.0" - destroy "~1.0.4" - escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.3.1" - mime "1.3.4" - ms "0.7.1" - on-finished "~2.3.0" - range-parser "~1.0.3" - statuses "~1.2.1" - sequencify@~0.0.7: version "0.0.7" resolved "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz" @@ -33185,7 +33764,7 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" -serve-static@1.15.0, serve-static@^1.13.1: +serve-static@1.15.0, serve-static@^1.13.2: version "1.15.0" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== @@ -33299,7 +33878,7 @@ shell-quote@^1.6.1, shell-quote@^1.7.3: resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -shelljs@^0.8.1, shelljs@^0.8.5: +shelljs@^0.8.5: version "0.8.5" resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== @@ -33831,7 +34410,7 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -stackframe@^1.3.4: +stackframe@^1.1.1, stackframe@^1.3.4: version "1.3.4" resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== @@ -33849,20 +34428,15 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@1, "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.0.0, statuses@^1.5.0, statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -statuses@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" - integrity sha512-pVEuxHdSGrt8QmQ3LOZXLhSA6MP/iPqKzZeO6Squ7PNGkA/9MBsSfV0/L+bIxkoDmjF4tZcLpcVq/fkqoHvuKg== +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.0.0, statuses@^1.5.0, statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== statuses@~1.4.0: version "1.4.0" @@ -33911,14 +34485,6 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-combiner@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz" - integrity sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ== - dependencies: - duplexer "~0.1.1" - through "~2.3.4" - stream-consume@~0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz" @@ -34024,6 +34590,11 @@ string-natural-compare@^3.0.1: resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw== + "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -34119,6 +34690,11 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string_decoder@0.10, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" @@ -34126,11 +34702,6 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" @@ -35152,7 +35723,7 @@ through2@^4.0.2: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4, through@~2.3.6: +through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3.6: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -35184,17 +35755,17 @@ tiny-invariant@^1.0.2: resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== -tiny-lr@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz" - integrity sha512-cmC4iw/nymXg+dc57AQ8Xv3bHxNQOGyQC3Ht5xLN67hksk6ucshrLk/VKiXuMbnZgToQ2NbnICxYj63xVw+Qbw== +tiny-lr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" + integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA== dependencies: - body-parser "~1.14.0" - debug "~2.2.0" + body "^5.1.0" + debug "^3.1.0" faye-websocket "~0.10.0" - livereload-js "^2.2.0" - parseurl "~1.3.0" - qs "~5.1.0" + livereload-js "^2.3.0" + object-assign "^4.1.0" + qs "^6.4.0" tiny-warning@^1.0.0: version "1.0.3" @@ -35424,10 +35995,10 @@ ts-interface-checker@^0.1.9: resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-jest@^29.0.3: - version "29.1.0" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz" - integrity sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA== +ts-jest@^29.1.0: + version "29.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" @@ -35435,7 +36006,7 @@ ts-jest@^29.0.3: json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" - semver "7.x" + semver "^7.5.3" yargs-parser "^21.0.1" ts-loader@^5.3.3: @@ -35575,7 +36146,7 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tsutils@^3.21.0: +tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== @@ -35672,7 +36243,7 @@ type-fest@^0.8.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@^1.6.16, type-is@~1.6.10, type-is@~1.6.16, type-is@~1.6.18: +type-is@^1.6.16, type-is@~1.6.16, type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -35716,7 +36287,12 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -"typescript@>=3 < 6", typescript@^5.1.3: +typescript@4.5.5, typescript@~4.5.5: + version "4.5.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + +"typescript@>=3 < 6": version "5.1.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz" integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== @@ -35731,6 +36307,11 @@ typescript@^4.1.2, typescript@^4.9.5: resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + typescript@~4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz" @@ -35741,11 +36322,6 @@ typescript@~4.3.2: resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz" integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== -typescript@~4.5.5: - version "4.5.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz" - integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== - typescript@~4.7.2: version "4.7.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" @@ -36089,7 +36665,7 @@ update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.11: escalade "^3.1.1" picocolors "^1.0.0" -update-notifier@^5.0.1: +update-notifier@^5.0.1, update-notifier@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== @@ -37282,6 +37858,14 @@ which-pm-runs@^1.0.0: resolved "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== +which-pm@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== + dependencies: + load-yaml-file "^0.2.0" + path-exists "^4.0.0" + which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" @@ -38020,7 +38604,7 @@ yargs-parser@^5.0.1: camelcase "^3.0.0" object.assign "^4.1.0" -yargs@16.2.0, yargs@^16.0.0, yargs@^16.1.1, yargs@^16.2.0: +yargs@16.2.0, yargs@^16.0.0, yargs@^16.1.0, yargs@^16.1.1, yargs@^16.2.0: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -38062,7 +38646,7 @@ yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^15.0.0, yargs@^15.3.1: +yargs@^15.3.1: version "15.4.1" resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== From 6d0fc14f2996f31225fc54ef3fdc452c95ebf7b3 Mon Sep 17 00:00:00 2001 From: Franck Cornu Date: Mon, 10 Jul 2023 22:23:58 -0400 Subject: [PATCH 4/4] - Style updates + misc fixes. Still issues with event propagation in the fluent combobox --- index.html | 2 +- packages/mgt-components/package.json | 1 + .../mgt-search-filters/mgt-base-filter.ts | 96 ++++++++++--------- .../mgt-checkbox-filter.ts | 62 ++++++++---- .../mgt-date-filter/mgt-date-filter.ts | 32 +++++-- .../mgt-search-filters/mgt-search-filters.ts | 16 ++-- .../mgt-adaptive-card/mgt-adaptive-card.ts | 3 +- .../mgt-search-verticals.ts | 3 +- .../src/styles/tailwind-styles.module.ts | 2 +- .../mgt-components/src/utils/SvgHelper.ts | 22 +++++ .../src/components/connectableComponent.ts | 2 +- yarn.lock | 16 ++-- 12 files changed, 165 insertions(+), 92 deletions(-) diff --git a/index.html b/index.html index d59c738882..96832fb1a3 100644 --- a/index.html +++ b/index.html @@ -100,7 +100,7 @@

mgt-search-results

id="99d3e914-2c8e-4f42-897e-53bb4d960e94" search-results-ids="b359f3dc-6b6a-4575-90ed-e5942bcbb8a6" operator="and" - settings='[{"filterName":"modifiedby","displayName":{"fr-fr":"Modifié par","ro-ro":"Modificat de","default":"Modified by"},"template":"checkbox","showCount":true,"operator":"or","isMulti":true,"type":"refiner","sortBy":"byCount","sortDirection":"descending","maxBuckets":10000,"sortIdx":10},{"filterName":"FileType","displayName":{"fr-fr":"Type de fichier","ro-ro":"Tip fișier","default":"File Type"},"template":"checkbox","showCount":true,"operator":"or","isMulti":true,"type":"refiner","sortBy":"byCount","sortDirection":"descending","maxBuckets":10000,"sortIdx":11,"aggregations":[{"aggregationName":{"fr-fr":"Document Word","default":"Word document"},"matchingValues":["docx","doc","docm"],"aggregationValue":"or(\"docx\",\"doc\",\"docm\")","aggregationValueIconUrl":"/dist/latest/assets/icons/word.svg"},{"aggregationName":{"fr-fr":"Modèle de fichier Word","default":"Word template"},"matchingValues":["dot","dotx","dotm"],"aggregationValue":"or(\"dot\",\"dotx\",\"dotm\")","aggregationValueIconUrl":"/dist/latest/assets/icons/word.svg"},{"aggregationName":{"fr-fr":"Fichier texte","default":"Text file"},"matchingValues":["txt","rtf"],"aggregationValue":"or(\"txt\",\"rtf\")","aggregationValueIconUrl":"/dist/latest/assets/icons/text.svg"},{"aggregationName":{"fr-fr":"Document Excel","default":"Excel document"},"matchingValues":["xlsx","xls","xlsm","xlsb","xlx","xml","csv"],"aggregationValue":"or(\"xlsx\",\"xls\",\"xlsm\",\"csv\",\"xlsb\",\"xlx\",\"xml\")","aggregationValueIconUrl":"/dist/latest/assets/icons/excel.svg"},{"aggregationName":{"fr-fr":"Modèle de fichier Excel","default":"Excel template"},"matchingValues":["xltm","xlt","xltx"],"aggregationValue":"or(\"xltm\",\"xlt\",\"xltx\")","aggregationValueIconUrl":"/dist/latest/assets/icons/excel.svg"},{"aggregationName":{"fr-fr":"Document PowerPoint","default":"PowerPoint document"},"matchingValues":["pptx","ppt","pptm","pps","ppsm","ppsx"],"aggregationValue":"or(\"pptx\",\"ppt\",\"pptm\",\"pps\",\"ppsm\",\"ppsx\")","aggregationValueIconUrl":"/dist/latest/assets/icons/powerpoint.svg"},{"aggregationName":{"fr-fr":"Modèle de fichier PowerPoint","default":"PowerPoint template"},"matchingValues":["potx","potm","pot"],"aggregationValue":"or(\"potx\",\"potm\",\"pot\")","aggregationValueIconUrl":"/dist/latest/assets/icons/powerpoint.svg"},{"aggregationName":{"fr-fr":"Page web","default":"Web page"},"matchingValues":["aspx","html"],"aggregationValue":"or(\"aspx\",\"html\")","aggregationValueIconUrl":"/dist/latest/assets/icons/webpage.svg"},{"aggregationName":{"fr-fr":"Archive compressée","default":"Compressed archive"},"matchingValues":["zip","7z","rar"],"aggregationValue":"or(\"zip\",\"7z\",\"rar\")","aggregationValueIconUrl":"/dist/latest/assets/icons/archive.svg"},{"aggregationName":"PDF","matchingValues":["pdf"],"aggregationValue":"pdf","aggregationValueIconUrl":"/dist/latest/assets/icons/pdf.svg"},{"aggregationName":{"fr-fr":"Document Visio","default":"Visio document"},"matchingValues":["vsdx","vsd","vsdm"],"aggregationValue":"or(\"vsdx\",\"vsd\",\"vsdm\")","aggregationValueIconUrl":"/dist/latest/assets/icons/visio.svg"},{"aggregationName":{"fr-fr":"Document OneNote","default":"OneNote document"},"matchingValues":["one"],"aggregationValue":"one","aggregationValueIconUrl":"/dist/latest/assets/icons/onenote.svg"}]},{"filterName":"LastModifiedTime","displayName":{"fr-fr":"Date de modification","ro-ro":"Ora ultima modificată","default":"Last modified date"},"template":"date","showCount":true,"operator":"and","isMulti":false,"type":"refiner","sortBy":"byCount","sortDirection":"descending","maxBuckets":10000,"sortIdx":12}]' + settings='[{"filterName":"modifiedby","displayName":{"fr-fr":"Modifié par","ro-ro":"Modificat de","default":"Modified by"},"template":"checkbox","showCount":true,"operator":"or","isMulti":true,"type":"refiner","sortBy":"byCount","sortDirection":"descending","maxBuckets":10000,"sortIdx":10},{"filterName":"FileType","displayName":{"fr-fr":"Type de fichier","ro-ro":"Tip fișier","default":"File Type"},"template":"checkbox","showCount":true,"operator":"or","isMulti":true,"type":"refiner","sortBy":"byCount","sortDirection":"descending","maxBuckets":10000,"sortIdx":11,"aggregations":[{"aggregationName":{"fr-fr":"Document Word","default":"Word document"},"matchingValues":["docx","doc","docm"],"aggregationValue":"or(\"docx\",\"doc\",\"docm\")","aggregationValueIconUrl":"docx"},{"aggregationName":{"fr-fr":"Modèle de fichier Word","default":"Word template"},"matchingValues":["dot","dotx","dotm"],"aggregationValue":"or(\"dot\",\"dotx\",\"dotm\")","aggregationValueIconUrl":"dotx"},{"aggregationName":{"fr-fr":"Fichier texte","default":"Text file"},"matchingValues":["txt","rtf"],"aggregationValue":"or(\"txt\",\"rtf\")","aggregationValueIconUrl":"txt"},{"aggregationName":{"fr-fr":"Document Excel","default":"Excel document"},"matchingValues":["xlsx","xls","xlsm","xlsb","xlx","xml","csv"],"aggregationValue":"or(\"xlsx\",\"xls\",\"xlsm\",\"csv\",\"xlsb\",\"xlx\",\"xml\")","aggregationValueIconUrl":"xlsx"},{"aggregationName":{"fr-fr":"Modèle de fichier Excel","default":"Excel template"},"matchingValues":["xltm","xlt","xltx"],"aggregationValue":"or(\"xltm\",\"xlt\",\"xltx\")","aggregationValueIconUrl":"xltx"},{"aggregationName":{"fr-fr":"Document PowerPoint","default":"PowerPoint document"},"matchingValues":["pptx","ppt","pptm","pps","ppsm","ppsx"],"aggregationValue":"or(\"pptx\",\"ppt\",\"pptm\",\"pps\",\"ppsm\",\"ppsx\")","aggregationValueIconUrl":"pptx"},{"aggregationName":{"fr-fr":"Modèle de fichier PowerPoint","default":"PowerPoint template"},"matchingValues":["potx","potm","pot"],"aggregationValue":"or(\"potx\",\"potm\",\"pot\")","aggregationValueIconUrl":"potx"},{"aggregationName":{"fr-fr":"Page web","default":"Web page"},"matchingValues":["aspx","html"],"aggregationValue":"or(\"aspx\",\"html\")","aggregationValueIconUrl":"html"},{"aggregationName":{"fr-fr":"Archive compressée","default":"Compressed archive"},"matchingValues":["zip","7z","rar"],"aggregationValue":"or(\"zip\",\"7z\",\"rar\")","aggregationValueIconUrl":"zip"},{"aggregationName":"PDF","matchingValues":["pdf"],"aggregationValue":"pdf","aggregationValueIconUrl":"pdf"},{"aggregationName":{"fr-fr":"Document Visio","default":"Visio document"},"matchingValues":["vsdx","vsd","vsdm"],"aggregationValue":"or(\"vsdx\",\"vsd\",\"vsdm\")","aggregationValueIconUrl":"vsdx"},{"aggregationName":{"fr-fr":"Document OneNote","default":"OneNote document"},"matchingValues":["one"],"aggregationValue":"one","aggregationValueIconUrl":"one"}]},{"filterName":"LastModifiedTime","displayName":{"fr-fr":"Date de modification","ro-ro":"Ora ultima modificată","default":"Last modified date"},"template":"date","showCount":true,"operator":"and","isMulti":false,"type":"refiner","sortBy":"byCount","sortDirection":"descending","maxBuckets":10000,"sortIdx":12}]' > diff --git a/packages/mgt-components/package.json b/packages/mgt-components/package.json index 2b92092824..0150221032 100644 --- a/packages/mgt-components/package.json +++ b/packages/mgt-components/package.json @@ -41,6 +41,7 @@ "@microsoft/microsoft-graph-types": "^2.0.0", "@microsoft/microsoft-graph-types-beta": "^0.29.0-preview", "@fluentui/web-components": "^2.5.12", + "@open-wc/scoped-elements": "2.2.0", "office-ui-fabric-core": "^11.0.0" }, "publishConfig": { diff --git a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts index 815ff78369..71c94ca394 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-base-filter.ts @@ -1,10 +1,22 @@ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-unsafe-return */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ import { MgtConnectableComponent } from '@microsoft/mgt-element'; -import { html, PropertyValues, TemplateResult } from 'lit'; + +import { css, html, TemplateResult } from 'lit'; import { state, property } from 'lit/decorators.js'; import { isEqual, cloneDeep, sumBy, orderBy } from 'lodash-es'; import { IDataFilterResult, IDataFilterValue, IDataFilterResultValue } from '@microsoft/mgt-element'; import { IDataFilterConfiguration, FilterSortType, FilterSortDirection } from '@microsoft/mgt-element'; -import { fluentSelect, fluentOption, provideFluentDesignSystem, fluentListbox } from '@fluentui/web-components'; +import { + fluentSelect, + fluentOption, + provideFluentDesignSystem, + fluentListbox, + fluentSearch, + fluentButton, + fluentCombobox +} from '@fluentui/web-components'; import { styles as tailwindStyles } from '../../../styles/tailwind-styles-css'; export enum DateFilterKeys { @@ -83,7 +95,13 @@ export abstract class MgtBaseFilterComponent extends MgtConnectableComponent { this.closeMenu = this.closeMenu.bind(this); // Register fluent tabs (as scoped elements) - provideFluentDesignSystem().register(fluentSelect(), fluentOption(), fluentListbox()); + provideFluentDesignSystem().register( + fluentSelect(), + fluentOption(), + fluentCombobox(), + fluentButton(), + fluentSearch() + ); } public render() { @@ -114,7 +132,13 @@ export abstract class MgtBaseFilterComponent extends MgtConnectableComponent { return html` - + 0 ? this.selectedValues.map(s => s.name) : this.localizedFilterName + } + >
${renderFilterName}
@@ -123,43 +147,12 @@ export abstract class MgtBaseFilterComponent extends MgtConnectableComponent { e.stopPropagation(); }}> ${this.renderFilterContent()} - -
+ + + `; } - protected firstUpdated(changedProperties: PropertyValues): void { - // Set the element id to uniquely identify it in the DOM - this.id = this.filter.filterName; - - const filterButton = this.renderRoot.querySelector("[data-tag-name='egg-button']"); - - this.buttonObserver = new MutationObserver(_mutations => { - _mutations.forEach(mutation => { - switch (mutation.type) { - case 'attributes': - if (mutation.attributeName === 'aria-expanded') { - this.isExpanded = (mutation.target as HTMLElement).getAttribute('aria-expanded') === 'true'; - } - break; - default: - break; - } - }); - }); - - if (filterButton) { - this.buttonObserver.observe(filterButton, { - attributeFilter: ['aria-expanded'], - attributeOldValue: true, - childList: false, - subtree: false - }); - } - - super.firstUpdated(changedProperties); - } - public disconnectedCallback(): void { // Could be already disconnected by an other filter instance if (this.buttonObserver) { @@ -249,7 +242,7 @@ export abstract class MgtBaseFilterComponent extends MgtConnectableComponent { * @returns the new aggregated filters values */ protected processAggregations(values: IDataFilterResultValue[]): IDataFilterResultValue[] { - let filteredValues = cloneDeep(values); + let filteredValues: IDataFilterResultValue[] = cloneDeep(values); if (this.filterConfiguration.aggregations) { this.filterConfiguration.aggregations.forEach(aggregation => { @@ -288,12 +281,29 @@ export abstract class MgtBaseFilterComponent extends MgtConnectableComponent { if (this.selectedValues.length > 0 && this.submittedFilterValues.length === 0) { this.resetSelectedValues(); } - - const eggMenu = this.renderRoot.querySelector("[data-tag-name='egg-menu']"); - eggMenu.removeAttribute('opened'); } static get styles() { - return [tailwindStyles]; + return [ + tailwindStyles, + css` + :host { + --neutral-fill-input-rest: transparent; + + input[type="date"]::-webkit-calendar-picker-indicator { + background: transparent; + bottom: 0; + color: transparent; + cursor: pointer; + height: auto; + left: 0; + position: absolute; + right: 0; + top: 0; + width: auto; + } + } + ` + ]; } } diff --git a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts index 9dfd87dc19..f1cc801b00 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-checkbox-filter/mgt-checkbox-filter.ts @@ -1,3 +1,9 @@ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +/* eslint-disable @typescript-eslint/unbound-method */ +/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */ import { html, PropertyValues } from 'lit'; import { cloneDeep } from 'lodash-es'; import { repeat } from 'lit/directives/repeat.js'; @@ -6,6 +12,8 @@ import { strings } from './strings'; import { MgtBaseFilterComponent } from '../mgt-base-filter'; import { IDataFilterResultValue, IDataFilterAggregation } from '@microsoft/mgt-element'; import { state } from 'lit/decorators.js'; +import { SvgIcon, getSvg } from '../../../../utils/SvgHelper'; +import { getFileTypeIconUriByExtension } from '../../../../styles/fluent-icons'; export class MgtCheckboxFilterComponent extends MgtBaseFilterComponent { @state() @@ -44,32 +52,36 @@ export class MgtCheckboxFilterComponent extends MgtBaseFilterComponent { const renderSearchBox = html`
- +
${getSvg(SvgIcon.Search)}
+ ${ this.searchKeyword - ? html`` + ? html` +
${getSvg(SvgIcon.Close)}
` : null } - - { this.filterValues(e.target.value); }} - - /> + > +
`; return html` -
{ e.preventDefault(); - e.stopPropagation(); + // e.stopPropagation(); }} >
@@ -82,16 +94,19 @@ export class MgtCheckboxFilterComponent extends MgtBaseFilterComponent {
${ this.selectedValues.length > 0 || this.submittedFilterValues.length > 0 - ? html`` : null }
-
+
${repeat( this.filteredValues, filterValue => filterValue.key, @@ -115,9 +130,16 @@ export class MgtCheckboxFilterComponent extends MgtBaseFilterComponent {
${ this.getFilterAggregation(filterValue.name) - ? html`` + ? html` + ` : null }
{ e.preventDefault(); e.stopPropagation(); }} > - - + }" @click=${this.applyDateFilters}>${strings.applyDates} +
`; } diff --git a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts index 88cde7f6ba..30546d7133 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-filters/mgt-search-filters.ts @@ -1,3 +1,6 @@ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/unbound-method */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable max-classes-per-file */ import { BuiltinFilterTemplates, @@ -27,6 +30,7 @@ import { MgtDateFilterComponent } from './mgt-date-filter/mgt-date-filter'; import { property, state } from 'lit/decorators.js'; import { html, nothing } from 'lit'; import { repeat } from 'lit/directives/repeat.js'; +import { getSvg, SvgIcon } from '../../../utils/SvgHelper'; export class MgtSearchFiltersComponentBase extends MgtConnectableComponent {} @@ -201,10 +205,10 @@ export class MgtSearchFiltersComponent extends ScopedElementsMixin(MgtSearchFilt return html`
-
-
+
+
- +
${getSvg(SvgIcon.Filter)}
${renderFilters} ${ (this.availableFilters.length > 0 && this.allSelectedFilters.length > 0) || @@ -212,7 +216,7 @@ export class MgtSearchFiltersComponent extends ScopedElementsMixin(MgtSearchFilt ? html`` : null @@ -527,8 +531,8 @@ export class MgtSearchFiltersComponent extends ScopedElementsMixin(MgtSearchFilt // Reset all values from sub components. List all valid sub filter components const filterComponents: MgtBaseFilterComponent[] = Array.prototype.slice.call( this.renderRoot.querySelectorAll(` - [data-tag-name='mgt-filter-date'], - [data-tag-name='mgt-filter-checkbox'] + mgt-filter-date, + mgt-filter-checkbox `) ); diff --git a/packages/mgt-components/src/components/preview/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts b/packages/mgt-components/src/components/preview/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts index 8b85b5c879..ae424c4320 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-results/mgt-adaptive-card/mgt-adaptive-card.ts @@ -1,7 +1,8 @@ import { FileFormat, MgtConnectableComponent, TemplateService } from '@microsoft/mgt-element'; -import { css, customElement, html, property, PropertyValues, state } from 'lit-element'; +import { css, html, PropertyValues } from 'lit'; import { unsafeHTML } from 'lit/directives/unsafe-html.js'; import { styles as tailwindStyles } from '../../../../styles/tailwind-styles-css'; +import { customElement, property, state } from 'lit/decorators.js'; /** * Process adaptive card content from an external file diff --git a/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.ts b/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.ts index 65db71bd6c..ec5fd18c62 100644 --- a/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.ts +++ b/packages/mgt-components/src/components/preview/mgt-search-verticals/mgt-search-verticals.ts @@ -1,8 +1,7 @@ -import { html } from 'lit-element'; +import { html } from 'lit'; import { EventConstants, customElement } from '@microsoft/mgt-element'; import { IDataVerticalConfiguration } from '@microsoft/mgt-element/src/models/IDataVerticalConfiguration'; import { ISearchVerticalEventData, MgtConnectableComponent, PageOpenBehavior } from '@microsoft/mgt-element'; - import { isEmpty, isEqual } from 'lodash-es'; import { styles } from './mgt-search-verticals-css'; import { styles as tailwindStyles } from '../../../styles/tailwind-styles-css'; diff --git a/packages/mgt-components/src/styles/tailwind-styles.module.ts b/packages/mgt-components/src/styles/tailwind-styles.module.ts index d99e3c17ca..9772340808 100644 --- a/packages/mgt-components/src/styles/tailwind-styles.module.ts +++ b/packages/mgt-components/src/styles/tailwind-styles.module.ts @@ -1,4 +1,4 @@ -import { css, CSSResult } from 'lit-element'; +import { css, CSSResult } from 'lit'; /** * exports lit-element css * @export styles diff --git a/packages/mgt-components/src/utils/SvgHelper.ts b/packages/mgt-components/src/utils/SvgHelper.ts index 67be44d881..d84848782e 100644 --- a/packages/mgt-components/src/utils/SvgHelper.ts +++ b/packages/mgt-components/src/utils/SvgHelper.ts @@ -282,6 +282,18 @@ export enum SvgIcon { */ Add, + /** + * + * Refresh icon + */ + Refresh, + + /** + * + * Filter icon + */ + Filter, + /** * * Calendar icon @@ -772,5 +784,15 @@ export const getSvg = (svgIcon: SvgIcon, color?: string) => { `; + + case SvgIcon.Refresh: + return html` + + `; + + case SvgIcon.Filter: + return html` + + `; } }; diff --git a/packages/mgt-element/src/components/connectableComponent.ts b/packages/mgt-element/src/components/connectableComponent.ts index b412f88f69..ae731f0a64 100644 --- a/packages/mgt-element/src/components/connectableComponent.ts +++ b/packages/mgt-element/src/components/connectableComponent.ts @@ -1,4 +1,4 @@ -import { state } from 'lit-element'; +import { state } from 'lit/decorators.js'; import { MgtTemplatedComponent } from './templatedComponent'; import { EventHandler } from '../utils/EventDispatcher'; import { isObjectLike } from 'lodash-es'; diff --git a/yarn.lock b/yarn.lock index 4f484ddabd..c799598289 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6852,6 +6852,14 @@ resolved "https://registry.yarnpkg.com/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz#b3c58f8699b197bb5e923d624c720e67c9f324d6" integrity sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA== +"@open-wc/scoped-elements@2.2.0", "@open-wc/scoped-elements@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-wc/scoped-elements/-/scoped-elements-2.2.0.tgz#4d65d7ba796c2bb76ef7934068532ca1795ea7b6" + integrity sha512-Qe+vWsuVHFzUkdChwlmJGuQf9cA3I+QOsSHULV/6qf6wsqLM2/32svNRH+rbBIMwiPEwzZprZlkvkqQRucYnVA== + dependencies: + "@lit/reactive-element" "^1.0.0" + "@open-wc/dedupe-mixin" "^1.4.0" + "@open-wc/scoped-elements@^1.2.4": version "1.3.5" resolved "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-1.3.5.tgz" @@ -6860,14 +6868,6 @@ "@open-wc/dedupe-mixin" "^1.3.0" lit-html "^1.0.0" -"@open-wc/scoped-elements@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@open-wc/scoped-elements/-/scoped-elements-2.2.0.tgz#4d65d7ba796c2bb76ef7934068532ca1795ea7b6" - integrity sha512-Qe+vWsuVHFzUkdChwlmJGuQf9cA3I+QOsSHULV/6qf6wsqLM2/32svNRH+rbBIMwiPEwzZprZlkvkqQRucYnVA== - dependencies: - "@lit/reactive-element" "^1.0.0" - "@open-wc/dedupe-mixin" "^1.4.0" - "@open-wc/semantic-dom-diff@^0.13.16": version "0.13.21" resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz#718b9ec5f9a98935fc775e577ad094ae8d8b7dea"