diff --git a/CHANGELOG.json b/CHANGELOG.json index b9e5f1fff..ec4f39565 100644 --- a/CHANGELOG.json +++ b/CHANGELOG.json @@ -1,5 +1,37 @@ { "versions": [ + { + "version": "3.18.0", + "changes": { + "new": [], + "enhancements": [ + "`DynamicField`: Added orderBy to DynamicField props for lookup fields [#1747](https://github.com/pnp/sp-dev-fx-controls-react/pull/1747)", + "`DateTimePicker`: disable array of dates [#516](https://github.com/pnp/sp-dev-fx-controls-react/issues/516)", + "`DynamicForm`: new `customIcons` property to allow custom icons for the form [#1745](https://github.com/pnp/sp-dev-fx-controls-react/pull/1745)", + "`RichText`: Added style property to Rich text control [#1773](https://github.com/pnp/sp-dev-fx-controls-react/pull/1773)", + "`fast-serve`: Fast-serve update to match the most recent changes. [#1782](https://github.com/pnp/sp-dev-fx-controls-react/pull/1782)", + "`PeoplePicker`: Added context optimization [#1764](https://github.com/pnp/sp-dev-fx-controls-react/pull/1764)", + "`Multiple controls`: Wrong fluentui imports cause webpack build errors [#1763](https://github.com/pnp/sp-dev-fx-controls-react/issues/1763)", + "`FileTypeIcon`: Added standard events [#1789](https://github.com/pnp/sp-dev-fx-controls-react/pull/1789)" + ], + "fixes": [ + "`FolderPicker`: Update documentation on how to use the control with siteAbsoluteUrl property [#1743](https://github.com/pnp/sp-dev-fx-controls-react/pull/1743)", + "Readme documents highlight extension does not work correctly [#1495](https://github.com/pnp/sp-dev-fx-controls-react/issues/1495)", + "`DynamicForm`: Error on rendering DynamicForm when having a Date Field with internal name starting with underscore ('_')[#1738](https://github.com/pnp/sp-dev-fx-controls-react/issues/1738)", + "`DynamicForm`: Dynamic form loading error in other site [#1758](https://github.com/pnp/sp-dev-fx-controls-react/issues/1758)" + ] + }, + "contributions": [ + "[Guido Zambarda](https://github.com/GuidoZam)", + "[Harminder Singh](https://github.com/HarminderSethi)", + "[IRRDC](https://github.com/IRRDC)", + "[Matthias Z'Brun](https://github.com/raclettierer)", + "[Michaël Maillot](https://github.com/michaelmaillot)", + "[Nishkalank Bezawada](https://github.com/NishkalankBezawada)", + "[Sergei Sergeev](https://github.com/s-KaiNet)", + "[srpmtt](https://github.com/srpmtt)" + ] + }, { "version": "3.17.0", "changes":{ diff --git a/CHANGELOG.md b/CHANGELOG.md index aab3d886a..244ee3c7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # Releases +## 3.18.0 + +### Enhancements + +- `DynamicField`: Added orderBy to DynamicField props for lookup fields [#1747](https://github.com/pnp/sp-dev-fx-controls-react/pull/1747) +- `DateTimePicker`: disable array of dates [#516](https://github.com/pnp/sp-dev-fx-controls-react/issues/516) +- `DynamicForm`: new `customIcons` property to allow custom icons for the form [#1745](https://github.com/pnp/sp-dev-fx-controls-react/pull/1745) +- `RichText`: Added style property to Rich text control [#1773](https://github.com/pnp/sp-dev-fx-controls-react/pull/1773) +- `fast-serve`: Fast-serve update to match the most recent changes. [#1782](https://github.com/pnp/sp-dev-fx-controls-react/pull/1782) +- `PeoplePicker`: Added context optimization [#1764](https://github.com/pnp/sp-dev-fx-controls-react/pull/1764) +- `Multiple controls`: Wrong fluentui imports cause webpack build errors [#1763](https://github.com/pnp/sp-dev-fx-controls-react/issues/1763) +- `FileTypeIcon`: Added standard events [#1789](https://github.com/pnp/sp-dev-fx-controls-react/pull/1789) + +### Fixes + +- `FolderPicker`: Update documentation on how to use the control with siteAbsoluteUrl property [#1743](https://github.com/pnp/sp-dev-fx-controls-react/pull/1743) +- Readme documents highlight extension does not work correctly [#1495](https://github.com/pnp/sp-dev-fx-controls-react/issues/1495) +- `DynamicForm`: Error on rendering DynamicForm when having a Date Field with internal name starting with underscore ('_')[#1738](https://github.com/pnp/sp-dev-fx-controls-react/issues/1738) +- `DynamicForm`: Dynamic form loading error in other site [#1758](https://github.com/pnp/sp-dev-fx-controls-react/issues/1758) + +### Contributors + +Special thanks to our contributors (in alphabetical order): [Guido Zambarda](https://github.com/GuidoZam), [Harminder Singh](https://github.com/HarminderSethi), [IRRDC](https://github.com/IRRDC), [Matthias Z'Brun](https://github.com/raclettierer), [Michaël Maillot](https://github.com/michaelmaillot), [Nishkalank Bezawada](https://github.com/NishkalankBezawada), [Sergei Sergeev](https://github.com/s-KaiNet), [srpmtt](https://github.com/srpmtt). + ## 3.17.0 ### Enhancements diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index aab3d886a..244ee3c7b 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -1,5 +1,29 @@ # Releases +## 3.18.0 + +### Enhancements + +- `DynamicField`: Added orderBy to DynamicField props for lookup fields [#1747](https://github.com/pnp/sp-dev-fx-controls-react/pull/1747) +- `DateTimePicker`: disable array of dates [#516](https://github.com/pnp/sp-dev-fx-controls-react/issues/516) +- `DynamicForm`: new `customIcons` property to allow custom icons for the form [#1745](https://github.com/pnp/sp-dev-fx-controls-react/pull/1745) +- `RichText`: Added style property to Rich text control [#1773](https://github.com/pnp/sp-dev-fx-controls-react/pull/1773) +- `fast-serve`: Fast-serve update to match the most recent changes. [#1782](https://github.com/pnp/sp-dev-fx-controls-react/pull/1782) +- `PeoplePicker`: Added context optimization [#1764](https://github.com/pnp/sp-dev-fx-controls-react/pull/1764) +- `Multiple controls`: Wrong fluentui imports cause webpack build errors [#1763](https://github.com/pnp/sp-dev-fx-controls-react/issues/1763) +- `FileTypeIcon`: Added standard events [#1789](https://github.com/pnp/sp-dev-fx-controls-react/pull/1789) + +### Fixes + +- `FolderPicker`: Update documentation on how to use the control with siteAbsoluteUrl property [#1743](https://github.com/pnp/sp-dev-fx-controls-react/pull/1743) +- Readme documents highlight extension does not work correctly [#1495](https://github.com/pnp/sp-dev-fx-controls-react/issues/1495) +- `DynamicForm`: Error on rendering DynamicForm when having a Date Field with internal name starting with underscore ('_')[#1738](https://github.com/pnp/sp-dev-fx-controls-react/issues/1738) +- `DynamicForm`: Dynamic form loading error in other site [#1758](https://github.com/pnp/sp-dev-fx-controls-react/issues/1758) + +### Contributors + +Special thanks to our contributors (in alphabetical order): [Guido Zambarda](https://github.com/GuidoZam), [Harminder Singh](https://github.com/HarminderSethi), [IRRDC](https://github.com/IRRDC), [Matthias Z'Brun](https://github.com/raclettierer), [Michaël Maillot](https://github.com/michaelmaillot), [Nishkalank Bezawada](https://github.com/NishkalankBezawada), [Sergei Sergeev](https://github.com/s-KaiNet), [srpmtt](https://github.com/srpmtt). + ## 3.17.0 ### Enhancements diff --git a/docs/documentation/docs/controls/Carousel.md b/docs/documentation/docs/controls/Carousel.md index e87673ad4..994ce13be 100644 --- a/docs/documentation/docs/controls/Carousel.md +++ b/docs/documentation/docs/controls/Carousel.md @@ -104,8 +104,8 @@ The Carousel component can be configured with the following properties: | isInfinite | boolean | no | Indicates if infinite scrolling is enabled. | | canMoveNext | boolean | no | Property indicates if the next item button can be clicked. If not provided, status of the button is calculated based on the current index.
It is mandatory when triggerPageEvent is used. | | canMovePrev | boolean | no | Property indicates if the previous item button can be clicked. If not provided, status of the button is calculated based on the current index.
It is mandatory when triggerPageEvent is used. | -| buttonsLocation | CarouselButtonsLocation | yes | Specifies the location of the buttons inside the container. | -| buttonsDisplay | CarouselButtonsDisplay | yes | Specifies the buttons container display mode. | +| buttonsLocation | CarouselButtonsLocation | no | Specifies the location of the buttons inside the container. Default: center | +| buttonsDisplay | CarouselButtonsDisplay | no | Specifies the buttons container display mode. Default: block | | containerStyles | ICssInput | no | Allows to specify own styles for carousel container. | | loadingComponentContainerStyles | ICssInput | no | Allows to specify own styles for loading component. | | contentContainerStyles | ICssInput | no | Allows to specify own styles for elements container. | @@ -134,6 +134,7 @@ The Carousel component can be configured with the following properties: | indicatorsContainerStyles | ICssInput | no | Allows to specify own styles for indicators container when indicatorsDisplay is set to "block" | | prevButtonAriaLabel | string | no | Aria label of the PreviousItem button. Default 'Previous item'. | | nextButtonAriaLabel | string | no | Aria label of the NextItem button. Default 'Next item'. | +| contentHeight | number | no | Allows to specify the height of the content. Can be used instead of providing styles for the content container (`contentContainerStyles`). | enum `CarouselButtonsLocation` diff --git a/docs/documentation/docs/controls/ContentTypePicker.md b/docs/documentation/docs/controls/ContentTypePicker.md index c8defd44e..885960955 100644 --- a/docs/documentation/docs/controls/ContentTypePicker.md +++ b/docs/documentation/docs/controls/ContentTypePicker.md @@ -57,20 +57,20 @@ The `ContentTypePicker` control can be configured with the following properties: | context | BaseComponentContext | yes | The context object of the SPFx loaded webpart or customizer. | | listId | string | no | The ID of the list or library you wish to select content type(s) from. When not specified, picker will be populated with site content types.| | className | string | no | If provided, additional class name to provide on the dropdown element. | -disabled | boolean | no | Whether or not the control is disabled. | -includeHidden | boolean | no | Whether or not to include hidden content types. Default is true. | -includeReadOnly | boolean | no | Whether or not to include read-only content types. Default is true. | -group | string | no | Only show content types of a certain group. | -filter | string | no | Filter content types from OData query (takes the upperhand of `hidden`, `readOnly` and `group` Filters). | -orderBy | ContentTypesOrderBy | no | How to order the content types. | -selectedContentTypes | string \| string[] | no | IDs of the selected item(s). If you provide this, you must maintain selection state by observing `onSelectionChanged` events and passing a new value in when changed. -multiSelect | boolean | no | Indicates if multi-choice selections is allowed. Default is false. | -label | string | no | The label to display. | -placeholder | string | no | Input placeholder text. Displayed until option is selected. | -onSelectionChanged | (newValue: ISPContentType \| ISPContentType[]): void | no | Callback issued when the selected option changes. | -filterItems | (contentTypes: ISPContentType[]): ISPContentType[] | no | This function is invoked after the filtering has been done. This allows you to add additional custom filtering. -webAbsoluteUrl | string | no | Absolute Web Url of target site (user requires permissions). | -showBlankOption | boolean | no | Whether or not to show a blank option. Default is false. Works only when `multiSelect` is false. | +| disabled | boolean | no | Whether or not the control is disabled. | +| includeHidden | boolean | no | Whether or not to include hidden content types. Default is true. | +| includeReadOnly | boolean | no | Whether or not to include read-only content types. Default is true. | +| group | string | no | Only show content types of a certain group. | +| filter | string | no | Filter content types from OData query (takes the upperhand of `hidden`, `readOnly` and `group` Filters). | +| orderBy | ContentTypesOrderBy | no | How to order the content types. | +| selectedContentTypes | string \| string[] | no | IDs of the selected item(s). If you provide this, you must maintain selection state by observing `onSelectionChanged` events and passing a new value in when changed. | +| multiSelect | boolean | no | Indicates if multi-choice selections is allowed. Default is false. | +| label | string | no | The label to display. | +| placeholder | string | no | Input placeholder text. Displayed until option is selected. | +| onSelectionChanged | (newValue: ISPContentType \| ISPContentType[]): void | no | Callback issued when the selected option changes. | +| filterItems | (contentTypes: ISPContentType[]): ISPContentType[] | no | This function is invoked after the filtering has been done. This allows you to add additional custom filtering. | +| webAbsoluteUrl | string | no | Absolute Web Url of target site (user requires permissions). | +| showBlankOption | boolean | no | Whether or not to show a blank option. Default is false. Works only when `multiSelect` is false. | Enum `ContentTypesOrderBy` diff --git a/docs/documentation/docs/controls/DateTimePicker.md b/docs/documentation/docs/controls/DateTimePicker.md index d5a91f926..4cdb1891e 100644 --- a/docs/documentation/docs/controls/DateTimePicker.md +++ b/docs/documentation/docs/controls/DateTimePicker.md @@ -27,6 +27,7 @@ Here are some examples of the control: ```TypeScript import { DateTimePicker, DateConvention, TimeConvention } from '@pnp/spfx-controls-react/lib/DateTimePicker'; ``` + - Use the `DateTimePicker` control in your code as follows, either as an uncontrolled or a controlled component: ```TypeScript @@ -47,7 +48,6 @@ import { DateTimePicker, DateConvention, TimeConvention } from '@pnp/spfx-contro The `DateTimePicker` control can be configured with the following properties: - | Property | Type | Required | Description | | ---- | ---- | ---- | ---- | | label | string | no | Property field label displayed on top. | @@ -72,12 +72,13 @@ The `DateTimePicker` control can be configured with the following properties: | timeDisplayControlType | TimeDisplayControlType | no | Specifies what type of control to use when rendering time part. | | showLabels | boolean | no | Specifies if labels in front of date and time parts should be rendered. | | placeholder | string | no | Placeholder text for the DatePicker. | -| initialPickerDate | Date | no | The initially highlighted date in the calendar picker +| initialPickerDate | Date | no | The initially highlighted date in the calendar picker | | maxDate | Date | no | The maximum allowable date. | | minDate | Date | no | The minimum allowable date. | | minutesIncrementStep | MinutesIncrement | no | Specifies minutes' increment step for `TimeDisplayControlType.Dropdow` | -| showClearDate | boolean | no | Controls whether the clearDate iconbutton must be available when date is selected, default to false -| showClearDateIcon | string | no | Controls the icon used for clearDate iconbutton. Defaults to 'RemoveEvent' +| showClearDate | boolean | no | Controls whether the clearDate iconbutton must be available when date is selected, default to false | +| showClearDateIcon | string | no | Controls the icon used for clearDate iconbutton. Defaults to 'RemoveEvent' | +| restrictedDates | Date[] | no | If set the Calendar will not allow selection of dates in this array. | Enum `TimeDisplayControlType` @@ -112,6 +113,7 @@ Interface `IDateTimePickerStrings` extends [IDatePickerStrings](https://develope | textErrorMessage | string | no | Error message when text is entered in the date picker. | Type `MinutesIncrement` + ```typescript type MinutesIncrement = 1 | 5 | 10 | 15 | 30; ``` diff --git a/docs/documentation/docs/controls/DynamicForm.md b/docs/documentation/docs/controls/DynamicForm.md index ce2326d4d..6eb1b8413 100644 --- a/docs/documentation/docs/controls/DynamicForm.md +++ b/docs/documentation/docs/controls/DynamicForm.md @@ -62,6 +62,7 @@ The `DynamicForm` can be configured with the following properties: | fieldOverrides | {[columnInternalName: string] : {(fieldProperties: IDynamicFieldProps): React.ReactElement\}} | no | Key value pair for fields you want to override. Key is the internal field name, value is the function to be called for the custom element to render. | | respectEtag | boolean | no | Specifies if the form should respect the ETag of the item. Default - `true` | | validationErrorDialogProps | IValidationErrorDialogProps | no | Specifies validation error dialog properties | +| customIcons | { [ columnInternalName: string ]: string } | no | Specifies custom icons for the form. The key of this dictionary is the column internal name, the value is the Fluent UI icon name. | ## Validation Error Dialog Properties `IValidationErrorDialogProps` | Property | Type | Required | Description | diff --git a/docs/documentation/docs/controls/FileTypeIcon.md b/docs/documentation/docs/controls/FileTypeIcon.md index d37f8bb77..208faed80 100644 --- a/docs/documentation/docs/controls/FileTypeIcon.md +++ b/docs/documentation/docs/controls/FileTypeIcon.md @@ -42,5 +42,11 @@ The FileTypeIcon component can be configured with the following properties: | path | string | no | Path to the document. If this is provided, the control will use the file extension to display the corresponding icon. | | size | ImageSize | no | This is a property that only needs to be used when the type is set to image. It allows you to specify the image size. small (16px), normal (20px), medium (48px) and large (96px) are possible. Use the **ImageSize** enum to get the list of available images sizes. | | type | IconType | yes | This property specifies is you want to use the icon font or image. Use the **IconType** enum to get the list of available icon types. | +| onClick | React.MouseEvent<HTMLElement> | no | Event triggered when the icon is clicked. | +| onDoubleClick | React.MouseEvent<HTMLElement> | no | Event triggered when the icon is double clicked. | +| onMouseEnter | React.MouseEvent<HTMLElement> | no | Event triggered when the mouse cursor enters the icon (without event bubbling). | +| onMouseLeave | React.MouseEvent<HTMLElement> | no | Event triggered when the mouse cursor leaves the icon. | +| onMouseOver | React.MouseEvent<HTMLElement> | no | Event triggered when the mouse cursor enters the icon (with event bubbling). | +| onMouseUp | React.MouseEvent<HTMLElement> | no | Event triggered when the mouse button is released after clicked on the icon. | ![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/FileTypeIcon) diff --git a/docs/documentation/docs/controls/FolderPicker.md b/docs/documentation/docs/controls/FolderPicker.md index a4e3df00e..b3d335495 100644 --- a/docs/documentation/docs/controls/FolderPicker.md +++ b/docs/documentation/docs/controls/FolderPicker.md @@ -42,6 +42,19 @@ import { FolderPicker, IFolder } from "@pnp/spfx-controls-react/lib/FolderPicker canCreateFolders={true} /> ``` +- To use the `FolderExplorer` control to fetch folders from different sitecollection in your code as follows: + +```TypeScript + +``` + - The `onSelect` change event returns the selected folder and can be implemented as follows: ```TypeScript diff --git a/docs/documentation/docs/controls/PeoplePicker.md b/docs/documentation/docs/controls/PeoplePicker.md index ab8f623ba..372386807 100644 --- a/docs/documentation/docs/controls/PeoplePicker.md +++ b/docs/documentation/docs/controls/PeoplePicker.md @@ -17,21 +17,26 @@ This control renders a People picker field which can be used to select one or mo ![Selected people](../assets/Peoplepicker-multiplechoices.png) - ## How to use this control in your solutions - Check that you installed the `@pnp/spfx-controls-react` dependency. Check out the [getting started](../../#getting-started) page for more information about installing the dependency. - Import the following modules to your component: ```typescript -import { PeoplePicker, PrincipalType } from "@pnp/spfx-controls-react/lib/PeoplePicker"; +import { IPeoplePickerContext, PeoplePicker, PrincipalType } from "@pnp/spfx-controls-react/lib/PeoplePicker"; ``` - Use the `PeoplePicker` control in your code as follows: ```typescript +const peoplePickerContext: IPeoplePickerContext = { + absoluteUrl: this.props.context.pageContext.web.absoluteUrl, + msGraphClientFactory: this.props.context.msGraphClientFactory, + spHttpClient: this.props.context.spHttpClient +}; + | no | Styles to apply on control | +| placeholder | string | no | Short text hint to display in empty picker | | +| styles | Partial | no | Styles to apply on control | | | searchTextLimit | number | no | Specifies the minimum character count needed to begin retrieving search results. | 2 | Enum `PrincipalType` @@ -97,13 +102,21 @@ The `PrincipalType` enum can be used to specify the types of information you wan | SecurityGroup | 4 | | SharePointGroup | 8 | +Interface `IPeoplePickerContext` -## MSGraph Permissions required +Provides mandatory properties to search users on the tenant -This control requires the following scopes if groupId is of type String: +| Value | Type | Description | +| ---- | ---- | ---- | +| absoluteUrl | string | Current `SPWeb` absolute URL. | +| msGraphClientFactory | MSGraphClientFactory | Instance of MSGraphClientFactory used for querying Microsoft Graph REST API. | +| spHttpClient | SPHttpClient | Instance of SPHttpClient used for querying SharePoint REST API. | -at least : GroupMember.Read.All, Directory.Read.All +## MSGraph Permissions required +This control requires at least one the following scopes if `groupId` is of type `string`: -![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/PeoplePicker) +- *GroupMember.Read.All* + *User.ReadBasic.All* +- *Directory.Read.All* +![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/PeoplePicker) diff --git a/docs/documentation/docs/controls/RichText.md b/docs/documentation/docs/controls/RichText.md index 74249e044..b9a76b8de 100644 --- a/docs/documentation/docs/controls/RichText.md +++ b/docs/documentation/docs/controls/RichText.md @@ -70,6 +70,7 @@ The RichText control can be configured with the following properties: | id | string | no | The ID to apply to the RichText control. | | label | string | no | The label displayed above the RichText control. | | className | string | no | The custom CSS class to apply to the RichText control. | +| style | React.CSSProperties | no | The custom styles to apply to the RichText control. | | isEditMode | boolean | no | `true` indicates that users will be able to edit the content of the RichText control. `false` will display the rich text as read-only. | | styleOptions | StyleOptions | no | Define the styles you want to show or hide for the rich text editor | | value | string | no | Sets the rich text to display in the RichText control. | diff --git a/docs/documentation/docs/guides/contributing.md b/docs/documentation/docs/guides/contributing.md index 77e421f22..3caa904d0 100644 --- a/docs/documentation/docs/guides/contributing.md +++ b/docs/documentation/docs/guides/contributing.md @@ -27,7 +27,7 @@ Typos are embarrassing! Most PR's that fix typos will be accepted immediately. I Before contributing: - ensure that the **dev** branch on your fork is in sync with the original **sp-dev-fx-controls-react** repository - ```sh + ```bash # assuming you are in the folder of your locally cloned fork.... git checkout dev @@ -39,7 +39,8 @@ Before contributing: ``` - create a feature branch for your change. If you'll get stuck on an issue or merging your PR will take a while, this will allow you to have a clean dev branch that you can use for contributing other changes - ```sh + + ```bash git checkout -b my-contribution ``` diff --git a/docs/documentation/docs/guides/submitting-pr.md b/docs/documentation/docs/guides/submitting-pr.md index 6cf972aed..403789035 100644 --- a/docs/documentation/docs/guides/submitting-pr.md +++ b/docs/documentation/docs/guides/submitting-pr.md @@ -7,7 +7,7 @@ We appreciate your initiative and would love to integrate your work with the res - [AC: Keep Your Forked Git Repo Updated with Changes from the Original Upstream Repo](http://www.andrewconnell.com/blog/keep-your-forked-git-repo-updated-with-changes-from-the-original-upstream-repo) - Looking for a quick cheat sheet? Look no further: - ```sh + ```bash # assuming you are in the folder of your locally cloned fork.... git checkout dev diff --git a/fast-serve/config.json b/fast-serve/config.json deleted file mode 100644 index 632a692f9..000000000 --- a/fast-serve/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/s-KaiNet/spfx-fast-serve/master/schema/config.1.1.schema.json", - "cli": { - "isLibraryComponent": false - } -} \ No newline at end of file diff --git a/fast-serve/webpack.extend.js b/fast-serve/webpack.extend.js deleted file mode 100644 index 22e737e60..000000000 --- a/fast-serve/webpack.extend.js +++ /dev/null @@ -1,24 +0,0 @@ -/* -* User webpack settings file. You can add your own settings here. -* Changes from this file will be merged into the base webpack configuration file. -* This file will not be overwritten by the subsequent spfx-fast-serve calls. -*/ - -// you can add your project related webpack configuration here, it will be merged using webpack-merge module -// i.e. plugins: [new webpack.Plugin()] -const webpackConfig = { - -} - -// for even more fine-grained control, you can apply custom webpack settings using below function -const transformConfig = function (initialWebpackConfig) { - // transform the initial webpack config here, i.e. - // initialWebpackConfig.plugins.push(new webpack.Plugin()); etc. - - return initialWebpackConfig; -} - -module.exports = { - webpackConfig, - transformConfig -} diff --git a/package-lock.json b/package-lock.json index da33efb08..37d806777 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@pnp/spfx-controls-react", - "version": "3.17.0", + "version": "3.18.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@pnp/spfx-controls-react", - "version": "3.17.0", + "version": "3.18.0", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -90,9 +90,6 @@ "@types/lodash": "4.14.202", "@types/quill": "^1.3.10", "@types/react": "17.0.45", - "@types/react-addons-shallow-compare": "0.14.17", - "@types/react-addons-test-utils": "0.14.15", - "@types/react-addons-update": "0.14.21", "@types/react-dom": "17.0.17", "@types/react-mentions": "^4.1.3", "@types/sinon": "10.0.13", @@ -117,7 +114,7 @@ "react-test-renderer": "17.0.1", "request-promise": "4.2.5", "sonarqube-scanner": "2.8.2", - "spfx-fast-serve-helpers": "1.18.4", + "spfx-fast-serve-helpers": "1.18.11", "ts-jest": "^29.1.1", "tslib": "2.3.1", "typescript": "4.7.4", @@ -12159,33 +12156,6 @@ "csstype": "^3.0.2" } }, - "node_modules/@types/react-addons-shallow-compare": { - "version": "0.14.17", - "resolved": "https://registry.npmjs.org/@types/react-addons-shallow-compare/-/react-addons-shallow-compare-0.14.17.tgz", - "integrity": "sha512-bGyzYO7bo0mV1/35caXJTFQSxcNeShvJ/WK2VuWJXWzn4HdGa1p+98/NYJDT5F361sZhY6ok/7s65vn0RX9lrQ==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-addons-test-utils": { - "version": "0.14.15", - "resolved": "https://registry.npmjs.org/@types/react-addons-test-utils/-/react-addons-test-utils-0.14.15.tgz", - "integrity": "sha512-pmcBYyDTVjqGe2PRQIu3Q8d6nvsHUssbiO/vd0f+bxhxgcSXEH5BHC0AFJJ8p2W499BHpFSyz01c8sMN4PzmTA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-addons-update": { - "version": "0.14.21", - "resolved": "https://registry.npmjs.org/@types/react-addons-update/-/react-addons-update-0.14.21.tgz", - "integrity": "sha512-HOxr0Hd8C1L4uw8DHyv2etqMVIj78oLEpe567/HgjoE+1Lc+PUsTGXTrkr1BDvFqsu5r49mSlgI5evwrk9eutA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-dom": { "version": "17.0.17", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz", @@ -13609,9 +13579,9 @@ } }, "node_modules/adaptive-expressions": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/adaptive-expressions/-/adaptive-expressions-4.21.1.tgz", - "integrity": "sha512-XgX+eAFWUjvcZIaLz/jU6iacPLH+/Jop9W4F3j68KAjyRcHMxi4l2hasqdBivm4f/euKGyPoXeFbYV7kvnMnxg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/adaptive-expressions/-/adaptive-expressions-4.22.1.tgz", + "integrity": "sha512-0/fSfkm5eSZ3ntbcqvYgQpqnRorGATpjvDKYncM4qNKWqk4nCUun+VeUFnbZ0CEjOWXzqgWSzy07bvK8SOW/Uw==", "dependencies": { "@microsoft/recognizers-text-data-types-timex-expression": "1.3.0", "@types/atob-lite": "^2.0.0", @@ -24840,9 +24810,9 @@ } }, "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", "dev": true }, "node_modules/ip-regex": { @@ -34689,9 +34659,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, "funding": [ { @@ -34708,7 +34678,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -38869,13 +38839,13 @@ "dev": true }, "node_modules/spfx-fast-serve-helpers": { - "version": "1.18.4", - "resolved": "https://registry.npmjs.org/spfx-fast-serve-helpers/-/spfx-fast-serve-helpers-1.18.4.tgz", - "integrity": "sha512-gJvw5bbhDQth3khWEKldKmgFlb4VERHyozozKf0fcy2rh8ZK3EKu77Tw0yu8KLuZm6GFeFRSSu4uecnuUu8AEw==", + "version": "1.18.11", + "resolved": "https://registry.npmjs.org/spfx-fast-serve-helpers/-/spfx-fast-serve-helpers-1.18.11.tgz", + "integrity": "sha512-hSsvuPYIlHf7r7IvEPYCzHFChlVxXMxGm3sCungQy52BzFhbD8YASSKx36mlhQb/qiwHbB1IYfoHdtDMwvppog==", "dev": true, "dependencies": { - "@microsoft/loader-load-themed-styles": "2.0.45", - "@microsoft/spfx-heft-plugins": "1.18.0", + "@microsoft/loader-load-themed-styles": "2.1.7", + "@microsoft/spfx-heft-plugins": "1.18.2", "@pmmmwh/react-refresh-webpack-plugin": "0.5.7", "@types/copy-webpack-plugin": "6.4.3", "@types/cross-spawn": "6.0.3", @@ -38885,6 +38855,7 @@ "autoprefixer": "9.8.8", "clean-css-loader": "3.0.0", "colors": "1.4.0", + "commander": "11.1.0", "copy-webpack-plugin": "6.4.0", "cross-spawn": "7.0.3", "css-loader": "5.2.4", @@ -38897,8 +38868,8 @@ "kill-port": "1.6.1", "loader-utils": "2.0.0", "node-fetch": "2.6.1", - "postcss": "7.0.38", - "postcss-loader": "4.2.0", + "postcss": "8.4.33", + "postcss-loader": "4.3.0", "react-refresh": "0.14.0", "react-refresh-typescript": "2.0.6", "sass": "1.44.0", @@ -38974,1895 +38945,6 @@ "node": ">=10.10.0" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/loader-load-themed-styles": { - "version": "2.0.45", - "resolved": "https://registry.npmjs.org/@microsoft/loader-load-themed-styles/-/loader-load-themed-styles-2.0.45.tgz", - "integrity": "sha512-04foUzzYBbKpBKj16N9pjyKJzt6jthyd2gMzg1fQJPfrIblsJanumlhiUitpZjzyhs/53qYzEsTo0PZCKRHUpQ==", - "dev": true, - "dependencies": { - "loader-utils": "1.4.2" - }, - "peerDependencies": { - "@microsoft/load-themed-styles": "^2.0.47", - "@types/webpack": "^4" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/loader-load-themed-styles/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/loader-load-themed-styles/node_modules/loader-utils": { - "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==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/rush-lib": { - "version": "5.100.2", - "resolved": "https://registry.npmjs.org/@microsoft/rush-lib/-/rush-lib-5.100.2.tgz", - "integrity": "sha512-wuyvYok7qEdADNeN98C+tO5lU23CH04kSYbJ/lz4CQfqVIviFLQQExDEPnvRxNP0I1XmuMdsaIVG28m1tLCMMA==", - "dev": true, - "dependencies": { - "@pnpm/dependency-path": "~2.1.2", - "@pnpm/link-bins": "~5.3.7", - "@rushstack/heft-config-file": "0.13.2", - "@rushstack/node-core-library": "3.59.6", - "@rushstack/package-deps-hash": "4.0.41", - "@rushstack/package-extractor": "0.3.11", - "@rushstack/rig-package": "0.4.0", - "@rushstack/rush-amazon-s3-build-cache-plugin": "5.100.2", - "@rushstack/rush-azure-storage-build-cache-plugin": "5.100.2", - "@rushstack/stream-collator": "4.0.259", - "@rushstack/terminal": "0.5.34", - "@rushstack/ts-command-line": "4.15.1", - "@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", - "https-proxy-agent": "~5.0.0", - "ignore": "~5.1.6", - "inquirer": "~7.3.3", - "js-yaml": "~3.13.1", - "node-fetch": "2.6.7", - "npm-check": "~6.0.1", - "npm-package-arg": "~6.1.0", - "read-package-tree": "~5.1.5", - "rxjs": "~6.6.7", - "semver": "~7.5.4", - "ssri": "~8.0.0", - "strict-uri-encode": "~2.0.0", - "tapable": "2.2.1", - "tar": "~6.1.11", - "true-case-path": "~2.2.1" - }, - "engines": { - "node": ">=5.6.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/rush-lib/node_modules/@rushstack/terminal": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.5.34.tgz", - "integrity": "sha512-Q7YDkPTsvJZpHapapo5sK2VCxW7byoqhK89tXMUiva6dNwelomgEe0S+njKw4vcmGde4hQD7LAqQPJPYFeU4mw==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "wordwrap": "~1.0.0" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/rush-lib/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/rush-lib/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-css-loader/-/sp-css-loader-1.18.0.tgz", - "integrity": "sha512-UFfmsN+3+WcEHx8fEWJoOMTP3pOTTkFAxwa9aEtKxnrT21wfqLnJfzll1ato2X0vT3eYzkCFtrspCeT1atLURw==", - "dev": true, - "dependencies": { - "@microsoft/load-themed-styles": "1.10.292", - "@rushstack/node-core-library": "3.59.6", - "autoprefixer": "9.7.1", - "css-loader": "3.4.2", - "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.47.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/@microsoft/load-themed-styles": { - "version": "1.10.292", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.292.tgz", - "integrity": "sha512-LQWGImtpv2zHKIPySLalR1aFXumXfOq8UuJvR15mIZRKXIoM+KuN9wZq+ved2FyeuePjQSJGOxYynxtCLLwDBA==", - "dev": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/autoprefixer": { - "version": "9.7.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", - "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", - "dev": true, - "dependencies": { - "browserslist": "^4.7.2", - "caniuse-lite": "^1.0.30001006", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.21", - "postcss-value-parser": "^4.0.2" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/autoprefixer/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", - "dev": true, - "dependencies": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "dependencies": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/loader-utils": { - "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==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/postcss/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-css-loader/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/sp-module-interfaces": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.18.0.tgz", - "integrity": "sha512-fXLV70zP1S8z2FGYAf1iqfgIIC5rOfPQeeCh/qICFx+RuUFtvkbW+N5vr0ugFYaF6L0rfrYqspcllloHJPOVYQ==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "z-schema": "4.2.4" - }, - "engines": { - "node": ">=16.13.0 <17.0.0 || >=18.17.1 <19.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@microsoft/spfx-heft-plugins/-/spfx-heft-plugins-1.18.0.tgz", - "integrity": "sha512-tWj8mtnz4+gi9LUV/XIIArHw53fPXOs1R9eLh2hm/FcB5d3AMsDObhLyna+XjTY2JpJtsvRjC4A1nypHlG2uVQ==", - "dev": true, - "dependencies": { - "@azure/storage-blob": "~12.11.0", - "@microsoft/load-themed-styles": "1.10.292", - "@microsoft/loader-load-themed-styles": "2.0.68", - "@microsoft/rush-lib": "5.100.2", - "@microsoft/sp-css-loader": "1.18.0", - "@microsoft/sp-module-interfaces": "1.18.0", - "@rushstack/heft-config-file": "0.13.2", - "@rushstack/localization-utilities": "0.8.80", - "@rushstack/node-core-library": "3.59.6", - "@rushstack/rig-package": "0.4.0", - "@rushstack/set-webpack-public-path-plugin": "4.0.15", - "@rushstack/terminal": "0.5.36", - "@rushstack/webpack4-localization-plugin": "0.17.46", - "@rushstack/webpack4-module-minifier-plugin": "0.12.35", - "@types/tapable": "1.0.6", - "autoprefixer": "9.7.1", - "colors": "~1.2.1", - "copy-webpack-plugin": "~6.0.3", - "css-loader": "3.4.2", - "cssnano": "~5.1.14", - "express": "4.18.1", - "file-loader": "6.1.0", - "git-repo-info": "~2.1.1", - "glob": "~7.0.5", - "html-loader": "~0.5.1", - "jszip": "~3.8.0", - "lodash": "4.17.21", - "mime": "2.5.2", - "postcss": "^8.4.19", - "postcss-loader": "^4.2.0", - "resolve": "~1.17.0", - "source-map": "0.6.1", - "source-map-loader": "1.1.3", - "tapable": "1.1.3", - "true-case-path": "~2.2.1", - "uuid": "~3.1.0", - "webpack": "~4.47.0", - "webpack-dev-server": "~4.9.3", - "webpack-sources": "1.4.3", - "xml": "~1.0.1" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/@microsoft/load-themed-styles": { - "version": "1.10.292", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.292.tgz", - "integrity": "sha512-LQWGImtpv2zHKIPySLalR1aFXumXfOq8UuJvR15mIZRKXIoM+KuN9wZq+ved2FyeuePjQSJGOxYynxtCLLwDBA==", - "dev": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/@microsoft/loader-load-themed-styles": { - "version": "2.0.68", - "resolved": "https://registry.npmjs.org/@microsoft/loader-load-themed-styles/-/loader-load-themed-styles-2.0.68.tgz", - "integrity": "sha512-rScfOP4hEO+zZlhaf0vPzj1I4mVm4XJgACBJ4ym4Z/zT5kt7XkEvlcoCNqr4lbwBvNrafUL9b6GFOTGE6Y8fmg==", - "dev": true, - "dependencies": { - "loader-utils": "1.4.2" - }, - "peerDependencies": { - "@microsoft/load-themed-styles": "^2.0.70", - "@types/webpack": "^4" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/@microsoft/loader-load-themed-styles/node_modules/loader-utils": { - "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==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/@rushstack/webpack4-module-minifier-plugin": { - "version": "0.12.35", - "resolved": "https://registry.npmjs.org/@rushstack/webpack4-module-minifier-plugin/-/webpack4-module-minifier-plugin-0.12.35.tgz", - "integrity": "sha512-/tHFN9iuKbsDt0GfSU/XQQEND9XkD1EkDkmQkSsc45YKnip7kCLRN8bpJL410MBiWIMOTWglkafVyiS9pyZ6bw==", - "dev": true, - "dependencies": { - "@rushstack/module-minifier": "0.3.38", - "@rushstack/worker-pool": "0.3.37", - "@types/tapable": "1.0.6", - "tapable": "1.1.3" - }, - "engines": { - "node": ">=10.17.1" - }, - "peerDependencies": { - "@types/node": "*", - "@types/webpack": "*", - "@types/webpack-sources": "*", - "webpack": "^4.31.0", - "webpack-sources": "~1.4.3" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@types/webpack": { - "optional": true - }, - "@types/webpack-sources": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/autoprefixer": { - "version": "9.7.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", - "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", - "dev": true, - "dependencies": { - "browserslist": "^4.7.2", - "caniuse-lite": "^1.0.30001006", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.21", - "postcss-value-parser": "^4.0.2" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/autoprefixer/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/copy-webpack-plugin": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.4.tgz", - "integrity": "sha512-zCazfdYAh3q/O4VzZFiadWGpDA2zTs6FC6D7YTHD6H1J40pzo0H4z22h1NYMCl4ArQP4CK8y/KWqPrJ4rVkZ5A==", - "dev": true, - "dependencies": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^2.7.0", - "serialize-javascript": "^4.0.0", - "webpack-sources": "^1.4.3" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/css-loader/node_modules/loader-utils": { - "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==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/css-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/file-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.0.tgz", - "integrity": "sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-extract-imports/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", - "dev": true, - "dependencies": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-local-by-default/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-scope/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "dependencies": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-values/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/webpack-dev-server": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", - "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@microsoft/spfx-heft-plugins/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/heft-config-file": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@rushstack/heft-config-file/-/heft-config-file-0.13.2.tgz", - "integrity": "sha512-eJCuVnKR+uSG7qyeyICA57IOBD3OoOlNTpsJgNjcZZiTj+ZlKPaGmJ8/mzXwNiEpTIlRsVvoQURYFz9QY9sfnQ==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "@rushstack/rig-package": "0.4.0", - "jsonpath-plus": "~4.0.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/localization-utilities": { - "version": "0.8.80", - "resolved": "https://registry.npmjs.org/@rushstack/localization-utilities/-/localization-utilities-0.8.80.tgz", - "integrity": "sha512-kEM8v6ULA3ReikAmdP4faFWMDG4WcATty3lDU2/XFKh2+oj6HLDtnyUgDpYBaASx2FQstu5f5J7QehTLcl21MA==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "@rushstack/typings-generator": "0.10.36", - "pseudolocale": "~1.1.0", - "xmldoc": "~1.1.2" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/module-minifier": { - "version": "0.3.38", - "resolved": "https://registry.npmjs.org/@rushstack/module-minifier/-/module-minifier-0.3.38.tgz", - "integrity": "sha512-o0HzguvsC+VUbpg8gqNCsE9myZ4s6ZIGZggPTR26Qz33yIKvnBHVwHkDu191Y3N1cqMYgVwcZznSUSWifV3qOw==", - "dev": true, - "dependencies": { - "@rushstack/worker-pool": "0.3.37", - "serialize-javascript": "6.0.0", - "source-map": "~0.7.3", - "terser": "^5.9.0" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/module-minifier/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/module-minifier/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/node-core-library": { - "version": "3.59.6", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.59.6.tgz", - "integrity": "sha512-bMYJwNFfWXRNUuHnsE9wMlW/mOB4jIwSUkRKtu02CwZhQdmzMsUbxE0s1xOLwTpNIwlzfW/YT7OnOHgDffLgYg==", - "dev": true, - "dependencies": { - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "z-schema": "~5.0.2" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/node-core-library/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/node-core-library/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/node-core-library/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/node-core-library/node_modules/z-schema": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", - "dev": true, - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^9.4.1" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/package-deps-hash": { - "version": "4.0.41", - "resolved": "https://registry.npmjs.org/@rushstack/package-deps-hash/-/package-deps-hash-4.0.41.tgz", - "integrity": "sha512-bx1g0I54BidJuIqyQHY2Vr4Azn2ThLgrc6hHjEIBzIVmXeznZxJfYViAPNFAu7BV/TaLIU1BSYeRn/yObu9KZA==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/package-extractor": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@rushstack/package-extractor/-/package-extractor-0.3.11.tgz", - "integrity": "sha512-j5hRGB/ilCozT7qH5q3swM/xdf/TPFtolWkqciYCU8G8WFXxILbN2nwo4goWyWQaD9hFlCiw9S7z8LTEkSmapQ==", - "dev": true, - "dependencies": { - "@pnpm/link-bins": "~5.3.7", - "@rushstack/node-core-library": "3.59.6", - "@rushstack/terminal": "0.5.34", - "ignore": "~5.1.6", - "jszip": "~3.8.0", - "minimatch": "~3.0.3", - "npm-packlist": "~2.1.2" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/package-extractor/node_modules/@rushstack/terminal": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.5.34.tgz", - "integrity": "sha512-Q7YDkPTsvJZpHapapo5sK2VCxW7byoqhK89tXMUiva6dNwelomgEe0S+njKw4vcmGde4hQD7LAqQPJPYFeU4mw==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "wordwrap": "~1.0.0" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/rig-package": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.4.0.tgz", - "integrity": "sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==", - "dev": true, - "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/rig-package/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/rush-amazon-s3-build-cache-plugin": { - "version": "5.100.2", - "resolved": "https://registry.npmjs.org/@rushstack/rush-amazon-s3-build-cache-plugin/-/rush-amazon-s3-build-cache-plugin-5.100.2.tgz", - "integrity": "sha512-A49NzlRDcp0Hd5WZWN8jvnvI+0MoFOdRXL3iutVI12YAYBH6c7uSul+71MMY83x0yQqk4TcfGYVpFWx1j/n8/Q==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "@rushstack/rush-sdk": "5.100.2", - "https-proxy-agent": "~5.0.0", - "node-fetch": "2.6.7" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/rush-amazon-s3-build-cache-plugin/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/rush-azure-storage-build-cache-plugin": { - "version": "5.100.2", - "resolved": "https://registry.npmjs.org/@rushstack/rush-azure-storage-build-cache-plugin/-/rush-azure-storage-build-cache-plugin-5.100.2.tgz", - "integrity": "sha512-FIAvmIfYLWhnygDCyUWSZOuyTWVRLFHYeG9xPmUpwJSPqxUL3HG5cRGVYlyRgK9oSJSEq+g0mpbe7nE8WwJgtg==", - "dev": true, - "dependencies": { - "@azure/identity": "~2.1.0", - "@azure/storage-blob": "~12.11.0", - "@rushstack/node-core-library": "3.59.6", - "@rushstack/rush-sdk": "5.100.2", - "@rushstack/terminal": "0.5.34" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/rush-azure-storage-build-cache-plugin/node_modules/@rushstack/terminal": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.5.34.tgz", - "integrity": "sha512-Q7YDkPTsvJZpHapapo5sK2VCxW7byoqhK89tXMUiva6dNwelomgEe0S+njKw4vcmGde4hQD7LAqQPJPYFeU4mw==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "wordwrap": "~1.0.0" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/rush-sdk": { - "version": "5.100.2", - "resolved": "https://registry.npmjs.org/@rushstack/rush-sdk/-/rush-sdk-5.100.2.tgz", - "integrity": "sha512-+4DKbXj6R8vilRYswH8Lb+WIuIoD29/ZjMmazKBKXJTm3x7sgGJy45ozAZbfeXvdOTzqsg11NzIbwaDm8rRhLQ==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "@types/node-fetch": "2.6.2", - "tapable": "2.2.1" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@rushstack/set-webpack-public-path-plugin/-/set-webpack-public-path-plugin-4.0.15.tgz", - "integrity": "sha512-TwXZVRPV0wRrjDfAYGXU38FTFihHjUDIn5iRWtu6rn/MCXNR6y4OwPVg5MlSVbqn/hU8WnmML6/hT54XCdOfPQ==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "@rushstack/webpack-plugin-utilities": "0.2.36" - }, - "peerDependencies": { - "@types/webpack": "^4.39.8" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/@rushstack/webpack-plugin-utilities": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@rushstack/webpack-plugin-utilities/-/webpack-plugin-utilities-0.2.36.tgz", - "integrity": "sha512-LguxiG0b6AKSxUODKbmPqHr9Q08weilpK3qOiyzYMqIQ5nR3WOGoflaYbO/kDsKbjgLyxQWL2XPZdyyYke3gjg==", - "dev": true, - "dependencies": { - "memfs": "3.4.3", - "webpack-merge": "~5.8.0" - }, - "peerDependencies": { - "@types/webpack": "^4.39.8", - "webpack": "^5.35.1" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/set-webpack-public-path-plugin/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/stream-collator": { - "version": "4.0.259", - "resolved": "https://registry.npmjs.org/@rushstack/stream-collator/-/stream-collator-4.0.259.tgz", - "integrity": "sha512-UfMRCp1avkUUs9pdtWQ8ZE8Nmuxeuw1a9bjLQ7cQJ3meuv8iDxKuxsyJRfrwIfCkVkNVw5OJ9eM6E/edUPP7qw==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "@rushstack/terminal": "0.5.34" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/stream-collator/node_modules/@rushstack/terminal": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.5.34.tgz", - "integrity": "sha512-Q7YDkPTsvJZpHapapo5sK2VCxW7byoqhK89tXMUiva6dNwelomgEe0S+njKw4vcmGde4hQD7LAqQPJPYFeU4mw==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "wordwrap": "~1.0.0" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/terminal": { - "version": "0.5.36", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.5.36.tgz", - "integrity": "sha512-PMigbJYHuiKYe4IxA9pInLSFjOAQI4NV7OmIhTuh8Jy+YYjSexmQfnYwBqsZrwah4k/apY7VZ7lQucHxhJFiiQ==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "wordwrap": "~1.0.0" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/ts-command-line": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.15.1.tgz", - "integrity": "sha512-EL4jxZe5fhb1uVL/P/wQO+Z8Rc8FMiWJ1G7VgnPDvdIt5GVjRfK7vwzder1CZQiX3x0PY6uxENYLNGTFd1InRQ==", - "dev": true, - "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/ts-command-line/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/typings-generator": { - "version": "0.10.36", - "resolved": "https://registry.npmjs.org/@rushstack/typings-generator/-/typings-generator-0.10.36.tgz", - "integrity": "sha512-9aB/D8lI+fbmM5LzPgGcUJzuw+Xg4FixGuQVnis70Bss+5SU6YzOk/bfN4/xhSghMzG+AI7S87368x37TgeQtA==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.6", - "chokidar": "~3.4.0", - "glob": "~7.0.5" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin": { - "version": "0.17.46", - "resolved": "https://registry.npmjs.org/@rushstack/webpack4-localization-plugin/-/webpack4-localization-plugin-0.17.46.tgz", - "integrity": "sha512-wEEVp6oBp5/OIrRzwgkuuQlawUY6MfjaWsp2T9Zp4MkbqGVgF+gdKG+iKzWtBKW2YbZ9fnVZJH23FoWwh81w4w==", - "dev": true, - "dependencies": { - "@rushstack/localization-utilities": "0.8.83", - "@rushstack/node-core-library": "3.59.7", - "@types/tapable": "1.0.6", - "loader-utils": "1.4.2", - "minimatch": "~3.0.3" - }, - "peerDependencies": { - "@rushstack/set-webpack-public-path-plugin": "^4.0.16", - "@types/node": "*", - "@types/webpack": "^4.39.0", - "webpack": "^4.31.0" - }, - "peerDependenciesMeta": { - "@rushstack/set-webpack-public-path-plugin": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/webpack": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/@rushstack/localization-utilities": { - "version": "0.8.83", - "resolved": "https://registry.npmjs.org/@rushstack/localization-utilities/-/localization-utilities-0.8.83.tgz", - "integrity": "sha512-0Wjvg/3686xgLIjX4aCxNoOfWb1BOpuckzNMjEK5MZyCEFz4Ral+ln13zP+AMKGGWcdxsYdWs+n1yfkJKEX9fQ==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.7", - "@rushstack/typings-generator": "0.11.1", - "pseudolocale": "~1.1.0", - "xmldoc": "~1.1.2" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/@rushstack/node-core-library": { - "version": "3.59.7", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.59.7.tgz", - "integrity": "sha512-ln1Drq0h+Hwa1JVA65x5mlSgUrBa1uHL+V89FqVWQgXd1vVIMhrtqtWGQrhTnFHxru5ppX+FY39VWELF/FjQCw==", - "dev": true, - "dependencies": { - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "z-schema": "~5.0.2" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/@rushstack/typings-generator": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@rushstack/typings-generator/-/typings-generator-0.11.1.tgz", - "integrity": "sha512-pcnA9r14xl1TE4QXW6+t6yGP/5JfGZEGixlL6NH6PHjQVXAFnw91EXvc2NteslePTNdjPuR/34uLqE0i57WNpw==", - "dev": true, - "dependencies": { - "@rushstack/node-core-library": "3.59.7", - "chokidar": "~3.4.0", - "fast-glob": "~3.2.4" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/loader-utils": { - "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==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/webpack4-localization-plugin/node_modules/z-schema": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", - "dev": true, - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^9.4.1" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@rushstack/worker-pool": { - "version": "0.3.37", - "resolved": "https://registry.npmjs.org/@rushstack/worker-pool/-/worker-pool-0.3.37.tgz", - "integrity": "sha512-KVuklmysCkNdRxTcLb80MNEBG/KrDL74c+1XIYZlTvSlDnTs5j9gdjKIV73lZmYox+SWTpvUWrP6JhWb2noDJg==", - "dev": true, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -40895,161 +38977,6 @@ "integrity": "sha512-021+XKlD4/hDZkkdgGhgtDGKlcTIXrII1lrCLp/ZNPoU0AHN9HmTNe+i1eKRxcZisFObX3ItTncemegEACgnsw==", "dev": true }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -41229,6 +39156,15 @@ "node": ">=0.1.90" } }, + "node_modules/spfx-fast-serve-helpers/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/spfx-fast-serve-helpers/node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -41350,40 +39286,6 @@ "postcss": "^8.1.0" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/css-loader/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/css-loader/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/css-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -41462,21 +39364,6 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "node_modules/spfx-fast-serve-helpers/node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -41719,22 +39606,6 @@ "node": ">=0.10.0" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -41854,26 +39725,6 @@ "node": ">=6" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "node_modules/spfx-fast-serve-helpers/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/globals": { "version": "13.23.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", @@ -42044,15 +39895,6 @@ "node": ">=6" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/is-descriptor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", @@ -42141,18 +39983,6 @@ "node": ">=8" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -42167,12 +39997,6 @@ "node": ">= 10.13.0" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/spfx-fast-serve-helpers/node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -42182,17 +40006,6 @@ "node": ">=0.10.0" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/loader-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", @@ -42232,18 +40045,6 @@ "node": ">=10" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/memfs": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", - "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", - "dev": true, - "dependencies": { - "fs-monkey": "1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -42359,65 +40160,6 @@ "node": ">=6" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/postcss": { - "version": "7.0.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.38.tgz", - "integrity": "sha512-wNrSHWjHDQJR/IZL5IKGxRtFgrYNaAA/UrkW2WqbtZO6uxSLMxMN+s2iqUMwnAWm3fMROlDYZB41dr0Mt7vBwQ==", - "dev": true, - "dependencies": { - "nanocolors": "^0.2.2", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/postcss-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz", - "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/postcss-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -42448,18 +40190,6 @@ "node": ">= 0.8" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -42669,12 +40399,6 @@ "node": ">=0.10.0" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, "node_modules/spfx-fast-serve-helpers/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -42688,46 +40412,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/spfx-fast-serve-helpers/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, "node_modules/spfx-fast-serve-helpers/node_modules/webpack-dev-server": { "version": "3.11.3", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", @@ -43189,16 +40873,6 @@ "yargs-parser": "^13.1.2" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/spfx-fast-serve-helpers/node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", @@ -43283,26 +40957,6 @@ "decamelize": "^1.2.0" } }, - "node_modules/spfx-fast-serve-helpers/node_modules/z-schema": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.4.tgz", - "integrity": "sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w==", - "dev": true, - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.6.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=6.0.0" - }, - "optionalDependencies": { - "commander": "^2.7.1" - } - }, "node_modules/spfx-uifabric-themes": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/spfx-uifabric-themes/-/spfx-uifabric-themes-0.9.0.tgz", diff --git a/package.json b/package.json index 5ea60c2c9..5b789d27a 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "@pnp/spfx-controls-react", "description": "Reusable React controls for SharePoint Framework solutions", - "version": "3.17.0", + "version": "3.18.0", "node": ">=16.13.0 <17.0.0 || >=18.17.1 <19.0.0", "scripts": { "build": "gulp build", "clean": "gulp clean", "test": "gulp test", "test:unit": "npx jest --silent --maxWorkers=4", - "serve": "gulp bundle --custom-serve --max_old_space_size=4096 && fast-serve", + "serve": "fast-serve", "prepublishOnly": "gulp", "versionUpdater": "gulp versionUpdater", "karma": "karma start --circle true", @@ -34,6 +34,7 @@ "@fluentui/scheme-utilities": "^8.2.12", "@fluentui/styles": "0.66.5", "@fluentui/theme": "^2.6.6", + "@iconify/react": "^4.1.1", "@microsoft/decorators": "1.18.2", "@microsoft/mgt-react": "3.1.3", "@microsoft/mgt-spfx": "3.1.3", @@ -82,8 +83,7 @@ "react-quill": "2.0.0", "regexify-string": "^1.0.16", "spfx-uifabric-themes": "^0.9.0", - "swiper": "^8.2.6", - "@iconify/react": "^4.1.1" + "swiper": "^8.2.6" }, "devDependencies": { "@microsoft/eslint-config-spfx": "1.18.2", @@ -101,9 +101,6 @@ "@types/lodash": "4.14.202", "@types/quill": "^1.3.10", "@types/react": "17.0.45", - "@types/react-addons-shallow-compare": "0.14.17", - "@types/react-addons-test-utils": "0.14.15", - "@types/react-addons-update": "0.14.21", "@types/react-dom": "17.0.17", "@types/react-mentions": "^4.1.3", "@types/sinon": "10.0.13", @@ -128,7 +125,7 @@ "react-test-renderer": "17.0.1", "request-promise": "4.2.5", "sonarqube-scanner": "2.8.2", - "spfx-fast-serve-helpers": "1.18.4", + "spfx-fast-serve-helpers": "1.18.11", "ts-jest": "^29.1.1", "tslib": "2.3.1", "typescript": "4.7.4", @@ -141,23 +138,19 @@ "license": "MIT", "keywords": [ "sharepoint", + "microsoft365", + "m365", "office365", "tools", "spfx", - "framework" + "sharepoint framework" ], "bugs": { "url": "https://github.com/pnp/sp-dev-fx-controls-react/issues" }, "main": "lib/index.js", "homepage": "https://pnp.github.io/sp-dev-fx-controls-react/", - "contributors": [ - "Gove, Russell ", - "Kent Chris <>", - "Rodrigues, Joel <>", - "Struyf, Elio ", - "Terentiev, Alex " - ], + "contributors": [], "jest": { "transform": { "^.+\\.(ts|tsx)$": "ts-jest" diff --git a/src/common/telemetry/version.ts b/src/common/telemetry/version.ts index d33abe852..e4ed6e8bb 100644 --- a/src/common/telemetry/version.ts +++ b/src/common/telemetry/version.ts @@ -1 +1 @@ -export const version: string = "3.17.0"; +export const version: string = "3.18.0"; \ No newline at end of file diff --git a/src/controls/accordion/Accordion.tsx b/src/controls/accordion/Accordion.tsx index b682c841f..f4aa14d18 100644 --- a/src/controls/accordion/Accordion.tsx +++ b/src/controls/accordion/Accordion.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import styles from './Accordion.module.scss'; import { IAccordionProps, IAccordionState } from './index'; import { css } from "@uifabric/utilities/lib/css"; -import { DefaultButton } from '@fluentui/react/lib/components/Button'; +import { DefaultButton } from '@fluentui/react/lib/Button'; import { IIconProps } from '@fluentui/react/lib/Icon'; import * as telemetry from '../../common/telemetry'; diff --git a/src/controls/carousel/Carousel.tsx b/src/controls/carousel/Carousel.tsx index 3ec18a1a4..a4938ed49 100644 --- a/src/controls/carousel/Carousel.tsx +++ b/src/controls/carousel/Carousel.tsx @@ -14,6 +14,7 @@ import { isArray } from "@pnp/common"; import * as telemetry from '../../common/telemetry'; import CarouselImage, { ICarouselImageProps } from "./CarouselImage"; import { CarouselIndicatorsDisplay } from "./ICarouselProps"; +import { mergeStyles } from "@fluentui/react/lib/Styling"; export class Carousel extends React.Component { private _intervalId: number | undefined; @@ -74,7 +75,8 @@ export class Carousel extends React.Component { interval, indicatorsDisplay, rootStyles, - indicatorsContainerStyles + indicatorsContainerStyles, + contentHeight } = this.props; const processing = processingState === ProcessingState.processing; @@ -84,6 +86,17 @@ export class Carousel extends React.Component { const element = this.getElementToDisplay(currentIndex); + let contentContainerCustomClassName: ICssInput | undefined = undefined; + if (contentContainerStyles) { + contentContainerCustomClassName = contentContainerStyles; + } + else if (contentHeight) { + contentContainerCustomClassName = mergeStyles({ + height: `${contentHeight}px` + }); + } + + return (
@@ -97,7 +110,7 @@ export class Carousel extends React.Component { onClick={() => { this.onCarouselButtonClicked(false); }} />
{ return ""; } - const buttonsLocation = this.props.buttonsLocation ? this.props.buttonsLocation : CarouselButtonsLocation.top; + const buttonsLocation = this.props.buttonsLocation ? this.props.buttonsLocation : CarouselButtonsLocation.center; let buttonsLocationCss = ""; switch (buttonsLocation) { case CarouselButtonsLocation.top: diff --git a/src/controls/carousel/ICarouselProps.ts b/src/controls/carousel/ICarouselProps.ts index ffade1ae4..4c30103e5 100644 --- a/src/controls/carousel/ICarouselProps.ts +++ b/src/controls/carousel/ICarouselProps.ts @@ -82,12 +82,16 @@ export interface ICarouselProps { /** * Specifies the location of the buttons inside the container. + * + * Default: CarouselButtonsLocation.center */ - buttonsLocation: CarouselButtonsLocation; + buttonsLocation?: CarouselButtonsLocation; /** * Specifies the buttons container display mode. + * + * Default: CarouselButtonsDisplay.block */ - buttonsDisplay: CarouselButtonsDisplay; + buttonsDisplay?: CarouselButtonsDisplay; /** * Allows to specify own styles for carousel container. @@ -221,4 +225,9 @@ export interface ICarouselProps { */ indicatorsContainerStyles?: ICssInput; + /** + * Allows to specify the height of the content. Can be used instead of providing styles for the content container. + */ + contentHeight?: number; + } diff --git a/src/controls/dateTimePicker/DateTimePicker.tsx b/src/controls/dateTimePicker/DateTimePicker.tsx index 247a228f0..2a3ee644d 100644 --- a/src/controls/dateTimePicker/DateTimePicker.tsx +++ b/src/controls/dateTimePicker/DateTimePicker.tsx @@ -1,6 +1,7 @@ import * as React from "react"; import { isEqual } from '@microsoft/sp-lodash-subset'; import { TimeConvention, DateConvention } from "./DateTimeConventions"; +import { Calendar } from "@fluentui/react/lib/Calendar"; import { DatePicker } from "@fluentui/react/lib/DatePicker"; import { Label } from "@fluentui/react/lib/Label"; import { IconButton } from "@fluentui/react/lib/Button"; @@ -246,7 +247,8 @@ export class DateTimePicker extends React.Component { + return ( + + ); + }; + // Check if the time element needs to be rendered let timeElm: JSX.Element =
; @@ -341,6 +362,7 @@ export class DateTimePicker extends React.Component this.handleTextChange(e, newValue, textErrorMessage) }} diff --git a/src/controls/dateTimePicker/IDateTimePickerProps.ts b/src/controls/dateTimePicker/IDateTimePickerProps.ts index 1cd15fd7e..67b73557c 100644 --- a/src/controls/dateTimePicker/IDateTimePickerProps.ts +++ b/src/controls/dateTimePicker/IDateTimePickerProps.ts @@ -153,4 +153,10 @@ export interface IDateTimePickerProps { * Icon used for clearDate iconbutton. Defaults to RemoveEvent */ showClearDateIcon?: string; + + /** + * If set the Calendar will not allow selection of dates in this array. + */ + restrictedDates?: Date[]; + } diff --git a/src/controls/dynamicForm/DynamicForm.tsx b/src/controls/dynamicForm/DynamicForm.tsx index eb15b71e5..fa1d162d2 100644 --- a/src/controls/dynamicForm/DynamicForm.tsx +++ b/src/controls/dynamicForm/DynamicForm.tsx @@ -17,7 +17,6 @@ import { IDropdownOption } from "@fluentui/react/lib/Dropdown"; import { MessageBar, MessageBarType } from "@fluentui/react/lib/MessageBar"; import { ProgressIndicator } from "@fluentui/react/lib/ProgressIndicator"; import { IStackTokens, Stack } from "@fluentui/react/lib/Stack"; -import { Icon } from "@fluentui/react/lib/components/Icon/Icon"; import { DynamicField } from "./dynamicField"; import { DateFormat, @@ -45,6 +44,7 @@ import CustomFormattingHelper from "../../common/utilities/CustomFormatting"; // Dynamic Form Props / State import { IDynamicFormProps } from "./IDynamicFormProps"; import { IDynamicFormState } from "./IDynamicFormState"; +import { Icon } from "@fluentui/react/lib/Icon"; const stackTokens: IStackTokens = { childrenGap: 20 }; @@ -411,9 +411,14 @@ export class DynamicForm extends React.Component< columnInternalName, hiddenFieldName, } = field; + let fieldcolumnInternalName = columnInternalName; + if (fieldcolumnInternalName.startsWith('_x') || fieldcolumnInternalName.startsWith('_')) { + fieldcolumnInternalName = `OData_${fieldcolumnInternalName}`; + } if (field.newValue !== null && field.newValue !== undefined) { let value = field.newValue; + if (["Lookup", "LookupMulti", "User", "UserMulti", "TaxonomyFieldTypeMulti"].indexOf(fieldType) < 0) { objects[columnInternalName] = value; } @@ -421,19 +426,19 @@ export class DynamicForm extends React.Component< // Choice fields if (fieldType === "Choice") { - objects[columnInternalName] = field.newValue.key; + objects[fieldcolumnInternalName] = field.newValue.key; } if (fieldType === "MultiChoice") { - objects[columnInternalName] = { results: field.newValue }; + objects[fieldcolumnInternalName] = { results: field.newValue }; } // Lookup fields if (fieldType === "Lookup") { if (value && value.length > 0) { - objects[`${columnInternalName}Id`] = value[0].key; + objects[`${fieldcolumnInternalName}Id`] = value[0].key; } else { - objects[`${columnInternalName}Id`] = null; + objects[`${fieldcolumnInternalName}Id`] = null; } } if (fieldType === "LookupMulti") { @@ -441,7 +446,7 @@ export class DynamicForm extends React.Component< field.newValue.forEach((element) => { value.push(element.key); }); - objects[`${columnInternalName}Id`] = { + objects[`${fieldcolumnInternalName}Id`] = { results: value.length === 0 ? null : value, }; } @@ -449,10 +454,10 @@ export class DynamicForm extends React.Component< // User fields if (fieldType === "User") { - objects[`${columnInternalName}Id`] = field.newValue.length === 0 ? null : field.newValue; + objects[`${fieldcolumnInternalName}Id`] = field.newValue.length === 0 ? null : field.newValue; } if (fieldType === "UserMulti") { - objects[`${columnInternalName}Id`] = { + objects[`${fieldcolumnInternalName}Id`] = { results: field.newValue.length === 0 ? null : field.newValue, }; } @@ -460,7 +465,7 @@ export class DynamicForm extends React.Component< // Taxonomy / Managed Metadata fields if (fieldType === "TaxonomyFieldType") { - objects[columnInternalName] = { + objects[fieldcolumnInternalName] = { __metadata: { type: "SP.Taxonomy.TaxonomyFieldValue" }, Label: value[0]?.name ?? "", TermGuid: value[0]?.key ?? "11111111-1111-1111-1111-111111111111", @@ -476,19 +481,19 @@ export class DynamicForm extends React.Component< // Other fields if (fieldType === "Location") { - objects[columnInternalName] = JSON.stringify(field.newValue); + objects[fieldcolumnInternalName] = JSON.stringify(field.newValue); } if (fieldType === "Thumbnail") { if (additionalData) { const uploadedImage = await this.uploadImage(additionalData); - objects[columnInternalName] = JSON.stringify({ + objects[fieldcolumnInternalName] = JSON.stringify({ type: "thumbnail", fileName: uploadedImage.Name, serverRelativeUrl: uploadedImage.ServerRelativeUrl, id: uploadedImage.UniqueId, }); } else { - objects[columnInternalName] = null; + objects[fieldcolumnInternalName] = null; } } } @@ -908,6 +913,7 @@ export class DynamicForm extends React.Component< listItemId, disabledFields, respectETag, + customIcons, onListItemLoaded, } = this.props; let contentTypeId = this.props.contentTypeId; @@ -915,11 +921,11 @@ export class DynamicForm extends React.Component< try { // Fetch form rendering information from SharePoint - const listInfo = await this._spService.getListFormRenderInfo(listId); + const listInfo = await this._spService.getListFormRenderInfo(listId, this.webURL); // Fetch additional information about fields from SharePoint // (Number fields for min and max values, and fields with validation) - const additionalInfo = await this._spService.getAdditionalListFormFieldInfo(listId); + const additionalInfo = await this._spService.getAdditionalListFormFieldInfo(listId, this.webURL); const numberFields = additionalInfo.filter((f) => f.TypeAsString === "Number" || f.TypeAsString === "Currency"); // Build a dictionary of validation formulas and messages @@ -986,7 +992,8 @@ export class DynamicForm extends React.Component< numberFields, listId, listItemId, - disabledFields + disabledFields, + customIcons ); // Get installed languages for Currency fields @@ -1028,7 +1035,7 @@ export class DynamicForm extends React.Component< * @returns */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - private async buildFieldCollection(listInfo: IRenderListDataAsStreamClientFormResult, contentTypeName: string, item: any, numberFields: ISPField[], listId: string, listItemId: number, disabledFields: string[]): Promise { + private async buildFieldCollection(listInfo: IRenderListDataAsStreamClientFormResult, contentTypeName: string, item: any, numberFields: ISPField[], listId: string, listItemId: number, disabledFields: string[], customIcons: {[key: string]: string}): Promise { const tempFields: IDynamicFieldProps[] = []; let order: number = 0; const hiddenFields = this.props.hiddenFields !== undefined ? this.props.hiddenFields : []; @@ -1060,9 +1067,14 @@ export class DynamicForm extends React.Component< // eslint-disable-next-line @typescript-eslint/no-explicit-any const selectedTags: any = []; + let fieldName = field.InternalName; + if (fieldName.startsWith('_x') || fieldName.startsWith('_')) { + fieldName = `OData_${fieldName}`; + } + // If a SharePoint Item was loaded, get the field value from it - if (item !== null && item[field.InternalName]) { - value = item[field.InternalName]; + if (item !== null && item[fieldName]) { + value = item[fieldName]; stringValue = value.toString(); } else { defaultValue = field.DefaultValue; @@ -1166,7 +1178,8 @@ export class DynamicForm extends React.Component< const response = await this._spService.getSingleManagedMetadataLabel( listId, listItemId, - field.InternalName + field.InternalName, + this.webURL ); if (response) { selectedTags.push({ @@ -1219,8 +1232,10 @@ export class DynamicForm extends React.Component< // Setup DateTime fields if (field.FieldType === "DateTime") { - if (item !== null && item[field.InternalName]) { - value = new Date(item[field.InternalName]); + + if (item !== null && item[fieldName]) { + + value = new Date(item[fieldName]); stringValue = value.toISOString(); } else if (defaultValue === "[today]") { defaultValue = new Date(); @@ -1229,7 +1244,7 @@ export class DynamicForm extends React.Component< } dateFormat = field.DateFormat || "DateOnly"; - defaultDayOfWeek = (await this._spService.getRegionalWebSettings()).FirstDayOfWeek; + defaultDayOfWeek = (await this._spService.getRegionalWebSettings(this.webURL)).FirstDayOfWeek; } // Setup Thumbnail, Location and Boolean fields @@ -1285,6 +1300,7 @@ export class DynamicForm extends React.Component< minimumValue: minValue, maximumValue: maxValue, showAsPercentage: showAsPercentage, + customIcon: customIcons ? customIcons[field.InternalName] : undefined }); // This may not be necessary now using RenderListDataAsStream @@ -1318,7 +1334,8 @@ export class DynamicForm extends React.Component< listItemId, file.fileName, buffer, - undefined + undefined, + this.webURL ); } }; diff --git a/src/controls/dynamicForm/IDynamicFormProps.ts b/src/controls/dynamicForm/IDynamicFormProps.ts index 43da7003e..218bce6da 100644 --- a/src/controls/dynamicForm/IDynamicFormProps.ts +++ b/src/controls/dynamicForm/IDynamicFormProps.ts @@ -51,7 +51,13 @@ export interface IDynamicFormProps { /** * Key value pair for fields you want to override. Key is the internal field name, value is the function to be called for the custom element to render */ - fieldOverrides?: {[columnInternalName: string] : {(fieldProperties: IDynamicFieldProps): React.ReactElement}}; + fieldOverrides?: { + [columnInternalName: string]: { + ( + fieldProperties: IDynamicFieldProps + ): React.ReactElement; + }; + }; /** * Specifies if onSubmitted event should pass PnPJS list item (IItem) as a second parameter. Default - true @@ -110,4 +116,10 @@ export interface IDynamicFormProps { * Only used when enableFileSelection is true */ supportedFileExtensions?: string[]; + + /** + * Specify a set of custom icons to be used. + * The key is the field internal name and the value is the Fluent UI icon name. + */ + customIcons?: { [columnInternalName: string]: string }; } diff --git a/src/controls/dynamicForm/dynamicField/DynamicField.tsx b/src/controls/dynamicForm/dynamicField/DynamicField.tsx index dc4deb6f4..36518c544 100644 --- a/src/controls/dynamicForm/dynamicField/DynamicField.tsx +++ b/src/controls/dynamicForm/dynamicField/DynamicField.tsx @@ -3,7 +3,7 @@ import { sp } from '@pnp/sp/presets/all'; import '@pnp/sp/webs'; import * as strings from 'ControlStrings'; import { ActionButton } from '@fluentui/react/lib/Button'; -import { Dropdown, IDropdownOption, IDropdownProps } from '@fluentui/react/lib/components/Dropdown'; +import { Dropdown, IDropdownOption, IDropdownProps } from '@fluentui/react/lib/Dropdown'; import { DatePicker } from '@fluentui/react/lib/DatePicker'; import { Icon } from '@fluentui/react/lib/Icon'; import { Image } from '@fluentui/react/lib/Image'; @@ -16,7 +16,7 @@ import { DateTimePicker } from '../../dateTimePicker/DateTimePicker'; import { FilePicker, IFilePickerResult } from '../../filePicker'; import { ListItemPicker } from '../../listItemPicker'; import { LocationPicker } from '../../locationPicker'; -import { PeoplePicker, PrincipalType } from '../../peoplepicker'; +import { IPeoplePickerContext, PeoplePicker, PrincipalType } from '../../peoplepicker'; import { RichText } from '../../richText'; import { IPickerTerms, TaxonomyPicker } from '../../taxonomyPicker'; import styles from '../DynamicForm.module.scss'; @@ -79,7 +79,9 @@ export class DynamicField extends React.Component{label}; @@ -113,7 +121,7 @@ export class DynamicField extends React.Component
- + {labelEl}
- + {labelEl}
- + {labelEl}
- + {labelEl}
- + {labelEl}
- + {labelEl}
- + {labelEl}
{ this.onChange(newValue, true); }} context={context} + orderBy={orderBy} /> {descriptionEl} {errorTextEl} @@ -247,7 +256,7 @@ export class DynamicField extends React.Component
- + {labelEl}
- + {labelEl}
{ this.onChange(newText); }} disabled={disabled} onBlur={this.onBlur} - errorMessage={errorText || customNumberErrorMessage} - min={minimumValue} + errorMessage={errorText || customNumberErrorMessage} + min={minimumValue} max={maximumValue} /> {descriptionEl}
; @@ -294,7 +303,7 @@ export class DynamicField extends React.Component
- + {labelEl}
{ this.onChange(newText); }} disabled={disabled} onBlur={this.onBlur} - errorMessage={errorText || customNumberErrorMessage} - min={minimumValue} + errorMessage={errorText || customNumberErrorMessage} + min={minimumValue} max={maximumValue} /> {descriptionEl}
; @@ -315,7 +324,7 @@ export class DynamicField extends React.Component
- + {labelEl}
{ @@ -348,7 +357,7 @@ export class DynamicField extends React.Component
- + {labelEl}
cv.secondaryText) : (value ? value : defaultValue); return
- + {labelEl}
- + {labelEl}
- + {labelEl}
- + {labelEl}
- + {labelEl}
@@ -516,7 +525,7 @@ export class DynamicField extends React.Component
- + {labelEl}
@@ -687,7 +696,7 @@ export class DynamicField extends React.Component void; // eslint-disable-line @typescript-eslint/no-explicit-any + onChanged?: ( + columnInternalName: string, + newValue: any, // eslint-disable-line @typescript-eslint/no-explicit-any + validate: boolean, + additionalData?: FieldChangeAdditionalData + ) => void; // eslint-disable-line @typescript-eslint/no-explicit-any /** Represents the value of the field as updated by the user. Only updated by fields when changed. */ newValue?: any; // eslint-disable-line @typescript-eslint/no-explicit-any - + /** Represents a stringified value of the field. Used in custom formatting and validation. */ stringValue: any; // eslint-disable-line @typescript-eslint/no-explicit-any @@ -50,7 +55,7 @@ export interface IDynamicFieldProps { /** If validation raises an error message, it can be stored against the field here for display by DynamicField */ validationErrorMessage?: string; - + /** Field Term Set ID, used in Taxonomy / Metadata fields */ fieldTermSetId?: string; @@ -64,16 +69,16 @@ export interface IDynamicFieldProps { lookupField?: string; // changedValue: any; // eslint-disable-line @typescript-eslint/no-explicit-any - + /** Equivalent to HiddenListInternalName, used for Taxonomy Metadata fields */ hiddenFieldName?: string; - + /** Order of the field in the form */ Order: number; - + /** Used for files / image uploads */ additionalData?: FieldChangeAdditionalData; - + // Related to various field types options?: IDropdownOption[]; isRichText?: boolean; @@ -84,4 +89,6 @@ export interface IDynamicFieldProps { maximumValue?: number; minimumValue?: number; showAsPercentage?: boolean; + customIcon?: string; + orderBy?: string; } diff --git a/src/controls/fieldCollectionData/FieldCollectionData.tsx b/src/controls/fieldCollectionData/FieldCollectionData.tsx index 6201d5f1d..ac0e8f2d4 100644 --- a/src/controls/fieldCollectionData/FieldCollectionData.tsx +++ b/src/controls/fieldCollectionData/FieldCollectionData.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; import * as telemetry from '../../common/telemetry'; -import { DefaultButton } from '@fluentui/react/lib/components/Button'; -import { Panel, PanelType } from '@fluentui/react/lib/components/Panel'; -import { Label } from '@fluentui/react/lib/components/Label'; +import { DefaultButton } from '@fluentui/react/lib/Button'; +import { Panel, PanelType } from '@fluentui/react/lib/Panel'; +import { Label } from '@fluentui/react/lib/Label'; import { CollectionDataViewer } from './collectionDataViewer'; import { IFieldCollectionDataProps, IFieldCollectionDataState } from "./IFieldCollectionData"; import * as strings from 'ControlStrings'; diff --git a/src/controls/fieldCollectionData/collectionDataItem/CollectionDataItem.tsx b/src/controls/fieldCollectionData/collectionDataItem/CollectionDataItem.tsx index ba4bd76d6..07823ba9f 100644 --- a/src/controls/fieldCollectionData/collectionDataItem/CollectionDataItem.tsx +++ b/src/controls/fieldCollectionData/collectionDataItem/CollectionDataItem.tsx @@ -2,16 +2,16 @@ import * as React from 'react'; import styles from '../FieldCollectionData.module.scss'; import { ICollectionDataItemProps } from './ICollectionDataItemProps'; import { ICollectionDataItemState } from './ICollectionDataItemState'; -import { TextField } from '@fluentui/react/lib/components/TextField'; -import { Icon } from '@fluentui/react/lib/components/Icon'; -import { Link } from '@fluentui/react/lib/components/Link'; -import { Checkbox } from '@fluentui/react/lib/components/Checkbox'; +import { TextField } from '@fluentui/react/lib/TextField'; +import { Icon } from '@fluentui/react/lib/Icon'; +import { Link } from '@fluentui/react/lib/Link'; +import { Checkbox } from '@fluentui/react/lib/Checkbox'; import * as strings from 'ControlStrings'; import { CustomCollectionFieldType, ICustomCollectionField } from '../ICustomCollectionField'; -import { Dropdown, IDropdownOption } from '@fluentui/react/lib/components/Dropdown'; -import { ComboBox, IComboBoxOption } from '@fluentui/react/lib/components/ComboBox'; -import { PeoplePicker, PrincipalType } from "../../peoplepicker"; -import { Callout, DirectionalHint } from '@fluentui/react/lib/components/Callout'; +import { Dropdown, IDropdownOption } from '@fluentui/react/lib/Dropdown'; +import { ComboBox, IComboBoxOption } from '@fluentui/react/lib/ComboBox'; +import { IPeoplePickerContext, PeoplePicker, PrincipalType } from "../../peoplepicker"; +import { Callout, DirectionalHint } from '@fluentui/react/lib/Callout'; import { CollectionIconField } from '../collectionIconField'; import { clone, findIndex, sortBy } from '@microsoft/sp-lodash-subset'; import { Guid } from '@microsoft/sp-core-library'; @@ -467,6 +467,11 @@ export class CollectionDataItem extends React.Component { diff --git a/src/controls/fieldCollectionData/collectionIconField/CollectionIconField.tsx b/src/controls/fieldCollectionData/collectionIconField/CollectionIconField.tsx index b8db38ad9..ab67b85d0 100644 --- a/src/controls/fieldCollectionData/collectionIconField/CollectionIconField.tsx +++ b/src/controls/fieldCollectionData/collectionIconField/CollectionIconField.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; import styles from '../FieldCollectionData.module.scss'; import { ICollectionIconFieldProps } from '.'; -import { TextField } from '@fluentui/react/lib/components/TextField'; -import { Icon } from '@fluentui/react/lib/components/Icon'; +import { TextField } from '@fluentui/react/lib/TextField'; +import { Icon } from '@fluentui/react/lib/Icon'; export class CollectionIconField extends React.Component { diff --git a/src/controls/fields/fieldUserRenderer/FieldUserRenderer.tsx b/src/controls/fields/fieldUserRenderer/FieldUserRenderer.tsx index 02902995d..692e1fd6e 100644 --- a/src/controls/fields/fieldUserRenderer/FieldUserRenderer.tsx +++ b/src/controls/fields/fieldUserRenderer/FieldUserRenderer.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { css } from '@fluentui/react/lib/Utilities'; import clone from 'lodash/clone'; import { IExpandingCardProps } from '@fluentui/react/lib/HoverCard'; -import { DirectionalHint } from '@fluentui/react/lib/common/DirectionalHint'; +import { DirectionalHint } from '@fluentui/react/lib/Callout'; import { Persona, PersonaSize } from '@fluentui/react/lib/Persona'; import { IconButton, Button, ButtonType } from '@fluentui/react/lib/Button'; import { Spinner, SpinnerSize } from '@fluentui/react/lib/Spinner'; diff --git a/src/controls/filePicker/FilePicker.tsx b/src/controls/filePicker/FilePicker.tsx index 3983116eb..32b78215e 100644 --- a/src/controls/filePicker/FilePicker.tsx +++ b/src/controls/filePicker/FilePicker.tsx @@ -5,12 +5,13 @@ import { IIconProps } from "@fluentui/react/lib/Icon"; import { ActionButton, PrimaryButton -} from "@fluentui/react/lib/components/Button"; -import { Label } from "@fluentui/react/lib/components/Label"; +} from "@fluentui/react/lib/Button"; + +import { Label } from "@fluentui/react/lib/Label"; import { Panel, PanelType -} from "@fluentui/react/lib/components/Panel"; +} from "@fluentui/react/lib/Panel"; import { INavLink, INavLinkGroup, diff --git a/src/controls/filePicker/LinkFilePickerTab/LinkFilePickerTab.tsx b/src/controls/filePicker/LinkFilePickerTab/LinkFilePickerTab.tsx index 505db4609..d037cb8ed 100644 --- a/src/controls/filePicker/LinkFilePickerTab/LinkFilePickerTab.tsx +++ b/src/controls/filePicker/LinkFilePickerTab/LinkFilePickerTab.tsx @@ -4,7 +4,7 @@ import { ILinkFilePickerTabProps } from './ILinkFilePickerTabProps'; import { ILinkFilePickerTabState } from './ILinkFilePickerTabState'; import { GeneralHelper } from '../../../common/utilities/GeneralHelper'; import { IFilePickerResult } from '../FilePicker.types'; -import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/components/Button'; +import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/Button'; import { TextField } from '@fluentui/react/lib/TextField'; import { css } from '@fluentui/react/lib/Utilities'; diff --git a/src/controls/filePicker/MultipleUploadFilePickerTab/MultipleUploadFilePickerTab.tsx b/src/controls/filePicker/MultipleUploadFilePickerTab/MultipleUploadFilePickerTab.tsx index 5a9b118cb..3d3d798fa 100644 --- a/src/controls/filePicker/MultipleUploadFilePickerTab/MultipleUploadFilePickerTab.tsx +++ b/src/controls/filePicker/MultipleUploadFilePickerTab/MultipleUploadFilePickerTab.tsx @@ -4,7 +4,7 @@ import { IMultipleUploadFilePickerTabProps } from './IMultipleUploadFilePickerTa import { IMultipleUploadFilePickerTabState } from './IMultipleUploadFilePickerTabState'; import { IFilePickerResult } from '../FilePicker.types'; import { GeneralHelper } from '../../../common/utilities/GeneralHelper'; -import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/components/Button'; +import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/Button'; import { css } from '@fluentui/react/lib/Utilities'; import { DragDropFiles } from '../../dragDropFiles/DragDropFiles'; diff --git a/src/controls/filePicker/OneDriveFilesTab/OneDriveFilesTab.types.ts b/src/controls/filePicker/OneDriveFilesTab/OneDriveFilesTab.types.ts index 3916f9429..46be3ca19 100644 --- a/src/controls/filePicker/OneDriveFilesTab/OneDriveFilesTab.types.ts +++ b/src/controls/filePicker/OneDriveFilesTab/OneDriveFilesTab.types.ts @@ -1,4 +1,4 @@ -import { IBreadcrumbItem } from "@fluentui/react/lib/components/Breadcrumb"; +import { IBreadcrumbItem } from "@fluentui/react/lib/Breadcrumb"; import { IFile } from "../../../services/FileBrowserService.types"; export interface OneDriveFilesBreadcrumbItem extends IBreadcrumbItem { diff --git a/src/controls/filePicker/RecentFilesTab/RecentFilesTab.tsx b/src/controls/filePicker/RecentFilesTab/RecentFilesTab.tsx index 4de53ebbb..368e9429e 100644 --- a/src/controls/filePicker/RecentFilesTab/RecentFilesTab.tsx +++ b/src/controls/filePicker/RecentFilesTab/RecentFilesTab.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/components/Button'; +import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/Button'; import { Spinner } from '@fluentui/react/lib/Spinner'; import { FocusZone } from '@fluentui/react/lib/FocusZone'; import { List } from '@fluentui/react/lib/List'; diff --git a/src/controls/filePicker/SiteFilePickerTab/SiteFilePickerTab.tsx b/src/controls/filePicker/SiteFilePickerTab/SiteFilePickerTab.tsx index 818d6ea4b..03bb03897 100644 --- a/src/controls/filePicker/SiteFilePickerTab/SiteFilePickerTab.tsx +++ b/src/controls/filePicker/SiteFilePickerTab/SiteFilePickerTab.tsx @@ -4,7 +4,7 @@ import { ISiteFilePickerTabProps } from './ISiteFilePickerTabProps'; import { ISiteFilePickerTabState } from './ISiteFilePickerTabState'; import { DocumentLibraryBrowser } from '../controls/DocumentLibraryBrowser/DocumentLibraryBrowser'; import { FileBrowser } from '../controls/FileBrowser/FileBrowser'; -import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/components/Button'; +import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/Button'; import { ScrollablePane } from '@fluentui/react/lib/ScrollablePane'; import { Breadcrumb } from '@fluentui/react/lib/Breadcrumb'; import { IFile, IFolder, ILibrary } from '../../../services/FileBrowserService.types'; diff --git a/src/controls/filePicker/UploadFilePickerTab/UploadFilePickerTab.tsx b/src/controls/filePicker/UploadFilePickerTab/UploadFilePickerTab.tsx index bdbfbb4c7..8ac8ed851 100644 --- a/src/controls/filePicker/UploadFilePickerTab/UploadFilePickerTab.tsx +++ b/src/controls/filePicker/UploadFilePickerTab/UploadFilePickerTab.tsx @@ -4,7 +4,7 @@ import { IUploadFilePickerTabProps } from './IUploadFilePickerTabProps'; import { IUploadFilePickerTabState } from './IUploadFilePickerTabState'; import { IFilePickerResult } from '../FilePicker.types'; import { GeneralHelper } from '../../../common/utilities/GeneralHelper'; -import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/components/Button'; +import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/Button'; import { css } from '@fluentui/react/lib/Utilities'; import * as strings from 'ControlStrings'; diff --git a/src/controls/filePicker/WebSearchTab/WebSearchTab.tsx b/src/controls/filePicker/WebSearchTab/WebSearchTab.tsx index 3afd94a04..845f4be71 100644 --- a/src/controls/filePicker/WebSearchTab/WebSearchTab.tsx +++ b/src/controls/filePicker/WebSearchTab/WebSearchTab.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { IWebSearchTabProps } from './IWebSearchTabProps'; import { IWebSearchTabState } from './IWebSearchTabState'; import { ISearchSuggestion, ImageSize, ImageAspect, ImageLicense, DEFAULT_SUGGESTIONS, MAX_ROW_HEIGHT, ROWS_PER_PAGE } from './WebSearchTab.types'; -import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/components/Button'; +import { PrimaryButton, DefaultButton } from '@fluentui/react/lib/Button'; import { Label } from '@fluentui/react/lib/Label'; import { SearchBox } from '@fluentui/react/lib/SearchBox'; import { Check } from '@fluentui/react/lib/Check'; diff --git a/src/controls/fileTypeIcon/FileTypeIcon.tsx b/src/controls/fileTypeIcon/FileTypeIcon.tsx index 2e7f8cede..32d5d9bc2 100644 --- a/src/controls/fileTypeIcon/FileTypeIcon.tsx +++ b/src/controls/fileTypeIcon/FileTypeIcon.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { findIndex } from '@microsoft/sp-lodash-subset'; import { IFileTypeIconProps, ApplicationType, ApplicationIconList, IconType, IconSizes, ImageSize, IImageResult, ICON_GENERIC_16, ICON_GENERIC_48, ICON_GENERIC_96, ImageInformation } from './IFileTypeIcon'; import * as telemetry from '../../common/telemetry'; -import { Icon } from '@fluentui/react/lib/components/Icon'; +import { Icon } from '@fluentui/react/lib/Icon'; import { ICON_GENERIC_20 } from '.'; const ICON_GENERIC = 'Page'; @@ -264,6 +264,14 @@ export class FileTypeIcon extends React.Component { iconElm = ; } + // Bind events + iconElm.props.onClick = this.props.onClick; + iconElm.props.onDoubleClick = this.props.onDoubleClick; + iconElm.props.onMouseEnter = this.props.onMouseEnter; + iconElm.props.onMouseLeave = this.props.onMouseLeave; + iconElm.props.onMouseOver = this.props.onMouseOver; + iconElm.props.onMouseUp = this.props.onMouseUp; + // Return the icon element return iconElm; } diff --git a/src/controls/fileTypeIcon/IFileTypeIcon.ts b/src/controls/fileTypeIcon/IFileTypeIcon.ts index a70ddf4fc..d2f2d7db7 100644 --- a/src/controls/fileTypeIcon/IFileTypeIcon.ts +++ b/src/controls/fileTypeIcon/IFileTypeIcon.ts @@ -1,3 +1,5 @@ +import { MouseEventHandler } from "react"; + /** * Available icon types */ @@ -225,11 +227,16 @@ export interface ImageInformation { * Interface for the FileTypeIcon component properties */ export interface IFileTypeIconProps { - type: IconType; application?: ApplicationType; path?: string; size?: ImageSize; + onClick?: MouseEventHandler | undefined; + onDoubleClick?: MouseEventHandler | undefined; + onMouseEnter?: MouseEventHandler | undefined; + onMouseLeave?: MouseEventHandler | undefined; + onMouseOver?: MouseEventHandler | undefined; + onMouseUp?: MouseEventHandler | undefined; } /** diff --git a/src/controls/listItemComments/components/ConfirmDelete/ConfirmDelete.tsx b/src/controls/listItemComments/components/ConfirmDelete/ConfirmDelete.tsx index b828481be..bc09f7993 100644 --- a/src/controls/listItemComments/components/ConfirmDelete/ConfirmDelete.tsx +++ b/src/controls/listItemComments/components/ConfirmDelete/ConfirmDelete.tsx @@ -4,7 +4,7 @@ import { ListItemCommentsStateContext } from "../ListItemCommentsStateProvider"; import { Dialog, DialogType, DialogFooter } from "@fluentui/react/lib/Dialog"; import { PrimaryButton, DefaultButton } from "@fluentui/react/lib/Button"; import { CommentItem } from "../Comments/CommentItem"; -import { DocumentCard } from "@fluentui/react/lib/components/DocumentCard"; +import { DocumentCard } from "@fluentui/react/lib/DocumentCard"; import { DocumentCardDetails } from "@fluentui/react/lib/DocumentCard"; import { Stack } from "@fluentui/react/lib/Stack"; import { useListItemCommentsStyles } from "../Comments/useListItemCommentsStyles"; diff --git a/src/controls/listItemPicker/IComboBoxListItemPickerProps.ts b/src/controls/listItemPicker/IComboBoxListItemPickerProps.ts index 9e74e708f..30ee514a1 100644 --- a/src/controls/listItemPicker/IComboBoxListItemPickerProps.ts +++ b/src/controls/listItemPicker/IComboBoxListItemPickerProps.ts @@ -1,7 +1,7 @@ -import { IComboBoxOptionStyles, IComboBoxStyles } from "@fluentui/react/lib/components/ComboBox"; +import { IComboBoxOptionStyles, IComboBoxStyles } from "@fluentui/react/lib/ComboBox"; -import { IAutofillProps } from "@fluentui/react/lib/components/Autofill"; -import { IKeytipProps } from "@fluentui/react/lib/components/Keytip"; +import { IAutofillProps } from "@fluentui/react/lib/Autofill"; +import { IKeytipProps } from "@fluentui/react/lib/Keytip"; import { SPHttpClient } from '@microsoft/sp-http'; export interface IComboBoxListItemPickerProps { diff --git a/src/controls/listItemPicker/ListItemPicker.tsx b/src/controls/listItemPicker/ListItemPicker.tsx index 928bbcdb9..d4c982976 100644 --- a/src/controls/listItemPicker/ListItemPicker.tsx +++ b/src/controls/listItemPicker/ListItemPicker.tsx @@ -1,14 +1,13 @@ import * as strings from 'ControlStrings'; import * as React from "react"; import SPservice from "../../services/SPService"; -import { TagPicker } from "@fluentui/react/lib/components/pickers/TagPicker/TagPicker"; +import { ITag, TagPicker } from '@fluentui/react/lib/Pickers'; import { Label } from "@fluentui/react/lib/Label"; import { getId } from '@fluentui/react/lib/Utilities'; import { IListItemPickerProps } from "./IListItemPickerProps"; import { IListItemPickerState } from "./IListItemPickerState"; import * as telemetry from '../../common/telemetry'; import isEqual from 'lodash/isEqual'; -import { ITag } from '@fluentui/react/lib/components/pickers/TagPicker/TagPicker.types'; import { SPHelper } from '../../common/utilities/SPHelper'; import { Guid } from "@microsoft/sp-core-library" diff --git a/src/controls/listPicker/ListPicker.tsx b/src/controls/listPicker/ListPicker.tsx index 38d273803..5cb6ef0af 100644 --- a/src/controls/listPicker/ListPicker.tsx +++ b/src/controls/listPicker/ListPicker.tsx @@ -1,6 +1,6 @@ import { cloneDeep } from '@microsoft/sp-lodash-subset'; -import { Dropdown, IDropdownOption, IDropdownProps } from '@fluentui/react/lib/components/Dropdown'; -import { Spinner, SpinnerSize } from '@fluentui/react/lib/components/Spinner'; +import { Dropdown, IDropdownOption, IDropdownProps } from '@fluentui/react/lib/Dropdown'; +import { Spinner, SpinnerSize } from '@fluentui/react/lib/Spinner'; import * as React from 'react'; import * as telemetry from '../../common/telemetry'; diff --git a/src/controls/listView/IListView.ts b/src/controls/listView/IListView.ts index 6fed62c20..cd5b1fbd1 100644 --- a/src/controls/listView/IListView.ts +++ b/src/controls/listView/IListView.ts @@ -1,4 +1,4 @@ -import { IColumn, IGroup, SelectionMode, IDetailsRowProps } from '@fluentui/react/lib/components/DetailsList'; +import { IColumn, IGroup, SelectionMode, IDetailsRowProps } from '@fluentui/react/lib/DetailsList'; export { SelectionMode }; diff --git a/src/controls/listView/ListView.tsx b/src/controls/listView/ListView.tsx index 80c5067c0..de3189935 100644 --- a/src/controls/listView/ListView.tsx +++ b/src/controls/listView/ListView.tsx @@ -6,7 +6,7 @@ import { IRenderFunction } from '@fluentui/react/lib/Utilities'; import { mergeStyleSets } from '@fluentui/react/lib/Styling'; import { DetailsList, DetailsListLayoutMode, Selection, SelectionMode, IGroup, IDetailsHeaderProps } from '@fluentui/react/lib/DetailsList'; import { IListViewProps, IListViewState, IViewField, IGrouping, GroupOrder } from './IListView'; -import { IColumn, IGroupRenderProps } from '@fluentui/react/lib/components/DetailsList'; +import { IColumn, IGroupRenderProps } from '@fluentui/react/lib/DetailsList'; import { findIndex, has, sortBy, isEqual, cloneDeep } from '@microsoft/sp-lodash-subset'; import { FileTypeIcon, IconType } from '../fileTypeIcon/index'; import * as strings from 'ControlStrings'; diff --git a/src/controls/map/Map.tsx b/src/controls/map/Map.tsx index 8449e64c7..531f7e8c7 100644 --- a/src/controls/map/Map.tsx +++ b/src/controls/map/Map.tsx @@ -4,11 +4,11 @@ import styles from './Maps.module.scss'; import { IMapProps } from './IMapProps'; import { IMapState } from './IMapState'; import { ICoordinates, MapType, LocationInfo } from './IMap'; -import { Label } from '@fluentui/react/lib/components/Label'; +import { Label } from '@fluentui/react/lib/Label'; import { Spinner, SpinnerSize } from '@fluentui/react/lib/Spinner'; -import { Icon } from "@fluentui/react/lib/components/Icon"; -import { PrimaryButton } from "@fluentui/react/lib/components/Button"; -import { TextField } from "@fluentui/react/lib/components/TextField"; +import { Icon } from "@fluentui/react/lib/Icon"; +import { PrimaryButton } from "@fluentui/react/lib/Button"; +import { TextField } from "@fluentui/react/lib/TextField"; import * as telemetry from '../../common/telemetry'; import { isEqual } from "@microsoft/sp-lodash-subset"; diff --git a/src/controls/modernTaxonomyPicker/ModernTaxonomyPicker.tsx b/src/controls/modernTaxonomyPicker/ModernTaxonomyPicker.tsx index 08649ecc2..5567b78d7 100644 --- a/src/controls/modernTaxonomyPicker/ModernTaxonomyPicker.tsx +++ b/src/controls/modernTaxonomyPicker/ModernTaxonomyPicker.tsx @@ -11,7 +11,7 @@ import * as strings from 'ControlStrings'; import { DefaultButton, IButtonStyles, IconButton, PrimaryButton } from '@fluentui/react/lib/Button'; -import { IIconProps } from '@fluentui/react/lib/components/Icon'; +import { IIconProps } from '@fluentui/react/lib/Icon'; import { Label } from '@fluentui/react/lib/Label'; import { Panel, diff --git a/src/controls/modernTaxonomyPicker/modernTermPicker/ModernTermPicker.tsx b/src/controls/modernTaxonomyPicker/modernTermPicker/ModernTermPicker.tsx index f133b35f7..152c41207 100644 --- a/src/controls/modernTaxonomyPicker/modernTermPicker/ModernTermPicker.tsx +++ b/src/controls/modernTaxonomyPicker/modernTermPicker/ModernTermPicker.tsx @@ -1,19 +1,17 @@ import React from 'react'; -import { BasePicker } from '@fluentui/react/lib/components/pickers/BasePicker'; import { IModernTermPickerProps, ITermItemProps } from './ModernTermPicker.types'; import { TermItem } from '../termItem/TermItem'; import { TermItemSuggestion } from '../termItem/TermItemSuggestion'; -import { IBasePickerStyleProps, - IBasePickerStyles - } from '@fluentui/react/lib/components/pickers/BasePicker.types'; -import { getStyles } from '@fluentui/react/lib/components/pickers/BasePicker.styles'; + import { initializeComponentRef, styled } from '@fluentui/react/lib/Utilities'; -import { ISuggestionItemProps } from '@fluentui/react/lib/components/pickers/Suggestions/SuggestionsItem.types'; + import { ITermInfo } from '@pnp/sp/taxonomy'; +import { BasePicker, IBasePickerStyleProps, IBasePickerStyles, ISuggestionItemProps } from '@fluentui/react/lib/Pickers'; +import { getStyles } from '@fluentui/react/lib/components/pickers/BasePicker.styles'; export class ModernTermPickerBase extends BasePicker { public static defaultProps = { diff --git a/src/controls/modernTaxonomyPicker/modernTermPicker/ModernTermPicker.types.ts b/src/controls/modernTaxonomyPicker/modernTermPicker/ModernTermPicker.types.ts index 7bcbb1111..65f8b41c6 100644 --- a/src/controls/modernTaxonomyPicker/modernTermPicker/ModernTermPicker.types.ts +++ b/src/controls/modernTaxonomyPicker/modernTermPicker/ModernTermPicker.types.ts @@ -1,9 +1,8 @@ import { ITermInfo, ITermStoreInfo } from '@pnp/sp/taxonomy'; -import { IBasePickerProps } from '@fluentui/react/lib/components/pickers/BasePicker.types'; -import { IPickerItemProps } from '@fluentui/react/lib/components/pickers/PickerItem.types'; import { IStyle, ITheme } from '@fluentui/react/lib/Styling'; import { IStyleFunctionOrObject } from '@fluentui/react/lib/Utilities'; import { IReadonlyTheme } from '@microsoft/sp-component-base'; +import { IBasePickerProps, IPickerItemProps } from '@fluentui/react/lib/Pickers'; export interface IModernTermPickerProps extends IBasePickerProps { themeVariant?: IReadonlyTheme; diff --git a/src/controls/modernTaxonomyPicker/termItem/TermItem.styles.ts b/src/controls/modernTaxonomyPicker/termItem/TermItem.styles.ts index eddd099d8..a5e9b6af0 100644 --- a/src/controls/modernTaxonomyPicker/termItem/TermItem.styles.ts +++ b/src/controls/modernTaxonomyPicker/termItem/TermItem.styles.ts @@ -1,7 +1,7 @@ -import { ButtonGlobalClassNames } from "@fluentui/react/lib/components/Button/BaseButton.classNames"; import { getFocusStyle, getGlobalClassNames, HighContrastSelector } from "@fluentui/react/lib/Styling"; import { getRTL } from "@fluentui/react/lib/Utilities"; import { ITermItemStyleProps, ITermItemStyles } from "../modernTermPicker/ModernTermPicker.types"; +import { ButtonGlobalClassNames } from "@fluentui/react/lib/Button"; const GlobalClassNames = { root: 'ms-TagItem', diff --git a/src/controls/modernTaxonomyPicker/termItem/TermItem.tsx b/src/controls/modernTaxonomyPicker/termItem/TermItem.tsx index 282dc459c..f02f85e72 100644 --- a/src/controls/modernTaxonomyPicker/termItem/TermItem.tsx +++ b/src/controls/modernTaxonomyPicker/termItem/TermItem.tsx @@ -1,8 +1,9 @@ -import { IconButton } from '@fluentui/react/lib/components/Button/IconButton/IconButton'; + import { classNamesFunction, styled } from '@fluentui/react/lib/Utilities'; import * as React from 'react'; import { ITermItemProps, ITermItemStyleProps, ITermItemStyles } from '../modernTermPicker/ModernTermPicker.types'; import { getStyles } from './TermItem.styles'; +import { IconButton } from '@fluentui/react/lib/Button'; const getClassNames = classNamesFunction(); diff --git a/src/controls/monacoEditor/Error.tsx b/src/controls/monacoEditor/Error.tsx index 7647cf491..bbd1c1473 100644 --- a/src/controls/monacoEditor/Error.tsx +++ b/src/controls/monacoEditor/Error.tsx @@ -1,5 +1,5 @@ -import { Stack } from "@fluentui/react/lib/components/Stack"; +import { Stack } from "@fluentui/react/lib/Stack"; import { MessageBarType, MessageBar } from "@fluentui/react/lib/MessageBar"; import * as React from "react"; diff --git a/src/controls/peoplepicker/IPeoplePicker.ts b/src/controls/peoplepicker/IPeoplePicker.ts index 2eeb091db..3d6f1cec7 100644 --- a/src/controls/peoplepicker/IPeoplePicker.ts +++ b/src/controls/peoplepicker/IPeoplePicker.ts @@ -1,8 +1,7 @@ -import { BaseComponentContext } from '@microsoft/sp-component-base'; -import { IBasePickerStyles } from "@fluentui/react"; -import { DirectionalHint } from "@fluentui/react/lib/common/DirectionalHint"; -import { IPersonaProps } from "@fluentui/react/lib/components/Persona/Persona.types"; -import { PrincipalType } from "."; +import { DirectionalHint } from '@fluentui/react/lib/Callout'; +import { IPersonaProps } from '@fluentui/react/lib/Persona'; +import { IBasePickerStyles } from '@fluentui/react/lib/Pickers'; +import { IPeoplePickerContext, PrincipalType } from "."; /** * Used to display a placeholder in case of no or temporary content. Button is optional. @@ -12,7 +11,7 @@ export interface IPeoplePickerProps { /** * Context of the component */ - context: BaseComponentContext; + context: IPeoplePickerContext; /** * Text of the Control */ @@ -139,17 +138,6 @@ export interface IPeoplePickerProps { resultFilter?: (result: IPersonaProps[]) => IPersonaProps[]; } -export interface IPeoplePickerState { - mostRecentlyUsedPersons?: IPersonaProps[]; - errorMessage?: string; - internalErrorMessage?: string; - resolveDelay?: number; - - selectedPersons?: IPersonaProps[]; - peoplePersonaMenu?: IPersonaProps[]; - delayResults?: boolean; -} - export interface IPeoplePickerUserItem { /** * LoginName or Id of the principal in the site. diff --git a/src/controls/peoplepicker/IPeoplePickerContext.ts b/src/controls/peoplepicker/IPeoplePickerContext.ts new file mode 100644 index 000000000..7519e487f --- /dev/null +++ b/src/controls/peoplepicker/IPeoplePickerContext.ts @@ -0,0 +1,19 @@ +import { MSGraphClientFactory, SPHttpClient } from "@microsoft/sp-http"; + +/** + * Context for the PeoplePicker control + */ +export interface IPeoplePickerContext { + /** + * Current `SPWeb` absolute URL. + */ + absoluteUrl: string; + /** + * Instance of MSGraphClientFactory used for querying Microsoft Graph REST API. + */ + msGraphClientFactory: MSGraphClientFactory; + /** + * Instance of SPHttpClient used for querying SharePoint REST API. + */ + spHttpClient: SPHttpClient; +} \ No newline at end of file diff --git a/src/controls/peoplepicker/PeoplePickerComponent.tsx b/src/controls/peoplepicker/PeoplePickerComponent.tsx index 2fa52a8dd..b43681c87 100644 --- a/src/controls/peoplepicker/PeoplePickerComponent.tsx +++ b/src/controls/peoplepicker/PeoplePickerComponent.tsx @@ -3,16 +3,26 @@ import * as React from 'react'; import * as telemetry from '../../common/telemetry'; import styles from './PeoplePickerComponent.module.scss'; import SPPeopleSearchService from "../../services/PeopleSearchService"; -import { IPeoplePickerProps, IPeoplePickerState } from './IPeoplePicker'; +import { IPeoplePickerProps } from './IPeoplePicker'; import { TooltipHost } from '@fluentui/react/lib/Tooltip'; import { DirectionalHint } from '@fluentui/react/lib/Callout'; -import { NormalPeoplePicker } from '@fluentui/react/lib/components/pickers/PeoplePicker/PeoplePicker'; -import { Label } from '@fluentui/react/lib/components/Label'; -import { IBasePickerSuggestionsProps } from "@fluentui/react/lib/components/pickers/BasePicker.types"; -import { IPersonaProps } from "@fluentui/react/lib/components/Persona/Persona.types"; +import { Label } from '@fluentui/react/lib/Label'; import FieldErrorMessage from '../errorMessage/ErrorMessage'; import isEqual from 'lodash/isEqual'; import uniqBy from 'lodash/uniqBy'; +import { IPersonaProps } from '@fluentui/react/lib/Persona'; +import { IBasePickerSuggestionsProps, NormalPeoplePicker} from '@fluentui/react/lib/Pickers'; + +interface IPeoplePickerState { + mostRecentlyUsedPersons?: IPersonaProps[]; + errorMessage?: string; + internalErrorMessage?: string; + resolveDelay?: number; + + selectedPersons?: IPersonaProps[]; + peoplePersonaMenu?: IPersonaProps[]; + delayResults?: boolean; +} /** * PeoplePicker component diff --git a/src/controls/peoplepicker/index.ts b/src/controls/peoplepicker/index.ts index 73502887f..b4602fd13 100644 --- a/src/controls/peoplepicker/index.ts +++ b/src/controls/peoplepicker/index.ts @@ -1,3 +1,4 @@ export * from './IPeoplePicker'; +export * from './IPeoplePickerContext'; export * from './PeoplePickerComponent'; export * from './PrincipalType'; diff --git a/src/controls/placeholder/PlaceholderComponent.tsx b/src/controls/placeholder/PlaceholderComponent.tsx index 961899516..e5fc0fa2b 100644 --- a/src/controls/placeholder/PlaceholderComponent.tsx +++ b/src/controls/placeholder/PlaceholderComponent.tsx @@ -1,7 +1,7 @@ import { ThemeContext } from '@fluentui/react-theme-provider/lib/ThemeContext'; import { Theme } from '@fluentui/react-theme-provider/lib/types'; import { PrimaryButton } from '@fluentui/react/lib/Button'; -import { Icon } from '@fluentui/react/lib/components/Icon'; +import { Icon } from '@fluentui/react/lib/Icon'; import * as React from 'react'; import { IPlaceholderState } from '.'; import * as telemetry from '../../common/telemetry'; diff --git a/src/controls/richText/RichText.tsx b/src/controls/richText/RichText.tsx index 4a743b535..ec31a0f37 100644 --- a/src/controls/richText/RichText.tsx +++ b/src/controls/richText/RichText.tsx @@ -467,7 +467,7 @@ export class RichText extends React.Component { } // Okay, we're in edit mode. - const { placeholder, styleOptions: { showStyles, showBold, showItalic, showUnderline, showAlign, showList, showLink, showMore, showImage } } = this.props; + const { placeholder,style, styleOptions: { showStyles, showBold, showItalic, showUnderline, showAlign, showList, showLink, showMore, showImage } } = this.props; // Get a unique id for the toolbar const modules = { @@ -516,7 +516,7 @@ export class RichText extends React.Component { ReactQuillInstance.register(sizeClass, true); return ( -
{ this._wrapperRef = ref; }} className={css(styles.richtext && this.state.editing ? 'ql-active' : null, this.props.className || null) || null}> +
{ this._wrapperRef = ref; }} className={css(styles.richtext && this.state.editing ? 'ql-active' : null, this.props.className || null) || null} style={style}> {renderLabel}
{ diff --git a/src/controls/richText/RichText.types.ts b/src/controls/richText/RichText.types.ts index 8a908d416..5852cf7fc 100644 --- a/src/controls/richText/RichText.types.ts +++ b/src/controls/richText/RichText.types.ts @@ -1,3 +1,4 @@ +import React from 'react'; import { ISwatchColor } from './SwatchColorPickerGroup.types'; export interface IRichTextProps { /** @@ -18,6 +19,12 @@ export interface IRichTextProps { */ className?: string; + /** + * Styles to apply to the rich text editor. + * @defaultvalue null + */ + style?: React.CSSProperties; + /** * Indicates if the rich text editor should be in edit mode * @defaultvalue true @@ -28,7 +35,7 @@ export interface IRichTextProps { * Placeholder text to show when editor is empty. * @defaultvalue undefined */ - placeholder? : string; + placeholder?: string; /** * The HTML text containing the rich text diff --git a/src/controls/taxonomyPicker/TaxonomyPicker.tsx b/src/controls/taxonomyPicker/TaxonomyPicker.tsx index 38b5831ed..b91d2297e 100644 --- a/src/controls/taxonomyPicker/TaxonomyPicker.tsx +++ b/src/controls/taxonomyPicker/TaxonomyPicker.tsx @@ -2,7 +2,6 @@ import * as React from 'react'; import { PrimaryButton, DefaultButton, IconButton } from '@fluentui/react/lib/Button'; import { Panel, PanelType } from '@fluentui/react/lib/Panel'; import { Spinner, SpinnerSize } from '@fluentui/react/lib/Spinner'; -import { Autofill } from '@fluentui/react/lib/components/Autofill/Autofill'; import { Label } from '@fluentui/react/lib/Label'; import TermPicker from './TermPicker'; import { IPickerTerms, IPickerTerm } from './ITermPicker'; @@ -18,6 +17,7 @@ import FieldErrorMessage from '../errorMessage/ErrorMessage'; import { initializeIcons } from '@uifabric/icons'; import * as telemetry from '../../common/telemetry'; import { EmptyGuid } from '../../common/Constants'; +import { Autofill } from '@fluentui/react/lib/Autofill'; /** * Image URLs / Base64 diff --git a/src/controls/taxonomyPicker/TermPicker.tsx b/src/controls/taxonomyPicker/TermPicker.tsx index 5843acec6..db00548d3 100644 --- a/src/controls/taxonomyPicker/TermPicker.tsx +++ b/src/controls/taxonomyPicker/TermPicker.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { BasePicker, IBasePickerProps, IInputProps, IPickerItemProps } from '@fluentui/react/lib/Pickers'; +import { Autofill, BasePicker, IBasePickerProps, IInputProps, IPickerItemProps } from '@fluentui/react/lib/Pickers'; import { IPickerTerm, IPickerTerms } from './ITermPicker'; import SPTermStorePickerService from './../../services/SPTermStorePickerService'; import styles from './TaxonomyPicker.module.scss'; @@ -8,7 +8,6 @@ import { BaseComponentContext } from '@microsoft/sp-component-base'; import * as strings from 'ControlStrings'; import { Icon } from '@fluentui/react/lib/Icon'; import { ITermSet } from "../../services/ISPTermStorePickerService"; -import { Autofill } from '@fluentui/react/lib/components/Autofill/Autofill'; import { LegacyRef, KeyboardEvent } from 'react'; export class TermBasePicker extends BasePicker> diff --git a/src/controls/toolbar/InFlowToolbarItem.tsx b/src/controls/toolbar/InFlowToolbarItem.tsx index f6d43160f..10f6bf854 100644 --- a/src/controls/toolbar/InFlowToolbarItem.tsx +++ b/src/controls/toolbar/InFlowToolbarItem.tsx @@ -6,11 +6,11 @@ import { tooltipAsLabelBehavior } from "@fluentui/react-northstar"; import { cloneDeep } from "@microsoft/sp-lodash-subset"; -import { Icon } from "@fluentui/react/lib/components/Icon/Icon"; import * as React from "react"; import { TAction } from "../../common/model/TAction"; import styles from "./Toolbar.module.scss"; import { TToolbarLayout } from "./ToolbarActionsUtils"; +import { Icon } from "@fluentui/react/lib/Icon"; interface IInFlowToolbarItemProps { action: TAction; diff --git a/src/controls/toolbar/Toolbar.tsx b/src/controls/toolbar/Toolbar.tsx index 6507a3f6d..eaac588df 100644 --- a/src/controls/toolbar/Toolbar.tsx +++ b/src/controls/toolbar/Toolbar.tsx @@ -15,11 +15,11 @@ import { ToolbarFind } from "./ToolbarFind"; import { ToolbarTheme } from "./ToolbarTheme"; import "./toolbar.css"; -import { Icon } from "@fluentui/react/lib/components/Icon/Icon"; import { InFlowToolbarItem, toolbarMenuProps } from "./InFlowToolbarItem"; import styles from "./Toolbar.module.scss"; import { flattenedActions, getInFlowToolbarItems, getOverflowToolbarItems, TActionGroups, TFilters, TToolbarItems, TToolbarLayout } from "./ToolbarActionsUtils"; import { useTelemetry } from "../../common/telemetry"; +import { Icon } from "@fluentui/react/lib/Icon"; /** * Toolbar props diff --git a/src/services/PeopleSearchService.ts b/src/services/PeopleSearchService.ts index 85c16a80c..c7c2820ed 100644 --- a/src/services/PeopleSearchService.ts +++ b/src/services/PeopleSearchService.ts @@ -1,4 +1,3 @@ -import { BaseComponentContext } from '@microsoft/sp-component-base'; import { ISPHttpClientOptions, SPHttpClient } from '@microsoft/sp-http'; import { findIndex } from "@microsoft/sp-lodash-subset"; import { sp } from '@pnp/sp'; @@ -7,7 +6,7 @@ import "@pnp/sp/sputilities"; import "@pnp/sp/webs"; import { Web } from "@pnp/sp/webs"; import { IUserInfo } from "../controls/peoplepicker/IUsers"; -import { IPeoplePickerUserItem, PrincipalType } from "../PeoplePicker"; +import { IPeoplePickerContext, IPeoplePickerUserItem, PrincipalType } from "../PeoplePicker"; /** * Service implementation to search people in SharePoint @@ -19,12 +18,16 @@ export default class SPPeopleSearchService { /** * Service constructor */ - constructor(private context: BaseComponentContext) { + constructor(private context: IPeoplePickerContext) { this.cachedPersonas = {}; this.cachedLocalUsers = {}; - this.cachedLocalUsers[this.context.pageContext.web.absoluteUrl] = []; + this.cachedLocalUsers[context.absoluteUrl] = []; // Setup PnPjs - sp.setup({ pageContext: this.context.pageContext }); + sp.setup({ pageContext: { + web: { + absoluteUrl: context.absoluteUrl + } + }}); } /** @@ -33,7 +36,7 @@ export default class SPPeopleSearchService { * @param value */ public generateUserPhotoLink(value: string): string { - return `${this.context.pageContext.web.absoluteUrl}/_layouts/15/userphoto.aspx?accountname=${encodeURIComponent(value)}&size=M`; + return `${this.context.absoluteUrl}/_layouts/15/userphoto.aspx?accountname=${encodeURIComponent(value)}&size=M`; } /** @@ -109,7 +112,7 @@ export default class SPPeopleSearchService { private async searchTenant(siteUrl: string, query: string, maximumSuggestions: number, principalTypes: PrincipalType[], ensureUser: boolean, allowUnvalidated: boolean, groupId: number | string): Promise { try { // If the running env is SharePoint, loads from the peoplepicker web service - const userRequestUrl: string = `${siteUrl || this.context.pageContext.web.absoluteUrl}/_api/SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerSearchUser`; + const userRequestUrl: string = `${siteUrl || this.context.absoluteUrl}/_api/SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerSearchUser`; // eslint-disable-next-line @typescript-eslint/no-explicit-any const searchBody: any = { queryParams: { @@ -143,7 +146,7 @@ export default class SPPeopleSearchService { // Get user loginName from user email const _users = []; - const batch = Web(this.context.pageContext.web.absoluteUrl).createBatch(); + const batch = Web(this.context.absoluteUrl).createBatch(); for (const value of graphUserResponse.value) { sp.web.inBatch(batch).ensureUser(value.userPrincipalName).then(u => _users.push(u.data)).catch(() => { // no-op @@ -203,7 +206,7 @@ export default class SPPeopleSearchService { for (const value of values) { // Only ensure the user if it is not a SharePoint group if (!value.EntityData || (value.EntityData && typeof value.EntityData.SPGroupID === "undefined" && value.EntityData.PrincipalType !== "UNVALIDATED_EMAIL_ADDRESS")) { - const id = await this.ensureUser(value.Key, siteUrl || this.context.pageContext.web.absoluteUrl); + const id = await this.ensureUser(value.Key, siteUrl || this.context.absoluteUrl); value.LoginName = value.Key; value.Key = id; } diff --git a/src/services/SPService.ts b/src/services/SPService.ts index 7a276ab73..3edcf6f56 100644 --- a/src/services/SPService.ts +++ b/src/services/SPService.ts @@ -654,9 +654,9 @@ export default class SPService implements ISPService { } } - public async getSingleManagedMetadataLabel(listId: string, listItemId: number, fieldName: string): Promise { // eslint-disable-line @typescript-eslint/no-explicit-any + public async getSingleManagedMetadataLabel(listId: string, listItemId: number, fieldName: string, webUrl?: string): Promise { // eslint-disable-line @typescript-eslint/no-explicit-any try { - const webAbsoluteUrl = this._context.pageContext.web.absoluteUrl; + const webAbsoluteUrl = !webUrl ? this._context.pageContext.web.absoluteUrl : webUrl; const apiUrl = `${webAbsoluteUrl}/_api/web/lists(@listId)/RenderListDataAsStream?@listId=guid'${encodeURIComponent(listId)}'`; const data = await this._context.spHttpClient.post(apiUrl, SPHttpClient.configurations.v1, { body: JSON.stringify({ diff --git a/src/webparts/controlsTest/components/ControlsTest.tsx b/src/webparts/controlsTest/components/ControlsTest.tsx index 603c9c5bd..bb8114ba0 100644 --- a/src/webparts/controlsTest/components/ControlsTest.tsx +++ b/src/webparts/controlsTest/components/ControlsTest.tsx @@ -15,14 +15,14 @@ import { import { DefaultButton, PrimaryButton -} from "@fluentui/react/lib/components/Button"; -import { DialogType, DialogFooter, IDialogContentProps } from "@fluentui/react/lib/components/Dialog"; +} from "@fluentui/react/lib/Button"; +import { DialogType, DialogFooter, IDialogContentProps } from "@fluentui/react/lib/Dialog"; import { IModalProps } from "@fluentui/react/lib/Modal"; import { Dropdown, IDropdownOption -} from "@fluentui/react/lib/components/Dropdown"; -import { Link } from "@fluentui/react/lib/components/Link"; +} from "@fluentui/react/lib/Dropdown"; +import { Link } from "@fluentui/react/lib/Link"; import { DocumentCard, DocumentCardActivity, @@ -142,6 +142,7 @@ import { MapType } from "../../../Map"; import { + IPeoplePickerContext, PeoplePicker, PrincipalType } from "../../../controls/peoplepicker"; @@ -481,6 +482,7 @@ export default class ControlsTest extends React.Component @@ -1299,6 +1311,8 @@ export default class ControlsTest extends React.Component + + console.log("DateTimePicker value:", value)} placeholder="Pick a date" restrictedDates={[new Date(2024,1,15), new Date(2024,1,16), new Date(2024,1,17)]}/>
+
+ Image icons with support to events: + console.log("onClick on FileTypeIcon!")} + onDoubleClick={(e) => console.log("onDoubleClick on FileTypeIcon!")} + onMouseEnter={(e) => console.log("onMouseEnter on FileTypeIcon!")} + onMouseLeave={(e) => console.log("onMouseLeave on FileTypeIcon!")} + onMouseOver={(e) => console.log("onMouseOver on FileTypeIcon!")} + onMouseUp={(e) => console.log("onMouseUp on FileTypeIcon!")} + /> +
Icon size tester: @@ -1785,6 +1810,13 @@ export default class ControlsTest extends React.Component
+
+

Carousel with minimal configuration:

+ +