diff --git a/.eslintrc.json b/.eslintrc.json index 95c2b9b2..4710cb0d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,8 +4,7 @@ "commonjs": true, "es6": true }, - "plugins": ["prettier"], - "extends": "eslint:recommended", + "extends": "plugin:prettier/recommended", "globals": { "Atomics": "readonly", "SharedArrayBuffer": "readonly" @@ -14,7 +13,6 @@ "ecmaVersion": 2018 }, "rules": { - "prettier/prettier": "error", "no-console": "off" } } diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0cc6e534..21852f1d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -3,7 +3,6 @@ name: Bug report about: Create a report to help us improve title: "Short description of the issue" labels: bug -assignees: jorgeluiso, rubycalling --- #### Describe the bug diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index e137542e..32c483a3 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -3,7 +3,6 @@ name: Feature Request about: Suggest an idea for this project title: "Short description of the feature" labels: enhancement -assignees: jorgeluiso, rubycalling --- #### Is your feature request related to a problem? Please describe. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c14056fa..30ed7d2e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -18,9 +18,8 @@ Also add a link to your own Messenger experience for your reviewer to test the c - [ ] My code follows the code style of this project. - [ ] My change requires a change to the documentation. - [ ] I have updated the documentation accordingly. -- [ ] I have read the **[CONTRIBUTING](https://github.com/fbsamples/original-coast-clothing/blob/master/CONTRIBUTING.md)** document. +- [ ] I have read the **[CONTRIBUTING](https://github.com/fbsamples/original-coast-clothing/blob/main/CONTRIBUTING.md)** document. - [ ] I have added tests to cover my changes. - [ ] All new and existing tests passed. - [ ] The title of my pull request is a short description of the requested changes. -- [ ] I have added @jorgeluiso, @rubycalling as reviewers. - [ ] I have added the label **enhancement** to my pull request. diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..ba84022f --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,28 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: OCC CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: yarn install + - run: yarn run lint diff --git a/.gitignore b/.gitignore index 07299698..a578992c 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,4 @@ node_modules/ .eslintcache # dotenv environment variables file -.env +.env* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..bfbe54b9 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "trailingComma": "none", + "singleQuote": false, + "printWidth": 80 +} diff --git a/.sample.env b/.sample.env index 0c6a1717..f1c5758e 100644 --- a/.sample.env +++ b/.sample.env @@ -1,21 +1,22 @@ # Environment Config -# store your secrets and config variables in here -# only invited collaborators will be able to see your .env values +# Store your secrets and config variables here. +# Only invited collaborators will be able to see your .env values. # Page and Application information PAGE_ID= APP_ID= PAGE_ACCESS_TOKEN= -# Your App secret can be found in App Dashboard -> Seetings -> Basic +# Your App secret can be found in App Dashboard -> Settings -> Basic APP_SECRET= # A random string that is used for the webhook verification request VERIFY_TOKEN= # URL where you host this code -# You can use LocalTunnel or Heroku ex: https://mystic-wind-83.herokuapp.com +# You can use a tunneling service or Heroku ex: https://mystic-wind-83.herokuapp.com +# It must be https, and without trailing slash. APP_URL= # URL of your website where the "shop now" is located @@ -25,4 +26,4 @@ SHOP_URL= # Preferred port PORT=3000 -# note: .env is a shell file so there can't be spaces around = +# Note: .env is a shell file so there can't be spaces around = diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index dc4e74cd..00000000 --- a/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "node" -script: - - "yarn run lint" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 407c17fb..1d0b15f3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,13 +9,13 @@ and for external contributions the recomendation is to file an Issue explaining why the changes would be usefull. Please also add to the issue if you would like to submit a Pull Request to solve the issue. -When submitting a PR please provide the context and is best to reference the +When submitting a PR please provide the context and is best to reference the issue. ## Pull Requests We actively welcome your pull requests. -1. Fork the repo and create your branch from `master`. +1. Fork the repo and create your branch from `main`. 2. If you've added code that should be tested, add tests. 3. If you've changed APIs, update the documentation. 4. Ensure the test suite passes. @@ -36,10 +36,10 @@ Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. In those cases, please go through the process outlined on that page and do not file a public issue. -## Coding Style +## Coding Style * We use Prettier for styling ## License By contributing to Sample Messenger App Original Coast Clothing, you agree that your contributions will be licensed under the LICENSE file in the root directory -of this source tree. \ No newline at end of file +of this source tree. diff --git a/LICENSE b/LICENSE index bc8d312d..de73012f 100644 --- a/LICENSE +++ b/LICENSE @@ -2,7 +2,7 @@ BSD License For Messsenger For Sample Messenger App Original Coast Clothing -Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. +Copyright (c) Meta Platforms, Inc. and its affiliates. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -14,7 +14,7 @@ are permitted provided that the following conditions are met: this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to + * Neither the name Meta nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/README.md b/README.md index 675bf0d4..843a9131 100644 --- a/README.md +++ b/README.md @@ -28,10 +28,10 @@ Before you begin, make sure you have completed all of the requirements listed ab #### Grant Messenger access to your Facebook App 1. Go to your app Dashboard -2. Under Add Product find Messenger and click Set Up +2. Under _Add Product_ find _Messenger_ and click _Set Up_ 3. Now you should be in the App Messenger Settings -4. Under Access Tokens, click on Edit Permissions -5. Select the desired page and allow Manage and access Page conversations in Messenger +4. Under Access Tokens, click on _Add or Remove Pages_ +5. Select the desired page and allow "Manage and access Page conversations" in Messenger 6. Select the desired page and an access token should appear 7. Get the Page ID from the page access token by using the [Access Token Debugger](https://developers.facebook.com/tools/debug/accesstoken/) 8. In the section Built-In NLP, select your page and enable the toggle @@ -48,43 +48,66 @@ $ cd original-coast-clothing You will need: - [Node](https://nodejs.org/en/) 10.x or higher -- [Localtunnel](https://github.com/localtunnel/localtunnel) or remote server like [Heroku](https://www.heroku.com/) +- Remote server service such as [Heroku](https://www.heroku.com/), a local tunneling service such as [ngrok](https://ngrok.com/), or your own webserver. # Usage -## Using Local Tunnel +## Using ngrok -#### 1. Install the dependencies +#### 1. Install tunneling service + +If not already installed, install ngrok via [download](https://ngrok.com/download) or via command line: ```bash -$ npm install +npm install -g ngrok ``` -Alternatively, you can use [Yarn](https://yarnpkg.com/en/): - +In the directory of this repo, request a tunnel to your local server with your preferred port ```bash -$ yarn install +ngrok http 3000 +``` + +The screen should show the ngrok status: + +``` +Session Status online +Account Redacted (Plan: Free) +Version 2.3.35 +Region United States (us) +Web Interface http://127.0.0.1:4040 +Forwarding http://1c3b838deacb.ngrok.io -> http://localhost:3000 +Forwarding https://1c3b838deacb.ngrok.io -> http://localhost:3000 + +Connections ttl opn rt1 rt5 p50 p90 + 0 0 0.00 0.00 0.00 0.00 ``` +Note the https URL of the external server that is fowarded to your local machine. In the above example, it is `https://1c3b838deacb.ngrok.io`. + +#### 2. Install the dependencies + +Open a new terminal tab, also in the repo directiory. -#### 2. Install Local Tunnel ```bash -npm install -g localtunnel +$ npm install ``` -Open a new terminal tab and request a tunnel to your local server with your preferred port +Alternatively, you can use [Yarn](https://yarnpkg.com/en/): + ```bash -lt --port 3000 +$ yarn install ``` -#### 3. Rename the file `.sample.env` to `.env` +#### 3. Set up .env file + +Copy the file `.sample.env` to `.env` ```bash -mv .sample.env .env +cp .sample.env .env ``` - Edit the `.env` file to add all the values for your app and page. Then run your app locally using the built-in web server +Edit the `.env` file to add all the values for your app and page. Note that `APP_URL` will be the external URL from step 1. -#### 4. Run your app locally using the built-in web server< +#### 4. Run your app locally ```bash node app.js @@ -92,18 +115,27 @@ node app.js You should now be able to access the application in your browser at [http://localhost:3000](http://localhost:3000) +Confirm that you canalso access it at the external URL from step 1. + #### 5. Configure your webhook subcription and set the Messenger profile -Use the `VERIFY_TOKEN` that you created in `.env` file and call the **/profile** endpoint like so: +Use the `VERIFY_TOKEN` that you created in `.env` file and call the **/profile** endpoint in your browser or via cURL: ``` -http://localhost:3000/profile?mode=all&verify_token=verify-token +http://localhost:3000/profile?mode=all&verify_token=verify-tokenl ``` +This will configure your webhook. + #### 6. Test that your app setup is successful -Send a message to your Page from Facebook or in Messenger, if your webhook receives an event, you have fully set up your app! Voilà! +Send a message to your Page from Facebook or in Messenger. + +You should see the webhook called in the ngrok terminal tab, and in your application terminal tab. + +If you see a response to your message in messenger, you have fully set up your app! Voilà! ## Using Heroku + #### 1. Install the Heroku CLI Download and install the [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) @@ -111,34 +143,51 @@ Download and install the [Heroku CLI](https://devcenter.heroku.com/articles/hero #### 2. Create an app from the CLI ```bash -git init heroku apps:create # Creating app... done, ⬢ mystic-wind-83 # Created http://mystic-wind-83.herokuapp.com/ | git@heroku.com:mystic-wind-83.git ``` -#### 3. Deploy the code +Note the name given to your app. In this example, it was `mystic-wind-83`. + +#### 3. Set your environment variables + +On the [Heroku App Dashboard](https://dashboard.heroku.com/), find your app and set up the config vars following the comments in the file ```.sample.env``` + +Alternatively, you can set env variables from the command line like this: + + ```bash +heroku config:set PAGE_ID=XXXX +``` + +#### 4. Deploy the code + ```bash -git add . -git commit -m "My first commit" -git push heroku master +git push heroku main ``` -#### 4. Set your environment variables - In your Heroku App Dashboard [https://dashboard.heroku.com/apps/mystic-wind-83](https://dashboard.heroku.com/apps/mystic-wind-83) set up the config vars following the comments in the file ```.sample.env``` +#### 5. View log output + +```bash +heroku logs --tail +``` -#### 5. Configure your webhook subscription and set the Messenger profile - You should now be able to access the application. Use the ```VERIFY_TOKEN``` that you created as config vars and call the **/profile** endpoint like so: +#### 6. Configure your webhook subscription and set the Messenger profile + You should now be able to access the application. Use the ```VERIFY_TOKEN``` that you created as a config var and call the **/profile** endpoint on your app like so: ``` - http://mystic-wind-83.herokuapp.com/profile?mode=all&verify_token=verify-token + http://.herokuapp.com/profile?mode=all&verify_token= ``` #### 6. Test that your app setup is successful - Send a message to your Page from Facebook or in Messenger, if your webhook receives an event, you have fully set up your app! Voilà! +Send a message to your page from Facebook or in Messenger. If your webhook receives an event, you have fully set up your app! Voilà! ## License + Sample Messenger App Original Coast Clothing is BSD licensed, as found in the LICENSE file. -See the [CONTRIBUTING](CONTRIBUTING.md) file for how to help out. \ No newline at end of file +See the [CONTRIBUTING](CONTRIBUTING.md) file for how to help out. + +Terms of Use - https://opensource.facebook.com/legal/terms +Privacy Policy - https://opensource.facebook.com/legal/privacy diff --git a/app.js b/app.js index df5676d9..9866d860 100644 --- a/app.js +++ b/app.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -10,13 +10,13 @@ "use strict"; -// Imports dependencies and set up http server +// Import dependencies and set up http server const express = require("express"), { urlencoded, json } = require("body-parser"), crypto = require("crypto"), path = require("path"), Receive = require("./services/receive"), - GraphAPi = require("./services/graph-api"), + GraphApi = require("./services/graph-api"), User = require("./services/user"), config = require("./services/config"), i18n = require("./i18n.config"), @@ -41,101 +41,171 @@ app.use(express.static(path.join(path.resolve(), "public"))); app.set("view engine", "ejs"); // Respond with index file when a GET request is made to the homepage -app.get("/", function(_req, res) { +app.get("/", function (_req, res) { res.render("index"); }); -// Adds support for GET requests to our webhook +// Add support for GET requests to our webhook app.get("/webhook", (req, res) => { // Parse the query params let mode = req.query["hub.mode"]; let token = req.query["hub.verify_token"]; let challenge = req.query["hub.challenge"]; - // Checks if a token and mode is in the query string of the request + // Check if a token and mode is in the query string of the request if (mode && token) { - // Checks the mode and token sent is correct + // Check the mode and token sent is correct if (mode === "subscribe" && token === config.verifyToken) { - // Responds with the challenge token from the request + // Respond with the challenge token from the request console.log("WEBHOOK_VERIFIED"); res.status(200).send(challenge); } else { - // Responds with '403 Forbidden' if verify tokens do not match + // Respond with '403 Forbidden' if verify tokens do not match res.sendStatus(403); } } }); -// Creates the endpoint for your webhook +// Create the endpoint for your webhook app.post("/webhook", (req, res) => { let body = req.body; - // Checks if this is an event from a page subscription + console.log(`\u{1F7EA} Received webhook:`); + console.dir(body, { depth: null }); + + // Check if this is an event from a page subscription if (body.object === "page") { // Returns a '200 OK' response to all requests res.status(200).send("EVENT_RECEIVED"); - // Iterates over each entry - there may be multiple if batched - body.entry.forEach(function(entry) { - // Gets the body of the webhook event - let webhookEvent = entry.messaging[0]; - // console.log(webhookEvent); - - // Discard uninteresting events - if ("read" in webhookEvent) { - // console.log("Got a read event"); - return; + // Iterate over each entry - there may be multiple if batched + body.entry.forEach(async function (entry) { + if ("changes" in entry) { + // Handle Page Changes event + let receiveMessage = new Receive(); + if (entry.changes[0].field === "feed") { + let change = entry.changes[0].value; + switch (change.item) { + case "post": + return receiveMessage.handlePrivateReply( + "post_id", + change.post_id + ); + case "comment": + return receiveMessage.handlePrivateReply( + "comment_id", + change.comment_id + ); + default: + console.warn("Unsupported feed change type."); + return; + } + } } - if ("delivery" in webhookEvent) { - // console.log("Got a delivery event"); - return; - } + // Iterate over webhook events - there may be multiple + entry.messaging.forEach(async function (webhookEvent) { + // Discard uninteresting events + if ("read" in webhookEvent) { + console.log("Got a read event"); + return; + } else if ("delivery" in webhookEvent) { + console.log("Got a delivery event"); + return; + } else if (webhookEvent.message && webhookEvent.message.is_echo) { + console.log( + "Got an echo of our send, mid = " + webhookEvent.message.mid + ); + return; + } + + // Get the sender PSID + let senderPsid = webhookEvent.sender.id; + // Get the user_ref if from Chat plugin logged in user + let user_ref = webhookEvent.sender.user_ref; + // Check if user is guest from Chat plugin guest user + let guestUser = isGuestUser(webhookEvent); - // Get the sender PSID - let senderPsid = webhookEvent.sender.id; - - if (!(senderPsid in users)) { - let user = new User(senderPsid); - - GraphAPi.getUserProfile(senderPsid) - .then(userProfile => { - user.setProfile(userProfile); - }) - .catch(error => { - // The profile is unavailable - console.log("Profile is unavailable:", error); - }) - .finally(() => { - users[senderPsid] = user; - i18n.setLocale(user.locale); + if (senderPsid != null && senderPsid != undefined) { + if (!(senderPsid in users)) { + if (!guestUser) { + // Make call to UserProfile API only if user is not guest + let user = new User(senderPsid); + GraphApi.getUserProfile(senderPsid) + .then((userProfile) => { + user.setProfile(userProfile); + }) + .catch((error) => { + // The profile is unavailable + console.log(JSON.stringify(body)); + console.log("Profile is unavailable:", error); + }) + .finally(() => { + console.log("locale: " + user.locale); + users[senderPsid] = user; + i18n.setLocale("en_US"); + console.log( + "New Profile PSID:", + senderPsid, + "with locale:", + i18n.getLocale() + ); + return receiveAndReturn( + users[senderPsid], + webhookEvent, + false + ); + }); + } else { + setDefaultUser(senderPsid); + return receiveAndReturn(users[senderPsid], webhookEvent, false); + } + } else { + i18n.setLocale(users[senderPsid].locale); console.log( - "New Profile PSID:", + "Profile already exists PSID:", senderPsid, "with locale:", i18n.getLocale() ); - let receiveMessage = new Receive(users[senderPsid], webhookEvent); - return receiveMessage.handleMessage(); - }); - } else { - i18n.setLocale(users[senderPsid].locale); - console.log( - "Profile already exists PSID:", - senderPsid, - "with locale:", - i18n.getLocale() - ); - let receiveMessage = new Receive(users[senderPsid], webhookEvent); - return receiveMessage.handleMessage(); - } + return receiveAndReturn(users[senderPsid], webhookEvent, false); + } + } else if (user_ref != null && user_ref != undefined) { + // Handle user_ref + setDefaultUser(user_ref); + return receiveAndReturn(users[user_ref], webhookEvent, true); + } + }); }); } else { - // Returns a '404 Not Found' if event is not from a page subscription + // Return a '404 Not Found' if event is not from a page subscription res.sendStatus(404); } }); +function setDefaultUser(id) { + let user = new User(id); + users[id] = user; + i18n.setLocale("en_US"); +} + +function isGuestUser(webhookEvent) { + let guestUser = false; + if ("postback" in webhookEvent) { + if ("referral" in webhookEvent.postback) { + if ("is_guest_user" in webhookEvent.postback.referral) { + guestUser = true; + } + } + } + return guestUser; +} + +function receiveAndReturn(user, webhookEvent, isUserRef) { + let receiveMessage = new Receive(user, webhookEvent, isUserRef); + return receiveMessage.handleMessage(); +} + // Set up your App's Messenger Profile app.get("/profile", (req, res) => { let token = req.query["verify_token"]; @@ -147,24 +217,26 @@ app.get("/profile", (req, res) => { var Profile = require("./services/profile.js"); Profile = new Profile(); - // Checks if a token and mode is in the query string of the request + // Check if a token and mode is in the query string of the request if (mode && token) { if (token === config.verifyToken) { if (mode == "webhook" || mode == "all") { Profile.setWebhook(); res.write( - `

