Admin
5 | 6 |/account7 | Account 8 | 9 |
10 |
11 | 12 |
/.auth/logout13 | Log out 14 |
├── .env
├── public
├── ads.txt
├── favicon.ico
├── robots.txt
├── images
│ ├── demo.gif
│ ├── cloud
│ │ ├── pr.png
│ │ ├── role.png
│ │ ├── actions.png
│ │ ├── domains.png
│ │ ├── invite.png
│ │ ├── portal.gif
│ │ ├── update.png
│ │ ├── vscode.gif
│ │ ├── function.png
│ │ ├── functions.png
│ │ └── environments.png
│ ├── screen.png
│ ├── social.png
│ ├── icons
│ │ ├── icon-192x192.png
│ │ ├── icon-256x256.png
│ │ ├── icon-384x384.png
│ │ └── icon-512x512.png
│ ├── screenshots
│ │ ├── wide-1.png
│ │ ├── wide-2.png
│ │ ├── narrow-1.png
│ │ └── narrow-2.png
│ └── shortcuts
│ │ └── upload.png
├── samples
│ └── bpmtechno-120.mp3
├── assetlinks.json
├── 400.html
├── 404.html
├── index.html
├── manifest.webmanifest
└── privacy.html
├── api
├── feedback
│ ├── sample.dat
│ ├── function.json
│ └── index.js
├── .funcignore
├── proxies.json
├── package.json
├── host.json
├── .gitignore
└── package-lock.json
├── .vscode
├── extensions.json
├── launch.json
├── settings.json
└── tasks.json
├── .well-known
└── web-app-origin-association
├── src
├── custom-hint.css
├── Admin.js
├── reportWebVitals.js
├── Home.css
├── index.js
├── App.css
├── Login.js
├── telemetry-provider.jsx
├── staticwebapp.config.json
├── TelemetryService.js
├── Account.js
├── index.css
├── Feedback.js
├── AdLink.js
├── Upload.js
├── sw
│ └── service-worker.js
├── App.js
├── Home.js
└── About.js
├── .gitignore
├── swa-cli.config.json
├── rollup.config.js
├── sw-build.js
├── LICENSE
├── .github
└── workflows
│ └── azure-static-web-apps-mango-mud-0136f961e.yml
├── package.json
└── README.md
/.env:
--------------------------------------------------------------------------------
1 | GENERATE_SOURCEMAP = false
--------------------------------------------------------------------------------
/public/ads.txt:
--------------------------------------------------------------------------------
1 | google.com, pub-6118980043742623, DIRECT, f08c47fec0942fa0
--------------------------------------------------------------------------------
/api/feedback/sample.dat:
--------------------------------------------------------------------------------
1 | {
2 | "bpm": "120",
3 | "isCorrect": true
4 | }
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/images/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/demo.gif
--------------------------------------------------------------------------------
/api/.funcignore:
--------------------------------------------------------------------------------
1 | *.js.map
2 | *.ts
3 | .git*
4 | .vscode
5 | local.settings.json
6 | test
7 | tsconfig.json
--------------------------------------------------------------------------------
/api/proxies.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json.schemastore.org/proxies",
3 | "proxies": {}
4 | }
5 |
--------------------------------------------------------------------------------
/public/images/cloud/pr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/pr.png
--------------------------------------------------------------------------------
/public/images/screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/screen.png
--------------------------------------------------------------------------------
/public/images/social.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/social.png
--------------------------------------------------------------------------------
/public/images/cloud/role.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/role.png
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "ms-azuretools.vscode-azurefunctions"
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/public/images/cloud/actions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/actions.png
--------------------------------------------------------------------------------
/public/images/cloud/domains.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/domains.png
--------------------------------------------------------------------------------
/public/images/cloud/invite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/invite.png
--------------------------------------------------------------------------------
/public/images/cloud/portal.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/portal.gif
--------------------------------------------------------------------------------
/public/images/cloud/update.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/update.png
--------------------------------------------------------------------------------
/public/images/cloud/vscode.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/vscode.gif
--------------------------------------------------------------------------------
/public/images/cloud/function.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/function.png
--------------------------------------------------------------------------------
/public/images/cloud/functions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/functions.png
--------------------------------------------------------------------------------
/public/samples/bpmtechno-120.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/samples/bpmtechno-120.mp3
--------------------------------------------------------------------------------
/public/images/cloud/environments.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/cloud/environments.png
--------------------------------------------------------------------------------
/public/images/icons/icon-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/icons/icon-192x192.png
--------------------------------------------------------------------------------
/public/images/icons/icon-256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/icons/icon-256x256.png
--------------------------------------------------------------------------------
/public/images/icons/icon-384x384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/icons/icon-384x384.png
--------------------------------------------------------------------------------
/public/images/icons/icon-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/icons/icon-512x512.png
--------------------------------------------------------------------------------
/public/images/screenshots/wide-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/screenshots/wide-1.png
--------------------------------------------------------------------------------
/public/images/screenshots/wide-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/screenshots/wide-2.png
--------------------------------------------------------------------------------
/public/images/shortcuts/upload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/shortcuts/upload.png
--------------------------------------------------------------------------------
/public/images/screenshots/narrow-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/screenshots/narrow-1.png
--------------------------------------------------------------------------------
/public/images/screenshots/narrow-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/webmaxru/bpm-counter/HEAD/public/images/screenshots/narrow-2.png
--------------------------------------------------------------------------------
/.well-known/web-app-origin-association:
--------------------------------------------------------------------------------
1 | {
2 | "web_apps": [
3 | {
4 | "web_app_identity": "https://bpm-in.push.foo"
5 | }
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "api",
3 | "version": "1.0.0",
4 | "description": "",
5 | "scripts": {
6 | "start": "func start",
7 | "test": "echo \"No tests yet...\""
8 | },
9 | "dependencies": {
10 | "applicationinsights": "^2.3.5"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/custom-hint.css:
--------------------------------------------------------------------------------
1 | .custom-hint .react-hint__content {
2 | background-color: #35748c;
3 | border: 1px solid rgba(255, 255, 255, 0.3);
4 | }
5 |
6 | .custom-hint:after {
7 | border-bottom-color: rgba(255, 255, 255, 0.3);
8 | border-top-color: rgba(255, 255, 255, 0.3);
9 | }
10 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "name": "Attach to Node Functions",
6 | "type": "node",
7 | "request": "attach",
8 | "port": 9229,
9 | "preLaunchTask": "func: host start"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/public/assetlinks.json:
--------------------------------------------------------------------------------
1 | [{
2 | "relation": ["delegate_permission/common.handle_all_urls"],
3 | "target" : { "namespace": "android_app", "package_name": "no.bpmtech.twa",
4 | "sha256_cert_fingerprints": ["EB:4A:CA:4B:33:AB:06:BE:1E:8A:D0:71:B3:96:94:DB:AB:41:83:BE:E3:9F:0D:5B:11:4A:86:82:4F:0E:74:84"] }
5 | }
6 | ]
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "azureFunctions.deploySubpath": "api",
3 | "azureFunctions.postDeployTask": "npm install (functions)",
4 | "azureFunctions.projectLanguage": "JavaScript",
5 | "azureFunctions.projectRuntime": "~3",
6 | "debug.internalConsoleOptions": "neverOpen",
7 | "azureFunctions.preDeployTask": "npm prune (functions)"
8 | }
--------------------------------------------------------------------------------
/api/host.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0",
3 | "logging": {
4 | "applicationInsights": {
5 | "samplingSettings": {
6 | "isEnabled": true,
7 | "excludedTypes": "Request"
8 | }
9 | }
10 | },
11 | "extensionBundle": {
12 | "id": "Microsoft.Azure.Functions.ExtensionBundle",
13 | "version": "[2.*, 3.0.0)"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/Admin.js:
--------------------------------------------------------------------------------
1 | function Admin() {
2 | return (
3 | Admin
5 |
6 | /account
7 | Account
8 |
9 |
10 |
11 |
12 | /.auth/logout
13 | Log out
14 | Log in
5 |
6 | /.auth/login/twitter
7 |
8 | Log in with Twitter
9 |
10 |
11 |
12 | /.auth/login/github
13 |
14 | Log in with GitHub
15 |
16 |
17 |
18 | /.auth/login/aad
19 |
20 | Log in with Azure Active Directory
21 |
22 | (disabled for the demo purposes)
23 |
24 |
25 | /.auth/login/twitter?post_login_redirect_uri=/account
26 |
27 | Log in with Twitter with redirect to /account
28 |
29 |
30 | /.auth/login/github?post_login_redirect_uri=/account
31 |
32 | Log in with GitHub with redirect to /admin
33 |
34 |
Loading...
37 | ) : ( 38 | <> 39 | {clientPrincipal ? ( 40 | <> 41 |/.auth/me42 |
/.auth/logout52 | Log out 53 | 54 |
/.auth/purge/twitter58 | 59 | Remove personal information for Twitter as a provider 60 | 61 | 62 |
/.auth/purge/github66 | 67 | Remove personal information for GitHub as a provider 68 | 69 | > 70 | ) : ( 71 |
Not logged in. Log in here.
72 | )} 73 | > 74 | )} 75 |Does {this.props.bpm} sound correct?
73 | 80 | 81 | 82 |103 | Return to real-time BPM detection 104 |
105 | 106 |Maxim Salnikov operates the BPM Techno application, which provides the SERVICE.
73 | 74 |This page is used to inform application visitors regarding our policies with the collection, use, and disclosure of Personal Information if anyone decided to use our Service, the BPM Techno application.
75 | 76 |If you choose to use our Service, then you agree to the collection and use of information in relation with this policy. The Personal Information that we collect are used for providing and improving the Service. We will not use or share your information with anyone except as described in this Privacy Policy.
77 | 78 |The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at BPM Techno application, unless otherwise defined in this Privacy Policy.
79 | 80 |For a better experience while using our Service, we may require you to provide us with certain personally identifiable information, including but not limited to your name, phone number, and postal address. The information that we collect will be used to contact or identify you.
83 | 84 |We want to inform you that whenever you visit our Service, we collect information that your browser sends to us that is called Log Data. This Log Data may include information such as your computer’s Internet Protocol ("IP") address, browser version, pages of our Service that you visit, the time and date of your visit, the time spent on those pages, and other statistics.
87 | 88 |Cookies are files with small amount of data that is commonly used an anonymous unique identifier. These are sent to your browser from the application that you visit and are stored on your computer’s hard drive.
91 | 92 |Our application uses these "cookies" to collection information and to improve our Service. You have the option to either accept or refuse these cookies, and know when a cookie is being sent to your computer. If you choose to refuse our cookies, you may not be able to use some portions of our Service.
93 | 94 |We may employ third-party companies and individuals due to the following reasons:
97 | 98 |We want to inform our Service users that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.
106 | 107 |We value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and we cannot guarantee its absolute security.
110 | 111 |Our Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by us. Therefore, we strongly advise you to review the Privacy Policy of these websites. We have no control over, and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.
114 | 115 |We may update our Privacy Policy from time to time. Thus, we advise you to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately, after they are posted on this page.
118 | 119 |If you have any questions or suggestions about our Privacy Policy, do not hesitate to contact us.
122 | 123 |You will be asked to provide access to your microphone.
207 |App does not send any audio stream data to the servers.
208 | 209 |
210 |
229 |
250 |
251 | Hide sample file
252 |
253 |
254 |
259 |
260 |
261 | Play it loud! It takes 5-30 seconds to detect correct BPM (120).{' '}
262 |
263 |
266 | 267 | Show sample file 268 | 269 |
270 | )} 271 |86 | Built by Maxim Salnikov. I 87 | will be happy to see your feedback and contributions in{' '} 88 | 89 | the project GitHub repo 90 | 91 | . 92 |
93 |95 | 96 | GitHub repo with a step-by-step demo guide 97 | 98 |
99 |/login106 | Common login page 107 |
/.auth/login/twitter110 | Log in with Twitter 111 |
/.auth/login/github114 | Log in with GitHub 115 |
/.auth/me118 | 121 | {clientPrincipal ? ( 122 |
Not logged in
130 | )} 131 |/.auth/logout133 | Log out 134 |
/.auth/purge/twitter137 | 138 | Remove personal information for Twitter as a provider 139 | 140 |
/.auth/purge/github143 | 144 | Remove personal information for GitHub as a provider 145 | 146 |
167 | Use staticwebapp.config.json ( 168 | 169 | sample 170 | 171 | ) in the app route 172 |
173 |/login174 | Log in 175 |
/logout178 | Log out 179 |
/account182 | Account - for "authenticated" only 183 |
/admin186 | Admin - for "administrator" only 187 |
/aboutme190 | Redirect 301 191 |
Here are some links to help you get started:
197 |248 | Questions? Contact 249 | Maxim Salnikov 250 |
251 |
4 |
5 |
](https://youtu.be/o9BIK5QENJU)
20 |
21 | *(click to watch on YouTube)*
22 |
23 | ## Flow and resources for the Azure Static Web Apps features demo
24 |
25 | ### Installation
26 |
27 | ```shell
28 | git clone https://github.com/webmaxru/bpm-counter.git
29 | cd bpm-counter
30 | npm install
31 |
32 | # Installing tools for Static Web Apps and Azure Functions
33 | npm install -g @azure/static-web-apps-cli
34 | npm install -g azure-functions-core-tools@3 --unsafe-perm true
35 | ```
36 |
37 | ### Starting local development server
38 |
39 | ```shell
40 | # Instead of CRA's "npm start" we use SWA CLI's command to start everything at once
41 | swa start http://localhost:3000 --run "npm start" --api-location ./api
42 | ```
43 |
44 | Open [http://localhost:4280](http://localhost:4280) in your browser.
45 |
46 | ### Deploying to Azure
47 |
48 | To deploy this project to Azure, you need to fork this repo to your own GitHub account. You will also need an Azure subscription. If you don't have it, you can [get Azure subscription here for free](https://aka.ms/free-azure-pass) with $200 credit.
49 |
50 | *Please note, that Azure Static Web Apps service has a [generous free tier](https://azure.microsoft.com/en-us/pricing/details/app-service/static/?ocid=aid3040965) which is enough for many types of the personal projects.*
51 |
52 | After you have the repo in your GitHub account, and Azure subscription ready, use an [Azure Static Web Apps extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestaticwebapps) or [Azure Portal](https://portal.azure.com/?feature.customportal=false#create/Microsoft.StaticApp) to create an SWA resource.
53 |
54 |
55 |
56 | - or -
57 |
58 |
71 |
72 | - A GitHub Actions file will be created in `.github/workflows` folder of your repo. Similar to [the one](https://github.com/webmaxru/bpm-counter/blob/main/.github/workflows/azure-static-web-apps-mango-mud-0136f961e.yml) in the original repo.
73 |
74 | You are now ready to explore the Azure Static Web Apps features.
75 |
76 | ### Automatic deployment on code change
77 |
78 | 1. Do any code change in the application. Something that will be clearly visible on the first page, for example [app name](https://github.com/webmaxru/bpm-counter/blob/main/src/App.js#L70) in the header.
79 | 2. Commit and push the changes to `main` branch (or the branch you specified during resource creation).
80 | 3. Go to [Actions](https://github.com/webmaxru/bpm-counter/actions) page of your repo to make sure that the workflow is running.
81 |
82 | [
](https://github.com/webmaxru/bpm-counter/actions)
83 |
84 | 4. On completion, open your website in a browser, you will see the new version.
85 |
86 | **Please note, this is a service worker-driven application, so you will see the prompt to reload the page.**
87 |
88 |
89 |
90 | ### Staging environments
91 |
92 | You can review pull requests in pre-production environment before they are merged to the main branch.
93 |
94 | 1. Create a branch for your new feature.
95 |
96 | ```shell
97 | git checkout -b new-feature
98 | ```
99 |
100 | Do any code change in the application. Something that will be clearly visible on the first page, for example [change background color](https://github.com/webmaxru/bpm-counter/blob/main/src/index.css#L16).
101 |
102 | 2. Commit and push the changes to the branch.
103 |
104 | ```shell
105 | git add .
106 | git commit -m "New feature"
107 | git push origin new-feature
108 | ```
109 |
110 | 3. Go to you GitHub repo page and [create a new Pull Request](https://github.com/webmaxru/bpm-counter/compare/new-feature?expand=1) from the branch.
111 |
112 | 4. Go to [Actions](https://github.com/webmaxru/bpm-counter/actions) page of your repo to make sure that the workflow is running.
113 |
114 | [
](https://github.com/webmaxru/bpm-counter/actions)
115 |
116 | 5. On completion, you will have a new version of the website deployed to Azure to a [new URL](https://mango-mud-0136f961e-2.westus2.azurestaticapps.net/). You can get this URL either from the workflow output on Azure or in the Azure Portal on Environments tab. GitHub Actions bot will also post this URL to your Pull Request [comments](https://github.com/webmaxru/bpm-counter/pull/2).
117 |
118 | 6. Now, you can run various tests on your new version.
119 |
120 | If the new version looks good and you merge this Pull Request to the main (tracked by SWA) branch, the workflow will automatically deploy the new version to this tracked branch and delete staging environment.
121 |
122 |
123 |
124 | **Please note, staged versions of your application are currently accessible publicly by their URL, even if your GitHub repository is private.**
125 |
126 | [🗎 Documentation](https://docs.microsoft.com/en-us/azure/static-web-apps/review-publish-pull-requests?ocid=aid3040965)
127 |
128 | ### API Using Azure Functions
129 |
130 | You can use the [Azure Functions](https://azure.microsoft.com/en-us/services/functions/?ocid=aid3040965) to build your own API for your static web app. The simplest option is using Managed Functions option: all Azure Functions you create in `api` directory will be automatically deployed to the SWA. In this project, we use [`feedback` function](https://github.com/webmaxru/bpm-counter/blob/main/api/feedback/index.js) to gather statistics on correct or wrong BPMs detected.
131 |
132 | To test it even without the music playing, you can pass a "hardcoded" BPM value to the application: [by using bpm parameter](https://bpmtech.no/?bpm=120). How to test it:
133 |
134 | 1. Click "Start listening" button.
135 | 2. Click "Thumbs up" button.
136 | 3. Check the network POST request made to `https://bpmtech.no/api/feedback` endpoint and its response.
137 |
138 | How to create a new API function:
139 |
140 | 1. Use "Create HTTP Function" button in VS Code extension.
141 |
142 |
143 |
144 | 2. Follow the creation wizard.
145 | 3. Write your code.
146 | 4. Commit and push the changes to the branch.
147 | 5. Your function will be automatically deployed to the SWA.
148 |
149 |
150 |
151 | [🗎 Documentation](https://docs.microsoft.com/en-us/azure/static-web-apps/add-api?ocid=aid3040965)
152 |
153 | ### Routing
154 |
155 | Azure SWA supports custom routing which allows you to:
156 |
157 | - Set up redirects
158 | - Organize navigation fallback for the single-page applications
159 | - Set up custom headers
160 | - Register MIME types
161 | - Define custom pages for HTTP errors
162 | - Protect resources by a role-based access control (RBAC)
163 |
164 | You configure the rules in [staticwebapp.config.json](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json) which you can put anywhere in the application folder of the repo, there is no requirement to put it in the output (public) folder).
165 |
166 | How to test it:
167 |
168 | 1. Go directly to [/about](https://bpmtech.no/about) page. You will see the application, not error 404 because of the [navigation fallback](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json#L39) rule.
169 | 2. Go to [any non-existing resource](https://bpmtech.no/images/nopic.jpg) from the navigationFallback exclude list. You will see the custom 404 error page configured in [this](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json#L45) rule.
170 | 3. Check the response headers. They contain "X-Powered-By: Maxim Salnikov and Azure Static Web Apps" set on [this line](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json#L59).
171 | 4. Go to [/aboutme](https://bpmtech.no/aboutme) page. You will be redirected to [/about](https://bpmtech.no/about) because of [this](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json#L34) rule.
172 |
173 | **Please note, the hosted application is controlled by a service worker. So after the first load, the routing might look not exactly like explained above. To test the app without a service worker, start a new browser session in Private/Incognito mode.**
174 |
175 | [🗎 Documentation](https://docs.microsoft.com/en-us/azure/app-service/app-service-web-routing-overview?ocid=aid3040965)
176 |
177 | ### Authentication
178 |
179 | With the help of Azure Static Web Apps, you can protect your application resources with the role-based access control (RBAC).
180 |
181 | Setting up authentication:
182 |
183 | 1. You specify the role(s) needed to access particular URLs in the [staticwebapp.config.json](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json) file. There are two built-in roles: `anonymous` (for all users) and `authenticated` (for those who are logged in).
184 | 2. If the user tries to access URL without the required role, they will get error 401. You might want to set up a [redirect](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json#L48) to the login page.
185 | 3. To let users log in, you direct users to one of the built-in identity providers (Azure Active Directory, GitHub, Twitter) login pages. For example, [/.auth/login/twitter](https://bpmtech.no/.auth/login/twitter). (You can also create a custom URL for this page using [routing rules](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json#L22).). The folder `.auth` on your Azure SWA project is built-in, it's so called *system folder* which contains some useful endpoints.
186 | 4. After logging in using the selected identity provider and giving consent on sharing personal information (email or user handle), the user will be redirected back to the application. And if the role is correctly set, they will get an access to the requested URL.
187 | 5. To give user a custom role (for example, `administrator`), you use "Role management" tab in the Azure Portal. Click on "Invite" button, fill in the form and click "Generate". You will receive a link to send to the user to accept the role.
188 |
189 |
190 |
191 | You can manage the users and roles in the "Role management" tab.
192 |
193 |
194 |
195 | 6. You can read authenticated user credentials (for example to implement some logic in UI) by sending request to [/.auth/me](https://bpmtech.no/.auth/me) endpoint. To check authentication info of the API calls, you read the `x-ms-client-principal` header in the request.
196 | 7. To log out, you redirect users to [/.auth/logout](https://bpmtech.no/.auth/logout) page.
197 | 8. To remove personally identifying information (email or user handle) from the application, you direct users to the link that is related to a particular identity provider: [/.auth/purge/twitter](https://bpmtech.no/.auth/purge/twitter).
198 |
199 | Demo:
200 |
201 | 1. Try to access [/account](https://bpmtech.no/account) page. It's configured to be available only for `authenticated` users by [this rule](https://github.com/webmaxru/bpm-counter/blob/main/src/staticwebapp.config.json#L4). You will be redirected to the Twitter login page and asked for consent.
202 | 2. After logging in with Twitter, you will be redirected back to the application, and now can access [/account](https://bpmtech.no/account) page.
203 | 3. Open [/.auth/me](https://bpmtech.no/.auth/me) URL in the separate tab to see the information returned by the server.
204 | 4. Log out by going to [/.auth/logout](https://bpmtech.no/.auth/logout) URL.
205 | 5. You can repeat the steps above to test the custom role needed to access [/admin](https://bpmtech.no/admin) page. In this case, you need to give the user the role `administrator` as described above.
206 |
207 | [🗎 Documentation](https://docs.microsoft.com/en-us/azure/static-web-apps/authentication-authorization?ocid=aid3040965)
208 |
209 | ## React-only version (no cloud)
210 |
211 | In the project directory, you can run:
212 |
213 | ### `npm run start`
214 |
215 | Runs the app in the development mode.\
216 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
217 |
218 | The page will reload if you make edits.\
219 | You will also see any lint errors in the console.
220 |
221 | The service worker is not in use in the development environment.
222 |
223 | ### `npm run build`
224 |
225 | Builds the app for production to the `build` folder.\
226 | It correctly bundles React in production mode and optimizes the build for the best performance.
227 |
228 | The build is minified and the filenames include the hashes.\
229 | Your app is ready to be deployed!
230 |
231 | The production-ready service worker will also be generated.
232 |
233 | ## About
234 |
235 | ### Credits
236 |
237 | - Real-time BPM detection is based on [realtime-bpm-analyzer](https://www.npmjs.com/package/realtime-bpm-analyzer) library by [David Lepaux](https://github.com/dlepaux)
238 | - BPM detection in the files is based on [bpm-detective](https://www.npmjs.com/package/bpm-detective) library by [Carl Törnqvist](https://github.com/tornqvist/)
239 | - Spectrum analyzer is based [audioMotion-analyzer](https://www.npmjs.com/package/audiomotion-analyzer) library by [Henrique Vianna](https://github.com/hvianna/)
240 |
241 | ### Author
242 |
243 | [Maxim Salnikov](https://twitter.com/webmaxru). Feel free to contact me if you have any questions about the project, PWA, Azure Static Web Apps.
244 |
--------------------------------------------------------------------------------
/api/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "api",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "api",
9 | "version": "1.0.0",
10 | "dependencies": {
11 | "applicationinsights": "^2.3.5"
12 | },
13 | "devDependencies": {}
14 | },
15 | "node_modules/@azure/abort-controller": {
16 | "version": "1.1.0",
17 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
18 | "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==",
19 | "dependencies": {
20 | "tslib": "^2.2.0"
21 | },
22 | "engines": {
23 | "node": ">=12.0.0"
24 | }
25 | },
26 | "node_modules/@azure/core-auth": {
27 | "version": "1.4.0",
28 | "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz",
29 | "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==",
30 | "dependencies": {
31 | "@azure/abort-controller": "^1.0.0",
32 | "tslib": "^2.2.0"
33 | },
34 | "engines": {
35 | "node": ">=12.0.0"
36 | }
37 | },
38 | "node_modules/@azure/core-http": {
39 | "version": "2.2.7",
40 | "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-2.2.7.tgz",
41 | "integrity": "sha512-TyGMeDm90mkRS8XzSQbSMD+TqnWL1XKGCh0x0QVGMD8COH2yU0q5SaHm/IBEBkzcq0u73NhS/p57T3KVSgUFqQ==",
42 | "dependencies": {
43 | "@azure/abort-controller": "^1.0.0",
44 | "@azure/core-auth": "^1.3.0",
45 | "@azure/core-tracing": "1.0.0-preview.13",
46 | "@azure/core-util": "^1.1.0",
47 | "@azure/logger": "^1.0.0",
48 | "@types/node-fetch": "^2.5.0",
49 | "@types/tunnel": "^0.0.3",
50 | "form-data": "^4.0.0",
51 | "node-fetch": "^2.6.7",
52 | "process": "^0.11.10",
53 | "tough-cookie": "^4.0.0",
54 | "tslib": "^2.2.0",
55 | "tunnel": "^0.0.6",
56 | "uuid": "^8.3.0",
57 | "xml2js": "^0.4.19"
58 | },
59 | "engines": {
60 | "node": ">=12.0.0"
61 | }
62 | },
63 | "node_modules/@azure/core-tracing": {
64 | "version": "1.0.0-preview.13",
65 | "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
66 | "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
67 | "dependencies": {
68 | "@opentelemetry/api": "^1.0.1",
69 | "tslib": "^2.2.0"
70 | },
71 | "engines": {
72 | "node": ">=12.0.0"
73 | }
74 | },
75 | "node_modules/@azure/core-util": {
76 | "version": "1.1.1",
77 | "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.1.1.tgz",
78 | "integrity": "sha512-A4TBYVQCtHOigFb2ETiiKFDocBoI1Zk2Ui1KpI42aJSIDexF7DHQFpnjonltXAIU/ceH+1fsZAWWgvX6/AKzog==",
79 | "dependencies": {
80 | "@azure/abort-controller": "^1.0.0",
81 | "tslib": "^2.2.0"
82 | },
83 | "engines": {
84 | "node": ">=12.0.0"
85 | }
86 | },
87 | "node_modules/@azure/logger": {
88 | "version": "1.0.3",
89 | "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.3.tgz",
90 | "integrity": "sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==",
91 | "dependencies": {
92 | "tslib": "^2.2.0"
93 | },
94 | "engines": {
95 | "node": ">=12.0.0"
96 | }
97 | },
98 | "node_modules/@microsoft/applicationinsights-web-snippet": {
99 | "version": "1.0.1",
100 | "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz",
101 | "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ=="
102 | },
103 | "node_modules/@opentelemetry/api": {
104 | "version": "1.2.0",
105 | "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.2.0.tgz",
106 | "integrity": "sha512-0nBr+VZNKm9tvNDZFstI3Pq1fCTEDK5OZTnVKNvBNAKgd0yIvmwsP4m61rEv7ZP+tOUjWJhROpxK5MsnlF911g==",
107 | "engines": {
108 | "node": ">=8.0.0"
109 | }
110 | },
111 | "node_modules/@opentelemetry/core": {
112 | "version": "1.7.0",
113 | "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.7.0.tgz",
114 | "integrity": "sha512-AVqAi5uc8DrKJBimCTFUT4iFI+5eXpo4sYmGbQ0CypG0piOTHE2g9c5aSoTGYXu3CzOmJZf7pT6Xh+nwm5d6yQ==",
115 | "dependencies": {
116 | "@opentelemetry/semantic-conventions": "1.7.0"
117 | },
118 | "engines": {
119 | "node": ">=14"
120 | },
121 | "peerDependencies": {
122 | "@opentelemetry/api": ">=1.0.0 <1.3.0"
123 | }
124 | },
125 | "node_modules/@opentelemetry/resources": {
126 | "version": "1.7.0",
127 | "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.7.0.tgz",
128 | "integrity": "sha512-u1M0yZotkjyKx8dj+46Sg5thwtOTBmtRieNXqdCRiWUp6SfFiIP0bI+1XK3LhuXqXkBXA1awJZaTqKduNMStRg==",
129 | "dependencies": {
130 | "@opentelemetry/core": "1.7.0",
131 | "@opentelemetry/semantic-conventions": "1.7.0"
132 | },
133 | "engines": {
134 | "node": ">=14"
135 | },
136 | "peerDependencies": {
137 | "@opentelemetry/api": ">=1.0.0 <1.3.0"
138 | }
139 | },
140 | "node_modules/@opentelemetry/sdk-trace-base": {
141 | "version": "1.7.0",
142 | "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.7.0.tgz",
143 | "integrity": "sha512-Iz84C+FVOskmauh9FNnj4+VrA+hG5o+tkMzXuoesvSfunVSioXib0syVFeNXwOm4+M5GdWCuW632LVjqEXStIg==",
144 | "dependencies": {
145 | "@opentelemetry/core": "1.7.0",
146 | "@opentelemetry/resources": "1.7.0",
147 | "@opentelemetry/semantic-conventions": "1.7.0"
148 | },
149 | "engines": {
150 | "node": ">=14"
151 | },
152 | "peerDependencies": {
153 | "@opentelemetry/api": ">=1.0.0 <1.3.0"
154 | }
155 | },
156 | "node_modules/@opentelemetry/semantic-conventions": {
157 | "version": "1.7.0",
158 | "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.7.0.tgz",
159 | "integrity": "sha512-FGBx/Qd09lMaqQcogCHyYrFEpTx4cAjeS+48lMIR12z7LdH+zofGDVQSubN59nL6IpubfKqTeIDu9rNO28iHVA==",
160 | "engines": {
161 | "node": ">=14"
162 | }
163 | },
164 | "node_modules/@types/node": {
165 | "version": "18.8.4",
166 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.4.tgz",
167 | "integrity": "sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow=="
168 | },
169 | "node_modules/@types/node-fetch": {
170 | "version": "2.6.2",
171 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
172 | "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
173 | "dependencies": {
174 | "@types/node": "*",
175 | "form-data": "^3.0.0"
176 | }
177 | },
178 | "node_modules/@types/node-fetch/node_modules/form-data": {
179 | "version": "3.0.1",
180 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
181 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
182 | "dependencies": {
183 | "asynckit": "^0.4.0",
184 | "combined-stream": "^1.0.8",
185 | "mime-types": "^2.1.12"
186 | },
187 | "engines": {
188 | "node": ">= 6"
189 | }
190 | },
191 | "node_modules/@types/tunnel": {
192 | "version": "0.0.3",
193 | "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz",
194 | "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==",
195 | "dependencies": {
196 | "@types/node": "*"
197 | }
198 | },
199 | "node_modules/applicationinsights": {
200 | "version": "2.3.5",
201 | "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.3.5.tgz",
202 | "integrity": "sha512-QU6EEZbobj9NL2o/XLIDStCMfwrrLwFrbJrDw9ih1wb5bz7v0cwUm6kPXiKtNAAny4hWp9/BtBhtFKvc3tWZ3w==",
203 | "dependencies": {
204 | "@azure/core-http": "^2.2.3",
205 | "@microsoft/applicationinsights-web-snippet": "^1.0.1",
206 | "@opentelemetry/api": "^1.0.4",
207 | "@opentelemetry/core": "^1.0.1",
208 | "@opentelemetry/sdk-trace-base": "^1.0.1",
209 | "@opentelemetry/semantic-conventions": "^1.0.1",
210 | "cls-hooked": "^4.2.2",
211 | "continuation-local-storage": "^3.2.1",
212 | "diagnostic-channel": "1.1.0",
213 | "diagnostic-channel-publishers": "1.0.5"
214 | },
215 | "engines": {
216 | "node": ">=8.0.0"
217 | },
218 | "peerDependencies": {
219 | "applicationinsights-native-metrics": "*"
220 | },
221 | "peerDependenciesMeta": {
222 | "applicationinsights-native-metrics": {
223 | "optional": true
224 | }
225 | }
226 | },
227 | "node_modules/async-hook-jl": {
228 | "version": "1.7.6",
229 | "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz",
230 | "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==",
231 | "dependencies": {
232 | "stack-chain": "^1.3.7"
233 | },
234 | "engines": {
235 | "node": "^4.7 || >=6.9 || >=7.3"
236 | }
237 | },
238 | "node_modules/async-listener": {
239 | "version": "0.6.10",
240 | "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz",
241 | "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==",
242 | "dependencies": {
243 | "semver": "^5.3.0",
244 | "shimmer": "^1.1.0"
245 | },
246 | "engines": {
247 | "node": "<=0.11.8 || >0.11.10"
248 | }
249 | },
250 | "node_modules/asynckit": {
251 | "version": "0.4.0",
252 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
253 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
254 | },
255 | "node_modules/cls-hooked": {
256 | "version": "4.2.2",
257 | "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz",
258 | "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==",
259 | "dependencies": {
260 | "async-hook-jl": "^1.7.6",
261 | "emitter-listener": "^1.0.1",
262 | "semver": "^5.4.1"
263 | },
264 | "engines": {
265 | "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1"
266 | }
267 | },
268 | "node_modules/combined-stream": {
269 | "version": "1.0.8",
270 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
271 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
272 | "dependencies": {
273 | "delayed-stream": "~1.0.0"
274 | },
275 | "engines": {
276 | "node": ">= 0.8"
277 | }
278 | },
279 | "node_modules/continuation-local-storage": {
280 | "version": "3.2.1",
281 | "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz",
282 | "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==",
283 | "dependencies": {
284 | "async-listener": "^0.6.0",
285 | "emitter-listener": "^1.1.1"
286 | }
287 | },
288 | "node_modules/delayed-stream": {
289 | "version": "1.0.0",
290 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
291 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
292 | "engines": {
293 | "node": ">=0.4.0"
294 | }
295 | },
296 | "node_modules/diagnostic-channel": {
297 | "version": "1.1.0",
298 | "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.0.tgz",
299 | "integrity": "sha512-fwujyMe1gj6rk6dYi9hMZm0c8Mz8NDMVl2LB4iaYh3+LIAThZC8RKFGXWG0IML2OxAit/ZFRgZhMkhQ3d/bobQ==",
300 | "dependencies": {
301 | "semver": "^5.3.0"
302 | }
303 | },
304 | "node_modules/diagnostic-channel-publishers": {
305 | "version": "1.0.5",
306 | "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.5.tgz",
307 | "integrity": "sha512-dJwUS0915pkjjimPJVDnS/QQHsH0aOYhnZsLJdnZIMOrB+csj8RnZhWTuwnm8R5v3Z7OZs+ksv5luC14DGB7eg==",
308 | "peerDependencies": {
309 | "diagnostic-channel": "*"
310 | }
311 | },
312 | "node_modules/emitter-listener": {
313 | "version": "1.1.2",
314 | "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz",
315 | "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==",
316 | "dependencies": {
317 | "shimmer": "^1.2.0"
318 | }
319 | },
320 | "node_modules/form-data": {
321 | "version": "4.0.0",
322 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
323 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
324 | "dependencies": {
325 | "asynckit": "^0.4.0",
326 | "combined-stream": "^1.0.8",
327 | "mime-types": "^2.1.12"
328 | },
329 | "engines": {
330 | "node": ">= 6"
331 | }
332 | },
333 | "node_modules/mime-db": {
334 | "version": "1.52.0",
335 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
336 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
337 | "engines": {
338 | "node": ">= 0.6"
339 | }
340 | },
341 | "node_modules/mime-types": {
342 | "version": "2.1.35",
343 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
344 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
345 | "dependencies": {
346 | "mime-db": "1.52.0"
347 | },
348 | "engines": {
349 | "node": ">= 0.6"
350 | }
351 | },
352 | "node_modules/node-fetch": {
353 | "version": "2.6.7",
354 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
355 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
356 | "dependencies": {
357 | "whatwg-url": "^5.0.0"
358 | },
359 | "engines": {
360 | "node": "4.x || >=6.0.0"
361 | },
362 | "peerDependencies": {
363 | "encoding": "^0.1.0"
364 | },
365 | "peerDependenciesMeta": {
366 | "encoding": {
367 | "optional": true
368 | }
369 | }
370 | },
371 | "node_modules/process": {
372 | "version": "0.11.10",
373 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
374 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
375 | "engines": {
376 | "node": ">= 0.6.0"
377 | }
378 | },
379 | "node_modules/psl": {
380 | "version": "1.9.0",
381 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
382 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
383 | },
384 | "node_modules/punycode": {
385 | "version": "2.1.1",
386 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
387 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
388 | "engines": {
389 | "node": ">=6"
390 | }
391 | },
392 | "node_modules/querystringify": {
393 | "version": "2.2.0",
394 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
395 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
396 | },
397 | "node_modules/requires-port": {
398 | "version": "1.0.0",
399 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
400 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
401 | },
402 | "node_modules/sax": {
403 | "version": "1.2.4",
404 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
405 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
406 | },
407 | "node_modules/semver": {
408 | "version": "5.7.1",
409 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
410 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
411 | "bin": {
412 | "semver": "bin/semver"
413 | }
414 | },
415 | "node_modules/shimmer": {
416 | "version": "1.2.1",
417 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
418 | "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
419 | },
420 | "node_modules/stack-chain": {
421 | "version": "1.3.7",
422 | "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz",
423 | "integrity": "sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug=="
424 | },
425 | "node_modules/tough-cookie": {
426 | "version": "4.1.2",
427 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
428 | "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
429 | "dependencies": {
430 | "psl": "^1.1.33",
431 | "punycode": "^2.1.1",
432 | "universalify": "^0.2.0",
433 | "url-parse": "^1.5.3"
434 | },
435 | "engines": {
436 | "node": ">=6"
437 | }
438 | },
439 | "node_modules/tr46": {
440 | "version": "0.0.3",
441 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
442 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
443 | },
444 | "node_modules/tslib": {
445 | "version": "2.4.0",
446 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
447 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
448 | },
449 | "node_modules/tunnel": {
450 | "version": "0.0.6",
451 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
452 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
453 | "engines": {
454 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
455 | }
456 | },
457 | "node_modules/universalify": {
458 | "version": "0.2.0",
459 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
460 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
461 | "engines": {
462 | "node": ">= 4.0.0"
463 | }
464 | },
465 | "node_modules/url-parse": {
466 | "version": "1.5.10",
467 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
468 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
469 | "dependencies": {
470 | "querystringify": "^2.1.1",
471 | "requires-port": "^1.0.0"
472 | }
473 | },
474 | "node_modules/uuid": {
475 | "version": "8.3.2",
476 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
477 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
478 | "bin": {
479 | "uuid": "dist/bin/uuid"
480 | }
481 | },
482 | "node_modules/webidl-conversions": {
483 | "version": "3.0.1",
484 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
485 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
486 | },
487 | "node_modules/whatwg-url": {
488 | "version": "5.0.0",
489 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
490 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
491 | "dependencies": {
492 | "tr46": "~0.0.3",
493 | "webidl-conversions": "^3.0.0"
494 | }
495 | },
496 | "node_modules/xml2js": {
497 | "version": "0.4.23",
498 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
499 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
500 | "dependencies": {
501 | "sax": ">=0.6.0",
502 | "xmlbuilder": "~11.0.0"
503 | },
504 | "engines": {
505 | "node": ">=4.0.0"
506 | }
507 | },
508 | "node_modules/xmlbuilder": {
509 | "version": "11.0.1",
510 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
511 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
512 | "engines": {
513 | "node": ">=4.0"
514 | }
515 | }
516 | },
517 | "dependencies": {
518 | "@azure/abort-controller": {
519 | "version": "1.1.0",
520 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
521 | "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==",
522 | "requires": {
523 | "tslib": "^2.2.0"
524 | }
525 | },
526 | "@azure/core-auth": {
527 | "version": "1.4.0",
528 | "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz",
529 | "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==",
530 | "requires": {
531 | "@azure/abort-controller": "^1.0.0",
532 | "tslib": "^2.2.0"
533 | }
534 | },
535 | "@azure/core-http": {
536 | "version": "2.2.7",
537 | "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-2.2.7.tgz",
538 | "integrity": "sha512-TyGMeDm90mkRS8XzSQbSMD+TqnWL1XKGCh0x0QVGMD8COH2yU0q5SaHm/IBEBkzcq0u73NhS/p57T3KVSgUFqQ==",
539 | "requires": {
540 | "@azure/abort-controller": "^1.0.0",
541 | "@azure/core-auth": "^1.3.0",
542 | "@azure/core-tracing": "1.0.0-preview.13",
543 | "@azure/core-util": "^1.1.0",
544 | "@azure/logger": "^1.0.0",
545 | "@types/node-fetch": "^2.5.0",
546 | "@types/tunnel": "^0.0.3",
547 | "form-data": "^4.0.0",
548 | "node-fetch": "^2.6.7",
549 | "process": "^0.11.10",
550 | "tough-cookie": "^4.0.0",
551 | "tslib": "^2.2.0",
552 | "tunnel": "^0.0.6",
553 | "uuid": "^8.3.0",
554 | "xml2js": "^0.4.19"
555 | }
556 | },
557 | "@azure/core-tracing": {
558 | "version": "1.0.0-preview.13",
559 | "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
560 | "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
561 | "requires": {
562 | "@opentelemetry/api": "^1.0.1",
563 | "tslib": "^2.2.0"
564 | }
565 | },
566 | "@azure/core-util": {
567 | "version": "1.1.1",
568 | "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.1.1.tgz",
569 | "integrity": "sha512-A4TBYVQCtHOigFb2ETiiKFDocBoI1Zk2Ui1KpI42aJSIDexF7DHQFpnjonltXAIU/ceH+1fsZAWWgvX6/AKzog==",
570 | "requires": {
571 | "@azure/abort-controller": "^1.0.0",
572 | "tslib": "^2.2.0"
573 | }
574 | },
575 | "@azure/logger": {
576 | "version": "1.0.3",
577 | "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.3.tgz",
578 | "integrity": "sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==",
579 | "requires": {
580 | "tslib": "^2.2.0"
581 | }
582 | },
583 | "@microsoft/applicationinsights-web-snippet": {
584 | "version": "1.0.1",
585 | "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz",
586 | "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ=="
587 | },
588 | "@opentelemetry/api": {
589 | "version": "1.2.0",
590 | "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.2.0.tgz",
591 | "integrity": "sha512-0nBr+VZNKm9tvNDZFstI3Pq1fCTEDK5OZTnVKNvBNAKgd0yIvmwsP4m61rEv7ZP+tOUjWJhROpxK5MsnlF911g=="
592 | },
593 | "@opentelemetry/core": {
594 | "version": "1.7.0",
595 | "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.7.0.tgz",
596 | "integrity": "sha512-AVqAi5uc8DrKJBimCTFUT4iFI+5eXpo4sYmGbQ0CypG0piOTHE2g9c5aSoTGYXu3CzOmJZf7pT6Xh+nwm5d6yQ==",
597 | "requires": {
598 | "@opentelemetry/semantic-conventions": "1.7.0"
599 | }
600 | },
601 | "@opentelemetry/resources": {
602 | "version": "1.7.0",
603 | "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.7.0.tgz",
604 | "integrity": "sha512-u1M0yZotkjyKx8dj+46Sg5thwtOTBmtRieNXqdCRiWUp6SfFiIP0bI+1XK3LhuXqXkBXA1awJZaTqKduNMStRg==",
605 | "requires": {
606 | "@opentelemetry/core": "1.7.0",
607 | "@opentelemetry/semantic-conventions": "1.7.0"
608 | }
609 | },
610 | "@opentelemetry/sdk-trace-base": {
611 | "version": "1.7.0",
612 | "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.7.0.tgz",
613 | "integrity": "sha512-Iz84C+FVOskmauh9FNnj4+VrA+hG5o+tkMzXuoesvSfunVSioXib0syVFeNXwOm4+M5GdWCuW632LVjqEXStIg==",
614 | "requires": {
615 | "@opentelemetry/core": "1.7.0",
616 | "@opentelemetry/resources": "1.7.0",
617 | "@opentelemetry/semantic-conventions": "1.7.0"
618 | }
619 | },
620 | "@opentelemetry/semantic-conventions": {
621 | "version": "1.7.0",
622 | "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.7.0.tgz",
623 | "integrity": "sha512-FGBx/Qd09lMaqQcogCHyYrFEpTx4cAjeS+48lMIR12z7LdH+zofGDVQSubN59nL6IpubfKqTeIDu9rNO28iHVA=="
624 | },
625 | "@types/node": {
626 | "version": "18.8.4",
627 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.4.tgz",
628 | "integrity": "sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow=="
629 | },
630 | "@types/node-fetch": {
631 | "version": "2.6.2",
632 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
633 | "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
634 | "requires": {
635 | "@types/node": "*",
636 | "form-data": "^3.0.0"
637 | },
638 | "dependencies": {
639 | "form-data": {
640 | "version": "3.0.1",
641 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
642 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
643 | "requires": {
644 | "asynckit": "^0.4.0",
645 | "combined-stream": "^1.0.8",
646 | "mime-types": "^2.1.12"
647 | }
648 | }
649 | }
650 | },
651 | "@types/tunnel": {
652 | "version": "0.0.3",
653 | "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz",
654 | "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==",
655 | "requires": {
656 | "@types/node": "*"
657 | }
658 | },
659 | "applicationinsights": {
660 | "version": "2.3.5",
661 | "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.3.5.tgz",
662 | "integrity": "sha512-QU6EEZbobj9NL2o/XLIDStCMfwrrLwFrbJrDw9ih1wb5bz7v0cwUm6kPXiKtNAAny4hWp9/BtBhtFKvc3tWZ3w==",
663 | "requires": {
664 | "@azure/core-http": "^2.2.3",
665 | "@microsoft/applicationinsights-web-snippet": "^1.0.1",
666 | "@opentelemetry/api": "^1.0.4",
667 | "@opentelemetry/core": "^1.0.1",
668 | "@opentelemetry/sdk-trace-base": "^1.0.1",
669 | "@opentelemetry/semantic-conventions": "^1.0.1",
670 | "cls-hooked": "^4.2.2",
671 | "continuation-local-storage": "^3.2.1",
672 | "diagnostic-channel": "1.1.0",
673 | "diagnostic-channel-publishers": "1.0.5"
674 | }
675 | },
676 | "async-hook-jl": {
677 | "version": "1.7.6",
678 | "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz",
679 | "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==",
680 | "requires": {
681 | "stack-chain": "^1.3.7"
682 | }
683 | },
684 | "async-listener": {
685 | "version": "0.6.10",
686 | "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz",
687 | "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==",
688 | "requires": {
689 | "semver": "^5.3.0",
690 | "shimmer": "^1.1.0"
691 | }
692 | },
693 | "asynckit": {
694 | "version": "0.4.0",
695 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
696 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
697 | },
698 | "cls-hooked": {
699 | "version": "4.2.2",
700 | "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz",
701 | "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==",
702 | "requires": {
703 | "async-hook-jl": "^1.7.6",
704 | "emitter-listener": "^1.0.1",
705 | "semver": "^5.4.1"
706 | }
707 | },
708 | "combined-stream": {
709 | "version": "1.0.8",
710 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
711 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
712 | "requires": {
713 | "delayed-stream": "~1.0.0"
714 | }
715 | },
716 | "continuation-local-storage": {
717 | "version": "3.2.1",
718 | "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz",
719 | "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==",
720 | "requires": {
721 | "async-listener": "^0.6.0",
722 | "emitter-listener": "^1.1.1"
723 | }
724 | },
725 | "delayed-stream": {
726 | "version": "1.0.0",
727 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
728 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
729 | },
730 | "diagnostic-channel": {
731 | "version": "1.1.0",
732 | "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.0.tgz",
733 | "integrity": "sha512-fwujyMe1gj6rk6dYi9hMZm0c8Mz8NDMVl2LB4iaYh3+LIAThZC8RKFGXWG0IML2OxAit/ZFRgZhMkhQ3d/bobQ==",
734 | "requires": {
735 | "semver": "^5.3.0"
736 | }
737 | },
738 | "diagnostic-channel-publishers": {
739 | "version": "1.0.5",
740 | "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.5.tgz",
741 | "integrity": "sha512-dJwUS0915pkjjimPJVDnS/QQHsH0aOYhnZsLJdnZIMOrB+csj8RnZhWTuwnm8R5v3Z7OZs+ksv5luC14DGB7eg==",
742 | "requires": {}
743 | },
744 | "emitter-listener": {
745 | "version": "1.1.2",
746 | "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz",
747 | "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==",
748 | "requires": {
749 | "shimmer": "^1.2.0"
750 | }
751 | },
752 | "form-data": {
753 | "version": "4.0.0",
754 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
755 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
756 | "requires": {
757 | "asynckit": "^0.4.0",
758 | "combined-stream": "^1.0.8",
759 | "mime-types": "^2.1.12"
760 | }
761 | },
762 | "mime-db": {
763 | "version": "1.52.0",
764 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
765 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
766 | },
767 | "mime-types": {
768 | "version": "2.1.35",
769 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
770 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
771 | "requires": {
772 | "mime-db": "1.52.0"
773 | }
774 | },
775 | "node-fetch": {
776 | "version": "2.6.7",
777 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
778 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
779 | "requires": {
780 | "whatwg-url": "^5.0.0"
781 | }
782 | },
783 | "process": {
784 | "version": "0.11.10",
785 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
786 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
787 | },
788 | "psl": {
789 | "version": "1.9.0",
790 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
791 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
792 | },
793 | "punycode": {
794 | "version": "2.1.1",
795 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
796 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
797 | },
798 | "querystringify": {
799 | "version": "2.2.0",
800 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
801 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
802 | },
803 | "requires-port": {
804 | "version": "1.0.0",
805 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
806 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
807 | },
808 | "sax": {
809 | "version": "1.2.4",
810 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
811 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
812 | },
813 | "semver": {
814 | "version": "5.7.1",
815 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
816 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
817 | },
818 | "shimmer": {
819 | "version": "1.2.1",
820 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
821 | "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
822 | },
823 | "stack-chain": {
824 | "version": "1.3.7",
825 | "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz",
826 | "integrity": "sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug=="
827 | },
828 | "tough-cookie": {
829 | "version": "4.1.2",
830 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
831 | "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
832 | "requires": {
833 | "psl": "^1.1.33",
834 | "punycode": "^2.1.1",
835 | "universalify": "^0.2.0",
836 | "url-parse": "^1.5.3"
837 | }
838 | },
839 | "tr46": {
840 | "version": "0.0.3",
841 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
842 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
843 | },
844 | "tslib": {
845 | "version": "2.4.0",
846 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
847 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
848 | },
849 | "tunnel": {
850 | "version": "0.0.6",
851 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
852 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
853 | },
854 | "universalify": {
855 | "version": "0.2.0",
856 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
857 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="
858 | },
859 | "url-parse": {
860 | "version": "1.5.10",
861 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
862 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
863 | "requires": {
864 | "querystringify": "^2.1.1",
865 | "requires-port": "^1.0.0"
866 | }
867 | },
868 | "uuid": {
869 | "version": "8.3.2",
870 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
871 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
872 | },
873 | "webidl-conversions": {
874 | "version": "3.0.1",
875 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
876 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
877 | },
878 | "whatwg-url": {
879 | "version": "5.0.0",
880 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
881 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
882 | "requires": {
883 | "tr46": "~0.0.3",
884 | "webidl-conversions": "^3.0.0"
885 | }
886 | },
887 | "xml2js": {
888 | "version": "0.4.23",
889 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
890 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
891 | "requires": {
892 | "sax": ">=0.6.0",
893 | "xmlbuilder": "~11.0.0"
894 | }
895 | },
896 | "xmlbuilder": {
897 | "version": "11.0.1",
898 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
899 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
900 | }
901 | }
902 | }
903 |
--------------------------------------------------------------------------------