diff --git a/.README b/.README index 391d5f6ba..5d19283d5 100644 --- a/.README +++ b/.README @@ -18,4 +18,4 @@ [[load:readme/5-Vedlikehold.md]] -[[load:readme/6-Utvikling.md]] +[[load:readme/6-Utvikling.md]] \ No newline at end of file diff --git a/.development-guide/.README b/.development-guide/.README index d05697748..cca38d7b8 100644 --- a/.development-guide/.README +++ b/.development-guide/.README @@ -6,231 +6,24 @@ [[ template:toc ]] -## Site Design / Site Scripts +[[load:.development-guide/Site_Design_Site_Scripts.md]] -Everything related to the site design and the corresponding site scripts reside in the folder **SiteScripts**. +[[load:.development-guide/JS_Provisioning_Template.md]] -The source files are found in the **src** folder. +[[load:.development-guide/Templates.md]] -## JS Provisioning Template +[[load:.development-guide/NPM.md]] -Not everything we want to do is available with site designs, so we're also using [sp-js-provisioning](https://github.com/Puzzlepart/sp-js-provisioning). Please note that we're using the Puzzlepart fork from **pnp**. +[[load:.development-guide/Building_a_new_release.md]] -With our PnP content templates (see **3.2.2**) we're provisioning a default template. The default templates for our supported languages are built from the source file [_JsonTemplate.json](../Templates/_JsonTemplate.json). +[[load:.development-guide/Building_only_PnP_templates.md]] -Please note the **Parameters** object. +[[load:.development-guide/Continuous_integration.md]] -```json -{ - "Parameters": { - "ProvisionSiteFields": "Kolonner for Prosjektportalen (Prosjekt)", - "ProjectContentTypeId": "0x0100805E9E4FEAAB4F0EABAB2600D30DB70C", - "ProjectStatusContentTypeId": "0x010022252E35737A413FB56A1BA53862F6D5" - } -} -``` +[[load:.development-guide/Creating_a_new_release.md]] -| Parameter | Description | -| -------------------------- | ------------------------------------------------------------------------------------- | -| ProvisionSiteFields | The site fields in this group will be copied to the project site during provisioning. | -| ProjectContentTypeId | Content type ID for the Project properties content type | -| ProjectStatusContentTypeId | Content type ID for the Project status content type | +[[load:.development-guide/Versioning.md]] -In addition to the parameters specified in [Standardmal.txt](../Templates/Portfolio/Prosjektmaler/Standardmal.txt), there's also the following parameters: +[[load:.development-guide/Installation_channels.md]] -| Parameter | Description | -| ---------- | ------------------------------------------------------------------------------------- | -| TermSetIds | An map of term set fields and term set id. Used to override the default term set ids. | - -Say you'd like to use the term set with ID **54da9f47-c64e-4a26-80f3-4d3c3fa1b7b2** for project phase. The internal field name for project phase is **GtProjectPhase**. With the default template, the **Parameters** object would look like this: - -```json -{ - "Parameters": { - "ProvisionSiteFields": "Kolonner for Prosjektportalen (Prosjekt)", - "ProjectContentTypeId": "0x0100805E9E4FEAAB4F0EABAB2600D30DB70C", - "ProjectStatusContentTypeId": "0x010022252E35737A413FB56A1BA53862F6D5", - "TermSetIds": { - "GtProjectPhase": "54da9f47-c64e-4a26-80f3-4d3c3fa1b7b2" - } - } -} -``` - -## Templates - -### JSON provisioning template - -At the root level of the **Templates** folder, the following files are found: - -| File/Folder | Description | -| ------------------------------- | --------------------------------------------------------------------------------------------- | -| `Clean-Resx.ps1` | Script to remove unused **.resx** resources | -| `Find-FieldUsage.ps1` | Script to find field usage | -| `Get-ComponentProperties.ps1` | Script to get component properties from `` instances | -| `Encode-JSON.ps1` | Script to take the content of a JSON file, encode and minfiy at, and store it in a `.txt`file | -| `Search-Resx.ps1` | Script to search for unused **.resx** resources | -| `tasks/generateResxJson.js` | Node script to generate a JSON representation of the **.resx** files | -| `tasks/generateJsonTemplate.js` | Node script to generate JSON templates for each language | -| `_JsonTemplate.json` | JSON project template | - -#### Building JSON templates - -When doing changes to the JSON template the npm task `watch` can be used. This watches `_JsonTemplate.json` and builds localized version of this to the corresponding Content template. - -Resources from the **.resx** files in the folder Portfolio can be used in the template using `{{tokens}}`. - -**Example:** - -```json -{ - "ID": "0x0100A87AE71CBF2643A6BC9D0948BD2EE897", - "Name": "{{ContentTypes_Uncertainty_Name}}", - "Description": "", - "Group": "{{ContentTypes_Group}}" -} -``` - -### PnP templates - -In addition we have two PnP provisioning templates. - -| Template | Description | -| ----------------------------------- | ---------------- | -| [Portfolio](../Templates/Portfolio) | Portfolio assets | -| [Taxonomy](../Templates/Taxonomy) | Taxonomy | - -#### Portfolio - -| File/Folder | Description | -| ------------------ | -------------------------------------------------------------- | -| Objects | PnP assets. See https://github.com/pnp/PnP-Provisioning-Schema | -| SiteAssets | Files to be uploaded to SiteAssets | -| Portfolio.xml | Main template file | -| `Resources.*.resx` | Resource files | - -#### Content templates - -Content templates are found in the **Content** folder. The name of the template follows the following pattern: - -`Portfolio_content.{language_code}.xml` -`Portfolio_content_BA.{language_code}.xml` - -`language_code` can be for example **no-NB** or **en-US**. - -The templates contains the JSON template(s), planner tasks and phase checklist items. - -## NPM - -The SharePoint Framework solutions are published to `npm` independently. - -- [@Shared](https://www.npmjs.com/package/pp365-shared) -- [ProjectWebParts](https://www.npmjs.com/package/pp365-projectwebparts) -- [ProjectExtensions](https://www.npmjs.com/package/pp365-projectextensions) -- [PortfolioWebParts](https://www.npmjs.com/package/pp365-portfoliowebparts) -- [ProgramWebParts](https://www.npmjs.com/package/pp365-programwebparts) -- [PortfolioExtensions](https://www.npmjs.com/package/pp365-portfolioextensions) - -## Building a new release - -To build a new release make sure your on the `main` branch and in sync with **origin**. - -Run the PowerShell script `Build-Release.ps1` located in the `Install` directory: - -```powershell -./Install/Build-Release.ps1 -``` - -The installation package should be found in the release folder. - -## Building only PnP templates - -To only build PnP templates make sure your on the `main` branch and in sync with **origin**. - -Run the PowerShell script `Build-Release.ps1` located in the `Install` directory: - -```powershell -./Install/Build-Release.ps1 -SkipBuildSharePointFramework -``` - -The PnP templates should be found in the release folder. - -## Continuous integration - -We have set up continuous integration using GitHub actions. - -[![CI (dev)](https://github.com/Puzzlepart/prosjektportalen365/actions/workflows/ci-dev.yml/badge.svg?branch=dev)](https://github.com/Puzzlepart/prosjektportalen365/actions/workflows/ci-dev.yml) - -Keywords can be used in the commit message to avoid (or force) the CI running some of the jobs. - -- `[skip-ci]` to avoid the _Build release package_ job starting. This will result in no jobs starting as the _Upgrade_ and _Install_ jobs are dependent on the job _Build release package_ -- `[skip-upgrade]` to avoid the _Uprade_ job starting. This will also skip the _Install_ job as it's dependent on _Upgrade_ -- `[skip-install]` to avoid the _Install_ job starting. -- `[upgrade-all-sites-to-latest]` to run script `UpgradeAllSitesToLatest.ps1` in CI mode - -### Build and install (dev) - -[ci-releases](../.github/workflows/ci-releases.yml) builds a new release on _push_ to **releases/***. - -It runs [Build-Release.ps1](../Install/Build-Release.ps1) with `-CI` param, then runs [Install.ps1](../Install/Install.ps1) (also with `-CI` param, this time with a encoded string consisting of the username and password, stored in a GitHub secret). The URL to install to is stored in the GitHub secret `CI_DEV_TARGET_URL`. - -With the current approach, with no cache (as it runs `npm ci`), a full run takes about 25-35 minutes. - -![image-20201121133532960](assets/image-20201121133532960.png) - -### Build release (main) - -[build-release](../.github/workflows/build-release.yml) builds a new release package on **push** to **main**. - -## Creating a new release - -For creating a new release, we have two options: Minor and patch. New minor version should be created when there is new functionality of interest to users, while patch versions can be created often with bug fixes, adjustments and minimal functional improvements. - -Increasing the version number is done by npm scripts. This is done on the dev-branch when the functionality currently in dev is deemed ready for release. - - -### Patch-release -```powershell -npm version patch -git push --tags -``` - -### Minor-release -```powershell -npm version minor -git push --tags -``` - -Then create a Pull Request to merge `dev` into `main`. The output from GitHub Actions will include a release package that can be shared as a release on GitHub. No manual build required. - -## Versioning - -After updating the version using `npm version patch` or `npm version minor` the task `tasks/automatic-versioning.js` are run. This synchronizes versions across the solution. - -This `automatic-versioning.js` task can also be run as a **npm script** outside the `postversion` event. - -```powershell -npm run sync-version -``` - -After the `sync-version` script has been run, it is important to publish the SharePointFramework packages (@Shared, PortfolioWebParts, etc...) to npm. - -This is done for each package by running the following script: - -```powershell -npm install; npm run build; npm publish; -``` - -If you have to update and use a package under development add a temp tag: - -```powershell -npm install; npm run build; npm publish --tag temp; -``` - -N.B.: To be able to publish you must sign in with an account that has access to the packages at [npmjs](https://www.npmjs.com) - -## README generation - -READMEs are automatically generated using [@appnest/readme](https://github.com/andreasbm/readme). The main README is generated from [.README](../.README) while this README is generated from [.README](.README). The generation is configured with the `blueprint.json` files. - -For the main [README.md)[../README.md] generation, the different parts are included from the [readme](../readme) folder at root level. +[[load:.development-guide/README_generation.md]] diff --git a/.development-guide/Building_a_new_release.md b/.development-guide/Building_a_new_release.md new file mode 100644 index 000000000..0cfb6f750 --- /dev/null +++ b/.development-guide/Building_a_new_release.md @@ -0,0 +1,11 @@ +## Building a new release + +To build a new release make sure your on the `main` branch and in sync with **origin**. + +Run the PowerShell script `Build-Release.ps1` located in the `Install` directory: + +```powershell +./Install/Build-Release.ps1 +``` + +The installation package should be found in the release folder. diff --git a/.development-guide/Building_only_PnP_templates.md b/.development-guide/Building_only_PnP_templates.md new file mode 100644 index 000000000..38ee3d19f --- /dev/null +++ b/.development-guide/Building_only_PnP_templates.md @@ -0,0 +1,11 @@ +## Building only PnP templates + +To only build PnP templates make sure your on the `main` branch and in sync with **origin**. + +Run the PowerShell script `Build-Release.ps1` located in the `Install` directory: + +```powershell +./Install/Build-Release.ps1 -SkipBuildSharePointFramework +``` + +The PnP templates should be found in the release folder. diff --git a/.development-guide/Continuous_integration.md b/.development-guide/Continuous_integration.md new file mode 100644 index 000000000..f2ecd4534 --- /dev/null +++ b/.development-guide/Continuous_integration.md @@ -0,0 +1,32 @@ +## Continuous integration + +We have set up continuous integration using GitHub actions. + +### CI (releases/*) +[![CI (releases)](https://github.com/Puzzlepart/prosjektportalen365/actions/workflows/ci-releases.yml/badge.svg?branch=releases/1.9)](https://github.com/Puzzlepart/prosjektportalen365/actions/workflows/ci-releases.yml) + +Keywords can be used in the commit message to avoid (or force) the CI running some of the jobs. + +- `[skip-ci]` to avoid the _Build release package_ job starting. This will result in no jobs starting as the _Upgrade_ and _Install_ jobs are dependent on the job _Build release package_ +- `[skip-upgrade]` to avoid the _Uprade_ job starting. This will also skip the _Install_ job as it's dependent on _Upgrade_ +- `[skip-install]` to avoid the _Install_ job starting. +- `[upgrade-all-sites-to-latest]` to run script `UpgradeAllSitesToLatest.ps1` in CI mode + +### Build and install (dev) + +[ci-releases](../.github/workflows/ci-releases.yml) builds a new release on _push_ to **releases/***. + +It runs [Build-Release.ps1](../Install/Build-Release.ps1) with `-CI` param, then runs [Install.ps1](../Install/Install.ps1) (also with `-CI` param, this time with a encoded string consisting of the username and password, stored in a GitHub secret). The URL to install to is stored in the GitHub secret `CI_DEV_TARGET_URL`. + +With the current approach, with no cache (as it runs `npm ci`), a full run takes about 25-35 minutes. + +![image-20201121133532960](assets/image-20201121133532960.png) + +### CI (channels/test) +Keyword `[channels/test]` needs to be used in the commit message for this CI to run. + +It will build a package for channel [test](../channels/test.json) and deploy it to the URL specified in `SP_URL_TEST`. + +### Build release (main) + +[build-release](../.github/workflows/build-release.yml) builds a new release package on **push** to **main**. diff --git a/.development-guide/Creating_a_new_release.md b/.development-guide/Creating_a_new_release.md new file mode 100644 index 000000000..94e0fb8ba --- /dev/null +++ b/.development-guide/Creating_a_new_release.md @@ -0,0 +1,20 @@ +## Creating a new release + +For creating a new release, we have two options: Minor and patch. New minor version should be created when there is new functionality of interest to users, while patch versions can be created often with bug fixes, adjustments and minimal functional improvements. + +Increasing the version number is done by npm scripts. This is done on the dev-branch when the functionality currently in dev is deemed ready for release. + + +### Patch-release +```powershell +npm version patch +git push --tags +``` + +### Minor-release +```powershell +npm version minor +git push --tags +``` + +Then create a Pull Request to merge `dev` into `main`. The output from GitHub Actions will include a release package that can be shared as a release on GitHub. No manual build required. diff --git a/.development-guide/Installation_channels.md b/.development-guide/Installation_channels.md new file mode 100644 index 000000000..65adda376 --- /dev/null +++ b/.development-guide/Installation_channels.md @@ -0,0 +1,26 @@ +## Installation channels + +To support installing several instances of _Prosjektportalen 365_ in a tenant, we support **installation channels**. + +### Generating a new channel configuration +To generate a new channel configuration, use the `npm` script `generate-channel-config`. + +To generate a new channel configuration for `test`: + +```javascript +npm run-script generate-channel-config test +``` + +To update an existing channel configuration, add the flag `/update`: + +```javascript +npm run-script generate-channel-config test /update +``` + +### Building a new release for a channel +To build a new release for a channel, add the `-Channel` flag when running the release-script. + +**Example (buiding for test channel):** +```powershell +Install/Build-Release.ps1 -Channel test +``` \ No newline at end of file diff --git a/.development-guide/JS_Provisioning_Template.md b/.development-guide/JS_Provisioning_Template.md new file mode 100644 index 000000000..3b81c8652 --- /dev/null +++ b/.development-guide/JS_Provisioning_Template.md @@ -0,0 +1,44 @@ +## JS Provisioning Template + +Not everything we want to do is available with site designs, so we're also using [sp-js-provisioning](https://github.com/Puzzlepart/sp-js-provisioning). Please note that we're using the Puzzlepart fork from **pnp**. + +With our PnP content templates (see **3.2.2**) we're provisioning a default template. The default templates for our supported languages are built from the source file [_JsonTemplate.json](../Templates/_JsonTemplate.json). + +Please note the **Parameters** object. + +```json +{ + "Parameters": { + "ProvisionSiteFields": "Kolonner for Prosjektportalen (Prosjekt)", + "ProjectContentTypeId": "0x0100805E9E4FEAAB4F0EABAB2600D30DB70C", + "ProjectStatusContentTypeId": "0x010022252E35737A413FB56A1BA53862F6D5" + } +} +``` + +| Parameter | Description | +| -------------------------- | ------------------------------------------------------------------------------------- | +| ProvisionSiteFields | The site fields in this group will be copied to the project site during provisioning. | +| ProjectContentTypeId | Content type ID for the Project properties content type | +| ProjectStatusContentTypeId | Content type ID for the Project status content type | + +In addition to the parameters specified in [Standardmal.txt](../Templates/Portfolio/Prosjektmaler/Standardmal.txt), there's also the following parameters: + +| Parameter | Description | +| ---------- | ------------------------------------------------------------------------------------- | +| TermSetIds | An map of term set fields and term set id. Used to override the default term set ids. | + +Say you'd like to use the term set with ID **54da9f47-c64e-4a26-80f3-4d3c3fa1b7b2** for project phase. The internal field name for project phase is **GtProjectPhase**. With the default template, the **Parameters** object would look like this: + +```json +{ + "Parameters": { + "ProvisionSiteFields": "Kolonner for Prosjektportalen (Prosjekt)", + "ProjectContentTypeId": "0x0100805E9E4FEAAB4F0EABAB2600D30DB70C", + "ProjectStatusContentTypeId": "0x010022252E35737A413FB56A1BA53862F6D5", + "TermSetIds": { + "GtProjectPhase": "54da9f47-c64e-4a26-80f3-4d3c3fa1b7b2" + } + } +} +``` diff --git a/.development-guide/NPM.md b/.development-guide/NPM.md new file mode 100644 index 000000000..4fb16dc6b --- /dev/null +++ b/.development-guide/NPM.md @@ -0,0 +1,10 @@ +## NPM + +The SharePoint Framework solutions are published to `npm` independently. + +- [@Shared](https://www.npmjs.com/package/pp365-shared) +- [ProjectWebParts](https://www.npmjs.com/package/pp365-projectwebparts) +- [ProjectExtensions](https://www.npmjs.com/package/pp365-projectextensions) +- [PortfolioWebParts](https://www.npmjs.com/package/pp365-portfoliowebparts) +- [ProgramWebParts](https://www.npmjs.com/package/pp365-programwebparts) +- [PortfolioExtensions](https://www.npmjs.com/package/pp365-portfolioextensions) diff --git a/.development-guide/README.md b/.development-guide/README.md index 3b0c478a4..24333f75e 100644 --- a/.development-guide/README.md +++ b/.development-guide/README.md @@ -28,12 +28,17 @@ * [➤ Building a new release](#-building-a-new-release) * [➤ Building only PnP templates](#-building-only-pnp-templates) * [➤ Continuous integration](#-continuous-integration) + * [CI (releases/*)](#ci-releases) * [Build and install (dev)](#build-and-install-dev) + * [CI (channels/test)](#ci-channelstest) * [Build release (main)](#build-release-main) * [➤ Creating a new release](#-creating-a-new-release) * [Patch-release](#patch-release) * [Minor-release](#minor-release) * [➤ Versioning](#-versioning) +* [➤ Installation channels](#-installation-channels) + * [Generating a new channel configuration](#generating-a-new-channel-configuration) + * [Building a new release for a channel](#building-a-new-release-for-a-channel) * [➤ README generation](#-readme-generation) @@ -94,6 +99,8 @@ Say you'd like to use the term set with ID **54da9f47-c64e-4a26-80f3-4d3c3fa1b7b } ``` + + [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#templates) @@ -160,6 +167,7 @@ Content templates are found in the **Content** folder. The name of the template The templates contains the JSON template(s), planner tasks and phase checklist items. + [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#npm) @@ -174,6 +182,7 @@ The SharePoint Framework solutions are published to `npm` independently. - [ProgramWebParts](https://www.npmjs.com/package/pp365-programwebparts) - [PortfolioExtensions](https://www.npmjs.com/package/pp365-portfolioextensions) + [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#building-a-new-release) @@ -189,6 +198,7 @@ Run the PowerShell script `Build-Release.ps1` located in the `Install` directory The installation package should be found in the release folder. + [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#building-only-pnp-templates) @@ -204,6 +214,7 @@ Run the PowerShell script `Build-Release.ps1` located in the `Install` directory The PnP templates should be found in the release folder. + [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#continuous-integration) @@ -211,7 +222,8 @@ The PnP templates should be found in the release folder. We have set up continuous integration using GitHub actions. -[![CI (dev)](https://github.com/Puzzlepart/prosjektportalen365/actions/workflows/ci-dev.yml/badge.svg?branch=dev)](https://github.com/Puzzlepart/prosjektportalen365/actions/workflows/ci-dev.yml) +### CI (releases/*) +[![CI (releases)](https://github.com/Puzzlepart/prosjektportalen365/actions/workflows/ci-releases.yml/badge.svg?branch=releases/1.9)](https://github.com/Puzzlepart/prosjektportalen365/actions/workflows/ci-releases.yml) Keywords can be used in the commit message to avoid (or force) the CI running some of the jobs. @@ -230,10 +242,16 @@ With the current approach, with no cache (as it runs `npm ci`), a full run takes ![image-20201121133532960](assets/image-20201121133532960.png) +### CI (channels/test) +Keyword `[channels/test]` needs to be used in the commit message for this CI to run. + +It will build a package for channel [test](../channels/test.json) and deploy it to the URL specified in `SP_URL_TEST`. + ### Build release (main) [build-release](../.github/workflows/build-release.yml) builds a new release package on **push** to **main**. + [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#creating-a-new-release) @@ -258,6 +276,7 @@ git push --tags Then create a Pull Request to merge `dev` into `main`. The output from GitHub Actions will include a release package that can be shared as a release on GitHub. No manual build required. + [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#versioning) @@ -287,6 +306,37 @@ npm install; npm run build; npm publish --tag temp; N.B.: To be able to publish you must sign in with an account that has access to the packages at [npmjs](https://www.npmjs.com) + + +[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#installation-channels) + +## ➤ Installation channels + +To support installing several instances of _Prosjektportalen 365_ in a tenant, we support **installation channels**. + +### Generating a new channel configuration +To generate a new channel configuration, use the `npm` script `generate-channel-config`. + +To generate a new channel configuration for `test`: + +```javascript +npm run-script generate-channel-config test +``` + +To update an existing channel configuration, add the flag `/update`: + +```javascript +npm run-script generate-channel-config test /update +``` + +### Building a new release for a channel +To build a new release for a channel, add the `-Channel` flag when running the release-script. + +**Example (buiding for test channel):** +```powershell +Install/Build-Release.ps1 -Channel test +``` + [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/cut.png)](#readme-generation) diff --git a/.development-guide/README_generation.md b/.development-guide/README_generation.md new file mode 100644 index 000000000..22c7301ac --- /dev/null +++ b/.development-guide/README_generation.md @@ -0,0 +1,5 @@ +## README generation + +READMEs are automatically generated using [@appnest/readme](https://github.com/andreasbm/readme). The main README is generated from [.README](../.README) while this README is generated from [.README](.README). The generation is configured with the `blueprint.json` files. + +For the main [README.md)[../README.md] generation, the different parts are included from the [readme](../readme) folder at root level. \ No newline at end of file diff --git a/.development-guide/Site_Design_Site_Scripts.md b/.development-guide/Site_Design_Site_Scripts.md new file mode 100644 index 000000000..3ee97800f --- /dev/null +++ b/.development-guide/Site_Design_Site_Scripts.md @@ -0,0 +1,5 @@ +## Site Design / Site Scripts + +Everything related to the site design and the corresponding site scripts reside in the folder **SiteScripts**. + +The source files are found in the **src** folder. \ No newline at end of file diff --git a/.development-guide/Templates.md b/.development-guide/Templates.md new file mode 100644 index 000000000..b561e6fd5 --- /dev/null +++ b/.development-guide/Templates.md @@ -0,0 +1,63 @@ + +## Templates + +### JSON provisioning template + +At the root level of the **Templates** folder, the following files are found: + +| File/Folder | Description | +| ------------------------------- | --------------------------------------------------------------------------------------------- | +| `Clean-Resx.ps1` | Script to remove unused **.resx** resources | +| `Find-FieldUsage.ps1` | Script to find field usage | +| `Get-ComponentProperties.ps1` | Script to get component properties from `` instances | +| `Encode-JSON.ps1` | Script to take the content of a JSON file, encode and minfiy at, and store it in a `.txt`file | +| `Search-Resx.ps1` | Script to search for unused **.resx** resources | +| `tasks/generateResxJson.js` | Node script to generate a JSON representation of the **.resx** files | +| `tasks/generateJsonTemplate.js` | Node script to generate JSON templates for each language | +| `_JsonTemplate.json` | JSON project template | + +#### Building JSON templates + +When doing changes to the JSON template the npm task `watch` can be used. This watches `_JsonTemplate.json` and builds localized version of this to the corresponding Content template. + +Resources from the **.resx** files in the folder Portfolio can be used in the template using `{{tokens}}`. + +**Example:** + +```json +{ + "ID": "0x0100A87AE71CBF2643A6BC9D0948BD2EE897", + "Name": "{{ContentTypes_Uncertainty_Name}}", + "Description": "", + "Group": "{{ContentTypes_Group}}" +} +``` + +### PnP templates + +In addition we have two PnP provisioning templates. + +| Template | Description | +| ----------------------------------- | ---------------- | +| [Portfolio](../Templates/Portfolio) | Portfolio assets | +| [Taxonomy](../Templates/Taxonomy) | Taxonomy | + +#### Portfolio + +| File/Folder | Description | +| ------------------ | -------------------------------------------------------------- | +| Objects | PnP assets. See https://github.com/pnp/PnP-Provisioning-Schema | +| SiteAssets | Files to be uploaded to SiteAssets | +| Portfolio.xml | Main template file | +| `Resources.*.resx` | Resource files | + +#### Content templates + +Content templates are found in the **Content** folder. The name of the template follows the following pattern: + +`Portfolio_content.{language_code}.xml` +`Portfolio_content_BA.{language_code}.xml` + +`language_code` can be for example **no-NB** or **en-US**. + +The templates contains the JSON template(s), planner tasks and phase checklist items. diff --git a/.development-guide/Versioning.md b/.development-guide/Versioning.md new file mode 100644 index 000000000..45adf109f --- /dev/null +++ b/.development-guide/Versioning.md @@ -0,0 +1,25 @@ +## Versioning + +After updating the version using `npm version patch` or `npm version minor` the task `tasks/automatic-versioning.js` are run. This synchronizes versions across the solution. + +This `automatic-versioning.js` task can also be run as a **npm script** outside the `postversion` event. + +```powershell +npm run sync-version +``` + +After the `sync-version` script has been run, it is important to publish the SharePointFramework packages (@Shared, PortfolioWebParts, etc...) to npm. + +This is done for each package by running the following script: + +```powershell +npm install; npm run build; npm publish; +``` + +If you have to update and use a package under development add a temp tag: + +```powershell +npm install; npm run build; npm publish --tag temp; +``` + +N.B.: To be able to publish you must sign in with an account that has access to the packages at [npmjs](https://www.npmjs.com) diff --git a/.github/workflows/ci-channel-test.yml b/.github/workflows/ci-channel-test.yml new file mode 100644 index 000000000..c966104fe --- /dev/null +++ b/.github/workflows/ci-channel-test.yml @@ -0,0 +1,54 @@ +name: CI (channels/test) + +on: + push: + branches: + - releases/1.9 + - feat/channel-support + paths: + - "SharePointFramework/**" + - "Install/**" + - "Templates/**" + - .github/workflows/ci-channel-test.yml + +env: + SP_URL_TEST: "https://puzzlepart.sharepoint.com/sites/pp365_channels_test" + CI_CREDENTIALS: ${{ secrets.CI_DEV_CREDENTIALS }} + +jobs: + build_release_package_test: + name: Build release package for test channel + runs-on: macos-latest + if: "contains(github.event.head_commit.message, '[channels/test]')" + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + + - name: Setup Node.js 16.18.0 + uses: actions/setup-node@v3 + with: + node-version: 16.18.0 + + - name: Run Install/Build-Release.ps1 in CI mode for channel test + run: Install/Build-Release.ps1 -CI -SkipBundle -Channel test + shell: pwsh + + - uses: actions/upload-artifact@v3 + with: + name: release-package-test + path: release + + install_test: + needs: [build_release_package_test] + name: Install (test) + runs-on: macos-latest + steps: + - uses: actions/download-artifact@v3 + with: + name: release-package-test + path: release + + - name: Install + run: release/Install.ps1 -Url "${{ env.SP_URL_TEST }}" -Title "Prosjektportalen 365 (test)" -CI ${{ env.CI_CREDENTIALS }} -SkipTaxonomy -SkipSearchConfiguration + shell: powershell \ No newline at end of file diff --git a/.github/workflows/ci-releases.yml b/.github/workflows/ci-releases.yml index d12c0a405..693701c86 100644 --- a/.github/workflows/ci-releases.yml +++ b/.github/workflows/ci-releases.yml @@ -3,7 +3,7 @@ name: CI (releases/*) on: push: branches: - - releases/* + - releases/1.8 paths: - "SharePointFramework/**" - "Install/**" diff --git a/.gitignore b/.gitignore index 860cceba0..787fbf6d6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,6 @@ Install/InstallLog.txt Install/Scripts/UpgradeSites_Log* release/* SharePointFramework/**/.vscode/launch.json -SharePointFramework/**/pnpm-lock.yaml -SharePointFramework/**/shrinkwrap.yaml SharePointFramework/**/config/serve.json SharePointFramework/**/config/__config__temp.json SharePointFramework/**/.env @@ -14,3 +12,10 @@ Templates/*.txt Templates/Resources.json .DS_Store node_modules +SharePointFramework/**/src/**/manifest.json.bak +SharePointFramework/**/config/package-solution.json.bak +SharePointFramework/**/config/.generated-solution-config.json +.current-channel-config.json +.channel-replace-map.json +.dist +Templates/*.ps1 \ No newline at end of file diff --git a/.tasks/automatic-versioning.js b/.tasks/automatic-versioning.js index 8442f649e..103b9cd2e 100644 --- a/.tasks/automatic-versioning.js +++ b/.tasks/automatic-versioning.js @@ -1,12 +1,11 @@ /** - * Automatically updates version for SPFx packages. + * @fileoverview Automatically updates version for SPFx packages. * * Updates the following files: * * package.json * * package-solution.js * * manifest.json */ - if (process.env.npm_package_version === undefined) { throw 'Package version cannot be evaluated' } @@ -27,7 +26,7 @@ const version = pkgVersion.indexOf('-') === -1 * @returns file content as JSON */ function getFileContent(file) { - const fileContent = fs.readFileSync(path.resolve(__dirname, "..", file), 'UTF-8') + const fileContent = fs.readFileSync(path.resolve(__dirname, '..', file), 'UTF-8') const fileContentJson = JSON.parse(fileContent) return fileContentJson } @@ -39,7 +38,7 @@ function getFileContent(file) { * @param {*} json - JSON */ function setFileContent(file, json) { - fs.writeFileSync(path.resolve(__dirname, "..", file), JSON.stringify(json, null, 2), 'UTF-8') + fs.writeFileSync(path.resolve(__dirname, '..', file), JSON.stringify(json, null, 2), 'UTF-8') } /** diff --git a/.tasks/generate-channel-config.js b/.tasks/generate-channel-config.js new file mode 100644 index 000000000..cb8cd5139 --- /dev/null +++ b/.tasks/generate-channel-config.js @@ -0,0 +1,118 @@ +/** + * @fileoverview Generates channel config for the current channel + */ +const globMod = require('glob') +const util = require('util') +const glob = util.promisify(globMod) +const path = require('path') +const fs = require('fs') +const { v4: uuidv4 } = require('uuid'); +const argv = require('yargs').argv + +// Default channel name +const default_channel_name = 'main' + +// Get the channel name from the command line +const name = argv._[0] ?? default_channel_name + +// Check if the update flag is set +const update = argv._[1] === '/update' ?? false + +/** + * Get file content for the given file path in JSON format + * + * @param {*} file File path + * @param {*} fallback Fallback value to return if the file does not exis or the file content is not valid JSON (default: `{}`) + * + * @returns File contents as JSON or the fallback value which defaults to an empty object + */ +function getFileContent(file, fallback = {}) { + try { + const fileContent = fs.readFileSync(path.resolve(__dirname, '..', file), 'UTF-8') + const fileContentJson = JSON.parse(fileContent) + return fileContentJson + } catch { + return fallback + } +} + +/** + * Save the channel config to a file in the /channels folder + * + * @param {*} channel_config Channel config object + * @param {*} filePath Path to the file to save the file to + */ +function saveToFile(channel_config, filePath) { + fs.writeFileSync(path.resolve(__dirname, '..', filePath), JSON.stringify(channel_config, null, 2), { encoding: 'utf8', overwrite: true }) +} + +// Current channel config object +let current_channel_config = {} + +// Channel config object +let channel_config = { + '$schema': './$schema.json', + name, + spfx: { + solutions: {} + } +} +let replace_map_config = { + +} + +/** + * Main entry point for the task. If the --replaceMap flag is set, the task will only generate the replace map config file, + * and will not generate the channel config file. This is useful when you want to update the replace map config file only. + */ +const _ = async () => { + if (update) current_channel_config = getFileContent(`./channels/${name}.json`) + await addSpfxComponents() + saveToFile(replace_map_config, '.channel-replace-map.json') + console.log('Replace map config file generated at .channel-replace-map.json') + if (!argv.replaceMap) { + saveToFile(channel_config, `./channels/${channel_config.name}.json`) + console.log(`Channel config file generated for channel '${channel_config.name}'`) + } +} + +_() + +/** + * Add SPFx components to the channel config object and replace map config object. + */ +async function addSpfxComponents() { + const isDefaultChannel = channel_config.name === default_channel_name + let packageSolutionFiles = await glob('SharePointFramework/*/config/package-solution.json') + for (let i = 0; i < packageSolutionFiles.length; i++) { + let pkgSolutionContent = getFileContent(packageSolutionFiles[i]) + const [, solution] = packageSolutionFiles[i].split('/') + const currentSolution = current_channel_config?.spfx?.solutions[solution] + const solution_id = isDefaultChannel ? pkgSolutionContent.solution.id : (currentSolution?.id ?? uuidv4()) + const solution_name = isDefaultChannel ? pkgSolutionContent.solution.name : `${pkgSolutionContent.solution.name} - ${channel_config.name}` + const solution_zipped_package = isDefaultChannel ? pkgSolutionContent.paths.zippedPackage : `${pkgSolutionContent.paths.zippedPackage.replace('.sppkg', '')}-${channel_config.name}.sppkg` + channel_config.spfx.solutions[solution] = channel_config.spfx.solutions[solution] || {} + channel_config.spfx.solutions[solution].id = solution_id + channel_config.spfx.solutions[solution].name = solution_name + channel_config.spfx.solutions[solution].zippedPackage = solution_zipped_package + channel_config.spfx.solutions[solution].components = {} + } + + let manifestFiles = await glob('SharePointFramework/*/src/**/manifest.json') + for (let i = 0; i < manifestFiles.length; i++) { + let manifestContent = getFileContent(manifestFiles[i]) + + // Get the solution name from the manifest file path + const [, solution] = manifestFiles[i].split('/') + + // Get the current component ID for the channel config if the update flag is set + const currentComponentId = current_channel_config?.spfx?.solutions[solution]?.components[manifestContent.alias] + + // If the channel is the default channel, use the component ID from the manifest, otherwise generate a new one + // using the UUID v4 generator if the update flag is not set. This is to ensure that the component ID is the same + // for the default channel. + const component_id = isDefaultChannel ? manifestContent.id : (currentComponentId ?? uuidv4()) + channel_config.spfx.solutions[solution].components[manifestContent.alias] = component_id + replace_map_config[component_id] = `ControlId_${manifestContent.alias}` + } +} diff --git a/.tasks/generate-pnp-templates.js b/.tasks/generate-pnp-templates.js new file mode 100644 index 000000000..c9008099a --- /dev/null +++ b/.tasks/generate-pnp-templates.js @@ -0,0 +1,71 @@ +/** + * @fileoverview Generate PnP template for Portfolio + * @author Puzzlepart + */ +const path = require('path') +const fs = require('fs') +const fse = require('fs-extra') +const replace = require('replace') + +/** + * Create the .dist folder if it does not exist + */ +if (!fs.existsSync('.dist')){ + fs.mkdirSync('.dist'); +} + +var templatesPath = path.resolve(__dirname, '..', 'Templates') +var portfolioTemplateFolder = `${templatesPath}/Portfolio` +var channelPortfolioTemplateFolder = '.dist/Templates/Portfolio' + +/** + * Get file content for the given file path in JSON format + * + * @param {*} file File path + * @returns File contents as JSON + */ +function getFileContent(file) { + const fileContent = fs.readFileSync(path.resolve(__dirname, '..', file), 'UTF-8') + const fileContentJson = JSON.parse(fileContent) + return fileContentJson +} + +// Get the current channel config +var currentChannelConfig = getFileContent('.current-channel-config.json') + +// Get the channel replace map +var channelReplaceMap = getFileContent('.channel-replace-map.json') + +// Build the channel replace values +var channelReplaceValue = Object.keys(currentChannelConfig.spfx.solutions).reduce((acc, key) => { + const solution = currentChannelConfig.spfx.solutions[key] + return Object.keys(solution.components).reduce((acc, componentKey) => { + acc[`ControlId_${componentKey}`] = solution.components[componentKey] + return acc + }, acc) +}, {}) + +// Copy the portfolio template folder to a temporary folder Portfolio_ +fse.copySync(portfolioTemplateFolder, channelPortfolioTemplateFolder) + +/** + * Replace tokens in the given template path. The tokens are defined in the `.channel-replace-map.json` file + * and the replacement values are generated from the current channel config file (`.current-channel-config.json`). + * + * @param {*} templatePath Template path + */ +function replaceTokensInTemplate(templatePath) { + for (var key in channelReplaceMap) { + var token = channelReplaceMap[key] + var replacement = channelReplaceValue[token] + replace({ + regex: key, + replacement, + paths: [templatePath], + recursive: true, + silent: true, + }); + } +} + +replaceTokensInTemplate(channelPortfolioTemplateFolder) \ No newline at end of file diff --git a/.tasks/generate-site-scripts.js b/.tasks/generate-site-scripts.js new file mode 100644 index 000000000..b898d50c1 --- /dev/null +++ b/.tasks/generate-site-scripts.js @@ -0,0 +1,77 @@ +/** + * @fileoverview Generates Site Scripts for the current channel + * @author Puzzlepart + */ +const path = require('path') +const fs = require('fs') +const fse = require('fs-extra') +const replace = require('replace') +const argv = require('yargs').argv + +// Run replace in silent mode if the --silent flag is set +const silent = argv.silent || false + +/** + * Create the .dist folder if it does not exist + */ +if (!fs.existsSync('.dist')){ + fs.mkdirSync('.dist'); +} + +// Site scripts source folder path +var siteScriptsPath = path.resolve(__dirname, '..', 'SiteScripts/src') + +// Destination folder for the site scripts +var channelSiteScriptsFolder = '.dist/SiteScripts' + +/** + * Get file content for the given file path in JSON format + * + * @param {*} file File path + * @returns File contents as JSON + */ +function getFileContent(file) { + const fileContent = fs.readFileSync(path.resolve(__dirname, '..', file), 'UTF-8') + const fileContentJson = JSON.parse(fileContent) + return fileContentJson +} + +// Get the current channel config +var currentChannelConfig = getFileContent('.current-channel-config.json') + +// Get the channel replace map +var channelReplaceMap = getFileContent('.channel-replace-map.json') + +// Build the channel replace values +var channelReplaceValue = Object.keys(currentChannelConfig.spfx.solutions).reduce((acc, key) => { + const solution = currentChannelConfig.spfx.solutions[key] + return Object.keys(solution.components).reduce((acc, componentKey) => { + acc[`ControlId_${componentKey}`] = solution.components[componentKey] + return acc + }, acc) +}, {}) + +// Copy the site scripts to the .dist folder +fse.copySync(siteScriptsPath, channelSiteScriptsFolder) + +/** + * Replace tokens in the given site scripts path. The tokens are defined in the `.channel-replace-map.json` file + * and the replacement values are generated from the current channel config file (`.current-channel-config.json`). + * + * @param {*} siteScriptsPath Template path + */ +function replaceTokensInSiteScripts(siteScriptsPath) { + for (var key in channelReplaceMap) { + var token = channelReplaceMap[key] + var replacement = channelReplaceValue[token] + replace({ + regex: key, + replacement, + paths: [siteScriptsPath], + recursive: true, + silent, + }); + } +} + +replaceTokensInSiteScripts(channelSiteScriptsFolder) \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 6a43f5ba1..59baf05df 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,8 +7,7 @@ "**/dist": true, "**/temp": true, "README.md": true, - ".development-guide/README.md": true, - "**/package-lock.json": true + ".development-guide/README.md": true }, "files.associations": { "*.txt": "json", diff --git a/CHANGELOG.md b/CHANGELOG.md index ce2cfc148..1b666d2b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,16 @@ og dette prosjektet følger [Semantic Versioning](http://semver.org/spec/v2.0.0. Sjekk ut [release notes](./releasenotes/1.8.0.md) for høydepunkter og mer detaljert 'endringslogg' for siste versjon. +## 1.9.0 - TBA + +- Støtte for å installere til ulike kanaler for å støtte separate installasjoner i samme tenant [#1068](https://github.com/Puzzlepart/prosjektportalen365/issues/1068) + +### Ny funksjonalitet + +### Forbedringer + +### Feilrettinger + ## 1.8.1 - TBA ### Ny funksjonalitet diff --git a/Install/.vscode/launch.json b/Install/.vscode/launch.json deleted file mode 100644 index ce0384cda..000000000 --- a/Install/.vscode/launch.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "type": "PowerShell", - "request": "launch", - "name": "Install.ps1", - "script": "${file}", - "args": [ - "-Url https://tenant.sharepoint.com/...", - "-Interactive" - ], - "cwd": "${file}" - }, - { - "type": "PowerShell", - "request": "launch", - "name": "Install.ps1 (Upgrade)", - "script": "${file}", - "args": [ - "-Url https://tenant.sharepoint.com/...", - "-Interactive", - "-Upgrade" - ], - "cwd": "${file}" - } - ] -} \ No newline at end of file diff --git a/Install/Build-Release.ps1 b/Install/Build-Release.ps1 index c0f696da3..1c4e58e40 100644 --- a/Install/Build-Release.ps1 +++ b/Install/Build-Release.ps1 @@ -1,3 +1,10 @@ +<# +.SYNOPSIS +Builds a release package for Prosjektportalen 365 + +.DESCRIPTION +Builds a release package for Prosjektportalen 365. The release package contains all files needed to install Prosjektportalen 365 in a tenant. +#> [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "")] Param( [Parameter(Mandatory = $false, HelpMessage = "Skip building of SharePoint Framework solutions")] @@ -9,25 +16,54 @@ Param( [Parameter(Mandatory = $false, HelpMessage = "CI mode. Installs PnP.PowerShell.")] [switch]$CI, [Parameter(Mandatory = $false)] - [switch]$SkipBundle + [switch]$SkipBundle, + [Parameter(Mandatory = $false)] + [ValidateSet("test")] + [string]$Channel ) -$PACKAGE_FILE = Get-Content "$PSScriptRoot/../package.json" -Raw | ConvertFrom-Json +#region Variables and functions +$USE_CHANNEL_CONFIG = -not ([string]::IsNullOrEmpty($Channel)) +$CHANNEL_CONFIG_NAME = "main" + +<# +Checks if parameter $CHANNEL_CONFIG_PATH is set and if so, loads the channel config, +stores it as JSON in the root of the project and sets the $CHANNEL_CONFIG variable +#> +if ($USE_CHANNEL_CONFIG) { + $CHANNEL_CONFIG_PATH = "$PSScriptRoot/../channels/$Channel.json" + if (-not (Test-Path $CHANNEL_CONFIG_PATH)) { + Write-Host "Channel config file not found at $CHANNEL_CONFIG_PATH. Aborting build of release." -ForegroundColor Red + exit 1 + } + $CHANNEL_CONFIG_SCHEMA = Get-Content "$PSScriptRoot/../channels/`$schema.json" -Raw + $CHANNEL_CONFIG_JSON = Get-Content $CHANNEL_CONFIG_PATH -Raw + $VALID_CONFIG_JSON = Test-Json -Json $CHANNEL_CONFIG_JSON -Schema $CHANNEL_CONFIG_SCHEMA -ErrorAction SilentlyContinue + if(-not $VALID_CONFIG_JSON) { + Write-Host "Channel configuration is not valid (the JSON does not match the schema). Aborting build of release." -ForegroundColor Red + exit 1 + } + $CHANNEL_CONFIG = $CHANNEL_CONFIG_JSON | ConvertFrom-Json + $CHANNEL_CONFIG_NAME = $CHANNEL_CONFIG.name + $CHANNEL_CONFIG_JSON | Out-File -FilePath "$PSScriptRoot/../.current-channel-config.json" -Encoding UTF8 -Force +} + +$NPM_PACKAGE_FILE = Get-Content "$PSScriptRoot/../package.json" -Raw | ConvertFrom-Json -$sw = [Diagnostics.Stopwatch]::StartNew() -$global:sw_action = $null +$StopWatch = [Diagnostics.Stopwatch]::StartNew() +$global:StopWatch_Action = $null function StartAction($Action) { - $global:sw_action = [Diagnostics.Stopwatch]::StartNew() + $global:StopWatch_Action = [Diagnostics.Stopwatch]::StartNew() Write-Host "[INFO] $Action... " -NoNewline } function EndAction() { - $global:sw_action.Stop() - $ElapsedSeconds = [math]::Round(($global:sw_action.ElapsedMilliseconds) / 1000, 2) + $global:StopWatch_Action.Stop() + $ElapsedSeconds = [math]::Round(($global:StopWatch_Action.ElapsedMilliseconds) / 1000, 2) Write-Host "Completed in $($ElapsedSeconds)s" -ForegroundColor Green } - +#endregion #region Paths $START_PATH = Get-Location @@ -37,14 +73,27 @@ $PNP_TEMPLATES_BASEPATH = "$ROOT_PATH/Templates" $SITE_SCRIPTS_BASEPATH = "$ROOT_PATH/SiteScripts/Src" $PNP_BUNDLE_PATH = "$PSScriptRoot/PnP.PowerShell" $GIT_HASH = git log --pretty=format:'%h' -n 1 -$RELEASE_NAME = "$($PACKAGE_FILE.name)-$($PACKAGE_FILE.version).$($GIT_HASH)" +$RELEASE_NAME = "$($NPM_PACKAGE_FILE.name)-$($NPM_PACKAGE_FILE.version).$($GIT_HASH)" +if ($USE_CHANNEL_CONFIG) { + $RELEASE_NAME = "$($RELEASE_NAME)-$($CHANNEL_CONFIG_NAME)" +} $RELEASE_PATH = "$ROOT_PATH/release/$($RELEASE_NAME)" #endregion -Write-Host "[Building release $RELEASE_NAME]" -ForegroundColor Cyan +#region Pre-build +if ($null -ne $CHANNEL_CONFIG) { + Write-Host "[Building release $RELEASE_NAME for channel $($CHANNEL_CONFIG_NAME)]" -ForegroundColor Cyan + Write-Host "IMPORTANT: Make sure to delete the .current-channel-config.json file if you abort the build process" -ForegroundColor Yellow +} +else { + Write-Host "[Building release $RELEASE_NAME]" -ForegroundColor Cyan +} + if ($CI.IsPresent) { Write-Host "[Running in CI mode]" -ForegroundColor Yellow + npm ci >$null 2>&1 + npm run generate-channel-replace-map >$null 2>&1 } if ($CI.IsPresent) { @@ -59,19 +108,30 @@ else { if ($CI.IsPresent) { $RELEASE_PATH = "$ROOT_PATH/release" } +#endregion +#region Creating release folder $RELEASE_FOLDER = New-Item -Path "$RELEASE_PATH" -ItemType Directory -Force $RELEASE_PATH = $RELEASE_FOLDER.FullName StartAction("Creating release folder release/$($RELEASE_FOLDER.BaseName)") $RELEASE_PATH_TEMPLATES = (New-Item -Path "$RELEASE_PATH/Templates" -ItemType Directory -Force).FullName +$PNP_TEMPLATES_DIST_BASEPATH = "$ROOT_PATH/.dist/Templates" $RELEASE_PATH_SITESCRIPTS = (New-Item -Path "$RELEASE_PATH/SiteScripts" -ItemType Directory -Force).FullName $RELEASE_PATH_SCRIPTS = (New-Item -Path "$RELEASE_PATH/Scripts" -ItemType Directory -Force).FullName $RELEASE_PATH_APPS = (New-Item -Path "$RELEASE_PATH/Apps" -ItemType Directory -Force).FullName EndAction +#endregion #region Copying source files StartAction("Copying Install.ps1, PostInstall.ps1 and site script source files") -Copy-Item -Path "$SITE_SCRIPTS_BASEPATH/*.txt" -Filter *.txt -Destination $RELEASE_PATH_SITESCRIPTS -Force +if ($USE_CHANNEL_CONFIG) { + npm run generate-site-scripts >$null 2>&1 + $SITE_SCRIPTS_BASEPATH = "$ROOT_PATH/.dist/SiteScripts" + Copy-Item -Path "$SITE_SCRIPTS_BASEPATH/*.txt" -Filter *.txt -Destination $RELEASE_PATH_SITESCRIPTS -Force +} +else { + Copy-Item -Path "$SITE_SCRIPTS_BASEPATH/*.txt" -Filter *.txt -Destination $RELEASE_PATH_SITESCRIPTS -Force +} Copy-Item -Path "$PSScriptRoot/Install.ps1" -Destination $RELEASE_PATH -Force Copy-Item -Path "$PSScriptRoot/Scripts/*" -Recurse -Destination $RELEASE_PATH_SCRIPTS -Force Copy-Item -Path "$PSScriptRoot/SearchConfiguration.xml" -Destination $RELEASE_PATH -Force @@ -83,7 +143,7 @@ if (-not $SkipBundle.IsPresent) { EndAction } -(Get-Content "$RELEASE_PATH/Install.ps1") -Replace '{VERSION_PLACEHOLDER}', "$($PACKAGE_FILE.version).$($GIT_HASH)" | Set-Content "$RELEASE_PATH/Install.ps1" +(Get-Content "$RELEASE_PATH/Install.ps1") -Replace '{VERSION_PLACEHOLDER}', "$($NPM_PACKAGE_FILE.version).$($GIT_HASH)" -Replace "{CHANNEL_PLACEHOLDER}", $CHANNEL_CONFIG_NAME | Set-Content "$RELEASE_PATH/Install.ps1" #endregion #region Clean node_modules for all SharePoint Framework solutions @@ -104,9 +164,9 @@ if (-not $SkipBuildSharePointFramework.IsPresent) { npm ci --silent --no-audit --no-fund >$null 2>&1 } else { - npm install --no-progress --silent --no-audit --no-fund + npm install --no-progress --silent --no-audit --no-fund >$null 2>&1 } - npm run build + npm run build >$null 2>&1 EndAction } @@ -119,9 +179,19 @@ if (-not $SkipBuildSharePointFramework.IsPresent) { npm ci --silent --no-audit --no-fund >$null 2>&1 } else { - npm install --no-progress --silent --no-audit --no-fund + npm install --no-progress --silent --no-audit --no-fund >$null 2>&1 + } + if ($USE_CHANNEL_CONFIG) { + $SOLUTION_CONFIG = $CHANNEL_CONFIG.spfx.solutions.($_) + $SOLUTION_CONFIG_JSON = ($SOLUTION_CONFIG | ConvertTo-Json) + $SOLUTION_CONFIG_JSON | Out-File -FilePath "./config/.generated-solution-config.json" -Encoding UTF8 -Force + node ../.tasks/modifySolutionFiles.js >$null 2>&1 + npm run package >$null 2>&1 + node ../.tasks/modifySolutionFiles.js --revert >$null 2>&1 + } + else { + npm run package >$null 2>&1 } - npm run package Get-ChildItem "./sharepoint/solution/" *.sppkg -Recurse -ErrorAction SilentlyContinue | Where-Object { -not ($_.PSIsContainer -or (Test-Path "$RELEASE_PATH/Apps/$_")) } | Copy-Item -Destination $RELEASE_PATH_APPS -Force EndAction } @@ -131,7 +201,13 @@ if (-not $SkipBuildSharePointFramework.IsPresent) { #region Build PnP templates Set-Location $PSScriptRoot StartAction("Building Portfolio PnP template") -Convert-PnPFolderToSiteTemplate -Out "$RELEASE_PATH_TEMPLATES/Portfolio.pnp" -Folder "$PNP_TEMPLATES_BASEPATH/Portfolio" -Force +if ($USE_CHANNEL_CONFIG) { + npm run generate-pnp-templates >$null 2>&1 + Convert-PnPFolderToSiteTemplate -Out "$RELEASE_PATH_TEMPLATES/Portfolio.pnp" -Folder "$PNP_TEMPLATES_DIST_BASEPATH/Portfolio" -Force +} +else { + Convert-PnPFolderToSiteTemplate -Out "$RELEASE_PATH_TEMPLATES/Portfolio.pnp" -Folder "$PNP_TEMPLATES_BASEPATH/Portfolio" -Force +} EndAction StartAction("Building PnP content templates") @@ -141,9 +217,10 @@ if ($CI.IsPresent) { npm ci --silent --no-audit --no-fund >$null 2>&1 } else { - npm install --no-progress --silent --no-audit --no-fund + npm install --no-progress --silent --no-audit --no-fund >$null 2>&1 } -npm run generateJsonTemplates + +npm run generate-project-templates >$null 2>&1 Get-ChildItem "./Content" -Directory -Filter "*no-NB*" | ForEach-Object { Convert-PnPFolderToSiteTemplate -Out "$RELEASE_PATH_TEMPLATES/$($_.BaseName).pnp" -Folder $_.FullName -Force @@ -170,16 +247,21 @@ EndAction #endregion - +#region Compressing release to a zip file if (-not $CI.IsPresent) { - rimraf "$($RELEASE_PATH).zip"l + rimraf "$($RELEASE_PATH).zip" Add-Type -Assembly "System.IO.Compression.FileSystem" [IO.Compression.ZipFile]::CreateFromDirectory($RELEASE_PATH, "$($RELEASE_PATH).zip") - $sw.Stop() - Write-Host "Done building release $RELEASE_NAME in $($sw.ElapsedMilliseconds/1000)s" -ForegroundColor Green + $StopWatch.Stop() + Write-Host "Done building release $RELEASE_NAME in $($StopWatch.ElapsedMilliseconds/1000)s" -ForegroundColor Green Set-Location $START_PATH } else { - $sw.Stop() - Write-Host "Done building release $RELEASE_NAME in $($sw.ElapsedMilliseconds/1000)s" -ForegroundColor Green + $StopWatch.Stop() + Write-Host "Done building release $RELEASE_NAME in $($StopWatch.ElapsedMilliseconds/1000)s" -ForegroundColor Green +} + +if ($USE_CHANNEL_CONFIG) { + Remove-Item -Path "$PSScriptRoot/../.current-channel-config.json" -Force -ErrorAction SilentlyContinue } +#endregion \ No newline at end of file diff --git a/Install/Install.ps1 b/Install/Install.ps1 index a25729101..199ca09cd 100644 --- a/Install/Install.ps1 +++ b/Install/Install.ps1 @@ -39,7 +39,7 @@ Param( [string]$Language = "Norwegian", [Parameter(Mandatory = $false, HelpMessage = "Used by Continuous Integration")] [string]$CI, - [Parameter(Mandatory = $false, HelpMessage = "Do you want to include B&A content (only when upgrading)")] + [Parameter(Mandatory = $false, HelpMessage = "Do you want to include Bygg & Anlegg content (only when upgrading)")] [switch]$IncludeBAContent ) @@ -57,6 +57,7 @@ $LanguageCodes = @{ "English (US)" = 'en-US'; } +$Channel = "{CHANNEL_PLACEHOLDER}" $LanguageId = $LanguageIds[$Language] $LanguageCode = $LanguageCodes[$Language] #endregion @@ -70,11 +71,17 @@ $InstallStartTime = (Get-Date -Format o) if ($Upgrade.IsPresent) { Write-Host "########################################################" -ForegroundColor Cyan Write-Host "### Upgrading Prosjektportalen 365 v{VERSION_PLACEHOLDER} #####" -ForegroundColor Cyan + if($Channel -ne "main") { + Write-Host "### Channel: $Channel ####" -ForegroundColor Cyan + } Write-Host "########################################################" -ForegroundColor Cyan } else { Write-Host "########################################################" -ForegroundColor Cyan Write-Host "### Installing Prosjektportalen 365 v{VERSION_PLACEHOLDER} ####" -ForegroundColor Cyan + if($Channel -ne "main") { + Write-Host "### Channel: $Channel ####" -ForegroundColor Cyan + } Write-Host "########################################################" -ForegroundColor Cyan } @@ -204,7 +211,8 @@ if ($Alias.Length -lt 2 -or (@("sites/", "teams/") -notcontains $ManagedPath) -o } #endregion -Set-PnPTraceLog -On -Level Debug -LogFile "Install_Log_$([datetime]::Now.Ticks).txt" +$LogFilePath = "$PSScriptRoot\Install_Log_$([datetime]::Now.Ticks).txt" +Set-PnPTraceLog -On -Level Debug -LogFile $LogFilePath #region Create site if (-not $SkipSiteCreation.IsPresent -and -not $Upgrade.IsPresent) { @@ -266,6 +274,11 @@ if (-not $Upgrade.IsPresent) { $SiteDesignName = [Uri]::UnescapeDataString($SiteDesignName) $SiteDesignDesc = [Uri]::UnescapeDataString("Samarbeid i et prosjektomr%C3%A5de fra Prosjektportalen") +# Add channel to name for the site design if channel is specified and not main +if($Channel -ne "main") { + $SiteDesignName += " - $Channel" +} + if (-not $SkipSiteDesign.IsPresent) { $SiteScriptIds = @() @@ -276,6 +289,10 @@ if (-not $SkipSiteDesign.IsPresent) { $SiteScriptSrc = Get-ChildItem "$PSScriptRoot/SiteScripts/*.txt" foreach ($s in $SiteScriptSrc) { $Title = $s.BaseName.Substring(9) + # Add channel to name for the site script if channel is specified and not main + if($Channel -ne "main") { + $Title += " - $Channel" + } $Content = (Get-Content -Path $s.FullName -Raw | Out-String) $SiteScript = $SiteScripts | Where-Object { $_.Title -eq $Title } if ($null -ne $SiteScript) { @@ -486,11 +503,9 @@ if (-not $SkipSearchConfiguration.IsPresent) { } #endregion - -Connect-SharePoint -Url $Uri.AbsoluteUri -ErrorAction Stop - #region Post install - running post-install scripts and applying PnP templates Write-Host "[INFO] Running post-install steps" +Connect-SharePoint -Url $Uri.AbsoluteUri -ErrorAction Stop try { ."$PSScriptRoot\Scripts\PostInstall.ps1" Write-Host "[SUCCESS] Successfully ran post-install steps" -ForegroundColor Green @@ -543,9 +558,17 @@ if ($null -ne $CurrentUser.Email) { if (-not [string]::IsNullOrEmpty($CI)) { $InstallEntry.InstallCommand = "GitHub CI"; } +if($Channel -ne "main") { + $InstallEntry.InstallChannel = $Channel +} ## Logging installation to SharePoint list -Add-PnPListItem -List "Installasjonslogg" -Values $InstallEntry -ErrorAction SilentlyContinue >$null 2>&1 +$InstallationEntry = Add-PnPListItem -List "Installasjonslogg" -Values $InstallEntry -ErrorAction SilentlyContinue + +## Attempting to attach the log file to installation entry +if ($null -ne $InstallationEntry) { + Add-PnPListItemAttachment -List "Installasjonslogg" -Identity $InstallationEntry.Id -Path $LogFilePath -ErrorAction SilentlyContinue >$null 2>&1 +} Disconnect-PnPOnline diff --git a/README.md b/README.md index 59ea86adb..9f1581ee0 100644 --- a/README.md +++ b/README.md @@ -100,4 +100,3 @@ I tillegg flere fra teamet bak [prosjektportalen@puzzlepart.com](mailto:prosjekt ## ➤ Utvikling Vennligst les [Utviklingsguiden](./.development-guide/README.md). - diff --git a/SharePointFramework/.tasks/modifySolutionFiles.js b/SharePointFramework/.tasks/modifySolutionFiles.js new file mode 100644 index 000000000..7d6ccdbdc --- /dev/null +++ b/SharePointFramework/.tasks/modifySolutionFiles.js @@ -0,0 +1,138 @@ +/** + * @fileoverview This file generates temporary package solution file and component manifest files + * with the solution ID and component IDs generated by the solution config file. This is required + * to deploy a unique solution to the tenant app catalog. + */ +const argv = require('yargs').argv; +const fs = require('fs'); +const path = require('path'); +const globMod = require('glob') +const util = require('util') +const glob = util.promisify(globMod) +const revert = argv.revert; + +// Config folder path +const configFolder = path.join(process.cwd(), `config`); + +// Generated solution config file path +const solutionConfigFile = path.join(configFolder, `.generated-solution-config.json`); + +/** + * Get file content for the given file path in JSON format + * + * @param {*} file File path + * @returns File contents as JSON + */ +function getFileContent(file) { + const fileContent = fs.readFileSync(path.resolve(process.cwd(), "..", file), 'UTF-8') + const fileContentJson = JSON.parse(fileContent) + return fileContentJson +} + +/** + * Revert package solution file to the backup file and delete the backup file. Also deletes + * the generated solution config file. + */ +function revertPackageSolutionFile() { + const packageSolutionFile = path.join(configFolder, `package-solution.json`); + const packageSolutionFileCopy = path.join(configFolder, `package-solution.json.bak`); + fs.copyFileSync(packageSolutionFileCopy, packageSolutionFile); + fs.unlinkSync(packageSolutionFileCopy); + fs.unlinkSync(solutionConfigFile) +} + +/** + * Revert component manifest files to the backup files and delete the backup files. + * + * @param {*} componentManifestFiles Component manifest files + */ +function revertComponentManifestFiles(componentManifestFiles) { + for (let i = 0; i < componentManifestFiles.length; i++) { + const componentManifestFile = componentManifestFiles[i]; + const componentManifestFileCopy = componentManifestFile + '.bak'; + fs.copyFileSync(componentManifestFileCopy, componentManifestFile); + fs.unlinkSync(componentManifestFileCopy); + } +} + +/** + * Copy existing package solution file to a backup file + */ +function copyExistingPackageSolutionFile() { + const packageSolutionFile = path.join(configFolder, `package-solution.json`); + const packageSolutionFileCopy = path.join(configFolder, `package-solution.json.bak`); + fs.copyFileSync(packageSolutionFile, packageSolutionFileCopy); +} + +/** + * Generate package solution file with the given parameters + * + * @param {*} id ID of the solution + * @param {*} name Name of the solution + * @param {*} zippedPackage Zipped package path + */ +function generatePackageSolutionFile(id, name, zippedPackage) { + const packageSolutionFile = path.join(configFolder, `package-solution.json`); + const packageSolution = getFileContent(packageSolutionFile); + packageSolution.solution.id = id; + packageSolution.solution.name = name; + packageSolution.paths.zippedPackage = zippedPackage + fs.writeFileSync(packageSolutionFile, JSON.stringify(packageSolution, null, 2), { encoding: 'utf8', overwrite: true }); +} + +/** + * Copy existing manifest files to backup files. + * + * @param {*} componentManifestFiles Component manifest files + */ +async function copyExistingComponentManifestFiles(componentManifestFiles) { + for (let i = 0; i < componentManifestFiles.length; i++) { + const componentManifestFile = componentManifestFiles[i]; + const componentManifestFileCopy = componentManifestFile + '.bak'; + fs.copyFileSync(componentManifestFile, componentManifestFileCopy); + } +} + +/** + * Generate component manifest files with a new ID based on the solution config file. + * + * @param {*} solutionConfig Solution config + * @param {*} componentManifestFiles Component manifest files + */ +function generateComponentManifestFiles(solutionConfig, componentManifestFiles) { + for (let i = 0; i < componentManifestFiles.length; i++) { + const componentManifestFile = componentManifestFiles[i]; + const componentManifest = getFileContent(componentManifestFile); + componentManifest.id = solutionConfig.components[componentManifest.alias] + switch (componentManifest.componentType) { + /** + * For web parts, hide them from the toolbox by default. This is to avoid + * confusion with duplicate web parts in the toolbox when several channels + * are deployed to the same tenant. + */ + case 'WebPart': + { + componentManifest.hiddenFromToolbox = true + } + break; + } + fs.writeFileSync(componentManifestFile, JSON.stringify(componentManifest, null, 2), { encoding: 'utf8', overwrite: true }); + } +} + + + +(async () => { + const componentManifestFiles = await glob(path.join(process.cwd(), `src/**/manifest.json`)); + + if (revert) { + revertPackageSolutionFile(); + revertComponentManifestFiles(componentManifestFiles); + } else { + const solutionConfig = getFileContent(solutionConfigFile); + copyExistingPackageSolutionFile(); + generatePackageSolutionFile(solutionConfig.id, solutionConfig.name, solutionConfig.zippedPackage); + await copyExistingComponentManifestFiles(componentManifestFiles); + generateComponentManifestFiles(solutionConfig, componentManifestFiles); + } +})(); diff --git a/SharePointFramework/PortfolioExtensions/.yo-rc.json b/SharePointFramework/PortfolioExtensions/.yo-rc.json index 3698d0ac5..604fe59cb 100644 --- a/SharePointFramework/PortfolioExtensions/.yo-rc.json +++ b/SharePointFramework/PortfolioExtensions/.yo-rc.json @@ -1,5 +1,22 @@ { "@microsoft/generator-sharepoint": { - "version": "1.15.2" + "version": "1.16.1", + "plusBeta": false, + "isCreatingSolution": true, + "nodeVersion": "16.18.0", + "sdksVersions": { + "@microsoft/microsoft-graph-client": "3.0.2", + "@microsoft/teams-js": "2.4.1" + }, + "libraryName": "pp-365-portfolioextensions", + "libraryId": "37b9d88b-d41a-4f93-adf9-8499d299c107", + "environment": "spo", + "packageManager": "npm", + "solutionName": "pp-365-portfolioextensions", + "solutionShortDescription": "pp-365-portfolioextensions description", + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "componentType": "extension", + "extensionType": "ApplicationCustomizer" } } diff --git a/SharePointFramework/PortfolioExtensions/config/deploy-azure-storage.json b/SharePointFramework/PortfolioExtensions/config/deploy-azure-storage.json index 17761aa81..6c2a2158e 100644 --- a/SharePointFramework/PortfolioExtensions/config/deploy-azure-storage.json +++ b/SharePointFramework/PortfolioExtensions/config/deploy-azure-storage.json @@ -2,6 +2,6 @@ "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/deploy-azure-storage.schema.json", "workingDir": "./release/assets/", "account": "", - "container": "portfolio-extensions", + "container": "pp-365-portfolioextensions", "accessKey": "" } \ No newline at end of file diff --git a/SharePointFramework/PortfolioExtensions/config/sass.json b/SharePointFramework/PortfolioExtensions/config/sass.json new file mode 100644 index 000000000..5e78c982d --- /dev/null +++ b/SharePointFramework/PortfolioExtensions/config/sass.json @@ -0,0 +1,3 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/core-build/sass.schema.json" +} \ No newline at end of file diff --git a/SharePointFramework/PortfolioExtensions/package-lock.json b/SharePointFramework/PortfolioExtensions/package-lock.json index 98403eab4..5dcd670df 100644 --- a/SharePointFramework/PortfolioExtensions/package-lock.json +++ b/SharePointFramework/PortfolioExtensions/package-lock.json @@ -45,6 +45,7 @@ "eslint-plugin-react": "7.31.10", "eslint-plugin-unused-imports": "2.0.0", "gulp": "4.0.2", + "livereload": "0.9.3", "prettier": "2.7.1", "typescript": "4.5.5", "webpack": "5.74.0" @@ -2709,6 +2710,234 @@ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, + "node_modules/@microsoft/gulp-core-build/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "dev": true, + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/yargs-parser/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/load-themed-styles": { "version": "1.10.295", "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.295.tgz", @@ -4280,6 +4509,15 @@ "node": ">=0.4.0" } }, + "node_modules/@microsoft/sp-build-web/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -4322,6 +4560,15 @@ "y18n": "^4.0.0" } }, + "node_modules/@microsoft/sp-build-web/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -4545,6 +4792,12 @@ "node": ">= 6" } }, + "node_modules/@microsoft/sp-build-web/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/@microsoft/sp-build-web/node_modules/is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -4608,6 +4861,18 @@ "node": ">=0.10.0" } }, + "node_modules/@microsoft/sp-build-web/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4660,6 +4925,31 @@ "node": ">=0.10.0" } }, + "node_modules/@microsoft/sp-build-web/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -4754,6 +5044,27 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/@microsoft/sp-build-web/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -4781,6 +5092,18 @@ "node": ">=6" } }, + "node_modules/@microsoft/sp-build-web/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -4790,6 +5113,29 @@ "node": ">=4" } }, + "node_modules/@microsoft/sp-build-web/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/path-type/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -4811,6 +5157,58 @@ "node": ">=6" } }, + "node_modules/@microsoft/sp-build-web/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4859,6 +5257,44 @@ "figgy-pudding": "^3.5.1" } }, + "node_modules/@microsoft/sp-build-web/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@microsoft/sp-build-web/node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -4999,6 +5435,51 @@ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, + "node_modules/@microsoft/sp-build-web/node_modules/yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "dev": true, + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/yargs-parser/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/yargs/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, "node_modules/@microsoft/sp-build-web/node_modules/z-schema": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", @@ -14360,20 +14841,6 @@ "node": ">=8" } }, - "node_modules/concurrently/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/concurrently/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -14389,59 +14856,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/concurrently/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/concurrently/node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/concurrently/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -22450,12 +22864,188 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/livereload-js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", "dev": true }, + "node_modules/livereload/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/livereload/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/livereload/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/livereload/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/livereload/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/livereload/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/livereload/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/livereload/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/livereload/node_modules/livereload-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", + "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", + "dev": true + }, + "node_modules/livereload/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/livereload/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/livereload/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/load-json-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", @@ -25048,6 +25638,12 @@ "node": ">= 0.8.0" } }, + "node_modules/opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, "node_modules/orchestrator": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", @@ -33499,231 +34095,70 @@ "dev": true }, "node_modules/yargs": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", - "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", - "dev": true, - "dependencies": { - "camelcase": "^2.0.1", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "pkg-conf": "^1.1.2", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1", - "string-width": "^1.0.1", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.0" - } - }, - "node_modules/yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/yargs/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/yargs/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/yargs/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">=12" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "node_modules/yargs/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/yargs/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, "node_modules/yocto-queue": { @@ -35167,6 +35602,195 @@ "xml": "~1.0.1", "yargs": "~4.6.0", "z-schema": "~3.18.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true + } + } + } } }, "@microsoft/gulp-core-build-sass": { @@ -37198,6 +37822,12 @@ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -37234,6 +37864,12 @@ "y18n": "^4.0.0" } }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -37401,6 +38037,12 @@ "is-glob": "^4.0.1" } }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -37449,6 +38091,15 @@ "is-plain-object": "^2.0.4" } }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -37486,6 +38137,27 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -37561,6 +38233,26 @@ "minimist": "^1.2.6" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -37579,12 +38271,40 @@ "p-limit": "^2.0.0" } }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -37600,6 +38320,48 @@ "find-up": "^3.0.0" } }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -37639,6 +38401,35 @@ "figgy-pudding": "^3.5.1" } }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -37738,6 +38529,52 @@ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, + "yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + }, + "dependencies": { + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true + } + } + }, "z-schema": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", @@ -45113,17 +45950,6 @@ } } }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -45132,44 +45958,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true } } }, @@ -51523,6 +52311,122 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", + "dev": true, + "requires": { + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" + }, + "dependencies": { + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "livereload-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", + "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + } + } + }, "livereload-js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", @@ -53513,6 +54417,12 @@ "word-wrap": "^1.2.3" } }, + "opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, "orchestrator": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", @@ -60291,191 +61201,55 @@ "dev": true }, "yargs": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", - "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "pkg-conf": "^1.1.2", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1", - "string-width": "^1.0.1", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" } }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } } } }, "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true - } - } + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true }, "yocto-queue": { "version": "0.1.0", diff --git a/SharePointFramework/PortfolioExtensions/package.json b/SharePointFramework/PortfolioExtensions/package.json index 2bbdfde2e..db10eec0b 100644 --- a/SharePointFramework/PortfolioExtensions/package.json +++ b/SharePointFramework/PortfolioExtensions/package.json @@ -57,8 +57,9 @@ "eslint-plugin-react": "7.31.10", "eslint-plugin-unused-imports": "2.0.0", "gulp": "4.0.2", + "livereload": "0.9.3", "prettier": "2.7.1", "typescript": "4.5.5", "webpack": "5.74.0" } -} \ No newline at end of file +} diff --git a/SharePointFramework/PortfolioExtensions/src/loc/nb-no.js b/SharePointFramework/PortfolioExtensions/src/loc/nb-no.js index d8348a2e8..cfff7032c 100644 --- a/SharePointFramework/PortfolioExtensions/src/loc/nb-no.js +++ b/SharePointFramework/PortfolioExtensions/src/loc/nb-no.js @@ -29,4 +29,4 @@ define([], function () { SubmitLabel: 'Send', CreateLabel: 'Opprett' } -}); \ No newline at end of file +}) \ No newline at end of file diff --git a/SharePointFramework/PortfolioWebParts/src/components/PortfolioOverview/index.tsx b/SharePointFramework/PortfolioWebParts/src/components/PortfolioOverview/index.tsx index f904d562d..8c1fc7dd3 100644 --- a/SharePointFramework/PortfolioWebParts/src/components/PortfolioOverview/index.tsx +++ b/SharePointFramework/PortfolioWebParts/src/components/PortfolioOverview/index.tsx @@ -553,4 +553,4 @@ export class PortfolioOverview extends Component { - const TEMPLATE_JSON = require(`../JsonTemplates/${file}`) - const templateType = file.substring("_JsonTemplate".length).replace((/\.[^.]+/), '') - const OUTPUT_PATHS = { - 'en-US': path.resolve(__dirname, `../Content/Portfolio_content.en-US/ProjectTemplates/${templateNames['en-US'][templateType]}.txt`), - 'no-NB': path.resolve(__dirname, `../Content/Portfolio_content.no-NB/ProjectTemplates/${templateNames['nb-NO'][templateType]}.txt`) - } - - Object.keys(RESOURCES_JSON).forEach(key => { - let content = jtr.replace( - RESOURCES_JSON[key], - TEMPLATE_JSON, - '{{', - '}}' - ) - - content = jtr.replace( - pkg, - content, - '{', - '}' - ) - - fs.writeFile( - OUTPUT_PATHS[key], - JSON.stringify(content, null, 4), - () => { - - }) - }) -}) \ No newline at end of file diff --git a/Templates/.tasks/generateProjectTemplates.js b/Templates/.tasks/generateProjectTemplates.js new file mode 100644 index 000000000..b3eed6d08 --- /dev/null +++ b/Templates/.tasks/generateProjectTemplates.js @@ -0,0 +1,100 @@ +/** + * @fileoverview Generate JSON templates for Portfolio and Project sites + * @author Puzzlepart + */ +const fs = require('fs') +const path = require('path') +const pkg = require('../../package.json') +const JsonTokenReplace = require('@ptkdev/json-token-replace') +const jsonTokenReplace = new JsonTokenReplace() + + +/** + * Get file content for the given file path in JSON format. If the file + * does not exist or the JSON is invalid, the fallback value is returned. + * + * By default the function goes up one folder from the current folder. + * + * @param {*} file File path + * @param {*} fallbackValue Fallback value if file does not exist + * + * @returns File contents as JSON + */ +function getFileContent(file, fallbackValue = {}) { + try { + const fileContent = fs.readFileSync(path.resolve(__dirname, '..', file), 'UTF-8') + const fileContentJson = JSON.parse(fileContent) + return fileContentJson + } catch (error) { + return fallbackValue + } +} + +// Template names for the different languages +const templateNames = { + 'no-NB': { + 'Project': 'Standardmal', + 'Program': 'Programmal', + 'Parent': 'Overordnet' + }, + 'en-US': { + 'Project': 'DefaultTemplate', + 'Program': 'ProgramTemplate', + 'Parent': 'ParentTemplate' + } +} + +// Resources in JSON format +const resourcesJson = getFileContent('Resources.json') + +// JSON templates +const jsonMasterTemplates = fs.readdirSync(path.resolve(__dirname, '../JsonTemplates')) + +// Get the main channel config +const mainChannelConfig = getFileContent('../channels/main.json') + +// Get the current channel config with fallback to main channel config +const currentChannelConfig = getFileContent('../.current-channel-config.json', mainChannelConfig) + +// Generate the channel replace values +const channelReplaceValue = Object.keys(currentChannelConfig.spfx.solutions).reduce((acc, key) => { + const solution = currentChannelConfig.spfx.solutions[key] + return Object.keys(solution.components).reduce((acc, componentKey) => { + acc[`ControlId_${componentKey}`] = solution.components[componentKey] + return acc + }, acc) +}, {}) + +// For each JSON template, replace the tokens and write the output to the correct folder. +jsonMasterTemplates.forEach(templateFile => { + const templateJson = getFileContent(`JsonTemplates/${templateFile}`) + const templateType = templateFile.substring('_JsonTemplate'.length).replace((/\.[^.]+/), '') + const outputPaths = Object.keys(templateNames).reduce((acc, lng) => { + acc[lng] = path.resolve(__dirname, `../Content/Portfolio_content.${lng}/ProjectTemplates/${templateNames[lng][templateType]}.txt`) + return acc + }, {}) + + + Object.keys(resourcesJson).forEach(lng => { + const jsonTokens = { ...resourcesJson[lng], ...channelReplaceValue } + let content = jsonTokenReplace.replace( + jsonTokens, + templateJson, + '{{', + '}}' + ) + + content = jsonTokenReplace.replace( + pkg, + content, + '{', + '}' + ) + + fs.writeFile( + outputPaths[lng], + JSON.stringify(content, null, 4), + () => { + }) + }) +}) \ No newline at end of file diff --git a/Templates/Clean-Resx.ps1 b/Templates/Clean-Resx.ps1 deleted file mode 100644 index e9fd066de..000000000 --- a/Templates/Clean-Resx.ps1 +++ /dev/null @@ -1,16 +0,0 @@ -# Clean-Resx.ps1 - -$unused = Get-Content './unused_resources.txt' - -[xml]$xml = Get-Content ./Portfolio/Resources.no-NB.resx - -$dataNodes = $xml.root.SelectNodes("data") - -foreach($node in $dataNodes) { - if($unused.Contains($node.name)) { - $node.ParentNode.RemoveChild($node) - Write-Host "Removed resource $($node.Name)" -ForegroundColor Cyan - } -} - -$xml.OuterXml | Out-File ./Portfolio/Resources.no-NB.resx -Encoding utf8 -Force \ No newline at end of file diff --git a/Templates/Encode-JSON.ps1 b/Templates/Encode-JSON.ps1 deleted file mode 100644 index 38d73fa62..000000000 --- a/Templates/Encode-JSON.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -# Encode-JSON.ps1 - -Param( - [Parameter(Mandatory = $true)] - [string]$Path -) - -$File = Get-ChildItem $Path - -$Content = Get-Content $Path -Raw | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 10 -[System.Web.HttpUtility]::HtmlEncode($Content) | Out-File "$($File.BaseName)_Encoded.txt" \ No newline at end of file diff --git a/Templates/Find-FieldUsage.ps1 b/Templates/Find-FieldUsage.ps1 deleted file mode 100644 index 8aaf58a5e..000000000 --- a/Templates/Find-FieldUsage.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -# Find-FieldUsage.ps1 - -$siteFields = Get-ChildItem ./Portfolio/Objects/SiteFields/*.xml | Select-Object -ExpandProperty BaseName -$xmlFiles = Get-ChildItem ./Portfolio/Objects/ContentTypes/*.xml,./Portfolio/Objects/Lists/*.xml -Recurse - -$fields = @() - -foreach ($field in $siteFields) { - $object = [PSCustomObject]@{ - Name = $field - UsedIn = @() - } - $xmlFiles | ForEach-Object { - $content = Get-Content $_.FullName | Out-String - if($content -like "*$($field)*") { - $object.UsedIn += ($_.FullName | Resolve-Path -Relative) - } - } - $fields += $object -} - -$fields | Format-Table \ No newline at end of file diff --git a/Templates/Get-ComponentProperties.ps1 b/Templates/Get-ComponentProperties.ps1 deleted file mode 100644 index 922ea6491..000000000 --- a/Templates/Get-ComponentProperties.ps1 +++ /dev/null @@ -1,13 +0,0 @@ -# Get-ComponentProperties.ps1 - -Param( - [Parameter(Mandatory = $false)] - [string]$Path = "./Portfolio/Objects/ClientSidePages/*.xml" -) - -$XmlFiles = Get-ChildItem $Path -Exclude "*@.xml" - -$XmlFiles | ForEach-Object { - [xml]$xml = (Get-Content $_.FullName | Out-String) - $xml.ClientSidePage.Sections.Section.Controls.CanvasControl.JsonControlData | Out-File "Component-$($_.BaseName).json" -} \ No newline at end of file diff --git a/Templates/JsonTemplates/_JsonTemplateParent.json b/Templates/JsonTemplates/_JsonTemplateParent.json index 264dee200..b7a1a3e59 100644 --- a/Templates/JsonTemplates/_JsonTemplateParent.json +++ b/Templates/JsonTemplates/_JsonTemplateParent.json @@ -53,7 +53,7 @@ "Factor": 12, "Controls": [ { - "Id": "9570e369-21a6-4bf5-8198-13506499de52", + "Id": "{{ControlId_ProgramAdministrationWebpart}}", "Properties": { "title": "Administrasjon av underområder" } @@ -76,7 +76,7 @@ "Factor": 12, "Controls": [ { - "Id": "01417142-67c8-498b-a6da-6e78003023dd", + "Id": "{{ControlId_ProgramProjectOverviewWebPart}}", "Properties": { "title": "Oversikt over underområder", "showCommandBar": true, @@ -105,7 +105,7 @@ "Factor": 12, "Controls": [ { - "Id": "37c7e990-483d-4f70-b9b9-def1790817e7", + "Id": "{{ControlId_ProgramAggregationWebPart}}", "Properties": { "title": "Gevinster for underområder", "searchBoxPlaceholderText": "Søk i gevinster for underområder...", @@ -224,7 +224,7 @@ "Factor": 12, "Controls": [ { - "Id": "f97a38ab-78c2-400e-899f-b0d4cda76166", + "Id": "{{ControlId_ProgramTimelineWebPart}}", "Properties": { "title": "Tidslinje for underområder", "infoText": "Her listes alle prosjektene med start- og sluttdato i prosjektet. Prosjekttidslinjen støtter også faser, delfaser og milepæler. Tidslinjeelementer til dette prosjektet opprettes i denlokale tidslinjeinnhold listen. Prosjekter vises med rød farge, faser i blått, delfaser blågrønt, og milepæler i gult. For å zoome inn/ut i tidslinje: ALT+Musehjul", @@ -249,7 +249,7 @@ "Factor": 12, "Controls": [ { - "Id": "37c7e990-483d-4f70-b9b9-def1790817e7", + "Id": "{{ControlId_ProgramAggregationWebPart}}", "Properties": { "title": "Leveranser for underområder", "searchBoxPlaceholderText": "Søk i leveranser for underområder...", @@ -333,7 +333,7 @@ "Factor": 12, "Controls": [ { - "Id": "37c7e990-483d-4f70-b9b9-def1790817e7", + "Id": "{{ControlId_ProgramAggregationWebPart}}", "Properties": { "title": "Usikkerheter for underområder", "searchBoxPlaceholderText": "Søk i usikkerheter for underområder...", diff --git a/Templates/JsonTemplates/_JsonTemplateProgram.json b/Templates/JsonTemplates/_JsonTemplateProgram.json index e214f00a8..864f549f4 100644 --- a/Templates/JsonTemplates/_JsonTemplateProgram.json +++ b/Templates/JsonTemplates/_JsonTemplateProgram.json @@ -503,7 +503,7 @@ "Factor": 8, "Controls": [ { - "Id": "4449d3dc-fa58-4982-b87c-5a893114e7b7", + "Id": "{{ControlId_ProjectPhasesWebPart}}", "Properties": { "phaseField": "Fase", "syncPropertiesAfterPhaseChange": true, @@ -526,7 +526,7 @@ "Factor": 4, "Controls": [ { - "Id": "b8bec0be-2354-443d-a3ca-24b36e8ea7dc", + "Id": "{{ControlId_ProjectInformationWebPart}}", "Properties": { "title": "Programinformasjon", "statusReportsCount": 0, @@ -601,7 +601,7 @@ "Factor": 12, "Controls": [ { - "Id": "9570e369-21a6-4bf5-8198-13506499de52", + "Id": "{{ControlId_ProgramAdministrationWebpart}}", "Properties": { "title": "Administrasjon av underområder" } @@ -624,7 +624,7 @@ "Factor": 12, "Controls": [ { - "Id": "01417142-67c8-498b-a6da-6e78003023dd", + "Id": "{{ControlId_ProgramProjectOverviewWebPart}}", "Properties": { "title": "Oversikt over underområder", "showCommandBar": true, @@ -653,7 +653,7 @@ "Factor": 12, "Controls": [ { - "Id": "37c7e990-483d-4f70-b9b9-def1790817e7", + "Id": "{{ControlId_ProgramAggregationWebPart}}", "Properties": { "title": "Gevinster for underområder", "dataSource": "Alle gevinstelementer", @@ -772,7 +772,7 @@ "Factor": 12, "Controls": [ { - "Id": "f97a38ab-78c2-400e-899f-b0d4cda76166", + "Id": "{{ControlId_ProgramTimelineWebPart}}", "Properties": { "title": "Tidslinje for underområder", "infoText": "Her listes alle prosjektene med start- og sluttdato i programmet. Tidslinjen støtter også faser, delfaser og milepæler. Tidslinjeelementer til dette programmet opprettes i denlokale tidslinjeinnhold listen. Prosjekter vises med rød farge, faser i blått, delfaser blågrønt, og milepæler i gult. For å zoome inn/ut i tidslinje: ALT+Musehjul", @@ -797,7 +797,7 @@ "Factor": 12, "Controls": [ { - "Id": "681ad0dc-ddb5-4dba-a5d6-a42f6d1c90a6", + "Id": "{{ControlId_ProjectStatusWebPart}}", "Properties": { "title": "Programstatus", "riskMatrix": { @@ -824,7 +824,7 @@ "Factor": 12, "Controls": [ { - "Id": "d156652b-9121-47af-89ae-1fe8427c53da", + "Id": "{{ControlId_ProjectTimelineWebPart}}", "Properties": { "listName": "Tidslinjeinnhold", "showTimeline": true, @@ -854,7 +854,7 @@ "Factor": 12, "Controls": [ { - "Id": "37c7e990-483d-4f70-b9b9-def1790817e7", + "Id": "{{ControlId_ProgramAggregationWebPart}}", "Properties": { "title": "Leveranser for underområder", "dataSource": "Alle prosjektleveranser", @@ -937,7 +937,7 @@ "Factor": 12, "Controls": [ { - "Id": "37c7e990-483d-4f70-b9b9-def1790817e7", + "Id": "{{ControlId_ProgramAggregationWebPart}}", "Properties": { "title": "Usikkerheter for underområder", "searchBoxPlaceholderText": "Søk i usikkerheter for underområder...", diff --git a/Templates/JsonTemplates/_JsonTemplateProject.json b/Templates/JsonTemplates/_JsonTemplateProject.json index 830f791ff..dc9b6fa5b 100644 --- a/Templates/JsonTemplates/_JsonTemplateProject.json +++ b/Templates/JsonTemplates/_JsonTemplateProject.json @@ -535,7 +535,7 @@ "Factor": 8, "Controls": [ { - "Id": "4449d3dc-fa58-4982-b87c-5a893114e7b7", + "Id": "{{ControlId_ProjectPhasesWebPart}}", "Properties": { "phaseField": "Fase", "syncPropertiesAfterPhaseChange": true, @@ -566,7 +566,7 @@ "Factor": 4, "Controls": [ { - "Id": "b8bec0be-2354-443d-a3ca-24b36e8ea7dc", + "Id": "{{ControlId_ProjectInformationWebPart}}", "Properties": { "title": "Prosjektinformasjon", "statusReportsCount": 0, @@ -641,7 +641,7 @@ "Factor": 12, "Controls": [ { - "Id": "6c0e484d-f6da-40d4-81fc-ec1389ef29a8", + "Id": "{{ControlId_PortfolioAggregationWebPart}}", "Properties": { "title": "Gevinstoversikt", "dataSource": "Gevinstoversikt (Prosjektnivå)", @@ -763,7 +763,7 @@ "Factor": 12, "Controls": [ { - "Id": "681ad0dc-ddb5-4dba-a5d6-a42f6d1c90a6", + "Id": "{{ControlId_ProjectStatusWebPart}}", "Properties": { "title": "Prosjektstatus", "riskMatrix": { @@ -794,7 +794,7 @@ "Factor": 12, "Controls": [ { - "Id": "d156652b-9121-47af-89ae-1fe8427c53da", + "Id": "{{ControlId_ProjectTimelineWebPart}}", "Properties": { "listName": "Tidslinjeinnhold", "showTimeline": true, diff --git a/Templates/Portfolio/Objects/Lists/Installasjonslogg.xml b/Templates/Portfolio/Objects/Lists/Installasjonslogg.xml index afae42a01..a59c3b337 100644 --- a/Templates/Portfolio/Objects/Lists/Installasjonslogg.xml +++ b/Templates/Portfolio/Objects/Lists/Installasjonslogg.xml @@ -13,6 +13,7 @@ + 30 @@ -26,6 +27,7 @@ + diff --git a/Templates/Portfolio/Resources.no-NB.resx b/Templates/Portfolio/Resources.no-NB.resx index fb071f595..cba77c6b0 100644 --- a/Templates/Portfolio/Resources.no-NB.resx +++ b/Templates/Portfolio/Resources.no-NB.resx @@ -2638,6 +2638,9 @@ Installasjonsbruker + + Installasjonskanal + Seksjonsdata diff --git a/Templates/Search-Resx.ps1 b/Templates/Search-Resx.ps1 deleted file mode 100644 index 1722abb84..000000000 --- a/Templates/Search-Resx.ps1 +++ /dev/null @@ -1,33 +0,0 @@ -# Search-Resx.ps1 - -Param( - [Parameter(Mandatory = $true)] - [string]$ResourceFile -) - -$xmlFiles = Get-ChildItem *.xml -Recurse - -$usedRes = @() - -$xmlFiles | ForEach-Object { - $content = Get-Content $_.FullName | Out-String - [regex]::Matches($content, "{resource:(?[A-Za-z0-9_]*)}", [System.Text.RegularExpressions.RegexOptions]::Multiline) | ForEach-Object { - $resKey = $_.Groups | Where-Object { $_.Name -eq "key" } | Select-Object -ExpandProperty value - $usedRes += $resKey - } -} - -$content = Get-Content $ResourceFile | Out-String - -$availableRes = @() - -[regex]::Matches($content, 'data name="(?[A-Za-z_]*)"', [System.Text.RegularExpressions.RegexOptions]::Multiline) | ForEach-Object { - $resKey = $_.Groups | Where-Object { $_.Name -eq "key" } | Select-Object -ExpandProperty value - $availableRes += $resKey -} - -$unusedRes = Compare-Object $usedRes $availableRes | Where-Object { $_.SideIndicator -eq "=>" } | Select-Object -ExpandProperty InputObject - -Write-Host "Found $($unusedRes.Length) unusued resources" -ForegroundColor Cyan - -$unusedRes | Out-File unused_resources.txt -Encoding utf8 -Force diff --git a/Templates/package-lock.json b/Templates/package-lock.json index 121ebd091..9024b70c0 100644 --- a/Templates/package-lock.json +++ b/Templates/package-lock.json @@ -1,13 +1,949 @@ { "name": "prosjektportalen365-templates", + "lockfileVersion": 2, "requires": true, - "lockfileVersion": 1, + "packages": { + "": { + "name": "prosjektportalen365-templates", + "dependencies": { + "@ptkdev/json-token-replace": "^1.2.2", + "chokidar-cli": "^2.1.0", + "resx-json-typescript-converter": "^1.0.1" + }, + "devDependencies": { + "replace": "1.2.2" + } + }, + "node_modules/@ptkdev/json-token-replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@ptkdev/json-token-replace/-/json-token-replace-1.2.2.tgz", + "integrity": "sha512-rYihYXyYjnLORANJ7E+Ny2CtTZSxV6euk0wy4waZ02yTSIgt4jKGV3RKr+TFEU4M2EaVSREkznp/UVjJ0ptH3g==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/chokidar-cli": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-2.1.0.tgz", + "integrity": "sha512-6n21AVpW6ywuEPoxJcLXMA2p4T+SLjWsXKny/9yTWFz0kKxESI3eUylpeV97LylING/27T/RVTY0f2/0QaWq9Q==", + "dependencies": { + "chokidar": "^3.2.3", + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1", + "yargs": "^13.3.0" + }, + "bin": { + "chokidar": "index.js" + }, + "engines": { + "node": ">= 8.10.0" + } + }, + "node_modules/chokidar-cli/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar-cli/node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/chokidar-cli/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar-cli/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar-cli/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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/chokidar-cli/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/chokidar-cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chokidar-cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/chokidar-cli/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar-cli/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/chokidar-cli/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar-cli/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/chokidar-cli/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar-cli/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar-cli/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar-cli/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar-cli/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar-cli/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar-cli/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/chokidar-cli/node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/chokidar-cli/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar-cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chokidar-cli/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar-cli/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/chokidar-cli/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/chokidar-cli/node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar-cli/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/chokidar-cli/node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/chokidar-cli/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chokidar-cli/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "node_modules/chokidar-cli/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/chokidar-cli/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/chokidar-cli/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "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/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, + "dependencies": { + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + }, + "bin": { + "replace": "bin/replace.js", + "search": "bin/search.js" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resx-json-typescript-converter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/resx-json-typescript-converter/-/resx-json-typescript-converter-1.0.2.tgz", + "integrity": "sha512-1NDPYuhxISEd4VKBLlyeyUVQdSVXhG4mCav+e9nR5gEsJVjfm8oi6wMudMH+wDS3O4RhEtUR0DEB3/x4QJr76A==", + "dependencies": { + "fileseek_plus": "^1.0.4", + "xml2js": "*" + } + }, + "node_modules/resx-json-typescript-converter/node_modules/fileseek_plus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fileseek_plus/-/fileseek_plus-1.0.4.tgz", + "integrity": "sha512-/z52nN4mLTPKRmcyxprk2DEUwB+DBm81LH2jxHx5Q+3NXWR8shROy6UQZJQP4U64xWmR8VuNs8IG6l+dPIB+eA==" + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { "@ptkdev/json-token-replace": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@ptkdev/json-token-replace/-/json-token-replace-1.2.2.tgz", "integrity": "sha512-rYihYXyYjnLORANJ7E+Ny2CtTZSxV6euk0wy4waZ02yTSIgt4jKGV3RKr+TFEU4M2EaVSREkznp/UVjJ0ptH3g==" }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "chokidar-cli": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-2.1.0.tgz", @@ -319,12 +1255,161 @@ } } }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "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 + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "resx-json-typescript-converter": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/resx-json-typescript-converter/-/resx-json-typescript-converter-1.0.2.tgz", @@ -341,6 +1426,84 @@ } } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -361,6 +1524,41 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" } } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } } diff --git a/Templates/package.json b/Templates/package.json index 21aebe7d0..5da0aa24b 100644 --- a/Templates/package.json +++ b/Templates/package.json @@ -2,14 +2,16 @@ "name": "prosjektportalen365-templates", "main": "generateTemplate.js", "scripts": { - "watch": "chokidar \"./_JsonTemplate.json\" -c \"npm run generateJsonTemplates\"", - "generateResxJson": "node ./.tasks/generateResxJson", - "generateJsonTemplates": "node ./.tasks/generateJsonTemplates", - "pregenerateJsonTemplates": "npm run generateResxJson" + "watch": "chokidar \"./_JsonTemplate.json\" -c \"npm run generate-project-templates\"", + "generate-resx-json": "node ./.tasks/generateResxJson", + "generate-project-templates": "npm run generate-resx-json && node ./.tasks/generateProjectTemplates" }, "dependencies": { "@ptkdev/json-token-replace": "^1.2.2", "chokidar-cli": "^2.1.0", "resx-json-typescript-converter": "^1.0.1" + }, + "devDependencies": { + "replace": "1.2.2" } } diff --git a/channels/$schema.json b/channels/$schema.json new file mode 100644 index 000000000..8f3647e2b --- /dev/null +++ b/channels/$schema.json @@ -0,0 +1,303 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "spfx": { + "type": "object", + "properties": { + "solutions": { + "type": "object", + "properties": { + "PortfolioExtensions": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "name": { + "type": "string" + }, + "zippedPackage": { + "type": "string", + "pattern": "solution\/pp-[A-Za-z-]*.sppkg" + }, + "components": { + "type": "object", + "properties": { + "Footer": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "IdeaProcessingCommand": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "IdeaProjectDataCommand": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "IdeaRegistrationCommand": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + } + }, + "required": [ + "Footer", + "IdeaProcessingCommand", + "IdeaProjectDataCommand", + "IdeaRegistrationCommand" + ] + } + }, + "required": [ + "id", + "name", + "zippedPackage", + "components" + ] + }, + "PortfolioWebParts": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "name": { + "type": "string" + }, + "zippedPackage": { + "type": "string", + "pattern": "solution\/pp-[A-Za-z-]*.sppkg" + }, + "components": { + "type": "object", + "properties": { + "LatestProjectsWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "PortfolioAggregationWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "PortfolioInsightsWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "PortfolioOverviewWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProjectListWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProjectTimelineWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ResourceAllocationWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + } + }, + "required": [ + "LatestProjectsWebPart", + "PortfolioAggregationWebPart", + "PortfolioInsightsWebPart", + "PortfolioOverviewWebPart", + "ProjectListWebPart", + "ProjectTimelineWebPart", + "ResourceAllocationWebPart" + ] + } + }, + "required": [ + "id", + "name", + "zippedPackage", + "components" + ] + }, + "ProgramWebParts": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "name": { + "type": "string" + }, + "zippedPackage": { + "type": "string", + "pattern": "solution\/pp-[A-Za-z-]*.sppkg" + }, + "components": { + "type": "object", + "properties": { + "ProgramAdministrationWebpart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProgramAggregationWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProgramProjectOverviewWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProgramTimelineWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + } + }, + "required": [ + "ProgramAdministrationWebpart", + "ProgramAggregationWebPart", + "ProgramProjectOverviewWebPart", + "ProgramTimelineWebPart" + ] + } + }, + "required": [ + "id", + "name", + "zippedPackage", + "components" + ] + }, + "ProjectExtensions": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "name": { + "type": "string" + }, + "zippedPackage": { + "type": "string", + "pattern": "solution\/pp-[A-Za-z-]*.sppkg" + }, + "components": { + "type": "object", + "properties": { + "HelpContentApplicationCustomizer": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProjectSetup": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProjectUpgrade": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "TemplateSelectorCommand": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + } + }, + "required": [ + "HelpContentApplicationCustomizer", + "ProjectSetup", + "ProjectUpgrade", + "TemplateSelectorCommand" + ] + } + }, + "required": [ + "id", + "name", + "zippedPackage", + "components" + ] + }, + "ProjectWebParts": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "name": { + "type": "string" + }, + "zippedPackage": { + "type": "string", + "pattern": "solution\/pp-[A-Za-z-]*.sppkg" + }, + "components": { + "type": "object", + "properties": { + "OpportunityMatrixWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProjectInformationWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProjectPhasesWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProjectStatusWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "ProjectTimelineWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, + "RiskMatrixWebPart": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + } + }, + "required": [ + "OpportunityMatrixWebPart", + "ProjectInformationWebPart", + "ProjectPhasesWebPart", + "ProjectStatusWebPart", + "ProjectTimelineWebPart", + "RiskMatrixWebPart" + ] + } + }, + "required": [ + "id", + "name", + "zippedPackage", + "components" + ] + } + }, + "required": [ + "PortfolioExtensions", + "PortfolioWebParts", + "ProgramWebParts", + "ProjectExtensions", + "ProjectWebParts" + ] + } + }, + "required": [ + "solutions" + ] + } + }, + "required": [ + "name", + "spfx" + ] +} \ No newline at end of file diff --git a/channels/main.json b/channels/main.json new file mode 100644 index 000000000..ca167f201 --- /dev/null +++ b/channels/main.json @@ -0,0 +1,68 @@ +{ + "$schema": "./$schema.json", + "name": "main", + "spfx": { + "solutions": { + "PortfolioExtensions": { + "id": "a3bf3315-0710-41f9-8836-2b61396d032f", + "name": "Prosjektportalen 365 - Portfolio Extensions", + "zippedPackage": "solution/pp-portfolio-extensions.sppkg", + "components": { + "Footer": "84f27cec-ffde-4e00-a4cf-25c69f691054", + "IdeaProcessingCommand": "5af28222-4bf8-419c-9533-5a31967b9f20", + "IdeaProjectDataCommand": "b13831c6-c4f8-4bbc-9da3-bd5f960f7e2b", + "IdeaRegistrationCommand": "c93a4a2a-f5f0-41ee-9ab6-04ad85004d20" + } + }, + "PortfolioWebParts": { + "id": "00483367-68e2-4977-9cc3-6cf0de623daa", + "name": "Prosjektportalen 365 - Portfolio Web Parts", + "zippedPackage": "solution/pp-portfolio-web-parts.sppkg", + "components": { + "LatestProjectsWebPart": "941fd73c-b957-41c3-8d4f-082268407f10", + "PortfolioAggregationWebPart": "6c0e484d-f6da-40d4-81fc-ec1389ef29a8", + "PortfolioInsightsWebPart": "875ca87a-e331-4ffb-bc69-0272fdf80e41", + "PortfolioOverviewWebPart": "e58e3d32-057a-4418-97ce-172b92482ba2", + "ProjectListWebPart": "54fbeb7d-e463-4dcc-8873-50a3ab2f0f68", + "ProjectTimelineWebPart": "7284c568-f66c-4218-bb2c-3734a3cfa581", + "ResourceAllocationWebPart": "2ef269b2-6370-4841-8b35-2185b7ccb22a" + } + }, + "ProgramWebParts": { + "id": "8a9a0f4a-2e2f-4f13-aceb-867f82bd77eb", + "name": "Prosjektportalen 365 - Program Web Parts", + "zippedPackage": "solution/pp-program-web-parts.sppkg", + "components": { + "ProgramAdministrationWebpart": "9570e369-21a6-4bf5-8198-13506499de52", + "ProgramAggregationWebPart": "37c7e990-483d-4f70-b9b9-def1790817e7", + "ProgramProjectOverviewWebPart": "01417142-67c8-498b-a6da-6e78003023dd", + "ProgramTimelineWebPart": "f97a38ab-78c2-400e-899f-b0d4cda76166" + } + }, + "ProjectExtensions": { + "id": "fe723971-d5c2-4698-91e3-c16e2f72fb5b", + "name": "Prosjektportalen 365 - Project Extensions", + "zippedPackage": "solution/pp-project-extensions.sppkg", + "components": { + "HelpContentApplicationCustomizer": "28987406-2a67-48a8-9297-fd2833bf0a09", + "ProjectSetup": "ce34553d-ab47-4107-8dd1-e980d953996d", + "ProjectUpgrade": "453a6c1e-e1d0-4b12-a3fc-690a36da1f0c", + "TemplateSelectorCommand": "c9080212-e63e-47cc-8278-00ad38c3f5a5" + } + }, + "ProjectWebParts": { + "id": "b69cb2f2-762d-425d-8e0b-d59c08918831", + "name": "Prosjektportalen 365 - Project Web Parts", + "zippedPackage": "solution/pp-project-web-parts.sppkg", + "components": { + "OpportunityMatrixWebPart": "aff0baa2-9ab4-4c13-a062-d5fa5028121c", + "ProjectInformationWebPart": "b8bec0be-2354-443d-a3ca-24b36e8ea7dc", + "ProjectPhasesWebPart": "4449d3dc-fa58-4982-b87c-5a893114e7b7", + "ProjectStatusWebPart": "681ad0dc-ddb5-4dba-a5d6-a42f6d1c90a6", + "ProjectTimelineWebPart": "d156652b-9121-47af-89ae-1fe8427c53da", + "RiskMatrixWebPart": "e536ae15-0748-4d96-b160-3abb30f1b71e" + } + } + } + } +} \ No newline at end of file diff --git a/channels/test.json b/channels/test.json new file mode 100644 index 000000000..65da9d07d --- /dev/null +++ b/channels/test.json @@ -0,0 +1,68 @@ +{ + "$schema": "./$schema.json", + "name": "test", + "spfx": { + "solutions": { + "PortfolioExtensions": { + "id": "b435060e-0748-4993-8b5d-ee83ef8a8ad7", + "name": "Prosjektportalen 365 - Portfolio Extensions - test", + "zippedPackage": "solution/pp-portfolio-extensions-test.sppkg", + "components": { + "Footer": "65d27710-49a9-4492-a4ec-3ac4f1e798d2", + "IdeaProcessingCommand": "a2a360d7-3748-4d0d-85d8-a03d659ba47d", + "IdeaProjectDataCommand": "5e423d21-dfd0-4b7e-a7f6-86d208d96a4d", + "IdeaRegistrationCommand": "b817d22f-fb61-4b28-ab3e-18a0c06416c1" + } + }, + "PortfolioWebParts": { + "id": "65422576-0c56-48e2-8a84-1a192685ceee", + "name": "Prosjektportalen 365 - Portfolio Web Parts - test", + "zippedPackage": "solution/pp-portfolio-web-parts-test.sppkg", + "components": { + "LatestProjectsWebPart": "3d374373-9fd8-4ba5-8a03-524651cac3e8", + "PortfolioAggregationWebPart": "9ad033f7-106e-488e-bad4-9b66d7b26281", + "PortfolioInsightsWebPart": "fb8e6170-c2bf-4026-9953-dc1b72701946", + "PortfolioOverviewWebPart": "909d00a8-c563-4b52-a7a4-1fb5876f9058", + "ProjectListWebPart": "397a0947-7d83-4084-871b-d8e0d1edc770", + "ProjectTimelineWebPart": "58446c7e-4a78-49e0-8ae0-2efee199e58d", + "ResourceAllocationWebPart": "29759c81-896f-4128-818c-e2fc60ff0087" + } + }, + "ProgramWebParts": { + "id": "82fe1890-e114-4b9b-bd4d-c86012aa33e9", + "name": "Prosjektportalen 365 - Program Web Parts - test", + "zippedPackage": "solution/pp-program-web-parts-test.sppkg", + "components": { + "ProgramAdministrationWebpart": "ca500bfe-49c7-4553-939a-b33254d77762", + "ProgramAggregationWebPart": "455cb52f-48ef-4fa1-8984-7ec0176b2d51", + "ProgramProjectOverviewWebPart": "67c58192-1d15-4c09-b62a-96f9c9ffe8ac", + "ProgramTimelineWebPart": "60c29af4-b55a-4207-911b-8f254ed99f02" + } + }, + "ProjectExtensions": { + "id": "7883f20d-a353-4107-84aa-ec6ebc2e24fe", + "name": "Prosjektportalen 365 - Project Extensions - test", + "zippedPackage": "solution/pp-project-extensions-test.sppkg", + "components": { + "HelpContentApplicationCustomizer": "a5394e7a-e449-44bd-a700-cd5625331b89", + "ProjectSetup": "8f20ddfa-4494-493d-93f0-4995afe57e6f", + "ProjectUpgrade": "e2eb9f73-f3f4-45d4-b8de-27ecf7236b1d", + "TemplateSelectorCommand": "32f5eb06-353c-4561-b095-4703e3144989" + } + }, + "ProjectWebParts": { + "id": "99305c90-4fdb-4289-9379-2702957b3777", + "name": "Prosjektportalen 365 - Project Web Parts - test", + "zippedPackage": "solution/pp-project-web-parts-test.sppkg", + "components": { + "OpportunityMatrixWebPart": "2301e02b-877c-427b-ace7-6ffb959b7326", + "ProjectInformationWebPart": "183a4b49-c2ee-4917-8f58-07c31e81733d", + "ProjectPhasesWebPart": "2ebefd70-f62e-48d8-836d-482b74d481be", + "ProjectStatusWebPart": "2231d86b-9b07-45f0-b112-a2f80d31b2f0", + "ProjectTimelineWebPart": "2fd903ad-3179-459a-b2b9-8d2963da8af1", + "RiskMatrixWebPart": "b1500cba-4eef-437e-92db-7728dcd9502c" + } + } + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e4466f4a8..5bb8550dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,32 @@ "version": "1.8.1", "license": "MIT", "devDependencies": { - "glob": "7.2.0" + "fs-extra": "11.1.0", + "glob": "7.2.0", + "replace": "1.2.2", + "uuid": "9.0.0", + "yargs": "17.7.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/balanced-match": { @@ -28,18 +53,139 @@ "concat-map": "0.0.1" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -60,6 +206,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -76,10 +237,43 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -97,6 +291,51 @@ "wrappy": "1" } }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -106,14 +345,315 @@ "node": ">=0.10.0" } }, + "node_modules/replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, + "dependencies": { + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + }, + "bin": { + "replace": "bin/replace.js", + "search": "bin/search.js" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/replace/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/replace/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/replace/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/replace/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/replace/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/replace/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } } }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -130,18 +670,112 @@ "concat-map": "0.0.1" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "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 + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -156,6 +790,18 @@ "path-is-absolute": "^1.0.0" } }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -172,10 +818,35 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -190,17 +861,270 @@ "wrappy": "1" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true } } } diff --git a/package.json b/package.json index 09d2fb531..aa28c74ec 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,10 @@ "scripts": { "sync-version": "node ./.tasks/automatic-versioning.js", "generate-readme": "npx @appnest/readme generate && npx @appnest/readme generate --config .development-guide/blueprint.json", + "generate-channel-config": "node ./.tasks/generate-channel-config.js", + "generate-channel-replace-map": "node ./.tasks/generate-channel-config.js --replace-map", + "generate-pnp-templates": "node ./.tasks/generate-pnp-templates.js", + "generate-site-scripts": "node ./.tasks/generate-site-scripts.js --silent", "postversion": "npm run generate-readme && npm run sync-version" }, "repository": { @@ -34,6 +38,10 @@ "author": "olemp@puzzlepart.com", "license": "MIT", "devDependencies": { - "glob": "7.2.0" + "fs-extra": "11.1.0", + "glob": "7.2.0", + "replace": "1.2.2", + "uuid": "9.0.0", + "yargs": "17.7.1" } } diff --git a/releasenotes/1.8.0.md b/release_notes/1.8.0.md similarity index 100% rename from releasenotes/1.8.0.md rename to release_notes/1.8.0.md diff --git a/releasenotes/1.9.0.md b/release_notes/1.9.0.md similarity index 100% rename from releasenotes/1.9.0.md rename to release_notes/1.9.0.md diff --git a/releasenotes/assets/ba-mal.png b/release_notes/assets/ba-mal.png similarity index 100% rename from releasenotes/assets/ba-mal.png rename to release_notes/assets/ba-mal.png diff --git a/releasenotes/assets/fasesider.png b/release_notes/assets/fasesider.png similarity index 100% rename from releasenotes/assets/fasesider.png rename to release_notes/assets/fasesider.png diff --git a/releasenotes/assets/fns-baerekraftsmal.png b/release_notes/assets/fns-baerekraftsmal.png similarity index 100% rename from releasenotes/assets/fns-baerekraftsmal.png rename to release_notes/assets/fns-baerekraftsmal.png diff --git a/releasenotes/assets/logg.png b/release_notes/assets/logg.png similarity index 100% rename from releasenotes/assets/logg.png rename to release_notes/assets/logg.png diff --git a/releasenotes/assets/mulighetsmatrise.png b/release_notes/assets/mulighetsmatrise.png similarity index 100% rename from releasenotes/assets/mulighetsmatrise.png rename to release_notes/assets/mulighetsmatrise.png diff --git a/releasenotes/assets/overordnet.png b/release_notes/assets/overordnet.png similarity index 100% rename from releasenotes/assets/overordnet.png rename to release_notes/assets/overordnet.png diff --git a/releasenotes/assets/prosjektadministrasjonsroller-liste.png b/release_notes/assets/prosjektadministrasjonsroller-liste.png similarity index 100% rename from releasenotes/assets/prosjektadministrasjonsroller-liste.png rename to release_notes/assets/prosjektadministrasjonsroller-liste.png diff --git a/releasenotes/assets/prosjektadministrasjonsroller.png b/release_notes/assets/prosjektadministrasjonsroller.png similarity index 100% rename from releasenotes/assets/prosjektadministrasjonsroller.png rename to release_notes/assets/prosjektadministrasjonsroller.png diff --git a/releasenotes/assets/statusrapport-prosjektinfo-1.png b/release_notes/assets/statusrapport-prosjektinfo-1.png similarity index 100% rename from releasenotes/assets/statusrapport-prosjektinfo-1.png rename to release_notes/assets/statusrapport-prosjektinfo-1.png diff --git a/releasenotes/assets/statusrapport-prosjektinfo-2.png b/release_notes/assets/statusrapport-prosjektinfo-2.png similarity index 100% rename from releasenotes/assets/statusrapport-prosjektinfo-2.png rename to release_notes/assets/statusrapport-prosjektinfo-2.png diff --git a/releasenotes/assets/statusrapport-prosjektinfo-3.png b/release_notes/assets/statusrapport-prosjektinfo-3.png similarity index 100% rename from releasenotes/assets/statusrapport-prosjektinfo-3.png rename to release_notes/assets/statusrapport-prosjektinfo-3.png diff --git a/releasenotes/assets/tilgang-til-vertikal.png b/release_notes/assets/tilgang-til-vertikal.png similarity index 100% rename from releasenotes/assets/tilgang-til-vertikal.png rename to release_notes/assets/tilgang-til-vertikal.png diff --git a/releasenotes/assets/tilgang-til-visning.png b/release_notes/assets/tilgang-til-visning.png similarity index 100% rename from releasenotes/assets/tilgang-til-visning.png rename to release_notes/assets/tilgang-til-visning.png diff --git a/releasenotes/assets/usikkerhetsmatrise-1.png b/release_notes/assets/usikkerhetsmatrise-1.png similarity index 100% rename from releasenotes/assets/usikkerhetsmatrise-1.png rename to release_notes/assets/usikkerhetsmatrise-1.png diff --git a/releasenotes/assets/usikkerhetsmatrise-2.png b/release_notes/assets/usikkerhetsmatrise-2.png similarity index 100% rename from releasenotes/assets/usikkerhetsmatrise-2.png rename to release_notes/assets/usikkerhetsmatrise-2.png diff --git a/releasenotes/assets/usikkerhetsmatrise-3.png b/release_notes/assets/usikkerhetsmatrise-3.png similarity index 100% rename from releasenotes/assets/usikkerhetsmatrise-3.png rename to release_notes/assets/usikkerhetsmatrise-3.png