Set app ${config.appId} call to ${config.webhookUrl}

` + `

✅ Set app ${config.appId} call to ${config.webhookUrl}

` ); } if (mode == "profile" || mode == "all") { Profile.setThread(); - res.write(`

Set Messenger Profile of Page ${config.pageId}

`); + res.write( + `

✅ Set Messenger Profile of Page ${config.pageId}

` + ); } if (mode == "personas" || mode == "all") { Profile.setPersonas(); - res.write(`

Set Personas for ${config.appId}

`); + res.write(`

✅ Set Personas for ${config.appId}

`); res.write( - "

To persist the personas, add the following variables \ + "

Note: To persist the personas, add the following variables \ to your environment variables:

" ); res.write(""); } if (mode == "nlp" || mode == "all") { - GraphAPi.callNLPConfigsAPI(); - res.write(`

Enable Built-in NLP for Page ${config.pageId}

`); + GraphApi.callNLPConfigsAPI(); + res.write( + `

✅ Enabled Built-in NLP for Page ${config.pageId}

` + ); } if (mode == "domains" || mode == "all") { Profile.setWhitelistedDomains(); - res.write(`

Whitelisting domains: ${config.whitelistedDomains}

`); + res.write( + `

✅ Whitelisted domains: ${config.whitelistedDomains}

` + ); + } + if (mode == "private-reply") { + Profile.setPageFeedWebhook(); + res.write(`

✅ Set Page Feed Webhook for Private Replies.

`); } res.status(200).end(); } else { @@ -198,7 +278,7 @@ function verifyRequestSignature(req, res, buf) { var signature = req.headers["x-hub-signature"]; if (!signature) { - console.log("Couldn't validate the signature."); + console.warn(`Couldn't find "x-hub-signature" in headers.`); } else { var elements = signature.split("="); var signatureHash = elements[1]; @@ -215,10 +295,9 @@ function verifyRequestSignature(req, res, buf) { // Check if all environment variables are set config.checkEnvVariables(); -// listen for requests :) -var listener = app.listen(config.port, function() { - console.log("Your app is listening on port " + listener.address().port); - +// Listen for requests :) +var listener = app.listen(config.port, function () { + console.log(`The app is listening on port ${listener.address().port}`); if ( Object.keys(config.personas).length == 0 && config.appUrl && @@ -236,6 +315,6 @@ var listener = app.listen(config.port, function() { if (config.pageId) { console.log("Test your app by messaging:"); - console.log("https://m.me/" + config.pageId); + console.log(`https://m.me/${config.pageId}`); } }); diff --git a/i18n.config.js b/i18n.config.js index 68161ad7..161d4c54 100644 --- a/i18n.config.js +++ b/i18n.config.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -12,7 +12,25 @@ const i18n = require("i18n"), path = require("path"); i18n.configure({ - locales: ["en_US", "fr_FR", "es_ES", "es_LA", "pt_BR", "id_ID"], + locales: [ + "en_US", + "fr_FR", + "es_ES", + "es_LA", + "pt_BR", + "id_ID", + "ar_AR", + "de_DE", + "it_IT", + "ja_JP", + "ko_KR", + "ru_RU", + "th_TH", + "vi_VN", + "zh_CN", + "zh_HK", + "zh_TW" + ], defaultLocale: "en_US", directory: path.join(__dirname, "locales"), objectNotation: true, diff --git a/locales/ar_AR.json b/locales/ar_AR.json index f2079357..d008a6f3 100644 --- a/locales/ar_AR.json +++ b/locales/ar_AR.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "مرحبًا بك في Original Coast Clothing {{user_first_name}}! انقر على بدء الاستخدام للاستمتاع بتجربة المراسلة التلقائية النموذجية التي نوفرها. وإذا كنت ترغب في إنشاء تجربة مماثلة، فتفضل بزيارة موقع https://fb.me/get-sample-oc على الويب" }, "menu": { - "support": "خدمة العملاء", "order": "تحديثات الطلبات", "help": "التحدث إلى وكيل", "suggestion": "اقتراحات لأطقم ملابس", @@ -22,6 +21,13 @@ "apply": "تطبيق الخصم", "coupon": "تمت إضافة قسيمتك إلى سلسلة الرسائل هذه، يمكنك الآن إتمام عملية شراء المجموعة الصيفية التي يُطبق عليها الخصم" }, + "wholesale_leadgen": { + "intro": "مرحبًا {{userFirstName}}، أود أن أعرفك بنفسي أنا {{agentFirstName}}، أرى أنك تتطلع للانضمام إلى برنامج الموزعين لدينا", + "lead_intro": "مرحبًا {{userFirstName}}. يمكن أن توفر ملابس الساحل الأصلية متجرك الذي يحتوي على أنماط ملابس أصلية جديدة", + "lead_question": "هل أنت مهتم بأن تصبح موزعًا معتمدًا للملابس الساحلية الأصلية؟", + "lead_qualified": "نشكرك على إظهار اهتمامك بعلامتنا التجارية. سنتابع قريبًا بمزيد من المعلومات", + "lead_disqualified": "لا توجد مشكلة ، يمكنك دائمًا شراء الملابس عبر موقعنا على الإنترنت https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "هل تبحث عن طقم ملابس لنفسك أم لشخص آخر؟", "occasion": "رائع! لنبدأ الاستخدام. أولاً، هل هناك مناسبة تضعها في اعتبارك؟", @@ -33,7 +39,7 @@ "party": "حفلة", "sales": "التحدث مع قسم المبيعات", "shop": "تسوق هذه الإطلالة", - "title": "مجموعة صيف 2019", + "title": "مجموعة صيف 2022", "subtitle": "أطقم ملابس مميزة", "show": "إطلالة أخرى" }, @@ -51,6 +57,7 @@ "order": "استفسارات بشأن الطلب", "billing": "مشاكل الفوترة", "other": "أخرى", + "appointment": "شكرا لرغبتك في تحديد موعد", "issue": "مرحبًا {{userFirstName}}، أود أن أعرفك بنفسي أنا {{agentFirstName}}، وأنا هنا لمساعدتك في أي أسئلة بشأن {{topic}}.", "default": "مرحبًا {{userFirstName}}، أود أن أعرفك بنفسي أنا {{agentFirstName}}، وأنا هنا لمساعدتك اليوم. كيف يمكنني مساعدتك؟", "style": "مرحبًا {{userFirstName}}، أود أن أعرفك بنفسي أنا {{agentFirstName}}، وأنا هنا للإجابة عن أي أسئلة لديك بشأن موديلات الصيف التي نقدمها", @@ -70,5 +77,9 @@ "fallback": { "any": "عذرًا، ولكن لا يمكنني التعرف على \"{{message}}\".", "attachment": "نشكرك على إرسال هذا المُرفق، يمكننا توصيلك بأحد الوكلاء لمراجعته أو يمكننا البدء من جديد" + }, + "common": { + "yes": "نعم", + "no": "رقم" } } diff --git a/locales/de_DE.json b/locales/de_DE.json index af63fcea..b68613e3 100644 --- a/locales/de_DE.json +++ b/locales/de_DE.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "Herzlich willkommen bei Original Coast Clothing, {{user_first_name}}! Klicke auf „Los geht’s“, um unser Beispiel für automatisierte Nachrichten zu entdecken. Wenn du ein ähnliches Kundenerlebnis anbieten möchtest, besuche die Seite https://fb.me/get-sample-oc." }, "menu": { - "support": "Kundensupport", "order": "Updates zur Bestellung", "help": "Kontakt zu Mitarbeiter", "suggestion": "Outfit-Vorschläge", @@ -22,6 +21,13 @@ "apply": "Rabatt anwenden", "coupon": "Dein Gutschein wurde zu diesem Nachrichtenverlauf hinzugefügt. Entdecke jetzt unsere heruntergesetzte Sommerkollektion!" }, + "wholesale_leadgen": { + "intro": "Hallo {{userFirstName}}, mein Name ist {{agentFirstName}}, Wie ich sehe, möchten Sie unserem Reseller-Programm beitreten", + "lead_intro": "Hallo {{userFirstName}}. Original Coast Clothing kann Ihr Geschäft mit frischen und originellen Kleidungsstilen beliefern", + "lead_question": "Sind Sie daran interessiert, ein autorisierter Wiederverkäufer von Original Coast Clothing zu werden?", + "lead_qualified": "Vielen Dank für Ihr Interesse an unserer Marke. Wir melden uns in Kürze mit weiteren Informationen", + "lead_disqualified": "Kein Problem, Sie können Kleidung jederzeit über unsere Website https://www.originalcoastclothing.com/ kaufen." + }, "curation": { "prompt": "Suchst du ein Outfit für dich selbst oder für jemand anderen?", "occasion": "Super! Los geht’s! Geht es um einen bestimmten Anlass?", @@ -33,7 +39,7 @@ "party": "Party", "sales": "Mit Vertrieb sprechen", "shop": "Diesen Look einkaufen", - "title": "Sommerkollektion 2019", + "title": "Sommerkollektion 2022", "subtitle": "Empfohlenes Outfit", "show": "Anderer Look" }, @@ -51,6 +57,7 @@ "order": "Frage zur Bestellung", "billing": "Problem mit der Zahlung", "other": "Sonstiges", + "appointment": "Vielen Dank, dass Sie einen Termin vereinbaren möchten.", "issue": "Hallo {{userFirstName}}, mein Name ist {{agentFirstName}}. Ich werde dich bei Fragen zu {{topic}} unterstützen.", "default": "Hallo {{userFirstName}}, mein Name ist {{agentFirstName}}. Ich bin heute für dich da. Wie kann ich dir helfen?", "style": "Hallo {{userFirstName}}, mein Name ist {{agentFirstName}}. Ich werde deine Fragen zu unseren Sommerstyles beantworten.", @@ -70,5 +77,9 @@ "fallback": { "any": "Es tut mir leid, ich kenne „{{message}}“ nicht.", "attachment": "Vielen Dank für diesen Anhang! Wir können dich zur Prüfung mit einem Mitarbeiter verbinden, oder du kannst von vorne beginnen." + }, + "common": { + "yes": "Ja", + "no": "nein" } } diff --git a/locales/en_US.json b/locales/en_US.json index d80dbe2a..f2bfc6d4 100644 --- a/locales/en_US.json +++ b/locales/en_US.json @@ -3,12 +3,12 @@ "greeting": "Welcome to Original Coast Clothing {{user_first_name}}! Click get started to enjoy our sample automated messaging experience. If you want to build a similar one visit https://fb.me/get-sample-oc" }, "menu": { - "support": "Customer Support", "order": "Order updates", "help": "Talk to an agent", "suggestion": "Outfit suggestions", "shop": "Shop now", - "start_over": "Start over" + "start_over": "Start over", + "product_launch":"Launch updates" }, "get_started": { "welcome": "Hi {{userFirstName}}! Welcome to Original Coast Clothing where you'll find styles for every occasion.", @@ -22,6 +22,13 @@ "apply": "Apply discount", "coupon": "Added your coupon to this thread, you can now check out the discounted summer collection" }, + "wholesale_leadgen": { + "intro": "Hi {{userFirstName}}, my name is {{agentFirstName}}, I see that you are looking to join our resellers program", + "lead_intro": "Hi {{userFirstName}}. Original Coast Clothing can supply your store which fresh a original clothing styles", + "lead_question": "Are you interested in becoming an Original Coast Clothing Authorized Reseller?", + "lead_qualified": "Thanks for expresing your interest in our brand. We will follow up shortly with more info", + "lead_disqualified": "No problem, you can always buy clothing via our website https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "Are you looking for an outfit for yourself or someone else?", "occasion": "Great! Let's get started. First, is there an occasion in mind?", @@ -33,9 +40,10 @@ "party": "Party", "sales": "Talk to sales", "shop": "Shop this look", - "title": "Summer collection 2019", + "title": "Summer collection 2022", "subtitle": "Featured outfit", - "show": "Another look" + "show": "Another look", + "productLaunchTitle":"New Product Launches" }, "order": { "prompt": "We'll be happy to help you. Select from the following", @@ -51,6 +59,7 @@ "order": "Order Inquiries", "billing": "Billing Issues", "other": "Other", + "appointment": "Thank you for wanting to make an appointment.", "issue": "Hi {{userFirstName}}, my name is {{agentFirstName}}, I'm here to assist you with any questions you might have about your {{topic}}.", "default": "Hi {{userFirstName}}, my name is {{agentFirstName}}, I'm here to assist you today. How can I help you?", "style": "Hi {{userFirstName}}, my name is {{agentFirstName}}, I’m here to answer questions you might have on our summer styles", @@ -70,5 +79,9 @@ "fallback": { "any": "Sorry, but I don’t recognize \"{{message}}\".", "attachment": "Thanks for sending this attachment, we can connect you to an agent to review it or we can start over" + }, + "common": { + "yes": "yes", + "no": "no" } } diff --git a/locales/es_ES.json b/locales/es_ES.json index 72bd0542..33973dff 100644 --- a/locales/es_ES.json +++ b/locales/es_ES.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "¡{{user_first_name}}, te damos la bienvenida a Original Coast Clothing! Haz clic para empezar a disfrutar de nuestra experiencia de mensajes automatizados de ejemplo. Si quieres crear una experiencia similar, visita https://fb.me/get-sample-oc" }, "menu": { - "support": "Servicio de atención al cliente", "order": "Actualizaciones del pedido", "help": "Hablar con un agente", "suggestion": "Sugerencias de ropa", @@ -22,6 +21,13 @@ "apply": "Aplicar descuento", "coupon": "El cupón se ha añadido a esta conversación; ahora puedes echarle un vistazo a la colección de verano con descuento." }, + "wholesale_leadgen": { + "intro": "Hola, {{userFirstName}}. Me llamo {{agentFirstName}}. Veo que desea unirse a nuestro programa de revendedores", + "lead_intro": "Hola {{userFirstName}}. Original Coast Clothing puede proporcionar a su tienda estilos de ropa frescos y originales.", + "lead_question": "¿Está interesado en convertirse en un distribuidor autorizado de Original Coast Clothing?", + "lead_qualified": "Gracias por expresar su interés en nuestra marca. Seguiremos en breve con más información.", + "lead_disqualified": "No hay problema, siempre puedes comprar ropa a través de nuestro sitio web https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "¿Estás buscando ropa para ti o para otra persona?", "occasion": "¡Estupendo! Empecemos. Primero, ¿buscas ropa para alguna ocasión en especial?", @@ -33,7 +39,7 @@ "party": "Fiesta", "sales": "Hablar con el equipo de ventas", "shop": "Comprar este conjunto", - "title": "Colección de verano de 2019", + "title": "Colección de verano de 2022", "subtitle": "Ropa destacada", "show": "Otro conjunto" }, @@ -51,6 +57,7 @@ "order": "Consultas sobre pedidos", "billing": "Problemas de facturación", "other": "Otra", + "appointment": "Gracias por querer concertar una cita.", "issue": "Hola, {{userFirstName}}. Me llamo {{agentFirstName}} y estoy aquí para ayudarte con cualquier pregunta que tengas sobre {{topic}}.", "default": "Hola, {{userFirstName}}. Me llamo {{agentFirstName}} y estoy aquí para ofrecerte asistencia. ¿Cómo te puedo ayudar?", "style": "Hola, {{userFirstName}}. Me llamo {{agentFirstName}} y estoy aquí para responder cualquier pregunta que puedas tener sobre nuestros estilos de verano.", @@ -70,5 +77,9 @@ "fallback": { "any": "Lo siento, pero no reconozco “{{message}}”.", "attachment": "Gracias por enviar este archivo adjunto; podemos ponerte en contacto con un agente para que lo revise o podemos volver a empezar." + }, + "common": { + "yes": "si", + "no": "no" } } diff --git a/locales/es_LA.json b/locales/es_LA.json index 616467ea..f0fbef5f 100644 --- a/locales/es_LA.json +++ b/locales/es_LA.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "¡Te damos la bienvenida a Original Coast Clothing, {{user_first_name}}! Haz clic para empezar a disfrutar de nuestra experiencia de mensajes automáticos de muestra. Si quieres crear una experiencia similar, visita https://fb.me/get-sample-oc" }, "menu": { - "support": "Servicio de atención al cliente", "order": "Actualizaciones del pedido", "help": "Hablar con un agente", "suggestion": "Sugerencias de ropa", @@ -22,6 +21,13 @@ "apply": "Aplicar descuento", "coupon": "Se agregó tu cupón a esta conversación; ahora puedes echarle un vistazo a la colección de verano con descuento" }, + "wholesale_leadgen": { + "intro": "Hola, {{userFirstName}}. Me llamo {{agentFirstName}}. Veo que desea unirse a nuestro programa de revendedores", + "lead_intro": "Hola {{userFirstName}}. Original Coast Clothing puede proporcionar a su tienda estilos de ropa frescos y originales.", + "lead_question": "¿Está interesado en convertirse en un distribuidor autorizado de Original Coast Clothing?", + "lead_qualified": "Gracias por expresar su interés en nuestra marca. Seguiremos en breve con más información.", + "lead_disqualified": "No hay problema, siempre puedes comprar ropa a través de nuestro sitio web https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "¿Estás buscando ropa para ti u otra persona?", "occasion": "¡Genial! Empecemos. Primero, ¿buscas ropa para alguna ocasión en especial?", @@ -33,7 +39,7 @@ "party": "Fiesta", "sales": "Hablar con el equipo de ventas", "shop": "Comprar este look", - "title": "Colección verano 2019", + "title": "Colección verano 2022", "subtitle": "Ropa destacada", "show": "Otro look" }, @@ -51,6 +57,7 @@ "order": "Consultas sobre pedidos", "billing": "Problemas de facturación", "other": "Otro tema", + "appointment": "Gracias por querer concertar una cita.", "issue": "Hola, {{userFirstName}}. Me llamo {{agentFirstName}} y estoy aquí para ayudarte con cualquier pregunta que tengas sobre {{topic}}.", "default": "Hola, {{userFirstName}}. Me llamo {{agentFirstName}} y estoy aquí para ofrecerte asistencia. ¿Cómo te puedo ayudar?", "style": "Hola, {{userFirstName}}. Me llamo {{agentFirstName}} y estoy aquí para responder cualquier pregunta que puedas tener sobre nuestros estilos de verano.", @@ -70,5 +77,9 @@ "fallback": { "any": "Lo siento, pero no reconozco \"{{message}}\".", "attachment": "Gracias por enviar este archivo adjunto; ahora podemos comunicarte con un agente para que lo revise o puedes volver a empezar" + }, + "common": { + "yes": "si", + "no": "no" } } diff --git a/locales/fr_FR.json b/locales/fr_FR.json index 18ebf3f2..ece12928 100644 --- a/locales/fr_FR.json +++ b/locales/fr_FR.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "Bienvenue à Original Coast Clothing {{user_first_name}}! Cliquez sur démarrer pour voir notre exemple d’expérience de messagerie automatique. Si vous souhaitez en élaborer une semblable, visitez https://fb.me/get-sample-oc" }, "menu": { - "support": "Service clientèle", "order": "Mises à jour des commandes", "help": "Parler à un agent", "suggestion": "Suggestions vestimentaires", @@ -22,6 +21,13 @@ "apply": "Appliquer la remise", "coupon": "Votre coupon a été ajouté à la conversation, vous pouvez maintenant découvrir la collection été soldée" }, + "wholesale_leadgen": { + "intro": "Salut {{userFirstName}}, je m’appelle {{agentFirstName}}. Je vois que vous souhaitez rejoindre notre programme revendeur", + "lead_intro": "Bonjour {{userFirstName}}. Original Coast Clothing peut fournir à votre magasin des styles de vêtements originaux", + "lead_question": "Êtes-vous intéressé à devenir un revendeur agréé Original Coast Clothing ?", + "lead_qualified": "Merci d'avoir manifesté votre intérêt pour notre marque. Nous suivrons sous peu avec plus d'informations", + "lead_disqualified": "No problem, you can always buy clothing via our website https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "Cherchez-vous une tenue pour vous ou quelqu’un d’autre ?", "occasion": "Super ! Commençons. Tout d’abord, est-ce pour une occasion spéciale ?", @@ -33,7 +39,7 @@ "party": "Fête", "sales": "Parler avec des conseillers de ventes", "shop": "Acheter ce look", - "title": "Collection été 2019", + "title": "Collection été 2022", "subtitle": "Tenue présentée", "show": "Autre look" }, @@ -51,6 +57,7 @@ "order": "Demandes d’informations sur les commandes", "billing": "Problèmes de facturation", "other": "Autre", + "appointment": "Merci de vouloir prendre un rendez-vous.", "issue": "Salut {{userFirstName}}, je m’appelle {{agentFirstName}}, je suis à votre disposition si vous avez des questions à propos de {{topic}}.", "default": "Salut {{userFirstName}}, je m’appelle {{agentFirstName}}, je suis là pour vous aider aujourd’hui. Comment puis-je vous aider ?", "style": "Salut {{userFirstName}}, je m’appelle {{agentFirstName}} et je suis à votre disposition pour répondre à toute question sur nos styles de l’été", @@ -70,5 +77,9 @@ "fallback": { "any": "Désolé, mais je ne reconnais pas « {{message}} ».", "attachment": "Merci d’avoir envoyé cette pièce jointe, nous pouvons vous mettre en relation avec un agent pour son examen ou reprendre du début" + }, + "common": { + "yes": "oui", + "no": "non" } } diff --git a/locales/id_ID.json b/locales/id_ID.json index 0fbe0a1d..11e98349 100644 --- a/locales/id_ID.json +++ b/locales/id_ID.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "Selamat datang di Original Coast Clothing {{user_first_name}}! Klik untuk mulai menikmati sampel pengalaman berkirim pesan otomatis kami. Jika Anda ingin membuat pengalaman serupa, kunjungi https://fb.me/get-sample-oc" }, "menu": { - "support": "Dukungan Pelanggan", "order": "Info terbaru pesanan", "help": "Bicara dengan agen", "suggestion": "Saran pakaian", @@ -22,6 +21,13 @@ "apply": "Terapkan diskon", "coupon": "Tambahkan kupon Anda ke utas ini untuk melihat koleksi musim panas dengan harga diskon" }, + "wholesale_leadgen": { + "intro": "Halo {{userFirstName}}, nama saya {{agentFirstName}}. Saya melihat bahwa Anda ingin bergabung dengan program reseller kami", + "lead_intro": "Hai {{userFirstName}}. Pakaian Pantai Asli dapat menyediakan toko Anda yang segar dengan gaya pakaian asli", + "lead_question": "Apakah Anda tertarik untuk menjadi Reseller Resmi Pakaian Pantai Asli?", + "lead_qualified": "Terima kasih telah menyatakan minat Anda pada merek kami. Kami akan segera menindaklanjuti dengan info lebih lanjut", + "lead_disqualified": "Tidak masalah, Anda selalu dapat membeli pakaian melalui situs web kami https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "Apa Anda mencari pakaian untuk Anda atau untuk orang lain?", "occasion": "Bagus! Mari mulai. Pertama-tama, apakah ada acara khusus?", @@ -33,7 +39,7 @@ "party": "Pesta", "sales": "Bicara dengan penjual", "shop": "Belanja tampilan ini", - "title": "Koleksi musim panas 2019", + "title": "Koleksi musim panas 2022", "subtitle": "Pakaian unggulan", "show": "Tampilan lain" }, @@ -51,6 +57,7 @@ "order": "Pertanyaan Pesanan", "billing": "Masalah Penagihan", "other": "Lainnya", + "appointment": "Terima kasih sudah mau membuat janji.", "issue": "Halo {{userFirstName}}, nama saya {{agentFirstName}}, saya akan membantu menjawab pertanyaan Anda tentang {{topic}}.", "default": "Halo {{userFirstName}}, nama saya {{agentFirstName}}, saya akan membantu Anda hari ini. Apa yang dapat saya bantu?", "style": "Halo {{userFirstName}}, nama saya {{agentFirstName}}, saya akan menjawab pertanyaan Anda tentang koleksi musim panas kami", @@ -70,5 +77,9 @@ "fallback": { "any": "Maaf, kami tidak mengenali \"{{message}}\".", "attachment": "Terima kasih telah mengirimkan lampiran ini, kami dapat menghubungkan Anda dengan agen yang akan meninjaunya, atau kita bisa mulai lagi dari awal" + }, + "common": { + "yes": "ya", + "no": "tidak" } } diff --git a/locales/it_IT.json b/locales/it_IT.json index 6f4a7896..bf149f83 100644 --- a/locales/it_IT.json +++ b/locales/it_IT.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "Ti diamo il benvenuto su Original Coast Clothing, {{user_first_name}}! Clicca su Inizia per provare i nostri messaggi automatici. Se vuoi creare un'esperienza simile, visita https://fb.me/get-sample-oc." }, "menu": { - "support": "Assistenza clienti", "order": "Aggiornamenti sull'ordine", "help": "Parla con un agente", "suggestion": "Suggerimenti sui look", @@ -22,6 +21,13 @@ "apply": "Applica sconto", "coupon": "Ora che hai aggiunto il tuo coupon a questa conversazione, puoi dare un'occhiata alla collezione estiva in saldo." }, + "wholesale_leadgen": { + "intro": "Ciao {{userFirstName}}, mi chiamo {{agentFirstName}}. Vedo che stai cercando di entrare a far parte del nostro programma di rivenditori", + "lead_intro": "Ciao {{userFirstName}}. Original Coast Clothing può fornire al tuo negozio uno stile di abbigliamento fresco e originale", + "lead_question": "Sei interessato a diventare un Rivenditore Autorizzato Original Coast Clothing?", + "lead_qualified": "Grazie per aver espresso il tuo interesse per il nostro marchio. Ti risponderemo a breve con maggiori informazioni", + "lead_disqualified": "Nessun problema, puoi sempre acquistare abbigliamento tramite il nostro sito Web https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "Stai cercando un look per te o per qualcun altro?", "occasion": "Fantastico! Iniziamo. Per prima cosa, hai in mente qualche occasione in particolare?", @@ -33,7 +39,7 @@ "party": "Una festa", "sales": "Parla con un commerciale", "shop": "Acquista questo look", - "title": "Collezione estiva 2019", + "title": "Collezione estiva 2022", "subtitle": "Outfit in evidenza", "show": "Un altro look" }, @@ -51,6 +57,7 @@ "order": "Richieste relative a un ordine", "billing": "Problemi di fatturazione", "other": "Altro", + "appointment": "Grazie per aver voluto fissare un appuntamento.", "issue": "Ciao {{userFirstName}}, mi chiamo {{agentFirstName}} e sono qui per aiutarti a rispondere ad eventuali domande relative a {{topic}}.", "default": "Ciao {{userFirstName}}, mi chiamo {{agentFirstName}} e oggi sono qui per aiutarti. Cosa posso fare per te?", "style": "Ciao {{userFirstName}}, mi chiamo {{agentFirstName}} e sono qui per rispondere alle domande relative ai nostri look estivi.", @@ -70,5 +77,9 @@ "fallback": { "any": "Spiacente, ma non riconosco \"{{message}}\".", "attachment": "Grazie per averci inviato l'allegato, possiamo metterti in contatto con un agente che lo esamini oppure possiamo ricominciare." + }, + "common": { + "yes": "si", + "no": "no" } } diff --git a/locales/ja_JP.json b/locales/ja_JP.json index 2edc66cb..86e8aea9 100644 --- a/locales/ja_JP.json +++ b/locales/ja_JP.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "{{user_first_name}}さん、Original Coast Clothingへようこそ![スタート]をクリックして、サンプルの自動メッセージングサービスをお試しください。同様のサービスを構築する場合はhttps://fb.me/get-sample-ocをご覧ください。" }, "menu": { - "support": "カスタマーサポート", "order": "注文の更新情報", "help": "担当者と話す", "suggestion": "コーディネートのおすすめ", @@ -22,6 +21,13 @@ "apply": "割引を適用", "coupon": "このスレッドにクーポンを追加しました。これで割引価格になった夏のコレクションをチェックアウトできます。" }, + "wholesale_leadgen": { + "intro": "{{userFirstName}}さん、こんにちは。{{agentFirstName}} 再販業者プログラムへの参加を検討されているようです", + "lead_intro": "こんにちは{{userFirstName}}。 Original Coast Clothing は、新鮮なオリジナルの衣類スタイルをあなたの店に提供できます。", + "lead_question": "Original Coast Clothing 認定再販業者になることに興味がありますか?", + "lead_qualified": "当社のブランドにご関心をお寄せいただきありがとうございます。詳細については、まもなくフォローアップします", + "lead_disqualified": "問題ありません。当社のウェブサイト https://www.originalcoastclothing.com/ からいつでも衣類を購入できます。" + }, "curation": { "prompt": "お探しのものは自分の服ですか?プレゼントですか?", "occasion": "ありがとうございます。では始めましょう。まず、どのようなシーンで着る服ですか?", @@ -33,7 +39,7 @@ "party": "パーティー", "sales": "販売員と話す", "shop": "この服を購入", - "title": "2019年夏のコレクション", + "title": "2022年夏のコレクション", "subtitle": "注目のコーディネート", "show": "別の服" }, @@ -51,6 +57,7 @@ "order": "注文に関するお問い合わせ", "billing": "請求の問題", "other": "その他", + "appointment": "ご予約ありがとうございます。", "issue": "{{userFirstName}}さん、こんにちは。{{agentFirstName}}です。{{topic}}に関してご不明の点をお手伝いいたします。", "default": "{{userFirstName}}さん、こんにちは。{{agentFirstName}}です。お手伝いさせていただきます。どのようなサポートをご希望ですか?", "style": "{{userFirstName}}さん、こんにちは。{{agentFirstName}}です。夏のコーディネートについてご不明の点にお答えいたします。", @@ -70,5 +77,9 @@ "fallback": { "any": "申し訳ございません。「{{message}}」は認識できません。", "attachment": "添付ファイルをお送りいただき、ありがとうございます。担当者におつなぎし、確認させていただきます。または始めからやり直すこともできます。" + }, + "common": { + "yes": "はい", + "no": "番号" } } diff --git a/locales/ko_KR.json b/locales/ko_KR.json index f33625c4..14af032e 100644 --- a/locales/ko_KR.json +++ b/locales/ko_KR.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "{{user_first_name}}님, 안녕하세요. Original Coast Clothing입니다! 시작하기를 클릭하여 샘플 자동 메시지 기능을 활용해보세요. 비슷한 메시지를 만들려면 visit https://fb.me/get-sample-oc를 방문하세요." }, "menu": { - "support": "고객 지원", "order": "주문 업데이트", "help": "상담원과 대화하기", "suggestion": "의상 추천", @@ -22,6 +21,13 @@ "apply": "할인 적용", "coupon": "스레드에 쿠폰이 추가되었습니다. 이제 여름 컬렉션 의상을 할인이 적용된 가격으로 확인하세요." }, + "wholesale_leadgen": { + "intro": "{{userFirstName}}님, 안녕하세요. 저는 {{agentFirstName}}입니다. 귀하가 당사 리셀러 프로그램에 가입하려고 하는 것을 확인했습니다.", + "lead_intro": "안녕하세요 {{userFirstName}}님. Original Coast Clothing은 신선한 오리지널 의류 스타일을 매장에 공급할 수 있습니다.", + "lead_question": "Original Coast Clothing Authorized Reseller가 되는 데 관심이 있으십니까?", + "lead_qualified": "저희 브랜드에 관심을 보여주셔서 감사합니다. 곧 추가 정보를 알려드리겠습니다.", + "lead_disqualified": "문제 없습니다. 저희 웹사이트 https://www.originalcoastclothing.com/을 통해 언제든지 의류를 구입할 수 있습니다." + }, "curation": { "prompt": "직접 착용하실 옷인가요, 아니면 다른 사람이 착용할 옷인가요?", "occasion": "좋습니다! 그럼 시작해볼까요? 먼저 어떤 상황에서 착용할 옷을 찾으시나요?", @@ -33,7 +39,7 @@ "party": "파티", "sales": "판매 담당자와 대화하기", "shop": "이 의상 구매하기", - "title": "2019년 여름 컬렉션", + "title": "2022년 여름 컬렉션", "subtitle": "추천 의상", "show": "다른 의상" }, @@ -51,6 +57,7 @@ "order": "주문 관련 문의", "billing": "청구 비용 문제", "other": "기타", + "appointment": "예약을 원해주셔서 감사합니다.", "issue": "{{userFirstName}}님, 안녕하세요. 저는 {{agentFirstName}}입니다. {{topic}}에 관해 문의해주신 문제 해결을 도와드리겠습니다.", "default": "{{userFirstName}}님, 안녕하세요. 저는 {{agentFirstName}}입니다. 정성껏 도와드리겠습니다. 무엇을 도와드릴까요?", "style": "{{userFirstName}}님, 안녕하세요. 저는 {{agentFirstName}}입니다. 저희 여름 컬렉션에 관해 문의해주신 내용에 대해 답변해드리겠습니다.", @@ -70,5 +77,9 @@ "fallback": { "any": "죄송합니다. '{{message}}'이(가) 무엇인지 식별할 수 없습니다.", "attachment": "첨부파일을 보내주셔서 감사합니다. 검토를 위해 담당자에게 연결하거나 처음부터 다시 시작할 수 있습니다." + }, + "common": { + "yes": "예", + "no": "아니" } } diff --git a/locales/pl_PL.json b/locales/pl_PL.json new file mode 100644 index 00000000..0fbe9315 --- /dev/null +++ b/locales/pl_PL.json @@ -0,0 +1,86 @@ +{ + "profile": { + "greeting": "{{user_first_name}}, witamy w Original Coast Clothing! Kliknij Rozpocznij, aby wypróbować przykładowe zautomatyzowane środowisko komunikacyjne. Jeżeli chcesz zbudować podobny komunikator, przejdź do strony https://fb.me/get-sample-oc" + }, + "menu": { + "support": "Obsługa klienta", + "order": "Aktualizacje zamówienia", + "help": "Rozmowa z konsultantem", + "suggestion": "Rozmowa z konsultantem", + "shop": "Kup teraz", + "start_over": "Rozpocznij od nowa" + }, + "get_started": { + "welcome": "Witaj, {{userFirstName}}! Witamy w Original Coast Clothing, gdzie znajdziesz styl na każdą okazję.", + "guidance": "W każdej chwili możesz skorzystać z poniższego menu, aby nawigować po funkcjach", + "help": "W czym możemy Ci dzisiaj pomóc?" + }, + "leadgen": { + "promo": "Witaj, {{userFirstName}}! Znalezienie wspaniałych ubrań jest teraz łatwiejsze i wygodniejsze.", + "title": "Kupon rabatowy 50%", + "subtitle": "Oto Twój kupon", + "apply": "Zastosuj zniżkę", + "coupon": "Po dodaniu kuponu do tego wątku możesz zobaczyć przecenioną kolekcję letnią" + }, + "wholesale_leadgen": { + "intro": "Witaj, {{userFirstName}}! Mam na imię {{agentFirstName}} Widzę, że chcesz dołączyć do naszego programu dla sprzedawców", + "lead_intro": "Witaj {{userFirstName}}. Original Coast Clothing może dostarczyć Twojemu sklepowi świeże oryginalne style odzieży", + "lead_question": "Czy chcesz zostać autoryzowanym sprzedawcą odzieży Original Coast?", + "lead_qualified": "Dziękujemy za wyrażenie zainteresowania naszą marką. Wkrótce podamy więcej informacji", + "lead_disqualified": "Nie ma problemu, zawsze możesz kupić odzież za pośrednictwem naszej strony https://www.originalcoastclothing.com/" + }, + "curation": { + "prompt": "Szukasz ubrania dla siebie czy kogoś innego?", + "occasion": "Doskonale! W takim razie zaczynajmy. Czy szukasz czegoś na konkretną okazję?", + "price": "Ile zamierzasz wydać?", + "me": "Dla mnie!", + "someone": "Ktoś inny", + "work": "Praca", + "dinner": "Kolacja", + "party": "Przyjęcie", + "sales": "Kontakt z działem sprzedaży", + "shop": "Wybierz ten styl", + "title": "Kolekcja Lato 2022", + "subtitle": "Wyróżniony ubiór", + "show": "Inny styl" + }, + "order": { + "prompt": "Z przyjemnością udzielimy Ci pomocy. Wybierz jedną z opcji", + "search": "Wyszukaj według numeru zamówienia", + "account": "Powiąż moje konto", + "dialog": "Okno dialogowe łączenia konta", + "searching": "Wyszukiwanie Twojego ostatniego zamówienia…", + "number": "Podaj numer zamówienia", + "status": "Twoje zamówienie jest w drodze, powinno dotrzeć do Ciebie w ciągu 3 dni." + }, + "care": { + "prompt": "Opisz sprawę, abyśmy mogli połączyć Cię z odpowiednim zespołem.", + "order": "Zapytania dotyczące zamówienia", + "billing": "Problemy z rozliczeniem", + "other": "Inne", + "appointment": "Dziękuję za chęć umówienia spotkania.", + "issue": "Witaj, {{userFirstName}}! Mam na imię {{agentFirstName}} i udzielę Ci wszelkiej pomocy w zakresie: {{topic}}.", + "default": "Witaj, {{userFirstName}}! Mam na imię {{agentFirstName}} i udzielę Ci wszelkiej pomocy. W czym możemy pomóc?", + "style": "Witaj, {{userFirstName}}! Mam na imię {{agentFirstName}} i odpowiem na wszelkie pytania dotyczące letnich stylizacji", + "end": "To tyle, jeśli chodzi o wersję demonstracyjną. Wykorzystaj możliwości platformy Messenger dla swojej firmy. Na stronie https://fb.me/get-sample-oc dowiesz się, jak zbudować podobne rozwiązanie", + "help": "Pomoc" + }, + "survey": { + "prompt": "Witaj, interesuje mnie Twoja opinia na temat ostatniego kontaktu z konsultantem {{agentFirstName}}", + "positive": "Dziękujemy za opinię", + "neutral": "Dziękujemy za opinię. Jeżeli powinniśmy coś poprawić, przekaż komentarz z #sugestia", + "negative": "Dziękujemy za informację. Przykro nam to słyszeć. Jeżeli jest coś, co możemy zrobić, poinformuj nas o tym.", + "suggestion": "YoTwoja sugestia została zapisana do zweryfikowania przez zespół. Jeżeli jest to coś, co wymaga ponownego kontaktu, po prostu dodaj komentarz \"help\"" + }, + "chat_plugin": { + "prompt": "Dziękujemy za wizytę w naszym sklepie. Koniecznie zobacz wszystkie wspaniałe stylizacje z kolekcji letniej." + }, + "fallback": { + "any": "Niestety nie rozpoznaję \"{{message}}\".", + "attachment": "Dziękujemy za przesłanie tego załącznika. Możemy połączyć Cię z konsultantem, aby sprawdzić załącznik, lub zacząć od nowa." + }, + "common": { + "yes": "tak", + "no": "nie" + } +} diff --git a/locales/pt_BR.json b/locales/pt_BR.json index a3f20d73..2865cb12 100644 --- a/locales/pt_BR.json +++ b/locales/pt_BR.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "Bem-vindo(a) à Original Coast Clothing {{user_first_name}}! Clique em Começar para conferir nosso exemplo de experiência de mensagens automáticas. Se você deseja criar uma semelhante, acesse https://fb.me/get-sample-oc." }, "menu": { - "support": "Suporte ao cliente", "order": "Atualizações de pedidos", "help": "Fale com um agente", "suggestion": "Sugestões de roupas", @@ -22,6 +21,13 @@ "apply": "Aplique o desconto", "coupon": "Agora que seu cupom foi adicionado a esta conversa, você pode conferir a coleção de verão com desconto" }, + "wholesale_leadgen": { + "intro": "Oi, {{userFirstName}}. Meu nome é {{agentFirstName}} vejo que você deseja participar do nosso programa de revendedores", + "lead_intro": "Olá {{userFirstName}}. A roupa original da costa pode fornecer à sua loja estilos de roupas originais", + "lead_question": "Tem interesse em se tornar um Revendedor Autorizado Original Coast Clothing?", + "lead_qualified": "Obrigado por expressar seu interesse em nossa marca. Seguiremos em breve com mais informações", + "lead_disqualified": "Não tem problema, você sempre pode comprar roupas através do nosso site https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "Está procurando uma roupa para você ou para outra pessoa?", "occasion": "Ótimo! Vamos começar. Primeiro, é para alguma ocasião em especial?", @@ -33,7 +39,7 @@ "party": "Festa", "sales": "Fale com a equipe de vendas", "shop": "Compre esse look", - "title": "Coleção de verão 2019", + "title": "Coleção de verão 2022", "subtitle": "Roupa em destaque", "show": "Outro look" }, @@ -51,6 +57,7 @@ "order": "Consultas sobre pedidos", "billing": "Cobrança", "other": "Outro", + "appointment": "Obrigado por querer marcar uma consulta.", "issue": "Oi, {{userFirstName}}. Meu nome é {{agentFirstName}} e estou aqui para responder a qualquer pergunta que você possa ter sobre seu(sua) {{topic}}.", "default": "Oi, {{userFirstName}}. Meu nome é {{agentFirstName}} e estou aqui para ajudar você hoje. Como posso ajudar?", "style": "Oi, {{userFirstName}}. Meu nome é {{agentFirstName}} e estou aqui para responder às perguntas que você possa ter sobre nossos estilos de verão.", @@ -70,5 +77,9 @@ "fallback": { "any": "Desculpe, mas não reconheço \"{{message}}\".", "attachment": "Agradecemos por enviar esse anexo. Podemos colocar você em contato com um agente para analisá-lo ou podemos começar de novo." + }, + "common": { + "yes": "sim", + "no": "não" } } diff --git a/locales/ru_RU.json b/locales/ru_RU.json index fcbca060..a3fe1598 100644 --- a/locales/ru_RU.json +++ b/locales/ru_RU.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "Добро пожаловать в магазин Original Coast Clothing, {{user_first_name}}! Нажмите \"Начать\", чтобы написать нашему боту. Хотите такой же бот? Перейдите по адресу https://fb.me/get-sample-oc." }, "menu": { - "support": "Служба поддержки клиентов", "order": "Информация по заказу", "help": "Поговорить с агентом", "suggestion": "Советы по выбору одежды", @@ -22,6 +21,13 @@ "apply": "Применить скидку", "coupon": "Теперь вы можете ознакомиться с летней коллекцией, скидку на которую дает ваш купон." }, + "wholesale_leadgen": { + "intro": "Здравствуйте, {{userFirstName}}! Меня зовут {{agentFirstName}}. Я вижу, что вы хотите присоединиться к нашей программе для реселлеров.", + "lead_intro": "Привет {{userFirstName}}. Original Coast Clothing может предоставить вашему магазину свежие оригинальные стили одежды.", + "lead_question": "Вы заинтересованы в том, чтобы стать авторизованным реселлером одежды Original Coast Clothing?", + "lead_qualified": "Спасибо за проявленный интерес к нашему бренду. В ближайшее время мы сообщим дополнительную информацию", + "lead_disqualified": "Нет проблем, вы всегда можете купить одежду через наш сайт https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "Подбираете одежду себе или кому-то ещё?", "occasion": "Отлично. Начнем! На какой случай вы подбираете одежду?", @@ -33,7 +39,7 @@ "party": "Для вечеринок", "sales": "Поговорить с консультантом", "shop": "Купить эту одежду", - "title": "Коллекция \"Лето 2019\"", + "title": "Коллекция \"Лето 2022\"", "subtitle": "Рекомендуем", "show": "Другой образ" }, @@ -51,6 +57,7 @@ "order": "Вопросы по заказу", "billing": "Проблемы с оплатой", "other": "Другое", + "appointment": "Спасибо, что согласились записаться на прием.", "issue": "Здравствуйте, {{userFirstName}}! Меня зовут {{agentFirstName}}. Я с радостью отвечу на любые ваши вопросы по следующей теме: {{topic}}.", "default": "Здравствуйте, {{userFirstName}}! Меня зовут {{agentFirstName}}, сегодня я ваш консультант. Чем я могу вам помочь?", "style": "Здравствуйте, {{userFirstName}}! Меня зовут {{agentFirstName}}. Я с радостью отвечу на любые вопросы по нашей летней коллекции.", @@ -70,5 +77,9 @@ "fallback": { "any": "Извините, но я не понимаю, что значит \"{{message}}\".", "attachment": "Спасибо за вложение. Вы можете прямо сейчас связаться с агентом, чтобы он его посмотрел, или начать заново." + }, + "common": { + "yes": "да", + "no": "нет" } } diff --git a/locales/th_TH.json b/locales/th_TH.json index 0e887e4a..4f0384d6 100644 --- a/locales/th_TH.json +++ b/locales/th_TH.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "ยินดีต้อนรับสู่ Original Coast Clothing {{user_first_name}}! คลิกเริ่มต้นใช้งานเพื่อทดลองตัวอย่างประสบการณ์การส่งข้อความอัตโนมัติของเรา หากคุณต้องการสร้างประสบการณ์ที่คล้ายกัน โปรดไปที่ https://fb.me/get-sample-oc" }, "menu": { - "support": "ฝ่ายบริการลูกค้า", "order": "อัพเดตเกี่ยวกับคำสั่งซื้อ", "help": "ติดต่อตัวแทน", "suggestion": "คำแนะนำเกี่ยวกับชุด", @@ -22,6 +21,13 @@ "apply": "ใช้ส่วนลด", "coupon": "เพิ่มคูปองไปยังการสนทนานี้แล้ว คุณสามารถดูคอลเลกชั่นฤดูร้อนลดราคาได้เลย" }, + "wholesale_leadgen": { + "intro": "สวัสดี {{userFirstName}} ฉันชื่อ {{agentFirstName}} ฉันเห็นว่าคุณกำลังต้องการเข้าร่วมโปรแกรมตัวแทนจำหน่ายของเรา", + "lead_intro": "สวัสดี {{userFirstName}} Original Coast Clothing สามารถจัดหาร้านค้าของคุณที่สดใหม่สไตล์เสื้อผ้าดั้งเดิม", + "lead_question": "คุณสนใจที่จะเป็นตัวแทนจำหน่ายเสื้อผ้าที่ได้รับอนุญาตจากแบรนด์ดั้งเดิมหรือไม่?", + "lead_qualified": "ขอขอบคุณที่แสดงความสนใจในแบรนด์ของเรา เราจะติดตามข้อมูลเพิ่มเติมในไม่ช้า", + "lead_disqualified": "ไม่มีปัญหา ซื้อเสื้อผ้าผ่านเว็บไซต์ของเราได้เสมอ https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "คุณกำลังหาชุดให้ตัวเองหรือคนอื่น", "occasion": "เยี่ยมเลย! เริ่มต้นกันเลย ขั้นแรก คุณหาชุดเพื่อโอกาสอะไร", @@ -33,7 +39,7 @@ "party": "ปาร์ตี้", "sales": "ติดต่อฝ่ายขาย", "shop": "เลือกซื้อลุคนี้", - "title": "คอลเลกชั่นฤดูร้อนปี 2019", + "title": "คอลเลกชั่นฤดูร้อนปี 2022", "subtitle": "ชุดแนะนำ", "show": "ลุคอื่น" }, @@ -51,6 +57,7 @@ "order": "สอบถามเกี่ยวกับคำสั่งซื้อ", "billing": "ปัญหาเกี่ยวกับการเรียกเก็บเงิน", "other": "อื่นๆ", + "appointment": "ขอบคุณที่ต้องการนัดหมาย", "issue": "สวัสดี {{userFirstName}} ฉันชื่อ {{agentFirstName}} ฉันพร้อมตอบทุกคำถามเกี่ยวกับ {{topic}} ของคุณ", "default": "สวัสดี {{userFirstName}} ฉันชื่อ {{agentFirstName}} ฉันพร้อมช่วยเหลือคุณในวันนี้ ให้ฉันช่วยอะไรคุณได้บ้าง", "style": "สวัสดี {{userFirstName}} ฉันชื่อ {{agentFirstName}} ฉันพร้อมตอบคำถามเกี่ยวกับสไตล์ฤดูร้อนที่คุณอาจสงสัย", @@ -70,5 +77,9 @@ "fallback": { "any": "ขออภัย แต่ฉันไม่รู้จัก “{{message}}”", "attachment": "ขอบคุณที่ส่งไฟล์แนบนี้ เราสามารถเชื่อมต่อคุณเข้ากับตัวแทนเพื่อตรวจสอบเรื่องดังกล่าวหรือเริ่มต้นใหม่ได้" + }, + "common": { + "yes": "ใช่", + "no": "ไม่" } } diff --git a/locales/vi_VN.json b/locales/vi_VN.json index bd6802a4..6ff15cde 100644 --- a/locales/vi_VN.json +++ b/locales/vi_VN.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "Chào mừng bạn đến với Original Coast Clothing {{user_first_name}}! Hãy nhấp vào nút Bắt đầu để tận hưởng trải nghiệm nhắn tin mẫu và hoàn toàn tự động của chúng tôi. Nếu bạn muốn xây dựng trải nghiệm tương tự, hãy truy cập https://fb.me/get-sample-oc" }, "menu": { - "support": "Hỗ trợ khách hàng", "order": "Cập nhật đơn đặt hàng", "help": "Trò chuyện với nhân viên", "suggestion": "Gợi ý về trang phục", @@ -22,6 +21,13 @@ "apply": "Áp dụng chiết khấu", "coupon": "Đã thêm phiếu giảm giá vào cuộc trò chuyện này. Giờ thì bạn hãy xem thử bộ sưu tập mùa hè đang được chiết khấu nhé" }, + "wholesale_leadgen": { + "intro": "Hi {{userFirstName}}! Tôi là {{agentFirstName}}. Tôi thấy rằng bạn đang muốn tham gia chương trình người bán lại của chúng tôi", + "lead_intro": "Hi {{userFirstName}}. Original Coast Clothing có thể cung cấp cho cửa hàng của bạn những phong cách quần áo mới nhất", + "lead_question": "Bạn có quan tâm đến việc trở thành Đại lý được ủy quyền của Original Coast Clothing không?", + "lead_qualified": "Cảm ơn bạn đã quan tâm đến thương hiệu của chúng tôi. Chúng tôi sẽ liên hệ ngay với thông tin chi tiết", + "lead_disqualified": "Không sao, bạn luôn có thể mua quần áo qua trang web của chúng tôi https://www.originalcoastclothing.com/" + }, "curation": { "prompt": "Bạn đang tìm trang phục cho mình hay người khác?", "occasion": "Quá tuyệt! Mình bắt đầu thôi. Trước tiên, bạn định mặc trong dịp nào nhỉ?", @@ -33,7 +39,7 @@ "party": "Tiệc tùng", "sales": "Trò chuyện với nhân viên bán hàng", "shop": "Mua bộ này", - "title": "Bộ sưu tập mùa hè 2019", + "title": "Bộ sưu tập mùa hè 2022", "subtitle": "Trang phục nổi bật", "show": "Bộ khác" }, @@ -51,6 +57,7 @@ "order": "Thắc mắc về đơn đặt hàng", "billing": "Vấn đề về thanh toán", "other": "Khác", + "appointment": "Cảm ơn bạn đã muốn đặt một cuộc hẹn.", "issue": "Hi {{userFirstName}}! Tôi là {{agentFirstName}}. Rất vui được hỗ trợ bạn về mọi thắc mắc liên quan đến {{topic}}.", "default": "Hi {{userFirstName}}! Tôi là {{agentFirstName}}. Rất vui được hỗ trợ bạn hôm nay. Tôi có thể giúp gì cho bạn?", "style": "Hi {{userFirstName}}! Tôi là {{agentFirstName}}. Rất vui được giải đáp cho bạn mọi thắc mắc về phong cách thời trang mùa hè của chúng tôi", @@ -70,5 +77,9 @@ "fallback": { "any": "Rất tiếc, nhưng tôi không nhận ra tin nhắn \"{{message}}\".", "attachment": "Cảm ơn bạn đã gửi file đính kèm. Chúng tôi có thể kết nối bạn với nhân viên để xem lại file này hoặc chúng ta có thể bắt đầu lại." + }, + "common": { + "yes": "vâng", + "no": "không" } } diff --git a/locales/zh_CN.json b/locales/zh_CN.json index dab155f1..c550d832 100644 --- a/locales/zh_CN.json +++ b/locales/zh_CN.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "欢迎来到 Original Coast Clothing{{user_first_name}}!点击“立即开始”进入我们的自动消息体验示例。如果您想打造类似的体验,请访问 https://fb.me/get-sample-oc" }, "menu": { - "support": "客户支持", "order": "订单更新", "help": "转接客服", "suggestion": "穿搭建议", @@ -22,6 +21,13 @@ "apply": "使用折扣", "coupon": "将您的优惠券添加到对话里,就能以优惠价格结账购买夏季系列了" }, + "wholesale_leadgen": { + "intro": "您好,{{userFirstName}},我是{{agentFirstName}},我看到您希望加入我们的经销商计划", + "lead_intro": "嗨 {{userFirstName}}。 Original Coast Clothing 可以為您的商店提供新鮮的原創服裝款式", + "lead_question": "您有興趣成為 Original Coast Clothing 授權經銷商嗎?", + "lead_qualified": "感謝您表達對我們品牌的興趣。我們將盡快跟進更多信息", + "lead_disqualified": "沒問題,您可以隨時通過我們的網站 https://www.originalcoastclothing.com/ 購買服裝" + }, "curation": { "prompt": "您是想给自己还是给别人买衣服呢?", "occasion": "太好了!让我们马上开始吧。首先,着装场合是什么?", @@ -33,7 +39,7 @@ "party": "聚会", "sales": "转接销售", "shop": "买这套", - "title": "2019 夏季系列", + "title": "2022 夏季系列", "subtitle": "精选服装", "show": "换一套" }, @@ -51,6 +57,7 @@ "order": "订单查询", "billing": "账单问题", "other": "其他", + "appointment": "感谢您想预约。", "issue": "您好,{{userFirstName}},我是{{agentFirstName}},希望能帮您解决关于{{topic}}的问题。", "default": "您好,{{userFirstName}},我是{{agentFirstName}},今天由我来协助您。请问您需要什么帮助?", "style": "您好,{{userFirstName}},我是{{agentFirstName}},有关我们夏季款式的问题请尽管问我。", @@ -70,5 +77,9 @@ "fallback": { "any": "抱歉,我不知道“{{message}}”是什么。", "attachment": "感谢您发送这份附件,我们可以为您联系一名客服人员阅读附件,或者我们可以重新开始聊天" + }, + "common": { + "yes": "是的", + "no": "不" } } diff --git a/locales/zh_HK.json b/locales/zh_HK.json index dea7f1d7..17842343 100644 --- a/locales/zh_HK.json +++ b/locales/zh_HK.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "{{user_first_name}},歡迎來到 Original Coast Clothing!點擊「立即開始」,在範例中體驗我們的自動訊息功能。如果您想建立類似的自動訊息,請前往 https://fb.me/get-sample-oc" }, "menu": { - "support": "客戶支援團隊", "order": "訂單更新", "help": "聯絡代理商", "suggestion": "服裝建議", @@ -22,6 +21,13 @@ "apply": "套用優惠折扣", "coupon": "您已在此對話串中加入優惠券,快來購買夏季折扣系列商品吧" }, + "wholesale_leadgen": { + "intro": "您好,{{userFirstName}},我是{{agentFirstName}},我看到您希望加入我们的经销商计划", + "lead_intro": "嗨 {{userFirstName}}。 Original Coast Clothing 可以為您的商店提供新鮮的原創服裝款式", + "lead_question": "您有興趣成為 Original Coast Clothing 授權經銷商嗎?", + "lead_qualified": "感謝您表達對我們品牌的興趣。我們將盡快跟進更多信息", + "lead_disqualified": "沒問題,您可以隨時通過我們的網站 https://www.originalcoastclothing.com/ 購買服裝" + }, "curation": { "prompt": "您是為自己還是他人挑選服裝呢?", "occasion": "太好了!馬上開始吧。首先,您打算穿去什麼場合呢?", @@ -33,7 +39,7 @@ "party": "宴會", "sales": "聯絡銷售人員", "shop": "購買這套穿搭組合", - "title": "2019 年夏季商品系列", + "title": "2022 年夏季商品系列", "subtitle": "精選服裝", "show": "其他穿搭" }, @@ -51,6 +57,7 @@ "order": "訂單查詢", "billing": "帳單問題", "other": "其他", + "appointment": "感謝您想預約。", "issue": "{{userFirstName}},您好!我是 {{agentFirstName}},負責協助您處理任何與 {{topic}} 相關的問題。", "default": "{{userFirstName}},您好!我是 {{agentFirstName}},今天由我負責協助您。需要我提供什麼協助嗎?", "style": "{{userFirstName}},您好!我是 {{agentFirstName}},負責解答夏季穿搭風格的相關問題", @@ -70,5 +77,9 @@ "fallback": { "any": "很抱歉,我們無法辨識「{{message}}」。", "attachment": "感謝您傳送此附件,我們會將您轉介給負責處理此問題的代理商,或由我們重新檢視問題" + }, + "common": { + "yes": "是的", + "no": "不" } } diff --git a/locales/zh_TW.json b/locales/zh_TW.json index 67664d62..0e56c2a4 100644 --- a/locales/zh_TW.json +++ b/locales/zh_TW.json @@ -1,9 +1,8 @@ -{ +{ "profile": { "greeting": "{{user_first_name}},歡迎來到 Original Coast Clothing!點擊「立即開始」,在範例中體驗我們的自動訊息功能。如果您想要建立類似的自動訊息,請前往 https://fb.me/get-sample-oc" }, "menu": { - "support": "客戶支援團隊", "order": "訂單更新", "help": "聯絡代理商", "suggestion": "服裝建議", @@ -22,6 +21,13 @@ "apply": "套用優惠折扣", "coupon": "您已在此對話串中加入優惠券,快來購買夏季折扣系列商品吧" }, + "wholesale_leadgen": { + "intro": "您好,{{userFirstName}},我是{{agentFirstName}},我看到您希望加入我们的经销商计划", + "lead_intro": "嗨 {{userFirstName}}。 Original Coast Clothing 可以為您的商店提供新鮮的原創服裝款式", + "lead_question": "您有興趣成為 Original Coast Clothing 授權經銷商嗎?", + "lead_qualified": "感謝您表達對我們品牌的興趣。我們將盡快跟進更多信息", + "lead_disqualified": "沒問題,您可以隨時通過我們的網站 https://www.originalcoastclothing.com/ 購買服裝" + }, "curation": { "prompt": "您是為自己還是他人挑選服裝呢?", "occasion": "太棒了!馬上開始吧。首先,您打算穿去什麼場合呢?", @@ -33,7 +39,7 @@ "party": "宴會", "sales": "聯絡銷售人員", "shop": "購買這套穿搭組合", - "title": "2019 年夏季商品系列", + "title": "2022 年夏季商品系列", "subtitle": "精選服裝", "show": "其他穿搭" }, @@ -51,6 +57,7 @@ "order": "訂單查詢", "billing": "帳單問題", "other": "其他", + "appointment": "感謝您想預約。", "issue": "{{userFirstName}},您好!我是 {{agentFirstName}},負責協助您處理任何與 {{topic}} 相關的問題。", "default": "{{userFirstName}},您好!我是 {{agentFirstName}},今天由我負責協助您。需要我提供什麼協助嗎?", "style": "{{userFirstName}},您好!我是 {{agentFirstName}},負責解答夏季穿搭風格的相關問題", @@ -70,5 +77,9 @@ "fallback": { "any": "很抱歉,我們無法辨識「{{message}}」。", "attachment": "感謝您傳送此附件,我們會將您轉介給負責處理此問題的代理商,或由我們重新檢視問題" + }, + "common": { + "yes": "是的", + "no": "不" } } diff --git a/package.json b/package.json index c4dd20f2..934250ee 100644 --- a/package.json +++ b/package.json @@ -8,17 +8,17 @@ "lint": "./node_modules/.bin/eslint ." }, "dependencies": { + "ansi-regex": "^6.0.1", "body-parser": "^1.19.0", - "camelcase": "^5.3.1", "dotenv": "^8.1.0", - "ejs": "^2.6.2", + "ejs": "^3.1.8", "express": "^4.17.1", "i18n": "^0.8.3", - "path": "^0.12.7", - "request": "^2.88.0" + "node-fetch": "^2.6.1", + "path": "^0.12.7" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": ">=12.0 <=18.9.x" }, "repository": { "url": "https://github.com/fbsamples/original-coast-clothing" @@ -30,9 +30,10 @@ "webhook" ], "devDependencies": { - "eslint": "^6.2.2", - "eslint-config-prettier": "^6.1.0", - "eslint-plugin-prettier": "^3.1.0", - "prettier": "^1.18.2" + "ejs-lint": "^1.2.2", + "eslint": "^8.24.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "prettier": "^2.7.1" } } diff --git a/public/looks/female-dinner.jpg b/public/looks/female-dinner.jpg new file mode 100644 index 00000000..050b779a Binary files /dev/null and b/public/looks/female-dinner.jpg differ diff --git a/public/looks/female-party.jpg b/public/looks/female-party.jpg new file mode 100644 index 00000000..9df7918e Binary files /dev/null and b/public/looks/female-party.jpg differ diff --git a/public/looks/female-work.jpg b/public/looks/female-work.jpg new file mode 100644 index 00000000..64d8fc43 Binary files /dev/null and b/public/looks/female-work.jpg differ diff --git a/public/looks/male-dinner.jpg b/public/looks/male-dinner.jpg new file mode 100644 index 00000000..ffe1057b Binary files /dev/null and b/public/looks/male-dinner.jpg differ diff --git a/public/looks/male-party.jpg b/public/looks/male-party.jpg new file mode 100644 index 00000000..e0e24ffd Binary files /dev/null and b/public/looks/male-party.jpg differ diff --git a/public/looks/male-work.jpg b/public/looks/male-work.jpg new file mode 100644 index 00000000..3a0423ba Binary files /dev/null and b/public/looks/male-work.jpg differ diff --git a/public/looks/neutral-dinner.jpg b/public/looks/neutral-dinner.jpg new file mode 100644 index 00000000..48052007 Binary files /dev/null and b/public/looks/neutral-dinner.jpg differ diff --git a/public/looks/neutral-party.jpg b/public/looks/neutral-party.jpg new file mode 100644 index 00000000..3bec3047 Binary files /dev/null and b/public/looks/neutral-party.jpg differ diff --git a/public/looks/neutral-work.jpg b/public/looks/neutral-work.jpg new file mode 100644 index 00000000..44d519ed Binary files /dev/null and b/public/looks/neutral-work.jpg differ diff --git a/public/personas/billing.jpg b/public/personas/billing.jpg index 5d8fa695..bc25a343 100644 Binary files a/public/personas/billing.jpg and b/public/personas/billing.jpg differ diff --git a/public/personas/care.jpg b/public/personas/care.jpg index ea9ecfeb..6156bf8c 100644 Binary files a/public/personas/care.jpg and b/public/personas/care.jpg differ diff --git a/public/personas/order.jpg b/public/personas/order.jpg index 1f45ce76..6156bf8c 100644 Binary files a/public/personas/order.jpg and b/public/personas/order.jpg differ diff --git a/public/personas/sales.jpg b/public/personas/sales.jpg index d5cf8087..6156bf8c 100644 Binary files a/public/personas/sales.jpg and b/public/personas/sales.jpg differ diff --git a/public/styles/female-dinner.jpg b/public/styles/female-dinner.jpg deleted file mode 100644 index aba49285..00000000 Binary files a/public/styles/female-dinner.jpg and /dev/null differ diff --git a/public/styles/female-party.jpg b/public/styles/female-party.jpg deleted file mode 100644 index fc9e24cf..00000000 Binary files a/public/styles/female-party.jpg and /dev/null differ diff --git a/public/styles/female-work.jpg b/public/styles/female-work.jpg deleted file mode 100644 index e0eb7808..00000000 Binary files a/public/styles/female-work.jpg and /dev/null differ diff --git a/public/styles/male-dinner.jpg b/public/styles/male-dinner.jpg deleted file mode 100644 index 562a0b97..00000000 Binary files a/public/styles/male-dinner.jpg and /dev/null differ diff --git a/public/styles/male-party.jpg b/public/styles/male-party.jpg deleted file mode 100644 index 46e282ab..00000000 Binary files a/public/styles/male-party.jpg and /dev/null differ diff --git a/public/styles/male-work.jpg b/public/styles/male-work.jpg deleted file mode 100644 index 79c4fe51..00000000 Binary files a/public/styles/male-work.jpg and /dev/null differ diff --git a/public/styles/neutral-dinner.jpg b/public/styles/neutral-dinner.jpg deleted file mode 100644 index a800f732..00000000 Binary files a/public/styles/neutral-dinner.jpg and /dev/null differ diff --git a/public/styles/neutral-party.jpg b/public/styles/neutral-party.jpg deleted file mode 100644 index 3485a0fa..00000000 Binary files a/public/styles/neutral-party.jpg and /dev/null differ diff --git a/public/styles/neutral-work.jpg b/public/styles/neutral-work.jpg deleted file mode 100644 index 786a3366..00000000 Binary files a/public/styles/neutral-work.jpg and /dev/null differ diff --git a/services/care.js b/services/care.js index 8594eefb..efcb159a 100644 --- a/services/care.js +++ b/services/care.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. diff --git a/services/config.js b/services/config.js index c5dd794f..fc228718 100644 --- a/services/config.js +++ b/services/config.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -26,8 +26,8 @@ const ENV_VARS = [ module.exports = { // Messenger Platform API - mPlatformDomain: "https://graph.facebook.com", - mPlatformVersion: "v3.2", + apiDomain: "https://graph.facebook.com", + apiVersion: "v11.0", // Page and Application information pageId: process.env.PAGE_ID, @@ -48,13 +48,14 @@ module.exports = { // Preferred port (default to 3000) port: process.env.PORT || 3000, - get mPlatfom() { - return this.mPlatformDomain + "/" + this.mPlatformVersion; + // Base URL for Messenger Platform API calls + get apiUrl() { + return `${this.apiDomain}/${this.apiVersion}`; }, // URL of your webhook endpoint get webhookUrl() { - return this.appUrl + "/webhook"; + return `${this.appUrl}/webhook`; }, get newPersonas() { @@ -118,16 +119,16 @@ module.exports = { return [this.appUrl, this.shopUrl]; }, - checkEnvVariables: function() { - ENV_VARS.forEach(function(key) { + checkEnvVariables: function () { + ENV_VARS.forEach(function (key) { if (!process.env[key]) { - console.log("WARNING: Missing the environment variable " + key); + console.warn("WARNING: Missing the environment variable " + key); } else { // Check that urls use https if (["APP_URL", "SHOP_URL"].includes(key)) { const url = process.env[key]; if (!url.startsWith("https://")) { - console.log( + console.warn( "WARNING: Your " + key + ' does not begin with "https://"' ); } diff --git a/services/curation.js b/services/curation.js index d57d99d9..e2e5bfe0 100644 --- a/services/curation.js +++ b/services/curation.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -48,7 +48,7 @@ module.exports = class Curation { response = [ Response.genText(i18n.__("leadgen.coupon")), Response.genGenericTemplate( - `${config.appUrl}/styles/${outfit}.jpg`, + `${config.appUrl}/looks/${outfit}.jpg`, i18n.__("curation.title"), i18n.__("curation.subtitle"), [ @@ -175,7 +175,7 @@ module.exports = class Curation { outfit = `${this.user.gender}-${this.randomOutfit()}`; response = Response.genGenericTemplate( - `${config.appUrl}/styles/${outfit}.jpg`, + `${config.appUrl}/looks/${outfit}.jpg`, i18n.__("curation.title"), i18n.__("curation.subtitle"), [ @@ -190,6 +190,16 @@ module.exports = class Curation { ] ); break; + case "PRODUCT_LAUNCH": + // Build the recommendation logic here + outfit = `${this.user.gender}-${this.randomOutfit()}`; + response = Response.genRecurringNotificationsTemplate( + `${config.appUrl}/looks/${outfit}.jpg`, + i18n.__("curation.productLaunchTitle"), + "WEEKLY", + "12345" + ); + break; } return response; @@ -218,7 +228,7 @@ module.exports = class Curation { } let response = Response.genGenericTemplate( - `${config.appUrl}/styles/${outfit}.jpg`, + `${config.appUrl}/looks/${outfit}.jpg`, i18n.__("curation.title"), i18n.__("curation.subtitle"), buttons diff --git a/services/graph-api.js b/services/graph-api.js index 14b520f9..d33b6f02 100644 --- a/services/graph-api.js +++ b/services/graph-api.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -11,54 +11,55 @@ "use strict"; // Imports dependencies -const request = require("request"), - camelCase = require("camelcase"), - config = require("./config"); +const config = require("./config"), + fetch = require("node-fetch"), + { URL, URLSearchParams } = require("url"); -module.exports = class GraphAPi { - static callSendAPI(requestBody) { - // Send the HTTP request to the Messenger Platform - request( - { - uri: `${config.mPlatfom}/me/messages`, - qs: { - access_token: config.pageAccesToken - }, - method: "POST", - json: requestBody - }, - error => { - if (error) { - console.error("Unable to send message:", error); - } - } - ); +module.exports = class GraphApi { + static async callSendApi(requestBody) { + let url = new URL(`${config.apiUrl}/me/messages`); + url.search = new URLSearchParams({ + access_token: config.pageAccesToken + }); + console.warn("Request body is\n" + JSON.stringify(requestBody)); + console.warn("Request body is\n" + JSON.stringify(requestBody)); + let response = await fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(requestBody) + }); + if (!response.ok) { + console.warn( + `Unable to call Send API: ${response.statusText}`, + await response.json() + ); + } } - static callMessengerProfileAPI(requestBody) { + static async callMessengerProfileAPI(requestBody) { // Send the HTTP request to the Messenger Profile API console.log(`Setting Messenger Profile for app ${config.appId}`); - request( - { - uri: `${config.mPlatfom}/me/messenger_profile`, - qs: { - access_token: config.pageAccesToken - }, - method: "POST", - json: requestBody - }, - (error, _res, body) => { - if (!error) { - console.log("Request sent:", body); - } else { - console.error("Unable to send message:", error); - } - } - ); + let url = new URL(`${config.apiUrl}/me/messenger_profile`); + url.search = new URLSearchParams({ + access_token: config.pageAccesToken + }); + let response = await fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(requestBody) + }); + if (response.ok) { + console.log(`Request sent.`); + } else { + console.warn( + `Unable to callMessengerProfileAPI: ${response.statusText}`, + await response.json() + ); + } } - static callSubscriptionsAPI() { + static async callSubscriptionsAPI(customFields) { // Send the HTTP request to the Subscriptions Edge to configure your webhook // You can use the Graph API's /{app-id}/subscriptions edge to configure and // manage your app's Webhooks product @@ -66,246 +67,205 @@ module.exports = class GraphAPi { console.log( `Setting app ${config.appId} callback url to ${config.webhookUrl}` ); - request( - { - uri: `${config.mPlatfom}/${config.appId}/subscriptions`, - qs: { - access_token: config.appId + "|" + config.appSecret, - object: "page", - callback_url: config.webhookUrl, - verify_token: config.verifyToken, - fields: - "messages, messaging_postbacks, messaging_optins, \ - message_deliveries, messaging_referrals ", - include_values: "true" - }, - method: "POST" - }, - (error, _res, body) => { - if (!error) { - console.log("Request sent:", body); - } else { - console.error("Unable to send message:", error); - } - } - ); + + let fields = + "messages, messaging_postbacks, messaging_optins, " + + "message_deliveries, messaging_referrals"; + + if (customFields !== undefined) { + fields = fields + ", " + customFields; + } + + console.log({ fields }); + + let url = new URL(`${config.apiUrl}/${config.appId}/subscriptions`); + url.search = new URLSearchParams({ + access_token: `${config.appId}|${config.appSecret}`, + object: "page", + callback_url: config.webhookUrl, + verify_token: config.verifyToken, + fields: fields, + include_values: "true" + }); + let response = await fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" } + }); + if (response.ok) { + console.log(`Request sent.`); + } else { + console.error( + `Unable to callSubscriptionsAPI: ${response.statusText}`, + await response.json() + ); + } } - static callSubscribedApps() { + static async callSubscribedApps(customFields) { // Send the HTTP request to subscribe an app for Webhooks for Pages // You can use the Graph API's /{page-id}/subscribed_apps edge to configure // and manage your pages subscriptions // https://developers.facebook.com/docs/graph-api/reference/page/subscribed_apps console.log(`Subscribing app ${config.appId} to page ${config.pageId}`); - request( - { - uri: `${config.mPlatfom}/${config.pageId}/subscribed_apps`, - qs: { - access_token: config.pageAccesToken, - subscribed_fields: - "messages, messaging_postbacks, messaging_optins, \ - message_deliveries, messaging_referrals " - }, - method: "POST" - }, - error => { - if (error) { - console.error("Unable to send message:", error); - } - } - ); - } - - static async getUserProfile(senderPsid) { - try { - const userProfile = await this.callUserProfileAPI(senderPsid); - for (const key in userProfile) { - const camelizedKey = camelCase(key); - const value = userProfile[key]; - delete userProfile[key]; - userProfile[camelizedKey] = value; - } + let fields = + "messages, messaging_postbacks, messaging_optins, " + + "message_deliveries, messaging_referrals"; - return userProfile; - } catch (err) { - console.log("Fetch failed:", err); + if (customFields !== undefined) { + fields = fields + ", " + customFields; } - } - - static callUserProfileAPI(senderPsid) { - return new Promise(function(resolve, reject) { - let body = []; - // Send the HTTP request to the Graph API - request({ - uri: `${config.mPlatfom}/${senderPsid}`, - qs: { - access_token: config.pageAccesToken, - fields: "first_name, last_name, gender, locale, timezone" - }, - method: "GET" - }) - .on("response", function(response) { - // console.log(response.statusCode); + console.log({ fields }); - if (response.statusCode !== 200) { - reject(Error(response.statusCode)); - } - }) - .on("data", function(chunk) { - body.push(chunk); - }) - .on("error", function(error) { - console.error("Unable to fetch profile:" + error); - reject(Error("Network Error")); - }) - .on("end", () => { - body = Buffer.concat(body).toString(); - // console.log(JSON.parse(body)); - - resolve(JSON.parse(body)); - }); + let url = new URL(`${config.apiUrl}/${config.pageId}/subscribed_apps`); + url.search = new URLSearchParams({ + access_token: config.pageAccesToken, + subscribed_fields: fields + }); + let response = await fetch(url, { + method: "POST" }); + if (response.ok) { + console.log(`Request sent.`); + } else { + console.error( + `Unable to callSubscribedApps: ${response.statusText}`, + await response.json() + ); + } } - static getPersonaAPI() { - return new Promise(function(resolve, reject) { - let body = []; - - // Send the POST request to the Personas API - console.log(`Fetching personas for app ${config.appId}`); - - request({ - uri: `${config.mPlatfom}/me/personas`, - qs: { - access_token: config.pageAccesToken - }, - method: "GET" - }) - .on("response", function(response) { - // console.log(response.statusCode); - - if (response.statusCode !== 200) { - reject(Error(response.statusCode)); - } - }) - .on("data", function(chunk) { - body.push(chunk); - }) - .on("error", function(error) { - console.error("Unable to fetch personas:" + error); - reject(Error("Network Error")); - }) - .on("end", () => { - body = Buffer.concat(body).toString(); - // console.log(JSON.parse(body)); - - resolve(JSON.parse(body).data); - }); + static async getUserProfile(senderIgsid) { + let url = new URL(`${config.apiUrl}/${senderIgsid}`); + url.search = new URLSearchParams({ + access_token: config.pageAccesToken, + fields: "first_name, last_name, gender, locale, timezone" }); + let response = await fetch(url); + if (response.ok) { + let userProfile = await response.json(); + return { + firstName: userProfile.first_name, + lastName: userProfile.last_name, + gender: userProfile.gender, + locale: userProfile.locale, + timezone: userProfile.timezone + }; + } else { + console.warn( + `Could not load profile for ${senderIgsid}: ${response.statusText}`, + await response.json() + ); + return null; + } } - static postPersonaAPI(name, profile_picture_url) { - let body = []; + static async getPersonaAPI() { + // Send the POST request to the Personas API + console.log(`Fetching personas for app ${config.appId}`); - return new Promise(function(resolve, reject) { - // Send the POST request to the Personas API - console.log(`Creating a Persona for app ${config.appId}`); - - let requestBody = { - name: name, - profile_picture_url: profile_picture_url - }; - - request({ - uri: `${config.mPlatfom}/me/personas`, - qs: { - access_token: config.pageAccesToken - }, - method: "POST", - json: requestBody - }) - .on("response", function(response) { - // console.log(response.statusCode); - if (response.statusCode !== 200) { - reject(Error(response.statusCode)); - } - }) - .on("data", function(chunk) { - body.push(chunk); - }) - .on("error", function(error) { - console.error("Unable to create a persona:", error); - reject(Error("Network Error")); - }) - .on("end", () => { - body = Buffer.concat(body).toString(); - // console.log(JSON.parse(body)); + let url = new URL(`${config.apiUrl}/me/personas`); + url.search = new URLSearchParams({ + access_token: config.pageAccesToken + }); + let response = await fetch(url); + if (response.ok) { + let body = await response.json(); + return body.data; + } else { + console.warn( + `Unable to fetch personas for ${config.appId}: ${response.statusText}`, + await response.json() + ); + return null; + } + } - resolve(JSON.parse(body).id); - }); - }).catch(error => { - console.error("Unable to create a persona:", error, body); + static async postPersonaAPI(name, profile_picture_url) { + let requestBody = { + name, + profile_picture_url + }; + console.log(`Creating a Persona for app ${config.appId}`); + console.log({ requestBody }); + let url = new URL(`${config.apiUrl}/me/personas`); + url.search = new URLSearchParams({ + access_token: config.pageAccesToken + }); + let response = await fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(requestBody) }); + if (response.ok) { + console.log(`Request sent.`); + let json = await response.json(); + return json.id; + } else { + console.error( + `Unable to postPersonaAPI: ${response.statusText}`, + await response.json() + ); + } } - static callNLPConfigsAPI() { + static async callNLPConfigsAPI() { // Send the HTTP request to the Built-in NLP Configs API // https://developers.facebook.com/docs/graph-api/reference/page/nlp_configs/ console.log(`Enable Built-in NLP for Page ${config.pageId}`); - request( - { - uri: `${config.mPlatfom}/me/nlp_configs`, - qs: { - access_token: config.pageAccesToken, - nlp_enabled: true - }, - method: "POST" - }, - (error, _res, body) => { - if (!error) { - console.log("Request sent:", body); - } else { - console.error("Unable to activate built-in NLP:", error); - } - } - ); + + let url = new URL(`${config.apiUrl}/me/nlp_configs`); + url.search = new URLSearchParams({ + access_token: config.pageAccesToken, + nlp_enabled: true + }); + let response = await fetch(url, { + method: "POST" + }); + if (response.ok) { + console.log(`Request sent.`); + } else { + console.error(`Unable to activate built-in NLP: ${response.statusText}`); + } } - static callFBAEventsAPI(senderPsid, eventName) { - // Construct the message body + static async reportLeadSubmittedEvent(psid) { + let url = new URL(`${config.apiUrl}/${config.appId}/page_activities`); + url.search = new URLSearchParams({ + access_token: config.pageAccesToken + }); let requestBody = { - event: "CUSTOM_APP_EVENTS", - custom_events: JSON.stringify([ + custom_events: [ { - _eventName: "postback_payload", - _value: eventName, - _origin: "original_coast_clothing" + _eventName: "lead_submitted" } - ]), + ], advertiser_tracking_enabled: 1, application_tracking_enabled: 1, - extinfo: JSON.stringify(["mb1"]), page_id: config.pageId, - page_scoped_user_id: senderPsid + page_scoped_user_id: psid, + logging_source: "messenger_bot", + logging_target: "page" }; - - // Send the HTTP request to the Activities API - request( - { - uri: `${config.mPlatfom}/${config.appId}/activities`, + console.warn( + "Request to " + url + "\nWith body:\n" + JSON.stringify(requestBody) + ); + try { + let response = await fetch(url, { method: "POST", - form: requestBody - }, - error => { - if (!error) { - console.log(`FBA event '${eventName}'`); - } else { - console.error(`Unable to send FBA event '${eventName}':` + error); - } + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(requestBody) + }); + if (!response.ok) { + console.warn( + `Unable to call App Event API: ${response.statusText}`, + await response.json() + ); } - ); + } catch (error) { + console.error("Error while reporting lead submitted", error); + } } }; diff --git a/services/lead.js b/services/lead.js new file mode 100644 index 00000000..079a1403 --- /dev/null +++ b/services/lead.js @@ -0,0 +1,95 @@ +/** + * Copyright 2022-present, Facebook, Inc. All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + * + * Messenger For Original Coast Clothing + * https://developers.facebook.com/docs/messenger-platform/getting-started/sample-apps/original-coast-clothing + */ + +"use strict"; + +// Imports dependencies +const Response = require("./response"), + GraphApi = require("./graph-api"), + config = require("./config"), + i18n = require("../i18n.config"); + +module.exports = class Lead { + constructor(user, webhookEvent) { + this.user = user; + this.webhookEvent = webhookEvent; + } + + handleHandover(metadata) { + switch (metadata) { + case "messenger_lead_gen_complete": + return this.responseForLeadRef(); + case "messenger_lead_gen_incomplete": + return Response.genNuxMessage(this.user); + } + + return; + } + + responseForLeadRef() { + var responses = [ + Response.genTextWithPersona( + i18n.__("wholesale_leadgen.intro", { + userFirstName: this.user.firstName, + agentFirstName: config.personaSales.name, + topic: i18n.__("care.order") + }), + config.personaSales.id + ), + Response.genTextWithPersona(i18n.__("care.end"), config.personaSales.id) + ]; + responses[0].delay = 4000; + responses[1].delay = 6000; + return responses; + } + + handlePayload(payload) { + let response; + + switch (payload) { + case "WHOLESALE_LEAD_AD": + response = [ + Response.genText( + i18n.__("wholesale_leadgen.lead_intro", { + userFirstName: this.user.firstName + }) + ), + Response.genQuickReply(i18n.__("wholesale_leadgen.lead_question"), [ + { + title: i18n.__("common.yes"), + payload: "WHOLESALE_LEAD_YES" + }, + { + title: i18n.__("common.no"), + payload: "WHOLESALE_LEAD_NO" + } + ]) + ]; + break; + + case "WHOLESALE_LEAD_YES": + GraphApi.reportLeadSubmittedEvent(this.user.psid); + response = [ + Response.genText(i18n.__("wholesale_leadgen.lead_qualified")) + ]; + response.concat(this.responseForLeadRef()); + break; + + case "WHOLESALE_LEAD_NO": + response = [ + Response.genText(i18n.__("wholesale_leadgen.lead_disqualified")) + ]; + response.concat(Response.genNuxMessage(this.user)); + break; + } + + return response; + } +}; diff --git a/services/order.js b/services/order.js index d567d48a..b9ba1241 100644 --- a/services/order.js +++ b/services/order.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. diff --git a/services/profile.js b/services/profile.js index 0d50f196..cd870772 100644 --- a/services/profile.js +++ b/services/profile.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -11,15 +11,20 @@ "use strict"; // Imports dependencies -const GraphAPi = require("./graph-api"), +const GraphApi = require("./graph-api"), i18n = require("../i18n.config"), config = require("./config"), locales = i18n.getLocales(); module.exports = class Profile { setWebhook() { - GraphAPi.callSubscriptionsAPI(); - GraphAPi.callSubscribedApps(); + GraphApi.callSubscriptionsAPI(); + GraphApi.callSubscribedApps(); + } + + setPageFeedWebhook() { + GraphApi.callSubscriptionsAPI("feed"); + GraphApi.callSubscribedApps("feed"); } setThread() { @@ -29,65 +34,55 @@ module.exports = class Profile { ...this.getPersistentMenu() }; - GraphAPi.callMessengerProfileAPI(profilePayload); + GraphApi.callMessengerProfileAPI(profilePayload); } - setPersonas() { + async setPersonas() { let newPersonas = config.newPersonas; - GraphAPi.getPersonaAPI() - .then(personas => { - for (let persona of personas) { - config.pushPersona({ - name: persona.name, - id: persona.id - }); - } - console.log(config.personas); - return config.personas; - }) - .then(existingPersonas => { - for (let persona of newPersonas) { - if (!(persona.name in existingPersonas)) { - GraphAPi.postPersonaAPI(persona.name, persona.picture) - .then(personaId => { - config.pushPersona({ - name: persona.name, - id: personaId - }); - console.log(config.personas); - }) - .catch(error => { - console.log("Creation failed:", error); - }); - } else { - console.log("Persona already exists for name:", persona.name); - } - } - }) - .catch(error => { - console.log("Creation failed:", error); + let personas = await GraphApi.getPersonaAPI(); + for (let persona of personas) { + config.pushPersona({ + name: persona.name, + id: persona.id }); + } + let existingPersonas = config.personas; + console.log({ existingPersonas }); + + for (let persona of newPersonas) { + if (!(persona.name in existingPersonas)) { + let personaId = await GraphApi.postPersonaAPI( + persona.name, + persona.picture + ); + config.pushPersona({ + name: persona.name, + id: personaId + }); + console.log(config.personas); + } + } } setGetStarted() { let getStartedPayload = this.getGetStarted(); - GraphAPi.callMessengerProfileAPI(getStartedPayload); + GraphApi.callMessengerProfileAPI(getStartedPayload); } setGreeting() { let greetingPayload = this.getGreeting(); - GraphAPi.callMessengerProfileAPI(greetingPayload); + GraphApi.callMessengerProfileAPI(greetingPayload); } setPersistentMenu() { let menuPayload = this.getPersistentMenu(); - GraphAPi.callMessengerProfileAPI(menuPayload); + GraphApi.callMessengerProfileAPI(menuPayload); } setWhitelistedDomains() { let domainPayload = this.getWhitelistedDomains(); - GraphAPi.callMessengerProfileAPI(domainPayload); + GraphApi.callMessengerProfileAPI(domainPayload); } getGetStarted() { @@ -134,7 +129,7 @@ module.exports = class Profile { }) }; - console.log(localizedGreeting); + console.log({ localizedGreeting }); return localizedGreeting; } @@ -148,20 +143,14 @@ module.exports = class Profile { composer_input_disabled: false, call_to_actions: [ { - title: i18n.__("menu.support"), - type: "nested", - call_to_actions: [ - { - title: i18n.__("menu.order"), - type: "postback", - payload: "TRACK_ORDER" - }, - { - title: i18n.__("menu.help"), - type: "postback", - payload: "CARE_HELP" - } - ] + title: i18n.__("menu.order"), + type: "postback", + payload: "TRACK_ORDER" + }, + { + title: i18n.__("menu.help"), + type: "postback", + payload: "CARE_HELP" }, { title: i18n.__("menu.suggestion"), @@ -177,7 +166,7 @@ module.exports = class Profile { ] }; - console.log(localizedMenu); + console.log({ localizedMenu }); return localizedMenu; } @@ -186,7 +175,7 @@ module.exports = class Profile { whitelisted_domains: config.whitelistedDomains }; - console.log(whitelistedDomains); + console.log({ whitelistedDomains }); return whitelistedDomains; } }; diff --git a/services/receive.js b/services/receive.js index a5939a7d..fbfa24d2 100644 --- a/services/receive.js +++ b/services/receive.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -12,16 +12,19 @@ const Curation = require("./curation"), Order = require("./order"), + Lead = require("./lead"), Response = require("./response"), Care = require("./care"), Survey = require("./survey"), - GraphAPi = require("./graph-api"), - i18n = require("../i18n.config"); + GraphApi = require("./graph-api"), + i18n = require("../i18n.config"), + config = require("./config"); module.exports = class Receive { - constructor(user, webhookEvent) { + constructor(user, webhookEvent, isUserRef) { this.user = user; this.webhookEvent = webhookEvent; + this.isUserRef = isUserRef; } // Check if the event is a message or postback and @@ -46,6 +49,10 @@ module.exports = class Receive { responses = this.handlePostback(); } else if (event.referral) { responses = this.handleReferral(); + } else if (event.optin) { + responses = this.handleOptIn(); + } else if (event.pass_thread_control) { + responses = this.handlePassThreadControlHandover(); } } catch (error) { console.error(error); @@ -58,11 +65,11 @@ module.exports = class Receive { if (Array.isArray(responses)) { let delay = 0; for (let response of responses) { - this.sendMessage(response, delay * 2000); + this.sendMessage(response, delay * 2000, this.isUserRef); delay++; } } else { - this.sendMessage(responses); + this.sendMessage(responses, this.isUserRef); } } @@ -73,10 +80,11 @@ module.exports = class Receive { `${this.webhookEvent.message.text} for ${this.user.psid}` ); - // check greeting is here and is confident - let greeting = this.firstEntity(this.webhookEvent.message.nlp, "greetings"); + let event = this.webhookEvent; - let message = this.webhookEvent.message.text.trim().toLowerCase(); + // check greeting is here and is confident + let greeting = this.firstEntity(event.message.nlp, "greetings"); + let message = event.message.text.trim().toLowerCase(); let response; @@ -96,7 +104,7 @@ module.exports = class Receive { response = [ Response.genText( i18n.__("fallback.any", { - message: this.webhookEvent.message.text + message: event.message.text }) ), Response.genText(i18n.__("get_started.guidance")), @@ -108,6 +116,10 @@ module.exports = class Receive { { title: i18n.__("menu.help"), payload: "CARE_HELP" + }, + { + title: i18n.__("menu.product_launch"), + payload: "PRODUCT_LAUNCH" } ]) ]; @@ -153,10 +165,15 @@ module.exports = class Receive { let payload; if (postback.referral && postback.referral.type == "OPEN_THREAD") { payload = postback.referral.ref; - } else { + } else if (postback.payload) { // Get the payload of the postback payload = postback.payload; } + if (payload.trim().length === 0) { + console.log("Ignore postback with empty payload"); + return null; + } + return this.handlePayload(payload.toUpperCase()); } @@ -164,16 +181,48 @@ module.exports = class Receive { handleReferral() { // Get the payload of the postback let payload = this.webhookEvent.referral.ref.toUpperCase(); - + if (payload.trim().length === 0) { + console.log("Ignore referral with empty payload"); + return null; + } return this.handlePayload(payload); } + // Handles optins events + handleOptIn() { + let optin = this.webhookEvent.optin; + // Check for the special Get Starded with referral + let payload; + if (optin.type === "notification_messages") { + payload = "RN_" + optin.notification_messages_frequency.toUpperCase(); + this.sendRecurringMessage(optin.notification_messages_token, 5000); + return this.handlePayload(payload); + } + return null; + } + + handlePassThreadControlHandover() { + let new_owner_app_id = + this.webhookEvent.pass_thread_control.new_owner_app_id; + let previous_owner_app_id = + this.webhookEvent.pass_thread_control.previous_owner_app_id; + let metadata = this.webhookEvent.pass_thread_control.metadata; + if (config.appId === new_owner_app_id) { + console.log("Received a handover event, but is not for this app"); + return; + } + const lead_gen_app_id = 413038776280800; // App id for Messenger Lead Ads + if (previous_owner_app_id === lead_gen_app_id) { + let lead = new Lead(this.user, this.webhookEvent); + return lead.handleHandover(metadata); + } + // We have thread control but no context on what to do, default to New User Experience + return Response.genNuxMessage(this.user); + } + handlePayload(payload) { console.log("Received Payload:", `${payload} for ${this.user.psid}`); - // Log CTA event in FBA - GraphAPi.callFBAEventsAPI(this.user.psid, payload); - let response; // Set the response based on the payload @@ -183,7 +232,11 @@ module.exports = class Receive { payload === "GITHUB" ) { response = Response.genNuxMessage(this.user); - } else if (payload.includes("CURATION") || payload.includes("COUPON")) { + } else if ( + payload.includes("CURATION") || + payload.includes("COUPON") || + payload.includes("PRODUCT_LAUNCH") + ) { let curation = new Curation(this.user, this.webhookEvent); response = curation.handlePayload(payload); } else if (payload.includes("CARE")) { @@ -212,6 +265,18 @@ module.exports = class Receive { } ]) ]; + } else if (payload.includes("BOOK_APPOINTMENT")) { + response = [ + Response.genText(i18n.__("care.appointment")), + Response.genText(i18n.__("care.end")) + ]; + } else if (payload === "RN_WEEKLY") { + response = { + text: `[INFO]The following message is a sample Recurring Notification for a weekly frequency. This is usually sent outside the 24 hour window to notify users on topics that they have opted in.` + }; + } else if (payload.includes("WHOLESALE_LEAD")) { + let lead = new Lead(this.user, this.webhookEvent); + response = lead.handlePayload(payload); } else { response = { text: `This is a default postback message for payload: ${payload}!` @@ -221,39 +286,139 @@ module.exports = class Receive { return response; } - sendMessage(response, delay = 0) { - // Check if there is delay in the response - if ("delay" in response) { - delay = response["delay"]; - delete response["delay"]; - } + handlePrivateReply(type, object_id) { + let welcomeMessage = + i18n.__("get_started.welcome") + + " " + + i18n.__("get_started.guidance") + + ". " + + i18n.__("get_started.help"); + + let response = Response.genQuickReply(welcomeMessage, [ + { + title: i18n.__("menu.suggestion"), + payload: "CURATION" + }, + { + title: i18n.__("menu.help"), + payload: "CARE_HELP" + }, + { + title: i18n.__("menu.product_launch"), + payload: "PRODUCT_LAUNCH" + } + ]); - // Construct the message body let requestBody = { recipient: { - id: this.user.psid + [type]: object_id }, message: response }; + GraphApi.callSendApi(requestBody); + } - // Check if there is persona id in the response - if ("persona_id" in response) { - let persona_id = response["persona_id"]; - delete response["persona_id"]; - + sendMessage(response, delay = 0, isUserRef) { + // Check if there is delay in the response + if (response === undefined || response === null) { + return; + } + if ("delay" in response) { + delay = response["delay"]; + delete response["delay"]; + } + // Construct the message body + let requestBody = {}; + if (isUserRef) { + // For chat plugin + requestBody = { + recipient: { + user_ref: this.user.psid + }, + message: response + }; + } else { requestBody = { recipient: { id: this.user.psid }, - message: response, - persona_id: persona_id + message: response }; } - setTimeout(() => GraphAPi.callSendAPI(requestBody), delay); + // Check if there is persona id in the response + if ("persona_id" in response) { + let persona_id = response["persona_id"]; + delete response["persona_id"]; + if (isUserRef) { + // For chat plugin + requestBody = { + recipient: { + user_ref: this.user.psid + }, + message: response, + persona_id: persona_id + }; + } else { + requestBody = { + recipient: { + id: this.user.psid + }, + message: response, + persona_id: persona_id + }; + } + } + // Mitigate restriction on Persona API + // Persona API does not work for people in EU, until fixed is safer to not use + delete requestBody["persona_id"]; + + setTimeout(() => GraphApi.callSendApi(requestBody), delay); } + sendRecurringMessage(notificationMessageToken, delay) { + console.log("Received Recurring Message token"); + let requestBody = {}, + response, + curation; + //This example will send summer collection + curation = new Curation(this.user, this.webhookEvent); + response = curation.handlePayload("CURATION_BUDGET_50_DINNER"); + // Check if there is delay in the response + if (response === undefined) { + return; + } + requestBody = { + recipient: { + notification_messages_token: notificationMessageToken + }, + message: response + }; + + setTimeout(() => GraphApi.callSendApi(requestBody), delay); + } firstEntity(nlp, name) { return nlp && nlp.entities && nlp.entities[name] && nlp.entities[name][0]; } + + handleReportLeadSubmittedEvent() { + let requestBody = { + custom_events: [ + { + _eventName: "lead_submitted" + } + ], + advertiser_tracking_enabled: 1, + application_tracking_enabled: 1, + page_id: config.pageId, + page_scoped_user_id: this.user.psid, + logging_source: "messenger_bot", + logging_target: "page" + }; + try { + GraphApi.callAppEventApi(requestBody); + } catch (error) { + console.error("Error while reporting lead submitted", error); + } + } }; diff --git a/services/response.js b/services/response.js index 2b7fd953..101e828c 100644 --- a/services/response.js +++ b/services/response.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -47,7 +47,27 @@ module.exports = class Response { } } }; + return response; + } + static genRecurringNotificationsTemplate( + image_url, + title, + notification_messages_frequency, + payload + ) { + let response = { + attachment: { + type: "template", + payload: { + template_type: "notification_messages", + title: title, + image_url: image_url, + notification_messages_frequency: notification_messages_frequency, + payload: payload + } + } + }; return response; } @@ -141,6 +161,10 @@ module.exports = class Response { { title: i18n.__("menu.help"), payload: "CARE_HELP" + }, + { + title: i18n.__("menu.product_launch"), + payload: "PRODUCT_LAUNCH" } ]); diff --git a/services/survey.js b/services/survey.js index bfab46b3..d0090f84 100644 --- a/services/survey.js +++ b/services/survey.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. diff --git a/services/user.js b/services/user.js index c609ad35..61946872 100644 --- a/services/user.js +++ b/services/user.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-present, Facebook, Inc. All rights reserved. + * Copyright 2021-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. @@ -15,17 +15,15 @@ module.exports = class User { this.psid = psid; this.firstName = ""; this.lastName = ""; - this.locale = ""; + this.locale = "en_US"; this.timezone = ""; this.gender = "neutral"; } setProfile(profile) { - this.firstName = profile.firstName; - this.lastName = profile.lastName; - this.locale = profile.locale; - this.timezone = profile.timezone; - if (profile.gender) { - this.gender = profile.gender; - } + this.firstName = profile.firstName || ""; + this.lastName = profile.lastName || ""; + this.locale = profile.locale || ""; + this.timezone = profile.timezone || ""; + this.gender = profile.gender || ""; } }; diff --git a/views/footer.ejs b/views/footer.ejs index 98709269..9f1dc018 100644 --- a/views/footer.ejs +++ b/views/footer.ejs @@ -1,3 +1,12 @@ +<% /* %> + * Copyright 2021-present, Facebook, Inc. All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + * + * Messenger For Original Coast Clothing + * https://developers.facebook.com/docs/messenger-platform/getting-started/sample-apps/original-coast-clothing + <% */ %> - \ No newline at end of file + diff --git a/views/header.ejs b/views/header.ejs index 73c8a7b4..3ec4fefd 100644 --- a/views/header.ejs +++ b/views/header.ejs @@ -1,4 +1,13 @@ - + + diff --git a/views/index.ejs b/views/index.ejs index 7d1d7196..01256cbe 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -1,4 +1,13 @@ -<% include header %> +<% /* %> + * Copyright 2021-present, Facebook, Inc. All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + * + * Messenger For Original Coast Clothing + * https://developers.facebook.com/docs/messenger-platform/getting-started/sample-apps/original-coast-clothing + <% */ %> + <%- include('./header'); %>

Original Coast Clothing

@@ -17,7 +26,7 @@ >
  • - Wan't to build your own? + Want to build your own? DevDocs
  • -<% include footer %> +<%- include('./footer'); %> diff --git a/yarn.lock b/yarn.lock index d5dbd45a..0d276660 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,161 +2,172 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== +"@eslint/eslintrc@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" + integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.10.5": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" + integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@babel/highlight" "^7.0.0" + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +acorn-node@^1.2.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" -acorn-jsx@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" - integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a" - integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ== + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ambi@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220" - integrity sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA= - dependencies: - editions "^1.1.1" - typechecker "^4.3.0" - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - color-convert "^1.9.0" + color-convert "^2.0.1" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async@~1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -body-parser@1.19.0, body-parser@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.20.0, body-parser@^1.19.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: - bytes "3.1.0" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" brace-expansion@^1.1.7: version "1.1.11" @@ -166,82 +177,78 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +chalk@^4.0.0, chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + ansi-styles "^4.1.0" + supports-color "^7.1.0" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: - color-name "1.1.3" + color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" @@ -251,47 +258,28 @@ content-type@~1.0.4: cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -csextends@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/csextends/-/csextends-1.2.0.tgz#6374b210984b54d4495f29c99d3dd069b80543e5" - integrity sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - assert-plus "^1.0.0" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -debug@*, debug@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@*, debug@^4.1.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - ms "^2.1.1" + ms "2.1.2" debug@2.6.9: version "2.6.9" @@ -300,25 +288,27 @@ debug@2.6.9: dependencies: ms "2.0.0" -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" @@ -328,184 +318,182 @@ doctrine@^3.0.0: esutils "^2.0.2" dotenv@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.1.0.tgz#d811e178652bfb8a1e593c6dd704ec7e90d85ea2" - integrity sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA== - -eachr@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/eachr/-/eachr-2.0.4.tgz#466f7caa10708f610509e32c807aafe57fc122bf" - integrity sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8= - dependencies: - typechecker "^2.0.8" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -editions@^1.1.1, editions@^1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" - integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== - -editions@^2.1.0, editions@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/editions/-/editions-2.1.3.tgz#727ccf3ec2c7b12dcc652c71000f16c4824d6f7d" - integrity sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw== - dependencies: - errlop "^1.1.1" - semver "^5.6.0" + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" - integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +ejs-include-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ejs-include-regex/-/ejs-include-regex-1.0.0.tgz#e2f71575cbfd551ac800b2474c1f62a38e70093a" + integrity sha512-OTkvS8Dm8XhaE/+EKIjYjInRkNahQwkUUacAZXvA8Gqr5KEZrOsgFk8AkKYSnoTcdvKV0wnoG7YHWb4gkZFu8Q== + +ejs-lint@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ejs-lint/-/ejs-lint-1.2.2.tgz#b17e5239efd797dca2e7960e0f22c996d9a96f1b" + integrity sha512-ESR/MePvJJJfkK3EUAYlPKe2JM2nRDc4uFkGgbB5Prr06nluN7JozNVFL3Ze7LV7xNY7JPWEi5H3i4hOl6mxXw== + dependencies: + chalk "^4.0.0" + ejs "3.1.7" + ejs-include-regex "^1.0.0" + globby "^11.0.0" + read-input "^0.3.1" + slash "^3.0.0" + syntax-error "^1.1.6" + yargs "^16.0.0" + +ejs@3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.7.tgz#c544d9c7f715783dd92f0bddcf73a59e6962d006" + integrity sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw== + dependencies: + jake "^10.8.5" + +ejs@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -errlop@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.1.1.tgz#d9ae4c76c3e64956c5d79e6e035d6343bfd62250" - integrity sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw== - dependencies: - editions "^2.1.2" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.2.0.tgz#80e0b8714e3f6868c4ac2a25fbf39c02e73527a7" - integrity sha512-VLsgK/D+S/FEsda7Um1+N8FThec6LqE3vhcMyp8mlmto97y3fGf3DX7byJexGuOb1QY0Z/zz222U5t+xSfcZDQ== - dependencies: - get-stdin "^6.0.0" +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== -eslint-plugin-prettier@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz#8695188f95daa93b0dc54b249347ca3b79c4686d" - integrity sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA== +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-utils@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" - integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: - eslint-visitor-keys "^1.0.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + eslint-visitor-keys "^2.0.0" -eslint@^6.2.2: - version "6.3.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.3.0.tgz#1f1a902f67bfd4c354e7288b81e40654d927eb6a" - integrity sha512-ZvZTKaqDue+N8Y9g0kp6UPZtS4FSY3qARxBs7p4f0H0iof381XHduqVerFWtK8DPtKmemqbqCFENWSQgPR/Gow== - dependencies: - "@babel/code-frame" "^7.0.0" +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.24.0: + version "8.24.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.24.0.tgz#489516c927a5da11b3979dbfb2679394523383c8" + integrity sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ== + dependencies: + "@eslint/eslintrc" "^1.3.2" + "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "@humanwhocodes/module-importer" "^1.0.1" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.2" - eslint-visitor-keys "^1.1.0" - espree "^6.1.1" - esquery "^1.0.1" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^11.7.0" - ignore "^4.0.6" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.4.1" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.8.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de" - integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ== +espree@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== dependencies: - acorn "^7.0.0" - acorn-jsx "^5.0.2" - eslint-visitor-keys "^1.1.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -515,319 +503,278 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.20.0" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.10.3" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extendr@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/extendr/-/extendr-2.1.0.tgz#301aa0bbea565f4d2dc8f570f2a22611a8527b56" - integrity sha1-MBqgu+pWX00tyPVw8qImEahSe1Y= - dependencies: - typechecker "~2.0.1" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extract-opts@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/extract-opts/-/extract-opts-2.2.0.tgz#1fa28eba7352c6db480f885ceb71a46810be6d7d" - integrity sha1-H6KOunNSxttID4hc63GkaBC+bX0= - dependencies: - typechecker "~2.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: - escape-string-regexp "^1.0.5" + reusify "^1.0.4" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + locate-path "^6.0.0" + path-exists "^4.0.0" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" + flatted "^3.1.0" + rimraf "^3.0.2" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= +get-intrinsic@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: - assert-plus "^1.0.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" -glob-parent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" - integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^7.1.3: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@~6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + type-fest "^0.20.2" -graceful-fs@*: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +globby@^11.0.0, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + function-bind "^1.1.1" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" i18n@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.3.tgz#2d8cf1c24722602c2041d01ba6ae5eaa51388f0e" - integrity sha1-LYzxwkciYCwgQdAbpq5eqlE4jw4= + version "0.8.6" + resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.6.tgz#9608c58bfb8e29db34aa9a09e37dccb9b5666e01" + integrity sha512-aMsJq8i1XXrb+BBsgmJBwak9mr69zPEIAUPb6c5yw2G/O4k1Q52lBxL+agZdQDN/RGf1ylQzrCswsOOgIiC1FA== dependencies: debug "*" - make-plural "^3.0.3" - math-interval-parser "^1.1.0" - messageformat "^0.3.1" + make-plural "^6.0.1" + math-interval-parser "^2.0.1" + messageformat "^2.3.0" mustache "*" - sprintf-js ">=1.0.3" + sprintf-js "^1.1.2" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignorefs@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ignorefs/-/ignorefs-1.2.0.tgz#da59fb858976e4a5e43702ccd1f282fdbc9e5756" - integrity sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y= - dependencies: - editions "^1.3.3" - ignorepatterns "^1.1.0" - -ignorepatterns@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ignorepatterns/-/ignorepatterns-1.1.0.tgz#ac8f436f2239b5dfb66d5f0d3a904a87ac67cc5e" - integrity sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4= +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" - integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -835,12 +782,12 @@ import-fresh@^3.0.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -853,305 +800,273 @@ inherits@2, inherits@2.0.4: inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inquirer@^6.4.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -ipaddr.js@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-sdsl@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" + integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== -js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + argparse "^2.0.1" json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + p-locate "^5.0.0" -lodash@^4.17.12, lodash@^4.17.14: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -make-plural@^3.0.3, make-plural@~3.0.3: - version "3.0.6" - resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-3.0.6.tgz#2033a03bac290b8f3bb91258f65b9df7e8b01ca7" - integrity sha1-IDOgO6wpC487uRJY9lud9+iwHKc= +make-plural@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735" + integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA== optionalDependencies: minimist "^1.2.0" -math-interval-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-1.1.0.tgz#dbeda5b06b3249973c6df6170fde2386f0afd893" - integrity sha1-2+2lsGsySZc8bfYXD94jhvCv2JM= - dependencies: - xregexp "^2.0.0" +make-plural@^6.0.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-6.2.2.tgz#beb5fd751355e72660eeb2218bb98eec92853c6c" + integrity sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA== + +math-interval-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-2.0.1.tgz#e22cd6d15a0a7f4c03aec560db76513da615bed4" + integrity sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== -messageformat@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-0.3.1.tgz#e58fff8245e9b3971799e5b43db58b3e9417f5a2" - integrity sha1-5Y//gkXps5cXmeW0PbWLPpQX9aI= +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +messageformat-formatters@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz#0492c1402a48775f751c9b17c0354e92be012b08" + integrity sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg== + +messageformat-parser@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-4.1.3.tgz#b824787f57fcda7d50769f5b63e8d4fda68f5b9e" + integrity sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg== + +messageformat@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-2.3.0.tgz#de263c49029d5eae65d7ee25e0754f57f425ad91" + integrity sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w== dependencies: - async "~1.5.2" - glob "~6.0.4" - make-plural "~3.0.3" - nopt "~3.0.6" - watchr "~2.4.13" + make-plural "^4.3.0" + messageformat-formatters "^2.0.1" + messageformat-parser "^4.1.2" methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.40.0" + mime-db "1.52.0" mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -"minimatch@2 || 3", minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= +minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mustache@*: - version "3.0.3" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.0.3.tgz#ee4fb971887fa6cc1b6b6d219a74b5e3c7535f32" - integrity sha512-vM5FkMHamTYmVYeAujypihuPrJQDtaUIlKeeVb1AMJ73OZLtWiF7GprqrjxD0gJWT53W9JfqXxf97nXQjMQkqA== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mustache@*: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= +node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: - abbrev "1" + whatwg-url "^5.0.0" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - mimic-fn "^1.0.0" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" + yocto-queue "^0.1.0" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" @@ -1165,38 +1080,48 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== path@^0.12.7: version "0.12.7" resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" - integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= + integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== dependencies: process "^0.11.1" util "^0.10.3" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -1205,381 +1130,245 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== process@^0.11.1: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -proxy-addr@~2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" - integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" - ipaddr.js "1.9.0" - -psl@^1.1.24: - version "1.3.1" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.1.tgz#d5aa3873a35ec450bc7db9012ad5a7246f6fc8bd" - integrity sha512-2KLd5fKOdAfShtY2d/8XDWVRnmp3zp40Qt6ge2zBPFARLXOGUf2fHD5eg+TV/5oxBtQKVhjUaKFsAaE4HnwfSA== - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + forwarded "0.2.0" + ipaddr.js "1.9.1" punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" +read-input@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/read-input/-/read-input-0.3.1.tgz#5b3169308013464ffda6ec92e58d2d3cea948df1" + integrity sha512-J1ZkWCnB4altU7RTe+62PSfa21FrEtfKyO9fuqR3yP8kZku3nIwaw2Krj383JC7egAIl5Zyz2w+EOu9uXH5HZw== + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -rxjs@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - tslib "^1.9.0" + queue-microtask "^1.2.2" -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safefs@^3.1.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/safefs/-/safefs-3.2.2.tgz#8170c1444d7038e08caea05a374fae2fa349e15c" - integrity sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw= - dependencies: - graceful-fs "*" +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scandirectory@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/scandirectory/-/scandirectory-2.5.0.tgz#6ce03f54a090b668e3cbedbf20edf9e310593e72" - integrity sha1-bOA/VKCQtmjjy+2/IO354xBZPnI= - dependencies: - ignorefs "^1.0.0" - safefs "^3.1.2" - taskgroup "^4.0.5" - -semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.1.2: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "2.0.0" mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" + ms "2.1.3" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + send "0.18.0" -shebang-command@^1.2.0: +setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" -signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -sprintf-js@>=1.0.3: +sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - ansi-regex "^3.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^4.1.0" + ansi-regex "^5.0.1" -strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -taskgroup@^4.0.5, taskgroup@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-4.3.1.tgz#7de193febd768273c457730497024d512c27915a" - integrity sha1-feGT/r12gnPEV3MElwJNUSwnkVo= +syntax-error@^1.1.6: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== dependencies: - ambi "^2.2.0" - csextends "^1.0.3" + acorn-node "^1.2.0" text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - os-tmpdir "~1.0.2" + is-number "^7.0.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - safe-buffer "^5.0.1" + prelude-ls "^1.2.1" -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -1587,32 +1376,15 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typechecker@^2.0.8: - version "2.1.0" - resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.1.0.tgz#d1c2093a54ff8a19f58cff877eeaa54f2242d383" - integrity sha1-0cIJOlT/ihn1jP+HfuqlTyJC04M= - -typechecker@^4.3.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.7.0.tgz#5249f427358f45b7250c4924fd4d01ed9ba435e9" - integrity sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ== - dependencies: - editions "^2.1.0" - -typechecker@~2.0.1: - version "2.0.8" - resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.0.8.tgz#e83da84bb64c584ccb345838576c40b0337db82e" - integrity sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4= - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -1626,71 +1398,81 @@ util@^0.10.3: utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== - -v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -watchr@~2.4.13: - version "2.4.13" - resolved "https://registry.yarnpkg.com/watchr/-/watchr-2.4.13.tgz#d74847bb4d6f90f61fe2c74f9f68662aa0e07601" - integrity sha1-10hHu01vkPYf4sdPn2hmKqDgdgE= - dependencies: - eachr "^2.0.2" - extendr "^2.1.0" - extract-opts "^2.2.0" - ignorefs "^1.0.0" - safefs "^3.1.2" - scandirectory "^2.5.0" - taskgroup "^4.2.0" - typechecker "^2.0.8" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -xregexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^16.0.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==