From 0d242d5fcf6c86e872b1ca3deaed82d46f19f733 Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Fri, 12 Feb 2021 05:27:23 -0500 Subject: [PATCH 001/680] init --- src/views/docs/en/guides/domains/Namecheap.md | 11 +++ .../docs/en/guides/domains/cloudflare.md | 11 +++ src/views/docs/en/guides/domains/dreamhost.md | 11 +++ src/views/docs/en/guides/domains/godaddy.md | 11 +++ src/views/docs/en/guides/domains/one.md | 11 +++ src/views/docs/en/guides/domains/route-53.md | 69 +++++++++++++++++++ .../docs/en/guides/domains/start-here.md | 52 ++++++++++++++ src/views/docs/table-of-contents.js | 9 +++ 8 files changed, 185 insertions(+) create mode 100644 src/views/docs/en/guides/domains/Namecheap.md create mode 100644 src/views/docs/en/guides/domains/cloudflare.md create mode 100644 src/views/docs/en/guides/domains/dreamhost.md create mode 100644 src/views/docs/en/guides/domains/godaddy.md create mode 100644 src/views/docs/en/guides/domains/one.md create mode 100644 src/views/docs/en/guides/domains/route-53.md create mode 100644 src/views/docs/en/guides/domains/start-here.md diff --git a/src/views/docs/en/guides/domains/Namecheap.md b/src/views/docs/en/guides/domains/Namecheap.md new file mode 100644 index 00000000..ae7b3845 --- /dev/null +++ b/src/views/docs/en/guides/domains/Namecheap.md @@ -0,0 +1,11 @@ +--- +title: Namecheap +description: Setting up a domain name with Namecheap +sections: + - Overview + - + - + - +--- + +## Overview \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/cloudflare.md b/src/views/docs/en/guides/domains/cloudflare.md new file mode 100644 index 00000000..565787ba --- /dev/null +++ b/src/views/docs/en/guides/domains/cloudflare.md @@ -0,0 +1,11 @@ +--- +title: Cloudflare +description: Setting up a domain name with Cloudflare +sections: + - Overview + - + - + - +--- + +## Overview \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/dreamhost.md b/src/views/docs/en/guides/domains/dreamhost.md new file mode 100644 index 00000000..1f48b24f --- /dev/null +++ b/src/views/docs/en/guides/domains/dreamhost.md @@ -0,0 +1,11 @@ +--- +title: Dreamhost +description: Setting up a domain name with Dreamhost +sections: + - Overview + - + - + - +--- + +## Overview \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/godaddy.md b/src/views/docs/en/guides/domains/godaddy.md new file mode 100644 index 00000000..c4b6197c --- /dev/null +++ b/src/views/docs/en/guides/domains/godaddy.md @@ -0,0 +1,11 @@ +--- +title: Godaddy +description: Setting up a domain name with Godaddy +sections: + - Overview + - + - + - +--- + +## Overview \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/one.md b/src/views/docs/en/guides/domains/one.md new file mode 100644 index 00000000..7aeb0693 --- /dev/null +++ b/src/views/docs/en/guides/domains/one.md @@ -0,0 +1,11 @@ +--- +title: One.com +description: Setting up a domain name with One.com +sections: + - Overview + - + - + - +--- + +## Overview \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/route-53.md b/src/views/docs/en/guides/domains/route-53.md new file mode 100644 index 00000000..ed0978b1 --- /dev/null +++ b/src/views/docs/en/guides/domains/route-53.md @@ -0,0 +1,69 @@ +--- +title: Route 53 +description: Setting up a domain name with Route 53 +sections: + - Overview + - Purchase/Transfer domain + - Get AWS Certificate + - Map domain names +--- + +## Overview + +Follow these instructions to manually configure Route 53 to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. + +> ⛳️ Tip: These instructions will serve your app's `production` environment; if you'd also like a friendly URL for your `staging` environment (i.e. staging.example.com), follow steps 10-15 below a second time, swapping `production` values for `staging` values. + +## Step 1: Purchase/Transfer domain + +Depending on your situation, you may be ready to purchase a brand new domain or transfer a domain from a different registrar. Buying a brand new domain is a quick and straightforward process while transferring in a domain will vary from each user's situation. + +### Purchase domain + +To purchase a domain, sign into the AWS Console, head to the Route 53 service. Check to see if the domain you want is available. If it is available, follow the instructions to purchase the domain. When you register your domain via Route53, it gets added to a `hosted zone` automatically. The `hosted zone` is where you will manually configure your DNS. + +### Transfer Domain + +To transfer the registration for a domain to Amazon Route 53, carefully follow the procedures in this article from the AWS documentation. + +[Transferring registration for a domain to Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) + +## Get SSL Certificates + +Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. + +- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. +- Click the `Get started` button in the Provision certificates section. +- Follow the instructions to add certs to the hosted zone DNS. +- The certificates may say `pending` for a few hours until it propagates. + +## Map domain names + +Sign into AWS API Gateway. Follow these intrructions for adding both `production` domain and `staging` domain. + +- Click on **Custom Domain Names** +- Create a **Custom Domain Name** for `production` +- Fill in the form: + - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field + - Select the **ACM Certificate** you just verified + - Click `Create domain name` + - Enter `/` in the **Path** field + - Select your app's `production` API name in the **Destination** menu + - Select the `production` value in the **Stage** menu +- Copy the value of the generated **Distribution Domain Name** to your clipboard + +### Head back to Route 53 and click into the domain in question. + +- Create a **Record Set** +- Fill in the form: + - If setting a subdomain, enter it in the **Name** field + - Click `Create Record`. + - Change `Record type` to `A`. + - Make sure `Routing policy` is set to `Simple routing`. + - Make sure `Record type` is set to `Routes traffic to an Ipv4 address and some AWS resources`. + - In the `Value/Route traffic to` sections: + - Set to `Alias to Cloudfront distribution`. + - Pick a `region`. + - Copy and paste the alias value from Begin into the `Choose Distribution` input. It should be a Cloudfront link like this: `d1poav0i4gjqri.cloudfront.net` + - Click `Create record`. +- Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/start-here.md b/src/views/docs/en/guides/domains/start-here.md new file mode 100644 index 00000000..d87490a5 --- /dev/null +++ b/src/views/docs/en/guides/domains/start-here.md @@ -0,0 +1,52 @@ +--- +title: "Start here: custom domains" +description: Setting up a domain name with Route 53 +sections: + - Overview + - DNS guides + - Setting up your project +--- + +## Overview + +### Give your Architect application a proper domain name. + +DNS is how you assign a domain name to a deployed app. This guide lists ways to set up custom DNS with several popular DNS providers and we are always happy to accept contributions for steps to use additional providers. + +You may use a free registrar-based DNS to host your domain on Begin such as Godaddy, Namecheap, One, etc., but Route53 is the preferred registrar and DNS management system for Architect users. This is because: + +- It's integrated with Amazon's other cloud services. +- Your DNS will resolve from 15+ locations worldwide, making your website faster for your end-users. +- Route53 is a DNS management system (Smart DNS) compared to all the others, which are merely domain registrars with a limited feature set for manipulating DNS. + +## Setting up your project + +To prepare your arc app for setting up a custom domain, you first have to deploy your app to `staging` and `production`. + +Deploy to a `staging` stack: + +```bash +arc deploy +``` +> Protip: create additional `staging` stacks with `--name` + +Ship a `production` stack: + +```bash +arc deploy production +``` + +All done! + +> Remember to save the two generated `URLs` because we will need to input these into the AWS console in the next steps. + +## DNS guides + +Setting up a custom domain for each registrar will be a bit different. To manually configure DNS, you can follow these guides below: + +- [Route 53](/docs/en/guides/domains/route-53) +- [Cloudflare](/docs/en/guides/domains/cloudflare) +- [Dreamhost](/docs/en/guides/domains/dreamhost) +- [Godaddy](/docs/en/guides/domains/godaddy) +- [One](/docs/en/guides/domains/one) +- [Namecheap](/docs/en/guides/domains/namecheap) \ No newline at end of file diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index dc9a3878..e76fc508 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -20,6 +20,15 @@ let Guides = [ { // TODO 'Middleware', // TODO 'WebSockets functions', ], + 'Domains': [ + 'Start here', + 'Route 53', + 'Cloudflare', + 'Dreamhost', + 'Godaddy', + 'One', + 'Namecheap' + ], /* TODO 'Backend': [ 'Database tables & indexes', From a38d2fcf55e64a4111c5bad49cd1c5d8858c8e81 Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Fri, 12 Feb 2021 08:36:18 -0500 Subject: [PATCH 002/680] guides --- src/views/docs/en/guides/domains/Namecheap.md | 76 ++++++++++++++++- src/views/docs/en/guides/domains/dreamhost.md | 76 ++++++++++++++++- src/views/docs/en/guides/domains/godaddy.md | 79 ++++++++++++++++- src/views/docs/en/guides/domains/one.md | 84 ++++++++++++++++++- src/views/docs/en/guides/domains/route-53.md | 12 ++- 5 files changed, 308 insertions(+), 19 deletions(-) diff --git a/src/views/docs/en/guides/domains/Namecheap.md b/src/views/docs/en/guides/domains/Namecheap.md index ae7b3845..10c2b9c5 100644 --- a/src/views/docs/en/guides/domains/Namecheap.md +++ b/src/views/docs/en/guides/domains/Namecheap.md @@ -3,9 +3,77 @@ title: Namecheap description: Setting up a domain name with Namecheap sections: - Overview - - - - - - + - Get SSL Certificates + - Map domain names + - Conclusion --- -## Overview \ No newline at end of file +## Overview + +Follow these instructions to manually configure Namecheap to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. + +This article assumes that you have already: + +- signed up for Namecheap +- purchased the domain of your choice + +## Get SSL Certificates + +In this step, you'll need to add two `CNAME` values to your Namecheap DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. + +- Click the `Get started` button in the Provision certificates section. +- Click `Request a public certificate`. +- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. + +### Open Namecheap DNS manager + +Head back to the Namecheap console and navigate to the `Advanced DNS` page for your specific domain. During the SSL verification step, the first part of the name gets entered as your CNAME subdomain, and the value is inputted as the value. For instance, when you're provided the following CNAME entry: + +- Name: `_2f9b34277e4b159e0beaa859e8802a93.www.example.com` +- Value: `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` + +You'll add a CNAME subdomain of +- `_2f9b34277e4b159e0beaa859e8802a93` within your Namecheap +- `Host` zone, and set its value to `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.`. + +Due to the eventually consistent nature of DNS-based verification, it may take a few minutes for your changes to get picked up. Check back after a few minutes, and your values should be green, and you should be able to complete the next and final step. + +> If for some reason after more than a few minutes your domains haven't verified, make sure that you've correctly entered the settings into your DNS. + +## Map domain names + +Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. + +- Click on **Custom Domain Names** +- Create a **Custom Domain Name** for `production` +- Fill in the form: + - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field + - Select the **ACM Certificate** you just verified + - Click `Create domain name` + - Enter `/` in the **Path** field + - Select your app's `production` API name in the **Destination** menu + - Select the `production` value in the **Stage** menu +- Copy the value of the generated **Distribution Domain Name** to your clipboard + +### Head back to Namecheap and click into the domain in question. + +In the final step, you'll add the final `CNAME` and `ALIAS` records to your Namecheap. This points your domain at your Begin app. + +When you provide the `CNAME` record: + +- Switch to `CNAME` record setting. +- Host: `staging` +- Value: `pi1f6fddqd0dje.cloudfront.net` + + +When you provide the `ALIAS` record: + +- Switch to `Alias` record setting. +- Host: `@` +- Value: `pi1f6fddqd0dje.cloudfront.net` + +## Conclusion + +Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). + +Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/dreamhost.md b/src/views/docs/en/guides/domains/dreamhost.md index 1f48b24f..cb6e6a51 100644 --- a/src/views/docs/en/guides/domains/dreamhost.md +++ b/src/views/docs/en/guides/domains/dreamhost.md @@ -3,9 +3,77 @@ title: Dreamhost description: Setting up a domain name with Dreamhost sections: - Overview - - - - - - + - Get SSL Certificates + - Map domain names + - Conclusion --- -## Overview \ No newline at end of file +## Overview + +Follow these instructions to manually configure Dreamhost to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. + +This article assumes that you have already: + +- signed up for Dreamhost +- purchased the domain of your choice + +## Get SSL Certificates + +In this step, you'll need to add two `CNAME` values to your Dreamhost DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. + +- Click the `Get started` button in the Provision certificates section. +- Click `Request a public certificate`. +- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. + +### Open Dreamhost DNS manager + +Head back to the Dreamhost console and navigate to the `DNS records` page for your specific domain. During the SSL verification step, the first part of the name gets entered as your `CNAME` subdomain, and the value is inputted as the value. For instance, when you're provided the following `CNAME` entry: + +- **Name:** `_2f9b34277e4b159e0beaa859e8802a93.example.com` +- **Value:** `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` + +You'll add a CNAME subdomain of + +- `_2f9b34277e4b159e0beaa859e8802a93` within your Dreamhost DNS console `Host` zone. + +Then, set its `Points to` to +- `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` + +Due to the eventually consistent nature of DNS-based verification, the certificates may say `pending` for a few hours until it propagates. Check back after a few minutes, and your values should be green, and you should be able to complete the next and final step. + +## Map domain names + +Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. + +- Click on **Custom Domain Names** +- Create a **Custom Domain Name** for `production` +- Fill in the form: + - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field + - Select the **ACM Certificate** you just verified + - Click `Create domain name` + - Enter `/` in the **Path** field + - Select your app's `production` API name in the **Destination** menu + - Select the `production` value in the **Stage** menu +- Copy the value of the generated **Distribution Domain Name** to your clipboard + +### Head back to Dreamhost and click into the domain in question. + +In the final step, you'll add the final `CNAME` and `ALIAS` records to your Dreamhost. This points your domain at your arc app. + +When you provide the `CNAME` record: + +- Switch to the `CNAME` record setting. +- **Name:** `staging` +- **Value:** `exampleurl.cloudfront.net` + +When you provide the `A` record: + +- Switch to the `ALIAS ` record setting. +- **Name:** leave blank +- **Value** section, add the Cloudfront URL + +## Conclusion + +Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). + +Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/godaddy.md b/src/views/docs/en/guides/domains/godaddy.md index c4b6197c..f3bfe52e 100644 --- a/src/views/docs/en/guides/domains/godaddy.md +++ b/src/views/docs/en/guides/domains/godaddy.md @@ -3,9 +3,80 @@ title: Godaddy description: Setting up a domain name with Godaddy sections: - Overview - - - - - - + - Get SSL Certificates + - Map domain names + - Conclusion --- -## Overview \ No newline at end of file +## Overview + +Follow these instructions to manually configure Godaddy to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. + +This article assumes that you have already: + +- signed up for Godaddy +- purchased the domain of your choice + +## Get SSL Certificates + +In this step, you'll need to add two `CNAME` values to your Godaddy DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. + +- Click the `Get started` button in the Provision certificates section. +- Click `Request a public certificate`. +- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. + +### Verify your ownership of the domain(s). + +In this step, you'll need to add two `CNAME` values to your Godaddy DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. + +Head back to the Godaddy console and navigate to the `DNS records` page for your specific domain. During the SSL verification step, the first part of the name gets entered as your `CNAME` subdomain, and the value is inputted as the value. For instance, when you're provided the following `CNAME` entry: + +- **Name:** `_2f9b34277e4b159e0beaa859e8802a93.www.example.com` +- **Value:** `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` + +You'll add a CNAME subdomain of + +- `_2f9b34277e4b159e0beaa859e8802a93` within your Godaddy DNS console `Host` zone. + +Then, set its `Points to` to +- `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` + +Due to the eventually consistent nature of DNS-based verification, it may take a few minutes for your changes to get picked up. Check back after a few minutes, and your values should be green, and you should be able to complete the next and final step. + +## Map domain names + +Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. + +- Click on **Custom Domain Names** +- Create a **Custom Domain Name** for `production` +- Fill in the form: + - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field + - Select the **ACM Certificate** you just verified + - Click `Create domain name` + - Enter `/` in the **Path** field + - Select your app's `production` API name in the **Destination** menu + - Select the `production` value in the **Stage** menu +- Copy the value of the generated **Distribution Domain Name** to your clipboard + +### Head back to Godaddy and click into the domain in question. + +In the final step, you'll add the final `CNAME` and `A` records to your Godaddy. This points your domain at your arc app. + +When you provide the `CNAME` record: + +- Switch to `CNAME` record setting. +- **Host:** `staging` +- **Points to:** `pi1f6fddqd0dje.cloudfront.net` + +When you provide the `A` record: + +- Switch to `A` record setting. +- **Host:** input `@` symbol +- Find out the IP address of the given cloudfront URL (`http://pi1f6fddqd0dje.cloudfront.net`) using a tool like [24x7.com](https://www.site24x7.com/find-ip-address-of-web-site.html) +- Lastly in the **Points to:** section, add the IP address. + +## Conclusion + +Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). + +Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/one.md b/src/views/docs/en/guides/domains/one.md index 7aeb0693..5cd45d2c 100644 --- a/src/views/docs/en/guides/domains/one.md +++ b/src/views/docs/en/guides/domains/one.md @@ -3,9 +3,85 @@ title: One.com description: Setting up a domain name with One.com sections: - Overview - - - - - - + - Get SSL Certificates + - Map domain names + - Conclusion --- -## Overview \ No newline at end of file +## Overview + +Follow these instructions to manually configure One to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. + +This article assumes that you have already: + +- signed up for One.com +- purchased the domain of your choice + +## Get SSL Certificates + +In this step, you'll need to add two `CNAME` values to your One DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. + +- Click the `Get started` button in the Provision certificates section. +- Click `Request a public certificate`. +- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. + +### Verify your ownership of the domain(s). + +In this step, you'll need to add two `CNAME` values to your One.com DNS in order to verify your ownership of the domain and generate your SSL certificates for HTTPS. + +Head back to the One.com console and navigate to the `DNS records` page for your specific domain. During the SSL verification step, the first part of the name gets entered as your `CNAME` subdomain, and the value is inputted as the value. For instance, when you're provided the following `CNAME` entry: + +- **Name:** `_2f9b34277e4b159e0beaa859e8802a93.www.example.com` +- **Value:** `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` + +You'll add a CNAME subdomain of + +- `_2f9b34277e4b159e0beaa859e8802a93` within your One.com `Hostname` zone. + +Then, set its `Is an alias of` to +- `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws` + +> ⚠️ Leave the trailing period off! + +Due to the eventually consistent nature of DNS-based verification, it may take a few minutes for your changes to get picked up. Check back after a few minutes, and your values should be green, and you should be able to complete the next and final step. + +> If for some reason after more than a few minutes your domains haven't verified, make sure that you've correctly entered the settings into your DNS. + +## Map domain names + +Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. + +- Click on **Custom Domain Names** +- Create a **Custom Domain Name** for `production` +- Fill in the form: + - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field + - Select the **ACM Certificate** you just verified + - Click `Create domain name` + - Enter `/` in the **Path** field + - Select your app's `production` API name in the **Destination** menu + - Select the `production` value in the **Stage** menu +- Copy the value of the generated **Distribution Domain Name** to your clipboard + +### Head back to One.com and click into the domain in question. + +In the final step, you'll add the final `CNAME` and `ALIAS` records to your One.com. This points your domain at your Begin app. + +When you provide the `CNAME` record: + +- Switch to `CNAME` record setting. +- **Hostname:** `staging` +- **Is an alias of:** `pi1f6fddqd0dje.cloudfront.net` + + +When you provide the `A` record: + +- Switch to `A` record setting. +- **Hostname:** input `@` symbol +- Find out the IP address of the given cloudfront URL (`http://pi1f6fddqd0dje.cloudfront.net`) using a tool like [24x7.com](https://www.site24x7.com/find-ip-address-of-web-site.html) +- Lastly in the **Will point to:** section, add the IP address. + +## Conclusion + +Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). + +Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/route-53.md b/src/views/docs/en/guides/domains/route-53.md index ed0978b1..7e3c192d 100644 --- a/src/views/docs/en/guides/domains/route-53.md +++ b/src/views/docs/en/guides/domains/route-53.md @@ -6,13 +6,14 @@ sections: - Purchase/Transfer domain - Get AWS Certificate - Map domain names + - Conclusion --- ## Overview Follow these instructions to manually configure Route 53 to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. -> ⛳️ Tip: These instructions will serve your app's `production` environment; if you'd also like a friendly URL for your `staging` environment (i.e. staging.example.com), follow steps 10-15 below a second time, swapping `production` values for `staging` values. +> ⛳️ Tip: These instructions will serve your app's `production` environment; if you'd also like a friendly URL for your `staging` environment (i.e. staging.example.com), follow the exact steps below a second time, swapping `production` values for `staging` values. ## Step 1: Purchase/Transfer domain @@ -39,7 +40,7 @@ Now that you have your domain, let's request a SSL certificates from AWS Certifi ## Map domain names -Sign into AWS API Gateway. Follow these intrructions for adding both `production` domain and `staging` domain. +Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. - Click on **Custom Domain Names** - Create a **Custom Domain Name** for `production` @@ -66,4 +67,9 @@ Sign into AWS API Gateway. Follow these intrructions for adding both `production - Pick a `region`. - Copy and paste the alias value from Begin into the `Choose Distribution` input. It should be a Cloudfront link like this: `d1poav0i4gjqri.cloudfront.net` - Click `Create record`. -- Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file + +## Conclusion + +Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). + +Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file From 66bfbdb844bd623e58351beda046d186c401ed3b Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Sun, 14 Feb 2021 07:09:58 -0500 Subject: [PATCH 003/680] Removed Cloudflare & made content edits --- src/views/docs/en/guides/domains/Namecheap.md | 2 +- src/views/docs/en/guides/domains/one.md | 2 +- src/views/docs/en/guides/domains/route-53.md | 5 ++--- src/views/docs/en/guides/domains/start-here.md | 6 +++--- src/views/docs/table-of-contents.js | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/views/docs/en/guides/domains/Namecheap.md b/src/views/docs/en/guides/domains/Namecheap.md index 10c2b9c5..939eaa30 100644 --- a/src/views/docs/en/guides/domains/Namecheap.md +++ b/src/views/docs/en/guides/domains/Namecheap.md @@ -57,7 +57,7 @@ Sign into AWS API Gateway. Follow these instructions for adding both `production ### Head back to Namecheap and click into the domain in question. -In the final step, you'll add the final `CNAME` and `ALIAS` records to your Namecheap. This points your domain at your Begin app. +In the final step, you'll add the final `CNAME` and `ALIAS` records to your Namecheap. This points your domain at your arc app. When you provide the `CNAME` record: diff --git a/src/views/docs/en/guides/domains/one.md b/src/views/docs/en/guides/domains/one.md index 5cd45d2c..fb147c9c 100644 --- a/src/views/docs/en/guides/domains/one.md +++ b/src/views/docs/en/guides/domains/one.md @@ -64,7 +64,7 @@ Sign into AWS API Gateway. Follow these instructions for adding both `production ### Head back to One.com and click into the domain in question. -In the final step, you'll add the final `CNAME` and `ALIAS` records to your One.com. This points your domain at your Begin app. +In the final step, you'll add the final `CNAME` and `ALIAS` records to your One.com. This points your domain at your arc app. When you provide the `CNAME` record: diff --git a/src/views/docs/en/guides/domains/route-53.md b/src/views/docs/en/guides/domains/route-53.md index 7e3c192d..853061da 100644 --- a/src/views/docs/en/guides/domains/route-53.md +++ b/src/views/docs/en/guides/domains/route-53.md @@ -62,10 +62,9 @@ Sign into AWS API Gateway. Follow these instructions for adding both `production - Change `Record type` to `A`. - Make sure `Routing policy` is set to `Simple routing`. - Make sure `Record type` is set to `Routes traffic to an Ipv4 address and some AWS resources`. - - In the `Value/Route traffic to` sections: - - Set to `Alias to Cloudfront distribution`. + - In the `Value/Route traffic to` sections: Set to `Alias to Cloudfront distribution`. - Pick a `region`. - - Copy and paste the alias value from Begin into the `Choose Distribution` input. It should be a Cloudfront link like this: `d1poav0i4gjqri.cloudfront.net` + - Copy and paste the alias value from API Gateway into the `Choose Distribution` input. It should be a Cloudfront link like this: `d1poav0i4gjqri.cloudfront.net` - Click `Create record`. ## Conclusion diff --git a/src/views/docs/en/guides/domains/start-here.md b/src/views/docs/en/guides/domains/start-here.md index d87490a5..9af79271 100644 --- a/src/views/docs/en/guides/domains/start-here.md +++ b/src/views/docs/en/guides/domains/start-here.md @@ -13,7 +13,7 @@ sections: DNS is how you assign a domain name to a deployed app. This guide lists ways to set up custom DNS with several popular DNS providers and we are always happy to accept contributions for steps to use additional providers. -You may use a free registrar-based DNS to host your domain on Begin such as Godaddy, Namecheap, One, etc., but Route53 is the preferred registrar and DNS management system for Architect users. This is because: +You may use a free registrar-based DNS to host your domain such as Godaddy, Namecheap, One, etc., but Route53 is the preferred registrar and DNS management system for Architect users. This is because: - It's integrated with Amazon's other cloud services. - Your DNS will resolve from 15+ locations worldwide, making your website faster for your end-users. @@ -45,8 +45,8 @@ All done! Setting up a custom domain for each registrar will be a bit different. To manually configure DNS, you can follow these guides below: - [Route 53](/docs/en/guides/domains/route-53) -- [Cloudflare](/docs/en/guides/domains/cloudflare) - [Dreamhost](/docs/en/guides/domains/dreamhost) - [Godaddy](/docs/en/guides/domains/godaddy) - [One](/docs/en/guides/domains/one) -- [Namecheap](/docs/en/guides/domains/namecheap) \ No newline at end of file +- [Namecheap](/docs/en/guides/domains/namecheap) + \ No newline at end of file diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index e76fc508..1b880534 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -23,7 +23,7 @@ let Guides = [ { 'Domains': [ 'Start here', 'Route 53', - 'Cloudflare', + // 'Cloudflare', 'Dreamhost', 'Godaddy', 'One', From 0376186006eca05572704f74c0196be16469ce09 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Wed, 24 Feb 2021 11:41:36 -0800 Subject: [PATCH 004/680] trick to rename --- .../docs/en/guides/domains/{Namecheap.md => _amecheap.md} | 0 src/views/docs/table-of-contents.js | 8 +++----- 2 files changed, 3 insertions(+), 5 deletions(-) rename src/views/docs/en/guides/domains/{Namecheap.md => _amecheap.md} (100%) diff --git a/src/views/docs/en/guides/domains/Namecheap.md b/src/views/docs/en/guides/domains/_amecheap.md similarity index 100% rename from src/views/docs/en/guides/domains/Namecheap.md rename to src/views/docs/en/guides/domains/_amecheap.md diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 1b880534..1b1554f6 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -21,13 +21,11 @@ let Guides = [ { // TODO 'WebSockets functions', ], 'Domains': [ - 'Start here', 'Route 53', - // 'Cloudflare', 'Dreamhost', - 'Godaddy', - 'One', - 'Namecheap' + //'Godaddy', + //'One', + //'Namecheap' ], /* TODO 'Backend': [ From d493f60358e821dcf81fdd954475a1596787f39c Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Wed, 24 Feb 2021 11:41:58 -0800 Subject: [PATCH 005/680] rename trick --- src/views/docs/en/guides/domains/{_amecheap.md => namecheap.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/views/docs/en/guides/domains/{_amecheap.md => namecheap.md} (100%) diff --git a/src/views/docs/en/guides/domains/_amecheap.md b/src/views/docs/en/guides/domains/namecheap.md similarity index 100% rename from src/views/docs/en/guides/domains/_amecheap.md rename to src/views/docs/en/guides/domains/namecheap.md From 531d2cf1933ead67a97ce684ec607ae5d9720067 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Wed, 24 Feb 2021 12:33:53 -0800 Subject: [PATCH 006/680] =?UTF-8?q?updated=20for=20HTTP=20APIs=20and?= =?UTF-8?q?=E2=80=A6idk=E2=80=A6the=20new=20console?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/docs/en/guides/domains/route-53.md | 87 +++++++------------- 1 file changed, 32 insertions(+), 55 deletions(-) diff --git a/src/views/docs/en/guides/domains/route-53.md b/src/views/docs/en/guides/domains/route-53.md index 853061da..e50521dd 100644 --- a/src/views/docs/en/guides/domains/route-53.md +++ b/src/views/docs/en/guides/domains/route-53.md @@ -1,74 +1,51 @@ --- title: Route 53 description: Setting up a domain name with Route 53 -sections: - - Overview - - Purchase/Transfer domain - - Get AWS Certificate - - Map domain names - - Conclusion --- -## Overview -Follow these instructions to manually configure Route 53 to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. +## Prerequisites -> ⛳️ Tip: These instructions will serve your app's `production` environment; if you'd also like a friendly URL for your `staging` environment (i.e. staging.example.com), follow the exact steps below a second time, swapping `production` values for `staging` values. +- [Register](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html) or [transfer](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) a domain with Route53 +- Deploy an app with Architect and make note of the `staging` and `production` URLs -## Step 1: Purchase/Transfer domain +## Step 1: setup SSL certificates with AWS Certificate Manager -Depending on your situation, you may be ready to purchase a brand new domain or transfer a domain from a different registrar. Buying a brand new domain is a quick and straightforward process while transferring in a domain will vary from each user's situation. +In this step we will request a certificate from Amazon for our domain. -### Purchase domain +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Expand the domain and click `Create record in Route53` button +- Verify CNAME record created in Route53 console Hosted zone -To purchase a domain, sign into the AWS Console, head to the Route 53 service. Check to see if the domain you want is available. If it is available, follow the instructions to purchase the domain. When you register your domain via Route53, it gets added to a `hosted zone` automatically. The `hosted zone` is where you will manually configure your DNS. +## Step 2: setup custom domain with AWS API Gateway -### Transfer Domain +Generate a domain with the certificate from Step 1. -To transfer the registration for a domain to Amazon Route 53, carefully follow the procedures in this article from the AWS documentation. +- Sign into AWS API Gateway in the AWS Console +- Navigate to `Custom domain names` and click `Create` +- Enter the domain name (eg. `staging.example.com` for the `staging` app or `example.com` for the `production` app) +- Select the certificate created in Step 1 +- Click `Create domain name` +- Make note of the generated `API Gateway domain name` in `Endpoint configuration` +- Click on the tab `API mappings` and `Configure API mappings` +- For `API` select the API and for `Stage` select `$default` and click `Save` -[Transferring registration for a domain to Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) +## Step 3: configure the domain Alias in AWS Route53 -## Get SSL Certificates - -Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. - -- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. -- Click the `Get started` button in the Provision certificates section. -- Follow the instructions to add certs to the hosted zone DNS. -- The certificates may say `pending` for a few hours until it propagates. - -## Map domain names - -Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. - -- Click on **Custom Domain Names** -- Create a **Custom Domain Name** for `production` -- Fill in the form: - - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field - - Select the **ACM Certificate** you just verified - - Click `Create domain name` - - Enter `/` in the **Path** field - - Select your app's `production` API name in the **Destination** menu - - Select the `production` value in the **Stage** menu -- Copy the value of the generated **Distribution Domain Name** to your clipboard - -### Head back to Route 53 and click into the domain in question. - -- Create a **Record Set** -- Fill in the form: - - If setting a subdomain, enter it in the **Name** field - - Click `Create Record`. - - Change `Record type` to `A`. - - Make sure `Routing policy` is set to `Simple routing`. - - Make sure `Record type` is set to `Routes traffic to an Ipv4 address and some AWS resources`. - - In the `Value/Route traffic to` sections: Set to `Alias to Cloudfront distribution`. - - Pick a `region`. - - Copy and paste the alias value from API Gateway into the `Choose Distribution` input. It should be a Cloudfront link like this: `d1poav0i4gjqri.cloudfront.net` - - Click `Create record`. +- Sign into AWS Route53 in the AWS Console +- Navigate to the Hosted zone for the domain +- Click `Create record` +- Enter the `Record name` +- Record type is `A` and toggle `Alias` checkbox on +- Select `Alias to API Gateway` +- Select the region +- Select the API (should be the same value as the domain generated in Step 2) +- Click `Create records` ## Conclusion Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). - -Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file From badb825aaf02f7893e11f15a68ee24661351a2d9 Mon Sep 17 00:00:00 2001 From: kj Date: Fri, 26 Feb 2021 09:54:00 -0800 Subject: [PATCH 007/680] Loads js via scripts instead of thirdparty. --- public/css/styles.css | 14 +++----------- public/static.json | 2 +- src/http/get-docs-000lang-catchall/index.js | 10 +++++----- src/views/modules/document/html.js | 2 +- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/public/css/styles.css b/public/css/styles.css index 1407d1a0..7bb7e2b4 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -1,12 +1,10 @@ /* ----- THEME ----- */ /* VARIABLES */ :root { - --p0:#2CDD93;/* Medium Aquamarine light */ - --p1:#2B7D9A;/* Bright Navy Blue light */ - --p2:#BBFFAA;/* brighter green */ + --p0:#2CDD93;/* clover green */ + --p1:#2B7D9A;/* blue green */ + --p2:#BBFFAA;/* key lime */ --p3:#E21893;/* Barbie Pink light */ - --p4:#FF6263;/* Bittersweet Orange light */ - --p5:hsl(267, 75%, 45%);/* Royal purple */ --g0:#FBFBFB;/* #FBFBFB */ --g1:#E5E5E5;/* #E5E5E5 */ --g2:#CFCFCF;/* #CFCFCF */ @@ -19,12 +17,6 @@ --g9:#383838;/* #383838 */ --g10:#222222;/* #222222 */ --g11:#FFF; /* #FFF*/ - --h0:#3EE09C;/* Medium Aquamarine */ - --h1:#40B9E5;/* Bright Navy Blue */ - --h2:hsl(267, 90%, 55%);/* Royal Purple Hover */ - --h3:#DE1792;/* Barbie Pink */ - --h4:#FF4747;/* Bittersweet Orange */ - --h5:#FAE05D;/* Minion Yellow */ --h6:#CFCFCF;/* #CFCFCF */ --a0:#A4A4A4;/* #A4A4A4 */ --a1:#8E8E8E;/* #8E8E8E */ diff --git a/public/static.json b/public/static.json index 0d6688ff..74bc7cb1 100644 --- a/public/static.json +++ b/public/static.json @@ -6,6 +6,6 @@ "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", "css/index.css": "css/index-d0b9d5ab0b.css", - "css/styles.css": "css/styles-9dc95bf7f9.css", + "css/styles.css": "css/styles-75499ddd30.css", "css/syntax.css": "css/syntax-605168cf6d.css" } \ No newline at end of file diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 4210b971..476d4017 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -102,11 +102,11 @@ exports.handler = async function http (req) { editURL, lang, sections, - thirdparty: ` - - - - `, + scripts: [ + '/index.js', + '/components/arc-viewer.js', + '/components/arc-tab.js' + ], title, toc }) diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index baf69017..7d3effb0 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -20,7 +20,7 @@ export default function HTML (props = {}) { } = props let scriptTags = scripts && Array.isArray(props.scripts) - ? scripts.map(src => Script({ src })) + ? scripts.map(src => Script({ src })).join('') : Script(scripts) let stateTag = state && State(state) || '' From a573e0f0ad17c153b3792dd930a8e73ffad6dde6 Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 2 Mar 2021 14:44:16 -0500 Subject: [PATCH 008/680] adding documentation for named indexes --- src/views/docs/en/reference/app.arc/indexes.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/views/docs/en/reference/app.arc/indexes.md b/src/views/docs/en/reference/app.arc/indexes.md index 5b603eaa..8e54877c 100644 --- a/src/views/docs/en/reference/app.arc/indexes.md +++ b/src/views/docs/en/reference/app.arc/indexes.md @@ -16,10 +16,11 @@ Defines [Global Secondary Indexes][gsi] for your project's [DynamoDB][ddb] table ## Syntax - `@indexes` is a feature subset of [`@tables`][tables]; as such, the names of your declared indexes must match those of your [`@tables`][tables] -- Otherwise, the basic syntax for defining `@indexes` is the same as [`@tables`][tables]: +- Otherwise, the basic syntax for defining `@indexes` primary keys is the same as [`@tables`][tables]: - Partition key, defined by a `*`, is required - Sort key, defined by `**`, is optional - Currently only `*String`, `**String`, `*Number` and `**Number` are supported +- An optional `name` property can be provided to explicitly name the index. This is helpful when [querying the index with the AWS SDK as you know what to pass to the `IndexName` query parameter](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#query-property) ## Example @@ -43,9 +44,11 @@ accounts @indexes accounts email *String + name byEmail accounts created *String + name byDate ``` @@ -61,8 +64,8 @@ accounts { "accounts": { "accountID": "*String" } } ], "indexes": [ - { "accounts": { "email": "*String" } }, - { "accounts": { "created": "*String" } } + { "accounts": { "email": "*String", "name": "byEmail" } }, + { "accounts": { "created": "*String", "name": "byDate" } } ] } ``` @@ -81,8 +84,8 @@ app="testapp" accountID="*String" indexes = [ -{ "accounts" = { "email" = "*String" } }, -{ "accounts" = { "created" = "*String" } } +{ "accounts" = { "email" = "*String", "name" = "byEmail" } }, +{ "accounts" = { "created" = "*String", "name" = "byDate" } } ] ``` @@ -103,8 +106,10 @@ tables: indexes: - accounts: - email: "*String" + - name: "byEmail" - accounts: - created: "*String" + - name: "byDate" ``` From 409ac8ab561aa4dc6b85efd10e52c5775f78f738 Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 2 Mar 2021 14:47:14 -0500 Subject: [PATCH 009/680] 3.1.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1be58176..4d9ee682 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.9", + "version": "3.1.10", "architect": { "app": "v8-arc-codes", "aws": { From dd30114353323ccc195354d1de305032dd79908f Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 2 Feb 2021 13:10:41 -0600 Subject: [PATCH 010/680] first pass at plugin documentation! --- .../en/guides/extend/architect-plugins.md | 322 ++++++++++++++++++ src/views/docs/table-of-contents.js | 1 + 2 files changed, 323 insertions(+) create mode 100644 src/views/docs/en/guides/extend/architect-plugins.md diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md new file mode 100644 index 00000000..b38cd108 --- /dev/null +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -0,0 +1,322 @@ +--- +title: Architect Plugins +description: How to extend Architect using lifecycle hooks +--- + +Using [`@macros`][macros] allows you to augment the Architect-generated CloudFormation before deployment. However, augmenting CloudFormation may not be sufficient for certain extensions. For example, if you want to extend Architect with: + +- Your own custom Lambda integrations (e.g. Kinesis Stream or Lex conversation bot) and want Architect to create, hydrate and be able to retrieve the logs for these functions +- A better local development experience for your extension by hooking into the Architect [`sandbox`][sandbox] + +Architect `@plugins` solves these use cases by providing a variety of [interfaces](#interface) that plugin authors may implement to hook into various Architect capabilities. + +> Architect Plugins are backwards-compatible with [`@macros`][macros] + +## Table of Contents + +1. [Installation](#installation) +2. [Interface](#interface) + 1. [`package`](#package) + 2. [`pluginFunctions`](#pluginfunctions) + 3. [`sandbox.start`](#sandbox.start) + 4. [`sandbox.end`](#sandbox.end) +3. [Helper Methods for Plugin Authors](#helper-methods-for-plugin-authors) + 1. [`createLambdaJSON`](#createlambdajson) + 2. [`invokeLambda`](#invokelambda) +4. [Example Plugins](#example-plugins) + +## Installation + +Similar to [`@macros`][macros], Architect will look for any `@plugins` in `src/plugins` or the project root `node_modules`. An app opts into using `@plugins` by adding them to `app.arc`: + +```arc +@app +myapp + +@plugins +myplugin +``` + +> In the example above running `arc deploy` will look for `src/plugins/myplugin` and then `./node_modules/myplugin` + +## Interface + +Plugin authors should create a module that exports an object with properties of the object being different functions that hook into core Architect capabilities. + +```javascript + /** + * Starter plugin template + */ + +module.exports = { + package: async function extendCloudFormation (arc, sam, stage='staging', inventory) { + }, + pluginFunctions: async function (inventory) { + }, + sandbox: { + start: async function (inventory, builtInSandboxServices) { + }, + end: async function (inventory, builtInSandboxServices) { + } + } +} +``` + +A deep dive into the [`package`](#package), [`pluginFunctions`](#pluginFunctions), [`sandbox.start`](#sandbox.start) and [`sandbox.end`](#sandbox.end) methods follows. + +### `package` + +> `package(arc, sam, stage, inventory)` + +This method encapsulates [Architect's existing @macro functionality][macros]: extending Architect's generated CloudFormation `sam.json` with your own custom extensions. + +**As a plugin author, if you intend for your plugin to create custom Lambdas**, you would be expected to leverage the plugin author helper method [`createLambdaJSON` described below](#createLambdaJSON) to painlessly create CloudFormation-compatible JSON representing your new cloud functions. You must also implement the [`pluginFunctions`](#pluginFunctions) plugin interface method. + +#### Arguments + +|Argument|Description| +|---|---| +|`arc`|Object of the [parsed](https://github.com/architect/parser) Architect project manifest file for the current project| +|`sam`|The [CloudFormation JSON template][cfn-ref] making up the Architect project| +|`stage`|The name of the environment; usually one of `staging` or `production`| +|`inventory`|An [Architect inventory object][inv] representing the current Architect project| + +#### Returns + +You _must_ return the `sam` argument after modifying it with your own extensions. + +### `pluginFunctions` + +> `pluginFunctions(inventory)` + +The plugin author must implement this method if the plugin defines new Lambda functions. This method is used by Architect to allow your custom plugin Lambdas to hook into Architect's capabilities and lifecycle, such as: + +- instructing [`arc create`][create] to create new files and directories in the project for your custom plugin Lambdas +- instructing [`arc hydrate`][hydrate] to hydrate dependencies in the project for your custom plugin Lambdas +- providing hints to [`arc logs`][logs] as to where to find CloudWatch execution logs for your custom plugin Lambdas + +#### Arguments + +|Argument|Description| +|---|---| +|`inventory`|An [Architect inventory object][inv] representing the current Architect project| + +#### Returns + +You should return an array of objects, each object representing a new Lambda being defined by the plugin. Each object should have the following format: + +```javascript +{ + src: '/Users/filmaj/src/my-arc-project/src/rules/rule-one', + body: 'exports.handler = async function (ruleEvent) { console.log(ruleEvent) }' +} +``` + +- `src`: a string containing a fully qualified absolute path to the source code location for the Lambda function. +- `body`: a string containing template code for the Lambda function handler + +#### Example `pluginFunctions` Implementation + +```javascript +let path = require('path') + +module.exports = { + pluginFunctions: async function (inventory) { + if (!inventory.inv._project.arc.rules) return [] + const cwd = inventory.inv._project.src + return inventory.inv._project.arc.rules.map((rule) => { + let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) + return { + src: rulesSrc, + body: `exports.handler = async function (event) { + console.log(event); +};` + } + }) + } +} +``` + +The above would instruct Architect to look for functions under `src/rules/` inside the project directory hierarchy. With the above `pluginFunctions` method and given `app.arc` contents like so: + +``` +@rules +rule-one +rule-two +``` + +... running: + +- [`arc create`][create] would create the folders `src/rules/rule-one` and `src/rules/rule-two`, with `index.js` files in each containing the contents of the `body` returned by `pluginFunctions` +- [`arc hydrate`][hydrate] would hydrate the above two folders +- [`arc logs src/rules/rule-one`][logs] would pull in any deployed-to-staging execution logs for the `rule-one` function + +### `sandbox.start` + +> `start(inventory, builtInSandboxServices)` + +The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It would also allow to modify behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `builtInSandboxServices` argument. + +A helper method [`invokeLambda` (described below)](#invokeLambda) is provided by the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) package in order to allow plugin authors to invoke specific Lambdas from their plugin sandbox service code. + +#### Arguments + +|Argument|Description| +|---|---| +|`inventory`|An [Architect inventory object][inv] representing the current Architect project| +|`builtInSandboxServices`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| + +#### Returns + +This method must return a function that takes a single callback argument. This callback should be invoked once the plugin sandbox service has started. + +#### Example `start` Implementation + +An example is [provided below that leverages the `invokeLambda` helper method](#invokeLambda). + +### `sandbox.end` + +> `end(inventory, builtInSandboxServices)` + +If the plugin author implements the [`sandbox.start`](#sandbox.start) method, then they should also implement the `sandbox.end` method. In the same manner as [`start`](#sandbox.start), `end` must return a function that takes a callback as a single argument. `end` should then invoke the callback once the plugin service has been gracefully shut down. Optionally, the callback can be invoked with an error object to signify to sandbox that an error has occurred. + +## Helper Methods for Plugin Authors + +For common Architect Plugin use cases, Architect provides a few helper functions available in core Architect packages to make life easier for plugin authors. + +### `createLambdaJSON` + +> `createLambdaJSON(inventory, pathToPluginCloudFunction)` + +Available in the [`@architect/package`](https://npmjs.com/package/@architect/package) module, this method can be leveraged inside a plugin's [`package`](#package) method in order to easily and consistently define CloudFormation JSON representing Lambdas created by the plugin. + +Leveraging this helper method gives the plugin function support for [arc's per-function runtime configuration via the `config.arc` file](https://arc.codes/docs/en/reference/config.arc/aws) transparently. + +#### Arguments + +|Argument|Description| +|---|---| +|`inventory`|An [Architect inventory object][inv] representing the current Architect project| +|`pathToPluginCloudFunction`|a string representing the path where code for the Lambda exists locally| + +#### Returns + +A tuple (array of two objects) containing a string representing an AWS-friendly Lambda resource name (based on the path to the function code), and a JSON object that can be assigned to a CloudFormation `sam.json`'s `Resources` section. This would define a Lambda that Architect would create during a [`deploy`][deploy]. + +#### Example Usage of `createLambdaJSON` + +```javascript +let createLambdaJSON = require('@architect/package/createLambdaJSON') +let path = require('path') + +module.exports = { + package: async function IoTRulesLambdas (arc, cfn, stage = 'staging', inventory) { + if (arc.rules) { + const cwd = inventory.inv._project.src + arc.rules.forEach(rule => { + let code = path.join(cwd, 'src', 'rules', rule[0]) + let [functionName, functionDefn] = createLambdaJSON(inventory, code) + cfn.Resources[functionName] = functionDefn + }) + } + return cfn + } +} +``` + +### `invokeLambda` + +> `invokeLambda(pathToPluginCloudFunction, payload, callback)` + +Available in the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) module, this method can be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`arc sandbox`][sandbox] local development runtime context. + +#### Arguments + +|Argument|Description| +|---|---| +|`pathToPluginCloudFunction`|a string representing the path where code for the Lambda exists locally| +|`payload`|JSON payload to deliver to the function| +|`callback`|function with signature `function(error, result)` that is invoked with either the error or the result from the local function invocation| + +#### Example Usage of `invokeLambda` + +```javascript +let path = require('path') +let prompt = require('prompt') + +module.exports = { + pluginFunctions: async function (inventory) { + if (!inventory.inv._project.arc.rules) return [] + const cwd = inventory.inv._project.src + return inventory.inv._project.arc.rules.map((rule) => { + let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) + return { + src: rulesSrc, + body: `exports.handler = async function (event) { + console.log(event) +}` + } + }) + }, + sandbox: { + start: async function IoTRulesServiceStart (inventory, builtInSandboxServices) { + let rules = module.exports.pluginFunctions(inventory).map(rule => rule.src) + return function IotRulesServiceStartCallback (callback) { + process.stdin.on('keypress', async function IoTRulesKeyListener (input, key) { + if (input === 'I') { + const response = await prompt([ { + type: 'select', + name: 'rule', + message: 'Which IoT Rule do you want to trigger an event for?', + choices: rules + }, { + type: 'input', + name: 'payload', + message: 'Type out the JSON payload you want to deliver to the rule (must be valid JSON!):', + initial: '{}', + validate: function (i) { + try { + JSON.parse(i) + } + catch (e) { + return e.message + } + return true + }, + result: function (i) { + return JSON.parse(i) + } + } ]) + invokeLambda(response.rule, response.payload, function (err, result) { + if (err) console.error(`Error invoking lambda ${response.rule}!`, err) + else console.log(`${response.rule} invocation result:`, result) + }) + } + }) + console.log('IoT Rules Sandbox Service Started; press "I" (capital letter) to trigger a rule.') + callback() + } + } + } +} +``` + +The above plugin's `sandbox.start` method listens for the "I" keyboard keypress, prompts the user asking which of the plugin's Lambdas the user wants to invoke and what payload to deliver to the user, before using `invokeLambda` to invoke the Lambda code with the specified payload. + +## Example Plugins + +- [plugin-iot-rules](https://github.com/copperinc/macro-iot-rules/tree/plugins): a plugin adding AWS IoT Topic event Lambdas + +[inv]: https://github.com/architect/inventory +[macros]: custom-cloudformation +[http]: ../../reference/app.arc/http +[events]: ../../reference/app.arc/events +[queues]: ../../reference/app.arc/queues +[tables]: ../../reference/app.arc/tables +[sandbox]: ../../reference/cli/sandbox +[create]: ../../reference/cli/init +[hydrate]: ../../reference/cli/hydrate +[logs]: ../../reference/cli/logs +[deploy]: ../../reference/cli/deploy +[cfn-ref]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html + diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 9469fd50..8bbc790f 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -32,6 +32,7 @@ let Guides = [ { 'Extend': [ // TODO'Migrate legacy code',// @proxy, arc.http.express 'Custom CloudFormation', + 'Architect Plugins', // TODO'Add a custom domain', // TODO'Ejecting ' ] From 80aedf522aae711d056bda6ef4bcb51d54b3d8fe Mon Sep 17 00:00:00 2001 From: filmaj Date: Fri, 5 Feb 2021 12:12:15 -0600 Subject: [PATCH 011/680] ensuring parsed arc file is available to each of the plugin methods. simplifying sandbox start and end interfaces (no need to return a function), allowing for sandbox methods to be async or not --- .../en/guides/extend/architect-plugins.md | 118 ++++++++++-------- 1 file changed, 65 insertions(+), 53 deletions(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index b38cd108..d97c7744 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -37,7 +37,7 @@ myapp myplugin ``` -> In the example above running `arc deploy` will look for `src/plugins/myplugin` and then `./node_modules/myplugin` +> In the example above running `arc deploy` will look for `./src/plugins/myplugin` and then `./node_modules/myplugin` ## Interface @@ -51,12 +51,12 @@ Plugin authors should create a module that exports an object with properties of module.exports = { package: async function extendCloudFormation (arc, sam, stage='staging', inventory) { }, - pluginFunctions: async function (inventory) { + pluginFunctions: async function (arc, inventory) { }, sandbox: { - start: async function (inventory, builtInSandboxServices) { + start: async function (arc, inventory, builtInSandboxServices) { }, - end: async function (inventory, builtInSandboxServices) { + end: async function (arc, inventory, builtInSandboxServices) { } } } @@ -76,7 +76,7 @@ This method encapsulates [Architect's existing @macro functionality][macros]: ex |Argument|Description| |---|---| -|`arc`|Object of the [parsed](https://github.com/architect/parser) Architect project manifest file for the current project| +|`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`sam`|The [CloudFormation JSON template][cfn-ref] making up the Architect project| |`stage`|The name of the environment; usually one of `staging` or `production`| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| @@ -87,7 +87,7 @@ You _must_ return the `sam` argument after modifying it with your own extensions ### `pluginFunctions` -> `pluginFunctions(inventory)` +> `pluginFunctions(arc, inventory)` The plugin author must implement this method if the plugin defines new Lambda functions. This method is used by Architect to allow your custom plugin Lambdas to hook into Architect's capabilities and lifecycle, such as: @@ -99,6 +99,7 @@ The plugin author must implement this method if the plugin defines new Lambda fu |Argument|Description| |---|---| +|`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| #### Returns @@ -153,22 +154,22 @@ rule-two ### `sandbox.start` -> `start(inventory, builtInSandboxServices)` +> `start(arc, inventory, builtInSandboxServices, callback)` The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It would also allow to modify behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `builtInSandboxServices` argument. +This method can either be `async` or not; if the plugin author implements it as `async`, then the final `callback` argument may be ignored. Otherwise, the `callback` argument should be invoked once the plugin's sandbox service is ready. + A helper method [`invokeLambda` (described below)](#invokeLambda) is provided by the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) package in order to allow plugin authors to invoke specific Lambdas from their plugin sandbox service code. #### Arguments |Argument|Description| |---|---| +|`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| |`builtInSandboxServices`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| - -#### Returns - -This method must return a function that takes a single callback argument. This callback should be invoked once the plugin sandbox service has started. +|`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service is ready| #### Example `start` Implementation @@ -176,9 +177,21 @@ An example is [provided below that leverages the `invokeLambda` helper method](# ### `sandbox.end` -> `end(inventory, builtInSandboxServices)` +> `end(arc, inventory, builtInSandboxServices, callback)` + +If the plugin author implements the [`sandbox.start`](#sandbox.start) method, then they must also implement the `sandbox.end` method. This method gives the plugin the opportunity to gracefully shut down any services powering local development support of the plugin. + +This method can either be `async` or not; if the plugin author implements it as `async`, then the final `callback` argument may be ignored. Otherwise, the `callback` argument should be invoked once the plugin's sandbox service is ready. + +#### Arguments + +|Argument|Description| +|---|---| +|`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| +|`inventory`|An [Architect inventory object][inv] representing the current Architect project| +|`builtInSandboxServices`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| +|`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service has been shut down| -If the plugin author implements the [`sandbox.start`](#sandbox.start) method, then they should also implement the `sandbox.end` method. In the same manner as [`start`](#sandbox.start), `end` must return a function that takes a callback as a single argument. `end` should then invoke the callback once the plugin service has been gracefully shut down. Optionally, the callback can be invoked with an error object to signify to sandbox that an error has occurred. ## Helper Methods for Plugin Authors @@ -186,7 +199,7 @@ For common Architect Plugin use cases, Architect provides a few helper functions ### `createLambdaJSON` -> `createLambdaJSON(inventory, pathToPluginCloudFunction)` +> `createLambdaJSON(arc, inventory, pathToPluginCloudFunction)` Available in the [`@architect/package`](https://npmjs.com/package/@architect/package) module, this method can be leveraged inside a plugin's [`package`](#package) method in order to easily and consistently define CloudFormation JSON representing Lambdas created by the plugin. @@ -196,6 +209,7 @@ Leveraging this helper method gives the plugin function support for [arc's per-f |Argument|Description| |---|---| +|`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| |`pathToPluginCloudFunction`|a string representing the path where code for the Lambda exists locally| @@ -245,10 +259,10 @@ let path = require('path') let prompt = require('prompt') module.exports = { - pluginFunctions: async function (inventory) { - if (!inventory.inv._project.arc.rules) return [] + pluginFunctions: async function (arc, inventory) { + if (!arc.rules) return [] const cwd = inventory.inv._project.src - return inventory.inv._project.arc.rules.map((rule) => { + return arc.rules.map((rule) => { let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) return { src: rulesSrc, @@ -259,43 +273,41 @@ module.exports = { }) }, sandbox: { - start: async function IoTRulesServiceStart (inventory, builtInSandboxServices) { - let rules = module.exports.pluginFunctions(inventory).map(rule => rule.src) - return function IotRulesServiceStartCallback (callback) { - process.stdin.on('keypress', async function IoTRulesKeyListener (input, key) { - if (input === 'I') { - const response = await prompt([ { - type: 'select', - name: 'rule', - message: 'Which IoT Rule do you want to trigger an event for?', - choices: rules - }, { - type: 'input', - name: 'payload', - message: 'Type out the JSON payload you want to deliver to the rule (must be valid JSON!):', - initial: '{}', - validate: function (i) { - try { - JSON.parse(i) - } - catch (e) { - return e.message - } - return true - }, - result: function (i) { - return JSON.parse(i) + start: function IoTRulesServiceStart (arc, inventory, builtInSandboxServices, callback) { + let rules = module.exports.pluginFunctions(arc, inventory).map(rule => rule.src) + process.stdin.on('keypress', async function IoTRulesKeyListener (input, key) { + if (input === 'I') { + const response = await prompt([ { + type: 'select', + name: 'rule', + message: 'Which IoT Rule do you want to trigger an event for?', + choices: rules + }, { + type: 'input', + name: 'payload', + message: 'Type out the JSON payload you want to deliver to the rule (must be valid JSON!):', + initial: '{}', + validate: function (i) { + try { + JSON.parse(i) } - } ]) - invokeLambda(response.rule, response.payload, function (err, result) { - if (err) console.error(`Error invoking lambda ${response.rule}!`, err) - else console.log(`${response.rule} invocation result:`, result) - }) - } - }) - console.log('IoT Rules Sandbox Service Started; press "I" (capital letter) to trigger a rule.') - callback() - } + catch (e) { + return e.message + } + return true + }, + result: function (i) { + return JSON.parse(i) + } + } ]) + invokeLambda(response.rule, response.payload, function (err, result) { + if (err) console.error(`Error invoking lambda ${response.rule}!`, err) + else console.log(`${response.rule} invocation result:`, result) + }) + } + }) + console.log('IoT Rules Sandbox Service Started; press "I" (capital letter) to trigger a rule.') + callback() } } } From 54331a0f8c23c163039c2129a0d90b1c1acb9965 Mon Sep 17 00:00:00 2001 From: filmaj Date: Mon, 8 Feb 2021 17:08:04 -0600 Subject: [PATCH 012/680] make pluginFunctions a sync function, update example usage for it since we now provide it with the parsed arc manifest as an argument --- src/views/docs/en/guides/extend/architect-plugins.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index d97c7744..489dfad4 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -51,7 +51,7 @@ Plugin authors should create a module that exports an object with properties of module.exports = { package: async function extendCloudFormation (arc, sam, stage='staging', inventory) { }, - pluginFunctions: async function (arc, inventory) { + pluginFunctions: function (arc, inventory) { }, sandbox: { start: async function (arc, inventory, builtInSandboxServices) { @@ -122,10 +122,10 @@ You should return an array of objects, each object representing a new Lambda bei let path = require('path') module.exports = { - pluginFunctions: async function (inventory) { - if (!inventory.inv._project.arc.rules) return [] + pluginFunctions: function (arc, inventory) { + if (!arc.rules) return [] // if plugin author didnt define @rules lambdas, return empty array signifying no new lambdas to add const cwd = inventory.inv._project.src - return inventory.inv._project.arc.rules.map((rule) => { + return arc.rules.map((rule) => { let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) return { src: rulesSrc, From 12d252410bdce1577c68017b01b30cfd13d23417 Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 9 Feb 2021 09:09:43 -0600 Subject: [PATCH 013/680] dont need the arc argument to the createLambdaJSON helper method --- src/views/docs/en/guides/extend/architect-plugins.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index 489dfad4..b4182107 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -199,7 +199,7 @@ For common Architect Plugin use cases, Architect provides a few helper functions ### `createLambdaJSON` -> `createLambdaJSON(arc, inventory, pathToPluginCloudFunction)` +> `createLambdaJSON(inventory, pathToPluginCloudFunction)` Available in the [`@architect/package`](https://npmjs.com/package/@architect/package) module, this method can be leveraged inside a plugin's [`package`](#package) method in order to easily and consistently define CloudFormation JSON representing Lambdas created by the plugin. @@ -209,7 +209,6 @@ Leveraging this helper method gives the plugin function support for [arc's per-f |Argument|Description| |---|---| -|`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| |`pathToPluginCloudFunction`|a string representing the path where code for the Lambda exists locally| From 40c1ad0590213a08a47d25b4c99323bba18e667a Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 9 Feb 2021 13:07:47 -0600 Subject: [PATCH 014/680] adding inventory argument to the new helper invokeLambda method --- src/views/docs/en/guides/extend/architect-plugins.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index b4182107..92d12653 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -239,7 +239,7 @@ module.exports = { ### `invokeLambda` -> `invokeLambda(pathToPluginCloudFunction, payload, callback)` +> `invokeLambda(inventory, pathToPluginCloudFunction, payload, callback)` Available in the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) module, this method can be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`arc sandbox`][sandbox] local development runtime context. @@ -247,6 +247,7 @@ Available in the [`@architect/sandbox`](https://npmjs.com/package/@architect/san |Argument|Description| |---|---| +|`inventory`|An [Architect inventory object][inv] representing the current Architect project| |`pathToPluginCloudFunction`|a string representing the path where code for the Lambda exists locally| |`payload`|JSON payload to deliver to the function| |`callback`|function with signature `function(error, result)` that is invoked with either the error or the result from the local function invocation| @@ -299,7 +300,7 @@ module.exports = { return JSON.parse(i) } } ]) - invokeLambda(response.rule, response.payload, function (err, result) { + invokeLambda(inventory, response.rule, response.payload, function (err, result) { if (err) console.error(`Error invoking lambda ${response.rule}!`, err) else console.log(`${response.rule} invocation result:`, result) }) From 8b133f29dd16be8466ff7770d9b56d275c5a09e8 Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 2 Mar 2021 17:05:42 -0500 Subject: [PATCH 015/680] clarifying requirements around plugin lambda src locations --- src/views/docs/en/guides/extend/architect-plugins.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index 92d12653..d11a82c8 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -37,7 +37,7 @@ myapp myplugin ``` -> In the example above running `arc deploy` will look for `./src/plugins/myplugin` and then `./node_modules/myplugin` +> In the example above running any `arc` commands will look for `./src/plugins/myplugin` and then `./node_modules/myplugin` ## Interface @@ -70,7 +70,7 @@ A deep dive into the [`package`](#package), [`pluginFunctions`](#pluginFunctions This method encapsulates [Architect's existing @macro functionality][macros]: extending Architect's generated CloudFormation `sam.json` with your own custom extensions. -**As a plugin author, if you intend for your plugin to create custom Lambdas**, you would be expected to leverage the plugin author helper method [`createLambdaJSON` described below](#createLambdaJSON) to painlessly create CloudFormation-compatible JSON representing your new cloud functions. You must also implement the [`pluginFunctions`](#pluginFunctions) plugin interface method. +**As a plugin author, if you intend for your plugin to create custom Lambdas**, you would be expected to leverage the plugin author helper method [`createLambdaJSON` described below](#createLambdaJSON) to painlessly create CloudFormation-compatible JSON representing your new cloud functions. You must also implement the [`pluginFunctions`](#pluginFunctions) plugin interface method to inform Architect of new Lambdas you are creating. #### Arguments @@ -113,7 +113,7 @@ You should return an array of objects, each object representing a new Lambda bei } ``` -- `src`: a string containing a fully qualified absolute path to the source code location for the Lambda function. +- `src`: a string containing a fully qualified absolute path to the source code location for the Lambda function. Relative to the arc project root, this property _must_ point to a location under the project's `src/` directory. - `body`: a string containing template code for the Lambda function handler #### Example `pluginFunctions` Implementation @@ -214,7 +214,7 @@ Leveraging this helper method gives the plugin function support for [arc's per-f #### Returns -A tuple (array of two objects) containing a string representing an AWS-friendly Lambda resource name (based on the path to the function code), and a JSON object that can be assigned to a CloudFormation `sam.json`'s `Resources` section. This would define a Lambda that Architect would create during a [`deploy`][deploy]. +A tuple (array of two objects) containing a string representing an AWS-friendly Lambda resource name (which is based on the path to the function code), and a JSON object that can be assigned to a CloudFormation `sam.json`'s `Resources` section. This would define a Lambda that Architect would create during a [`deploy`][deploy]. #### Example Usage of `createLambdaJSON` From 38148f233cb38b0bf704cda502c8c72b670c8ae3 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Thu, 4 Mar 2021 10:22:42 -0800 Subject: [PATCH 016/680] adds cloudfront stuff --- .../guides/domains/route53-and-cloudfront.md | 51 +++++++++++++++++++ .../domains/{route-53.md => route53.md} | 0 src/views/docs/table-of-contents.js | 5 +- 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/views/docs/en/guides/domains/route53-and-cloudfront.md rename src/views/docs/en/guides/domains/{route-53.md => route53.md} (100%) diff --git a/src/views/docs/en/guides/domains/route53-and-cloudfront.md b/src/views/docs/en/guides/domains/route53-and-cloudfront.md new file mode 100644 index 00000000..c0432096 --- /dev/null +++ b/src/views/docs/en/guides/domains/route53-and-cloudfront.md @@ -0,0 +1,51 @@ +--- +title: Route 53 +description: Setting up a domain name with Route 53 +--- + +## Prerequisites + +- [Register](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html) or [transfer](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) a domain with Route53 +- Deploy an app with Architect and make note of the `staging` and `production` URLs + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Expand the domain and click `Create record in Route53` button +- Verify CNAME record created in Route53 console Hosted zone + +## Step 2: setup CloudFront + +Generate a CloudFront distribution with the certificate from step 1. + +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` + +## Step 3: configure the domain Alias in AWS Route53 + +- Sign into AWS Route53 in the AWS Console +- Navigate to the Hosted zone for the domain +- Click `Create record` +- Enter the `Record name` +- Record type is `A` and toggle `Alias` checkbox on +- Select `Alias to CloudFront` +- Select the region +- Select the CloudFront distribution domain (should be the same value as the domain generated in Step 2) +- Click `Create records` + +## Conclusion + +Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/en/guides/domains/route-53.md b/src/views/docs/en/guides/domains/route53.md similarity index 100% rename from src/views/docs/en/guides/domains/route-53.md rename to src/views/docs/en/guides/domains/route53.md diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 1b1554f6..44db81bc 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -21,8 +21,9 @@ let Guides = [ { // TODO 'WebSockets functions', ], 'Domains': [ - 'Route 53', - 'Dreamhost', + 'Route53', + 'Route53 & CloudFront' + //'Dreamhost', //'Godaddy', //'One', //'Namecheap' From fa392c05d3f8ec5dcd1fc8a9352361909d388881 Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Thu, 4 Mar 2021 13:24:41 -0500 Subject: [PATCH 017/680] domain --- src/views/docs/en/guides/domains/dreamhost.md | 91 +++++-------------- 1 file changed, 24 insertions(+), 67 deletions(-) diff --git a/src/views/docs/en/guides/domains/dreamhost.md b/src/views/docs/en/guides/domains/dreamhost.md index cb6e6a51..51617ef4 100644 --- a/src/views/docs/en/guides/domains/dreamhost.md +++ b/src/views/docs/en/guides/domains/dreamhost.md @@ -1,79 +1,36 @@ --- title: Dreamhost description: Setting up a domain name with Dreamhost -sections: - - Overview - - Get SSL Certificates - - Map domain names - - Conclusion --- -## Overview +## Prerequisites -Follow these instructions to manually configure Dreamhost to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. +- Sign up for a domain on [Dreamhost](https://www.dreamhost.com/domains/) +- Deploy an app with Architect and make note of the `staging` and `production` URLs -This article assumes that you have already: +## Step 1: setup SSL certificates with AWS Certificate Manager -- signed up for Dreamhost -- purchased the domain of your choice +In this step we will request a certificate from Amazon for our domain. -## Get SSL Certificates +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Open up Dreamhost backend and click `Manage Domains` +- Click the `DNS` link under your domain to add custom DNS records +- Create CNAME records of both issued certificates +- Wait until they change from `pending` to `success` -In this step, you'll need to add two `CNAME` values to your Dreamhost DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. +## Step 2: setup custom domain with AWS API Gateway -- Click the `Get started` button in the Provision certificates section. -- Click `Request a public certificate`. -- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. +Generate a domain with the certificate from Step 1. -### Open Dreamhost DNS manager - -Head back to the Dreamhost console and navigate to the `DNS records` page for your specific domain. During the SSL verification step, the first part of the name gets entered as your `CNAME` subdomain, and the value is inputted as the value. For instance, when you're provided the following `CNAME` entry: - -- **Name:** `_2f9b34277e4b159e0beaa859e8802a93.example.com` -- **Value:** `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` - -You'll add a CNAME subdomain of - -- `_2f9b34277e4b159e0beaa859e8802a93` within your Dreamhost DNS console `Host` zone. - -Then, set its `Points to` to -- `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` - -Due to the eventually consistent nature of DNS-based verification, the certificates may say `pending` for a few hours until it propagates. Check back after a few minutes, and your values should be green, and you should be able to complete the next and final step. - -## Map domain names - -Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. - -- Click on **Custom Domain Names** -- Create a **Custom Domain Name** for `production` -- Fill in the form: - - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field - - Select the **ACM Certificate** you just verified - - Click `Create domain name` - - Enter `/` in the **Path** field - - Select your app's `production` API name in the **Destination** menu - - Select the `production` value in the **Stage** menu -- Copy the value of the generated **Distribution Domain Name** to your clipboard - -### Head back to Dreamhost and click into the domain in question. - -In the final step, you'll add the final `CNAME` and `ALIAS` records to your Dreamhost. This points your domain at your arc app. - -When you provide the `CNAME` record: - -- Switch to the `CNAME` record setting. -- **Name:** `staging` -- **Value:** `exampleurl.cloudfront.net` - -When you provide the `A` record: - -- Switch to the `ALIAS ` record setting. -- **Name:** leave blank -- **Value** section, add the Cloudfront URL - -## Conclusion - -Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). - -Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file +- Sign into AWS API Gateway in the AWS Console +- Navigate to `Custom domain names` and click `Create` +- Enter the domain name (eg. `staging.example.com` for the `staging` app or `example.com` for the `production` app) +- Select the certificate created in Step 1 +- Click `Create domain name` +- Make note of the generated `API Gateway domain name` in `Endpoint configuration` +- Click on the tab `API mappings` and `Configure API mappings` +- For `API` select the API and for `Stage` select `$default` and click `Save` \ No newline at end of file From ba8fef435bc837383d7435c8b9c4c65c58d0b397 Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Thu, 4 Mar 2021 13:26:30 -0500 Subject: [PATCH 018/680] 3.1.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4d9ee682..86aa4d09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.10", + "version": "3.1.11", "architect": { "app": "v8-arc-codes", "aws": { From 49c3b6fcbbb168719b3cc9e733878c552645d965 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Thu, 4 Mar 2021 11:27:49 -0800 Subject: [PATCH 019/680] Update quickstart.md --- src/views/docs/en/guides/get-started/quickstart.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/guides/get-started/quickstart.md b/src/views/docs/en/guides/get-started/quickstart.md index d362aeed..32e73b3c 100644 --- a/src/views/docs/en/guides/get-started/quickstart.md +++ b/src/views/docs/en/guides/get-started/quickstart.md @@ -6,10 +6,10 @@ description: Get started quickly with Architect > Architect is the quickest way to build serverless web apps on AWS -Open your terminal to install `arc`: +Open your terminal to install `arc` and the AWS SDK: ```bash -npm i -g @architect/architect +npm i -g @architect/architect aws-sdk ``` Check the version: From 01d1289d8fad635286309ee95e3e278b395380c8 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Thu, 4 Mar 2021 11:28:42 -0800 Subject: [PATCH 020/680] Update detailed-aws-setup.md --- src/views/docs/en/guides/get-started/detailed-aws-setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/guides/get-started/detailed-aws-setup.md b/src/views/docs/en/guides/get-started/detailed-aws-setup.md index 56bbf8e8..4d9179db 100644 --- a/src/views/docs/en/guides/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/guides/get-started/detailed-aws-setup.md @@ -115,10 +115,10 @@ $env:AWS_REGION='us-west-1' ### Install Architect -The following command uses `npm`, the package manager for Node, to install Architect globally. This will allow you to use Architect in any directory on your computer. +The following command uses `npm`, the package manager for Node, to install Architect and the AWS SDK globally. This will allow you to use Architect in any directory on your computer. ```bash -npm i -g @architect/architect +npm i -g @architect/architect aws-sdk ``` Or, if you prefer, you can install Architect locally into a project: From d09011cb75223a5d58e76c22b40b66530978a307 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Thu, 4 Mar 2021 11:29:21 -0800 Subject: [PATCH 021/680] 3.1.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 86aa4d09..6ba91683 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.11", + "version": "3.1.12", "architect": { "app": "v8-arc-codes", "aws": { From b800169fd48f45a44a08ebf6dd13dd296f3f110b Mon Sep 17 00:00:00 2001 From: filmaj Date: Thu, 4 Mar 2021 14:35:52 -0500 Subject: [PATCH 022/680] make explicit what version of arc supports plugins --- src/views/docs/en/guides/extend/architect-plugins.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index d11a82c8..92f8a294 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -3,6 +3,8 @@ title: Architect Plugins description: How to extend Architect using lifecycle hooks --- +> ⚠️ NOTE: Plugin supports exist only in architect version 8.5.0-RC.2 and above. + Using [`@macros`][macros] allows you to augment the Architect-generated CloudFormation before deployment. However, augmenting CloudFormation may not be sufficient for certain extensions. For example, if you want to extend Architect with: - Your own custom Lambda integrations (e.g. Kinesis Stream or Lex conversation bot) and want Architect to create, hydrate and be able to retrieve the logs for these functions From 6e05f17ed41aa9d4d58b55c89465d18503f8abbb Mon Sep 17 00:00:00 2001 From: filmaj Date: Thu, 4 Mar 2021 14:35:57 -0500 Subject: [PATCH 023/680] 3.1.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ba91683..95ac166f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.12", + "version": "3.1.13", "architect": { "app": "v8-arc-codes", "aws": { From 23c3de244c4c8e5ea9d50897062122d346aeb885 Mon Sep 17 00:00:00 2001 From: filmaj Date: Thu, 4 Mar 2021 15:06:57 -0500 Subject: [PATCH 024/680] updating link to example plugin in plugin extension docs --- src/views/docs/en/guides/extend/architect-plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index 92f8a294..6fe9d28c 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -319,7 +319,7 @@ The above plugin's `sandbox.start` method listens for the "I" keyboard keypress, ## Example Plugins -- [plugin-iot-rules](https://github.com/copperinc/macro-iot-rules/tree/plugins): a plugin adding AWS IoT Topic event Lambdas +- [plugin-iot-rules](https://www.npmjs.com/package/@copper/plugin-iot-rules): a plugin adding AWS IoT Topic event Lambdas [inv]: https://github.com/architect/inventory [macros]: custom-cloudformation From fdb26ee4c054df466749b1461a097d54cf69c2b6 Mon Sep 17 00:00:00 2001 From: filmaj Date: Fri, 5 Mar 2021 18:51:54 -0500 Subject: [PATCH 025/680] updating docs for plugins --- .../en/guides/extend/architect-plugins.md | 62 +++++++++++-------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index 6fe9d28c..816196e9 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -51,14 +51,14 @@ Plugin authors should create a module that exports an object with properties of */ module.exports = { - package: async function extendCloudFormation (arc, sam, stage='staging', inventory) { + package: async function extendCloudFormation ({ arc, cloudformation, stage='staging', inventory }) { }, - pluginFunctions: function (arc, inventory) { + pluginFunctions: function ({ arc, inventory }) { }, sandbox: { - start: async function (arc, inventory, builtInSandboxServices) { + start: async function ({ arc, inventory, services }) { }, - end: async function (arc, inventory, builtInSandboxServices) { + end: async function ({ arc, inventory, services }) { } } } @@ -68,7 +68,7 @@ A deep dive into the [`package`](#package), [`pluginFunctions`](#pluginFunctions ### `package` -> `package(arc, sam, stage, inventory)` +> `package({ arc, sam, stage, inventory })` This method encapsulates [Architect's existing @macro functionality][macros]: extending Architect's generated CloudFormation `sam.json` with your own custom extensions. @@ -76,20 +76,22 @@ This method encapsulates [Architect's existing @macro functionality][macros]: ex #### Arguments +All arguments arrive as a bag of options with the following properties: + |Argument|Description| |---|---| |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| -|`sam`|The [CloudFormation JSON template][cfn-ref] making up the Architect project| +|`cloudformation`|The [CloudFormation JSON template][cfn-ref] making up the Architect project| |`stage`|The name of the environment; usually one of `staging` or `production`| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| #### Returns -You _must_ return the `sam` argument after modifying it with your own extensions. +You _must_ return the `cloudformation` argument after modifying it with your own extensions. ### `pluginFunctions` -> `pluginFunctions(arc, inventory)` +> `pluginFunctions({ arc, inventory })` The plugin author must implement this method if the plugin defines new Lambda functions. This method is used by Architect to allow your custom plugin Lambdas to hook into Architect's capabilities and lifecycle, such as: @@ -99,6 +101,8 @@ The plugin author must implement this method if the plugin defines new Lambda fu #### Arguments +All arguments arrive as a bag of options with the following properties: + |Argument|Description| |---|---| |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| @@ -124,7 +128,7 @@ You should return an array of objects, each object representing a new Lambda bei let path = require('path') module.exports = { - pluginFunctions: function (arc, inventory) { + pluginFunctions: function ({ arc, inventory }) { if (!arc.rules) return [] // if plugin author didnt define @rules lambdas, return empty array signifying no new lambdas to add const cwd = inventory.inv._project.src return arc.rules.map((rule) => { @@ -156,9 +160,9 @@ rule-two ### `sandbox.start` -> `start(arc, inventory, builtInSandboxServices, callback)` +> `start({ arc, inventory, services }, callback)` -The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It would also allow to modify behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `builtInSandboxServices` argument. +The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It would also allow to modify behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `services` argument. This method can either be `async` or not; if the plugin author implements it as `async`, then the final `callback` argument may be ignored. Otherwise, the `callback` argument should be invoked once the plugin's sandbox service is ready. @@ -166,11 +170,13 @@ A helper method [`invokeLambda` (described below)](#invokeLambda) is provided by #### Arguments +All arguments arrive as a bag of options with the following properties: + |Argument|Description| |---|---| |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| -|`builtInSandboxServices`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| +|`services`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| |`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service is ready| #### Example `start` Implementation @@ -179,7 +185,7 @@ An example is [provided below that leverages the `invokeLambda` helper method](# ### `sandbox.end` -> `end(arc, inventory, builtInSandboxServices, callback)` +> `end({ arc, inventory, services }, callback)` If the plugin author implements the [`sandbox.start`](#sandbox.start) method, then they must also implement the `sandbox.end` method. This method gives the plugin the opportunity to gracefully shut down any services powering local development support of the plugin. @@ -187,11 +193,13 @@ This method can either be `async` or not; if the plugin author implements it as #### Arguments +All arguments arrive as a bag of options with the following properties: + |Argument|Description| |---|---| |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| -|`builtInSandboxServices`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| +|`services`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| |`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service has been shut down| @@ -201,7 +209,7 @@ For common Architect Plugin use cases, Architect provides a few helper functions ### `createLambdaJSON` -> `createLambdaJSON(inventory, pathToPluginCloudFunction)` +> `createLambdaJSON({ inventory, src })` Available in the [`@architect/package`](https://npmjs.com/package/@architect/package) module, this method can be leveraged inside a plugin's [`package`](#package) method in order to easily and consistently define CloudFormation JSON representing Lambdas created by the plugin. @@ -209,10 +217,12 @@ Leveraging this helper method gives the plugin function support for [arc's per-f #### Arguments +All arguments arrive as a bag of options with the following properties: + |Argument|Description| |---|---| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| -|`pathToPluginCloudFunction`|a string representing the path where code for the Lambda exists locally| +|`src`|A string representing the path where code for the Lambda exists locally| #### Returns @@ -225,12 +235,12 @@ let createLambdaJSON = require('@architect/package/createLambdaJSON') let path = require('path') module.exports = { - package: async function IoTRulesLambdas (arc, cfn, stage = 'staging', inventory) { + package: async function IoTRulesLambdas ({ arc, cloudformation, stage = 'staging', inventory }) { if (arc.rules) { const cwd = inventory.inv._project.src arc.rules.forEach(rule => { let code = path.join(cwd, 'src', 'rules', rule[0]) - let [functionName, functionDefn] = createLambdaJSON(inventory, code) + let [functionName, functionDefn] = createLambdaJSON({ inventory, src: code }) cfn.Resources[functionName] = functionDefn }) } @@ -241,18 +251,20 @@ module.exports = { ### `invokeLambda` -> `invokeLambda(inventory, pathToPluginCloudFunction, payload, callback)` +> `invokeLambda({ inventory, src, payload }, callback)` Available in the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) module, this method can be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`arc sandbox`][sandbox] local development runtime context. #### Arguments +All arguments arrive as a bag of options with the following properties: + |Argument|Description| |---|---| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| -|`pathToPluginCloudFunction`|a string representing the path where code for the Lambda exists locally| +|`src`|A string representing the path where code for the Lambda exists locally| |`payload`|JSON payload to deliver to the function| -|`callback`|function with signature `function(error, result)` that is invoked with either the error or the result from the local function invocation| +|`callback`|Function with signature `function(error, result)` that is invoked with either the error or the result from the local function invocation| #### Example Usage of `invokeLambda` @@ -261,7 +273,7 @@ let path = require('path') let prompt = require('prompt') module.exports = { - pluginFunctions: async function (arc, inventory) { + pluginFunctions: async function ({ arc, inventory }) { if (!arc.rules) return [] const cwd = inventory.inv._project.src return arc.rules.map((rule) => { @@ -275,8 +287,8 @@ module.exports = { }) }, sandbox: { - start: function IoTRulesServiceStart (arc, inventory, builtInSandboxServices, callback) { - let rules = module.exports.pluginFunctions(arc, inventory).map(rule => rule.src) + start: function IoTRulesServiceStart ({ arc, inventory, services }, callback) { + let rules = module.exports.pluginFunctions({ arc, inventory }).map(rule => rule.src) process.stdin.on('keypress', async function IoTRulesKeyListener (input, key) { if (input === 'I') { const response = await prompt([ { @@ -302,7 +314,7 @@ module.exports = { return JSON.parse(i) } } ]) - invokeLambda(inventory, response.rule, response.payload, function (err, result) { + invokeLambda({ inventory, src: response.rule, payload: response.payload }, function (err, result) { if (err) console.error(`Error invoking lambda ${response.rule}!`, err) else console.log(`${response.rule} invocation result:`, result) }) From 3716ef9b6cc3f363af7d63479b6191cd204c054e Mon Sep 17 00:00:00 2001 From: filmaj Date: Fri, 5 Mar 2021 18:55:57 -0500 Subject: [PATCH 026/680] update warning on minimum arc version --- src/views/docs/en/guides/extend/architect-plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index 816196e9..0bd1354c 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -3,7 +3,7 @@ title: Architect Plugins description: How to extend Architect using lifecycle hooks --- -> ⚠️ NOTE: Plugin supports exist only in architect version 8.5.0-RC.2 and above. +> ⚠️ NOTE: Plugin supports exist only in architect version 8.5.0-RC.3 and above. Using [`@macros`][macros] allows you to augment the Architect-generated CloudFormation before deployment. However, augmenting CloudFormation may not be sufficient for certain extensions. For example, if you want to extend Architect with: From 506d8eb9cba36eccb9c416b86da8e6b7849576cc Mon Sep 17 00:00:00 2001 From: filmaj Date: Fri, 5 Mar 2021 18:56:11 -0500 Subject: [PATCH 027/680] 3.1.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 95ac166f..a03f2f92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.13", + "version": "3.1.14", "architect": { "app": "v8-arc-codes", "aws": { From 5a69db19f2b23f4141e377d10e4f8078cbdd1920 Mon Sep 17 00:00:00 2001 From: filmaj Date: Wed, 10 Mar 2021 17:54:52 -0500 Subject: [PATCH 028/680] fix syntax error in plugin example --- src/views/docs/en/guides/extend/architect-plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index 0bd1354c..1be93301 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -241,10 +241,10 @@ module.exports = { arc.rules.forEach(rule => { let code = path.join(cwd, 'src', 'rules', rule[0]) let [functionName, functionDefn] = createLambdaJSON({ inventory, src: code }) - cfn.Resources[functionName] = functionDefn + cloudformation.Resources[functionName] = functionDefn }) } - return cfn + return cloudformation } } ``` From e96a7a61f7adb58280153b191a331ccd7b6a5da8 Mon Sep 17 00:00:00 2001 From: actsone8 Date: Sat, 13 Mar 2021 11:27:09 -0600 Subject: [PATCH 029/680] Added step 2 bullet for route53 & cloudfront AWS now requires aliases used to be entered in the "Alternate Domain Names" field (see https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-cloudfront-distribution.html) --- src/views/docs/en/guides/domains/route53-and-cloudfront.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/docs/en/guides/domains/route53-and-cloudfront.md b/src/views/docs/en/guides/domains/route53-and-cloudfront.md index c0432096..dff64286 100644 --- a/src/views/docs/en/guides/domains/route53-and-cloudfront.md +++ b/src/views/docs/en/guides/domains/route53-and-cloudfront.md @@ -31,6 +31,7 @@ Generate a CloudFront distribution with the certificate from step 1. - Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` - Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` - Set `Compress Objects Automatically` to `Yes` +- Enter the domain alias in `Alternate Domain Names` (which you will configure in step 3) - Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 - Click `Create Distribution` From 1cf7d19f6548b2b0de1390912d7b5366643cefa3 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Mon, 15 Mar 2021 21:35:59 +0000 Subject: [PATCH 030/680] Fix package function signiture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I somehow copy-pasted the one snippet that was wrong 😆 --- src/views/docs/en/guides/extend/architect-plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/architect-plugins.md index 1be93301..5575b337 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/architect-plugins.md @@ -68,7 +68,7 @@ A deep dive into the [`package`](#package), [`pluginFunctions`](#pluginFunctions ### `package` -> `package({ arc, sam, stage, inventory })` +> `package({ arc, cloudformation, stage, inventory })` This method encapsulates [Architect's existing @macro functionality][macros]: extending Architect's generated CloudFormation `sam.json` with your own custom extensions. From b6da75ae39d012cdd08d690ef07253d61391d35c Mon Sep 17 00:00:00 2001 From: Oliver Turner Date: Wed, 17 Mar 2021 15:20:36 +0000 Subject: [PATCH 031/680] Update .env.md Seeing at least one issue where this came up and having gotcha'd myself with this only today, an explicit pointer might be useful here... --- src/views/docs/en/reference/prefs.arc/.env.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/views/docs/en/reference/prefs.arc/.env.md b/src/views/docs/en/reference/prefs.arc/.env.md index a0fb47e0..148528f6 100644 --- a/src/views/docs/en/reference/prefs.arc/.env.md +++ b/src/views/docs/en/reference/prefs.arc/.env.md @@ -5,6 +5,8 @@ description: Sandbox environment variables Architect sandbox supports loading environment variables from a `.env` file. The `.env` will override your `preferences.arc` or `prefs.arc` and environment variables it defines will be loaded for whichever environment the sandbox is running (`testing`, `staging`, or `production`). +(NB: Recall that key/value pairs in `.env` files are separated by the `=` symbol) + ## Example `.env` file ```env From 880a570e0dda3ae94daaa747a247d6998ce9e368 Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Thu, 18 Mar 2021 06:34:13 -0400 Subject: [PATCH 032/680] Added Dreamhost domains guide to docs --- src/views/docs/en/guides/domains/dreamhost.md | 43 ++++++++++++++----- src/views/docs/table-of-contents.js | 4 +- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/views/docs/en/guides/domains/dreamhost.md b/src/views/docs/en/guides/domains/dreamhost.md index 51617ef4..c9e48459 100644 --- a/src/views/docs/en/guides/domains/dreamhost.md +++ b/src/views/docs/en/guides/domains/dreamhost.md @@ -6,7 +6,9 @@ description: Setting up a domain name with Dreamhost ## Prerequisites - Sign up for a domain on [Dreamhost](https://www.dreamhost.com/domains/) +- Make sure your domain is set to `DNS Only` in the Dreamhost console. - Deploy an app with Architect and make note of the `staging` and `production` URLs +- Make sure your app is deployed to `us-east-1` ## Step 1: setup SSL certificates with AWS Certificate Manager @@ -22,15 +24,36 @@ In this step we will request a certificate from Amazon for our domain. - Create CNAME records of both issued certificates - Wait until they change from `pending` to `success` -## Step 2: setup custom domain with AWS API Gateway +## Step 2: setup CloudFront -Generate a domain with the certificate from Step 1. +Generate a CloudFront distribution with the certificate from step 1. -- Sign into AWS API Gateway in the AWS Console -- Navigate to `Custom domain names` and click `Create` -- Enter the domain name (eg. `staging.example.com` for the `staging` app or `example.com` for the `production` app) -- Select the certificate created in Step 1 -- Click `Create domain name` -- Make note of the generated `API Gateway domain name` in `Endpoint configuration` -- Click on the tab `API mappings` and `Configure API mappings` -- For `API` select the API and for `Stage` select `$default` and click `Save` \ No newline at end of file +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` +- Repeat for `staging` domain. + +## Step 3: configure the domain Alias in Dreamhost + +Add `Alias` and `CNAME` records to DNS. + +- Sign into Dreamhost +- Navigate to the domain by clicking `Manage Domains` in the sidebar. +- Click `DNS` under the domain +- Click `Add Record` +- Use record type `Alias` for the root domain. + - Leave `Host` input blank and add the Cloudfront domain that was created in step 2 to the `Points to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the Cloudfront domain that was created in step 2 to the `Points to` input. +- Click `Add records` + +## Conclusion + +Now we're done! You can check to see if your domains are online with the DNS checker tool provided by Dreamhost. You can also use this [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 44db81bc..1406a11d 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -22,8 +22,8 @@ let Guides = [ { ], 'Domains': [ 'Route53', - 'Route53 & CloudFront' - //'Dreamhost', + 'Route53 & CloudFront', + 'Dreamhost', //'Godaddy', //'One', //'Namecheap' From 4c260e66c12d43ff7b421979c1ef4e7cdb5214d9 Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Thu, 18 Mar 2021 06:39:19 -0400 Subject: [PATCH 033/680] 3.1.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a03f2f92..e8ee42b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.14", + "version": "3.1.15", "architect": { "app": "v8-arc-codes", "aws": { From 969aa68b1f0b19ed61318ed363b196ca09798d6f Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Fri, 19 Mar 2021 08:24:06 -0400 Subject: [PATCH 034/680] Added docs for new domain services --- package.json | 1 + src/views/docs/en/guides/domains/dreamhost.md | 2 + src/views/docs/en/guides/domains/godaddy.md | 103 +++++--------- src/views/docs/en/guides/domains/namecheap.md | 122 +++++++--------- src/views/docs/en/guides/domains/one.md | 134 +++++++----------- src/views/docs/table-of-contents.js | 6 +- 6 files changed, 149 insertions(+), 219 deletions(-) diff --git a/package.json b/package.json index e8ee42b7..534172ad 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@architect/functions": "^3.13.8", "@architect/inventory": "^1.2.0", "@architect/package": "^6.0.1", + "@architect/sandbox": "^3.3.8", "@toycode/markdown-it-class": "^1.2.4", "eslint": "^7.15.0", "esm": "^3.2.25", diff --git a/src/views/docs/en/guides/domains/dreamhost.md b/src/views/docs/en/guides/domains/dreamhost.md index c9e48459..25c9245c 100644 --- a/src/views/docs/en/guides/domains/dreamhost.md +++ b/src/views/docs/en/guides/domains/dreamhost.md @@ -9,6 +9,7 @@ description: Setting up a domain name with Dreamhost - Make sure your domain is set to `DNS Only` in the Dreamhost console. - Deploy an app with Architect and make note of the `staging` and `production` URLs - Make sure your app is deployed to `us-east-1` +- Ensure the `@app` name is uniquely named after the domain. ## Step 1: setup SSL certificates with AWS Certificate Manager @@ -30,6 +31,7 @@ Generate a CloudFront distribution with the certificate from step 1. - Sign into AWS CloudFront in the AWS Console - Click `Create Distribution` and then click `Get Started` +- Open API Gateway and make note of the Invoke URL. - Enter the URL from API Gateway in `Origin Domain Name` - Set `Origin Protocol Policy` to `Match Viewer` - Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. diff --git a/src/views/docs/en/guides/domains/godaddy.md b/src/views/docs/en/guides/domains/godaddy.md index f3bfe52e..96c7b474 100644 --- a/src/views/docs/en/guides/domains/godaddy.md +++ b/src/views/docs/en/guides/domains/godaddy.md @@ -1,82 +1,57 @@ --- title: Godaddy description: Setting up a domain name with Godaddy -sections: - - Overview - - Get SSL Certificates - - Map domain names - - Conclusion --- -## Overview +## Prerequisites -Follow these instructions to manually configure Godaddy to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. +- Sign up for a domain on [Godaddy](https://www.Godaddy.com/) +- Deploy an app with Architect and make note of the `staging` and `production` URLs +- Ensure the app is deployed to `us-east-1` +- Ensure the `@app` name is uniquely named after the domain. -This article assumes that you have already: +## Step 1: setup SSL certificates with AWS Certificate Manager -- signed up for Godaddy -- purchased the domain of your choice +In this step we will request a certificate from Amazon for our domain. -## Get SSL Certificates +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Open up Godaddy account dashboard and find the `DNS` settings for the particular domain you want to use. +- Click `ADD` and select `CNAME` +- Create CNAME records of both issued certificates +- Wait until they change from `pending` to `success` -In this step, you'll need to add two `CNAME` values to your Godaddy DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. +## Step 2: setup CloudFront -- Click the `Get started` button in the Provision certificates section. -- Click `Request a public certificate`. -- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. +Generate a CloudFront distribution with the certificate from step 1. -### Verify your ownership of the domain(s). +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Open API Gateway and make note of the `Invoke URL`. +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` +- Repeat for `staging` domain. -In this step, you'll need to add two `CNAME` values to your Godaddy DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. +## Step 3: configure the domain Alias in Godaddy -Head back to the Godaddy console and navigate to the `DNS records` page for your specific domain. During the SSL verification step, the first part of the name gets entered as your `CNAME` subdomain, and the value is inputted as the value. For instance, when you're provided the following `CNAME` entry: +Add `A` and `CNAME` records to DNS. -- **Name:** `_2f9b34277e4b159e0beaa859e8802a93.www.example.com` -- **Value:** `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` - -You'll add a CNAME subdomain of - -- `_2f9b34277e4b159e0beaa859e8802a93` within your Godaddy DNS console `Host` zone. - -Then, set its `Points to` to -- `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` - -Due to the eventually consistent nature of DNS-based verification, it may take a few minutes for your changes to get picked up. Check back after a few minutes, and your values should be green, and you should be able to complete the next and final step. - -## Map domain names - -Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. - -- Click on **Custom Domain Names** -- Create a **Custom Domain Name** for `production` -- Fill in the form: - - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field - - Select the **ACM Certificate** you just verified - - Click `Create domain name` - - Enter `/` in the **Path** field - - Select your app's `production` API name in the **Destination** menu - - Select the `production` value in the **Stage** menu -- Copy the value of the generated **Distribution Domain Name** to your clipboard - -### Head back to Godaddy and click into the domain in question. - -In the final step, you'll add the final `CNAME` and `A` records to your Godaddy. This points your domain at your arc app. - -When you provide the `CNAME` record: - -- Switch to `CNAME` record setting. -- **Host:** `staging` -- **Points to:** `pi1f6fddqd0dje.cloudfront.net` - -When you provide the `A` record: - -- Switch to `A` record setting. -- **Host:** input `@` symbol -- Find out the IP address of the given cloudfront URL (`http://pi1f6fddqd0dje.cloudfront.net`) using a tool like [24x7.com](https://www.site24x7.com/find-ip-address-of-web-site.html) -- Lastly in the **Points to:** section, add the IP address. +- Open up Godaddy account dashboard and find the `DNS` settings for the particular domain you want to use. +- Click `ADD`. +- Use record type `A` for the root domain. + - Leave `Host` input empty and add the IP address of the Cloudfront domain that was created in step 2 to the `Points to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the Cloudfront domain that was created in step 2 to the `Points to` input. ## Conclusion -Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). - -Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file +Now we're done! You can check to see if your domains are online with the DNS checker tool [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/en/guides/domains/namecheap.md b/src/views/docs/en/guides/domains/namecheap.md index 939eaa30..a87c92c0 100644 --- a/src/views/docs/en/guides/domains/namecheap.md +++ b/src/views/docs/en/guides/domains/namecheap.md @@ -1,79 +1,59 @@ --- title: Namecheap description: Setting up a domain name with Namecheap -sections: - - Overview - - Get SSL Certificates - - Map domain names - - Conclusion --- -## Overview - -Follow these instructions to manually configure Namecheap to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. - -This article assumes that you have already: - -- signed up for Namecheap -- purchased the domain of your choice - -## Get SSL Certificates - -In this step, you'll need to add two `CNAME` values to your Namecheap DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. - -- Click the `Get started` button in the Provision certificates section. -- Click `Request a public certificate`. -- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. - -### Open Namecheap DNS manager - -Head back to the Namecheap console and navigate to the `Advanced DNS` page for your specific domain. During the SSL verification step, the first part of the name gets entered as your CNAME subdomain, and the value is inputted as the value. For instance, when you're provided the following CNAME entry: - -- Name: `_2f9b34277e4b159e0beaa859e8802a93.www.example.com` -- Value: `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` - -You'll add a CNAME subdomain of -- `_2f9b34277e4b159e0beaa859e8802a93` within your Namecheap -- `Host` zone, and set its value to `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.`. - -Due to the eventually consistent nature of DNS-based verification, it may take a few minutes for your changes to get picked up. Check back after a few minutes, and your values should be green, and you should be able to complete the next and final step. - -> If for some reason after more than a few minutes your domains haven't verified, make sure that you've correctly entered the settings into your DNS. - -## Map domain names - -Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. - -- Click on **Custom Domain Names** -- Create a **Custom Domain Name** for `production` -- Fill in the form: - - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field - - Select the **ACM Certificate** you just verified - - Click `Create domain name` - - Enter `/` in the **Path** field - - Select your app's `production` API name in the **Destination** menu - - Select the `production` value in the **Stage** menu -- Copy the value of the generated **Distribution Domain Name** to your clipboard - -### Head back to Namecheap and click into the domain in question. - -In the final step, you'll add the final `CNAME` and `ALIAS` records to your Namecheap. This points your domain at your arc app. - -When you provide the `CNAME` record: - -- Switch to `CNAME` record setting. -- Host: `staging` -- Value: `pi1f6fddqd0dje.cloudfront.net` - - -When you provide the `ALIAS` record: - -- Switch to `Alias` record setting. -- Host: `@` -- Value: `pi1f6fddqd0dje.cloudfront.net` +## Prerequisites + +- Sign up for a domain on [Namecheap](https://www.Namecheap.com/domains/) +- Deploy an app with Architect and make note of the `staging` and `production` URLs +- Make sure your app is deployed to `us-east-1` +- Ensure the `@app` name is uniquely named after the domain. + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Open up Namecheap account dashboard and click `Manage` for the particular domain you want to use. +- Open the `Advanced DNS` tab. +- Click `ADD A NEW RECORD` +- Create CNAME records of both issued certificates +- Wait until they change from `pending` to `success` + +## Step 2: setup CloudFront + +Generate a CloudFront distribution with the certificate from step 1. + +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Open API Gateway and make note of the `Invoke URL`. +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` +- Repeat for `staging` domain. + +## Step 3: configure the domain Alias in Namecheap + +Add `Alias` and `CNAME` records to DNS. + +- Open up Namecheap account dashboard and click `Manage` for the particular domain you want to use. +- Open the `Advanced DNS` tab. +- Click `ADD A NEW RECORD` +- Use record type `Alias` for the root domain. + - Add `@` in the `Host` input and add the Cloudfront domain that was created in step 2 to the `Value` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the Cloudfront domain that was created in step 2 to the `Value` input. ## Conclusion -Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). - -Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file +Now we're done! You can check to see if your domains are online with the DNS checker tool [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/en/guides/domains/one.md b/src/views/docs/en/guides/domains/one.md index fb147c9c..7b087e18 100644 --- a/src/views/docs/en/guides/domains/one.md +++ b/src/views/docs/en/guides/domains/one.md @@ -1,87 +1,59 @@ --- -title: One.com -description: Setting up a domain name with One.com -sections: - - Overview - - Get SSL Certificates - - Map domain names - - Conclusion +title: One +description: Setting up a domain name with One --- -## Overview - -Follow these instructions to manually configure One to serve your application from your domain. Per the [Start here](/docs/en/guides/domains/start-here) section, you should have already deployed your arc app to `staging` and `production` and saved the `URLs` for later steps below. - -This article assumes that you have already: - -- signed up for One.com -- purchased the domain of your choice - -## Get SSL Certificates - -In this step, you'll need to add two `CNAME` values to your One DNS to verify your ownership of the domain and generate your SSL certificates for HTTPS. Now that you have your domain, let's request a SSL certificates from AWS Certificate Manager. - -- Click the `Get started` button in the Provision certificates section. -- Click `Request a public certificate`. -- **Pro-tip:** set up both `example.com` and `staging.example.com` for use with subdomains. - -### Verify your ownership of the domain(s). - -In this step, you'll need to add two `CNAME` values to your One.com DNS in order to verify your ownership of the domain and generate your SSL certificates for HTTPS. - -Head back to the One.com console and navigate to the `DNS records` page for your specific domain. During the SSL verification step, the first part of the name gets entered as your `CNAME` subdomain, and the value is inputted as the value. For instance, when you're provided the following `CNAME` entry: - -- **Name:** `_2f9b34277e4b159e0beaa859e8802a93.www.example.com` -- **Value:** `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws.` - -You'll add a CNAME subdomain of - -- `_2f9b34277e4b159e0beaa859e8802a93` within your One.com `Hostname` zone. - -Then, set its `Is an alias of` to -- `_58cb94c5d71976edd03e8303fc1a126b.acm-validations.aws` - -> ⚠️ Leave the trailing period off! - -Due to the eventually consistent nature of DNS-based verification, it may take a few minutes for your changes to get picked up. Check back after a few minutes, and your values should be green, and you should be able to complete the next and final step. - -> If for some reason after more than a few minutes your domains haven't verified, make sure that you've correctly entered the settings into your DNS. - -## Map domain names - -Sign into AWS API Gateway. Follow these instructions for adding both `production` domain and `staging` domain. - -- Click on **Custom Domain Names** -- Create a **Custom Domain Name** for `production` -- Fill in the form: - - Enter the exact FQDN you intend to use (i.e. `arc.codes` or `www.foo.com`) in the **Domain Name** field - - Select the **ACM Certificate** you just verified - - Click `Create domain name` - - Enter `/` in the **Path** field - - Select your app's `production` API name in the **Destination** menu - - Select the `production` value in the **Stage** menu -- Copy the value of the generated **Distribution Domain Name** to your clipboard - -### Head back to One.com and click into the domain in question. - -In the final step, you'll add the final `CNAME` and `ALIAS` records to your One.com. This points your domain at your arc app. - -When you provide the `CNAME` record: - -- Switch to `CNAME` record setting. -- **Hostname:** `staging` -- **Is an alias of:** `pi1f6fddqd0dje.cloudfront.net` - - -When you provide the `A` record: - -- Switch to `A` record setting. -- **Hostname:** input `@` symbol -- Find out the IP address of the given cloudfront URL (`http://pi1f6fddqd0dje.cloudfront.net`) using a tool like [24x7.com](https://www.site24x7.com/find-ip-address-of-web-site.html) -- Lastly in the **Will point to:** section, add the IP address. +## Prerequisites + +- Sign up for a domain on [One](https://www.one.com/en/domain) +- Deploy an app with Architect and make note of the `staging` and `production` URLs +- Ensure the app is deployed to `us-east-1` +- Ensure the `@app` name is uniquely named after the domain. + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Open up One account dashboard and click `DNS settings` for the particular domain you want to use. +- Open the `DNS records` tab. +- Click the `CNAME` tab in the `Create new record` box +- Create CNAME records of both issued certificates +- Wait until they change from `pending` to `success` + +## Step 2: setup CloudFront + +Generate a CloudFront distribution with the certificate from step 1. + +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Open API Gateway and make note of the `Invoke URL`. +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` +- Repeat for `staging` domain. + +## Step 3: configure the domain Alias in One + +Add `A` and `CNAME` records to DNS. + +- Open up One account dashboard and click `DNS settings` for the particular domain you want to use. +- Open the `DNS records` tab. +- Click the `A` tab in the `Create new record` box +- Use record type `A` for the root domain. + - Leave `Hostname` input empty and add the IP address of the Cloudfront domain that was created in step 2 to the `Will point to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Hostname` input and add the Cloudfront domain that was created in step 2 to the `Is an alias of` input. ## Conclusion -Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). - -Keep in mind that it takes a few hours for DNS to propagate fully, so be patient. Perhaps grab a cup of coffee or tea ☕️ – it can take a few minutes while AWS wires everything up! \ No newline at end of file +Now we're done! You can check to see if your domains are online with the DNS checker tool [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 4b1aefef..c12789a1 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -25,9 +25,9 @@ let Guides = [ { 'Route53', 'Route53 & CloudFront', 'Dreamhost', - //'Godaddy', - //'One', - //'Namecheap' + 'Godaddy', + 'One', + 'Namecheap' ], /* TODO 'Backend': [ From 921b695938603585efc35629914a8a1b30ccd8ec Mon Sep 17 00:00:00 2001 From: ShawnHosea Date: Fri, 19 Mar 2021 08:29:17 -0400 Subject: [PATCH 035/680] 3.1.16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 534172ad..b15170de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.15", + "version": "3.1.16", "architect": { "app": "v8-arc-codes", "aws": { From 0e5930cace8c261387c42cd5147a2ab2cd613834 Mon Sep 17 00:00:00 2001 From: filmaj Date: Mon, 22 Mar 2021 14:26:26 -0400 Subject: [PATCH 036/680] tweaking contents of plugin guide --- .../en/guides/extend/{architect-plugins.md => plugins.md} | 4 ++-- src/views/docs/table-of-contents.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/views/docs/en/guides/extend/{architect-plugins.md => plugins.md} (99%) diff --git a/src/views/docs/en/guides/extend/architect-plugins.md b/src/views/docs/en/guides/extend/plugins.md similarity index 99% rename from src/views/docs/en/guides/extend/architect-plugins.md rename to src/views/docs/en/guides/extend/plugins.md index 5575b337..e7f187aa 100644 --- a/src/views/docs/en/guides/extend/architect-plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -1,9 +1,9 @@ --- -title: Architect Plugins +title: Plugins (beta) description: How to extend Architect using lifecycle hooks --- -> ⚠️ NOTE: Plugin supports exist only in architect version 8.5.0-RC.3 and above. +> ⚠️ NOTE: Plugin support was added in version 8.5.0, is currently in beta and the interface is subject to change Using [`@macros`][macros] allows you to augment the Architect-generated CloudFormation before deployment. However, augmenting CloudFormation may not be sufficient for certain extensions. For example, if you want to extend Architect with: diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index c12789a1..0ff8e9ae 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -40,7 +40,7 @@ let Guides = [ { 'Extend': [ // TODO'Migrate legacy code',// @proxy, arc.http.express 'Custom CloudFormation', - 'Architect Plugins', + 'Plugins', // TODO'Add a custom domain', // TODO'Ejecting ' ] From 3b18355cc6fb9b8f8e85be30dffc5dbb6c1a64f6 Mon Sep 17 00:00:00 2001 From: filmaj Date: Mon, 22 Mar 2021 14:26:35 -0400 Subject: [PATCH 037/680] 3.1.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b15170de..d8f86780 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.16", + "version": "3.1.17", "architect": { "app": "v8-arc-codes", "aws": { From f3e2f0f81c9870d9fed94ed0e66f6ba3d391a451 Mon Sep 17 00:00:00 2001 From: Ankcorn Date: Mon, 22 Mar 2021 20:38:49 +0000 Subject: [PATCH 038/680] formatting & removed no other config required statement --- src/views/docs/en/reference/app.arc/ws.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 20ed2933..b662d403 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -5,10 +5,6 @@ description: Defin WebSocket endpoints Define WebSocket endpoint and Lambda handler functions. -### Syntax - -No other config required - ### Example This `app.arc` file defines both HTTP and WebSocket endpoints: @@ -28,9 +24,9 @@ myapp get / @ws -# no other config required ``` + @@ -53,6 +49,7 @@ get / } } ``` + @@ -68,8 +65,8 @@ http=[ ] "ws" -# no other config required ``` + @@ -85,13 +82,13 @@ http: - get: "/" ws: ~ -# no other config required ``` + - + Running `arc create` generates the following functions: From 7666ae589351eafa8cc4bf198308ef6ca1b1d50a Mon Sep 17 00:00:00 2001 From: Ankcorn Date: Mon, 22 Mar 2021 20:44:59 +0000 Subject: [PATCH 039/680] update file tree to match modern structure --- src/views/docs/en/reference/app.arc/ws.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index b662d403..f771d0cc 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -94,12 +94,10 @@ Running `arc create` generates the following functions: ```bash / -|-src -| |-http -| | '-get-index/ -| '-ws -| |-connect/ -| |-default/ -| '-disconnect/ -'-app.arc +├── ws +│ ├── connect +│ ├── default +│ ├── disconnect +├── app.arc +└── package.json ``` From d781fafc75fc477f530b4b6d7c3d212d9372256c Mon Sep 17 00:00:00 2001 From: Ankcorn Date: Mon, 22 Mar 2021 21:48:48 +0000 Subject: [PATCH 040/680] add more sections to the ws documentation --- src/views/docs/en/reference/app.arc/ws.md | 40 +++++++++++++++-------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index f771d0cc..309fcacc 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -20,9 +20,6 @@ This `app.arc` file defines both HTTP and WebSocket endpoints: @app myapp -@http -get / - @ws ``` @@ -37,10 +34,7 @@ get / ```json { "architect": { - "app": "myapp", - "http": [ - [ "get", "/" ] - ], + "app": "myapp" "ws": {} }, "start": "npx sandbox", @@ -60,10 +54,6 @@ get / ```toml app="testapp" -http=[ - [ "get", "/" ] -] - "ws" ``` @@ -78,9 +68,6 @@ http=[ --- app: testapp -http: -- get: "/" - ws: ~ ``` @@ -101,3 +88,28 @@ Running `arc create` generates the following functions: ├── app.arc └── package.json ``` + +Each function responds to websocket events from a client. + +In the functions payload there is a connectionId that uniquely identifies a client. This connectionId can be used to send messages to the correct client. + +### Functions + +Each function created by the @ws pragma handles a different event from a websocket client. + +* Connect - This function is invoked when a websocket client connects to the application +* Default - This function is invoked when a websocket client sends a message to the application +* Disconnect - This function is invoked when a websocket client disconnects from your application + +#### Function Payload + +|Argument|Description| +|---|---| +|`req`|The websocket request payload| +|`req.requestContext.connectionId`|An id that uniquely identifies a client| + +#### Send Messages + +To send websocket messages to the client you can use the architect/functions ws.send method. + +Docs: [node](/docs/en/reference/runtime/node#arc.ws) - [ruby](/docs/en/reference/runtime/ruby#arc.ws) - [python](/docs/en/reference/runtime/python#arc.ws) From 08638e62819e26b4f9b76edcb41621c7bddde125 Mon Sep 17 00:00:00 2001 From: Ankcorn Date: Tue, 23 Mar 2021 09:34:30 +0000 Subject: [PATCH 041/680] add node ws helper docs --- src/views/docs/en/reference/app.arc/ws.md | 2 +- src/views/docs/en/reference/runtime/node.md | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 309fcacc..06dfdd45 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -95,7 +95,7 @@ In the functions payload there is a connectionId that uniquely identifies a clie ### Functions -Each function created by the @ws pragma handles a different event from a websocket client. +The functions created by the @ws pragma handle events from a websocket client. * Connect - This function is invoked when a websocket client connects to the application * Default - This function is invoked when a websocket client sends a message to the application diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index e8f5457f..27f9d90d 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -31,6 +31,7 @@ let arc = require('@architect/functions') - [`arc.tables`](#arc.tables) Generates a DynamoDB client for `@tables` - [`arc.events`](#arc.events) Publish/subscribe helpers for SNS `@events` functions - [`arc.queues`](#arc.queues) Publish/subscribe helpers for SQS `@queues` functions +- [`arc.ws`](#arc.ws) Websocket helpers for `@ws` functions ### `arc.static` @@ -233,3 +234,16 @@ await arc.queues.publish({ payload: {hits: 1}, }) ``` + +### `arc.ws` + +Send a message over websockets + +```javascript +let arc = require('@architect/functions') + +await arc.ws.send({ + id: connectionId, + payload: { message: 'hai 🐶' } +}) +``` From 820dffe6f14774ca6924419ae71fbed3ea5c6874 Mon Sep 17 00:00:00 2001 From: Ankcorn Date: Tue, 23 Mar 2021 09:36:50 +0000 Subject: [PATCH 042/680] improve language for ws send messages --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 06dfdd45..ab1b30c1 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -110,6 +110,6 @@ The functions created by the @ws pragma handle events from a websocket client. #### Send Messages -To send websocket messages to the client you can use the architect/functions ws.send method. +To publish a message to the client you can use the architect/functions ws.send method. Docs: [node](/docs/en/reference/runtime/node#arc.ws) - [ruby](/docs/en/reference/runtime/ruby#arc.ws) - [python](/docs/en/reference/runtime/python#arc.ws) From 78dc9aeceec62ee5d0db94abc38e2929088f5aad Mon Sep 17 00:00:00 2001 From: Ankcorn Date: Tue, 23 Mar 2021 09:37:34 +0000 Subject: [PATCH 043/680] add note about being able to call it from anywhere --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index ab1b30c1..8186815a 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -110,6 +110,6 @@ The functions created by the @ws pragma handle events from a websocket client. #### Send Messages -To publish a message to the client you can use the architect/functions ws.send method. +To publish a message to a websocket client you can use the architect/functions ws.send method. You can call this method from any of your applications functions. Docs: [node](/docs/en/reference/runtime/node#arc.ws) - [ruby](/docs/en/reference/runtime/ruby#arc.ws) - [python](/docs/en/reference/runtime/python#arc.ws) From a70669dbff6518ce788c49ab7b833142997db2a9 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:40:46 +0000 Subject: [PATCH 044/680] Update src/views/docs/en/reference/app.arc/ws.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 8186815a..3d3ed817 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -91,7 +91,7 @@ Running `arc create` generates the following functions: Each function responds to websocket events from a client. -In the functions payload there is a connectionId that uniquely identifies a client. This connectionId can be used to send messages to the correct client. +In the [payload delivered to the function](#function-payload) there is a `connectionId` that uniquely identifies a client. This `connectionId` can be used to send messages to the correct client. ### Functions From 031e0c8a7db19b56fd76d8317341560fe354b834 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:40:53 +0000 Subject: [PATCH 045/680] Update src/views/docs/en/reference/app.arc/ws.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 3d3ed817..d0f92dec 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -89,7 +89,7 @@ Running `arc create` generates the following functions: └── package.json ``` -Each function responds to websocket events from a client. +Each function responds to WebSocket events from a client. In the [payload delivered to the function](#function-payload) there is a `connectionId` that uniquely identifies a client. This `connectionId` can be used to send messages to the correct client. From 37ada9c91c115df3b07280c060970f67f469a027 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:41:03 +0000 Subject: [PATCH 046/680] Update src/views/docs/en/reference/app.arc/ws.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index d0f92dec..bafa7c7e 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -95,7 +95,7 @@ In the [payload delivered to the function](#function-payload) there is a `connec ### Functions -The functions created by the @ws pragma handle events from a websocket client. +The functions created by the `@ws` pragma handle events from a WebSocket client. * Connect - This function is invoked when a websocket client connects to the application * Default - This function is invoked when a websocket client sends a message to the application From 4169e4536924fd1a6e7ec9b9827c7abecb3ad8f5 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:41:07 +0000 Subject: [PATCH 047/680] Update src/views/docs/en/reference/app.arc/ws.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index bafa7c7e..0ddfdc84 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -97,7 +97,7 @@ In the [payload delivered to the function](#function-payload) there is a `connec The functions created by the `@ws` pragma handle events from a WebSocket client. -* Connect - This function is invoked when a websocket client connects to the application +* Connect - This function is invoked when a WebSocket client connects to the application * Default - This function is invoked when a websocket client sends a message to the application * Disconnect - This function is invoked when a websocket client disconnects from your application From 63ea5e97c82d9eade6b8ef083795f2a76096f740 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:41:12 +0000 Subject: [PATCH 048/680] Update src/views/docs/en/reference/app.arc/ws.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 0ddfdc84..ef458205 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -98,7 +98,7 @@ In the [payload delivered to the function](#function-payload) there is a `connec The functions created by the `@ws` pragma handle events from a WebSocket client. * Connect - This function is invoked when a WebSocket client connects to the application -* Default - This function is invoked when a websocket client sends a message to the application +* Default - This function is invoked when a WebSocket client sends a message to the application * Disconnect - This function is invoked when a websocket client disconnects from your application #### Function Payload From b2f1e46382e8f5063be376bc791435a1d4f4a667 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:41:17 +0000 Subject: [PATCH 049/680] Update src/views/docs/en/reference/app.arc/ws.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index ef458205..4342f58a 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -99,7 +99,7 @@ The functions created by the `@ws` pragma handle events from a WebSocket client. * Connect - This function is invoked when a WebSocket client connects to the application * Default - This function is invoked when a WebSocket client sends a message to the application -* Disconnect - This function is invoked when a websocket client disconnects from your application +* Disconnect - This function is invoked when a WebSocket client disconnects from your application #### Function Payload From af88f5df96689fc44dd7839bf2005e8e1ebbe867 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:41:23 +0000 Subject: [PATCH 050/680] Update src/views/docs/en/reference/app.arc/ws.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 4342f58a..0366abfa 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -105,7 +105,7 @@ The functions created by the `@ws` pragma handle events from a WebSocket client. |Argument|Description| |---|---| -|`req`|The websocket request payload| +|`req`|The WebSocket request payload| |`req.requestContext.connectionId`|An id that uniquely identifies a client| #### Send Messages From a5d0a7f79ba417c49014772c2f7c5265c68e2923 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:41:28 +0000 Subject: [PATCH 051/680] Update src/views/docs/en/reference/app.arc/ws.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 0366abfa..4507d30f 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -110,6 +110,6 @@ The functions created by the `@ws` pragma handle events from a WebSocket client. #### Send Messages -To publish a message to a websocket client you can use the architect/functions ws.send method. You can call this method from any of your applications functions. +To publish a message to a WebSocket client you can use arc's runtime library `@architect/functions`' `ws.send` method. You can call this method from any of your application's functions. Docs: [node](/docs/en/reference/runtime/node#arc.ws) - [ruby](/docs/en/reference/runtime/ruby#arc.ws) - [python](/docs/en/reference/runtime/python#arc.ws) From b6c74865315bb4d0f870da80b6a187c7fa652b46 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:41:36 +0000 Subject: [PATCH 052/680] Update src/views/docs/en/reference/runtime/node.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/runtime/node.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index 27f9d90d..f32f0f72 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -31,7 +31,7 @@ let arc = require('@architect/functions') - [`arc.tables`](#arc.tables) Generates a DynamoDB client for `@tables` - [`arc.events`](#arc.events) Publish/subscribe helpers for SNS `@events` functions - [`arc.queues`](#arc.queues) Publish/subscribe helpers for SQS `@queues` functions -- [`arc.ws`](#arc.ws) Websocket helpers for `@ws` functions +- [`arc.ws`](#arc.ws) WebSocket helpers for `@ws` functions ### `arc.static` From 22e9c15dbc9380c58f56d4da99fd9f98d18e64b3 Mon Sep 17 00:00:00 2001 From: Thomas Ankcorn Date: Tue, 23 Mar 2021 13:41:42 +0000 Subject: [PATCH 053/680] Update src/views/docs/en/reference/runtime/node.md Co-authored-by: Fil Maj --- src/views/docs/en/reference/runtime/node.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index f32f0f72..b3e721e1 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -237,7 +237,7 @@ await arc.queues.publish({ ### `arc.ws` -Send a message over websockets +Send a message over WebSockets. ```javascript let arc = require('@architect/functions') From a47f92077dafb827d88bccfcbb5d079a4ac41724 Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 23 Mar 2021 09:44:57 -0400 Subject: [PATCH 054/680] 3.1.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d8f86780..b763e97f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.17", + "version": "3.1.18", "architect": { "app": "v8-arc-codes", "aws": { From 163adf65ead432717727deb0f922a3bac9b471e0 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Thu, 8 Apr 2021 12:31:56 -0700 Subject: [PATCH 055/680] 3.1.19 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b763e97f..9e87f414 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.18", + "version": "3.1.19", "architect": { "app": "v8-arc-codes", "aws": { From 31c6a530374b3e508a9123e65b98ee56e3c5161a Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Thu, 8 Apr 2021 12:41:13 -0700 Subject: [PATCH 056/680] 3.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9e87f414..d1fcf1ba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.1.19", + "version": "3.2.0", "architect": { "app": "v8-arc-codes", "aws": { From 9f9e3e97bb23b3809973f73812eba5aeea3aaefb Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Thu, 8 Apr 2021 19:09:57 -0700 Subject: [PATCH 057/680] Update node.md --- src/views/docs/en/reference/runtime/node.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index b3e721e1..308b45eb 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -212,7 +212,7 @@ await arc.events.publish({ ### `arc.queues` -Subscribe to an SQS topic +Subscribe to an SQS queue ```javascript let arc = require('@architect/functions') @@ -224,7 +224,7 @@ async function handler (event) { } ``` -Publish to an SNS topic +Publish to an SQS queue ```javascript let arc = require('@architect/functions') From b6d66931087714f7176e8ddad1c5a43436c587fd Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Mon, 12 Apr 2021 14:23:42 -0700 Subject: [PATCH 058/680] Update deploy.md --- src/views/docs/en/reference/cli/deploy.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/docs/en/reference/cli/deploy.md b/src/views/docs/en/reference/cli/deploy.md index 385509b2..8cdac4b3 100644 --- a/src/views/docs/en/reference/cli/deploy.md +++ b/src/views/docs/en/reference/cli/deploy.md @@ -17,6 +17,7 @@ arc deploy [production|static|direct] ## Flags +- `--no-hydrate` Do not automatically run `npm`, `bundle` or `pip` - `[dirty, --dirty, -d]` Overwrite staging Lambda with local source. A faster way to deploy and test small changes to individual functions without redeploying an entire stack. - `[--dry-run ]` Creates a CloudFormation template but does not deploy it. A dry-run allows you to check the CloudFormation and SAM output before deploying the actual stack. - `[production, --production, -p]` Deploys a CloudFormation stack to a production stack. From 637ce2ef1c96da8f135d929b7063b4c98dba8344 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Mon, 12 Apr 2021 14:36:49 -0700 Subject: [PATCH 059/680] adds --no-hydrate to deploy docs --- src/views/docs/en/reference/cli/deploy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/cli/deploy.md b/src/views/docs/en/reference/cli/deploy.md index 8cdac4b3..17279463 100644 --- a/src/views/docs/en/reference/cli/deploy.md +++ b/src/views/docs/en/reference/cli/deploy.md @@ -17,7 +17,7 @@ arc deploy [production|static|direct] ## Flags -- `--no-hydrate` Do not automatically run `npm`, `bundle` or `pip` +- `[--no-hydrate]` Do not automatically run `npm`, `bundle` or `pip` - `[dirty, --dirty, -d]` Overwrite staging Lambda with local source. A faster way to deploy and test small changes to individual functions without redeploying an entire stack. - `[--dry-run ]` Creates a CloudFormation template but does not deploy it. A dry-run allows you to check the CloudFormation and SAM output before deploying the actual stack. - `[production, --production, -p]` Deploys a CloudFormation stack to a production stack. From f46d7d5adc0031b03e1e7369d9bd48dfc9840723 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Mon, 12 Apr 2021 14:36:53 -0700 Subject: [PATCH 060/680] 3.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d1fcf1ba..c7577bb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.2.0", + "version": "3.2.1", "architect": { "app": "v8-arc-codes", "aws": { From 6e304ab5ab4f1761c8eeb60d8d554673d9978434 Mon Sep 17 00:00:00 2001 From: kj Date: Thu, 29 Apr 2021 14:24:06 -0700 Subject: [PATCH 061/680] Updates sandbox. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c7577bb2..a21f16db 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@architect/functions": "^3.13.8", "@architect/inventory": "^1.2.0", "@architect/package": "^6.0.1", - "@architect/sandbox": "^3.3.8", + "@architect/sandbox": "^3.4.2", "@toycode/markdown-it-class": "^1.2.4", "eslint": "^7.15.0", "esm": "^3.2.25", From 2121e21f03f308d10d075816add4aaa873781d0a Mon Sep 17 00:00:00 2001 From: kj Date: Thu, 29 Apr 2021 14:29:48 -0700 Subject: [PATCH 062/680] Updates explanaition copy for @views pragma --- src/views/docs/en/reference/app.arc/views.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/reference/app.arc/views.md b/src/views/docs/en/reference/app.arc/views.md index 7172fcb4..2dda0b40 100644 --- a/src/views/docs/en/reference/app.arc/views.md +++ b/src/views/docs/en/reference/app.arc/views.md @@ -3,9 +3,10 @@ title: '@views' description: Share view code across `@http` functions --- -Configure the location of view code. Architect considers copies view code into HTTP GET handler Lambda functions. +Configure the location of view code. +Architect copies view code to all HTTP GET handler functions by default. +You can also specify only the routes you want views copied to with the `@views` pragma. -You can also specify to only copy view code to specific lambda functions by listing them directly. ## Syntax - Routes should be existing `@http` routes. From bf1efce94df1bf02f2bbba34828ce081de44f0a8 Mon Sep 17 00:00:00 2001 From: kj Date: Thu, 29 Apr 2021 15:14:04 -0700 Subject: [PATCH 063/680] 3.2.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a21f16db..948745a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.2.1", + "version": "3.2.2", "architect": { "app": "v8-arc-codes", "aws": { From 8504d23e73aad41a9c99194976244499244e0555 Mon Sep 17 00:00:00 2001 From: Andy Buckingham Date: Mon, 3 May 2021 19:17:48 +0100 Subject: [PATCH 064/680] Update timeout.md Call out the default behaviour. Only concern is that I believe Architect leaves this value undefined when pushing to CloudFormation, so we're actually depending on whatever AWS' default is - but 5s is the default enforced by Sandbox, so feels reasonable to define here? --- src/views/docs/en/reference/config.arc/timeout.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/config.arc/timeout.md b/src/views/docs/en/reference/config.arc/timeout.md index 7fc38229..5d3a2f5e 100644 --- a/src/views/docs/en/reference/config.arc/timeout.md +++ b/src/views/docs/en/reference/config.arc/timeout.md @@ -5,10 +5,11 @@ description: Lambda function configuration Configure Lambda function `timeout` in seconds to a max of `900`. (`15` minutes.) +The default timeout (if no value supplied) is `5`. (`5` seconds.) + ## Example ```arc @aws timeout 30 ``` - From 35936e7fc1c4e00241bc3903e439aa8a734c108a Mon Sep 17 00:00:00 2001 From: filmaj Date: Fri, 9 Apr 2021 11:55:53 -0400 Subject: [PATCH 065/680] first stab at service discovery documentation for both plugins and runtime docs --- src/views/docs/en/guides/extend/plugins.md | 127 +++++++++++++++++--- src/views/docs/en/reference/runtime/node.md | 67 ++++++++++- 2 files changed, 173 insertions(+), 21 deletions(-) diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index e7f187aa..c792ab1a 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -20,8 +20,9 @@ Architect `@plugins` solves these use cases by providing a variety of [interface 2. [Interface](#interface) 1. [`package`](#package) 2. [`pluginFunctions`](#pluginfunctions) - 3. [`sandbox.start`](#sandbox.start) - 4. [`sandbox.end`](#sandbox.end) + 3. [`variables`](#variables) + 4. [`sandbox.start`](#sandbox.start) + 5. [`sandbox.end`](#sandbox.end) 3. [Helper Methods for Plugin Authors](#helper-methods-for-plugin-authors) 1. [`createLambdaJSON`](#createlambdajson) 2. [`invokeLambda`](#invokelambda) @@ -51,20 +52,17 @@ Plugin authors should create a module that exports an object with properties of */ module.exports = { - package: async function extendCloudFormation ({ arc, cloudformation, stage='staging', inventory }) { - }, - pluginFunctions: function ({ arc, inventory }) { - }, + package: async function extendCloudFormation ({ arc, cloudformation, stage='staging', inventory }) {}, + pluginFunctions: function ({ arc, inventory }) {}, + variables: function ({ arc, stage, inventory }) {}, sandbox: { - start: async function ({ arc, inventory, services }) { - }, - end: async function ({ arc, inventory, services }) { - } + start: async function ({ arc, inventory, services }) {}, + end: async function ({ arc, inventory, services }) {} } } ``` -A deep dive into the [`package`](#package), [`pluginFunctions`](#pluginFunctions), [`sandbox.start`](#sandbox.start) and [`sandbox.end`](#sandbox.end) methods follows. +A deep dive into the [`package`](#package), [`pluginFunctions`](#pluginFunctions), [`variables`](#variables), [`sandbox.start`](#sandbox.start) and [`sandbox.end`](#sandbox.end) methods follows. ### `package` @@ -158,6 +156,94 @@ rule-two - [`arc hydrate`][hydrate] would hydrate the above two folders - [`arc logs src/rules/rule-one`][logs] would pull in any deployed-to-staging execution logs for the `rule-one` function +### `variables` + +> `variables({ arc, cloudformation, stage, inventory })` + +The plugin author should implement this method if the plugin would like to provide any manner of data to Lambda functions at runtime. For context, Architect provides a suite of runtime helpers in the form of its [`@architect/functions`][functions] library. This library leverages functionality provided by [`deploy`][deploy] and [`sandbox`][sandbox] to expose runtime variables enabling [service discovery][discovery] - the automatic configuration, search and discovery of infrastructure and services making up your application. The `variables` plugin method enables plugin authors to hook into the Architect service discovery mechanism. + +This method is used by Architect in two situations: + +1. When running in a local development context via [`sandbox`][sandbox], `sandbox` will invoke the `variables` method in order to compile all runtime variables required by Architect application plugins and provide them to [`@architect/functions`][functions]. +2. When running in a remotely-deployed context on AWS, [`deploy`][deploy] will invoke the `variables` method in order to compile an [AWS SSM Parameter][ssm] per variable exported by the method before each deploy. Then, post-`deploy` at runtime, [`@architect/functions`][functions] will query the [AWS SSM Parameter Store][ssm] to retrieve these variables at runtime. + +Therefore the `variables` plugin method is only necessary to implement if you would like your plugin to provide runtime data within Lambdas via the [`@architect/functions`][functions] library. The exported variables would be available on the `services` object provided by [`@architect/functions`][functions], namespaced under the plugin name. For more information on how to query the service discovery mechanism using [`@architect/functions`][functions], check out the [`services` documentation][services]. + +#### Arguments + +All arguments arrive as a bag of options with the following properties: + +|Argument|Description| +|---|---| +|`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| +|`cloudformation`|The [CloudFormation JSON template][cfn-ref] making up the Architect project| +|`stage`|The name of the environment; usually one of `testing`, `staging` or `production`; `testing` is provided when running in a [`sandbox`][sandbox] context whereas `staging` and `production` are provided at Architect CLI runtime when either `arc deploy staging` or `arc deploy production` are invoked, respectively| +|`inventory`|An [Architect inventory object][inv] representing the current Architect project| + +#### Returns + +This method should always return an object. Each property on the object represents a variable name, and the value for each property contains the variable value. + +> 🏌️‍♀️ Protip: When this method is invoked in a pre-`deploy` context, acceptable values for the variables include CloudFormation JSON. This is essential to expose CloudFormation-managed infrastructure. + +#### Example `variables` Implementation + +For example, a `variables` return value for a plugin creating a new S3 Bucket may export variables related to the location of and credentials for the bucket: + +```javascript +module.exports = { + variables: function ({ arc, cloudformation, stage, inventory }) { + if (!arc['myS3Bucket']) return {} // if the user isn't using this plugin, return an empty object signifying no variables need exporting + const isLocal = stage === 'testing' // stage will equal 'testing' when running in sandbox, otherwise will be one of 'staging' or 'production' + const bucketName = `${arc.app}-newS3Bucket` + return { + bucketName, + accessKey: isLocal ? 'S3RVER' : { Ref: 'MyS3BucketCreds' }, + secretKey: isLocal ? 'S3RVER' : { 'Fn::GetAtt': [ 'MyS3BucketCreds', 'SecretAccessKey' ] } + } + } +} +``` + +Note that when running locally, we provide some dummy set of credentials that the plugin could hard-code and check for when implementing the plugin [`sandbox.start`](#sandbox.start) method. Otherwise, when running in a pre-`deploy` context, we return CloudFormation JSON pointing to credentials the plugin could add to CloudFormation Resources when implementing the plugin [`package`](#package) method. + +The variables are namespaced on the [`@architect/functions`' `services`][services] object under a property equalling the plugin name; check out the [`services`][services] documentation for more details. + +#### Example Service Discovery Usage With `@architect/functions` + +How would a plugin consumer use these variables at runtime in their own application? Let's take a look at the below example, which builds upon the S3 Bucket example from the above previous section. It demonstrates one possible [`@http`][http] GET route implementation rendering a form allowing a user to upload to the plugin-generated S3 Bucket: + +```javascript +let arc = require('@architect/functions') +let form = require('./form') // helper that creates a form element we can render for users to upload their assets to our S3 bucket +let aws = require('aws-sdk') + +exports.handler = arc.http.async(async function getIndex (req) { + if (!arc.services) await arc._loadServices() // service discovery is done on-demand, so always check that the `services` map is populated! + const { bucketName, accessKey, secretKey } = arc.services.imagebucket // assuming the plugin name is called 'imagebucket' + const region = process.env.AWS_REGION + const upload = form({ bucketName, accessKey, secretKey, region }) + const s3 = new aws.S3 + const images = await s3.listObjects({ Bucket: bucketName, Prefix: 'thumb/' }).promise() + const imgTags = images.Contents.map(i => i.Key.replace('thumb/', '/img/')).map(i => ``).join('\n') + return { + headers: { + 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', + 'content-type': 'text/html; charset=utf8' + }, + body: ` + + +

Hi! Upload something directly from the browser to the S3 bucket:

+ ${upload} +

And here are all the previously uploaded images:

+ ${imgTags} + +` + } +}) +``` + ### `sandbox.start` > `start({ arc, inventory, services }, callback)` @@ -211,7 +297,7 @@ For common Architect Plugin use cases, Architect provides a few helper functions > `createLambdaJSON({ inventory, src })` -Available in the [`@architect/package`](https://npmjs.com/package/@architect/package) module, this method can be leveraged inside a plugin's [`package`](#package) method in order to easily and consistently define CloudFormation JSON representing Lambdas created by the plugin. +Available in the [`@architect/package`](https://npmjs.com/package/@architect/package) module (in version 6.2.0 and later), this method can be leveraged inside a plugin's [`package`](#package) method in order to easily and consistently define CloudFormation JSON representing Lambdas created by the plugin. Leveraging this helper method gives the plugin function support for [arc's per-function runtime configuration via the `config.arc` file](https://arc.codes/docs/en/reference/config.arc/aws) transparently. @@ -226,7 +312,10 @@ All arguments arrive as a bag of options with the following properties: #### Returns -A tuple (array of two objects) containing a string representing an AWS-friendly Lambda resource name (which is based on the path to the function code), and a JSON object that can be assigned to a CloudFormation `sam.json`'s `Resources` section. This would define a Lambda that Architect would create during a [`deploy`][deploy]. +A tuple (array of two objects) containing: + +1. A string representing an AWS-friendly Lambda resource name (which is based on the path to the function code), and +2. A JSON object that can be assigned to a CloudFormation `sam.json`'s `Resources` section. This would define a Lambda that Architect would create during a [`deploy`][deploy] #### Example Usage of `createLambdaJSON` @@ -253,7 +342,7 @@ module.exports = { > `invokeLambda({ inventory, src, payload }, callback)` -Available in the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) module, this method can be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`arc sandbox`][sandbox] local development runtime context. +Available in the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) module (in version 3.4.0 and later), this method can be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`arc sandbox`][sandbox] local development runtime context. #### Arguments @@ -269,6 +358,7 @@ All arguments arrive as a bag of options with the following properties: #### Example Usage of `invokeLambda` ```javascript +let invokeLambda = require('@architect/sandbox/invokeLambda') let path = require('path') let prompt = require('prompt') @@ -331,7 +421,9 @@ The above plugin's `sandbox.start` method listens for the "I" keyboard keypress, ## Example Plugins -- [plugin-iot-rules](https://www.npmjs.com/package/@copper/plugin-iot-rules): a plugin adding AWS IoT Topic event Lambdas +- [plugin-iot-rules](https://www.npmjs.com/package/@copper/plugin-iot-rules): adds AWS IoT Topic event Lambdas +- [plugin-parcel](https://www.npmjs.com/package/@copper/plugin-parcel): compiles project Lambda code with the Parcel bundler both during local development via [`sandbox`][sandbox] and before [`deploy`s][deploy] +- [arc-plugin-s3-image-bucket](https://www.npmjs.com/package/arc-plugin-s3-image-bucket): manages an S3 bucket purpose-built for allowing direct-from-user image uploads, includes support for customizable Lambda triggers based on bucket events [inv]: https://github.com/architect/inventory [macros]: custom-cloudformation @@ -344,5 +436,8 @@ The above plugin's `sandbox.start` method listens for the "I" keyboard keypress, [hydrate]: ../../reference/cli/hydrate [logs]: ../../reference/cli/logs [deploy]: ../../reference/cli/deploy +[functions]: ../../reference/runtime/node +[services]: ../../reference/runtime/node#arc.services [cfn-ref]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html - +[discovery]: https://en.wikipedia.org/wiki/Service_discovery +[ssm]: https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index 308b45eb..ecf24858 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -3,15 +3,15 @@ title: Node description: Node runtime helpers --- -Architect runtime helpers are optional but they do make working with CloudFormation provisioned resources nicer. CloudFormation resources are generated with names more friendly for machines than people. Other frameworks leave resource discovery up to end users which leads to ad hoc implementations becoming a frequent bug vector. Architect treats runtime discovery as a first class concern. +Architect runtime helpers are optional but they do make working with CloudFormation provisioned resources nicer. CloudFormation resources are generated with names more friendly for machines than people. Other frameworks leave resource discovery up to end users which leads to ad hoc implementations becoming a frequent bug vector. Architect treats runtime discovery as a first class concern. > Amazon Resource Names (ARNs) are available at runtime to all Lambda functions defined in the same `app.arc`. Things such as DynamoDB tables, SNS topics, SQS queues, API Gateway endpoints, and S3 static bucket ARNs are baked into `@architect/functions` so your runtime program logic interacts with resources using people friendly and readable names defined in the `app.arc` file. -## Setup +## Setup Install the Architect runtime helpers for Node: -```bash +```bash npm install @architect/functions ``` @@ -23,7 +23,7 @@ let arc = require('@architect/functions') ## API -- [`arc.static`](#arc.static) Get a `@static` asset path +- [`arc.static`](#arc.static) Get a `@static` asset path - [`arc.http.async`](#arc.http.async) Middleware for `@http` functions - [`arc.http.express`](#arc.http.express) Express support for `@http` functions - [`arc.http.proxy`](#arc.http.proxy) Middleware for `@static` assets @@ -32,6 +32,8 @@ let arc = require('@architect/functions') - [`arc.events`](#arc.events) Publish/subscribe helpers for SNS `@events` functions - [`arc.queues`](#arc.queues) Publish/subscribe helpers for SQS `@queues` functions - [`arc.ws`](#arc.ws) WebSocket helpers for `@ws` functions +- [`arc.services`](#arc.services) Architect service map, exposing all services making up the application +- [`arc._loadServices`](#arc._loadServices) Architect service map hydration method ### `arc.static` @@ -138,7 +140,7 @@ async function handler (req) { // save the session into a cookie string let cookie = await arc.http.session.write({ count: 1 }) // write the cookie to the browser - return { + return { statusCode: 200, headers: { 'set-cookie': cookie }, } @@ -247,3 +249,58 @@ await arc.ws.send({ payload: { message: 'hai 🐶' } }) ``` + +### `arc.services` + +An object representing the service map of infrastructure and services making up the Architect application. This object is lazily-loaded and thus initially will be falsy. To force a hydration of this object, you can use the [`arc._loadServices`](#arc._loadServices) method, described below. + +`arc.services`, when hydrated, would resemble something like the following (depending on the makeup of the Architect application): + +```javascript +{ + imagebucket: { // a plugin named 'imagebucket' exposing some service discovery variables + accessKey: 'someAccessKey', + name: 'arc-plugin-s3-image-bucket-example-image-buket', + secretKey: 'someSecretKey' + }, + static: { // built-in @static service discovery variables + bucket: 'arcplugins3imagebucketexamplestaging-staticbucket-g8rsuk82ancj', + fingerprint: 'false' + } +} +``` + +### `arc._loadServices` + +Method for hydrating the [`arc.services`](#arc.services) service map. This method is lazily invoked by `@architect/functions` for built-in infrastructure support like `@tables`, `@events` and `@queues`. For use with third party Architect plugins, this method should be invoked manually from within your Lambda functions: + +```javascript +let arc = require('@architect/functions') +let form = require('./form') // helper that creates a form element we can render for users to upload their assets to an S3 bucket +let aws = require('aws-sdk') + +exports.handler = arc.http.async(async function getIndex (req) { + if (!arc.services) await arc._loadServices() // service discovery is done on-demand, so always check that the `services` map is populated! + const { bucketName, accessKey, secretKey } = arc.services.imagebucket // assuming our app uses a plugin named 'imagebucket' + const region = process.env.AWS_REGION + const upload = form({ bucketName, accessKey, secretKey, region }) + const s3 = new aws.S3 + const images = await s3.listObjects({ Bucket: bucketName, Prefix: 'thumb/' }).promise() + const imgTags = images.Contents.map(i => i.Key.replace('thumb/', '/img/')).map(i => ``).join('\n') + return { + headers: { + 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', + 'content-type': 'text/html; charset=utf8' + }, + body: ` + + +

Hi! Upload something directly from the browser to the S3 bucket:

+ ${upload} +

And here are all the previously uploaded images:

+ ${imgTags} + +` + } +}) +``` From 58a1dfa3d809043e5217fcf873a8b0200a507266 Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 13 Apr 2021 09:41:16 -0400 Subject: [PATCH 066/680] collapsing services and _loadServices into one method for symmetry with arc.tables et al --- src/views/docs/en/guides/extend/plugins.md | 8 ++-- src/views/docs/en/reference/runtime/node.md | 51 +++++---------------- 2 files changed, 16 insertions(+), 43 deletions(-) diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index c792ab1a..e96d90dc 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -167,7 +167,7 @@ This method is used by Architect in two situations: 1. When running in a local development context via [`sandbox`][sandbox], `sandbox` will invoke the `variables` method in order to compile all runtime variables required by Architect application plugins and provide them to [`@architect/functions`][functions]. 2. When running in a remotely-deployed context on AWS, [`deploy`][deploy] will invoke the `variables` method in order to compile an [AWS SSM Parameter][ssm] per variable exported by the method before each deploy. Then, post-`deploy` at runtime, [`@architect/functions`][functions] will query the [AWS SSM Parameter Store][ssm] to retrieve these variables at runtime. -Therefore the `variables` plugin method is only necessary to implement if you would like your plugin to provide runtime data within Lambdas via the [`@architect/functions`][functions] library. The exported variables would be available on the `services` object provided by [`@architect/functions`][functions], namespaced under the plugin name. For more information on how to query the service discovery mechanism using [`@architect/functions`][functions], check out the [`services` documentation][services]. +Therefore the `variables` plugin method is only necessary to implement if you would like your plugin to provide runtime data within Lambdas via the [`@architect/functions`][functions] library. The exported variables would be available via the [`services` function][services] provided by [`@architect/functions`][functions] (namespaced under the plugin name). For more information on how to query the service discovery mechanism using [`@architect/functions`][functions] at runtime, check out the [`@architect/functions` `services` documentation][services]. #### Arguments @@ -207,7 +207,7 @@ module.exports = { Note that when running locally, we provide some dummy set of credentials that the plugin could hard-code and check for when implementing the plugin [`sandbox.start`](#sandbox.start) method. Otherwise, when running in a pre-`deploy` context, we return CloudFormation JSON pointing to credentials the plugin could add to CloudFormation Resources when implementing the plugin [`package`](#package) method. -The variables are namespaced on the [`@architect/functions`' `services`][services] object under a property equalling the plugin name; check out the [`services`][services] documentation for more details. +The variables are namespaced on the [`@architect/functions`' `services()`][services] returned object under a property equalling the plugin name; check out the [`services`][services] documentation for more details. #### Example Service Discovery Usage With `@architect/functions` @@ -219,8 +219,8 @@ let form = require('./form') // helper that creates a form element we can render let aws = require('aws-sdk') exports.handler = arc.http.async(async function getIndex (req) { - if (!arc.services) await arc._loadServices() // service discovery is done on-demand, so always check that the `services` map is populated! - const { bucketName, accessKey, secretKey } = arc.services.imagebucket // assuming the plugin name is called 'imagebucket' + const services = await arc.services() + const { bucketName, accessKey, secretKey } = services.imagebucket // plugin variables are namespaced under the plugin name; here we assume the plugin name is called 'imagebucket' const region = process.env.AWS_REGION const upload = form({ bucketName, accessKey, secretKey, region }) const s3 = new aws.S3 diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index ecf24858..8ca7e0c4 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -32,8 +32,7 @@ let arc = require('@architect/functions') - [`arc.events`](#arc.events) Publish/subscribe helpers for SNS `@events` functions - [`arc.queues`](#arc.queues) Publish/subscribe helpers for SQS `@queues` functions - [`arc.ws`](#arc.ws) WebSocket helpers for `@ws` functions -- [`arc.services`](#arc.services) Architect service map, exposing all services making up the application -- [`arc._loadServices`](#arc._loadServices) Architect service map hydration method +- [`arc.services`](#arc.services) Retrieves the Architect service map, exposing metadata for all services making up the application ### `arc.static` @@ -252,11 +251,16 @@ await arc.ws.send({ ### `arc.services` -An object representing the service map of infrastructure and services making up the Architect application. This object is lazily-loaded and thus initially will be falsy. To force a hydration of this object, you can use the [`arc._loadServices`](#arc._loadServices) method, described below. +A function that retrieves the service map: an object mapping plugin or out-of-the-box Architect infrastructure data making up the Architect application. This object is lazily-loaded and cached and thus the first call may incur a delay as the service map is populated (use of [`arc.events`](#arc.events), [`arc.queues`](#arc.queues) and [`arc.tables`](#arc.tables) transparently uses this method in the background). -`arc.services`, when hydrated, would resemble something like the following (depending on the makeup of the Architect application): +`arc.services` returns a service map object, with keys equaling any out-of-the-box Architect infrastructure types or plugins used by the Architect application. An example service map for an application composed of `@static`, `@events` and an `imagebucket` plugin would have the following structure: ```javascript +let arc = require('@architect/functions') + +let services = await arc.services() +console.log(services) +/* logs out: { imagebucket: { // a plugin named 'imagebucket' exposing some service discovery variables accessKey: 'someAccessKey', @@ -266,41 +270,10 @@ An object representing the service map of infrastructure and services making up static: { // built-in @static service discovery variables bucket: 'arcplugins3imagebucketexamplestaging-staticbucket-g8rsuk82ancj', fingerprint: 'false' + }, + events: { // built-in @events service discovery variables + myevent: 'https://some-sns-url.amazon.us-east-2.com' } } -``` - -### `arc._loadServices` - -Method for hydrating the [`arc.services`](#arc.services) service map. This method is lazily invoked by `@architect/functions` for built-in infrastructure support like `@tables`, `@events` and `@queues`. For use with third party Architect plugins, this method should be invoked manually from within your Lambda functions: - -```javascript -let arc = require('@architect/functions') -let form = require('./form') // helper that creates a form element we can render for users to upload their assets to an S3 bucket -let aws = require('aws-sdk') - -exports.handler = arc.http.async(async function getIndex (req) { - if (!arc.services) await arc._loadServices() // service discovery is done on-demand, so always check that the `services` map is populated! - const { bucketName, accessKey, secretKey } = arc.services.imagebucket // assuming our app uses a plugin named 'imagebucket' - const region = process.env.AWS_REGION - const upload = form({ bucketName, accessKey, secretKey, region }) - const s3 = new aws.S3 - const images = await s3.listObjects({ Bucket: bucketName, Prefix: 'thumb/' }).promise() - const imgTags = images.Contents.map(i => i.Key.replace('thumb/', '/img/')).map(i => ``).join('\n') - return { - headers: { - 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', - 'content-type': 'text/html; charset=utf8' - }, - body: ` - - -

Hi! Upload something directly from the browser to the S3 bucket:

- ${upload} -

And here are all the previously uploaded images:

- ${imgTags} - -` - } -}) +*/ ``` From 2dcc7f345a5f9962f7c8bf9f9ec9d4510a16179a Mon Sep 17 00:00:00 2001 From: filmaj Date: Mon, 19 Apr 2021 23:39:42 -0400 Subject: [PATCH 067/680] cleaning up plugins docs a bit, linking up a bit more, expanding on what sandbox services get passed into sandbox.start --- src/views/docs/en/guides/extend/plugins.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index e96d90dc..80de2424 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -3,11 +3,11 @@ title: Plugins (beta) description: How to extend Architect using lifecycle hooks --- -> ⚠️ NOTE: Plugin support was added in version 8.5.0, is currently in beta and the interface is subject to change +> ⚠️ NOTE: Plugin support was added in version 8.5.0, is currently in beta, the interface is subject to change and only supports node.js Using [`@macros`][macros] allows you to augment the Architect-generated CloudFormation before deployment. However, augmenting CloudFormation may not be sufficient for certain extensions. For example, if you want to extend Architect with: -- Your own custom Lambda integrations (e.g. Kinesis Stream or Lex conversation bot) and want Architect to create, hydrate and be able to retrieve the logs for these functions +- Your own custom Lambda integrations (e.g. Kinesis Stream or Lex conversation bot) and want Architect to [`create`][create], [`hydrate`][hydrate] and be able to retrieve the [`logs`][logs] for these functions - A better local development experience for your extension by hooking into the Architect [`sandbox`][sandbox] Architect `@plugins` solves these use cases by providing a variety of [interfaces](#interface) that plugin authors may implement to hook into various Architect capabilities. @@ -127,7 +127,7 @@ let path = require('path') module.exports = { pluginFunctions: function ({ arc, inventory }) { - if (!arc.rules) return [] // if plugin author didnt define @rules lambdas, return empty array signifying no new lambdas to add + if (!arc.rules) return [] // if plugin consumer didnt define @rules lambdas, return empty array signifying no new lambdas to add const cwd = inventory.inv._project.src return arc.rules.map((rule) => { let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) @@ -160,12 +160,12 @@ rule-two > `variables({ arc, cloudformation, stage, inventory })` -The plugin author should implement this method if the plugin would like to provide any manner of data to Lambda functions at runtime. For context, Architect provides a suite of runtime helpers in the form of its [`@architect/functions`][functions] library. This library leverages functionality provided by [`deploy`][deploy] and [`sandbox`][sandbox] to expose runtime variables enabling [service discovery][discovery] - the automatic configuration, search and discovery of infrastructure and services making up your application. The `variables` plugin method enables plugin authors to hook into the Architect service discovery mechanism. +The plugin author should implement this method if the plugin would like to provide any manner of data to Lambda functions at runtime. Architect provides a suite of runtime helpers via the [`@architect/functions`][functions] library. This library leverages functionality provided by [`deploy`][deploy] and [`sandbox`][sandbox] to expose runtime variables enabling [service discovery][discovery] - the automatic configuration, search and discovery of infrastructure and services making up your application. The `variables` plugin method enables plugin authors to hook into the Architect service discovery mechanism. This method is used by Architect in two situations: 1. When running in a local development context via [`sandbox`][sandbox], `sandbox` will invoke the `variables` method in order to compile all runtime variables required by Architect application plugins and provide them to [`@architect/functions`][functions]. -2. When running in a remotely-deployed context on AWS, [`deploy`][deploy] will invoke the `variables` method in order to compile an [AWS SSM Parameter][ssm] per variable exported by the method before each deploy. Then, post-`deploy` at runtime, [`@architect/functions`][functions] will query the [AWS SSM Parameter Store][ssm] to retrieve these variables at runtime. +2. When running in a remotely-deployed context on AWS, [`deploy`][deploy] will invoke the `variables` method in order to compile an [AWS SSM Parameter][ssm] per variable exported by the method before each deploy. Later, at runtime, [`@architect/functions`][functions] will query the [AWS SSM Parameter Store][ssm] to retrieve these variables at runtime. Therefore the `variables` plugin method is only necessary to implement if you would like your plugin to provide runtime data within Lambdas via the [`@architect/functions`][functions] library. The exported variables would be available via the [`services` function][services] provided by [`@architect/functions`][functions] (namespaced under the plugin name). For more information on how to query the service discovery mechanism using [`@architect/functions`][functions] at runtime, check out the [`@architect/functions` `services` documentation][services]. @@ -205,7 +205,7 @@ module.exports = { } ``` -Note that when running locally, we provide some dummy set of credentials that the plugin could hard-code and check for when implementing the plugin [`sandbox.start`](#sandbox.start) method. Otherwise, when running in a pre-`deploy` context, we return CloudFormation JSON pointing to credentials the plugin could add to CloudFormation Resources when implementing the plugin [`package`](#package) method. +Note that when running locally in [`sandbox`][sandbox], we provide some dummy set of credentials that the plugin could hard-code and check for when implementing the plugin [`sandbox.start`](#sandbox.start) method. Otherwise, when running in a pre-`deploy` context, we return CloudFormation JSON pointing to credentials the plugin could add to CloudFormation Resources when implementing the plugin [`package`](#package) method. The variables are namespaced on the [`@architect/functions`' `services()`][services] returned object under a property equalling the plugin name; check out the [`services`][services] documentation for more details. @@ -225,7 +225,7 @@ exports.handler = arc.http.async(async function getIndex (req) { const upload = form({ bucketName, accessKey, secretKey, region }) const s3 = new aws.S3 const images = await s3.listObjects({ Bucket: bucketName, Prefix: 'thumb/' }).promise() - const imgTags = images.Contents.map(i => i.Key.replace('thumb/', '/img/')).map(i => ``).join('\n') + const imgTags = images.Contents.map(i => i.Key).map(i => ``).join('\n') return { headers: { 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', @@ -262,7 +262,7 @@ All arguments arrive as a bag of options with the following properties: |---|---| |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| -|`services`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| +|`services`|An object containing `http`, `events` and `tables` properties that represent local servers that [`sandbox`][sandbox] manages to provide a local development experience. A plugin author may want to modify the behaviour of these pre-existing services in order for their plugin to provide a better local development experience. `http` is an instance of the npm package [`router`][router] and mocks API Gateway and Lambda. `events` is a node.js HTTP server that mocks SNS and SQS by listening for JSON payloads and marshaling them to the relevant Lambda functions (see its [listener module](https://github.com/architect/sandbox/blob/master/src/events/_listener.js) for more details). `tables` is an instance of the npm package [`dynalite`][dynalite] and mocks DynamoDB.| |`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service is ready| #### Example `start` Implementation @@ -441,3 +441,5 @@ The above plugin's `sandbox.start` method listens for the "I" keyboard keypress, [cfn-ref]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html [discovery]: https://en.wikipedia.org/wiki/Service_discovery [ssm]: https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html +[router]: https://www.npmjs.com/package/router +[dynalite]: https://www.npmjs.com/package/dynalite From e52103c9ed232fbf18b6f9e903b3bcd955ee920e Mon Sep 17 00:00:00 2001 From: filmaj Date: Fri, 23 Apr 2021 18:01:20 -0400 Subject: [PATCH 068/680] updated plugin interface method names with new incoming names; added some more motivation and explanation around why and when to use the helper methods. updated docs to use the new helper methods as injected arguments into plugin interface methods --- src/views/docs/en/guides/extend/plugins.md | 119 +++++++++++---------- 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index 80de2424..76bb5456 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -19,13 +19,13 @@ Architect `@plugins` solves these use cases by providing a variety of [interface 1. [Installation](#installation) 2. [Interface](#interface) 1. [`package`](#package) - 2. [`pluginFunctions`](#pluginfunctions) + 2. [`functions`](#functions) 3. [`variables`](#variables) 4. [`sandbox.start`](#sandbox.start) 5. [`sandbox.end`](#sandbox.end) 3. [Helper Methods for Plugin Authors](#helper-methods-for-plugin-authors) - 1. [`createLambdaJSON`](#createlambdajson) - 2. [`invokeLambda`](#invokelambda) + 1. [`createFunction`](#createfunction) + 2. [`invokeFunction`](#invokefunction) 4. [Example Plugins](#example-plugins) ## Installation @@ -40,7 +40,7 @@ myapp myplugin ``` -> In the example above running any `arc` commands will look for `./src/plugins/myplugin` and then `./node_modules/myplugin` +In the example above running any `arc` commands will look for `./src/plugins/myplugin`, `./src/plugins/myplugin.js`, `./node_modules/myplugin` and finally `./node_modules/@myplugin`. The `myplugin` entry in this example is assumed to be the _plugin name_. ## Interface @@ -52,25 +52,26 @@ Plugin authors should create a module that exports an object with properties of */ module.exports = { - package: async function extendCloudFormation ({ arc, cloudformation, stage='staging', inventory }) {}, - pluginFunctions: function ({ arc, inventory }) {}, + package: async function extendCloudFormation ({ arc, cloudformation, stage='staging', inventory, createFunction }) {}, + functions: function ({ arc, inventory }) {}, // also aliased to `pluginFunctions` variables: function ({ arc, stage, inventory }) {}, sandbox: { - start: async function ({ arc, inventory, services }) {}, + start: async function ({ arc, inventory, invokeFunction, services }) {}, end: async function ({ arc, inventory, services }) {} } } ``` -A deep dive into the [`package`](#package), [`pluginFunctions`](#pluginFunctions), [`variables`](#variables), [`sandbox.start`](#sandbox.start) and [`sandbox.end`](#sandbox.end) methods follows. +A deep dive into the [`package`](#package), [`functions`](#functions), [`variables`](#variables), [`sandbox.start`](#sandbox.start) and [`sandbox.end`](#sandbox.end) methods follows. ### `package` -> `package({ arc, cloudformation, stage, inventory })` +> `package({ arc, cloudformation, stage, inventory, createFunction })` -This method encapsulates [Architect's existing @macro functionality][macros]: extending Architect's generated CloudFormation `sam.json` with your own custom extensions. +This method encapsulates [Architect's existing @macro functionality][macros]: extending Architect's generated CloudFormation `sam.json` with your own custom extensions. The additional capability provided by `@plugins` over `@macros` is that `@plugins` provide a convenient way for your extension to define its own ephemeral cloud functions (AWS Lambdas). Plugin authors wanting to manage cloud functions in their plugins would: -**As a plugin author, if you intend for your plugin to create custom Lambdas**, you would be expected to leverage the plugin author helper method [`createLambdaJSON` described below](#createLambdaJSON) to painlessly create CloudFormation-compatible JSON representing your new cloud functions. You must also implement the [`pluginFunctions`](#pluginFunctions) plugin interface method to inform Architect of new Lambdas you are creating. +1. Leverage the convenience method [`createFunction`](#createfunction), which is injected as a parameter into `package`, to create CloudFormation JSON defining the AWS Lambda resources you want to manage within your plugin, and +2. Implement the [`functions`](#functions) plugin interface method to inform Architect of new Lambdas you are creating. #### Arguments @@ -82,20 +83,22 @@ All arguments arrive as a bag of options with the following properties: |`cloudformation`|The [CloudFormation JSON template][cfn-ref] making up the Architect project| |`stage`|The name of the environment; usually one of `staging` or `production`| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| +|`createFunction`|A helper method for creating CloudFormation Resource JSON defining any cloud functions (AWS Lambdas) your plugin manages. Please see the [`createFunction`](#createfunction) section for details on this method.| #### Returns You _must_ return the `cloudformation` argument after modifying it with your own extensions. -### `pluginFunctions` +### `functions` +> `functions({ arc, inventory })` > `pluginFunctions({ arc, inventory })` -The plugin author must implement this method if the plugin defines new Lambda functions. This method is used by Architect to allow your custom plugin Lambdas to hook into Architect's capabilities and lifecycle, such as: +The plugin author must implement this method if the plugin defines new Lambda functions. This method is used by Architect to allow your custom plugin Lambdas to hook into Architect's capabilities and lifecycle in a variety of ways: - instructing [`arc create`][create] to create new files and directories in the project for your custom plugin Lambdas -- instructing [`arc hydrate`][hydrate] to hydrate dependencies in the project for your custom plugin Lambdas -- providing hints to [`arc logs`][logs] as to where to find CloudWatch execution logs for your custom plugin Lambdas +- instructing [`arc hydrate`][hydrate] to hydrate dependencies of your custom plugin Lambdas +- instructing [`arc logs`][logs] as to where CloudWatch execution logs for your custom plugin Lambdas are located #### Arguments @@ -108,7 +111,7 @@ All arguments arrive as a bag of options with the following properties: #### Returns -You should return an array of objects, each object representing a new Lambda being defined by the plugin. Each object should have the following format: +`functions` should return an array of objects, each object representing a new Lambda being defined by the plugin. Each object should have the following format: ```javascript { @@ -117,20 +120,22 @@ You should return an array of objects, each object representing a new Lambda bei } ``` -- `src`: a string containing a fully qualified absolute path to the source code location for the Lambda function. Relative to the arc project root, this property _must_ point to a location under the project's `src/` directory. +- `src`: a string containing the fully qualified absolute path to the source code location for the Lambda function. This path _must_ point to a location under the project's `src/` directory. See the example section below on how to assemble such a path using the base project source directory available via the `inventory` parameter. - `body`: a string containing template code for the Lambda function handler -#### Example `pluginFunctions` Implementation +#### Example `functions` Implementation + +The following example implementation is for a plugin that allows consumers to define `@rules` Lambdas in their `app.arc` manifest: ```javascript let path = require('path') module.exports = { - pluginFunctions: function ({ arc, inventory }) { - if (!arc.rules) return [] // if plugin consumer didnt define @rules lambdas, return empty array signifying no new lambdas to add - const cwd = inventory.inv._project.src - return arc.rules.map((rule) => { - let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) + functions: function ({ arc, inventory }) { + if (!arc.rules) return [] // if plugin consumer didnt define any @rules, return empty array signifying no new lambdas to add + const cwd = inventory.inv._project.src // base project source directory + return arc.rules.map((rule) => { // for each @rules + let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) // each @rules Lambda will exist under src/rules/ return { src: rulesSrc, body: `exports.handler = async function (event) { @@ -142,7 +147,7 @@ module.exports = { } ``` -The above would instruct Architect to look for functions under `src/rules/` inside the project directory hierarchy. With the above `pluginFunctions` method and given `app.arc` contents like so: +The above instructs Architect's various capabilities to interact with cloud functions under the `src/rules/` directory inside the project hierarchy. With the above `functions` method and given `app.arc` contents like so: ``` @rules @@ -152,7 +157,7 @@ rule-two ... running: -- [`arc create`][create] would create the folders `src/rules/rule-one` and `src/rules/rule-two`, with `index.js` files in each containing the contents of the `body` returned by `pluginFunctions` +- [`arc create`][create] would create the folders `src/rules/rule-one` and `src/rules/rule-two`, with `index.js` files in each containing the contents of the `body` returned by `functions` - [`arc hydrate`][hydrate] would hydrate the above two folders - [`arc logs src/rules/rule-one`][logs] would pull in any deployed-to-staging execution logs for the `rule-one` function @@ -160,14 +165,16 @@ rule-two > `variables({ arc, cloudformation, stage, inventory })` -The plugin author should implement this method if the plugin would like to provide any manner of data to Lambda functions at runtime. Architect provides a suite of runtime helpers via the [`@architect/functions`][functions] library. This library leverages functionality provided by [`deploy`][deploy] and [`sandbox`][sandbox] to expose runtime variables enabling [service discovery][discovery] - the automatic configuration, search and discovery of infrastructure and services making up your application. The `variables` plugin method enables plugin authors to hook into the Architect service discovery mechanism. +The plugin author should implement this method if the plugin would like to provide any manner of data to Lambda functions at runtime. For example, perhaps you would like to expose the physical ID of some AWS resource (i.e. ARN) to your runtime code so that you can interact withit using the AWS SDK. + +Architect provides a suite of runtime helpers via the [`@architect/functions`][functions] library. This library leverages functionality provided by [`deploy`][deploy] and [`sandbox`][sandbox] to expose runtime variables enabling [service discovery][discovery] - the automatic configuration, search and discovery of infrastructure and services making up your application. The `variables` plugin method enables plugin authors to hook into the Architect service discovery mechanism. This method is used by Architect in two situations: 1. When running in a local development context via [`sandbox`][sandbox], `sandbox` will invoke the `variables` method in order to compile all runtime variables required by Architect application plugins and provide them to [`@architect/functions`][functions]. -2. When running in a remotely-deployed context on AWS, [`deploy`][deploy] will invoke the `variables` method in order to compile an [AWS SSM Parameter][ssm] per variable exported by the method before each deploy. Later, at runtime, [`@architect/functions`][functions] will query the [AWS SSM Parameter Store][ssm] to retrieve these variables at runtime. +2. When running [`arc deploy`][deploy], it will invoke the `variables` method in order to compile an [AWS SSM Parameter][ssm] per variable exported by the method. Later, when running in a remotely-deployed runtime context on AWS Lambda, [`@architect/functions`][functions] will query the [AWS SSM Parameter Store][ssm] to retrieve these variables at runtime. -Therefore the `variables` plugin method is only necessary to implement if you would like your plugin to provide runtime data within Lambdas via the [`@architect/functions`][functions] library. The exported variables would be available via the [`services` function][services] provided by [`@architect/functions`][functions] (namespaced under the plugin name). For more information on how to query the service discovery mechanism using [`@architect/functions`][functions] at runtime, check out the [`@architect/functions` `services` documentation][services]. +The `variables` plugin method is only necessary to implement if you would like your plugin to provide runtime data within Lambdas via the [`@architect/functions`][functions] library. The exported variables would be available via the [`services` function][services] provided by [`@architect/functions`][functions] (namespaced under the plugin name). For more information on how to query the service discovery mechanism using [`@architect/functions`][functions] at runtime, check out the [`@architect/functions` `services` documentation][services]. #### Arguments @@ -188,7 +195,7 @@ This method should always return an object. Each property on the object represen #### Example `variables` Implementation -For example, a `variables` return value for a plugin creating a new S3 Bucket may export variables related to the location of and credentials for the bucket: +The following example `variables` implementation demonstrates a plugin that creates a new S3 Bucket. It may be desirable to provide variables related to the location of and credentials for the bucket: ```javascript module.exports = { @@ -205,7 +212,7 @@ module.exports = { } ``` -Note that when running locally in [`sandbox`][sandbox], we provide some dummy set of credentials that the plugin could hard-code and check for when implementing the plugin [`sandbox.start`](#sandbox.start) method. Otherwise, when running in a pre-`deploy` context, we return CloudFormation JSON pointing to credentials the plugin could add to CloudFormation Resources when implementing the plugin [`package`](#package) method. +Note that when running locally in [`sandbox`][sandbox], we provide some dummy set of credentials that the plugin hard-codes (and could check for when implementing the plugin [`sandbox.start`](#sandbox.start) method). Otherwise, when running in a pre-`deploy` context, we return CloudFormation JSON pointing to credentials the plugin added via the plugin's implemented [`package`](#package) method. The variables are namespaced on the [`@architect/functions`' `services()`][services] returned object under a property equalling the plugin name; check out the [`services`][services] documentation for more details. @@ -220,7 +227,7 @@ let aws = require('aws-sdk') exports.handler = arc.http.async(async function getIndex (req) { const services = await arc.services() - const { bucketName, accessKey, secretKey } = services.imagebucket // plugin variables are namespaced under the plugin name; here we assume the plugin name is called 'imagebucket' + const { bucketName, accessKey, secretKey } = services.imagebucket // plugin variables are namespaced under the plugin name; here we assume the plugin name is called 'imagebucket' and is present in the app's app.arc file as 'imagebucket' under the @plugins section const region = process.env.AWS_REGION const upload = form({ bucketName, accessKey, secretKey, region }) const s3 = new aws.S3 @@ -246,14 +253,12 @@ exports.handler = arc.http.async(async function getIndex (req) { ### `sandbox.start` -> `start({ arc, inventory, services }, callback)` +> `start({ arc, inventory, invokeFunction, services }, callback)` -The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It would also allow to modify behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `services` argument. +The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It also allows to modify behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `services` argument. Finally, a helper method [`invokeFunction` (described in more detail below)](#invokefunction) is provided as an argument in order to allow plugin authors to invoke specific Lambdas from their plugin sandbox service code. This method can either be `async` or not; if the plugin author implements it as `async`, then the final `callback` argument may be ignored. Otherwise, the `callback` argument should be invoked once the plugin's sandbox service is ready. -A helper method [`invokeLambda` (described below)](#invokeLambda) is provided by the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) package in order to allow plugin authors to invoke specific Lambdas from their plugin sandbox service code. - #### Arguments All arguments arrive as a bag of options with the following properties: @@ -262,12 +267,13 @@ All arguments arrive as a bag of options with the following properties: |---|---| |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| +|`invokeFunction`|A helper method that can be used for invoking any cloud functions (AWS Lambdas) your plugin manages during runtime in a local development context inside [`sandbox`][sandbox]. Please see the [`invokeFunction`](#invokefunction) section for details on this method.| |`services`|An object containing `http`, `events` and `tables` properties that represent local servers that [`sandbox`][sandbox] manages to provide a local development experience. A plugin author may want to modify the behaviour of these pre-existing services in order for their plugin to provide a better local development experience. `http` is an instance of the npm package [`router`][router] and mocks API Gateway and Lambda. `events` is a node.js HTTP server that mocks SNS and SQS by listening for JSON payloads and marshaling them to the relevant Lambda functions (see its [listener module](https://github.com/architect/sandbox/blob/master/src/events/_listener.js) for more details). `tables` is an instance of the npm package [`dynalite`][dynalite] and mocks DynamoDB.| |`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service is ready| #### Example `start` Implementation -An example is [provided below that leverages the `invokeLambda` helper method](#invokeLambda). +An example is [provided below that leverages the `invokeFunction` helper method](#invokefunction). ### `sandbox.end` @@ -291,15 +297,13 @@ All arguments arrive as a bag of options with the following properties: ## Helper Methods for Plugin Authors -For common Architect Plugin use cases, Architect provides a few helper functions available in core Architect packages to make life easier for plugin authors. - -### `createLambdaJSON` +For common Architect Plugin use cases, Architect provides a few helper functions available as parameters injected as arguments into plugin methods to make life easier for plugin authors. -> `createLambdaJSON({ inventory, src })` +### `createFunction` -Available in the [`@architect/package`](https://npmjs.com/package/@architect/package) module (in version 6.2.0 and later), this method can be leveraged inside a plugin's [`package`](#package) method in order to easily and consistently define CloudFormation JSON representing Lambdas created by the plugin. +> `createFunction({ inventory, src })` -Leveraging this helper method gives the plugin function support for [arc's per-function runtime configuration via the `config.arc` file](https://arc.codes/docs/en/reference/config.arc/aws) transparently. +This method should be leveraged inside a plugin's [`package`](#package) method in order to more easily define CloudFormation JSON representing Lambdas created by the plugin. Use of this method for defining Lambdas is an Architect best practice as certain specific conventions that Architect relies on can be maintained. While the AWS Lambda logical ID is generally not a concern for developers using Architect, Architect relies on a logical ID naming convention to e.g. retrieve execution logs of a deployed Lambda via [`arc logs`][logs]. This helper method helps enforce such conventions. Leveraging this helper method also gives the plugin function transparent support for [arc's per-function runtime configuration via the `config.arc` file](https://arc.codes/docs/en/reference/config.arc/aws); as the plugin author you do not need to worry about parsing each individual `config.arc` file and retrieving and setting its configuration options (such as assigned RAM, concurrency maximums, and timeout limits). #### Arguments @@ -308,7 +312,7 @@ All arguments arrive as a bag of options with the following properties: |Argument|Description| |---|---| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| -|`src`|A string representing the path where code for the Lambda exists locally| +|`src`|A string representing the fully qualified absolute path to where code for the Lambda exists locally| #### Returns @@ -317,19 +321,18 @@ A tuple (array of two objects) containing: 1. A string representing an AWS-friendly Lambda resource name (which is based on the path to the function code), and 2. A JSON object that can be assigned to a CloudFormation `sam.json`'s `Resources` section. This would define a Lambda that Architect would create during a [`deploy`][deploy] -#### Example Usage of `createLambdaJSON` +#### Example Usage of `createFunction` ```javascript -let createLambdaJSON = require('@architect/package/createLambdaJSON') let path = require('path') module.exports = { - package: async function IoTRulesLambdas ({ arc, cloudformation, stage = 'staging', inventory }) { + package: async function IoTRulesLambdas ({ arc, cloudformation, createFunction, stage = 'staging', inventory }) { if (arc.rules) { const cwd = inventory.inv._project.src arc.rules.forEach(rule => { let code = path.join(cwd, 'src', 'rules', rule[0]) - let [functionName, functionDefn] = createLambdaJSON({ inventory, src: code }) + let [functionName, functionDefn] = createFunction({ inventory, src: code }) cloudformation.Resources[functionName] = functionDefn }) } @@ -338,11 +341,11 @@ module.exports = { } ``` -### `invokeLambda` +### `invokeFunction` -> `invokeLambda({ inventory, src, payload }, callback)` +> `invokeFunction({ src, payload }, callback)` -Available in the [`@architect/sandbox`](https://npmjs.com/package/@architect/sandbox) module (in version 3.4.0 and later), this method can be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`arc sandbox`][sandbox] local development runtime context. +This method should be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`arc sandbox`][sandbox] local development runtime context. For example, if your plugin manages Lambdas related to some AWS service, it may be nice to provide a local development experience for consumers of your plugin. To provide a great local experience, consumers of your plugin will want to exercise your plugin-generated Lambdas when running locally. Using the combination of the [`sandbox.start`](#sandbox.start) and `invokeFunction` methods, plugin authors can implement a local development experience for plugin consumers. #### Arguments @@ -350,20 +353,20 @@ All arguments arrive as a bag of options with the following properties: |Argument|Description| |---|---| -|`inventory`|An [Architect inventory object][inv] representing the current Architect project| -|`src`|A string representing the path where code for the Lambda exists locally| +|`src`|A string representing the fully qualified absolute path to where code for the Lambda exists locally| |`payload`|JSON payload to deliver to the function| |`callback`|Function with signature `function(error, result)` that is invoked with either the error or the result from the local function invocation| #### Example Usage of `invokeLambda` +The below plugin's `sandbox.start` method listens for the "I" keyboard keypress, prompts the user which of the plugin's Lambdas the user wants to invoke and what payload to deliver to the user, before using `invokeFunction` to invoke the Lambda code with the specified payload. + ```javascript -let invokeLambda = require('@architect/sandbox/invokeLambda') let path = require('path') let prompt = require('prompt') module.exports = { - pluginFunctions: async function ({ arc, inventory }) { + functions: async function ({ arc, inventory }) { if (!arc.rules) return [] const cwd = inventory.inv._project.src return arc.rules.map((rule) => { @@ -377,8 +380,8 @@ module.exports = { }) }, sandbox: { - start: function IoTRulesServiceStart ({ arc, inventory, services }, callback) { - let rules = module.exports.pluginFunctions({ arc, inventory }).map(rule => rule.src) + start: function IoTRulesServiceStart ({ arc, inventory, invokeFunction, services }, callback) { + let rules = module.exports.functions({ arc, inventory }).map(rule => rule.src) process.stdin.on('keypress', async function IoTRulesKeyListener (input, key) { if (input === 'I') { const response = await prompt([ { @@ -404,7 +407,7 @@ module.exports = { return JSON.parse(i) } } ]) - invokeLambda({ inventory, src: response.rule, payload: response.payload }, function (err, result) { + invokeFunction({ src: response.rule, payload: response.payload }, function (err, result) { if (err) console.error(`Error invoking lambda ${response.rule}!`, err) else console.log(`${response.rule} invocation result:`, result) }) @@ -417,8 +420,6 @@ module.exports = { } ``` -The above plugin's `sandbox.start` method listens for the "I" keyboard keypress, prompts the user asking which of the plugin's Lambdas the user wants to invoke and what payload to deliver to the user, before using `invokeLambda` to invoke the Lambda code with the specified payload. - ## Example Plugins - [plugin-iot-rules](https://www.npmjs.com/package/@copper/plugin-iot-rules): adds AWS IoT Topic event Lambdas From f666d9f01577359235ba317edb8cb50760777760 Mon Sep 17 00:00:00 2001 From: filmaj Date: Wed, 5 May 2021 15:11:40 -0400 Subject: [PATCH 069/680] addressing feedback --- src/views/docs/en/guides/extend/plugins.md | 64 +++++++++++----------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index 76bb5456..217e9c84 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -3,7 +3,7 @@ title: Plugins (beta) description: How to extend Architect using lifecycle hooks --- -> ⚠️ NOTE: Plugin support was added in version 8.5.0, is currently in beta, the interface is subject to change and only supports node.js +> ⚠️ NOTE: Plugin support was added in version 8.5.0, is currently in beta, the interface is subject to change and only supports Node.js Using [`@macros`][macros] allows you to augment the Architect-generated CloudFormation before deployment. However, augmenting CloudFormation may not be sufficient for certain extensions. For example, if you want to extend Architect with: @@ -52,12 +52,12 @@ Plugin authors should create a module that exports an object with properties of */ module.exports = { - package: async function extendCloudFormation ({ arc, cloudformation, stage='staging', inventory, createFunction }) {}, + package: function ({ arc, cloudformation, stage='staging', inventory, createFunction }) {}, functions: function ({ arc, inventory }) {}, // also aliased to `pluginFunctions` variables: function ({ arc, stage, inventory }) {}, sandbox: { - start: async function ({ arc, inventory, invokeFunction, services }) {}, - end: async function ({ arc, inventory, services }) {} + start: function ({ arc, inventory, invokeFunction, services }) {}, + end: function ({ arc, inventory, services }) {} } } ``` @@ -73,6 +73,8 @@ This method encapsulates [Architect's existing @macro functionality][macros]: ex 1. Leverage the convenience method [`createFunction`](#createfunction), which is injected as a parameter into `package`, to create CloudFormation JSON defining the AWS Lambda resources you want to manage within your plugin, and 2. Implement the [`functions`](#functions) plugin interface method to inform Architect of new Lambdas you are creating. +This method can be implemented as an `async` function or not. + #### Arguments All arguments arrive as a bag of options with the following properties: @@ -123,7 +125,7 @@ All arguments arrive as a bag of options with the following properties: - `src`: a string containing the fully qualified absolute path to the source code location for the Lambda function. This path _must_ point to a location under the project's `src/` directory. See the example section below on how to assemble such a path using the base project source directory available via the `inventory` parameter. - `body`: a string containing template code for the Lambda function handler -#### Example `functions` Implementation +#### Example `functions` implementation The following example implementation is for a plugin that allows consumers to define `@rules` Lambdas in their `app.arc` manifest: @@ -135,9 +137,9 @@ module.exports = { if (!arc.rules) return [] // if plugin consumer didnt define any @rules, return empty array signifying no new lambdas to add const cwd = inventory.inv._project.src // base project source directory return arc.rules.map((rule) => { // for each @rules - let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) // each @rules Lambda will exist under src/rules/ + let src = path.join(cwd, 'src', 'rules', rule[0]) // each @rules Lambda will exist under src/rules/ return { - src: rulesSrc, + src, body: `exports.handler = async function (event) { console.log(event); };` @@ -165,15 +167,10 @@ rule-two > `variables({ arc, cloudformation, stage, inventory })` -The plugin author should implement this method if the plugin would like to provide any manner of data to Lambda functions at runtime. For example, perhaps you would like to expose the physical ID of some AWS resource (i.e. ARN) to your runtime code so that you can interact withit using the AWS SDK. +The plugin author should implement this method if the plugin would like to provide any manner of data to Lambda functions at runtime. For example, perhaps you would like to expose the physical ID of some AWS resource (i.e. ARN) to your runtime code so that you can interact with it using the AWS SDK. Architect provides a suite of runtime helpers via the [`@architect/functions`][functions] library. This library leverages functionality provided by [`deploy`][deploy] and [`sandbox`][sandbox] to expose runtime variables enabling [service discovery][discovery] - the automatic configuration, search and discovery of infrastructure and services making up your application. The `variables` plugin method enables plugin authors to hook into the Architect service discovery mechanism. -This method is used by Architect in two situations: - -1. When running in a local development context via [`sandbox`][sandbox], `sandbox` will invoke the `variables` method in order to compile all runtime variables required by Architect application plugins and provide them to [`@architect/functions`][functions]. -2. When running [`arc deploy`][deploy], it will invoke the `variables` method in order to compile an [AWS SSM Parameter][ssm] per variable exported by the method. Later, when running in a remotely-deployed runtime context on AWS Lambda, [`@architect/functions`][functions] will query the [AWS SSM Parameter Store][ssm] to retrieve these variables at runtime. - The `variables` plugin method is only necessary to implement if you would like your plugin to provide runtime data within Lambdas via the [`@architect/functions`][functions] library. The exported variables would be available via the [`services` function][services] provided by [`@architect/functions`][functions] (namespaced under the plugin name). For more information on how to query the service discovery mechanism using [`@architect/functions`][functions] at runtime, check out the [`@architect/functions` `services` documentation][services]. #### Arguments @@ -191,9 +188,9 @@ All arguments arrive as a bag of options with the following properties: This method should always return an object. Each property on the object represents a variable name, and the value for each property contains the variable value. -> 🏌️‍♀️ Protip: When this method is invoked in a pre-`deploy` context, acceptable values for the variables include CloudFormation JSON. This is essential to expose CloudFormation-managed infrastructure. +> 🏌️‍♀️ Protip: When this method is invoked in a pre-`deploy` context, acceptable values for the variables include CloudFormation JSON. This is essential to expose CloudFormation-managed infrastructure; see the example below. -#### Example `variables` Implementation +#### Example `variables` implementation The following example `variables` implementation demonstrates a plugin that creates a new S3 Bucket. It may be desirable to provide variables related to the location of and credentials for the bucket: @@ -201,7 +198,7 @@ The following example `variables` implementation demonstrates a plugin that crea module.exports = { variables: function ({ arc, cloudformation, stage, inventory }) { if (!arc['myS3Bucket']) return {} // if the user isn't using this plugin, return an empty object signifying no variables need exporting - const isLocal = stage === 'testing' // stage will equal 'testing' when running in sandbox, otherwise will be one of 'staging' or 'production' + const isLocal = stage === 'testing' // stage will equal 'testing' when running in sandbox, otherwise will be one of 'staging' or 'production' when running in a `deploy` context const bucketName = `${arc.app}-newS3Bucket` return { bucketName, @@ -212,13 +209,16 @@ module.exports = { } ``` -Note that when running locally in [`sandbox`][sandbox], we provide some dummy set of credentials that the plugin hard-codes (and could check for when implementing the plugin [`sandbox.start`](#sandbox.start) method). Otherwise, when running in a pre-`deploy` context, we return CloudFormation JSON pointing to credentials the plugin added via the plugin's implemented [`package`](#package) method. +The above example returns three variables that would be provided at runtime: `bucketName`, `accessKey` and `secretKey`. Depending on whether the plugin executes in a local development environment context via [`sandbox`][sandbox] or in a pre-`deploy` context via [`deploy`][deploy], the contents of these credentials would differ: + +- The `secretKey` and `accessKey` variables would contain hard-coded values when running locally in [`sandbox`][sandbox] (both would have a value of `S3RVER`). These hard-coded values could be used by the plugin author when implementing the [`sandbox.start`](#sandbox.start) method to provide a seamless local development experience. +- The `secretKey` and `accessKey` variables are CloudFormation JSON referencing a set of credentials called `MyS3BucketCreds` when running in a pre-`deploy` context. These dynamic values reference pre-existing CloudFormation Resources which would be implemented by the author in the plugin's [`package`](#package) method. The variables are namespaced on the [`@architect/functions`' `services()`][services] returned object under a property equalling the plugin name; check out the [`services`][services] documentation for more details. -#### Example Service Discovery Usage With `@architect/functions` +#### Example service discovery usage with `@architect/functions` -How would a plugin consumer use these variables at runtime in their own application? Let's take a look at the below example, which builds upon the S3 Bucket example from the above previous section. It demonstrates one possible [`@http`][http] GET route implementation rendering a form allowing a user to upload to the plugin-generated S3 Bucket: +How would a plugin consumer use these variables at runtime in their own application? Let's take a look at the below example, which builds upon the S3 Bucket example from the previous section. It demonstrates one possible [`@http`][http] GET route implementation rendering a form allowing a user to upload to the plugin-generated S3 Bucket: ```javascript let arc = require('@architect/functions') @@ -255,7 +255,7 @@ exports.handler = arc.http.async(async function getIndex (req) { > `start({ arc, inventory, invokeFunction, services }, callback)` -The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It also allows to modify behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `services` argument. Finally, a helper method [`invokeFunction` (described in more detail below)](#invokefunction) is provided as an argument in order to allow plugin authors to invoke specific Lambdas from their plugin sandbox service code. +The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It also allows modifying the behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `services` argument. Finally, a helper method [`invokeFunction` (described in more detail below)](#invokefunction) is provided as an argument in order to allow plugin authors to invoke specific Lambdas from their plugin sandbox service code. This method can either be `async` or not; if the plugin author implements it as `async`, then the final `callback` argument may be ignored. Otherwise, the `callback` argument should be invoked once the plugin's sandbox service is ready. @@ -268,10 +268,10 @@ All arguments arrive as a bag of options with the following properties: |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| |`invokeFunction`|A helper method that can be used for invoking any cloud functions (AWS Lambdas) your plugin manages during runtime in a local development context inside [`sandbox`][sandbox]. Please see the [`invokeFunction`](#invokefunction) section for details on this method.| -|`services`|An object containing `http`, `events` and `tables` properties that represent local servers that [`sandbox`][sandbox] manages to provide a local development experience. A plugin author may want to modify the behaviour of these pre-existing services in order for their plugin to provide a better local development experience. `http` is an instance of the npm package [`router`][router] and mocks API Gateway and Lambda. `events` is a node.js HTTP server that mocks SNS and SQS by listening for JSON payloads and marshaling them to the relevant Lambda functions (see its [listener module](https://github.com/architect/sandbox/blob/master/src/events/_listener.js) for more details). `tables` is an instance of the npm package [`dynalite`][dynalite] and mocks DynamoDB.| +|`services`|An object containing `http`, `events` and `tables` properties that represent local servers that [`sandbox`][sandbox] manages to provide a local development experience. A plugin author may want to modify the behaviour of these pre-existing services in order for their plugin to provide a better local development experience. `http` is an instance of the npm package [`router`][router] and mocks API Gateway and Lambda. `events` is a Node.js HTTP server that mocks SNS and SQS by listening for JSON payloads and marshaling them to the relevant Lambda functions (see its [listener module](https://github.com/architect/sandbox/blob/master/src/events/_listener.js) for more details). `tables` is an instance of the npm package [`dynalite`][dynalite] and mocks DynamoDB.| |`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service is ready| -#### Example `start` Implementation +#### Example `start` implementation An example is [provided below that leverages the `invokeFunction` helper method](#invokefunction). @@ -295,7 +295,7 @@ All arguments arrive as a bag of options with the following properties: |`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service has been shut down| -## Helper Methods for Plugin Authors +## Helper methods for plugin authors For common Architect Plugin use cases, Architect provides a few helper functions available as parameters injected as arguments into plugin methods to make life easier for plugin authors. @@ -303,7 +303,9 @@ For common Architect Plugin use cases, Architect provides a few helper functions > `createFunction({ inventory, src })` -This method should be leveraged inside a plugin's [`package`](#package) method in order to more easily define CloudFormation JSON representing Lambdas created by the plugin. Use of this method for defining Lambdas is an Architect best practice as certain specific conventions that Architect relies on can be maintained. While the AWS Lambda logical ID is generally not a concern for developers using Architect, Architect relies on a logical ID naming convention to e.g. retrieve execution logs of a deployed Lambda via [`arc logs`][logs]. This helper method helps enforce such conventions. Leveraging this helper method also gives the plugin function transparent support for [arc's per-function runtime configuration via the `config.arc` file](https://arc.codes/docs/en/reference/config.arc/aws); as the plugin author you do not need to worry about parsing each individual `config.arc` file and retrieving and setting its configuration options (such as assigned RAM, concurrency maximums, and timeout limits). +This method should be leveraged inside a plugin's [`package`](#package) method in order to more easily define CloudFormation JSON representing Lambdas created by the plugin. Use of this method for defining Lambdas is an Architect best practice as certain specific conventions that Architect relies on can be maintained. + +While the AWS Lambda logical ID is generally not a concern for developers using Architect, Architect relies on a logical ID naming convention to e.g. retrieve execution logs of a deployed Lambda via [`arc logs`][logs]. This helper method helps enforce such conventions. Leveraging this method also gives the plugin-generated Lambdas transparent support for [Architect's per-function runtime configuration via the `config.arc` file](https://arc.codes/docs/en/reference/config.arc/aws). #### Arguments @@ -321,7 +323,7 @@ A tuple (array of two objects) containing: 1. A string representing an AWS-friendly Lambda resource name (which is based on the path to the function code), and 2. A JSON object that can be assigned to a CloudFormation `sam.json`'s `Resources` section. This would define a Lambda that Architect would create during a [`deploy`][deploy] -#### Example Usage of `createFunction` +#### Example usage of `createFunction` ```javascript let path = require('path') @@ -331,8 +333,8 @@ module.exports = { if (arc.rules) { const cwd = inventory.inv._project.src arc.rules.forEach(rule => { - let code = path.join(cwd, 'src', 'rules', rule[0]) - let [functionName, functionDefn] = createFunction({ inventory, src: code }) + let src = path.join(cwd, 'src', 'rules', rule[0]) + let [functionName, functionDefn] = createFunction({ inventory, src }) cloudformation.Resources[functionName] = functionDefn }) } @@ -357,7 +359,7 @@ All arguments arrive as a bag of options with the following properties: |`payload`|JSON payload to deliver to the function| |`callback`|Function with signature `function(error, result)` that is invoked with either the error or the result from the local function invocation| -#### Example Usage of `invokeLambda` +#### Example usage of `invokeLambda` The below plugin's `sandbox.start` method listens for the "I" keyboard keypress, prompts the user which of the plugin's Lambdas the user wants to invoke and what payload to deliver to the user, before using `invokeFunction` to invoke the Lambda code with the specified payload. @@ -370,9 +372,9 @@ module.exports = { if (!arc.rules) return [] const cwd = inventory.inv._project.src return arc.rules.map((rule) => { - let rulesSrc = path.join(cwd, 'src', 'rules', rule[0]) + let src = path.join(cwd, 'src', 'rules', rule[0]) return { - src: rulesSrc, + src, body: `exports.handler = async function (event) { console.log(event) }` @@ -420,7 +422,7 @@ module.exports = { } ``` -## Example Plugins +## Example plugins - [plugin-iot-rules](https://www.npmjs.com/package/@copper/plugin-iot-rules): adds AWS IoT Topic event Lambdas - [plugin-parcel](https://www.npmjs.com/package/@copper/plugin-parcel): compiles project Lambda code with the Parcel bundler both during local development via [`sandbox`][sandbox] and before [`deploy`s][deploy] From dce825bd5717261519e63eae67e67c7804deaed0 Mon Sep 17 00:00:00 2001 From: filmaj Date: Wed, 12 May 2021 11:10:50 -0500 Subject: [PATCH 070/680] updating min version needed for support --- src/views/docs/en/guides/extend/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index 217e9c84..9cc0007c 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -3,7 +3,7 @@ title: Plugins (beta) description: How to extend Architect using lifecycle hooks --- -> ⚠️ NOTE: Plugin support was added in version 8.5.0, is currently in beta, the interface is subject to change and only supports Node.js +> ⚠️ NOTE: Plugin support was added in version 8.6.0-RC.0, is currently in beta, the interface is subject to change and only supports Node.js Using [`@macros`][macros] allows you to augment the Architect-generated CloudFormation before deployment. However, augmenting CloudFormation may not be sufficient for certain extensions. For example, if you want to extend Architect with: From 7c092d78d0856c91d89f963667b8a6b17c58a701 Mon Sep 17 00:00:00 2001 From: filmaj Date: Mon, 24 May 2021 13:08:02 -0500 Subject: [PATCH 071/680] drop RC from min version needed for plugin extensions --- src/views/docs/en/guides/extend/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index 9cc0007c..07e2a745 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -3,7 +3,7 @@ title: Plugins (beta) description: How to extend Architect using lifecycle hooks --- -> ⚠️ NOTE: Plugin support was added in version 8.6.0-RC.0, is currently in beta, the interface is subject to change and only supports Node.js +> ⚠️ NOTE: Plugin support was added in version 8.6.0, is currently in beta, the interface is subject to change and only supports Node.js Using [`@macros`][macros] allows you to augment the Architect-generated CloudFormation before deployment. However, augmenting CloudFormation may not be sufficient for certain extensions. For example, if you want to extend Architect with: From e813b81110adc6c694c19b3778f5f61d2373db92 Mon Sep 17 00:00:00 2001 From: filmaj Date: Mon, 24 May 2021 14:53:32 -0500 Subject: [PATCH 072/680] 3.2.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 948745a5..bc591ffe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.2.2", + "version": "3.2.3", "architect": { "app": "v8-arc-codes", "aws": { From 0928156e40ebdd4972fdd0b7bfed4d0e5ac9c993 Mon Sep 17 00:00:00 2001 From: filmaj Date: Mon, 24 May 2021 15:03:50 -0500 Subject: [PATCH 073/680] make explicit minimum arc/functions version for runtime service discovery --- src/views/docs/en/reference/runtime/node.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index 8ca7e0c4..8cb2ff2e 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -251,6 +251,8 @@ await arc.ws.send({ ### `arc.services` +> NOTE: this API requires `@architect/functions` version 3.14.0 or newer. + A function that retrieves the service map: an object mapping plugin or out-of-the-box Architect infrastructure data making up the Architect application. This object is lazily-loaded and cached and thus the first call may incur a delay as the service map is populated (use of [`arc.events`](#arc.events), [`arc.queues`](#arc.queues) and [`arc.tables`](#arc.tables) transparently uses this method in the background). `arc.services` returns a service map object, with keys equaling any out-of-the-box Architect infrastructure types or plugins used by the Architect application. An example service map for an application composed of `@static`, `@events` and an `imagebucket` plugin would have the following structure: From 613a8ea652c7357d14af5f14df2c54ea80b13eaa Mon Sep 17 00:00:00 2001 From: filmaj Date: Mon, 24 May 2021 15:03:57 -0500 Subject: [PATCH 074/680] 3.2.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bc591ffe..7bca52d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.2.3", + "version": "3.2.4", "architect": { "app": "v8-arc-codes", "aws": { From b8fa8b4da508a5e7f1f36143e3ffe886c19cd85f Mon Sep 17 00:00:00 2001 From: Francis Gulotta Date: Tue, 25 May 2021 20:51:33 -0400 Subject: [PATCH 075/680] Update tables _name() method rename `_name()` is now called `name()` --- src/views/docs/en/reference/runtime/node.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index 8cb2ff2e..33aef708 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -184,7 +184,7 @@ The generated data layer also allows direct access to DynamoDB through a few met - `data._db` which returns an instance of [`AWS.DynamoDB`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) - `data._doc` returns an instance of [`AWS.DynamoDB.DocumentClient`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html) -- `data._name` helper function that returns a `@table` resource name when you need to go lower level. For example use `data._name("my-table")` to get the name of the "my-table" `@table` resource. +- `data.name` helper function that returns a `@table` resource name when you need to go lower level. For example use `data.name("my-table")` to get the name of the "my-table" `@table` resource. (Previously called `data._name` which is now deprecated.) ### `arc.events` From 66241eacfa50eec5b914cdbc797bc80090689f6e Mon Sep 17 00:00:00 2001 From: kj Date: Fri, 4 Jun 2021 11:57:29 -0700 Subject: [PATCH 076/680] Fixes word breaks in td --- src/http/get-docs-000lang-catchall/markdown-class-mappings.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js index 0c17178b..31deb45d 100644 --- a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js +++ b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js @@ -79,6 +79,7 @@ module.exports = { 'border-solid', 'border-g1', 'border1', - 'bg-g0' + 'bg-g0', + 'break-all' ] } From 4a91cca4fd648556bd87d52799686d069005b9f1 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Fri, 4 Jun 2021 12:50:36 -0700 Subject: [PATCH 077/680] 3.2.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7bca52d4..763961fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.2.4", + "version": "3.2.5", "architect": { "app": "v8-arc-codes", "aws": { From 2edd5887b68eef255d1a7d96914c2ebe5e48d729 Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 22 Jun 2021 10:00:17 -0400 Subject: [PATCH 078/680] improve destroy cli docs, link to other commands / app.arc references, add new --no-timeout flag docs. --- src/views/docs/en/reference/cli/destroy.md | 34 +++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/views/docs/en/reference/cli/destroy.md b/src/views/docs/en/reference/cli/destroy.md index 37e6c717..7cd6d118 100644 --- a/src/views/docs/en/reference/cli/destroy.md +++ b/src/views/docs/en/reference/cli/destroy.md @@ -1,32 +1,52 @@ --- title: arc destroy -description: CLI destory command for removing CloudFormation stack +description: CLI destroy command for removing Architect application --- -Remove the CloudFormation stack and all related assets for the current project from AWS completely. +Remove the CloudFormation stack and all related assets (S3 buckets, CloudWatch Log Groups, SSM environment variable parameters) for the current project from AWS completely. By default, removes the staging stack. + +Large applications may take several minutes to delete and by default this command times out after 150 seconds. Even if this command times out, deletion may still complete successfully as removal completes asynchronously in the background at AWS. To have this process block until all application resources are removed, use the `--no-timeout` flag (see below for more information). ## Usage ```bash -arc destroy [production] [--name|--force|-f] +arc destroy --app MyAppName [production] [--name NamedEnvironment] [--force] ``` +## Flags + +- `[--app MyAppName]` Required. Specify the app name, located under `@app` in your Architect manifest, to delete the app from AWS. +- `[--name NamedEnvironment]` If you ran [`arc deploy`][deploy] with the `--name` flag to specify a custom named environment to deploy your application to, use this flag to destroy that same named application environment. +- `[production|--production|-p]` Destroy the production stack of your application. By default, without this flag, the staging stack is removed. +- `[--force|-f]` Force deletion of the application even if it contains DynamoDB tables ([`@tables`][tables]) or S3 bucket containing static assets ([`@static`][static]). +- `[--no-timeout]` Do not exit the process until all application resources are deleted. + ## Examples ### Destroy the staging stack ```bash -arc destroy --name my-app-name +arc destroy --app my-app ``` ### Destroy the production stack ```bash -arc destroy production --name my-app-name +arc destroy production --app my-app +``` + +### Destroy staging stack with S3 bucket and/or Dynamo tables + +```bash +arc destroy --app my-app --force ``` -### Destroy stack with S3 bucket and/or Dynamo tables +### Destroy custom named stack ```bash -arc destroy --name my-app --force +arc destroy --app my-app --force --name Dev ``` + +[deploy]: deploy +[tables]: ../app.arc/tables +[static]: ../app.arc/static From ca2a832e2fd80aa8017efdee5ec5717c5e7b571d Mon Sep 17 00:00:00 2001 From: filmaj Date: Tue, 22 Jun 2021 10:07:50 -0400 Subject: [PATCH 079/680] 3.2.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 763961fa..0d1e328b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.2.5", + "version": "3.2.6", "architect": { "app": "v8-arc-codes", "aws": { From 4152b1266ec3e3e2997b42037987bfe527e08673 Mon Sep 17 00:00:00 2001 From: Francis Gulotta Date: Thu, 1 Jul 2021 10:17:08 -0400 Subject: [PATCH 080/680] fix bad link --- src/views/docs/en/reference/app.arc/views.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/views.md b/src/views/docs/en/reference/app.arc/views.md index 2dda0b40..1bb0ec2c 100644 --- a/src/views/docs/en/reference/app.arc/views.md +++ b/src/views/docs/en/reference/app.arc/views.md @@ -10,7 +10,7 @@ You can also specify only the routes you want views copied to with the `@views` ## Syntax - Routes should be existing `@http` routes. -- Route names follow the same requirements as `@http` routes. [see `@http`](@http) +- Route names follow the same requirements as `@http` routes. [see `@http`](http) ## Example From 8ce406203ba14c308a5e3eb8edcd6cf4ffc7f800 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 28 Jul 2021 09:04:21 -0700 Subject: [PATCH 081/680] Add Architect 9 upgrade guide --- src/views/docs/en/about/upgrade.md | 44 +++++++++++++++++++++++++++-- src/views/docs/table-of-contents.js | 9 +++--- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/views/docs/en/about/upgrade.md b/src/views/docs/en/about/upgrade.md index 9f4e3847..1fa22a56 100644 --- a/src/views/docs/en/about/upgrade.md +++ b/src/views/docs/en/about/upgrade.md @@ -1,9 +1,10 @@ --- -title: Changelog +title: Upgrade guide category: Get started description: This document covers upgrading from previous versions of Architect sections: - Overview of Architect versions + - Architect 8 → 9 - Architect 7 → 8 - Architect 6 → 7 - Architect 5 → 6 @@ -17,6 +18,13 @@ This document covers upgrading from previous versions of Architect. As a general philosophy, Architect's core maintainers endeavor to minimize the frequency and impact of breaking changes wherever possible; in many cases, major releases may have no impact on existing applications. +### Architect 9 (La Chupacabra) + +Architect 9 (La Chupacabra) is primarily a maintenance release, dropping support for the now end-of-life Node.js 10.x, and removing support for Architect 5 (and lower). + +[See below for potential impacts to upgrading](#architect-8-→-9). + + ### Architect 8 (El Chupacabra) Architect 8 (El Chupacabra) improves API Gateway `HTTP` APIs by adding [`@proxy`](/docs/en/reference/arc-pragmas/@proxy) support for migrating old APIs, and `any` HTTP method support and `*` catchall syntax, while also improving the default greedy catchall behavior of `get /` to be literal to what's found in the Architect manifest. @@ -55,16 +63,47 @@ Architect 4 (Yeti) introduced generic, dependency-free HTTP functions, enhanced ### Topics +- [Architect 8 → 9](#architect-8-→-9) - [Architect 7 → 8](#architect-7-→-8) - [Architect 6 → 7](#architect-6-→-7) - [Architect 5 → 6](#architect-5-→-6) -- [Architect 5 LTS (maintenance schedule)](#architect-5-lts-maintenance-schedule) - [Architect 4 → 5](#architect-4-→-5) - [Architect Functions](#architect-functions) - [Architect Data](#architect-data) --- +## Architect 8 → 9 + +Architect 9 (La Chupacabra) is a maintenance release, primarily aimed at removing support for the now end-of-life Node.js 10.x. With this release, after two years since the release of Architect 6, Architect 5 is no longer supported. + +Additionally, Architect's default runtime is now `nodejs14.x` – if your existing functions do not specify a runtime, they will be automatically and seamlessly upgraded from `nodejs10.x` or `nodejs12.x` to `nodejs14.x`. + + +### Breaking changes + +- Removed support for Node.js 10.x (now EOL, and no longer available to created in AWS Lambda) +- `arc destroy` + - `--app` must now be used to destroy apps, while `--name` may only be used to destroy stacks + - Removed support for deprecated `--nuke` flag +- `arc hydrate` + - Usage remains the same, but its module API has removed support for `hydrate()` in favor of explicit `hydrate.install|update|shared()` methods + + +### Compatibility with `@architect/functions` + +Architect 9 is fully compatible with `@architect/functions`. However, `@architect/functions` v4, released alongside Architect 9, has some breaking changes: + +- Removed support for Node.js 10.x (now EOL, and no longer available to created in AWS Lambda) +- `arc.http.proxy` is now `@architect/asap`, and has been removed from `@architect/functions` v4 +- `arc.http.proxy` calls can now be sent as-is to ASAP + - For more details, please see the [@architect/functions changelog](https://github.com/architect/functions/blob/master/_changelog.md#200-2021-07-25) and [@architect/asap changelog](https://github.com/architect/asap/blob/master/_changelog.md#400-2021-07-25) +- Removed support for handling requests from Architect 5 (and lower) APIs + - Responding to requests has not changed, however! + - Old response semantics from Architect 5 (and lower) will continue to be supported, so you'll always have a clear, clean upgrade path from older Architect projects to newer APIs + +--- + ## Architect 7 → 8 ### Overview @@ -723,4 +762,3 @@ exports.handler = async () => { return {body} } ``` - diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 0ff8e9ae..e028dd93 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -38,11 +38,11 @@ let Guides = [ { 'Scheduled functions', ],*/ 'Extend': [ - // TODO'Migrate legacy code',// @proxy, arc.http.express + // TODO 'Migrate legacy code', // @proxy, arc.http.express 'Custom CloudFormation', 'Plugins', - // TODO'Add a custom domain', - // TODO'Ejecting ' + // TODO 'Add a custom domain', + // TODO 'Ejecting', ] } ] @@ -99,7 +99,7 @@ let About = [ 'Mission', 'Community', 'Contribute', - 'Upgrade', + 'Upgrade guide', 'Playground', ] @@ -108,4 +108,3 @@ module.exports = { Reference, About } - From 2876f9bb3e85f16c1b73eaf3dc5f9b081e994dc9 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 28 Jul 2021 09:09:15 -0700 Subject: [PATCH 082/680] Update deps --- package.json | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 0d1e328b..e52382ea 100644 --- a/package.json +++ b/package.json @@ -14,18 +14,9 @@ "fingerprint": true }, "http": [ - [ - "get", - "/docs/:lang/*" - ], - [ - "get", - "/api/package" - ], - [ - "any", - "/*" - ] + [ "get", "/docs/:lang/*" ], + [ "get", "/api/package" ], + [ "any", "/*" ] ] }, "scripts": { @@ -36,24 +27,24 @@ "test": "tape -r esm test/*-test.js test/**/*.js | tap-spec" }, "dependencies": { - "@architect/architect": "^8.4.2", + "@architect/architect": "^8.7.4", "@architect/eslint-config": "^1.0.0", - "@architect/functions": "^3.13.8", - "@architect/inventory": "^1.2.0", - "@architect/package": "^6.0.1", - "@architect/sandbox": "^3.4.2", + "@architect/functions": "^3.14.2", + "@architect/inventory": "^2.0.3", + "@architect/package": "^7.0.0", + "@architect/sandbox": "^4.0.0", "@toycode/markdown-it-class": "^1.2.4", - "eslint": "^7.15.0", + "eslint": "^7.31.0", "esm": "^3.2.25", - "highlight.js": "^10.4.1", - "js-yaml": "^3.14.1", - "markdown-it": "^12.0.3", - "markdown-it-anchor": "^6.0.1", + "highlight.js": "^11.1.0", + "js-yaml": "^4.1.0", + "markdown-it": "^12.1.0", + "markdown-it-anchor": "^8.1.2", "markdown-it-front-matter": "^0.2.3", - "slugify": "^1.4.6", - "spellchecker-cli": "^4.4.0", + "slugify": "^1.6.0", + "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", - "tape": "^5.0.1" + "tape": "^5.2.2" }, "eslintConfig": { "extends": "@architect/eslint-config" From e2288f77f2c7439e37eed9080c06af2d8b3c9c7b Mon Sep 17 00:00:00 2001 From: filmaj Date: Wed, 28 Jul 2021 13:31:04 -0400 Subject: [PATCH 083/680] Add warnings / hints / protips about setting ARC_APP_SECRET env var --- package.json | 15 ++++++++++++--- .../docs/en/guides/get-started/quickstart.md | 1 + src/views/docs/en/reference/cli/env.md | 14 ++++++++++---- src/views/docs/en/reference/runtime/node.md | 5 +++++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index e52382ea..8044a971 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,18 @@ "fingerprint": true }, "http": [ - [ "get", "/docs/:lang/*" ], - [ "get", "/api/package" ], - [ "any", "/*" ] + [ + "get", + "/docs/:lang/*" + ], + [ + "get", + "/api/package" + ], + [ + "any", + "/*" + ] ] }, "scripts": { diff --git a/src/views/docs/en/guides/get-started/quickstart.md b/src/views/docs/en/guides/get-started/quickstart.md index 32e73b3c..55746d53 100644 --- a/src/views/docs/en/guides/get-started/quickstart.md +++ b/src/views/docs/en/guides/get-started/quickstart.md @@ -51,6 +51,7 @@ Ship a `production` stack: ```bash arc deploy production ``` +> Be safe! Set the `ARC_APP_SECRET` environment variable in production to secure your HTTP sessions; more information in the [`env` CLI reference](../../reference/cli/env) Or eject to CloudFormation and deploy with the AWS SAM CLI: diff --git a/src/views/docs/en/reference/cli/env.md b/src/views/docs/en/reference/cli/env.md index 57d38798..fbc57fb7 100644 --- a/src/views/docs/en/reference/cli/env.md +++ b/src/views/docs/en/reference/cli/env.md @@ -3,7 +3,7 @@ title: arc env description: Read and write environment variables for Lambda functions. --- -Read and write environment variables. This allows apps to centrally store sensitive configuration data, such as API keys, outside of the codebase in revision control. +Read and write environment variables. This allows apps to centrally store sensitive configuration data, such as API keys, outside of the codebase in revision control. ## Usage @@ -11,6 +11,12 @@ Read and write environment variables. This allows apps to centrally store sensit arc env [testing|staging|production] {VARIABLE_NAME} {VARIABLE_VALUE} ``` +## Security + +It is imperative that the `ARC_APP_SECRET` environment variable be set to +something secret - especially in your production environment! This secret is +used to encode HTTP sessions if you use the [`@architect/functions` runtime helpers](../runtime/node#arc.http.session). + ## Examples ### Display environment variables for the current `app.arc` @@ -25,9 +31,9 @@ arc env arc env staging FOO myvalue ``` -> Protip: values that contain special characters like email addresses should be wrapped in double quotes +> Protip: values that contain special characters like email addresses should be wrapped in double quotes -### Remove an environment variable +### Remove an environment variable ``` arc env remove staging FOO @@ -36,5 +42,5 @@ arc env remove staging FOO ## Reserved names - `NODE_ENV` -- `ARC_APP_NAME` +- `ARC_APP_NAME` - `SESSION_TABLE_NAME` diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index 33aef708..26b5a021 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -146,6 +146,11 @@ async function handler (req) { } ``` +Please note that session variable encoding and decoding relies on the +`ARC_APP_SECRET` [environment variable](../cli/env) being set to something +secret and not easily guessable. If you use this method, please be sure to [set +the `ARC_APP_SECRET` environment variable](../cli/env)! + ### `arc.tables` Create a DynamoDB client for `@tables`. From 2fbba8c388256d2188359506698e7c58fa1ad742 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 28 Jul 2021 10:40:34 -0700 Subject: [PATCH 084/680] Move upgrade guide --- src/views/docs/en/about/{upgrade.md => upgrade-guide.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/views/docs/en/about/{upgrade.md => upgrade-guide.md} (100%) diff --git a/src/views/docs/en/about/upgrade.md b/src/views/docs/en/about/upgrade-guide.md similarity index 100% rename from src/views/docs/en/about/upgrade.md rename to src/views/docs/en/about/upgrade-guide.md From 0fccbe323224e36712d71557a2d53521213b4cc5 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 28 Jul 2021 14:29:14 -0700 Subject: [PATCH 085/680] Improve Arc Functions docs, tidy up typos --- package.json | 15 +- scripts/dictionary.js | 56 +- src/views/docs/en/about/upgrade-guide.md | 4 +- .../en/guides/backend/database-functions.md | 2 +- .../en/guides/backend/scheduled-functions.md | 2 +- src/views/docs/en/guides/domains/dreamhost.md | 14 +- src/views/docs/en/guides/domains/godaddy.md | 14 +- src/views/docs/en/guides/domains/namecheap.md | 14 +- src/views/docs/en/guides/domains/one.md | 14 +- src/views/docs/en/guides/domains/route53.md | 4 +- .../en/guides/extend/custom-cloudformation.md | 2 +- src/views/docs/en/guides/extend/plugins.md | 15 +- .../docs/en/guides/frontend/http-functions.md | 3 +- .../en/guides/frontend/websocket-functions.md | 6 +- src/views/docs/en/reference/app.arc/app.md | 2 +- src/views/docs/en/reference/app.arc/macros.md | 2 +- .../docs/en/reference/app.arc/scheduled.md | 5 + src/views/docs/en/reference/app.arc/tables.md | 2 +- src/views/docs/en/reference/app.arc/ws.md | 2 +- .../docs/en/reference/config.arc/runtime.md | 8 +- src/views/docs/en/reference/runtime/node.md | 545 +++++++++++++----- 21 files changed, 515 insertions(+), 216 deletions(-) diff --git a/package.json b/package.json index 8044a971..e52382ea 100644 --- a/package.json +++ b/package.json @@ -14,18 +14,9 @@ "fingerprint": true }, "http": [ - [ - "get", - "/docs/:lang/*" - ], - [ - "get", - "/api/package" - ], - [ - "any", - "/*" - ] + [ "get", "/docs/:lang/*" ], + [ "get", "/api/package" ], + [ "any", "/*" ] ] }, "scripts": { diff --git a/scripts/dictionary.js b/scripts/dictionary.js index 5b2f9f1e..ea9c2e66 100644 --- a/scripts/dictionary.js +++ b/scripts/dictionary.js @@ -28,6 +28,7 @@ let dictionary = [ 'base64-encoded', 'Base64', 'bashrc', + 'bcrypt', 'birb', 'blockchain', 'Blockquoted', @@ -35,21 +36,25 @@ let dictionary = [ 'BuddyBuild', 'bundler', 'bundlers', - 'bcrypt', 'CA', 'cacheControl', 'Catalope', 'cd', 'CDN', 'CDNs', + 'changelog', + 'Changelog', 'cheatsheet', 'Chupacabra', - 'Changelog', 'CLA', + 'CLI.', + 'CLI', 'CLI', 'Cloudflare', + 'CloudFormation-managed', 'CloudFormation', 'CloudFront', + 'CloudFront', 'ClouDNS', 'CloudWatch', 'CMK', @@ -63,10 +68,11 @@ let dictionary = [ 'configurability', 'congrats', 'Congrats', - 'CORS', 'cors', - 'CRON', + 'CORS', 'cron', + 'Cron', + 'CRON', 'cross-env', 'cruft', 'cryptographically', @@ -75,6 +81,7 @@ let dictionary = [ 'css', 'CSS', 'Ctrl', + 'customizable', 'CVEs', 'debuggable', 'declaratively', @@ -95,10 +102,11 @@ let dictionary = [ 'DNSimple', 'DocumentClient', 'DocumentDB', + 'Dreamhost', 'Dyn', + 'dynalite', 'DynamoDB.', 'DynamoDB', - 'dynalite', 'easyDNS', 'EC2', 'El', @@ -106,6 +114,7 @@ let dictionary = [ 'endpoints', 'env', 'envs', + 'EOL', 'errback', 'eslint', 'esmodules', @@ -115,13 +124,14 @@ let dictionary = [ 'FQDN', 'frontend', 'globals', - 'hashids', + 'Godaddy', 'hardcode', 'hardcoding', + 'hashids', 'headless', 'headlessly', - 'hostname', 'hoc', + 'hostname', 'html', 'HTTP', 'httpOnly', @@ -133,19 +143,26 @@ let dictionary = [ 'installable', 'integrations', 'internets', + 'IoT', 'isBase64Encoded', 'js', 'JS', 'JSF', + 'JSON-encodes', 'JSON-like', 'JSON-style', - 'JSON', 'json', + 'JSON', 'jsx', 'JSX', + 'keypress', + 'Kinesis', + 'KMS', 'LEANX', 'learnable', 'learnings', + 'Lex', + 'lifecycle', 'linter', 'LTS', 'macOS', @@ -157,8 +174,10 @@ let dictionary = [ 'MMO', 'Mongo', 'MongoDB', + 'Namecheap', 'NameCheap', 'namespace', + 'namespaced', 'namespaces', 'nav', 'NewOps', @@ -166,6 +185,8 @@ let dictionary = [ 'NodeJS', 'Nodemon', 'non-serverless', + 'NoSQL', + 'npm', 'NPM', 'NS1', 'OAuth', @@ -182,17 +203,23 @@ let dictionary = [ 'PEM', 'per-pragma', 'plaintext', + 'positionally', 'powershell', 'PowerShell', 'pragma', 'pragmas', 'pre-compiled', + 'pre-configured', + 'pre-deploy', + 'pre-existing', 'pre-installed', 'pre-parsed', 'pre-provision', + 'pre-provisioning', 'pre-wired', - 'Prerendering', + 'prepending', 'prepopulated', + 'Prerendering', 'privs', 'protip', 'Protip', @@ -234,9 +261,9 @@ let dictionary = [ 'signups', 'SNS', 'SQS', + 'src', 'SSL', 'SSM', - 'src', 'stateful', 'statusCode', 'stderr', @@ -244,8 +271,8 @@ let dictionary = [ 'subdirectories', 'subdomain', 'subdomains', - 'symlinking', 'svg', + 'symlinking', 'teardown', 'TestFlight', 'tiny-json-http', @@ -260,9 +287,11 @@ let dictionary = [ 'TSX', 'TTL', 'UI', + 'Upsert', 'unauthenticated', 'unbreak', 'unformatted', + 'unindented', 'Unordered', 'unparsed', 'unsynced', @@ -271,15 +300,17 @@ let dictionary = [ 'v5', 'vars', 'vimrc', + 'VMs', 'vs', 'webby', 'webhooks', 'Webpack', + 'WebSocket-enabled', 'WebSocket', 'WebSockets', 'whitespace', - 'XSS', 'xml', + 'XSS', 'YAML', 'ZoneEdit', ] @@ -287,4 +318,3 @@ let dictionary = [ dictionary.unshift(/[KMG]B/) // Data quantities, ostensibly module.exports = dictionary - diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index 1fa22a56..50803da4 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -92,10 +92,10 @@ Additionally, Architect's default runtime is now `nodejs14.x` – if your existi ### Compatibility with `@architect/functions` -Architect 9 is fully compatible with `@architect/functions`. However, `@architect/functions` v4, released alongside Architect 9, has some breaking changes: +Architect 9 is fully compatible with `@architect/functions`. However, `@architect/functions` 4.0, released alongside Architect 9, has some breaking changes: - Removed support for Node.js 10.x (now EOL, and no longer available to created in AWS Lambda) -- `arc.http.proxy` is now `@architect/asap`, and has been removed from `@architect/functions` v4 +- `arc.http.proxy` is now `@architect/asap`, and has been removed from `@architect/functions` 4.0 - `arc.http.proxy` calls can now be sent as-is to ASAP - For more details, please see the [@architect/functions changelog](https://github.com/architect/functions/blob/master/_changelog.md#200-2021-07-25) and [@architect/asap changelog](https://github.com/architect/asap/blob/master/_changelog.md#400-2021-07-25) - Removed support for handling requests from Architect 5 (and lower) APIs diff --git a/src/views/docs/en/guides/backend/database-functions.md b/src/views/docs/en/guides/backend/database-functions.md index 07922839..bfd4b80a 100644 --- a/src/views/docs/en/guides/backend/database-functions.md +++ b/src/views/docs/en/guides/backend/database-functions.md @@ -11,7 +11,7 @@ sections: Architect database functions are a log of information about changes to items in a DynamoDB table. When you enable a stream on a table under the `@tables` pragma in your `app.arc` file, DynamoDB captures information about every modification to data items in the table. -This functionality is commonly used to stream data to other sources and provide data-based event triggers. (eg. when I add new user row to the accounts table …send a welcome email) +This functionality is commonly used to stream data to other sources and provide data-based event triggers. (e.g. when I add new user row to the accounts table …send a welcome email) Database functions capture a time-ordered sequence of item-level modifications in any DynamoDB table and stores this information in a log for up to 24 hours. Applications can access this log and view the data items as they appeared before and after they were modified, in near-real-time. diff --git a/src/views/docs/en/guides/backend/scheduled-functions.md b/src/views/docs/en/guides/backend/scheduled-functions.md index 4a8f8773..0c076e55 100644 --- a/src/views/docs/en/guides/backend/scheduled-functions.md +++ b/src/views/docs/en/guides/backend/scheduled-functions.md @@ -81,7 +81,7 @@ Cron expressions allow us to give our functions granular settings. `crons` have - The L wildcard in the Day-of-month or Day-of-week fields specifies the last day of the month or week. -- The W wildcard in the Day-of-month field specifies a weekday. In the Day-of-month field, 3W specifies the weekday closest to the third day of the month. +- The W wildcard in the Day-of-month field specifies a weekday. In the Day-of-month field, `3W` specifies the weekday closest to the third day of the month. - The # wildcard in the Day-of-week field specifies a particular instance of the specified day of the week within a month. For example, 3#2 would be the second Tuesday of the month: the 3 refers to Tuesday because it is the third day of each week, and the 2 refers to the second day of that type within the month. diff --git a/src/views/docs/en/guides/domains/dreamhost.md b/src/views/docs/en/guides/domains/dreamhost.md index 25c9245c..c02eb540 100644 --- a/src/views/docs/en/guides/domains/dreamhost.md +++ b/src/views/docs/en/guides/domains/dreamhost.md @@ -3,7 +3,7 @@ title: Dreamhost description: Setting up a domain name with Dreamhost --- -## Prerequisites +## Prerequisites - Sign up for a domain on [Dreamhost](https://www.dreamhost.com/domains/) - Make sure your domain is set to `DNS Only` in the Dreamhost console. @@ -32,7 +32,7 @@ Generate a CloudFront distribution with the certificate from step 1. - Sign into AWS CloudFront in the AWS Console - Click `Create Distribution` and then click `Get Started` - Open API Gateway and make note of the Invoke URL. -- Enter the URL from API Gateway in `Origin Domain Name` +- Enter the URL from API Gateway in `Origin Domain Name` - Set `Origin Protocol Policy` to `Match Viewer` - Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. - Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` @@ -42,7 +42,7 @@ Generate a CloudFront distribution with the certificate from step 1. - Click `Create Distribution` - Repeat for `staging` domain. -## Step 3: configure the domain Alias in Dreamhost +## Step 3: configure the domain Alias in Dreamhost Add `Alias` and `CNAME` records to DNS. @@ -50,10 +50,10 @@ Add `Alias` and `CNAME` records to DNS. - Navigate to the domain by clicking `Manage Domains` in the sidebar. - Click `DNS` under the domain - Click `Add Record` -- Use record type `Alias` for the root domain. - - Leave `Host` input blank and add the Cloudfront domain that was created in step 2 to the `Points to` input. -- Use record type `CNAME` for the `staging` domain. - - Add the word `staging` to the `Host` input and add the Cloudfront domain that was created in step 2 to the `Points to` input. +- Use record type `Alias` for the root domain. + - Leave `Host` input blank and add the CloudFront domain that was created in step 2 to the `Points to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the CloudFront domain that was created in step 2 to the `Points to` input. - Click `Add records` ## Conclusion diff --git a/src/views/docs/en/guides/domains/godaddy.md b/src/views/docs/en/guides/domains/godaddy.md index 96c7b474..9667d0ac 100644 --- a/src/views/docs/en/guides/domains/godaddy.md +++ b/src/views/docs/en/guides/domains/godaddy.md @@ -3,7 +3,7 @@ title: Godaddy description: Setting up a domain name with Godaddy --- -## Prerequisites +## Prerequisites - Sign up for a domain on [Godaddy](https://www.Godaddy.com/) - Deploy an app with Architect and make note of the `staging` and `production` URLs @@ -31,7 +31,7 @@ Generate a CloudFront distribution with the certificate from step 1. - Sign into AWS CloudFront in the AWS Console - Click `Create Distribution` and then click `Get Started` - Open API Gateway and make note of the `Invoke URL`. -- Enter the URL from API Gateway in `Origin Domain Name` +- Enter the URL from API Gateway in `Origin Domain Name` - Set `Origin Protocol Policy` to `Match Viewer` - Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. - Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` @@ -41,16 +41,16 @@ Generate a CloudFront distribution with the certificate from step 1. - Click `Create Distribution` - Repeat for `staging` domain. -## Step 3: configure the domain Alias in Godaddy +## Step 3: configure the domain Alias in Godaddy Add `A` and `CNAME` records to DNS. - Open up Godaddy account dashboard and find the `DNS` settings for the particular domain you want to use. - Click `ADD`. -- Use record type `A` for the root domain. - - Leave `Host` input empty and add the IP address of the Cloudfront domain that was created in step 2 to the `Points to` input. -- Use record type `CNAME` for the `staging` domain. - - Add the word `staging` to the `Host` input and add the Cloudfront domain that was created in step 2 to the `Points to` input. +- Use record type `A` for the root domain. + - Leave `Host` input empty and add the IP address of the CloudFront domain that was created in step 2 to the `Points to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the CloudFront domain that was created in step 2 to the `Points to` input. ## Conclusion diff --git a/src/views/docs/en/guides/domains/namecheap.md b/src/views/docs/en/guides/domains/namecheap.md index a87c92c0..df96dcbf 100644 --- a/src/views/docs/en/guides/domains/namecheap.md +++ b/src/views/docs/en/guides/domains/namecheap.md @@ -3,7 +3,7 @@ title: Namecheap description: Setting up a domain name with Namecheap --- -## Prerequisites +## Prerequisites - Sign up for a domain on [Namecheap](https://www.Namecheap.com/domains/) - Deploy an app with Architect and make note of the `staging` and `production` URLs @@ -32,7 +32,7 @@ Generate a CloudFront distribution with the certificate from step 1. - Sign into AWS CloudFront in the AWS Console - Click `Create Distribution` and then click `Get Started` - Open API Gateway and make note of the `Invoke URL`. -- Enter the URL from API Gateway in `Origin Domain Name` +- Enter the URL from API Gateway in `Origin Domain Name` - Set `Origin Protocol Policy` to `Match Viewer` - Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. - Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` @@ -42,17 +42,17 @@ Generate a CloudFront distribution with the certificate from step 1. - Click `Create Distribution` - Repeat for `staging` domain. -## Step 3: configure the domain Alias in Namecheap +## Step 3: configure the domain Alias in Namecheap Add `Alias` and `CNAME` records to DNS. - Open up Namecheap account dashboard and click `Manage` for the particular domain you want to use. - Open the `Advanced DNS` tab. - Click `ADD A NEW RECORD` -- Use record type `Alias` for the root domain. - - Add `@` in the `Host` input and add the Cloudfront domain that was created in step 2 to the `Value` input. -- Use record type `CNAME` for the `staging` domain. - - Add the word `staging` to the `Host` input and add the Cloudfront domain that was created in step 2 to the `Value` input. +- Use record type `Alias` for the root domain. + - Add `@` in the `Host` input and add the CloudFront domain that was created in step 2 to the `Value` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the CloudFront domain that was created in step 2 to the `Value` input. ## Conclusion diff --git a/src/views/docs/en/guides/domains/one.md b/src/views/docs/en/guides/domains/one.md index 7b087e18..9138d387 100644 --- a/src/views/docs/en/guides/domains/one.md +++ b/src/views/docs/en/guides/domains/one.md @@ -3,7 +3,7 @@ title: One description: Setting up a domain name with One --- -## Prerequisites +## Prerequisites - Sign up for a domain on [One](https://www.one.com/en/domain) - Deploy an app with Architect and make note of the `staging` and `production` URLs @@ -32,7 +32,7 @@ Generate a CloudFront distribution with the certificate from step 1. - Sign into AWS CloudFront in the AWS Console - Click `Create Distribution` and then click `Get Started` - Open API Gateway and make note of the `Invoke URL`. -- Enter the URL from API Gateway in `Origin Domain Name` +- Enter the URL from API Gateway in `Origin Domain Name` - Set `Origin Protocol Policy` to `Match Viewer` - Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. - Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` @@ -42,17 +42,17 @@ Generate a CloudFront distribution with the certificate from step 1. - Click `Create Distribution` - Repeat for `staging` domain. -## Step 3: configure the domain Alias in One +## Step 3: configure the domain Alias in One Add `A` and `CNAME` records to DNS. - Open up One account dashboard and click `DNS settings` for the particular domain you want to use. - Open the `DNS records` tab. - Click the `A` tab in the `Create new record` box -- Use record type `A` for the root domain. - - Leave `Hostname` input empty and add the IP address of the Cloudfront domain that was created in step 2 to the `Will point to` input. -- Use record type `CNAME` for the `staging` domain. - - Add the word `staging` to the `Hostname` input and add the Cloudfront domain that was created in step 2 to the `Is an alias of` input. +- Use record type `A` for the root domain. + - Leave `Hostname` input empty and add the IP address of the CloudFront domain that was created in step 2 to the `Will point to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Hostname` input and add the CloudFront domain that was created in step 2 to the `Is an alias of` input. ## Conclusion diff --git a/src/views/docs/en/guides/domains/route53.md b/src/views/docs/en/guides/domains/route53.md index e50521dd..96697995 100644 --- a/src/views/docs/en/guides/domains/route53.md +++ b/src/views/docs/en/guides/domains/route53.md @@ -4,7 +4,7 @@ description: Setting up a domain name with Route 53 --- -## Prerequisites +## Prerequisites - [Register](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html) or [transfer](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) a domain with Route53 - Deploy an app with Architect and make note of the `staging` and `production` URLs @@ -27,7 +27,7 @@ Generate a domain with the certificate from Step 1. - Sign into AWS API Gateway in the AWS Console - Navigate to `Custom domain names` and click `Create` -- Enter the domain name (eg. `staging.example.com` for the `staging` app or `example.com` for the `production` app) +- Enter the domain name (e.g. `staging.example.com` for the `staging` app or `example.com` for the `production` app) - Select the certificate created in Step 1 - Click `Create domain name` - Make note of the generated `API Gateway domain name` in `Endpoint configuration` diff --git a/src/views/docs/en/guides/extend/custom-cloudformation.md b/src/views/docs/en/guides/extend/custom-cloudformation.md index 79f444ef..cdd5c509 100644 --- a/src/views/docs/en/guides/extend/custom-cloudformation.md +++ b/src/views/docs/en/guides/extend/custom-cloudformation.md @@ -17,7 +17,7 @@ Architect `@macros` are implemented as a standard Node module with the following * @returns {object} Modified CloudFormation template */ module.exports = async function mymacro (arc, sam, stage='staging') { - // modify sam cloudformation here + // modify sam cloudformation here console.log({ arc, sam, stage }) return sam } diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index 07e2a745..9423fe31 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -188,7 +188,7 @@ All arguments arrive as a bag of options with the following properties: This method should always return an object. Each property on the object represents a variable name, and the value for each property contains the variable value. -> 🏌️‍♀️ Protip: When this method is invoked in a pre-`deploy` context, acceptable values for the variables include CloudFormation JSON. This is essential to expose CloudFormation-managed infrastructure; see the example below. +> 🏌️‍♀️ Protip: When this method is invoked in a pre-deploy context, acceptable values for the variables include CloudFormation JSON. This is essential to expose CloudFormation-managed infrastructure; see the example below. #### Example `variables` implementation @@ -209,12 +209,13 @@ module.exports = { } ``` -The above example returns three variables that would be provided at runtime: `bucketName`, `accessKey` and `secretKey`. Depending on whether the plugin executes in a local development environment context via [`sandbox`][sandbox] or in a pre-`deploy` context via [`deploy`][deploy], the contents of these credentials would differ: +The above example returns three variables that would be provided at runtime: `bucketName`, `accessKey` and `secretKey`. Depending on whether the plugin executes in a local development environment context via [`sandbox`][sandbox] or in a pre-deploy context via [`deploy`][deploy], the contents of these credentials would differ: - The `secretKey` and `accessKey` variables would contain hard-coded values when running locally in [`sandbox`][sandbox] (both would have a value of `S3RVER`). These hard-coded values could be used by the plugin author when implementing the [`sandbox.start`](#sandbox.start) method to provide a seamless local development experience. -- The `secretKey` and `accessKey` variables are CloudFormation JSON referencing a set of credentials called `MyS3BucketCreds` when running in a pre-`deploy` context. These dynamic values reference pre-existing CloudFormation Resources which would be implemented by the author in the plugin's [`package`](#package) method. +- The `secretKey` and `accessKey` variables are CloudFormation JSON referencing a set of credentials called `MyS3BucketCreds` when running in a pre-deploy context. These dynamic values reference pre-existing CloudFormation Resources which would be implemented by the author in the plugin's [`package`](#package) method. + +The variables are namespaced on the [`@architect/functions` `services()`][services] object under a property matching the plugin name; check out the [`services`][services] documentation for more details. -The variables are namespaced on the [`@architect/functions`' `services()`][services] returned object under a property equalling the plugin name; check out the [`services`][services] documentation for more details. #### Example service discovery usage with `@architect/functions` @@ -255,7 +256,7 @@ exports.handler = arc.http.async(async function getIndex (req) { > `start({ arc, inventory, invokeFunction, services }, callback)` -The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It also allows modifying the behaviour of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `services` argument. Finally, a helper method [`invokeFunction` (described in more detail below)](#invokefunction) is provided as an argument in order to allow plugin authors to invoke specific Lambdas from their plugin sandbox service code. +The plugin author must implement this method if the plugin wants to hook into the startup routine for [`sandbox`][sandbox]. This would allow plugin authors to emulate the cloud services their plugin provides in order to provide a local development experience for consumers of their plugin. It also allows modifying the behavior of [`sandbox`][sandbox]'s built-in local development services for [`@http`][http], [`@events`][events], [`@queues`][queues] and [`@tables`][tables] via the `services` argument. Finally, a helper method [`invokeFunction` (described in more detail below)](#invokefunction) is provided as an argument in order to allow plugin authors to invoke specific Lambdas from their plugin sandbox service code. This method can either be `async` or not; if the plugin author implements it as `async`, then the final `callback` argument may be ignored. Otherwise, the `callback` argument should be invoked once the plugin's sandbox service is ready. @@ -268,7 +269,7 @@ All arguments arrive as a bag of options with the following properties: |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| |`invokeFunction`|A helper method that can be used for invoking any cloud functions (AWS Lambdas) your plugin manages during runtime in a local development context inside [`sandbox`][sandbox]. Please see the [`invokeFunction`](#invokefunction) section for details on this method.| -|`services`|An object containing `http`, `events` and `tables` properties that represent local servers that [`sandbox`][sandbox] manages to provide a local development experience. A plugin author may want to modify the behaviour of these pre-existing services in order for their plugin to provide a better local development experience. `http` is an instance of the npm package [`router`][router] and mocks API Gateway and Lambda. `events` is a Node.js HTTP server that mocks SNS and SQS by listening for JSON payloads and marshaling them to the relevant Lambda functions (see its [listener module](https://github.com/architect/sandbox/blob/master/src/events/_listener.js) for more details). `tables` is an instance of the npm package [`dynalite`][dynalite] and mocks DynamoDB.| +|`services`|An object containing `http`, `events` and `tables` properties that represent local servers that [`sandbox`][sandbox] manages to provide a local development experience. A plugin author may want to modify the behavior of these pre-existing services in order for their plugin to provide a better local development experience. `http` is an instance of the npm package [`router`][router] and mocks API Gateway and Lambda. `events` is a Node.js HTTP server that mocks SNS and SQS by listening for JSON payloads and marshaling them to the relevant Lambda functions (see its [listener module](https://github.com/architect/sandbox/blob/master/src/events/_listener.js) for more details). `tables` is an instance of the npm package [`dynalite`][dynalite] and mocks DynamoDB.| |`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service is ready| #### Example `start` implementation @@ -291,7 +292,7 @@ All arguments arrive as a bag of options with the following properties: |---|---| |`arc`|Object representing the [parsed Architect project manifest](https://github.com/architect/parser) file for the current project| |`inventory`|An [Architect inventory object][inv] representing the current Architect project| -|`services`|[`sandbox`][sandbox] runs [local in-memory servers to mock out http, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| +|`services`|[`sandbox`][sandbox] runs [local in-memory servers to mock out HTTP, events, queues and database functionality](https://github.com/architect/sandbox/blob/master/src/sandbox/index.js#L19-L24); if you need to modify these services, use this argument| |`callback`|Can be ignored if the method implementation is an `async function`; otherwise, `callback` must be invoked once the plugin's local development `sandbox` service has been shut down| diff --git a/src/views/docs/en/guides/frontend/http-functions.md b/src/views/docs/en/guides/frontend/http-functions.md index b77ea8dd..11b3f3aa 100644 --- a/src/views/docs/en/guides/frontend/http-functions.md +++ b/src/views/docs/en/guides/frontend/http-functions.md @@ -237,9 +237,8 @@ return { By default, all HTTP functions (as well as all other functions) generated with Architect have one generated [IAM role](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) with the least privilege possible to operate. This means HTTP functions can only access other resources defined in the same Architect project. -Wider account access can be explicitly granted with custom resource policies, [defined in a .arc-config file](/en/reference/architect-manifest-and-config/function-config-file) placed in the HTTP function directory. +Wider account access can be explicitly granted with custom resource policies, [defined in a `config.arc` file](/en/reference/architect-manifest-and-config/function-config-file) placed in the HTTP function directory. ## Examples ADD ME! - diff --git a/src/views/docs/en/guides/frontend/websocket-functions.md b/src/views/docs/en/guides/frontend/websocket-functions.md index 4edefd2a..fbd7e4e8 100644 --- a/src/views/docs/en/guides/frontend/websocket-functions.md +++ b/src/views/docs/en/guides/frontend/websocket-functions.md @@ -13,7 +13,7 @@ sections: WebSockets provide a persistent connection between a client and a server. When we need persistent real-time data, we create a web socket server and then a connecting client for the two endpoints to exchange messages back-and-forth. -We accomplish this by using [API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-overview.html), which assembles client connections for HTTP functions. WebSockets can now be an event source for Lambda. In other words, you can now add WebSockets to your application without running, maintaining, and operating servers/containers/VMs. +We accomplish this by using [API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-overview.html), which assembles client connections for HTTP functions. WebSockets can now be an event source for Lambda. In other words, you can now add WebSockets to your application without running, maintaining, and operating servers / containers / VMs. Architect provides endpoints pre-configured with Lambda handler functions deployed and ready to iterate, complete with local development and isolated staging and production environments. @@ -245,7 +245,3 @@ exports.handler = async function connected(event) { return {statusCode: 200} } ``` - - - - diff --git a/src/views/docs/en/reference/app.arc/app.md b/src/views/docs/en/reference/app.arc/app.md index eeb87738..3b0daea6 100644 --- a/src/views/docs/en/reference/app.arc/app.md +++ b/src/views/docs/en/reference/app.arc/app.md @@ -1,6 +1,6 @@ --- title: '@app' -description: Define the application namespace. +description: Define the application namespace --- `@app` declares the application namespace diff --git a/src/views/docs/en/reference/app.arc/macros.md b/src/views/docs/en/reference/app.arc/macros.md index 99122f98..291f823e 100644 --- a/src/views/docs/en/reference/app.arc/macros.md +++ b/src/views/docs/en/reference/app.arc/macros.md @@ -3,7 +3,7 @@ title: '@macro' description: Extend Architect app functionality --- -Extend the functionality of your Architect app with standard CloudFormation. The `@macro` primitive allows developers to add any resources or modify existing ones extending Architect into the entire AWS ecosystem supported by CloudFormation. Macros also allow you to look for custom directives and add pre deploy steps. You can find some examples in our [github](https://github.com/architect/?q=macro-&type=source). +Extend the functionality of your Architect app with standard CloudFormation. The `@macro` primitive allows developers to add any resources or modify existing ones extending Architect into the entire AWS ecosystem supported by CloudFormation. Macros also allow you to look for custom directives and add pre-deploy steps. You can find some examples in our [GitHub](https://github.com/architect/?q=macro-&type=source). ## Getting started diff --git a/src/views/docs/en/reference/app.arc/scheduled.md b/src/views/docs/en/reference/app.arc/scheduled.md index 79271586..7b4e3c01 100644 --- a/src/views/docs/en/reference/app.arc/scheduled.md +++ b/src/views/docs/en/reference/app.arc/scheduled.md @@ -35,6 +35,7 @@ myapp daily-update-buddy rate(1 day) friyay-only cron(0 15 ? * FRI *) ``` + @@ -50,12 +51,14 @@ friyay-only cron(0 15 ? * FRI *) "friyay-only": "cron(0 15 ? * FRI *)" } } ``` +
toml
+ ```toml app="myapp" @@ -63,6 +66,7 @@ app="myapp" daily-update-buddy="rate(1 day)" friyay-only="cron(0 15 ? * FRI *)" ``` +
@@ -76,6 +80,7 @@ scheduled: - daily-update-buddy: rate(1 day) - friyay-only: cron(0 15 ? * FRI *) ``` + diff --git a/src/views/docs/en/reference/app.arc/tables.md b/src/views/docs/en/reference/app.arc/tables.md index 7df746d8..ad770549 100644 --- a/src/views/docs/en/reference/app.arc/tables.md +++ b/src/views/docs/en/reference/app.arc/tables.md @@ -45,7 +45,7 @@ Define a `stream true` property under a table definition to have Architect creat Define a `encrypt` property under a table definition to enable [encryption at rest][encryption] for your DynamoDB table. If `encrypt` is a boolean (i.e. `encrypt true`), then AWS will manage the encryption key. If a non-boolean is provided to `encrypt` (i.e. `encrypt hithere`), then the parameter is assumed to be an [AWS Key Management Service][kms] custom [master key ID](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id). -> Note: use of a custom master key will apply additional AWS KMS-related charges +> Note: use of a custom master key will apply additional AWS KMS related charges ### Time To Live diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index 4507d30f..c71abb49 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -1,6 +1,6 @@ --- title: '@ws' -description: Defin WebSocket endpoints +description: Define WebSocket endpoints --- Define WebSocket endpoint and Lambda handler functions. diff --git a/src/views/docs/en/reference/config.arc/runtime.md b/src/views/docs/en/reference/config.arc/runtime.md index 76bdb2ed..c78b66ec 100644 --- a/src/views/docs/en/reference/config.arc/runtime.md +++ b/src/views/docs/en/reference/config.arc/runtime.md @@ -3,17 +3,17 @@ title: '@aws runtime' description: Lambda function configuration --- -Configure Lambda function `runtime`: +Configure Lambda function `runtime`: -- `nodejs12.x` (default) +- `nodejs14.x` (default) - `deno` - `python3.8` - `ruby2.5` -Also configurable but not supported by the sandbox: +Also configurable but not supported by Architect Sandbox: - `java8` -- `go1.x` +- `go1.x` - `dotnetcore2.1` ## Example diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.md index 26b5a021..ae65cbc8 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.md @@ -5,7 +5,7 @@ description: Node runtime helpers Architect runtime helpers are optional but they do make working with CloudFormation provisioned resources nicer. CloudFormation resources are generated with names more friendly for machines than people. Other frameworks leave resource discovery up to end users which leads to ad hoc implementations becoming a frequent bug vector. Architect treats runtime discovery as a first class concern. -> Amazon Resource Names (ARNs) are available at runtime to all Lambda functions defined in the same `app.arc`. Things such as DynamoDB tables, SNS topics, SQS queues, API Gateway endpoints, and S3 static bucket ARNs are baked into `@architect/functions` so your runtime program logic interacts with resources using people friendly and readable names defined in the `app.arc` file. +> Amazon Resource Names (ARNs) are available at runtime to all Lambda functions defined in the same Architect project manifest. Things such as DynamoDB tables, SNS topics, SQS queues, API Gateway endpoints, and S3 static bucket ARNs are baked into `@architect/functions` so your runtime program logic interacts with resources using readable, people-friendly names defined in your Architect project manifest. ## Setup @@ -23,242 +23,400 @@ let arc = require('@architect/functions') ## API -- [`arc.static`](#arc.static) Get a `@static` asset path -- [`arc.http.async`](#arc.http.async) Middleware for `@http` functions +- [`arc.events`](#arc.events) Publish / subscribe helpers for `@events` functions +- [`arc.http`](#arc.http) Middleware and request/response normalization for `@http` functions using callbacks +- [`arc.http.async`](#arc.http.async) Middleware and request/response normalization for `@http` functions using `async/await` - [`arc.http.express`](#arc.http.express) Express support for `@http` functions -- [`arc.http.proxy`](#arc.http.proxy) Middleware for `@static` assets - [`arc.http.session`](#arc.http.session) Sessions for `@http` functions +- [`arc.queues`](#arc.queues) Publish/subscribe helpers for `@queues` functions +- [`arc.services`](#arc.services) Retrieves the Architect service map, exposing metadata for all services making up the application +- [`arc.static`](#arc.static) Get a `@static` asset path - [`arc.tables`](#arc.tables) Generates a DynamoDB client for `@tables` -- [`arc.events`](#arc.events) Publish/subscribe helpers for SNS `@events` functions -- [`arc.queues`](#arc.queues) Publish/subscribe helpers for SQS `@queues` functions - [`arc.ws`](#arc.ws) WebSocket helpers for `@ws` functions -- [`arc.services`](#arc.services) Retrieves the Architect service map, exposing metadata for all services making up the application -### `arc.static` -Get a static asset path: +### `arc.events` -```javascript -let css = arc.static('/index.css') -``` +Publish & subscribe helpers for `@events` functions. -### `arc.http.async` -Middleware with `async` functions is defined on `arc.http.async` with middleware functions as parameters. The returned function adheres to the expected AWS Lambda function signature. A function can exit the middleware queue early by returning an HTTP response. +#### `arc.events.subscribe` + +Subscribe to events with a handler function. The function will be passed an `event` object, and, if not an `async` function, a callback to be called upon completion. + + +##### Examples ```javascript +// async let arc = require('@architect/functions') -exports.handler = arc.http.async(auth, handler) +exports.handler = arc.events.subscribe(handler) -async function auth(request) { - if (!request.session.account) { - return { status: 403 } - } +async function handler (event) { + console.log(event) + return } +``` -async function handler(request) { - return { - json: { ok: true } - } +```javascript +// continuation passing +let arc = require('@architect/functions') + +exports.handler = arc.events.subscribe(handler) + +function handler (event, callback) { + console.log(event) + callback() } ``` -#### Request -The incoming request object is [the standard API Gateway request](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) with a few enhancements: +#### `arc.events.publish` -- `body` is automatically parsed -- `session` automatically parsed from the request cookie +Publish an event to an `@events` function. An object containing two properties is required: +- **`name`** (string) - name of the `@events` function you'd like to publish to +- **`payload`** (object or array) - payload to be published -#### Response -Architect honors the standard API Gateway response payload parameters: +##### Examples -- `statusCode` -- `headers` -- `body` -- `isBase64Encoded` +```javascript +// async +let arc = require('@architect/functions') -And adds the following clean convenience params: +await arc.events.publish({ + name: 'hit-counter', + payload: { hits: 1 }, +}) +``` +```javascript +// continuation passing +let arc = require('@architect/functions') -- `cacheControl` sets the `Cache-Control` header -- `css` sets the `Content-Type` header to `text/css; charset=utf8` -- `code` alias for `statusCode` -- `cors` sets the `Access-Control-Allow-Origin` header to `*` -- `html` sets the `Content-Type` header to `text/html; charset=utf8` -- `js` sets the `Content-Type` header to `text/javascript; charset=utf8` -- `json` sets the `Content-Type` header to `application/json` -- `session` write a value to the session -- `status` also an alias for `statusCode` -- `text` sets the `Content-Type` header to `text/plain; charset=utf8` -- `type` sets the `Content-Type` header -- `xml` sets the `Content-Type` header to `text/xml; charset=utf8` +arc.events.publish({ + name: 'hit-counter', + payload: { hits: 1 }, +}, (err) => console.log) +``` -### `arc.http.express` +--- -[Express](https://expressjs.com) migration helper. +### `arc.http` -```javascript -let arc = require('@architect/functions') -let express = require('express') +`arc.http` provides middleware and request/response normalization for `@http` functions using Express-style callbacks. -let app = express() -app.get('/', (req, res) => res.send('Hello World!')) -app.get('/cool', (req, res)=> res.send('very cool')) +#### Requests -exports.handler = arc.http.express(app) -``` +`arc.http` (and `arc.http.async`) provide the following: +- Support for request formats from both AWS API Gateway `HTTP` and `REST` APIs +- Backward-compatibility for `REST` API properties in `HTTP` APIs, enabling seamless API upgrades +- Added conveniences, such as automatic parsing of `req.body` +- Added properties commonplace in other web servers, such as `req.params` (as opposed to the much more verbose `req.queryStringParameters`) + +Handler functions passed to `arc.http[.async]` receive a `request` object containing all of the [API Gateway request properties](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) specific to `HTTP` and `REST` APIs. Additionally, the following properties are added or improved for convenience: + + +- `body` - **object** + - Automatically parsed if present; `{}` if request has no body +- `method` (alias of `httpMethod`) - **string** + - HTTP method of the request: `GET`, `POST`, `PATCH`, `PUT`, or `DELETE` +- `params` (alias of `pathParameters`) - **object** + - Any URL params, if defined in your HTTP function's path (e.g. `product` in `/shop/:product`); `{}` if request has no path parameters + - Example: `{ product: 'chocolate-chip-cookies' }` +- `path` - **string** + - Root-relative path of the URL being requested + - Example: `/shop/chocolate-chip-cookies` +- `query` (alias of `queryStringParameters`) - **object** + - Any query params if present in the client request; `{}` if request has no query parameters + - Example: `{ someParam: someValue }` +- `session` - **object** + - Automatically parsed from the request cookie; `{}` if no `session` is found for the requesting client + - Example: `{ accountID: 'a1b2c3' }` +- Additional backward-compatible `REST` properties available in `HTTP` APIs via `arc.http[.async]`: + - `resource` (an alias of `req.routeKey`) + - `path` (an alias of `req.rawPath`) + + + +> Caveat: Architect Functions does not deal in compatibility with `req.requestContext`; request context semantics are specific to the version of API Gateway in use (`REST` or `HTTP`) + +> Learn more about [API Gateway request payloads here](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) + + +#### Responses + +`arc.http` (and `arc.http.async`) honor the standard [API Gateway response payload properties](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) (`statusCode`, `headers`, `body`, etc.), in addition to adding the following convenience properties: + +- `cacheControl` - **string** + - Sets the `cache-control` header (or overrides it if already present) +- `cookie` - **string** + - Sets the `set-cookie` header (or overrides it if already present) +- `cors` - **boolean** + - Sets the `access-control-allow-origin` header to `*` (or overrides it if already present) +- `status`, `code` (alias of `statusCode`) - **number** + - Sets the response HTTP status code +- `session` - **object** + - Create or overwrite a client session +- `type` - **string** + - Sets the `content-type` header (or overrides it if already present) + +Additionally, you may also pass the following content properties (instead of manually setting `statusCode`, `headers`, and `body`): + +- `css` - **string** + - Sets the `content-type` header to `text/css; charset=utf8` +- `html` - **string** + - Sets the `content-type` header to `text/html; charset=utf8` +- `js` - **string** + - Sets the `content-type` header to `text/javascript; charset=utf8` +- `json` - **object or array** + - JSON-encodes the object or array and sets the `content-type` header to `application/json; charset=utf8` +- `text` - **string** + - Sets the `content-type` header to `text/plain; charset=utf8` +- `xml` - **string** + - Sets the `content-type` header to `text/xml; charset=utf8` -### `arc.http.proxy` +Finally, you may also return a raw JavaScript Error, which will be interpreted as a status `500`, and output the `message` and `stack` in HTML. -Middleware for serving `@static` folder assets. +> Learn more about [API Gateway response payloads here](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) + + +#### API + +Define `arc.http` middleware by passing one or more functions as parameters. A function can exit the middleware queue early by calling back with a [valid HTTP response payload](#responses). + +`arc.http` functions are positionally provided three properties: +- `request` - **object** + - [Request object](#requests); mutations to the `request` object **are not** passed along +- `response` - **function** + - Callback that accepts either a [response object](#response) or Error +- `next` - **function** (if not the final middleware) + - Callback to invoke the next `arc.http` middleware function + + +##### Examples ```javascript +// single function let arc = require('@architect/functions') -let asap = arc.http.proxy({ - spa: false, - alias: { - '/playground': '/playground.html' - } -}) +exports.handler = arc.http(handler) -exports.handler = arc.http.async(asap) +function handler(req, res) { + res({ + json: { ok: true } + }) +} ``` -### `arc.http.session` +```javascript +// middleware +let arc = require('@architect/functions') -Read the current session in an `@http` request and write it back to a cookie. +exports.handler = arc.http(auth, handler) -```javascript -async function handler (req) { - // read the session - let session = await arc.http.session.read(req) - // save the session into a cookie string - let cookie = await arc.http.session.write({ count: 1 }) - // write the cookie to the browser - return { - statusCode: 200, - headers: { 'set-cookie': cookie }, +function auth(req, res, next) { + if (!request.session.accountID) { + res({ status: 403 }) } + else next() +} + +function handler(req, res) { + res({ + json: { ok: true } + }) } ``` -Please note that session variable encoding and decoding relies on the -`ARC_APP_SECRET` [environment variable](../cli/env) being set to something -secret and not easily guessable. If you use this method, please be sure to [set -the `ARC_APP_SECRET` environment variable](../cli/env)! +--- -### `arc.tables` +### `arc.http.async` -Create a DynamoDB client for `@tables`. -Given the following `app.arc` file: +#### API -```arc -@app -testapp +Define `arc.http.async` middleware by passing one or more `async` functions as parameters. A function can exit the middleware queue early by returning a [valid HTTP response payload](#responses)). -@tables -notes - personID *String - noteID **String -``` +`arc.http.async` functions are provided two properties: +- `request` - **object** + - [Request object](#requests); mutations to the `request` object **are** passed along +- `context` - **object** + - Standard API Gateway context object -Generate a data access layer: +Each middleware function can invoke the following function by returning the `request` object, or by reaching the end of execution. + + +##### Examples ```javascript +// single function let arc = require('@architect/functions') -let data = await arc.tables() + +exports.handler = arc.http.async(handler) + +async function handler(request) { + return { + json: { ok: true } + } +} ``` -For the example above the generated API is: +```javascript +// middleware +let arc = require('@architect/functions') -- `data.notes.get` -- `data.notes.query` -- `data.notes.scan` -- `data.notes.put` -- `data.notes.delete` -- `data.notes.update` +exports.handler = arc.http.async(auth, handler) -> The generated client is facade for AWS.DynamoDB.DocumentClient. The `delete` and `get` methods take a single parameter that is passed on to the `params.Key` attribute in the corresponding DocumentClient method. The `put` method takes a single parameter that is passed on as the `params.Item` attribute in the DocumentClient.put method. The `query`, `scan`, and `update` methods simply pass the `params` argument with the `TableName` parameter prepopulated. See the official DynamoDB documentation for all available parameters. +async function auth(req) { + if (!req.session.accountID) { + return { status: 403 } + } +} -The generated data layer also allows direct access to DynamoDB through a few methods: +async function handler(req) { + return { + json: { ok: true } + } +} +``` -- `data._db` which returns an instance of [`AWS.DynamoDB`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) -- `data._doc` returns an instance of [`AWS.DynamoDB.DocumentClient`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html) -- `data.name` helper function that returns a `@table` resource name when you need to go lower level. For example use `data.name("my-table")` to get the name of the "my-table" `@table` resource. (Previously called `data._name` which is now deprecated.) +--- -### `arc.events` +### `arc.http.express` + +[Express](https://expressjs.com) migration helper. -Subscribe to an SNS topic + +##### Examples ```javascript let arc = require('@architect/functions') +let express = require('express') -exports.handler = arc.events.subscribe(handler) +let app = express() +app.get('/', (req, res) => res.send('Hello World!')) +app.get('/cool', (req, res)=> res.send('very cool')) -async function handler (event) { - console.log(event) -} +exports.handler = arc.http.express(app) ``` -Publish to an SNS topic +--- + +### `arc.http.session` + +`arc.http.session` provides methods for reading the current session in an `@http` request, and writing it back to a cookie. + +These operations are automatically handled for you when using `arc.http[.async]`; only use `arc.http.session` if you prefer handling session reads and writes yourself. + +#### API + +- `read(request[, callback]) → [Promise]` + - Accepts a [request object](#requests) + - Returns `session` object (or `{}` if none is found) + - Must be `await`ed if no callback is provided +- `write(session[, callback]) → [Promise]` + - Returns a `cookie` string + - Must be `await`ed if no callback is provided + +> Please note that session variable encoding and decoding relies on the `ARC_APP_SECRET` [environment variable](../cli/env) being set to something secret and not easily guessable. If you use Architect sessions, please be sure to [set the `ARC_APP_SECRET` environment variable](../cli/env)! + + +##### Examples ```javascript let arc = require('@architect/functions') -await arc.events.publish({ - name: 'hit-counter', - payload: {hits: 1}, -}) +module.exports = async function handler (req) { + // read the session + let session = await arc.http.session.read(req) + + // save the session and get back a cookie + let cookie = await arc.http.session.write({ count: 1 }) + + // set the client's cookie + return { + statusCode: 200, + headers: { 'set-cookie': cookie }, + } +} ``` +--- + ### `arc.queues` -Subscribe to an SQS queue +Publish & subscribe helpers for `@queues` functions. + + +#### `arc.queues.subscribe` + +Subscribe to queues with a handler function. The function will be passed an `event` object, and, if not an `async` function, a callback to be called upon completion. + + +##### Examples ```javascript +// async let arc = require('@architect/functions') exports.handler = arc.queues.subscribe(handler) async function handler (event) { console.log(event) + return } ``` -Publish to an SQS queue - ```javascript +// continuation passing let arc = require('@architect/functions') -await arc.queues.publish({ - name: 'hit-counter', - payload: {hits: 1}, -}) +exports.handler = arc.queues.subscribe(handler) + +function handler (event, callback) { + console.log(event) + callback() +} ``` -### `arc.ws` -Send a message over WebSockets. +#### `arc.queues.publish` + +Publish an event to an `@queues` function. An object containing two properties is required: +- **`name`** (string) - name of the `@queues` function you'd like to publish to +- **`payload`** (object or array) - payload to be published + + +##### Examples ```javascript +// async let arc = require('@architect/functions') -await arc.ws.send({ - id: connectionId, - payload: { message: 'hai 🐶' } +await arc.queues.publish({ + name: 'hit-counter', + payload: { hits: 1 }, }) ``` +```javascript +// continuation passing +let arc = require('@architect/functions') + +arc.queues.publish({ + name: 'hit-counter', + payload: { hits: 1 }, +}, (err) => console.log) +``` + +--- ### `arc.services` -> NOTE: this API requires `@architect/functions` version 3.14.0 or newer. +Retrieves the Architect service map: an object mapping the plugins and out-of-the-box Architect infrastructure that makes up the application. -A function that retrieves the service map: an object mapping plugin or out-of-the-box Architect infrastructure data making up the Architect application. This object is lazily-loaded and cached and thus the first call may incur a delay as the service map is populated (use of [`arc.events`](#arc.events), [`arc.queues`](#arc.queues) and [`arc.tables`](#arc.tables) transparently uses this method in the background). +This object is lazily-loaded and cached, and thus the first call may incur a delay as the service map is populated (use of [`arc.events`](#arc.events), [`arc.queues`](#arc.queues) and [`arc.tables`](#arc.tables) transparently uses this method in the background). `arc.services` returns a service map object, with keys equaling any out-of-the-box Architect infrastructure types or plugins used by the Architect application. An example service map for an application composed of `@static`, `@events` and an `imagebucket` plugin would have the following structure: @@ -269,18 +427,137 @@ let services = await arc.services() console.log(services) /* logs out: { - imagebucket: { // a plugin named 'imagebucket' exposing some service discovery variables + // a plugin named 'imagebucket' exposing some service discovery variables + imagebucket: { accessKey: 'someAccessKey', name: 'arc-plugin-s3-image-bucket-example-image-buket', secretKey: 'someSecretKey' }, - static: { // built-in @static service discovery variables + // built-in @static service discovery variables + static: { bucket: 'arcplugins3imagebucketexamplestaging-staticbucket-g8rsuk82ancj', fingerprint: 'false' }, - events: { // built-in @events service discovery variables + // built-in @events service discovery variables + events: { myevent: 'https://some-sns-url.amazon.us-east-2.com' } } */ ``` + +--- + +### `arc.static` + +Returns the path of a given static asset, intended for use with static asset fingerprinting (`@static fingerprint true`). + + +#### API + +Accepts two parameters: +- `asset` - **string** + - The root-relative path of the asset you'd like to load +- `options` - **object** that may contain the following properties: + - `stagePath` - **boolean** + - `REST` API compatibility option, enables prepending of the API stage + + +##### Examples + +```javascript +let css = arc.static('/index.css') +// '/_static/index-a1b2c3.css' + +let js = arc.static('/index.js', { stagePath: true }) +// '/staging/_static/index-b2c3d4.js' +``` + +--- + +### `arc.tables` + +Creates a DynamoDB client for your application's `@tables`. The client is an object, containing a nested object for each table; each table has the following methods: + +- `get(key[, callback]) → [Promise]` + - Get a single row by primary key (and secondary index) + - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#get-property) +- `query(query[, callback]) → [Promise]` + - Query a table by passing a full document query object + - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#query-property) +- `scan([options][, callback]) → [Promise]` + - Scan the entire table; accepts document filter object + - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#scan-property) +- `put(record[, callback]) → [Promise]` + - Create or replace a record + - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-property) +- `delete(key[, callback]) → [Promise]` + - Delete a record + - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#delete-property) +- `update(record[, callback]) → [Promise]` + - Upsert a record; accepts document update object + - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#update-property) +- `name(tablename)` + - Helper function that accepts a table name string, and returns an AWS resource name when you need to go lower level + - For example use `data.name('my-table')` to get the human-unfriendly AWS name of the `my-table` `@table` resource + - Previously called `data._name`, which is now deprecated +- `_db(thing[, callback]) → [Promise]` + - An instance of [`AWS.DynamoDB`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) +- `_doc(thing[, callback]) → [Promise]` + - An instance of [`AWS.DynamoDB.DocumentClient`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html) + +> The generated client is facade for AWS.DynamoDB.DocumentClient. The `delete` and `get` methods take a single parameter that is passed on to the `params.Key` attribute in the corresponding DocumentClient method. The `put` method takes a single parameter that is passed on as the `params.Item` attribute in the DocumentClient.put method. The `query`, `scan`, and `update` methods simply pass the `params` argument with the `TableName` parameter prepopulated. See the official DynamoDB documentation for all available parameters. + + +##### Examples + +Given the following `app.arc` file: + +```arc +@app +testapp + +@tables +notes + personID *String + noteID **String +``` + +You'd generate a data access layer like so: + +```javascript +let arc = require('@architect/functions') +let data = await arc.tables() +/* +{ + data.notes.get, + data.notes.query, + data.notes.scan, + data.notes.put, + data.notes.delete, + data.notes.update, + data.notes.name, + data.notes._db, + data.notes._doc, +} +*/ +``` + +--- + +### `arc.ws` + +Send a message via WebSocket ([`@ws`](/docs/en/reference/app.arc/ws)). An object containing two properties is required: +- **`id`** (string) - API Gateway `connectionId` of the client you'd like to send the message to +- **`payload`** (object or array) - payload to be sent (as JSON) + +#### Examples + +```javascript +let arc = require('@architect/functions') + +await arc.ws.send({ + id: connectionId, + payload: { message: 'hai 🐶' } +}) +``` From 3f53244a3aef3fd808544e73351b28ae0e9ee23e Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 28 Jul 2021 16:02:46 -0700 Subject: [PATCH 086/680] Rename Node.js runtime utils doc --- src/views/docs/en/reference/runtime/{node.md => node.js.md} | 6 +++--- src/views/docs/table-of-contents.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/views/docs/en/reference/runtime/{node.md => node.js.md} (99%) diff --git a/src/views/docs/en/reference/runtime/node.md b/src/views/docs/en/reference/runtime/node.js.md similarity index 99% rename from src/views/docs/en/reference/runtime/node.md rename to src/views/docs/en/reference/runtime/node.js.md index ae65cbc8..8726b791 100644 --- a/src/views/docs/en/reference/runtime/node.md +++ b/src/views/docs/en/reference/runtime/node.js.md @@ -1,6 +1,6 @@ --- -title: Node -description: Node runtime helpers +title: Node.js +description: Node.js runtime helpers --- Architect runtime helpers are optional but they do make working with CloudFormation provisioned resources nicer. CloudFormation resources are generated with names more friendly for machines than people. Other frameworks leave resource discovery up to end users which leads to ad hoc implementations becoming a frequent bug vector. Architect treats runtime discovery as a first class concern. @@ -9,7 +9,7 @@ Architect runtime helpers are optional but they do make working with CloudFormat ## Setup -Install the Architect runtime helpers for Node: +Install the Architect runtime helpers for Node.js: ```bash npm install @architect/functions diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index e028dd93..29cf0d03 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -48,7 +48,7 @@ let Guides = [ { let Reference = [ { 'Runtime': [ - 'Node', + 'Node.js', 'Deno', 'Ruby', 'Python' From e38e50e8e35daf444171a06187903a7fd033f569 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 28 Jul 2021 17:00:33 -0700 Subject: [PATCH 087/680] Add ASAP docs --- .../docs/en/reference/runtime/node.js.md | 83 ++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/reference/runtime/node.js.md b/src/views/docs/en/reference/runtime/node.js.md index 8726b791..938f181e 100644 --- a/src/views/docs/en/reference/runtime/node.js.md +++ b/src/views/docs/en/reference/runtime/node.js.md @@ -3,10 +3,21 @@ title: Node.js description: Node.js runtime helpers --- -Architect runtime helpers are optional but they do make working with CloudFormation provisioned resources nicer. CloudFormation resources are generated with names more friendly for machines than people. Other frameworks leave resource discovery up to end users which leads to ad hoc implementations becoming a frequent bug vector. Architect treats runtime discovery as a first class concern. +Architect runtime helpers are optional, and designed to make it significantly easier to work with AWS CloudFormation provisioned resources and related assets. + +CloudFormation resources are generated with names more friendly for machines than people. Other frameworks leave resource discovery up to end users, which leads to ad hoc implementations becoming a frequent bug vector. Architect treats runtime discovery as a first class concern. > Amazon Resource Names (ARNs) are available at runtime to all Lambda functions defined in the same Architect project manifest. Things such as DynamoDB tables, SNS topics, SQS queues, API Gateway endpoints, and S3 static bucket ARNs are baked into `@architect/functions` so your runtime program logic interacts with resources using readable, people-friendly names defined in your Architect project manifest. +Architect has two primary runtime helpers for Node.js: + +- [`@architect/functions`](#%40architect%2Ffunctions) - General purpose runtime helpers for various Architect resources, such as `@http`, `@tables`, etc. +- [`@architect/asap`](#%40architect%2Fasap) - Helper designed solely for delivering static assets via `@http` endpoints + +--- + +# `@architect/functions` + ## Setup Install the Architect runtime helpers for Node.js: @@ -21,6 +32,7 @@ Ensure `arc` is available to your Lambda function code: let arc = require('@architect/functions') ``` + ## API - [`arc.events`](#arc.events) Publish / subscribe helpers for `@events` functions @@ -328,7 +340,7 @@ These operations are automatically handled for you when using `arc.http[.async]` ```javascript let arc = require('@architect/functions') -module.exports = async function handler (req) { +exports.handler = async function handler (req) { // read the session let session = await arc.http.session.read(req) @@ -561,3 +573,70 @@ await arc.ws.send({ payload: { message: 'hai 🐶' } }) ``` + +--- + +# `@architect/asap` + +## Setup + +Install the Architect static asset proxy (ASAP) for Node.js: + +```bash +npm install @architect/asap +``` + + +### API + +ASAP takes an optional configuration object with the following properties and returns an `async` Lambda handler: + +- `alias` - **object** + - Map of paths or files to alias to different paths + - Example: `{ '/an-asset.jpg': '/a-different-filename.jpg' }` +- `assets` - **object** + - Map of fingerprinted static assets; defaults to using the Arc-generated `static.json` + - Example: `{ 'some-file.gif': 'some-file-a1b2c3.gif' }` +- `bucket` - **object** containing the following properties: + - `staging` - **string** (required) + - Staging environment bucket name + - `production` - **string** (required) + - Production environment bucket name + - `folder` - **string** (optional) + - Folder path to treat as the root of all requests +- `cacheControl` - **string** + - Sets the cache-control header, overriding ASAP's default, content-aware cache-control header +- `headers` - **object** + - Set response headers + - Example: `{ 'some-header': 'ok=true' }` +- `passthru` - **boolean** (defaults to `false`) + - Return null if asset is not found (defaults to false) +- `spa` - **boolean** (defaults to `false`) + - Enable single page app mode, all page requests deliver `/index.html` + + +##### Examples + +```javascript +// basic usage +let asap = require('@architect/asap') +let params = { cacheControl: 'max-age=0' } +exports.handler = asap(params) +``` + +```javascript +// asap as arc.http.async middleware +let arc = require('@architect/functions') +let asap = require('@architect/asap')() + +exports.handler = arc.http.async(render, asap) + +async function render (req) { + // If user is logged in, show them a custom logged in page + if (req.path === '/' && req.session.account) { + return { html: `Hello ${req.session.account.name}!` } + } + // Otherwise, load the logged out static page + return +} +``` From 6911d914a5328893d6981c0ddb879dc636015b08 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 28 Jul 2021 20:05:07 -0700 Subject: [PATCH 088/680] Ensure spellcheck runs in tests --- package.json | 17 +++++-- public/index.js | 106 +++++++++++++++++++++---------------------- public/playground.js | 14 +++--- test/base-test.js | 6 --- 4 files changed, 73 insertions(+), 70 deletions(-) delete mode 100644 test/base-test.js diff --git a/package.json b/package.json index e52382ea..ef96e77b 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,18 @@ "fingerprint": true }, "http": [ - [ "get", "/docs/:lang/*" ], - [ "get", "/api/package" ], - [ "any", "/*" ] + [ + "get", + "/docs/:lang/*" + ], + [ + "get", + "/api/package" + ], + [ + "any", + "/*" + ] ] }, "scripts": { @@ -24,7 +33,7 @@ "spellcheck": "cross-env npx spellchecker './src/views/docs/en/**/*.md' --no-suggestions -q -d ./scripts/dictionary.js --plugins spell indefinite-article repeated-words syntax-mentions syntax-urls", "lint": "eslint src --fix", "start": "sandbox", - "test": "tape -r esm test/*-test.js test/**/*.js | tap-spec" + "test": "npm run spellcheck && npm run lint && tape -r esm 'test/**/*.js' | tap-spec" }, "dependencies": { "@architect/architect": "^8.7.4", diff --git a/public/index.js b/public/index.js index 449954e1..e1d0b0e7 100644 --- a/public/index.js +++ b/public/index.js @@ -1,53 +1,53 @@ - (function(){ - // Scroll active sidebar link into view - document - .querySelector('a.active') - .scrollIntoView({ - behavior: 'smooth', - block: 'center' - }) - - // Toggle sidebar on mobile - let menuButton = document - .getElementById('menu-button') - let sidebar = document - .getElementById('sidebar') - let main = document - .getElementById('main') - - main.onclick = function hideSidebar() { - sidebar.classList.remove('open') - } - - menuButton.onclick = function toggleSidebar() { - sidebar.classList.toggle('open') - } - - // Show percentage of page read on desktop - let bar = document.querySelector('.indicator') - let isDesktop = window.innerWidth > 768 - - if (isDesktop) { - // If we want this to work on mobile - // we need to add a second function - // for handling window.onscroll - let el = main - bar.style.width = getScrollPercent(el) - el.onscroll = setReadPercent.bind(null, el) - } - - function setReadPercent(el) { - bar.style.width = `${getScrollPercent(el)}%` - } - - function getScrollPercent(el) { - let body = document.body - let scrollTop = 'scrollTop' - let scrollHeight = 'scrollHeight' - let currentTop = el[scrollTop] || body[scrollTop] - let currentHeight = (el[scrollHeight] || body[scrollHeight]) - body.clientHeight - return Math.floor((currentTop / currentHeight) * 100) - } - - - }()) +(function (){ + // Scroll active sidebar link into view + document + .querySelector('a.active') + .scrollIntoView({ + behavior: 'smooth', + block: 'center' + }) + + // Toggle sidebar on mobile + let menuButton = document + .getElementById('menu-button') + let sidebar = document + .getElementById('sidebar') + let main = document + .getElementById('main') + + main.onclick = function hideSidebar () { + sidebar.classList.remove('open') + } + + menuButton.onclick = function toggleSidebar () { + sidebar.classList.toggle('open') + } + + // Show percentage of page read on desktop + let bar = document.querySelector('.indicator') + let isDesktop = window.innerWidth > 768 + + if (isDesktop) { + // If we want this to work on mobile + // we need to add a second function + // for handling window.onscroll + let el = main + bar.style.width = getScrollPercent(el) + el.onscroll = setReadPercent.bind(null, el) + } + + function setReadPercent (el) { + bar.style.width = `${getScrollPercent(el)}%` + } + + function getScrollPercent (el) { + let body = document.body + let scrollTop = 'scrollTop' + let scrollHeight = 'scrollHeight' + let currentTop = el[scrollTop] || body[scrollTop] + let currentHeight = (el[scrollHeight] || body[scrollHeight]) - body.clientHeight + return Math.floor((currentTop / currentHeight) * 100) + } + + +}()) diff --git a/public/playground.js b/public/playground.js index 72e92649..1ba107b5 100644 --- a/public/playground.js +++ b/public/playground.js @@ -1,4 +1,4 @@ -(function() { +(function () { let btn = document.getElementById('pkg-submit') btn.remove() @@ -23,7 +23,7 @@ }()) -function copyShare(e) { +function copyShare (e) { e.preventDefault() let shareBtn = e.target let input = document.getElementById('pkg-input') @@ -31,12 +31,12 @@ function copyShare(e) { let shareUrl = `${window.location}?arc=${encodeURIComponent(arc)}` navigator.clipboard.writeText(shareUrl) shareBtn.innerHTML = 'Copied to clipboard' - setTimeout(function resetButton() { + setTimeout(function resetButton () { shareBtn.innerHTML = 'Share' }, 2000) } -async function getPreview() { +async function getPreview () { const input = document.getElementById('pkg-input') const arc = input.value const url = `/api/package?arc=${btoa(arc)}` @@ -44,17 +44,17 @@ async function getPreview() { let cfn = JSON.stringify(await (await fetch(url)).json(), null, 2) update(cfn) } - catch(e) { + catch (e) { console.error(e) } } -function submit(e) { +function submit (e) { e.preventDefault() getPreview() } -function update(cfn) { +function update (cfn) { const preview = document.getElementById('preview') preview.innerHTML = cfn } diff --git a/test/base-test.js b/test/base-test.js deleted file mode 100644 index 480ceec7..00000000 --- a/test/base-test.js +++ /dev/null @@ -1,6 +0,0 @@ -const test = require('tape') - -test('base', t => { - t.ok(true) - t.end() -}) From 09f44480f90a8a1a3c6f29910e94d0d67a14207c Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 28 Jul 2021 20:22:31 -0700 Subject: [PATCH 089/680] 3.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ef96e77b..2f672ddc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.2.6", + "version": "3.3.0", "architect": { "app": "v8-arc-codes", "aws": { From 3cf76e5a9fdd40af1c261c1eacf853a0b892b382 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Thu, 29 Jul 2021 12:50:43 -0700 Subject: [PATCH 090/680] Node.js 12.x upgrade guide notes --- src/views/docs/en/about/upgrade-guide.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index 50803da4..db8a15e8 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -20,7 +20,7 @@ As a general philosophy, Architect's core maintainers endeavor to minimize the f ### Architect 9 (La Chupacabra) -Architect 9 (La Chupacabra) is primarily a maintenance release, dropping support for the now end-of-life Node.js 10.x, and removing support for Architect 5 (and lower). +Architect 9 (La Chupacabra) is primarily a maintenance release, dropping support for Node.js 10.x (now end-of-life) and Node.js 12.x, and removing support for Architect 5 (and lower). [See below for potential impacts to upgrading](#architect-8-→-9). @@ -75,14 +75,14 @@ Architect 4 (Yeti) introduced generic, dependency-free HTTP functions, enhanced ## Architect 8 → 9 -Architect 9 (La Chupacabra) is a maintenance release, primarily aimed at removing support for the now end-of-life Node.js 10.x. With this release, after two years since the release of Architect 6, Architect 5 is no longer supported. +Architect 9 (La Chupacabra) is a maintenance release, primarily aimed at removing support for Node.js 10.x (now end-of-life) and Node.js 12.x. With this release, after two years since the release of Architect 6, Architect 5 is no longer supported. Additionally, Architect's default runtime is now `nodejs14.x` – if your existing functions do not specify a runtime, they will be automatically and seamlessly upgraded from `nodejs10.x` or `nodejs12.x` to `nodejs14.x`. ### Breaking changes -- Removed support for Node.js 10.x (now EOL, and no longer available to created in AWS Lambda) +- Removed support for Node.js 10.x (now EOL, and no longer available to created in AWS Lambda) and Node.js 12.x - `arc destroy` - `--app` must now be used to destroy apps, while `--name` may only be used to destroy stacks - Removed support for deprecated `--nuke` flag @@ -94,7 +94,7 @@ Additionally, Architect's default runtime is now `nodejs14.x` – if your existi Architect 9 is fully compatible with `@architect/functions`. However, `@architect/functions` 4.0, released alongside Architect 9, has some breaking changes: -- Removed support for Node.js 10.x (now EOL, and no longer available to created in AWS Lambda) +- Removed support for Node.js 10.x (now EOL, and no longer available to created in AWS Lambda); Node.js 12.x will continue to be supported until it is EOL in AWS Lambda - `arc.http.proxy` is now `@architect/asap`, and has been removed from `@architect/functions` 4.0 - `arc.http.proxy` calls can now be sent as-is to ASAP - For more details, please see the [@architect/functions changelog](https://github.com/architect/functions/blob/master/_changelog.md#200-2021-07-25) and [@architect/asap changelog](https://github.com/architect/asap/blob/master/_changelog.md#400-2021-07-25) From a299d28ed1823f1c7fda767482d518e5ea3b1daf Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Thu, 29 Jul 2021 12:50:47 -0700 Subject: [PATCH 091/680] 3.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f672ddc..28ccd50a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.3.0", + "version": "3.3.1", "architect": { "app": "v8-arc-codes", "aws": { From a3529a50785920dbf8c6241a828ba77fed097e99 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Thu, 29 Jul 2021 12:53:25 -0700 Subject: [PATCH 092/680] Update CI + deps --- .github/workflows/build.yml | 6 +++--- package.json | 12 ++++++------ public/static.json | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4b8ffcfd..5949b1c4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - node-version: [ 12.x, 14.x ] + node-version: [ 14.x ] os: [ ubuntu-latest ] # Go @@ -53,7 +53,7 @@ jobs: - name: Notify uses: homoluctus/slatify@master # Only fire alert once - if: github.ref == 'refs/heads/main' && failure() && matrix.node-version == '12.x' && matrix.os == 'ubuntu-latest' + if: github.ref == 'refs/heads/main' && failure() && matrix.node-version == '14.x' && matrix.os == 'ubuntu-latest' with: type: ${{ job.status }} job_name: '*Build*' @@ -76,7 +76,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 14 - name: Install run: npm i --production diff --git a/package.json b/package.json index 28ccd50a..c0544cae 100644 --- a/package.json +++ b/package.json @@ -36,12 +36,12 @@ "test": "npm run spellcheck && npm run lint && tape -r esm 'test/**/*.js' | tap-spec" }, "dependencies": { - "@architect/architect": "^8.7.4", + "@architect/architect": "^9.0.0", "@architect/eslint-config": "^1.0.0", - "@architect/functions": "^3.14.2", - "@architect/inventory": "^2.0.3", - "@architect/package": "^7.0.0", - "@architect/sandbox": "^4.0.0", + "@architect/functions": "^4.0.0", + "@architect/inventory": "^2.0.4", + "@architect/package": "^7.0.1", + "@architect/sandbox": "^4.0.1", "@toycode/markdown-it-class": "^1.2.4", "eslint": "^7.31.0", "esm": "^3.2.25", @@ -53,7 +53,7 @@ "slugify": "^1.6.0", "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", - "tape": "^5.2.2" + "tape": "^5.3.0" }, "eslintConfig": { "extends": "@architect/eslint-config" diff --git a/public/static.json b/public/static.json index 74bc7cb1..3386de2d 100644 --- a/public/static.json +++ b/public/static.json @@ -1,8 +1,8 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-9687ad7aae.js", + "index.js": "index-13d945dd48.js", "playground.html": "playground-d3d4c75ee9.html", - "playground.js": "playground-f7ed4b7710.js", + "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", "css/index.css": "css/index-d0b9d5ab0b.css", From 583159138f2b08a79af2769d122f0a19e0c7c20a Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Sat, 31 Jul 2021 13:24:23 -0600 Subject: [PATCH 093/680] use @architect/asap to proxy static playground in lieu of @architect/functions http.proxy this became an issue when dependabot updated functions to 4.0.0 --- package.json | 1 + src/http/any-catchall/index.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c0544cae..9c6452d3 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ }, "dependencies": { "@architect/architect": "^9.0.0", + "@architect/asap": "^4.0.0", "@architect/eslint-config": "^1.0.0", "@architect/functions": "^4.0.0", "@architect/inventory": "^2.0.4", diff --git a/src/http/any-catchall/index.js b/src/http/any-catchall/index.js index 39a08843..b48fad9d 100644 --- a/src/http/any-catchall/index.js +++ b/src/http/any-catchall/index.js @@ -1,14 +1,15 @@ let { http } = require('@architect/functions') +let asap = require('@architect/asap') // middleware to preserve old urls let redirect = require('./redirect') // middleware proxy s3 assets -let asap = http.proxy({ +let static = asap({ spa: false, alias: { '/playground': '/playground.html' } }) -exports.handler = http.async(redirect, asap) +exports.handler = http.async(redirect, static) From 6d07572de0196d75d5818404ca2bd38228af6763 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Sat, 31 Jul 2021 13:45:56 -0600 Subject: [PATCH 094/680] update call to highlighter.js#highlight avoid deprecation notices per https://github.com/highlightjs/highlight.js/issues/2277 --- src/http/get-docs-000lang-catchall/highlighter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/http/get-docs-000lang-catchall/highlighter.js b/src/http/get-docs-000lang-catchall/highlighter.js index 2b6481aa..162be3b4 100644 --- a/src/http/get-docs-000lang-catchall/highlighter.js +++ b/src/http/get-docs-000lang-catchall/highlighter.js @@ -1,7 +1,7 @@ module.exports = function (hljs, escapeHtml, str, lang) { if (lang && hljs.getLanguage(lang)) { try { - return `
${hljs.highlight(lang, str, true).value}
` + return `
${hljs.highlight(str, { language: lang, ignoreIllegals: true }).value}
` } catch (err) { console.error(err) From f9cd9eeafa1f5cd66a3f4169013bf85aaca4e9c0 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Sat, 31 Jul 2021 14:37:33 -0600 Subject: [PATCH 095/680] add http smoke test --- package.json | 3 ++- test/sandbox-http-test.js | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/sandbox-http-test.js diff --git a/package.json b/package.json index 9c6452d3..19b8d712 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,8 @@ "slugify": "^1.6.0", "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", - "tape": "^5.3.0" + "tape": "^5.3.0", + "tiny-json-http": "^7.3.0" }, "eslintConfig": { "extends": "@architect/eslint-config" diff --git a/test/sandbox-http-test.js b/test/sandbox-http-test.js new file mode 100644 index 00000000..d0a93398 --- /dev/null +++ b/test/sandbox-http-test.js @@ -0,0 +1,21 @@ +let test = require('tape') +let tiny = require('tiny-json-http') +let sandbox = require('@architect/sandbox') + +const host = 'http://localhost:3333' + +test('sandbox HTTP request', async t => { + t.plan(4) + + await sandbox.start({ quiet: true }) + t.ok(true, `sandbox started on ${host}`) + + let quickstart = await tiny.get({ url: `${host}/docs/en/guides/get-started/quickstart` }) + t.ok(quickstart.body, 'got quickstart document') + + let playground = await tiny.get({ url: `${host}/playground` }) + t.ok(playground.body, 'got static playground document') + + await sandbox.end() + t.ok(true, 'sandbox ended') +}) From e4a571b0621ae8cba71a3aaaca9d3bc3f410b58b Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 10 Aug 2021 13:59:04 -0700 Subject: [PATCH 096/680] Fix typo --- src/views/docs/en/reference/prefs.arc/sandbox.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/reference/prefs.arc/sandbox.md b/src/views/docs/en/reference/prefs.arc/sandbox.md index 601b6d25..8f89c388 100644 --- a/src/views/docs/en/reference/prefs.arc/sandbox.md +++ b/src/views/docs/en/reference/prefs.arc/sandbox.md @@ -7,7 +7,7 @@ description: Sandbox environment variables Define [`arc sandbox`](../cli/sandbox) preferences. If you are not using a [`.env` file](.env) then any environment variables set using the [`arc env` CLI](../cli/env) will be stored in the preferences file. In this scenario it is best _not_ to revision the preferences file in source control. -### `env` - Boolean +### `env` - String Advanced option: set the `ARC_ENV` + `NODE_ENV` stage to `staging` or `production` and use the env vars for that stage (see the `@env` pragma above); if not specified, defaults to `testing`. This setting may introduce unexpected side effects, so only use it if you have a specific technical reason. @@ -34,4 +34,4 @@ Disables hydration ```arc @sandbox no-hydrate true -``` \ No newline at end of file +``` From c7bcd203e6ebb7d868cc3958c9e78b2ad5e6814a Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 10 Aug 2021 13:59:07 -0700 Subject: [PATCH 097/680] 3.3.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19b8d712..bec5f5c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.3.1", + "version": "3.3.2", "architect": { "app": "v8-arc-codes", "aws": { From bafa999e2d2eed37c2b162a41c1f36cece700e0b Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 26 Aug 2021 22:10:09 -0600 Subject: [PATCH 098/680] remove hljs in favor of shiki --- package.json | 2 +- public/css/syntax.css | 56 +-------- public/static.json | 2 +- .../arc.tmGrammar.json | 109 ++++++++++++++++++ .../get-docs-000lang-catchall/highlighter.js | 36 ++++-- src/http/get-docs-000lang-catchall/index.js | 17 +-- src/views/docs/en/about/upgrade-guide.md | 4 +- .../docs/en/guides/frontend/http-functions.md | 10 +- src/views/docs/en/reference/app.arc/macros.md | 2 +- src/views/docs/en/reference/app.arc/views.md | 2 +- src/views/docs/en/reference/app.arc/ws.md | 2 +- src/views/docs/en/reference/prefs.arc/.env.md | 2 +- 12 files changed, 163 insertions(+), 81 deletions(-) create mode 100644 src/http/get-docs-000lang-catchall/arc.tmGrammar.json diff --git a/package.json b/package.json index bec5f5c9..0bbdc4a5 100644 --- a/package.json +++ b/package.json @@ -46,11 +46,11 @@ "@toycode/markdown-it-class": "^1.2.4", "eslint": "^7.31.0", "esm": "^3.2.25", - "highlight.js": "^11.1.0", "js-yaml": "^4.1.0", "markdown-it": "^12.1.0", "markdown-it-anchor": "^8.1.2", "markdown-it-front-matter": "^0.2.3", + "shiki": "^0.9.7", "slugify": "^1.6.0", "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", diff --git a/public/css/syntax.css b/public/css/syntax.css index 14bc8bc3..2053bcfc 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -1,59 +1,15 @@ -/* Hemisu Dark */ -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #282a36; -} - -.hljs-comment, -.hljs-meta { - color: #777777; -} - -.hljs-params, -.hljs-number, -.hljs-built_in { - color: #9fd3e6; -} - -.hljs-string, -.hljs-regexp { - color: #b1d631; -} - -.hljs-keyword, -.hljs-title, -.hljs-constant, -.hljs-tag, -.hljs-attr { - color: #bbffaa; -} - -.hljs-selector-tag, -.hljs-literal, -.hljs-section, -.hljs-link { - color: #ece1c8; -} - -.docs pre code { - color: #eeeeee; - font-family: Menlo, Monaco, Consolas, monospace; +.docs blockquote > p { + margin: 0; } -.hljs, -.hljs-string .hljs-subst, -.hljs-tag .hljs-name { - color: #eeeeee; -} /* Code blocks */ .docs pre { padding: 1rem; + margin-bottom: 1rem; overflow: auto; border-radius: 0.3rem; } -.docs blockquote > p { - margin: 0; +.docs pre code { + color: #eeeeee; + font-family: Menlo, Monaco, Consolas, monospace; } - diff --git a/public/static.json b/public/static.json index 3386de2d..22b7e4b9 100644 --- a/public/static.json +++ b/public/static.json @@ -7,5 +7,5 @@ "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", "css/index.css": "css/index-d0b9d5ab0b.css", "css/styles.css": "css/styles-75499ddd30.css", - "css/syntax.css": "css/syntax-605168cf6d.css" + "css/syntax.css": "css/syntax-7394a1231e.css" } \ No newline at end of file diff --git a/src/http/get-docs-000lang-catchall/arc.tmGrammar.json b/src/http/get-docs-000lang-catchall/arc.tmGrammar.json new file mode 100644 index 00000000..b86af56d --- /dev/null +++ b/src/http/get-docs-000lang-catchall/arc.tmGrammar.json @@ -0,0 +1,109 @@ +{ + "name": "Architect (.arc)", + "scopeName": "source.arc", + "patterns": [ + {"include": "#comments"}, + {"include": "#values"}, + {"include": "#sections"}, + {"include": "#scalars"}, + {"include": "#vectors"} + ], + "repository": { + "comments": { + "patterns": [ + { + "name": "comment.arc", + "match": "#.*$", + "captures": { + "0": {"name": "comment.line.arc"} + } + } + ] + }, + "values": { + "patterns": [ + { + "name": "value.true.arc", + "begin": "(true)", + "end": "(\\s|$)", + "captures": { + "0": {"name": "constant.language.boolean.true.arc"} + } + }, + { + "name": "value.false.arc", + "begin": "(false)", + "end": "(\\s|$)", + "captures": { + "0": {"name": "constant.language.boolean.false.arc"} + } + } + ] + }, + "sections": { + "patterns": [ + { + "name": "section.arc", + "match": "^@[a-zA-Z0-9!$%^&*(){}\\[\\]<>\\-_\\+=\\|\\\\:;\"',\\.\\?/`~]+", + "captures": { + "0": {"name": "entity.name.section.arc"}, + "1": {"name": "punctuation.at-sign.arc"} + } + } + ] + }, + "scalars": { + "patterns": [ + { + "name": "scalar.decimal.arc", + "begin": "^(\\d|\\.)+", + "end": ".", + "captures": { + "0": {"name": "constant.numeric.decimal.arc"} + } + }, + { + "name": "scalar.string.arc", + "begin": "^[a-zA-Z0-9!$%^&*(){}\\[\\]<>\\-_\\+=\\|\\\\:;\"',\\.\\?/`~]+(?=(\\s+#|\\s+$))", + "end": "(?=( #|$))", + "captures": { + "0": {"name": "string.unquoted.arc"} + } + } + ] + }, + "vectors": { + "patterns": [ + { + "name": "vector.property.arc", + "begin": "^\\s{0,2}?[a-zA-Z0-9!$%^&*(){}\\[\\]<>\\-_\\+=\\|\\\\:;\"',\\.\\?/`~]+(?=\\s)", + "end": "(?<=\\s)", + "captures": { + "0": {"name": "variable.other.arc"} + } + }, + { + "name": "vector.value.arc", + "begin": "(?<=\\s)[a-zA-Z0-9!$%^&*(){}\\[\\]<>\\-_\\+=\\|\\\\:;\"',\\.\\?/`~]+", + "end": "(?<=\\s)", + "//match": "(?<=\\s).*$", + "captures": { + "0": {"name": "string.unquoted.arc"} + } + } + ] + }, + "disabled": { + "patterns": [ + { + "comment": "put disabled stuff here", + "name": "whatever.arc", + "match": "^foo", + "captures": { + "0": {"name": "meta.whatever.arc"} + } + } + ] + } + } +} diff --git a/src/http/get-docs-000lang-catchall/highlighter.js b/src/http/get-docs-000lang-catchall/highlighter.js index 162be3b4..053c618b 100644 --- a/src/http/get-docs-000lang-catchall/highlighter.js +++ b/src/http/get-docs-000lang-catchall/highlighter.js @@ -1,12 +1,34 @@ -module.exports = function (hljs, escapeHtml, str, lang) { - if (lang && hljs.getLanguage(lang)) { +const shiki = require('shiki') +// from @ryanblock https://github.com/ryanblock/architect-vscode-grammar-extension/blob/master/syntaxes/arc.tmGrammar.json +const arcGrammar = require('./arc.tmGrammar.json') + +module.exports.forMarkdown = async function () { + const highlighter = await shiki.getHighlighter({ + theme: 'dracula-soft', + langs: [ + 'bash', + 'javascript', + 'json', + 'powershell', + 'python', + 'ruby', + 'toml', + 'yaml', + { + id: 'arc', + scopeName: 'source.arc', + grammar: arcGrammar // the type is mismatched but still functions + } + ], + }) + + return function (code, lang) { try { - return `
${hljs.highlight(str, { language: lang, ignoreIllegals: true }).value}
` + return highlighter.codeToHtml(code, lang) } - catch (err) { - console.error(err) + catch (error) { + console.log(lang) + return '' } } - - return `
${escapeHtml(str)}
` } diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 476d4017..270649ee 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -7,12 +7,7 @@ const markdownClass = require('@toycode/markdown-it-class') const markdownAnchor = require('markdown-it-anchor') const frontmatterParser = require('markdown-it-front-matter') const classMapping = require('./markdown-class-mappings') -const hljs = require('highlight.js') -const { escapeHtml } = Markdown().utils -const highlight = require('./highlighter') - .bind(null, hljs, escapeHtml) -const arcGrammar = require('./arc-grammar') -hljs.registerLanguage('arc', arcGrammar) +const highlighter = require('./highlighter') const readFile = util.promisify(fs.readFile) const Html = require('@architect/views/modules/document/html.js').default const toc = require('@architect/views/docs/table-of-contents') @@ -71,12 +66,12 @@ exports.handler = async function http (req) { } } // Declare in outer scope for use later... sorry - let frontmatter = '' - const md = Markdown({ - highlight, + let frontmatter = {} + const markdown = new Markdown({ linkify: true, html: true, - typography: true + typographer: true, + highlight: await highlighter.forMarkdown() }) .use(markdownClass, classMapping) .use(markdownAnchor, { @@ -85,7 +80,7 @@ exports.handler = async function http (req) { .use(frontmatterParser, function (str) { frontmatter = yaml.load(str) }) - const children = md.render(file) + const children = markdown.render(file) const { category, description, sections, title } = frontmatter return { diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index db8a15e8..b831e98f 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -738,7 +738,7 @@ If you built your `@architect/data` calls with `async/await`, `@architect/functi ### Example of `@architect/data` → `@architect/functions` `tables()` #### `@architect/data` before: -```js +```javascript // src/http/get-index/index.js let data = require('@architect/data') @@ -751,7 +751,7 @@ exports.handler = async () => { #### `@architect/functions` `tables()` after: -```js +```javascript // src/http/get-index/index.js let {tables} = require('@architect/functions') diff --git a/src/views/docs/en/guides/frontend/http-functions.md b/src/views/docs/en/guides/frontend/http-functions.md index 11b3f3aa..98a6d38e 100644 --- a/src/views/docs/en/guides/frontend/http-functions.md +++ b/src/views/docs/en/guides/frontend/http-functions.md @@ -26,7 +26,7 @@ Within your project, each HTTP Function can contain and utilize an arbitrary qua The HTTP handler API follows a simple [request](#requests) / [response](#responses) pattern. Let's look at an example of a basic HTTP Function: -```js +```javascript // src/http/get-index/index.js let body = ` @@ -145,7 +145,7 @@ The `handler` function invoked by a client request receives a `request` object c Here's an example of an incoming `request` object, being handled by the HTTP Function `GET /salutations/:greeting`: -```js +```javascript // Client requested https://begin.com/hello-world?testing=123 { httpMethod: 'GET', @@ -171,7 +171,7 @@ Here's an example of an incoming `request` object, being handled by the HTTP Fun To use request.body you'll need to parse it first. Architect Functions provides a simple body parser helper; this helper takes a request object, and returns a parsed body object. All bodies are unparsed, base64-encoded strings. Parse it with `arc.http.helpers.bodyParser()`. Here's an example: -```js +```javascript // Request is form URL-encoded string: 'greeting=howdy' let arc = require('@architect/functions') @@ -207,7 +207,7 @@ Responses are returned by your `handler` function in an object, and use the foll Here's a simple example response for an API endpoint: -```js +```javascript // Responding to a successful POST return { @@ -223,7 +223,7 @@ Many remote networks rely on overly aggressive reverse-proxy caches to conserve Because of the highly adverse effects network-level caching can on your application, we strongly suggest that most HTTP Function responses include anti-caching headers – especially when returning `HTML` and `JSON` responses. For example: -```js +```javascript return { headers: { 'content-type': 'text/html; charset=utf8', diff --git a/src/views/docs/en/reference/app.arc/macros.md b/src/views/docs/en/reference/app.arc/macros.md index 291f823e..7559279f 100644 --- a/src/views/docs/en/reference/app.arc/macros.md +++ b/src/views/docs/en/reference/app.arc/macros.md @@ -89,7 +89,7 @@ You deploy a macro by using this syntax: Macros receive the parsed `app.arc` file so custom pragmas and config can be defined. The second argument is the current CloudFormation template. -```js +```javascript /** * @param {object} arc - the parsed app.arc file currently executing * @param {object} cloudformation - the current AWS::Serverless CloudFormation template diff --git a/src/views/docs/en/reference/app.arc/views.md b/src/views/docs/en/reference/app.arc/views.md index 1bb0ec2c..90b9e45d 100644 --- a/src/views/docs/en/reference/app.arc/views.md +++ b/src/views/docs/en/reference/app.arc/views.md @@ -89,7 +89,7 @@ views=[
yaml
-```yml +```yaml --- app: testapp diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index c71abb49..d4d64435 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -64,7 +64,7 @@ app="testapp"
yaml
-```yml +```yaml --- app: testapp diff --git a/src/views/docs/en/reference/prefs.arc/.env.md b/src/views/docs/en/reference/prefs.arc/.env.md index 148528f6..a366f930 100644 --- a/src/views/docs/en/reference/prefs.arc/.env.md +++ b/src/views/docs/en/reference/prefs.arc/.env.md @@ -9,7 +9,7 @@ Architect sandbox supports loading environment variables from a `.env` file. The ## Example `.env` file -```env +```shell A_TESTING_ENV_VAR=something-for-testing ANOTHER_VAR=only-for-testing ``` From 6f0a06d70075589cbb82b635ef06fbc430dcf04a Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 27 Aug 2021 12:45:27 -0600 Subject: [PATCH 099/680] remove hljs grammar --- .../get-docs-000lang-catchall/arc-grammar.js | 55 ------------------- .../get-docs-000lang-catchall/highlighter.js | 2 +- 2 files changed, 1 insertion(+), 56 deletions(-) delete mode 100644 src/http/get-docs-000lang-catchall/arc-grammar.js diff --git a/src/http/get-docs-000lang-catchall/arc-grammar.js b/src/http/get-docs-000lang-catchall/arc-grammar.js deleted file mode 100644 index 8fe2e4a8..00000000 --- a/src/http/get-docs-000lang-catchall/arc-grammar.js +++ /dev/null @@ -1,55 +0,0 @@ -module.exports = function (hljs) { - const LITERALS = [ - 'true', - 'false', - 'null' - ].join(' ') - const PRAGMAS = { - className: 'built_in', - begin: '^@.*' - } - return { - aliases: [ - 'arc', - 'architect' - ], - case_insensitive: true, - keywords: { - literal: LITERALS, - keyword: [ - 'get', - 'post', - 'put', - 'patch', - 'delete', - 'options', - 'head', - 'any', - 'region', - 'profile', - 'runtime', - 'bucket', - 'httpv1', - 'rest', - 'apigateway', - 'fingerprint', - 'folder', - 'staging', - 'production', - 'session', - '_idx', - '_ttl' - ].join(' ') - }, - contains: [ - { - className: 'string', - begin: "'", end: "'" - }, - hljs.COMMENT( - '#.*' - ), - PRAGMAS - ] - } -} diff --git a/src/http/get-docs-000lang-catchall/highlighter.js b/src/http/get-docs-000lang-catchall/highlighter.js index 053c618b..7ee6e02c 100644 --- a/src/http/get-docs-000lang-catchall/highlighter.js +++ b/src/http/get-docs-000lang-catchall/highlighter.js @@ -27,7 +27,7 @@ module.exports.forMarkdown = async function () { return highlighter.codeToHtml(code, lang) } catch (error) { - console.log(lang) + console.log(`Highlighter unsupported language: ${lang}`) return '' } } From 7bbdf09d2e667299581b7a2f8a04b4e6fdcc6550 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 31 Aug 2021 11:52:02 -0600 Subject: [PATCH 100/680] clean up --- scripts/dictionary.js | 2 +- src/http/get-docs-000lang-catchall/index.js | 21 +++++++++++++++---- src/views/docs/en/guides/domains/godaddy.md | 14 +++++++------ .../domains/{start-here.md => overview.md} | 20 +++++++++--------- .../guides/domains/route53-and-cloudfront.md | 8 +++---- src/views/docs/en/guides/domains/route53.md | 5 ++--- src/views/docs/table-of-contents.js | 7 ++++--- src/views/modules/components/sidebar.js | 1 + 8 files changed, 47 insertions(+), 31 deletions(-) rename src/views/docs/en/guides/domains/{start-here.md => overview.md} (77%) diff --git a/scripts/dictionary.js b/scripts/dictionary.js index ea9c2e66..c61c03c3 100644 --- a/scripts/dictionary.js +++ b/scripts/dictionary.js @@ -124,7 +124,7 @@ let dictionary = [ 'FQDN', 'frontend', 'globals', - 'Godaddy', + 'GoDaddy', 'hardcode', 'hardcoding', 'hashids', diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 476d4017..da48306b 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -67,16 +67,28 @@ exports.handler = async function http (req) { console.error(err) return { statusCode: 404, + // TODO: send a friendly error page with message body: err.message } } - // Declare in outer scope for use later... sorry - let frontmatter = '' + + /** + * @typedef {Object} FrontMatterResult + * @property {string} [title] - Document title + * @property {string} [category] - document sidebar category + * @property {string} [group] - wip + * @property {string} [description] - document description for SEO + * @property {string[]} [sections] - set of document sections + */ + /** + * @type {FrontMatterResult} + */ + let frontmatter = {} const md = Markdown({ highlight, linkify: true, html: true, - typography: true + typographer: true }) .use(markdownClass, classMapping) .use(markdownAnchor, { @@ -86,7 +98,7 @@ exports.handler = async function http (req) { frontmatter = yaml.load(str) }) const children = md.render(file) - const { category, description, sections, title } = frontmatter + const { category, description, group, sections, title } = frontmatter return { statusCode: 200, @@ -100,6 +112,7 @@ exports.handler = async function http (req) { children, description, editURL, + group, lang, sections, scripts: [ diff --git a/src/views/docs/en/guides/domains/godaddy.md b/src/views/docs/en/guides/domains/godaddy.md index 9667d0ac..5b55bc76 100644 --- a/src/views/docs/en/guides/domains/godaddy.md +++ b/src/views/docs/en/guides/domains/godaddy.md @@ -1,11 +1,13 @@ --- -title: Godaddy -description: Setting up a domain name with Godaddy +title: GoDaddy +category: Domains +group: Providers +description: Setting up a domain name with GoDaddy --- ## Prerequisites -- Sign up for a domain on [Godaddy](https://www.Godaddy.com/) +- Sign up for a domain on [GoDaddy](https://www.godaddy.com/) - Deploy an app with Architect and make note of the `staging` and `production` URLs - Ensure the app is deployed to `us-east-1` - Ensure the `@app` name is uniquely named after the domain. @@ -19,7 +21,7 @@ In this step we will request a certificate from Amazon for our domain. - Ensure `example.com` and `*.example.com` for sub domains to work - Choose `DNS validation` and click `Next` - Add any tags and confirm the request -- Open up Godaddy account dashboard and find the `DNS` settings for the particular domain you want to use. +- Open up GoDaddy account dashboard and find the `DNS` settings for the particular domain you want to use. - Click `ADD` and select `CNAME` - Create CNAME records of both issued certificates - Wait until they change from `pending` to `success` @@ -41,11 +43,11 @@ Generate a CloudFront distribution with the certificate from step 1. - Click `Create Distribution` - Repeat for `staging` domain. -## Step 3: configure the domain Alias in Godaddy +## Step 3: configure the domain Alias in GoDaddy Add `A` and `CNAME` records to DNS. -- Open up Godaddy account dashboard and find the `DNS` settings for the particular domain you want to use. +- Open up GoDaddy account dashboard and find the `DNS` settings for the particular domain you want to use. - Click `ADD`. - Use record type `A` for the root domain. - Leave `Host` input empty and add the IP address of the CloudFront domain that was created in step 2 to the `Points to` input. diff --git a/src/views/docs/en/guides/domains/start-here.md b/src/views/docs/en/guides/domains/overview.md similarity index 77% rename from src/views/docs/en/guides/domains/start-here.md rename to src/views/docs/en/guides/domains/overview.md index 9af79271..cff0c1f5 100644 --- a/src/views/docs/en/guides/domains/start-here.md +++ b/src/views/docs/en/guides/domains/overview.md @@ -1,19 +1,18 @@ --- -title: "Start here: custom domains" -description: Setting up a domain name with Route 53 +title: Overview +category: Domains +description: Setting up a domain for an Architect application sections: - Overview - DNS guides - Setting up your project --- -## Overview - -### Give your Architect application a proper domain name. +## Give your Architect application a proper domain name DNS is how you assign a domain name to a deployed app. This guide lists ways to set up custom DNS with several popular DNS providers and we are always happy to accept contributions for steps to use additional providers. -You may use a free registrar-based DNS to host your domain such as Godaddy, Namecheap, One, etc., but Route53 is the preferred registrar and DNS management system for Architect users. This is because: +You may use a free registrar-based DNS to host your domain such as GoDaddy, Namecheap, One, etc., but Route53 is the preferred registrar and DNS management system for Architect users. This is because: - It's integrated with Amazon's other cloud services. - Your DNS will resolve from 15+ locations worldwide, making your website faster for your end-users. @@ -44,9 +43,10 @@ All done! Setting up a custom domain for each registrar will be a bit different. To manually configure DNS, you can follow these guides below: -- [Route 53](/docs/en/guides/domains/route-53) + +- [Route53](/docs/en/guides/domains/route53) +- [Route53 & CloudFront](/docs/en/guides/domains/route53-and-cloudfront) - [Dreamhost](/docs/en/guides/domains/dreamhost) -- [Godaddy](/docs/en/guides/domains/godaddy) -- [One](/docs/en/guides/domains/one) +- [GoDaddy](/docs/en/guides/domains/godaddy) - [Namecheap](/docs/en/guides/domains/namecheap) - \ No newline at end of file +- [One](/docs/en/guides/domains/one) diff --git a/src/views/docs/en/guides/domains/route53-and-cloudfront.md b/src/views/docs/en/guides/domains/route53-and-cloudfront.md index dff64286..77575ae6 100644 --- a/src/views/docs/en/guides/domains/route53-and-cloudfront.md +++ b/src/views/docs/en/guides/domains/route53-and-cloudfront.md @@ -1,9 +1,9 @@ --- -title: Route 53 -description: Setting up a domain name with Route 53 +title: Route53 & CloudFront +description: Setting up a domain name with Route53 and CloudFront --- -## Prerequisites +## Prerequisites - [Register](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html) or [transfer](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) a domain with Route53 - Deploy an app with Architect and make note of the `staging` and `production` URLs @@ -26,7 +26,7 @@ Generate a CloudFront distribution with the certificate from step 1. - Sign into AWS CloudFront in the AWS Console - Click `Create Distribution` and then click `Get Started` -- Enter the URL from API Gateway in `Origin Domain Name` +- Enter the URL from API Gateway in `Origin Domain Name` - Set `Origin Protocol Policy` to `Match Viewer` - Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` - Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` diff --git a/src/views/docs/en/guides/domains/route53.md b/src/views/docs/en/guides/domains/route53.md index 96697995..b3096665 100644 --- a/src/views/docs/en/guides/domains/route53.md +++ b/src/views/docs/en/guides/domains/route53.md @@ -1,9 +1,8 @@ --- -title: Route 53 -description: Setting up a domain name with Route 53 +title: Route53 +description: Setting up a domain name with Route53 --- - ## Prerequisites - [Register](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html) or [transfer](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) a domain with Route53 diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 29cf0d03..c4f10059 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -22,12 +22,13 @@ let Guides = [ { // TODO 'WebSockets functions', ], 'Domains': [ + 'Overview', 'Route53', 'Route53 & CloudFront', 'Dreamhost', - 'Godaddy', - 'One', - 'Namecheap' + 'GoDaddy', + 'Namecheap', + 'One' ], /* TODO 'Backend': [ diff --git a/src/views/modules/components/sidebar.js b/src/views/modules/components/sidebar.js index 705a7507..d31b97ab 100644 --- a/src/views/modules/components/sidebar.js +++ b/src/views/modules/components/sidebar.js @@ -1,6 +1,7 @@ import listFromObject from '../helpers/list.js' import slugify from '../helpers/slugify.js' import toc from '../../docs/table-of-contents.js' + const map = { list: function List (state = {}) { let { children } = state From 15bf5ed8e32673dc7dc91a97788cc798dde631f0 Mon Sep 17 00:00:00 2001 From: Eric Tilmont Date: Sat, 21 Aug 2021 17:18:14 -0400 Subject: [PATCH 101/680] Update dependency-management.md fix broken node link --- .../en/guides/developer-experience/dependency-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/developer-experience/dependency-management.md b/src/views/docs/en/guides/developer-experience/dependency-management.md index 00c13b7d..4581707c 100644 --- a/src/views/docs/en/guides/developer-experience/dependency-management.md +++ b/src/views/docs/en/guides/developer-experience/dependency-management.md @@ -29,7 +29,7 @@ let foo = require('@architect/shared/foo') Recommended additional reading for working with the Node runtime: - Use `@shared` and `@views` to [share code](/docs/en/guides/developer-experience/sharing-code) between functions -- Use [`@architect/functions`](/docs/en/reference/runtime/node) to make working with Node a bit nicer +- Use [`@architect/functions`](/docs/en/reference/runtime/node.js) to make working with Node a bit nicer ## Ruby From 9d076832378b6bafdf67f0d66a9d09e96dcb8bb6 Mon Sep 17 00:00:00 2001 From: Eric Tilmont Date: Sat, 21 Aug 2021 17:35:26 -0400 Subject: [PATCH 102/680] Update ws.md --- src/views/docs/en/reference/app.arc/ws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/app.arc/ws.md index c71abb49..9ea28807 100644 --- a/src/views/docs/en/reference/app.arc/ws.md +++ b/src/views/docs/en/reference/app.arc/ws.md @@ -112,4 +112,4 @@ The functions created by the `@ws` pragma handle events from a WebSocket client. To publish a message to a WebSocket client you can use arc's runtime library `@architect/functions`' `ws.send` method. You can call this method from any of your application's functions. -Docs: [node](/docs/en/reference/runtime/node#arc.ws) - [ruby](/docs/en/reference/runtime/ruby#arc.ws) - [python](/docs/en/reference/runtime/python#arc.ws) +Docs: [node](/docs/en/reference/runtime/node.js#arc.ws) - [ruby](/docs/en/reference/runtime/ruby#arc.ws) - [python](/docs/en/reference/runtime/python#arc.ws) From 7bbdfcdeefb10f5a1cb05b539804e93fc8b5e5ff Mon Sep 17 00:00:00 2001 From: Francis Gulotta Date: Sat, 28 Aug 2021 21:45:42 -0400 Subject: [PATCH 103/680] fix broken links --- src/views/docs/en/guides/extend/plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index 9423fe31..5832fb6e 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -440,8 +440,8 @@ module.exports = { [hydrate]: ../../reference/cli/hydrate [logs]: ../../reference/cli/logs [deploy]: ../../reference/cli/deploy -[functions]: ../../reference/runtime/node -[services]: ../../reference/runtime/node#arc.services +[functions]: ../../reference/runtime/node.js +[services]: ../../reference/runtime/node.js#arc.services [cfn-ref]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html [discovery]: https://en.wikipedia.org/wiki/Service_discovery [ssm]: https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html From 5770107b34e0029bf2a46dfba65fa9c96518745e Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 25 Aug 2021 20:31:24 -0600 Subject: [PATCH 104/680] remove src/views/package in favor of root manifest Arc handles this hydration. intrinsically this uses a common version of slugify also unignore package-lock --- .gitignore | 1 - package-lock.json | 11782 +++++++++++++++++++++++++++++++++++++++ src/views/package.json | 5 - 3 files changed, 11782 insertions(+), 6 deletions(-) create mode 100644 package-lock.json delete mode 100644 src/views/package.json diff --git a/.gitignore b/.gitignore index fc24aab5..73e1c50c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,5 @@ .DS_Store **/static.json node_modules -package-lock.json sam.json sam.yaml diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..cc5d0329 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11782 @@ +{ + "name": "@architect/arc.codes", + "version": "3.3.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@architect/arc.codes", + "version": "3.3.2", + "dependencies": { + "@architect/architect": "^9.0.0", + "@architect/asap": "^4.0.0", + "@architect/eslint-config": "^1.0.0", + "@architect/functions": "^4.0.0", + "@architect/inventory": "^2.0.4", + "@architect/package": "^7.0.1", + "@architect/sandbox": "^4.0.1", + "@toycode/markdown-it-class": "^1.2.4", + "eslint": "^7.31.0", + "esm": "^3.2.25", + "highlight.js": "^11.1.0", + "js-yaml": "^4.1.0", + "markdown-it": "^12.1.0", + "markdown-it-anchor": "^8.1.2", + "markdown-it-front-matter": "^0.2.3", + "slugify": "^1.6.0", + "spellchecker-cli": "^4.8.0", + "tap-spec": "^5.0.0", + "tape": "^5.3.0", + "tiny-json-http": "^7.3.0" + } + }, + "node_modules/@architect/architect": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.0.0.tgz", + "integrity": "sha512-GY2RkO+Fxu+Qqbbfnz5FV2a717mrzsHkBj5JyoaT7fdLIeUWKIhKw2/Cis/dRmZ0daexExdU+5sbjkbvouZ1lw==", + "dependencies": { + "@architect/create": "2.0.1", + "@architect/deploy": "3.0.2", + "@architect/destroy": "2.0.1", + "@architect/env": "2.0.2", + "@architect/hydrate": "2.0.2", + "@architect/logs": "3.0.1", + "@architect/package": "7.0.1", + "@architect/sandbox": "4.0.1", + "aws-sdk": "2.880.0", + "chalk": "4.1.1", + "update-notifier": "5.1.0" + }, + "bin": { + "arc": "src/index.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/asap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-4.0.0.tgz", + "integrity": "sha512-+nsSVPT1+rEJN625UKuX63h3bfJQ/ZyWaeOTwe2dw9Lft0FeNXB/r+SQUw+GZkOQT1KzhHTkMATgPGqQQOhPVw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@architect/create": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@architect/create/-/create-2.0.1.tgz", + "integrity": "sha512-hhtBzssC3RIGY6a1r3nZ71VEhKeD19wDBU/SNHrg503GVc4mPRHPX7QxlQC1TsLsnTowC2ZmPoy5Zt+zYkfNaw==", + "dependencies": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "chalk": "~4.1.1", + "run-parallel": "~1.2.0", + "run-series": "~1.1.9" + }, + "bin": { + "arc-create": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/deploy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.0.2.tgz", + "integrity": "sha512-SNdKCObpvOHer8JWQTOcwazF15bDVMm6tv8LZojSsoORwH6f7u1rRYwL4aLQmuaGBU3HTVmwveTq6E3KSCVQ1Q==", + "dependencies": { + "@architect/create": "~2.0.1", + "@architect/hydrate": "~2.0.2", + "@architect/inventory": "~2.0.4", + "@architect/package": "~7.0.1", + "@architect/utils": "~3.0.2", + "chalk": "~4.1.1", + "fs-extra": "~10.0.0", + "get-folder-size": "~2.0.1", + "glob": "~7.1.7", + "mime-types": "~2.1.32", + "ospath": "~1.2.2", + "path-sort": "~0.1.0", + "rimraf": "~3.0.2", + "run-parallel": "~1.2.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0", + "zip-dir": "~2.0.0", + "zipit": "~2.0.0" + }, + "bin": { + "arc-deploy": "src/cli/index.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/destroy": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-2.0.1.tgz", + "integrity": "sha512-wnVfg/5XXuIw0Gu9on9w4XG1UU+n7IdnotXZQHsx3gFRy270A+HmV9xTQYdZWONUMN0X/Wt0df+CkmiUdK/9SQ==", + "dependencies": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "aws-sdk": "2.880.0", + "run-parallel": "~1.2.0", + "run-waterfall": "~1.1.7" + }, + "bin": { + "arc-destroy": "src/cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/env": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@architect/env/-/env-2.0.2.tgz", + "integrity": "sha512-rm/8SFA6YQ6Jm0hxkfdYh9hiFEsM8v4YsvGkq6UpNuEfRFOzjIiH7jZgx0bcpxzqsaI/2AtWAG9iYh7YW67S/A==", + "dependencies": { + "@architect/inventory": "~2.0.4", + "@architect/parser": "~4.0.1", + "@architect/utils": "~3.0.2", + "aws-sdk": "2.880.0", + "chalk": "~4.1.1", + "cross-env": "~7.0.3", + "dotenv": "~10.0.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "yesno": "~0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/eslint-config": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@architect/eslint-config/-/eslint-config-1.0.1.tgz", + "integrity": "sha512-F4odTXDcCLav7gz/o3sm7r4fGdbxebRQPhhG7ndr/m1gL9ViLSrlqLhxta1HP6F0G3KWDhMvswVkCAk6j8AI0A==", + "dependencies": { + "eslint-plugin-filenames": "^1.3.2", + "eslint-plugin-fp": "^2.3.0", + "eslint-plugin-import": "^2.23.4" + } + }, + "node_modules/@architect/functions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.0.0.tgz", + "integrity": "sha512-7ruYcsuCmz1R1DRCeTqeY8rxuEw8cGH5XZs4zY7vHYaLQPKD/+zp66H81uoGZO5x2n24RCZsBipi66RTCSW6uA==", + "dependencies": { + "aws-serverless-express": "^3.4.0", + "cookie": "^0.4.1", + "cookie-signature": "^1.1.0", + "csrf": "^3.1.0", + "node-webtokens": "^1.0.4", + "run-parallel": "^1.2.0", + "run-waterfall": "^1.1.7", + "uid-safe": "^2.1.5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@architect/hydrate": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.0.2.tgz", + "integrity": "sha512-iGDF0c72S1XpjZP2UrSDdZY1SwvQaia58UuoUvmIkL2LHRp63RTdp3/WHObsq2kaZsVrwj88QEexOfkuIJejGw==", + "dependencies": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "acorn-loose": "~8.1.0", + "chalk": "~4.1.1", + "cpr": "~3.0.1", + "esquery": "~1.4.0", + "glob": "~7.1.7", + "rimraf": "~3.0.2", + "run-series": "~1.1.9", + "symlink-or-copy": "~1.3.1" + }, + "bin": { + "arc-hydrate": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/inventory": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-2.0.4.tgz", + "integrity": "sha512-mLqnb6eDXhTngV0yyV9jCro4f/pzvtpHEGDaWUB+N2t2b8z9MdrT81S4fQxtDdji1RuGBJ2LiOdV+1DsD98DhA==", + "dependencies": { + "@architect/asap": "~4.0.0", + "@architect/parser": "~4.0.1", + "@architect/utils": "~3.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/logs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-3.0.1.tgz", + "integrity": "sha512-mo54rs4xJr88DQ0CWu0qmTJYI3NlNKFpUOieh6rCSrQtVfLTrSShZ4QtZa7vMnckaCfMehLE4uXJWDo6VSoelg==", + "dependencies": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "aws-sdk": "2.880.0", + "chalk": "~4.1.1", + "run-parallel": "~1.2.0", + "run-waterfall": "~1.1.7", + "strftime": "~0.10.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/package": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@architect/package/-/package-7.0.1.tgz", + "integrity": "sha512-vizJLvxqWVbJZRDrBVCEuJujKxTBclfPgInzHGsPB8/XaHgic5ayT54omjQ29mEElUpQOGAleub48Aq8Oq5cOg==", + "dependencies": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "chalk": "~4.1.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-4.0.1.tgz", + "integrity": "sha512-/YDxwuv0QgN1NsudPMavPRCdEN5I144CatRLftfMCjVH3bxk9wF3Q6kubiAsNF16FvcwCXtWk7N5MRro93DHQQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/sandbox": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.0.1.tgz", + "integrity": "sha512-g37QOTB2dpNdnCIOgI4gAP0DG+5M50qocuS2IlgKD/ft/QfxylTLPKpw6UnG0NjQ7Gg8o0fW4lVa+YTlXDPqcw==", + "dependencies": { + "@architect/asap": "~4.0.0", + "@architect/create": "~2.0.1", + "@architect/hydrate": "~2.0.2", + "@architect/inventory": "~2.0.4", + "@architect/parser": "~4.0.1", + "@architect/utils": "~3.0.2", + "@begin/hashid": "~1.0.0", + "aws-sdk": "2.880.0", + "body-parser": "~1.19.0", + "chalk": "~4.1.1", + "depstatus": "~1.1.1", + "dotenv": "~10.0.0", + "dynalite": "~3.2.1", + "finalhandler": "~1.1.2", + "glob": "~7.1.7", + "http-proxy": "~1.18.1", + "node-watch": "~0.7.1", + "router": "~1.3.5", + "run-parallel": "~1.2.0", + "run-series": "~1.1.9", + "send": "~0.17.1", + "server-destroy": "~1.0.1", + "tree-kill": "~1.2.2", + "update-notifier": "~5.1.0", + "ws": "~7.5.3" + }, + "bin": { + "sandbox": "src/cli/cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@architect/utils": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.0.2.tgz", + "integrity": "sha512-RJxm6tS1QdJG/l+uv+T9I2MyGlePUH2eQwzt+yayI8T141TBa6NR2sPHvfIbRQk01n9eF/qGvIkbARI8teOPkw==", + "dependencies": { + "chalk": "~4.1.1", + "glob": "~7.1.7", + "path-sort": "~0.1.0", + "restore-cursor": "~3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", + "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@begin/hashid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@begin/hashid/-/hashid-1.0.0.tgz", + "integrity": "sha512-w+U9klEtRkt7hyW/f+/SvwPgJ4CTMO2ENddisX9dGgLUZKu+iKpb/IhYnQWIt9/Nnm/5DkApmiHGimPs621wwA==" + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@toycode/markdown-it-class": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz", + "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ==" + }, + "node_modules/@types/mdast": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.7.tgz", + "integrity": "sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@vendia/serverless-express": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-3.4.0.tgz", + "integrity": "sha512-/UAAbi9qRjUtjRISt5MJ1sfhtrHb26hqQ0nvE5qhMLsAdR5H7ErBwPD8Q/v2OENKm0iWsGwErIZEg7ebUeFDjQ==", + "dependencies": { + "binary-case": "^1.0.0", + "type-is": "^1.6.16" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/abstract-leveldown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-loose": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.1.0.tgz", + "integrity": "sha512-+X1zk54qiOWwIRywGBhfz8sLHFJ/adQRuVqn25m4HuD7/+GTXM1c0b3LH0bWerQ0H97lTk2GyuScGbSiQK9M1g==", + "dependencies": { + "acorn": "^8.2.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-root-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-iterate": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", + "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.880.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.880.0.tgz", + "integrity": "sha512-/dBk3ejw22ED2edzGfmJB83KXDA4wLIw5Hb+2YMhly+gOWecvevy0tML2+YN/cmxyTy+wT0E0sM7fm1v7kmHtw==", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-serverless-express": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.4.0.tgz", + "integrity": "sha512-YG9ZjAOI9OpwqDDWzkRc3kKJYJuR7gTMjLa3kAWopO17myoprxskCUyCEee+RKe34tcR4UNrVtgAwW5yDe74bw==", + "dependencies": { + "@vendia/serverless-express": "^3.4.0", + "binary-case": "^1.0.0", + "type-is": "^1.6.16" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz", + "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boxen": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", + "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.0", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/command-line-args": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", + "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", + "dependencies": { + "array-back": "^2.0.0", + "chalk": "^2.4.1", + "table-layout": "^0.4.3", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz", + "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cpr": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz", + "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=", + "dependencies": { + "graceful-fs": "^4.1.5", + "minimist": "^1.2.0", + "mkdirp": "~0.5.1", + "rimraf": "^2.5.4" + }, + "bin": { + "cpr": "bin/cpr" + } + }, + "node_modules/cpr/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/create-eslint-index": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/create-eslint-index/-/create-eslint-index-1.0.0.tgz", + "integrity": "sha1-2VQ3LYbVeS/NZ+nyt5GxqxYkEbs=", + "dependencies": { + "lodash.get": "^4.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/csrf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", + "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==", + "dependencies": { + "rndm": "1.2.0", + "tsscmp": "1.0.6", + "uid-safe": "2.1.5" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/date-format": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.2.tgz", + "integrity": "sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE=" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", + "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "dependencies": { + "call-bind": "^1.0.0", + "es-get-iterator": "^1.1.1", + "get-intrinsic": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.1.1", + "isarray": "^2.0.5", + "object-is": "^1.1.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "dependencies": { + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/depstatus": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depstatus/-/depstatus-1.1.1.tgz", + "integrity": "sha512-QT4i2Ql8RS1ttcj7zo4RzYvKz+/eOOIh6N7CXHqfDqC5ZX1hfx5KX6T88gy/j2UWP2x2ytjSoFBl+XW0gVZMug==", + "dependencies": { + "semver": "^7.3.2" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/dictionary-en-au": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.3.0.tgz", + "integrity": "sha512-KoEotpXPCyCgZ5DHlexHyzFfNwPnv9VupeCrp6r+JrtEkycPmZYbQiXF+cXz9NJr1gXy0AMEpzZ8UfxF40+8OQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dictionary-en-ca": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.3.0.tgz", + "integrity": "sha512-5p6B2+GLByVz3Gvb42Y5hTdFBNxJhgG7XRVM74J7hcp+DvtAfOrufTZFfkux9t0qWOjORZoDCmDI6uKiX8qeuQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dictionary-en-gb": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.3.0.tgz", + "integrity": "sha512-P/J2VQp/hDsMTfJhmIYPUBxZqezWuDaUzSgb6oW7JLpUV2So9jCXbR5TaUYXwfO50ZXPYEzQqQHPQK3pKcs7Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dictionary-en-us": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dictionary-en-us/-/dictionary-en-us-2.2.1.tgz", + "integrity": "sha512-Z8mycV0ywTfjbUTi0JZfQHqBZhu4CYFtpf7KluSGpt3xHpFlal2S/hiK50tlPynOtR5K3pG5wCradnz1yxwOHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dictionary-en-za": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.0.4.tgz", + "integrity": "sha512-EgI61DvQsrnIFBmmCz7GB9P/wkCnKnZgKRXyYpbkZomnY0I4vDfNZtjaX81lwb9s+eudP9QJ+8sMzK7eoUapEg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dictionary-vi": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.1.3.tgz", + "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "dependencies": { + "minimatch": "^3.0.4" + }, + "bin": { + "ignored": "bin/ignored" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/dynalite": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz", + "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==", + "dependencies": { + "async": "^2.6.3", + "big.js": "^5.2.2", + "buffer-crc32": "^0.2.13", + "lazy": "^1.0.11", + "levelup": "^4.4.0", + "lock": "^1.1.0", + "memdown": "^5.1.0", + "minimist": "^1.2.5", + "once": "^1.4.0", + "subleveldown": "^5.0.0" + }, + "bin": { + "dynalite": "cli.js" + }, + "optionalDependencies": { + "leveldown": "^5.2.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "dependencies": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", + "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/eslint-plugin-filenames": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", + "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", + "dependencies": { + "lodash.camelcase": "4.3.0", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "lodash.upperfirst": "4.3.1" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-fp": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-fp/-/eslint-plugin-fp-2.3.0.tgz", + "integrity": "sha1-N20qEIcQ6YGYC9w4deO5kg2gSJw=", + "dependencies": { + "create-eslint-index": "^1.0.0", + "eslint-ast-utils": "^1.0.0", + "lodash": "^4.13.1", + "req-all": "^0.1.0" + }, + "engines": { + "node": ">=4.0.0" + }, + "peerDependencies": { + "eslint": ">=3" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fast-safe-stringify": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", + "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==" + }, + "node_modules/fastq": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + }, + "node_modules/follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "node_modules/gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==" + }, + "node_modules/gemoji": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-4.2.1.tgz", + "integrity": "sha512-V9lUpRSn+KQGavZx8Pk+6mxG3kaz21ae2kTCXuT36KaRPNgYU8eHtj/RcUCNFVvmwppsYYz3nnNS9lmcP5kTsg==" + }, + "node_modules/get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "dependencies": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + }, + "bin": { + "get-folder-size": "bin/get-folder-size" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-dynamic-import": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.0.tgz", + "integrity": "sha512-GYPi/aZmACJVrVfEhP1rNUFmtCuK+SQ96mn8Bs7mXiGZRAJiI4VjaMmjj4uuvW8qaF085uWJvyJk9UNYUIYn0A==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/highlight.js": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.1.0.tgz", + "integrity": "sha512-X9VVhYKHQPPuwffO8jk4bP/FVj+ibNCy3HxZZNDXFtJrq4O5FdcdCDRIkDis5MiMnjh7UwEdHgRZJcHFYdzDdA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/insync": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/insync/-/insync-2.1.1.tgz", + "integrity": "sha1-IuJsYRITA8BvUdNaPM9tj8HpFMQ=" + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", + "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", + "dependencies": { + "fast-safe-stringify": "^2.0.6", + "graceful-fs": "^4.1.15", + "mkdirp": "^0.5.1", + "parse-json": "^4.0.0", + "strip-bom": "^4.0.0", + "strip-json-comments": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsonc/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.0.tgz", + "integrity": "sha512-Y2OlFIzrDOPWUnpU0LORIcDn2xN7rC9yKffFM/7pGhQuhO+SUhfm2trkJ/S5amjFvem0Y+1EALz/MEPkvHXVNw==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/junit-report-builder": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-1.3.3.tgz", + "integrity": "sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw==", + "dependencies": { + "date-format": "0.0.2", + "lodash": "^4.17.15", + "mkdirp": "^0.5.0", + "xmlbuilder": "^10.0.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazy": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", + "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-codec/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "dependencies": { + "errno": "~0.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-option-wrap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz", + "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=", + "dependencies": { + "defined": "~0.0.0" + } + }, + "node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dependencies": { + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/leveldown": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", + "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "abstract-leveldown": "~6.2.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "~4.1.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "dependencies": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lie/node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "node_modules/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lock": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", + "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=" + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/markdown-it": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.1.0.tgz", + "integrity": "sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.1.2.tgz", + "integrity": "sha512-9D58TKK4dakqmjcmVuqHoB3ntKBpQJ0Ld38B83aiHJcBD72IZIyPjNtihPA6ayRI5WD33e1W68mArliNLHCprg==", + "peerDependencies": { + "markdown-it": "*" + } + }, + "node_modules/markdown-it-front-matter": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/markdown-it-front-matter/-/markdown-it-front-matter-0.2.3.tgz", + "integrity": "sha512-s9+rcClLmZsZc3YL8Awjg/YO/VdphlE20LJ9Bx5a8RAFLI5a1vq6Mll8kOzG6w/wy8yhFLBupaa6Mfd60GATkA==" + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", + "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", + "dependencies": { + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-nlcst": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz", + "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==", + "dependencies": { + "nlcst-to-string": "^2.0.0", + "repeat-string": "^1.5.2", + "unist-util-position": "^3.0.0", + "vfile-location": "^2.0.0" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "dependencies": { + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memdown/node_modules/immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", + "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", + "dependencies": { + "fault": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/micromark/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node_modules/nlcst-is-literal": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/nlcst-is-literal/-/nlcst-is-literal-1.2.2.tgz", + "integrity": "sha512-R+1OJEmRl3ZOp9d8PbiRxGpnvmpi3jU+lzSqCJoLeogdEh0FYDRH1aC223qUbaKffxNTJkEfeDOeQfziw749yA==", + "dependencies": { + "nlcst-to-string": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/nlcst-to-string": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", + "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-gyp-build": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", + "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-watch": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.1.tgz", + "integrity": "sha512-UWblPYuZYrkCQCW5PxAwYSxaELNBLUckrTBBk8xr1/bUgyOkYYTsUcV4e3ytcazFEOyiRyiUrsG37pu6I0I05g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-webtokens": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-webtokens/-/node-webtokens-1.0.4.tgz", + "integrity": "sha512-Sla56CeSLWvPbwud2kogqf5edQtKNXZBtXDDpmOzAgNZjwETbK/Am6PXfs54iZPLBm8K8amZ9XWaCQwGqZmKyQ==", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/nspell": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/nspell/-/nspell-2.1.5.tgz", + "integrity": "sha512-PSStyugKMiD9mHmqI/CR5xXrSIGejUXPlo88FBRq5Og1kO5QwQ5Ilu8D8O5I/SHpoS+mibpw6uKA8rd3vXd2Sg==", + "dependencies": { + "is-buffer": "^2.0.0" + } + }, + "node_modules/number-to-words": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/number-to-words/-/number-to-words-1.2.4.tgz", + "integrity": "sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=" + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-latin": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz", + "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==", + "dependencies": { + "nlcst-to-string": "^2.0.0", + "unist-util-modify-children": "^2.0.0", + "unist-util-visit-children": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-ms": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", + "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-sort": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-sort/-/path-sort-0.1.0.tgz", + "integrity": "sha1-ywF11Oy/paGP5nTMbXIL/hXguAU=" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/plur": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", + "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", + "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", + "dependencies": { + "is-finite": "^1.0.1", + "parse-ms": "^1.0.0", + "plur": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quotation": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/quotation/-/quotation-1.1.3.tgz", + "integrity": "sha512-45gUgmX/RtQOQV1kwM06boP49OYXcKCPrYwdmAvs5YqkpiobhNKKwo524JM6Ma0ko3oN9tXNcWs9+ABq3Ry7YA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/re-emitter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", + "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=" + }, + "node_modules/reachdown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reachdown/-/reachdown-1.1.0.tgz", + "integrity": "sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reduce-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", + "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dependencies": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", + "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", + "dependencies": { + "mdast-util-frontmatter": "^0.2.0", + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gemoji-to-emoji": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remark-gemoji-to-emoji/-/remark-gemoji-to-emoji-1.1.0.tgz", + "integrity": "sha1-Pc0KiBGgyBu2NROsCzbyJYpVMPU=", + "dependencies": { + "gemoji": "^4.0.0", + "unist-util-visit": "^1.0.0" + } + }, + "node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-retext": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz", + "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==", + "dependencies": { + "mdast-util-to-nlcst": "^3.2.0" + } + }, + "node_modules/remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/req-all": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/req-all/-/req-all-0.1.0.tgz", + "integrity": "sha1-EwBR4qzligLqy/ydRIV3pzapJzo=", + "engines": { + "node": ">=4" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "dependencies": { + "through": "~2.3.4" + } + }, + "node_modules/retext": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-5.0.0.tgz", + "integrity": "sha1-XZAYxKZ31hA8FCNi129Q6x05i/Y=", + "dependencies": { + "retext-latin": "^2.0.0", + "retext-stringify": "^2.0.0", + "unified": "^6.0.0" + }, + "engines": { + "node": ">=0.11.0" + } + }, + "node_modules/retext-indefinite-article": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/retext-indefinite-article/-/retext-indefinite-article-1.1.7.tgz", + "integrity": "sha512-pqvEfEHL8uoeonbEjk8+d/hmyA3ozIeNTl4t3uurMcBpoIqN3+nbuMCFQrfDy2wjaKZ40KsLmEi+Zjv7m1ejLQ==", + "dependencies": { + "format": "^0.2.2", + "nlcst-to-string": "^2.0.0", + "number-to-words": "^1.2.3", + "unist-util-is": "^3.0.0", + "unist-util-visit": "^1.1.0" + } + }, + "node_modules/retext-latin": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz", + "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==", + "dependencies": { + "parse-latin": "^4.0.0", + "unherit": "^1.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-repeated-words": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/retext-repeated-words/-/retext-repeated-words-1.2.3.tgz", + "integrity": "sha512-s51ybhXsHvpHpM44y9hayqcIDMo9g5QBZoOpPUosX3CfobZbgH7CZHbME8TOEcduR7OqGtNZ8JLKVFwi9QAKqA==", + "dependencies": { + "nlcst-to-string": "^2.0.0", + "unist-util-is": "^3.0.0", + "unist-util-visit": "^1.1.0" + } + }, + "node_modules/retext-spell": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/retext-spell/-/retext-spell-2.4.1.tgz", + "integrity": "sha512-l2C37Sz+JMLgUJHqqNA2bV3Qqh7V6zWT3fCi8MtsZn2PoanDh57Tz2NW/DJpoEIsK9mV7o2EMvQmIMt5cgcgAg==", + "dependencies": { + "lodash.includes": "^4.2.0", + "nlcst-is-literal": "^1.0.0", + "nlcst-to-string": "^2.0.0", + "nspell": "^2.0.0", + "quotation": "^1.1.0", + "unist-util-visit": "^1.0.0" + } + }, + "node_modules/retext-stringify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz", + "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==", + "dependencies": { + "nlcst-to-string": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-syntax-mentions": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/retext-syntax-mentions/-/retext-syntax-mentions-1.1.6.tgz", + "integrity": "sha512-e6+Kh3dhzdBn0mHeiiKGUJMMqKTC7O2t+blKZWR1VeP0Kbm6CU4D1p5r+eH24GNCWRnqv3NbDk7RbdALqPLTeQ==", + "dependencies": { + "nlcst-to-string": "^2.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^1.1.0" + } + }, + "node_modules/retext-syntax-urls": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/retext-syntax-urls/-/retext-syntax-urls-1.0.2.tgz", + "integrity": "sha512-Ud7i50IEP33OK9g5xCBIKh/DjoEdZi6sRJqnWDW3Wxt4B48llgfSbGLgiLeXZvJD923mOf7EAoLt/WjundXmwg==", + "dependencies": { + "nlcst-to-string": "^2.0.0", + "unist-util-is": "^3.0.0", + "unist-util-modify-children": "^1.1.1", + "unist-util-position": "^3.0.0" + } + }, + "node_modules/retext-syntax-urls/node_modules/unist-util-modify-children": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz", + "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==", + "dependencies": { + "array-iterate": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/retext/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retext/node_modules/unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-string": "^0.1.0" + } + }, + "node_modules/retext/node_modules/unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + }, + "node_modules/retext/node_modules/vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "dependencies": { + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rndm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" + }, + "node_modules/router": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/router/-/router-1.3.5.tgz", + "integrity": "sha512-kozCJZUhuSJ5VcLhSb3F8fsmGXy+8HaDbKCAerR1G6tq3mnMZFMuSohbFvGv1c5oMFipijDjRZuuN/Sq5nMf3g==", + "dependencies": { + "array-flatten": "3.0.0", + "debug": "2.6.9", + "methods": "~1.1.2", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "setprototypeof": "1.2.0", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/router/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/run-waterfall": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz", + "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=" + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz", + "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==", + "dependencies": { + "graceful-fs": "^4.1.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slugify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.0.tgz", + "integrity": "sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "node_modules/spellchecker-cli": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.8.0.tgz", + "integrity": "sha512-ZGJSm5Q6Cef2+XswPMYeZEmUgSGoOKKicNOQE4b0eVAPHAimRp0zemg8E1SErIkB+rECTt3A7akJLIkXaEVTyA==", + "dependencies": { + "app-root-path": "^3.0.0", + "chalk": "^2.4.2", + "command-line-args": "^5.1.1", + "command-line-usage": "^5.0.4", + "dictionary-en-au": "^2.3.0", + "dictionary-en-ca": "^2.3.0", + "dictionary-en-gb": "^2.3.0", + "dictionary-en-us": "^2.2.1", + "dictionary-en-za": "^2.0.4", + "dictionary-vi": "^2.1.3", + "fs-extra": "^6.0.1", + "globby": "^11.0.0", + "js-yaml": "^3.14.1", + "jsonc": "^2.0.0", + "junit-report-builder": "^1.3.3", + "lodash": "^4.17.21", + "remark": "^13.0.0", + "remark-frontmatter": "^3.0.0", + "remark-gemoji-to-emoji": "^1.1.0", + "remark-retext": "^3.1.3", + "retext": "^5.0.0", + "retext-indefinite-article": "^1.1.7", + "retext-repeated-words": "^1.2.3", + "retext-spell": "^2.4.1", + "retext-syntax-mentions": "^1.1.6", + "retext-syntax-urls": "^1.0.2", + "toml": "^3.0.0", + "unist-util-visit": "^1.4.1", + "vfile": "^3.0.1", + "vfile-reporter": "^6.0.0" + }, + "bin": { + "spellchecker": "build/index.js" + } + }, + "node_modules/spellchecker-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/spellchecker-cli/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/spellchecker-cli/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/spellchecker-cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/spellchecker-cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/spellchecker-cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/spellchecker-cli/node_modules/fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/spellchecker-cli/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/spellchecker-cli/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/spellchecker-cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/spellchecker-cli/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/spellchecker-cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/split": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", + "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/strftime": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", + "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", + "integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/subleveldown": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-5.0.1.tgz", + "integrity": "sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw==", + "dependencies": { + "abstract-leveldown": "^6.3.0", + "encoding-down": "^6.2.0", + "inherits": "^2.0.3", + "level-option-wrap": "^1.1.0", + "levelup": "^4.4.0", + "reachdown": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/subleveldown/node_modules/abstract-leveldown": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/subleveldown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symlink-or-copy": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz", + "integrity": "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==" + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", + "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", + "dependencies": { + "array-back": "^2.0.0", + "deep-extend": "~0.6.0", + "lodash.padend": "^4.6.1", + "typical": "^2.6.1", + "wordwrapjs": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/tap-out": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", + "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", + "dependencies": { + "re-emitter": "1.1.3", + "readable-stream": "2.2.9", + "split": "1.0.0", + "trim": "0.0.1" + }, + "bin": { + "tap-out": "bin/cmd.js" + } + }, + "node_modules/tap-out/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "node_modules/tap-out/node_modules/readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dependencies": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/tap-out/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/tap-out/node_modules/string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tap-spec": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", + "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", + "dependencies": { + "chalk": "^1.0.0", + "duplexer": "^0.1.1", + "figures": "^1.4.0", + "lodash": "^4.17.10", + "pretty-ms": "^2.1.0", + "repeat-string": "^1.5.2", + "tap-out": "^2.1.0", + "through2": "^2.0.0" + }, + "bin": { + "tap-spec": "bin/cmd.js", + "tspec": "bin/cmd.js" + } + }, + "node_modules/tap-spec/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap-spec/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap-spec/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap-spec/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tap-spec/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap-spec/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tape": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.3.0.tgz", + "integrity": "sha512-C4MJ44uuvFail8XhZD6D2j2u1+lar6KMkEdtJBApkC/5Hfk99OvyRcQFwiHWZLKwvxnEDeXBoTRw53p1o3Wgxw==", + "dependencies": { + "call-bind": "^1.0.2", + "deep-equal": "^2.0.5", + "defined": "^1.0.0", + "dotignore": "^0.1.2", + "for-each": "^0.3.3", + "get-package-type": "^0.1.0", + "glob": "^7.1.7", + "has": "^1.0.3", + "has-dynamic-import": "^2.0.0", + "inherits": "^2.0.4", + "is-regex": "^1.1.3", + "minimist": "^1.2.5", + "object-inspect": "^1.11.0", + "object-is": "^1.1.5", + "object.assign": "^4.1.2", + "resolve": "^2.0.0-next.3", + "resumer": "^0.0.0", + "string.prototype.trim": "^1.2.4", + "through": "^2.3.8" + }, + "bin": { + "tape": "bin/tape" + } + }, + "node_modules/tape/node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "node_modules/tape/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=" + }, + "node_modules/tiny-json-http": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.0.tgz", + "integrity": "sha512-dZrf9ZGZQhe8QhhPN3o4uDCQuBc3Gaq4CtbU/67hQDWXuvjLI1mayr8AOFSiUGa3F818SpIgUnC3mM673VRHGQ==" + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", + "dependencies": { + "json5": "^2.2.0", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "node_modules/unist-util-modify-children": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz", + "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==", + "dependencies": { + "array-iterate": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/unist-util-visit-children": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", + "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "dependencies": { + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + }, + "node_modules/vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "dependencies": { + "unist-util-stringify-position": "^1.1.1" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + }, + "node_modules/vfile-reporter": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz", + "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==", + "dependencies": { + "repeat-string": "^1.5.0", + "string-width": "^4.0.0", + "supports-color": "^6.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-sort": "^2.1.2", + "vfile-statistics": "^1.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/vfile-reporter/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vfile-sort": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.2.tgz", + "integrity": "sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-statistics": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.4.tgz", + "integrity": "sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrapjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", + "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", + "dependencies": { + "reduce-flatten": "^1.0.1", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", + "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/yesno": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.3.1.tgz", + "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==" + }, + "node_modules/zip-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz", + "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==", + "dependencies": { + "async": "^3.2.0", + "jszip": "^3.2.2" + } + }, + "node_modules/zip-dir/node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "node_modules/zipit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/zipit/-/zipit-2.0.0.tgz", + "integrity": "sha512-e/y9Xf1eYElSSo1s1e1+0QraquqaCmfnCvxd2IlvILtKK+F93kpV+/TIRUDYW7UnYtDMeYijG5kyEA7B+66wgg==", + "dependencies": { + "insync": "2.1.1", + "yazl": "2.5.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@architect/architect": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.0.0.tgz", + "integrity": "sha512-GY2RkO+Fxu+Qqbbfnz5FV2a717mrzsHkBj5JyoaT7fdLIeUWKIhKw2/Cis/dRmZ0daexExdU+5sbjkbvouZ1lw==", + "requires": { + "@architect/create": "2.0.1", + "@architect/deploy": "3.0.2", + "@architect/destroy": "2.0.1", + "@architect/env": "2.0.2", + "@architect/hydrate": "2.0.2", + "@architect/logs": "3.0.1", + "@architect/package": "7.0.1", + "@architect/sandbox": "4.0.1", + "aws-sdk": "2.880.0", + "chalk": "4.1.1", + "update-notifier": "5.1.0" + } + }, + "@architect/asap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-4.0.0.tgz", + "integrity": "sha512-+nsSVPT1+rEJN625UKuX63h3bfJQ/ZyWaeOTwe2dw9Lft0FeNXB/r+SQUw+GZkOQT1KzhHTkMATgPGqQQOhPVw==" + }, + "@architect/create": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@architect/create/-/create-2.0.1.tgz", + "integrity": "sha512-hhtBzssC3RIGY6a1r3nZ71VEhKeD19wDBU/SNHrg503GVc4mPRHPX7QxlQC1TsLsnTowC2ZmPoy5Zt+zYkfNaw==", + "requires": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "chalk": "~4.1.1", + "run-parallel": "~1.2.0", + "run-series": "~1.1.9" + } + }, + "@architect/deploy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.0.2.tgz", + "integrity": "sha512-SNdKCObpvOHer8JWQTOcwazF15bDVMm6tv8LZojSsoORwH6f7u1rRYwL4aLQmuaGBU3HTVmwveTq6E3KSCVQ1Q==", + "requires": { + "@architect/create": "~2.0.1", + "@architect/hydrate": "~2.0.2", + "@architect/inventory": "~2.0.4", + "@architect/package": "~7.0.1", + "@architect/utils": "~3.0.2", + "chalk": "~4.1.1", + "fs-extra": "~10.0.0", + "get-folder-size": "~2.0.1", + "glob": "~7.1.7", + "mime-types": "~2.1.32", + "ospath": "~1.2.2", + "path-sort": "~0.1.0", + "rimraf": "~3.0.2", + "run-parallel": "~1.2.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0", + "zip-dir": "~2.0.0", + "zipit": "~2.0.0" + } + }, + "@architect/destroy": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-2.0.1.tgz", + "integrity": "sha512-wnVfg/5XXuIw0Gu9on9w4XG1UU+n7IdnotXZQHsx3gFRy270A+HmV9xTQYdZWONUMN0X/Wt0df+CkmiUdK/9SQ==", + "requires": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "aws-sdk": "2.880.0", + "run-parallel": "~1.2.0", + "run-waterfall": "~1.1.7" + } + }, + "@architect/env": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@architect/env/-/env-2.0.2.tgz", + "integrity": "sha512-rm/8SFA6YQ6Jm0hxkfdYh9hiFEsM8v4YsvGkq6UpNuEfRFOzjIiH7jZgx0bcpxzqsaI/2AtWAG9iYh7YW67S/A==", + "requires": { + "@architect/inventory": "~2.0.4", + "@architect/parser": "~4.0.1", + "@architect/utils": "~3.0.2", + "aws-sdk": "2.880.0", + "chalk": "~4.1.1", + "cross-env": "~7.0.3", + "dotenv": "~10.0.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "yesno": "~0.3.1" + } + }, + "@architect/eslint-config": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@architect/eslint-config/-/eslint-config-1.0.1.tgz", + "integrity": "sha512-F4odTXDcCLav7gz/o3sm7r4fGdbxebRQPhhG7ndr/m1gL9ViLSrlqLhxta1HP6F0G3KWDhMvswVkCAk6j8AI0A==", + "requires": { + "eslint-plugin-filenames": "^1.3.2", + "eslint-plugin-fp": "^2.3.0", + "eslint-plugin-import": "^2.23.4" + } + }, + "@architect/functions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.0.0.tgz", + "integrity": "sha512-7ruYcsuCmz1R1DRCeTqeY8rxuEw8cGH5XZs4zY7vHYaLQPKD/+zp66H81uoGZO5x2n24RCZsBipi66RTCSW6uA==", + "requires": { + "aws-serverless-express": "^3.4.0", + "cookie": "^0.4.1", + "cookie-signature": "^1.1.0", + "csrf": "^3.1.0", + "node-webtokens": "^1.0.4", + "run-parallel": "^1.2.0", + "run-waterfall": "^1.1.7", + "uid-safe": "^2.1.5" + } + }, + "@architect/hydrate": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.0.2.tgz", + "integrity": "sha512-iGDF0c72S1XpjZP2UrSDdZY1SwvQaia58UuoUvmIkL2LHRp63RTdp3/WHObsq2kaZsVrwj88QEexOfkuIJejGw==", + "requires": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "acorn-loose": "~8.1.0", + "chalk": "~4.1.1", + "cpr": "~3.0.1", + "esquery": "~1.4.0", + "glob": "~7.1.7", + "rimraf": "~3.0.2", + "run-series": "~1.1.9", + "symlink-or-copy": "~1.3.1" + } + }, + "@architect/inventory": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-2.0.4.tgz", + "integrity": "sha512-mLqnb6eDXhTngV0yyV9jCro4f/pzvtpHEGDaWUB+N2t2b8z9MdrT81S4fQxtDdji1RuGBJ2LiOdV+1DsD98DhA==", + "requires": { + "@architect/asap": "~4.0.0", + "@architect/parser": "~4.0.1", + "@architect/utils": "~3.0.2" + } + }, + "@architect/logs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-3.0.1.tgz", + "integrity": "sha512-mo54rs4xJr88DQ0CWu0qmTJYI3NlNKFpUOieh6rCSrQtVfLTrSShZ4QtZa7vMnckaCfMehLE4uXJWDo6VSoelg==", + "requires": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "aws-sdk": "2.880.0", + "chalk": "~4.1.1", + "run-parallel": "~1.2.0", + "run-waterfall": "~1.1.7", + "strftime": "~0.10.0" + } + }, + "@architect/package": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@architect/package/-/package-7.0.1.tgz", + "integrity": "sha512-vizJLvxqWVbJZRDrBVCEuJujKxTBclfPgInzHGsPB8/XaHgic5ayT54omjQ29mEElUpQOGAleub48Aq8Oq5cOg==", + "requires": { + "@architect/inventory": "~2.0.4", + "@architect/utils": "~3.0.2", + "chalk": "~4.1.1" + } + }, + "@architect/parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-4.0.1.tgz", + "integrity": "sha512-/YDxwuv0QgN1NsudPMavPRCdEN5I144CatRLftfMCjVH3bxk9wF3Q6kubiAsNF16FvcwCXtWk7N5MRro93DHQQ==" + }, + "@architect/sandbox": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.0.1.tgz", + "integrity": "sha512-g37QOTB2dpNdnCIOgI4gAP0DG+5M50qocuS2IlgKD/ft/QfxylTLPKpw6UnG0NjQ7Gg8o0fW4lVa+YTlXDPqcw==", + "requires": { + "@architect/asap": "~4.0.0", + "@architect/create": "~2.0.1", + "@architect/hydrate": "~2.0.2", + "@architect/inventory": "~2.0.4", + "@architect/parser": "~4.0.1", + "@architect/utils": "~3.0.2", + "@begin/hashid": "~1.0.0", + "aws-sdk": "2.880.0", + "body-parser": "~1.19.0", + "chalk": "~4.1.1", + "depstatus": "~1.1.1", + "dotenv": "~10.0.0", + "dynalite": "~3.2.1", + "finalhandler": "~1.1.2", + "glob": "~7.1.7", + "http-proxy": "~1.18.1", + "node-watch": "~0.7.1", + "router": "~1.3.5", + "run-parallel": "~1.2.0", + "run-series": "~1.1.9", + "send": "~0.17.1", + "server-destroy": "~1.0.1", + "tree-kill": "~1.2.2", + "update-notifier": "~5.1.0", + "ws": "~7.5.3" + } + }, + "@architect/utils": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.0.2.tgz", + "integrity": "sha512-RJxm6tS1QdJG/l+uv+T9I2MyGlePUH2eQwzt+yayI8T141TBa6NR2sPHvfIbRQk01n9eF/qGvIkbARI8teOPkw==", + "requires": { + "chalk": "~4.1.1", + "glob": "~7.1.7", + "path-sort": "~0.1.0", + "restore-cursor": "~3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", + "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@begin/hashid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@begin/hashid/-/hashid-1.0.0.tgz", + "integrity": "sha512-w+U9klEtRkt7hyW/f+/SvwPgJ4CTMO2ENddisX9dGgLUZKu+iKpb/IhYnQWIt9/Nnm/5DkApmiHGimPs621wwA==" + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@toycode/markdown-it-class": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz", + "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ==" + }, + "@types/mdast": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.7.tgz", + "integrity": "sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg==", + "requires": { + "@types/unist": "*" + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@vendia/serverless-express": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-3.4.0.tgz", + "integrity": "sha512-/UAAbi9qRjUtjRISt5MJ1sfhtrHb26hqQ0nvE5qhMLsAdR5H7ErBwPD8Q/v2OENKm0iWsGwErIZEg7ebUeFDjQ==", + "requires": { + "binary-case": "^1.0.0", + "type-is": "^1.6.16" + } + }, + "abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "acorn-loose": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.1.0.tgz", + "integrity": "sha512-+X1zk54qiOWwIRywGBhfz8sLHFJ/adQRuVqn25m4HuD7/+GTXM1c0b3LH0bWerQ0H97lTk2GyuScGbSiQK9M1g==", + "requires": { + "acorn": "^8.2.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "app-root-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" + }, + "array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array-iterate": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", + "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" + }, + "aws-sdk": { + "version": "2.880.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.880.0.tgz", + "integrity": "sha512-/dBk3ejw22ED2edzGfmJB83KXDA4wLIw5Hb+2YMhly+gOWecvevy0tML2+YN/cmxyTy+wT0E0sM7fm1v7kmHtw==", + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + } + }, + "aws-serverless-express": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.4.0.tgz", + "integrity": "sha512-YG9ZjAOI9OpwqDDWzkRc3kKJYJuR7gTMjLa3kAWopO17myoprxskCUyCEee+RKe34tcR4UNrVtgAwW5yDe74bw==", + "requires": { + "@vendia/serverless-express": "^3.4.0", + "binary-case": "^1.0.0", + "type-is": "^1.6.16" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz", + "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "boxen": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", + "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.0", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "command-line-args": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", + "requires": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + } + }, + "command-line-usage": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", + "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", + "requires": { + "array-back": "^2.0.0", + "chalk": "^2.4.1", + "table-layout": "^0.4.3", + "typical": "^2.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "requires": { + "typical": "^2.6.1" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "cookie-signature": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz", + "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cpr": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz", + "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=", + "requires": { + "graceful-fs": "^4.1.5", + "minimist": "^1.2.0", + "mkdirp": "~0.5.1", + "rimraf": "^2.5.4" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "create-eslint-index": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/create-eslint-index/-/create-eslint-index-1.0.0.tgz", + "integrity": "sha1-2VQ3LYbVeS/NZ+nyt5GxqxYkEbs=", + "requires": { + "lodash.get": "^4.3.0" + } + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "csrf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", + "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==", + "requires": { + "rndm": "1.2.0", + "tsscmp": "1.0.6", + "uid-safe": "2.1.5" + } + }, + "date-format": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.2.tgz", + "integrity": "sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", + "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "requires": { + "call-bind": "^1.0.0", + "es-get-iterator": "^1.1.1", + "get-intrinsic": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.1.1", + "isarray": "^2.0.5", + "object-is": "^1.1.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "requires": { + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "depstatus": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depstatus/-/depstatus-1.1.1.tgz", + "integrity": "sha512-QT4i2Ql8RS1ttcj7zo4RzYvKz+/eOOIh6N7CXHqfDqC5ZX1hfx5KX6T88gy/j2UWP2x2ytjSoFBl+XW0gVZMug==", + "requires": { + "semver": "^7.3.2" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dictionary-en-au": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.3.0.tgz", + "integrity": "sha512-KoEotpXPCyCgZ5DHlexHyzFfNwPnv9VupeCrp6r+JrtEkycPmZYbQiXF+cXz9NJr1gXy0AMEpzZ8UfxF40+8OQ==" + }, + "dictionary-en-ca": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.3.0.tgz", + "integrity": "sha512-5p6B2+GLByVz3Gvb42Y5hTdFBNxJhgG7XRVM74J7hcp+DvtAfOrufTZFfkux9t0qWOjORZoDCmDI6uKiX8qeuQ==" + }, + "dictionary-en-gb": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.3.0.tgz", + "integrity": "sha512-P/J2VQp/hDsMTfJhmIYPUBxZqezWuDaUzSgb6oW7JLpUV2So9jCXbR5TaUYXwfO50ZXPYEzQqQHPQK3pKcs7Rg==" + }, + "dictionary-en-us": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dictionary-en-us/-/dictionary-en-us-2.2.1.tgz", + "integrity": "sha512-Z8mycV0ywTfjbUTi0JZfQHqBZhu4CYFtpf7KluSGpt3xHpFlal2S/hiK50tlPynOtR5K3pG5wCradnz1yxwOHA==" + }, + "dictionary-en-za": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.0.4.tgz", + "integrity": "sha512-EgI61DvQsrnIFBmmCz7GB9P/wkCnKnZgKRXyYpbkZomnY0I4vDfNZtjaX81lwb9s+eudP9QJ+8sMzK7eoUapEg==" + }, + "dictionary-vi": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.1.3.tgz", + "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "dynalite": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz", + "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==", + "requires": { + "async": "^2.6.3", + "big.js": "^5.2.2", + "buffer-crc32": "^0.2.13", + "lazy": "^1.0.11", + "leveldown": "^5.2.1", + "levelup": "^4.4.0", + "lock": "^1.1.0", + "memdown": "^5.1.0", + "minimist": "^1.2.5", + "once": "^1.4.0", + "subleveldown": "^5.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "requires": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", + "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "requires": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "eslint-plugin-filenames": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", + "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", + "requires": { + "lodash.camelcase": "4.3.0", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "lodash.upperfirst": "4.3.1" + } + }, + "eslint-plugin-fp": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-fp/-/eslint-plugin-fp-2.3.0.tgz", + "integrity": "sha1-N20qEIcQ6YGYC9w4deO5kg2gSJw=", + "requires": { + "create-eslint-index": "^1.0.0", + "eslint-ast-utils": "^1.0.0", + "lodash": "^4.13.1", + "req-all": "^0.1.0" + } + }, + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "requires": { + "@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": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fast-safe-stringify": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", + "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==" + }, + "fastq": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "requires": { + "format": "^0.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "requires": { + "array-back": "^3.0.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==" + }, + "gemoji": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-4.2.1.tgz", + "integrity": "sha512-V9lUpRSn+KQGavZx8Pk+6mxG3kaz21ae2kTCXuT36KaRPNgYU8eHtj/RcUCNFVvmwppsYYz3nnNS9lmcP5kTsg==" + }, + "get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "requires": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + } + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "requires": { + "ini": "2.0.0" + } + }, + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + } + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-dynamic-import": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.0.tgz", + "integrity": "sha512-GYPi/aZmACJVrVfEhP1rNUFmtCuK+SQ96mn8Bs7mXiGZRAJiI4VjaMmjj4uuvW8qaF085uWJvyJk9UNYUIYn0A==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "highlight.js": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.1.0.tgz", + "integrity": "sha512-X9VVhYKHQPPuwffO8jk4bP/FVj+ibNCy3HxZZNDXFtJrq4O5FdcdCDRIkDis5MiMnjh7UwEdHgRZJcHFYdzDdA==" + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + }, + "insync": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/insync/-/insync-2.1.1.tgz", + "integrity": "sha1-IuJsYRITA8BvUdNaPM9tj8HpFMQ=" + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==" + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", + "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", + "requires": { + "fast-safe-stringify": "^2.0.6", + "graceful-fs": "^4.1.15", + "mkdirp": "^0.5.1", + "parse-json": "^4.0.0", + "strip-bom": "^4.0.0", + "strip-json-comments": "^3.0.1" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + } + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jszip": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.0.tgz", + "integrity": "sha512-Y2OlFIzrDOPWUnpU0LORIcDn2xN7rC9yKffFM/7pGhQuhO+SUhfm2trkJ/S5amjFvem0Y+1EALz/MEPkvHXVNw==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "junit-report-builder": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-1.3.3.tgz", + "integrity": "sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw==", + "requires": { + "date-format": "0.0.2", + "lodash": "^4.17.15", + "mkdirp": "^0.5.0", + "xmlbuilder": "^10.0.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "lazy": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", + "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=" + }, + "level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "requires": { + "buffer": "^5.6.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==" + }, + "level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + } + }, + "level-option-wrap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz", + "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=", + "requires": { + "defined": "~0.0.0" + } + }, + "level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "requires": { + "xtend": "^4.0.2" + } + }, + "leveldown": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", + "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", + "optional": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "~4.1.0" + } + }, + "levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "requires": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + }, + "dependencies": { + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + } + } + }, + "linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lock": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", + "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=" + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" + }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "markdown-it": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.1.0.tgz", + "integrity": "sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==", + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-anchor": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.1.2.tgz", + "integrity": "sha512-9D58TKK4dakqmjcmVuqHoB3ntKBpQJ0Ld38B83aiHJcBD72IZIyPjNtihPA6ayRI5WD33e1W68mArliNLHCprg==", + "requires": {} + }, + "markdown-it-front-matter": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/markdown-it-front-matter/-/markdown-it-front-matter-0.2.3.tgz", + "integrity": "sha512-s9+rcClLmZsZc3YL8Awjg/YO/VdphlE20LJ9Bx5a8RAFLI5a1vq6Mll8kOzG6w/wy8yhFLBupaa6Mfd60GATkA==" + }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-frontmatter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", + "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", + "requires": { + "micromark-extension-frontmatter": "^0.2.0" + } + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "mdast-util-to-nlcst": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz", + "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==", + "requires": { + "nlcst-to-string": "^2.0.0", + "repeat-string": "^1.5.2", + "unist-util-position": "^3.0.0", + "vfile-location": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "requires": { + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" + } + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "micromark-extension-frontmatter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", + "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", + "requires": { + "fault": "^1.0.0" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "nlcst-is-literal": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/nlcst-is-literal/-/nlcst-is-literal-1.2.2.tgz", + "integrity": "sha512-R+1OJEmRl3ZOp9d8PbiRxGpnvmpi3jU+lzSqCJoLeogdEh0FYDRH1aC223qUbaKffxNTJkEfeDOeQfziw749yA==", + "requires": { + "nlcst-to-string": "^2.0.0" + } + }, + "nlcst-to-string": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", + "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==" + }, + "node-gyp-build": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", + "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", + "optional": true + }, + "node-watch": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.1.tgz", + "integrity": "sha512-UWblPYuZYrkCQCW5PxAwYSxaELNBLUckrTBBk8xr1/bUgyOkYYTsUcV4e3ytcazFEOyiRyiUrsG37pu6I0I05g==" + }, + "node-webtokens": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-webtokens/-/node-webtokens-1.0.4.tgz", + "integrity": "sha512-Sla56CeSLWvPbwud2kogqf5edQtKNXZBtXDDpmOzAgNZjwETbK/Am6PXfs54iZPLBm8K8amZ9XWaCQwGqZmKyQ==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, + "nspell": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/nspell/-/nspell-2.1.5.tgz", + "integrity": "sha512-PSStyugKMiD9mHmqI/CR5xXrSIGejUXPlo88FBRq5Og1kO5QwQ5Ilu8D8O5I/SHpoS+mibpw6uKA8rd3vXd2Sg==", + "requires": { + "is-buffer": "^2.0.0" + } + }, + "number-to-words": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/number-to-words/-/number-to-words-1.2.4.tgz", + "integrity": "sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "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" + } + }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=" + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-latin": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz", + "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==", + "requires": { + "nlcst-to-string": "^2.0.0", + "unist-util-modify-children": "^2.0.0", + "unist-util-visit-children": "^1.0.0" + } + }, + "parse-ms": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", + "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-sort": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-sort/-/path-sort-0.1.0.tgz", + "integrity": "sha1-ywF11Oy/paGP5nTMbXIL/hXguAU=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + } + }, + "plur": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", + "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "pretty-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", + "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", + "requires": { + "is-finite": "^1.0.1", + "parse-ms": "^1.0.0", + "plur": "^1.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quotation": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/quotation/-/quotation-1.1.3.tgz", + "integrity": "sha512-45gUgmX/RtQOQV1kwM06boP49OYXcKCPrYwdmAvs5YqkpiobhNKKwo524JM6Ma0ko3oN9tXNcWs9+ABq3Ry7YA==" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, + "re-emitter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", + "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=" + }, + "reachdown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reachdown/-/reachdown-1.1.0.tgz", + "integrity": "sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==" + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "reduce-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", + "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=" + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-frontmatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", + "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", + "requires": { + "mdast-util-frontmatter": "^0.2.0", + "micromark-extension-frontmatter": "^0.2.0" + } + }, + "remark-gemoji-to-emoji": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remark-gemoji-to-emoji/-/remark-gemoji-to-emoji-1.1.0.tgz", + "integrity": "sha1-Pc0KiBGgyBu2NROsCzbyJYpVMPU=", + "requires": { + "gemoji": "^4.0.0", + "unist-util-visit": "^1.0.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-retext": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz", + "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==", + "requires": { + "mdast-util-to-nlcst": "^3.2.0" + } + }, + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "requires": { + "mdast-util-to-markdown": "^0.6.0" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "req-all": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/req-all/-/req-all-0.1.0.tgz", + "integrity": "sha1-EwBR4qzligLqy/ydRIV3pzapJzo=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "requires": { + "through": "~2.3.4" + } + }, + "retext": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-5.0.0.tgz", + "integrity": "sha1-XZAYxKZ31hA8FCNi129Q6x05i/Y=", + "requires": { + "retext-latin": "^2.0.0", + "retext-stringify": "^2.0.0", + "unified": "^6.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-string": "^0.1.0" + } + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + }, + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "requires": { + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + } + } + }, + "retext-indefinite-article": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/retext-indefinite-article/-/retext-indefinite-article-1.1.7.tgz", + "integrity": "sha512-pqvEfEHL8uoeonbEjk8+d/hmyA3ozIeNTl4t3uurMcBpoIqN3+nbuMCFQrfDy2wjaKZ40KsLmEi+Zjv7m1ejLQ==", + "requires": { + "format": "^0.2.2", + "nlcst-to-string": "^2.0.0", + "number-to-words": "^1.2.3", + "unist-util-is": "^3.0.0", + "unist-util-visit": "^1.1.0" + } + }, + "retext-latin": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz", + "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==", + "requires": { + "parse-latin": "^4.0.0", + "unherit": "^1.0.4" + } + }, + "retext-repeated-words": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/retext-repeated-words/-/retext-repeated-words-1.2.3.tgz", + "integrity": "sha512-s51ybhXsHvpHpM44y9hayqcIDMo9g5QBZoOpPUosX3CfobZbgH7CZHbME8TOEcduR7OqGtNZ8JLKVFwi9QAKqA==", + "requires": { + "nlcst-to-string": "^2.0.0", + "unist-util-is": "^3.0.0", + "unist-util-visit": "^1.1.0" + } + }, + "retext-spell": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/retext-spell/-/retext-spell-2.4.1.tgz", + "integrity": "sha512-l2C37Sz+JMLgUJHqqNA2bV3Qqh7V6zWT3fCi8MtsZn2PoanDh57Tz2NW/DJpoEIsK9mV7o2EMvQmIMt5cgcgAg==", + "requires": { + "lodash.includes": "^4.2.0", + "nlcst-is-literal": "^1.0.0", + "nlcst-to-string": "^2.0.0", + "nspell": "^2.0.0", + "quotation": "^1.1.0", + "unist-util-visit": "^1.0.0" + } + }, + "retext-stringify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz", + "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==", + "requires": { + "nlcst-to-string": "^2.0.0" + } + }, + "retext-syntax-mentions": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/retext-syntax-mentions/-/retext-syntax-mentions-1.1.6.tgz", + "integrity": "sha512-e6+Kh3dhzdBn0mHeiiKGUJMMqKTC7O2t+blKZWR1VeP0Kbm6CU4D1p5r+eH24GNCWRnqv3NbDk7RbdALqPLTeQ==", + "requires": { + "nlcst-to-string": "^2.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^1.1.0" + } + }, + "retext-syntax-urls": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/retext-syntax-urls/-/retext-syntax-urls-1.0.2.tgz", + "integrity": "sha512-Ud7i50IEP33OK9g5xCBIKh/DjoEdZi6sRJqnWDW3Wxt4B48llgfSbGLgiLeXZvJD923mOf7EAoLt/WjundXmwg==", + "requires": { + "nlcst-to-string": "^2.0.0", + "unist-util-is": "^3.0.0", + "unist-util-modify-children": "^1.1.1", + "unist-util-position": "^3.0.0" + }, + "dependencies": { + "unist-util-modify-children": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz", + "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==", + "requires": { + "array-iterate": "^1.0.0" + } + } + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rndm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" + }, + "router": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/router/-/router-1.3.5.tgz", + "integrity": "sha512-kozCJZUhuSJ5VcLhSb3F8fsmGXy+8HaDbKCAerR1G6tq3mnMZFMuSohbFvGv1c5oMFipijDjRZuuN/Sq5nMf3g==", + "requires": { + "array-flatten": "3.0.0", + "debug": "2.6.9", + "methods": "~1.1.2", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "setprototypeof": "1.2.0", + "utils-merge": "1.0.1" + }, + "dependencies": { + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==" + }, + "run-waterfall": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz", + "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz", + "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==", + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "slugify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.0.tgz", + "integrity": "sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "spellchecker-cli": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.8.0.tgz", + "integrity": "sha512-ZGJSm5Q6Cef2+XswPMYeZEmUgSGoOKKicNOQE4b0eVAPHAimRp0zemg8E1SErIkB+rECTt3A7akJLIkXaEVTyA==", + "requires": { + "app-root-path": "^3.0.0", + "chalk": "^2.4.2", + "command-line-args": "^5.1.1", + "command-line-usage": "^5.0.4", + "dictionary-en-au": "^2.3.0", + "dictionary-en-ca": "^2.3.0", + "dictionary-en-gb": "^2.3.0", + "dictionary-en-us": "^2.2.1", + "dictionary-en-za": "^2.0.4", + "dictionary-vi": "^2.1.3", + "fs-extra": "^6.0.1", + "globby": "^11.0.0", + "js-yaml": "^3.14.1", + "jsonc": "^2.0.0", + "junit-report-builder": "^1.3.3", + "lodash": "^4.17.21", + "remark": "^13.0.0", + "remark-frontmatter": "^3.0.0", + "remark-gemoji-to-emoji": "^1.1.0", + "remark-retext": "^3.1.3", + "retext": "^5.0.0", + "retext-indefinite-article": "^1.1.7", + "retext-repeated-words": "^1.2.3", + "retext-spell": "^2.4.1", + "retext-syntax-mentions": "^1.1.6", + "retext-syntax-urls": "^1.0.2", + "toml": "^3.0.0", + "unist-util-visit": "^1.4.1", + "vfile": "^3.0.1", + "vfile-reporter": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "split": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", + "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", + "requires": { + "through": "2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "strftime": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", + "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trim": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", + "integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "subleveldown": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-5.0.1.tgz", + "integrity": "sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw==", + "requires": { + "abstract-leveldown": "^6.3.0", + "encoding-down": "^6.2.0", + "inherits": "^2.0.3", + "level-option-wrap": "^1.1.0", + "levelup": "^4.4.0", + "reachdown": "^1.1.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "symlink-or-copy": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz", + "integrity": "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==" + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "table-layout": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", + "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", + "requires": { + "array-back": "^2.0.0", + "deep-extend": "~0.6.0", + "lodash.padend": "^4.6.1", + "typical": "^2.6.1", + "wordwrapjs": "^3.0.0" + }, + "dependencies": { + "array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "requires": { + "typical": "^2.6.1" + } + }, + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" + } + } + }, + "tap-out": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", + "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", + "requires": { + "re-emitter": "1.1.3", + "readable-stream": "2.2.9", + "split": "1.0.0", + "trim": "0.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "tap-spec": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", + "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", + "requires": { + "chalk": "^1.0.0", + "duplexer": "^0.1.1", + "figures": "^1.4.0", + "lodash": "^4.17.10", + "pretty-ms": "^2.1.0", + "repeat-string": "^1.5.2", + "tap-out": "^2.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "tape": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.3.0.tgz", + "integrity": "sha512-C4MJ44uuvFail8XhZD6D2j2u1+lar6KMkEdtJBApkC/5Hfk99OvyRcQFwiHWZLKwvxnEDeXBoTRw53p1o3Wgxw==", + "requires": { + "call-bind": "^1.0.2", + "deep-equal": "^2.0.5", + "defined": "^1.0.0", + "dotignore": "^0.1.2", + "for-each": "^0.3.3", + "get-package-type": "^0.1.0", + "glob": "^7.1.7", + "has": "^1.0.3", + "has-dynamic-import": "^2.0.0", + "inherits": "^2.0.4", + "is-regex": "^1.1.3", + "minimist": "^1.2.5", + "object-inspect": "^1.11.0", + "object-is": "^1.1.5", + "object.assign": "^4.1.2", + "resolve": "^2.0.0-next.3", + "resumer": "^0.0.0", + "string.prototype.trim": "^1.2.4", + "through": "^2.3.8" + }, + "dependencies": { + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=" + }, + "tiny-json-http": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.0.tgz", + "integrity": "sha512-dZrf9ZGZQhe8QhhPN3o4uDCQuBc3Gaq4CtbU/67hQDWXuvjLI1mayr8AOFSiUGa3F818SpIgUnC3mM673VRHGQ==" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "tsconfig-paths": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", + "requires": { + "json5": "^2.2.0", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-modify-children": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz", + "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==", + "requires": { + "array-iterate": "^1.0.0" + } + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-children": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", + "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==" + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "requires": { + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + } + } + }, + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "requires": { + "unist-util-stringify-position": "^1.1.1" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + } + } + }, + "vfile-reporter": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz", + "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==", + "requires": { + "repeat-string": "^1.5.0", + "string-width": "^4.0.0", + "supports-color": "^6.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-sort": "^2.1.2", + "vfile-statistics": "^1.1.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "vfile-sort": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.2.tgz", + "integrity": "sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA==" + }, + "vfile-statistics": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.4.tgz", + "integrity": "sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrapjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", + "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", + "requires": { + "reduce-flatten": "^1.0.1", + "typical": "^2.6.1" + }, + "dependencies": { + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" + } + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "requires": {} + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + } + } + }, + "xmlbuilder": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", + "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "requires": { + "buffer-crc32": "~0.2.3" + } + }, + "yesno": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.3.1.tgz", + "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==" + }, + "zip-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz", + "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==", + "requires": { + "async": "^3.2.0", + "jszip": "^3.2.2" + }, + "dependencies": { + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + } + } + }, + "zipit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/zipit/-/zipit-2.0.0.tgz", + "integrity": "sha512-e/y9Xf1eYElSSo1s1e1+0QraquqaCmfnCvxd2IlvILtKK+F93kpV+/TIRUDYW7UnYtDMeYijG5kyEA7B+66wgg==", + "requires": { + "insync": "2.1.1", + "yazl": "2.5.1" + } + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } +} diff --git a/src/views/package.json b/src/views/package.json deleted file mode 100644 index 1076c112..00000000 --- a/src/views/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "slugify": "^1.4.6" - } -} From 5059567ea2b1928e6a07474ca2f54c9f7cbc4a25 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 30 Aug 2021 13:22:58 -0600 Subject: [PATCH 105/680] re-ignore package-lock after discussion with maintainers, I understand the reasoning for ignoring the lockfile. I think there are a few updates to be made around dependencies before we can re-add the lockfile, if at all --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 73e1c50c..fc24aab5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ .DS_Store **/static.json node_modules +package-lock.json sam.json sam.yaml From bb3bd48903fdcf6e793a5e9cfb7bf6f559e67c3f Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 31 Aug 2021 11:40:58 -0600 Subject: [PATCH 106/680] update static var name this is reserved keyword. my bad --- src/http/any-catchall/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/http/any-catchall/index.js b/src/http/any-catchall/index.js index b48fad9d..b82f2257 100644 --- a/src/http/any-catchall/index.js +++ b/src/http/any-catchall/index.js @@ -5,11 +5,11 @@ let asap = require('@architect/asap') let redirect = require('./redirect') // middleware proxy s3 assets -let static = asap({ +let staticProxy = asap({ spa: false, alias: { '/playground': '/playground.html' } }) -exports.handler = http.async(redirect, static) +exports.handler = http.async(redirect, staticProxy) From 818cc69ecded12c440e37249be7faf90c36f5ad0 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 31 Aug 2021 12:22:06 -0600 Subject: [PATCH 107/680] Delete package-lock.json --- package-lock.json | 11782 -------------------------------------------- 1 file changed, 11782 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index cc5d0329..00000000 --- a/package-lock.json +++ /dev/null @@ -1,11782 +0,0 @@ -{ - "name": "@architect/arc.codes", - "version": "3.3.2", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@architect/arc.codes", - "version": "3.3.2", - "dependencies": { - "@architect/architect": "^9.0.0", - "@architect/asap": "^4.0.0", - "@architect/eslint-config": "^1.0.0", - "@architect/functions": "^4.0.0", - "@architect/inventory": "^2.0.4", - "@architect/package": "^7.0.1", - "@architect/sandbox": "^4.0.1", - "@toycode/markdown-it-class": "^1.2.4", - "eslint": "^7.31.0", - "esm": "^3.2.25", - "highlight.js": "^11.1.0", - "js-yaml": "^4.1.0", - "markdown-it": "^12.1.0", - "markdown-it-anchor": "^8.1.2", - "markdown-it-front-matter": "^0.2.3", - "slugify": "^1.6.0", - "spellchecker-cli": "^4.8.0", - "tap-spec": "^5.0.0", - "tape": "^5.3.0", - "tiny-json-http": "^7.3.0" - } - }, - "node_modules/@architect/architect": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.0.0.tgz", - "integrity": "sha512-GY2RkO+Fxu+Qqbbfnz5FV2a717mrzsHkBj5JyoaT7fdLIeUWKIhKw2/Cis/dRmZ0daexExdU+5sbjkbvouZ1lw==", - "dependencies": { - "@architect/create": "2.0.1", - "@architect/deploy": "3.0.2", - "@architect/destroy": "2.0.1", - "@architect/env": "2.0.2", - "@architect/hydrate": "2.0.2", - "@architect/logs": "3.0.1", - "@architect/package": "7.0.1", - "@architect/sandbox": "4.0.1", - "aws-sdk": "2.880.0", - "chalk": "4.1.1", - "update-notifier": "5.1.0" - }, - "bin": { - "arc": "src/index.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/asap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-4.0.0.tgz", - "integrity": "sha512-+nsSVPT1+rEJN625UKuX63h3bfJQ/ZyWaeOTwe2dw9Lft0FeNXB/r+SQUw+GZkOQT1KzhHTkMATgPGqQQOhPVw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@architect/create": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@architect/create/-/create-2.0.1.tgz", - "integrity": "sha512-hhtBzssC3RIGY6a1r3nZ71VEhKeD19wDBU/SNHrg503GVc4mPRHPX7QxlQC1TsLsnTowC2ZmPoy5Zt+zYkfNaw==", - "dependencies": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "chalk": "~4.1.1", - "run-parallel": "~1.2.0", - "run-series": "~1.1.9" - }, - "bin": { - "arc-create": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/deploy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.0.2.tgz", - "integrity": "sha512-SNdKCObpvOHer8JWQTOcwazF15bDVMm6tv8LZojSsoORwH6f7u1rRYwL4aLQmuaGBU3HTVmwveTq6E3KSCVQ1Q==", - "dependencies": { - "@architect/create": "~2.0.1", - "@architect/hydrate": "~2.0.2", - "@architect/inventory": "~2.0.4", - "@architect/package": "~7.0.1", - "@architect/utils": "~3.0.2", - "chalk": "~4.1.1", - "fs-extra": "~10.0.0", - "get-folder-size": "~2.0.1", - "glob": "~7.1.7", - "mime-types": "~2.1.32", - "ospath": "~1.2.2", - "path-sort": "~0.1.0", - "rimraf": "~3.0.2", - "run-parallel": "~1.2.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0", - "zip-dir": "~2.0.0", - "zipit": "~2.0.0" - }, - "bin": { - "arc-deploy": "src/cli/index.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/destroy": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-2.0.1.tgz", - "integrity": "sha512-wnVfg/5XXuIw0Gu9on9w4XG1UU+n7IdnotXZQHsx3gFRy270A+HmV9xTQYdZWONUMN0X/Wt0df+CkmiUdK/9SQ==", - "dependencies": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "aws-sdk": "2.880.0", - "run-parallel": "~1.2.0", - "run-waterfall": "~1.1.7" - }, - "bin": { - "arc-destroy": "src/cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/env": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@architect/env/-/env-2.0.2.tgz", - "integrity": "sha512-rm/8SFA6YQ6Jm0hxkfdYh9hiFEsM8v4YsvGkq6UpNuEfRFOzjIiH7jZgx0bcpxzqsaI/2AtWAG9iYh7YW67S/A==", - "dependencies": { - "@architect/inventory": "~2.0.4", - "@architect/parser": "~4.0.1", - "@architect/utils": "~3.0.2", - "aws-sdk": "2.880.0", - "chalk": "~4.1.1", - "cross-env": "~7.0.3", - "dotenv": "~10.0.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "yesno": "~0.3.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/eslint-config": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@architect/eslint-config/-/eslint-config-1.0.1.tgz", - "integrity": "sha512-F4odTXDcCLav7gz/o3sm7r4fGdbxebRQPhhG7ndr/m1gL9ViLSrlqLhxta1HP6F0G3KWDhMvswVkCAk6j8AI0A==", - "dependencies": { - "eslint-plugin-filenames": "^1.3.2", - "eslint-plugin-fp": "^2.3.0", - "eslint-plugin-import": "^2.23.4" - } - }, - "node_modules/@architect/functions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.0.0.tgz", - "integrity": "sha512-7ruYcsuCmz1R1DRCeTqeY8rxuEw8cGH5XZs4zY7vHYaLQPKD/+zp66H81uoGZO5x2n24RCZsBipi66RTCSW6uA==", - "dependencies": { - "aws-serverless-express": "^3.4.0", - "cookie": "^0.4.1", - "cookie-signature": "^1.1.0", - "csrf": "^3.1.0", - "node-webtokens": "^1.0.4", - "run-parallel": "^1.2.0", - "run-waterfall": "^1.1.7", - "uid-safe": "^2.1.5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@architect/hydrate": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.0.2.tgz", - "integrity": "sha512-iGDF0c72S1XpjZP2UrSDdZY1SwvQaia58UuoUvmIkL2LHRp63RTdp3/WHObsq2kaZsVrwj88QEexOfkuIJejGw==", - "dependencies": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "acorn-loose": "~8.1.0", - "chalk": "~4.1.1", - "cpr": "~3.0.1", - "esquery": "~1.4.0", - "glob": "~7.1.7", - "rimraf": "~3.0.2", - "run-series": "~1.1.9", - "symlink-or-copy": "~1.3.1" - }, - "bin": { - "arc-hydrate": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/inventory": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-2.0.4.tgz", - "integrity": "sha512-mLqnb6eDXhTngV0yyV9jCro4f/pzvtpHEGDaWUB+N2t2b8z9MdrT81S4fQxtDdji1RuGBJ2LiOdV+1DsD98DhA==", - "dependencies": { - "@architect/asap": "~4.0.0", - "@architect/parser": "~4.0.1", - "@architect/utils": "~3.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/logs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-3.0.1.tgz", - "integrity": "sha512-mo54rs4xJr88DQ0CWu0qmTJYI3NlNKFpUOieh6rCSrQtVfLTrSShZ4QtZa7vMnckaCfMehLE4uXJWDo6VSoelg==", - "dependencies": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "aws-sdk": "2.880.0", - "chalk": "~4.1.1", - "run-parallel": "~1.2.0", - "run-waterfall": "~1.1.7", - "strftime": "~0.10.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/package": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@architect/package/-/package-7.0.1.tgz", - "integrity": "sha512-vizJLvxqWVbJZRDrBVCEuJujKxTBclfPgInzHGsPB8/XaHgic5ayT54omjQ29mEElUpQOGAleub48Aq8Oq5cOg==", - "dependencies": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "chalk": "~4.1.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-4.0.1.tgz", - "integrity": "sha512-/YDxwuv0QgN1NsudPMavPRCdEN5I144CatRLftfMCjVH3bxk9wF3Q6kubiAsNF16FvcwCXtWk7N5MRro93DHQQ==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/sandbox": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.0.1.tgz", - "integrity": "sha512-g37QOTB2dpNdnCIOgI4gAP0DG+5M50qocuS2IlgKD/ft/QfxylTLPKpw6UnG0NjQ7Gg8o0fW4lVa+YTlXDPqcw==", - "dependencies": { - "@architect/asap": "~4.0.0", - "@architect/create": "~2.0.1", - "@architect/hydrate": "~2.0.2", - "@architect/inventory": "~2.0.4", - "@architect/parser": "~4.0.1", - "@architect/utils": "~3.0.2", - "@begin/hashid": "~1.0.0", - "aws-sdk": "2.880.0", - "body-parser": "~1.19.0", - "chalk": "~4.1.1", - "depstatus": "~1.1.1", - "dotenv": "~10.0.0", - "dynalite": "~3.2.1", - "finalhandler": "~1.1.2", - "glob": "~7.1.7", - "http-proxy": "~1.18.1", - "node-watch": "~0.7.1", - "router": "~1.3.5", - "run-parallel": "~1.2.0", - "run-series": "~1.1.9", - "send": "~0.17.1", - "server-destroy": "~1.0.1", - "tree-kill": "~1.2.2", - "update-notifier": "~5.1.0", - "ws": "~7.5.3" - }, - "bin": { - "sandbox": "src/cli/cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@architect/utils": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.0.2.tgz", - "integrity": "sha512-RJxm6tS1QdJG/l+uv+T9I2MyGlePUH2eQwzt+yayI8T141TBa6NR2sPHvfIbRQk01n9eF/qGvIkbARI8teOPkw==", - "dependencies": { - "chalk": "~4.1.1", - "glob": "~7.1.7", - "path-sort": "~0.1.0", - "restore-cursor": "~3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@begin/hashid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@begin/hashid/-/hashid-1.0.0.tgz", - "integrity": "sha512-w+U9klEtRkt7hyW/f+/SvwPgJ4CTMO2ENddisX9dGgLUZKu+iKpb/IhYnQWIt9/Nnm/5DkApmiHGimPs621wwA==" - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@toycode/markdown-it-class": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz", - "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ==" - }, - "node_modules/@types/mdast": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.7.tgz", - "integrity": "sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "node_modules/@vendia/serverless-express": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-3.4.0.tgz", - "integrity": "sha512-/UAAbi9qRjUtjRISt5MJ1sfhtrHb26hqQ0nvE5qhMLsAdR5H7ErBwPD8Q/v2OENKm0iWsGwErIZEg7ebUeFDjQ==", - "dependencies": { - "binary-case": "^1.0.0", - "type-is": "^1.6.16" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/abstract-leveldown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-loose": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.1.0.tgz", - "integrity": "sha512-+X1zk54qiOWwIRywGBhfz8sLHFJ/adQRuVqn25m4HuD7/+GTXM1c0b3LH0bWerQ0H97lTk2GyuScGbSiQK9M1g==", - "dependencies": { - "acorn": "^8.2.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/array-flatten": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", - "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" - }, - "node_modules/array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-iterate": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", - "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", - "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sdk": { - "version": "2.880.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.880.0.tgz", - "integrity": "sha512-/dBk3ejw22ED2edzGfmJB83KXDA4wLIw5Hb+2YMhly+gOWecvevy0tML2+YN/cmxyTy+wT0E0sM7fm1v7kmHtw==", - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/aws-serverless-express": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.4.0.tgz", - "integrity": "sha512-YG9ZjAOI9OpwqDDWzkRc3kKJYJuR7gTMjLa3kAWopO17myoprxskCUyCEee+RKe34tcR4UNrVtgAwW5yDe74bw==", - "dependencies": { - "@vendia/serverless-express": "^3.4.0", - "binary-case": "^1.0.0", - "type-is": "^1.6.16" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz", - "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg==" - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/command-line-args": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", - "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", - "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", - "dependencies": { - "array-back": "^2.0.0", - "chalk": "^2.4.1", - "table-layout": "^0.4.3", - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dependencies": { - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/command-line-usage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz", - "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cpr": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz", - "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=", - "dependencies": { - "graceful-fs": "^4.1.5", - "minimist": "^1.2.0", - "mkdirp": "~0.5.1", - "rimraf": "^2.5.4" - }, - "bin": { - "cpr": "bin/cpr" - } - }, - "node_modules/cpr/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/create-eslint-index": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/create-eslint-index/-/create-eslint-index-1.0.0.tgz", - "integrity": "sha1-2VQ3LYbVeS/NZ+nyt5GxqxYkEbs=", - "dependencies": { - "lodash.get": "^4.3.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/csrf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", - "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==", - "dependencies": { - "rndm": "1.2.0", - "tsscmp": "1.0.6", - "uid-safe": "2.1.5" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/date-format": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.2.tgz", - "integrity": "sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE=" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-equal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", - "dependencies": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", - "isarray": "^2.0.5", - "object-is": "^1.1.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "dependencies": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/depstatus": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depstatus/-/depstatus-1.1.1.tgz", - "integrity": "sha512-QT4i2Ql8RS1ttcj7zo4RzYvKz+/eOOIh6N7CXHqfDqC5ZX1hfx5KX6T88gy/j2UWP2x2ytjSoFBl+XW0gVZMug==", - "dependencies": { - "semver": "^7.3.2" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/dictionary-en-au": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.3.0.tgz", - "integrity": "sha512-KoEotpXPCyCgZ5DHlexHyzFfNwPnv9VupeCrp6r+JrtEkycPmZYbQiXF+cXz9NJr1gXy0AMEpzZ8UfxF40+8OQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dictionary-en-ca": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.3.0.tgz", - "integrity": "sha512-5p6B2+GLByVz3Gvb42Y5hTdFBNxJhgG7XRVM74J7hcp+DvtAfOrufTZFfkux9t0qWOjORZoDCmDI6uKiX8qeuQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dictionary-en-gb": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.3.0.tgz", - "integrity": "sha512-P/J2VQp/hDsMTfJhmIYPUBxZqezWuDaUzSgb6oW7JLpUV2So9jCXbR5TaUYXwfO50ZXPYEzQqQHPQK3pKcs7Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dictionary-en-us": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dictionary-en-us/-/dictionary-en-us-2.2.1.tgz", - "integrity": "sha512-Z8mycV0ywTfjbUTi0JZfQHqBZhu4CYFtpf7KluSGpt3xHpFlal2S/hiK50tlPynOtR5K3pG5wCradnz1yxwOHA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dictionary-en-za": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.0.4.tgz", - "integrity": "sha512-EgI61DvQsrnIFBmmCz7GB9P/wkCnKnZgKRXyYpbkZomnY0I4vDfNZtjaX81lwb9s+eudP9QJ+8sMzK7eoUapEg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dictionary-vi": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.1.3.tgz", - "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "dependencies": { - "minimatch": "^3.0.4" - }, - "bin": { - "ignored": "bin/ignored" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "node_modules/dynalite": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz", - "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==", - "dependencies": { - "async": "^2.6.3", - "big.js": "^5.2.2", - "buffer-crc32": "^0.2.13", - "lazy": "^1.0.11", - "levelup": "^4.4.0", - "lock": "^1.1.0", - "memdown": "^5.1.0", - "minimist": "^1.2.5", - "once": "^1.4.0", - "subleveldown": "^5.0.0" - }, - "bin": { - "dynalite": "cli.js" - }, - "optionalDependencies": { - "leveldown": "^5.2.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "dependencies": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.18.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", - "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-ast-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", - "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.zip": "^4.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dependencies": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", - "dependencies": { - "debug": "^3.2.7", - "pkg-dir": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/eslint-plugin-filenames": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", - "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", - "dependencies": { - "lodash.camelcase": "4.3.0", - "lodash.kebabcase": "4.1.1", - "lodash.snakecase": "4.1.1", - "lodash.upperfirst": "4.3.1" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/eslint-plugin-fp": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-fp/-/eslint-plugin-fp-2.3.0.tgz", - "integrity": "sha1-N20qEIcQ6YGYC9w4deO5kg2gSJw=", - "dependencies": { - "create-eslint-index": "^1.0.0", - "eslint-ast-utils": "^1.0.0", - "lodash": "^4.13.1", - "req-all": "^0.1.0" - }, - "engines": { - "node": ">=4.0.0" - }, - "peerDependencies": { - "eslint": ">=3" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.23.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", - "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", - "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.1", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.4.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.3", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", - "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==" - }, - "node_modules/fastq": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", - "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" - }, - "node_modules/follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "node_modules/gar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", - "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==" - }, - "node_modules/gemoji": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-4.2.1.tgz", - "integrity": "sha512-V9lUpRSn+KQGavZx8Pk+6mxG3kaz21ae2kTCXuT36KaRPNgYU8eHtj/RcUCNFVvmwppsYYz3nnNS9lmcP5kTsg==" - }, - "node_modules/get-folder-size": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", - "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", - "dependencies": { - "gar": "^1.0.4", - "tiny-each-async": "2.0.3" - }, - "bin": { - "get-folder-size": "bin/get-folder-size" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-dynamic-import": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.0.tgz", - "integrity": "sha512-GYPi/aZmACJVrVfEhP1rNUFmtCuK+SQ96mn8Bs7mXiGZRAJiI4VjaMmjj4uuvW8qaF085uWJvyJk9UNYUIYn0A==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/highlight.js": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.1.0.tgz", - "integrity": "sha512-X9VVhYKHQPPuwffO8jk4bP/FVj+ibNCy3HxZZNDXFtJrq4O5FdcdCDRIkDis5MiMnjh7UwEdHgRZJcHFYdzDdA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/insync": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/insync/-/insync-2.1.1.tgz", - "integrity": "sha1-IuJsYRITA8BvUdNaPM9tj8HpFMQ=" - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", - "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", - "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", - "dependencies": { - "fast-safe-stringify": "^2.0.6", - "graceful-fs": "^4.1.15", - "mkdirp": "^0.5.1", - "parse-json": "^4.0.0", - "strip-bom": "^4.0.0", - "strip-json-comments": "^3.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsonc/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jszip": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.0.tgz", - "integrity": "sha512-Y2OlFIzrDOPWUnpU0LORIcDn2xN7rC9yKffFM/7pGhQuhO+SUhfm2trkJ/S5amjFvem0Y+1EALz/MEPkvHXVNw==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/junit-report-builder": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-1.3.3.tgz", - "integrity": "sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw==", - "dependencies": { - "date-format": "0.0.2", - "lodash": "^4.17.15", - "mkdirp": "^0.5.0", - "xmlbuilder": "^10.0.0" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lazy": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-codec/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "dependencies": { - "errno": "~0.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-option-wrap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz", - "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=", - "dependencies": { - "defined": "~0.0.0" - } - }, - "node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/leveldown": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", - "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "napi-macros": "~2.0.0", - "node-gyp-build": "~4.1.0" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dependencies": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lie/node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "node_modules/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lock": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", - "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=" - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" - }, - "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/markdown-it": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.1.0.tgz", - "integrity": "sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-anchor": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.1.2.tgz", - "integrity": "sha512-9D58TKK4dakqmjcmVuqHoB3ntKBpQJ0Ld38B83aiHJcBD72IZIyPjNtihPA6ayRI5WD33e1W68mArliNLHCprg==", - "peerDependencies": { - "markdown-it": "*" - } - }, - "node_modules/markdown-it-front-matter": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/markdown-it-front-matter/-/markdown-it-front-matter-0.2.3.tgz", - "integrity": "sha512-s9+rcClLmZsZc3YL8Awjg/YO/VdphlE20LJ9Bx5a8RAFLI5a1vq6Mll8kOzG6w/wy8yhFLBupaa6Mfd60GATkA==" - }, - "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", - "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", - "dependencies": { - "micromark-extension-frontmatter": "^0.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-nlcst": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz", - "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "repeat-string": "^1.5.2", - "unist-util-position": "^3.0.0", - "vfile-location": "^2.0.0" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "dependencies": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/memdown/node_modules/immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "node_modules/micromark-extension-frontmatter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", - "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", - "dependencies": { - "fault": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/micromark/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "dependencies": { - "mime-db": "1.49.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "node_modules/nlcst-is-literal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/nlcst-is-literal/-/nlcst-is-literal-1.2.2.tgz", - "integrity": "sha512-R+1OJEmRl3ZOp9d8PbiRxGpnvmpi3jU+lzSqCJoLeogdEh0FYDRH1aC223qUbaKffxNTJkEfeDOeQfziw749yA==", - "dependencies": { - "nlcst-to-string": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/nlcst-to-string": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", - "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/node-gyp-build": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", - "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-watch": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.1.tgz", - "integrity": "sha512-UWblPYuZYrkCQCW5PxAwYSxaELNBLUckrTBBk8xr1/bUgyOkYYTsUcV4e3ytcazFEOyiRyiUrsG37pu6I0I05g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/node-webtokens": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-webtokens/-/node-webtokens-1.0.4.tgz", - "integrity": "sha512-Sla56CeSLWvPbwud2kogqf5edQtKNXZBtXDDpmOzAgNZjwETbK/Am6PXfs54iZPLBm8K8amZ9XWaCQwGqZmKyQ==", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/nspell": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/nspell/-/nspell-2.1.5.tgz", - "integrity": "sha512-PSStyugKMiD9mHmqI/CR5xXrSIGejUXPlo88FBRq5Og1kO5QwQ5Ilu8D8O5I/SHpoS+mibpw6uKA8rd3vXd2Sg==", - "dependencies": { - "is-buffer": "^2.0.0" - } - }, - "node_modules/number-to-words": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/number-to-words/-/number-to-words-1.2.4.tgz", - "integrity": "sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dependencies": { - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=" - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-latin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz", - "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "unist-util-modify-children": "^2.0.0", - "unist-util-visit-children": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-sort": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-sort/-/path-sort-0.1.0.tgz", - "integrity": "sha1-ywF11Oy/paGP5nTMbXIL/hXguAU=" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "dependencies": { - "is-finite": "^1.0.1", - "parse-ms": "^1.0.0", - "plur": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quotation": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/quotation/-/quotation-1.1.3.tgz", - "integrity": "sha512-45gUgmX/RtQOQV1kwM06boP49OYXcKCPrYwdmAvs5YqkpiobhNKKwo524JM6Ma0ko3oN9tXNcWs9+ABq3Ry7YA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/re-emitter": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", - "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=" - }, - "node_modules/reachdown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reachdown/-/reachdown-1.1.0.tgz", - "integrity": "sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/reduce-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", - "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "dependencies": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-frontmatter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", - "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", - "dependencies": { - "mdast-util-frontmatter": "^0.2.0", - "micromark-extension-frontmatter": "^0.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gemoji-to-emoji": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remark-gemoji-to-emoji/-/remark-gemoji-to-emoji-1.1.0.tgz", - "integrity": "sha1-Pc0KiBGgyBu2NROsCzbyJYpVMPU=", - "dependencies": { - "gemoji": "^4.0.0", - "unist-util-visit": "^1.0.0" - } - }, - "node_modules/remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dependencies": { - "mdast-util-from-markdown": "^0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-retext": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz", - "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==", - "dependencies": { - "mdast-util-to-nlcst": "^3.2.0" - } - }, - "node_modules/remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/req-all": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/req-all/-/req-all-0.1.0.tgz", - "integrity": "sha1-EwBR4qzligLqy/ydRIV3pzapJzo=", - "engines": { - "node": ">=4" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dependencies": { - "through": "~2.3.4" - } - }, - "node_modules/retext": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-5.0.0.tgz", - "integrity": "sha1-XZAYxKZ31hA8FCNi129Q6x05i/Y=", - "dependencies": { - "retext-latin": "^2.0.0", - "retext-stringify": "^2.0.0", - "unified": "^6.0.0" - }, - "engines": { - "node": ">=0.11.0" - } - }, - "node_modules/retext-indefinite-article": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/retext-indefinite-article/-/retext-indefinite-article-1.1.7.tgz", - "integrity": "sha512-pqvEfEHL8uoeonbEjk8+d/hmyA3ozIeNTl4t3uurMcBpoIqN3+nbuMCFQrfDy2wjaKZ40KsLmEi+Zjv7m1ejLQ==", - "dependencies": { - "format": "^0.2.2", - "nlcst-to-string": "^2.0.0", - "number-to-words": "^1.2.3", - "unist-util-is": "^3.0.0", - "unist-util-visit": "^1.1.0" - } - }, - "node_modules/retext-latin": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz", - "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==", - "dependencies": { - "parse-latin": "^4.0.0", - "unherit": "^1.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-repeated-words": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/retext-repeated-words/-/retext-repeated-words-1.2.3.tgz", - "integrity": "sha512-s51ybhXsHvpHpM44y9hayqcIDMo9g5QBZoOpPUosX3CfobZbgH7CZHbME8TOEcduR7OqGtNZ8JLKVFwi9QAKqA==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "unist-util-is": "^3.0.0", - "unist-util-visit": "^1.1.0" - } - }, - "node_modules/retext-spell": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/retext-spell/-/retext-spell-2.4.1.tgz", - "integrity": "sha512-l2C37Sz+JMLgUJHqqNA2bV3Qqh7V6zWT3fCi8MtsZn2PoanDh57Tz2NW/DJpoEIsK9mV7o2EMvQmIMt5cgcgAg==", - "dependencies": { - "lodash.includes": "^4.2.0", - "nlcst-is-literal": "^1.0.0", - "nlcst-to-string": "^2.0.0", - "nspell": "^2.0.0", - "quotation": "^1.1.0", - "unist-util-visit": "^1.0.0" - } - }, - "node_modules/retext-stringify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz", - "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==", - "dependencies": { - "nlcst-to-string": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-syntax-mentions": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/retext-syntax-mentions/-/retext-syntax-mentions-1.1.6.tgz", - "integrity": "sha512-e6+Kh3dhzdBn0mHeiiKGUJMMqKTC7O2t+blKZWR1VeP0Kbm6CU4D1p5r+eH24GNCWRnqv3NbDk7RbdALqPLTeQ==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.0" - } - }, - "node_modules/retext-syntax-urls": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/retext-syntax-urls/-/retext-syntax-urls-1.0.2.tgz", - "integrity": "sha512-Ud7i50IEP33OK9g5xCBIKh/DjoEdZi6sRJqnWDW3Wxt4B48llgfSbGLgiLeXZvJD923mOf7EAoLt/WjundXmwg==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "unist-util-is": "^3.0.0", - "unist-util-modify-children": "^1.1.1", - "unist-util-position": "^3.0.0" - } - }, - "node_modules/retext-syntax-urls/node_modules/unist-util-modify-children": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz", - "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==", - "dependencies": { - "array-iterate": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/retext/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/retext/node_modules/unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^2.0.0", - "x-is-string": "^0.1.0" - } - }, - "node_modules/retext/node_modules/unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "node_modules/retext/node_modules/vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", - "dependencies": { - "is-buffer": "^1.1.4", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rndm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", - "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" - }, - "node_modules/router": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/router/-/router-1.3.5.tgz", - "integrity": "sha512-kozCJZUhuSJ5VcLhSb3F8fsmGXy+8HaDbKCAerR1G6tq3mnMZFMuSohbFvGv1c5oMFipijDjRZuuN/Sq5nMf3g==", - "dependencies": { - "array-flatten": "3.0.0", - "debug": "2.6.9", - "methods": "~1.1.2", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "setprototypeof": "1.2.0", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/router/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/run-waterfall": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz", - "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node_modules/server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=" - }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/sha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz", - "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==", - "dependencies": { - "graceful-fs": "^4.1.2" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slugify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.0.tgz", - "integrity": "sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" - }, - "node_modules/spellchecker-cli": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.8.0.tgz", - "integrity": "sha512-ZGJSm5Q6Cef2+XswPMYeZEmUgSGoOKKicNOQE4b0eVAPHAimRp0zemg8E1SErIkB+rECTt3A7akJLIkXaEVTyA==", - "dependencies": { - "app-root-path": "^3.0.0", - "chalk": "^2.4.2", - "command-line-args": "^5.1.1", - "command-line-usage": "^5.0.4", - "dictionary-en-au": "^2.3.0", - "dictionary-en-ca": "^2.3.0", - "dictionary-en-gb": "^2.3.0", - "dictionary-en-us": "^2.2.1", - "dictionary-en-za": "^2.0.4", - "dictionary-vi": "^2.1.3", - "fs-extra": "^6.0.1", - "globby": "^11.0.0", - "js-yaml": "^3.14.1", - "jsonc": "^2.0.0", - "junit-report-builder": "^1.3.3", - "lodash": "^4.17.21", - "remark": "^13.0.0", - "remark-frontmatter": "^3.0.0", - "remark-gemoji-to-emoji": "^1.1.0", - "remark-retext": "^3.1.3", - "retext": "^5.0.0", - "retext-indefinite-article": "^1.1.7", - "retext-repeated-words": "^1.2.3", - "retext-spell": "^2.4.1", - "retext-syntax-mentions": "^1.1.6", - "retext-syntax-urls": "^1.0.2", - "toml": "^3.0.0", - "unist-util-visit": "^1.4.1", - "vfile": "^3.0.1", - "vfile-reporter": "^6.0.0" - }, - "bin": { - "spellchecker": "build/index.js" - } - }, - "node_modules/spellchecker-cli/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spellchecker-cli/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/spellchecker-cli/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spellchecker-cli/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/spellchecker-cli/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/spellchecker-cli/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/spellchecker-cli/node_modules/fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/spellchecker-cli/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/spellchecker-cli/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/spellchecker-cli/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/spellchecker-cli/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/spellchecker-cli/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/split": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", - "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/strftime": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", - "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", - "integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/subleveldown": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-5.0.1.tgz", - "integrity": "sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw==", - "dependencies": { - "abstract-leveldown": "^6.3.0", - "encoding-down": "^6.2.0", - "inherits": "^2.0.3", - "level-option-wrap": "^1.1.0", - "levelup": "^4.4.0", - "reachdown": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/subleveldown/node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/subleveldown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/symlink-or-copy": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz", - "integrity": "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==" - }, - "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table-layout": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", - "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", - "dependencies": { - "array-back": "^2.0.0", - "deep-extend": "~0.6.0", - "lodash.padend": "^4.6.1", - "typical": "^2.6.1", - "wordwrapjs": "^3.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dependencies": { - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/tap-out": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", - "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", - "dependencies": { - "re-emitter": "1.1.3", - "readable-stream": "2.2.9", - "split": "1.0.0", - "trim": "0.0.1" - }, - "bin": { - "tap-out": "bin/cmd.js" - } - }, - "node_modules/tap-out/node_modules/process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "node_modules/tap-out/node_modules/readable-stream": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", - "dependencies": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/tap-out/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/tap-out/node_modules/string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/tap-spec": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", - "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", - "dependencies": { - "chalk": "^1.0.0", - "duplexer": "^0.1.1", - "figures": "^1.4.0", - "lodash": "^4.17.10", - "pretty-ms": "^2.1.0", - "repeat-string": "^1.5.2", - "tap-out": "^2.1.0", - "through2": "^2.0.0" - }, - "bin": { - "tap-spec": "bin/cmd.js", - "tspec": "bin/cmd.js" - } - }, - "node_modules/tap-spec/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tap-spec/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tap-spec/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tap-spec/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tap-spec/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tap-spec/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tape": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.3.0.tgz", - "integrity": "sha512-C4MJ44uuvFail8XhZD6D2j2u1+lar6KMkEdtJBApkC/5Hfk99OvyRcQFwiHWZLKwvxnEDeXBoTRw53p1o3Wgxw==", - "dependencies": { - "call-bind": "^1.0.2", - "deep-equal": "^2.0.5", - "defined": "^1.0.0", - "dotignore": "^0.1.2", - "for-each": "^0.3.3", - "get-package-type": "^0.1.0", - "glob": "^7.1.7", - "has": "^1.0.3", - "has-dynamic-import": "^2.0.0", - "inherits": "^2.0.4", - "is-regex": "^1.1.3", - "minimist": "^1.2.5", - "object-inspect": "^1.11.0", - "object-is": "^1.1.5", - "object.assign": "^4.1.2", - "resolve": "^2.0.0-next.3", - "resumer": "^0.0.0", - "string.prototype.trim": "^1.2.4", - "through": "^2.3.8" - }, - "bin": { - "tape": "bin/tape" - } - }, - "node_modules/tape/node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "node_modules/tape/node_modules/resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/tiny-each-async": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", - "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=" - }, - "node_modules/tiny-json-http": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.0.tgz", - "integrity": "sha512-dZrf9ZGZQhe8QhhPN3o4uDCQuBc3Gaq4CtbU/67hQDWXuvjLI1mayr8AOFSiUGa3F818SpIgUnC3mM673VRHGQ==" - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", - "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", - "dependencies": { - "json5": "^2.2.0", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "engines": { - "node": ">=0.6.x" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "node_modules/unist-util-modify-children": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz", - "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==", - "dependencies": { - "array-iterate": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "dependencies": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "node_modules/unist-util-visit-children": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", - "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "dependencies": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "node_modules/vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "dependencies": { - "unist-util-stringify-position": "^1.1.1" - } - }, - "node_modules/vfile-message/node_modules/unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "node_modules/vfile-reporter": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz", - "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==", - "dependencies": { - "repeat-string": "^1.5.0", - "string-width": "^4.0.0", - "supports-color": "^6.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-sort": "^2.1.2", - "vfile-statistics": "^1.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-reporter/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/vfile-reporter/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/vfile-sort": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.2.tgz", - "integrity": "sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-statistics": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.4.tgz", - "integrity": "sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile/node_modules/unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrapjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", - "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", - "dependencies": { - "reduce-flatten": "^1.0.1", - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", - "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, - "node_modules/yesno": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.3.1.tgz", - "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==" - }, - "node_modules/zip-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz", - "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==", - "dependencies": { - "async": "^3.2.0", - "jszip": "^3.2.2" - } - }, - "node_modules/zip-dir/node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "node_modules/zipit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/zipit/-/zipit-2.0.0.tgz", - "integrity": "sha512-e/y9Xf1eYElSSo1s1e1+0QraquqaCmfnCvxd2IlvILtKK+F93kpV+/TIRUDYW7UnYtDMeYijG5kyEA7B+66wgg==", - "dependencies": { - "insync": "2.1.1", - "yazl": "2.5.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - }, - "dependencies": { - "@architect/architect": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.0.0.tgz", - "integrity": "sha512-GY2RkO+Fxu+Qqbbfnz5FV2a717mrzsHkBj5JyoaT7fdLIeUWKIhKw2/Cis/dRmZ0daexExdU+5sbjkbvouZ1lw==", - "requires": { - "@architect/create": "2.0.1", - "@architect/deploy": "3.0.2", - "@architect/destroy": "2.0.1", - "@architect/env": "2.0.2", - "@architect/hydrate": "2.0.2", - "@architect/logs": "3.0.1", - "@architect/package": "7.0.1", - "@architect/sandbox": "4.0.1", - "aws-sdk": "2.880.0", - "chalk": "4.1.1", - "update-notifier": "5.1.0" - } - }, - "@architect/asap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-4.0.0.tgz", - "integrity": "sha512-+nsSVPT1+rEJN625UKuX63h3bfJQ/ZyWaeOTwe2dw9Lft0FeNXB/r+SQUw+GZkOQT1KzhHTkMATgPGqQQOhPVw==" - }, - "@architect/create": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@architect/create/-/create-2.0.1.tgz", - "integrity": "sha512-hhtBzssC3RIGY6a1r3nZ71VEhKeD19wDBU/SNHrg503GVc4mPRHPX7QxlQC1TsLsnTowC2ZmPoy5Zt+zYkfNaw==", - "requires": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "chalk": "~4.1.1", - "run-parallel": "~1.2.0", - "run-series": "~1.1.9" - } - }, - "@architect/deploy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.0.2.tgz", - "integrity": "sha512-SNdKCObpvOHer8JWQTOcwazF15bDVMm6tv8LZojSsoORwH6f7u1rRYwL4aLQmuaGBU3HTVmwveTq6E3KSCVQ1Q==", - "requires": { - "@architect/create": "~2.0.1", - "@architect/hydrate": "~2.0.2", - "@architect/inventory": "~2.0.4", - "@architect/package": "~7.0.1", - "@architect/utils": "~3.0.2", - "chalk": "~4.1.1", - "fs-extra": "~10.0.0", - "get-folder-size": "~2.0.1", - "glob": "~7.1.7", - "mime-types": "~2.1.32", - "ospath": "~1.2.2", - "path-sort": "~0.1.0", - "rimraf": "~3.0.2", - "run-parallel": "~1.2.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0", - "zip-dir": "~2.0.0", - "zipit": "~2.0.0" - } - }, - "@architect/destroy": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-2.0.1.tgz", - "integrity": "sha512-wnVfg/5XXuIw0Gu9on9w4XG1UU+n7IdnotXZQHsx3gFRy270A+HmV9xTQYdZWONUMN0X/Wt0df+CkmiUdK/9SQ==", - "requires": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "aws-sdk": "2.880.0", - "run-parallel": "~1.2.0", - "run-waterfall": "~1.1.7" - } - }, - "@architect/env": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@architect/env/-/env-2.0.2.tgz", - "integrity": "sha512-rm/8SFA6YQ6Jm0hxkfdYh9hiFEsM8v4YsvGkq6UpNuEfRFOzjIiH7jZgx0bcpxzqsaI/2AtWAG9iYh7YW67S/A==", - "requires": { - "@architect/inventory": "~2.0.4", - "@architect/parser": "~4.0.1", - "@architect/utils": "~3.0.2", - "aws-sdk": "2.880.0", - "chalk": "~4.1.1", - "cross-env": "~7.0.3", - "dotenv": "~10.0.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "yesno": "~0.3.1" - } - }, - "@architect/eslint-config": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@architect/eslint-config/-/eslint-config-1.0.1.tgz", - "integrity": "sha512-F4odTXDcCLav7gz/o3sm7r4fGdbxebRQPhhG7ndr/m1gL9ViLSrlqLhxta1HP6F0G3KWDhMvswVkCAk6j8AI0A==", - "requires": { - "eslint-plugin-filenames": "^1.3.2", - "eslint-plugin-fp": "^2.3.0", - "eslint-plugin-import": "^2.23.4" - } - }, - "@architect/functions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.0.0.tgz", - "integrity": "sha512-7ruYcsuCmz1R1DRCeTqeY8rxuEw8cGH5XZs4zY7vHYaLQPKD/+zp66H81uoGZO5x2n24RCZsBipi66RTCSW6uA==", - "requires": { - "aws-serverless-express": "^3.4.0", - "cookie": "^0.4.1", - "cookie-signature": "^1.1.0", - "csrf": "^3.1.0", - "node-webtokens": "^1.0.4", - "run-parallel": "^1.2.0", - "run-waterfall": "^1.1.7", - "uid-safe": "^2.1.5" - } - }, - "@architect/hydrate": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.0.2.tgz", - "integrity": "sha512-iGDF0c72S1XpjZP2UrSDdZY1SwvQaia58UuoUvmIkL2LHRp63RTdp3/WHObsq2kaZsVrwj88QEexOfkuIJejGw==", - "requires": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "acorn-loose": "~8.1.0", - "chalk": "~4.1.1", - "cpr": "~3.0.1", - "esquery": "~1.4.0", - "glob": "~7.1.7", - "rimraf": "~3.0.2", - "run-series": "~1.1.9", - "symlink-or-copy": "~1.3.1" - } - }, - "@architect/inventory": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-2.0.4.tgz", - "integrity": "sha512-mLqnb6eDXhTngV0yyV9jCro4f/pzvtpHEGDaWUB+N2t2b8z9MdrT81S4fQxtDdji1RuGBJ2LiOdV+1DsD98DhA==", - "requires": { - "@architect/asap": "~4.0.0", - "@architect/parser": "~4.0.1", - "@architect/utils": "~3.0.2" - } - }, - "@architect/logs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-3.0.1.tgz", - "integrity": "sha512-mo54rs4xJr88DQ0CWu0qmTJYI3NlNKFpUOieh6rCSrQtVfLTrSShZ4QtZa7vMnckaCfMehLE4uXJWDo6VSoelg==", - "requires": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "aws-sdk": "2.880.0", - "chalk": "~4.1.1", - "run-parallel": "~1.2.0", - "run-waterfall": "~1.1.7", - "strftime": "~0.10.0" - } - }, - "@architect/package": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@architect/package/-/package-7.0.1.tgz", - "integrity": "sha512-vizJLvxqWVbJZRDrBVCEuJujKxTBclfPgInzHGsPB8/XaHgic5ayT54omjQ29mEElUpQOGAleub48Aq8Oq5cOg==", - "requires": { - "@architect/inventory": "~2.0.4", - "@architect/utils": "~3.0.2", - "chalk": "~4.1.1" - } - }, - "@architect/parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-4.0.1.tgz", - "integrity": "sha512-/YDxwuv0QgN1NsudPMavPRCdEN5I144CatRLftfMCjVH3bxk9wF3Q6kubiAsNF16FvcwCXtWk7N5MRro93DHQQ==" - }, - "@architect/sandbox": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.0.1.tgz", - "integrity": "sha512-g37QOTB2dpNdnCIOgI4gAP0DG+5M50qocuS2IlgKD/ft/QfxylTLPKpw6UnG0NjQ7Gg8o0fW4lVa+YTlXDPqcw==", - "requires": { - "@architect/asap": "~4.0.0", - "@architect/create": "~2.0.1", - "@architect/hydrate": "~2.0.2", - "@architect/inventory": "~2.0.4", - "@architect/parser": "~4.0.1", - "@architect/utils": "~3.0.2", - "@begin/hashid": "~1.0.0", - "aws-sdk": "2.880.0", - "body-parser": "~1.19.0", - "chalk": "~4.1.1", - "depstatus": "~1.1.1", - "dotenv": "~10.0.0", - "dynalite": "~3.2.1", - "finalhandler": "~1.1.2", - "glob": "~7.1.7", - "http-proxy": "~1.18.1", - "node-watch": "~0.7.1", - "router": "~1.3.5", - "run-parallel": "~1.2.0", - "run-series": "~1.1.9", - "send": "~0.17.1", - "server-destroy": "~1.0.1", - "tree-kill": "~1.2.2", - "update-notifier": "~5.1.0", - "ws": "~7.5.3" - } - }, - "@architect/utils": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.0.2.tgz", - "integrity": "sha512-RJxm6tS1QdJG/l+uv+T9I2MyGlePUH2eQwzt+yayI8T141TBa6NR2sPHvfIbRQk01n9eF/qGvIkbARI8teOPkw==", - "requires": { - "chalk": "~4.1.1", - "glob": "~7.1.7", - "path-sort": "~0.1.0", - "restore-cursor": "~3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@begin/hashid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@begin/hashid/-/hashid-1.0.0.tgz", - "integrity": "sha512-w+U9klEtRkt7hyW/f+/SvwPgJ4CTMO2ENddisX9dGgLUZKu+iKpb/IhYnQWIt9/Nnm/5DkApmiHGimPs621wwA==" - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@toycode/markdown-it-class": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz", - "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ==" - }, - "@types/mdast": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.7.tgz", - "integrity": "sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg==", - "requires": { - "@types/unist": "*" - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "@vendia/serverless-express": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-3.4.0.tgz", - "integrity": "sha512-/UAAbi9qRjUtjRISt5MJ1sfhtrHb26hqQ0nvE5qhMLsAdR5H7ErBwPD8Q/v2OENKm0iWsGwErIZEg7ebUeFDjQ==", - "requires": { - "binary-case": "^1.0.0", - "type-is": "^1.6.16" - } - }, - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, - "acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==" - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} - }, - "acorn-loose": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.1.0.tgz", - "integrity": "sha512-+X1zk54qiOWwIRywGBhfz8sLHFJ/adQRuVqn25m4HuD7/+GTXM1c0b3LH0bWerQ0H97lTk2GyuScGbSiQK9M1g==", - "requires": { - "acorn": "^8.2.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" - }, - "array-flatten": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", - "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" - }, - "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" - } - }, - "array-iterate": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", - "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "available-typed-arrays": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", - "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" - }, - "aws-sdk": { - "version": "2.880.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.880.0.tgz", - "integrity": "sha512-/dBk3ejw22ED2edzGfmJB83KXDA4wLIw5Hb+2YMhly+gOWecvevy0tML2+YN/cmxyTy+wT0E0sM7fm1v7kmHtw==", - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - } - }, - "aws-serverless-express": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.4.0.tgz", - "integrity": "sha512-YG9ZjAOI9OpwqDDWzkRc3kKJYJuR7gTMjLa3kAWopO17myoprxskCUyCEee+RKe34tcR4UNrVtgAwW5yDe74bw==", - "requires": { - "@vendia/serverless-express": "^3.4.0", - "binary-case": "^1.0.0", - "type-is": "^1.6.16" - } - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz", - "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "command-line-args": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", - "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "command-line-usage": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", - "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", - "requires": { - "array-back": "^2.0.0", - "chalk": "^2.4.1", - "table-layout": "^0.4.3", - "typical": "^2.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "requires": { - "typical": "^2.6.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "cookie-signature": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz", - "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cpr": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz", - "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=", - "requires": { - "graceful-fs": "^4.1.5", - "minimist": "^1.2.0", - "mkdirp": "~0.5.1", - "rimraf": "^2.5.4" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "create-eslint-index": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/create-eslint-index/-/create-eslint-index-1.0.0.tgz", - "integrity": "sha1-2VQ3LYbVeS/NZ+nyt5GxqxYkEbs=", - "requires": { - "lodash.get": "^4.3.0" - } - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "csrf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", - "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==", - "requires": { - "rndm": "1.2.0", - "tsscmp": "1.0.6", - "uid-safe": "2.1.5" - } - }, - "date-format": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.2.tgz", - "integrity": "sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-equal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", - "requires": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", - "isarray": "^2.0.5", - "object-is": "^1.1.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "requires": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "depstatus": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depstatus/-/depstatus-1.1.1.tgz", - "integrity": "sha512-QT4i2Ql8RS1ttcj7zo4RzYvKz+/eOOIh6N7CXHqfDqC5ZX1hfx5KX6T88gy/j2UWP2x2ytjSoFBl+XW0gVZMug==", - "requires": { - "semver": "^7.3.2" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "dictionary-en-au": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.3.0.tgz", - "integrity": "sha512-KoEotpXPCyCgZ5DHlexHyzFfNwPnv9VupeCrp6r+JrtEkycPmZYbQiXF+cXz9NJr1gXy0AMEpzZ8UfxF40+8OQ==" - }, - "dictionary-en-ca": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.3.0.tgz", - "integrity": "sha512-5p6B2+GLByVz3Gvb42Y5hTdFBNxJhgG7XRVM74J7hcp+DvtAfOrufTZFfkux9t0qWOjORZoDCmDI6uKiX8qeuQ==" - }, - "dictionary-en-gb": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.3.0.tgz", - "integrity": "sha512-P/J2VQp/hDsMTfJhmIYPUBxZqezWuDaUzSgb6oW7JLpUV2So9jCXbR5TaUYXwfO50ZXPYEzQqQHPQK3pKcs7Rg==" - }, - "dictionary-en-us": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dictionary-en-us/-/dictionary-en-us-2.2.1.tgz", - "integrity": "sha512-Z8mycV0ywTfjbUTi0JZfQHqBZhu4CYFtpf7KluSGpt3xHpFlal2S/hiK50tlPynOtR5K3pG5wCradnz1yxwOHA==" - }, - "dictionary-en-za": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.0.4.tgz", - "integrity": "sha512-EgI61DvQsrnIFBmmCz7GB9P/wkCnKnZgKRXyYpbkZomnY0I4vDfNZtjaX81lwb9s+eudP9QJ+8sMzK7eoUapEg==" - }, - "dictionary-vi": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.1.3.tgz", - "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "requires": { - "minimatch": "^3.0.4" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "dynalite": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz", - "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==", - "requires": { - "async": "^2.6.3", - "big.js": "^5.2.2", - "buffer-crc32": "^0.2.13", - "lazy": "^1.0.11", - "leveldown": "^5.2.1", - "levelup": "^4.4.0", - "lock": "^1.1.0", - "memdown": "^5.1.0", - "minimist": "^1.2.5", - "once": "^1.4.0", - "subleveldown": "^5.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "requires": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", - "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "eslint-ast-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", - "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", - "requires": { - "lodash.get": "^4.4.2", - "lodash.zip": "^4.2.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - } - }, - "eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", - "requires": { - "debug": "^3.2.7", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "eslint-plugin-filenames": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", - "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", - "requires": { - "lodash.camelcase": "4.3.0", - "lodash.kebabcase": "4.1.1", - "lodash.snakecase": "4.1.1", - "lodash.upperfirst": "4.3.1" - } - }, - "eslint-plugin-fp": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-fp/-/eslint-plugin-fp-2.3.0.tgz", - "integrity": "sha1-N20qEIcQ6YGYC9w4deO5kg2gSJw=", - "requires": { - "create-eslint-index": "^1.0.0", - "eslint-ast-utils": "^1.0.0", - "lodash": "^4.13.1", - "req-all": "^0.1.0" - } - }, - "eslint-plugin-import": { - "version": "2.23.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", - "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", - "requires": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.1", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.4.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.3", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "requires": { - "@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": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fast-safe-stringify": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", - "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==" - }, - "fastq": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", - "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "requires": { - "format": "^0.2.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "requires": { - "array-back": "^3.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" - }, - "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "gar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", - "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==" - }, - "gemoji": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-4.2.1.tgz", - "integrity": "sha512-V9lUpRSn+KQGavZx8Pk+6mxG3kaz21ae2kTCXuT36KaRPNgYU8eHtj/RcUCNFVvmwppsYYz3nnNS9lmcP5kTsg==" - }, - "get-folder-size": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", - "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", - "requires": { - "gar": "^1.0.4", - "tiny-each-async": "2.0.3" - } - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "requires": { - "ini": "2.0.0" - } - }, - "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" - } - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" - }, - "has-dynamic-import": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.0.tgz", - "integrity": "sha512-GYPi/aZmACJVrVfEhP1rNUFmtCuK+SQ96mn8Bs7mXiGZRAJiI4VjaMmjj4uuvW8qaF085uWJvyJk9UNYUIYn0A==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - }, - "highlight.js": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.1.0.tgz", - "integrity": "sha512-X9VVhYKHQPPuwffO8jk4bP/FVj+ibNCy3HxZZNDXFtJrq4O5FdcdCDRIkDis5MiMnjh7UwEdHgRZJcHFYdzDdA==" - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - }, - "insync": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/insync/-/insync-2.1.1.tgz", - "integrity": "sha1-IuJsYRITA8BvUdNaPM9tj8HpFMQ=" - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" - }, - "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" - }, - "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" - }, - "is-weakset": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", - "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==" - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", - "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", - "requires": { - "fast-safe-stringify": "^2.0.6", - "graceful-fs": "^4.1.15", - "mkdirp": "^0.5.1", - "parse-json": "^4.0.0", - "strip-bom": "^4.0.0", - "strip-json-comments": "^3.0.1" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - } - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jszip": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.0.tgz", - "integrity": "sha512-Y2OlFIzrDOPWUnpU0LORIcDn2xN7rC9yKffFM/7pGhQuhO+SUhfm2trkJ/S5amjFvem0Y+1EALz/MEPkvHXVNw==", - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "junit-report-builder": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-1.3.3.tgz", - "integrity": "sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw==", - "requires": { - "date-format": "0.0.2", - "lodash": "^4.17.15", - "mkdirp": "^0.5.0", - "xmlbuilder": "^10.0.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { - "package-json": "^6.3.0" - } - }, - "lazy": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=" - }, - "level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "requires": { - "buffer": "^5.6.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==" - }, - "level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - } - }, - "level-option-wrap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz", - "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=", - "requires": { - "defined": "~0.0.0" - } - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "requires": { - "xtend": "^4.0.2" - } - }, - "leveldown": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", - "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", - "optional": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "napi-macros": "~2.0.0", - "node-gyp-build": "~4.1.0" - } - }, - "levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "requires": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "requires": { - "immediate": "~3.0.5" - }, - "dependencies": { - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - } - } - }, - "linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lock": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", - "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" - }, - "lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" - }, - "lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=" - }, - "lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" - }, - "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "markdown-it": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.1.0.tgz", - "integrity": "sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==", - "requires": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "markdown-it-anchor": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.1.2.tgz", - "integrity": "sha512-9D58TKK4dakqmjcmVuqHoB3ntKBpQJ0Ld38B83aiHJcBD72IZIyPjNtihPA6ayRI5WD33e1W68mArliNLHCprg==", - "requires": {} - }, - "markdown-it-front-matter": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/markdown-it-front-matter/-/markdown-it-front-matter-0.2.3.tgz", - "integrity": "sha512-s9+rcClLmZsZc3YL8Awjg/YO/VdphlE20LJ9Bx5a8RAFLI5a1vq6Mll8kOzG6w/wy8yhFLBupaa6Mfd60GATkA==" - }, - "mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "mdast-util-frontmatter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", - "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", - "requires": { - "micromark-extension-frontmatter": "^0.2.0" - } - }, - "mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "requires": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - } - }, - "mdast-util-to-nlcst": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz", - "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==", - "requires": { - "nlcst-to-string": "^2.0.0", - "repeat-string": "^1.5.2", - "unist-util-position": "^3.0.0", - "vfile-location": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "requires": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "requires": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "micromark-extension-frontmatter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", - "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", - "requires": { - "fault": "^1.0.0" - } - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "requires": { - "mime-db": "1.49.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "nlcst-is-literal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/nlcst-is-literal/-/nlcst-is-literal-1.2.2.tgz", - "integrity": "sha512-R+1OJEmRl3ZOp9d8PbiRxGpnvmpi3jU+lzSqCJoLeogdEh0FYDRH1aC223qUbaKffxNTJkEfeDOeQfziw749yA==", - "requires": { - "nlcst-to-string": "^2.0.0" - } - }, - "nlcst-to-string": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", - "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==" - }, - "node-gyp-build": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", - "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", - "optional": true - }, - "node-watch": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.1.tgz", - "integrity": "sha512-UWblPYuZYrkCQCW5PxAwYSxaELNBLUckrTBBk8xr1/bUgyOkYYTsUcV4e3ytcazFEOyiRyiUrsG37pu6I0I05g==" - }, - "node-webtokens": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-webtokens/-/node-webtokens-1.0.4.tgz", - "integrity": "sha512-Sla56CeSLWvPbwud2kogqf5edQtKNXZBtXDDpmOzAgNZjwETbK/Am6PXfs54iZPLBm8K8amZ9XWaCQwGqZmKyQ==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "nspell": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/nspell/-/nspell-2.1.5.tgz", - "integrity": "sha512-PSStyugKMiD9mHmqI/CR5xXrSIGejUXPlo88FBRq5Og1kO5QwQ5Ilu8D8O5I/SHpoS+mibpw6uKA8rd3vXd2Sg==", - "requires": { - "is-buffer": "^2.0.0" - } - }, - "number-to-words": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/number-to-words/-/number-to-words-1.2.4.tgz", - "integrity": "sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "requires": { - "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" - } - }, - "ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-latin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz", - "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==", - "requires": { - "nlcst-to-string": "^2.0.0", - "unist-util-modify-children": "^2.0.0", - "unist-util-visit-children": "^1.0.0" - } - }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-sort": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-sort/-/path-sort-0.1.0.tgz", - "integrity": "sha1-ywF11Oy/paGP5nTMbXIL/hXguAU=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "requires": { - "find-up": "^2.1.0" - } - }, - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "requires": { - "is-finite": "^1.0.1", - "parse-ms": "^1.0.0", - "plur": "^1.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quotation": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/quotation/-/quotation-1.1.3.tgz", - "integrity": "sha512-45gUgmX/RtQOQV1kwM06boP49OYXcKCPrYwdmAvs5YqkpiobhNKKwo524JM6Ma0ko3oN9tXNcWs9+ABq3Ry7YA==" - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } - } - }, - "re-emitter": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", - "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=" - }, - "reachdown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reachdown/-/reachdown-1.1.0.tgz", - "integrity": "sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==" - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "reduce-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", - "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=" - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" - } - }, - "remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "requires": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - } - }, - "remark-frontmatter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", - "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", - "requires": { - "mdast-util-frontmatter": "^0.2.0", - "micromark-extension-frontmatter": "^0.2.0" - } - }, - "remark-gemoji-to-emoji": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remark-gemoji-to-emoji/-/remark-gemoji-to-emoji-1.1.0.tgz", - "integrity": "sha1-Pc0KiBGgyBu2NROsCzbyJYpVMPU=", - "requires": { - "gemoji": "^4.0.0", - "unist-util-visit": "^1.0.0" - } - }, - "remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "requires": { - "mdast-util-from-markdown": "^0.8.0" - } - }, - "remark-retext": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz", - "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==", - "requires": { - "mdast-util-to-nlcst": "^3.2.0" - } - }, - "remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "requires": { - "mdast-util-to-markdown": "^0.6.0" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "req-all": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/req-all/-/req-all-0.1.0.tgz", - "integrity": "sha1-EwBR4qzligLqy/ydRIV3pzapJzo=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "~2.3.4" - } - }, - "retext": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-5.0.0.tgz", - "integrity": "sha1-XZAYxKZ31hA8FCNi129Q6x05i/Y=", - "requires": { - "retext-latin": "^2.0.0", - "retext-stringify": "^2.0.0", - "unified": "^6.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^2.0.0", - "x-is-string": "^0.1.0" - } - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", - "requires": { - "is-buffer": "^1.1.4", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - } - } - }, - "retext-indefinite-article": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/retext-indefinite-article/-/retext-indefinite-article-1.1.7.tgz", - "integrity": "sha512-pqvEfEHL8uoeonbEjk8+d/hmyA3ozIeNTl4t3uurMcBpoIqN3+nbuMCFQrfDy2wjaKZ40KsLmEi+Zjv7m1ejLQ==", - "requires": { - "format": "^0.2.2", - "nlcst-to-string": "^2.0.0", - "number-to-words": "^1.2.3", - "unist-util-is": "^3.0.0", - "unist-util-visit": "^1.1.0" - } - }, - "retext-latin": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz", - "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==", - "requires": { - "parse-latin": "^4.0.0", - "unherit": "^1.0.4" - } - }, - "retext-repeated-words": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/retext-repeated-words/-/retext-repeated-words-1.2.3.tgz", - "integrity": "sha512-s51ybhXsHvpHpM44y9hayqcIDMo9g5QBZoOpPUosX3CfobZbgH7CZHbME8TOEcduR7OqGtNZ8JLKVFwi9QAKqA==", - "requires": { - "nlcst-to-string": "^2.0.0", - "unist-util-is": "^3.0.0", - "unist-util-visit": "^1.1.0" - } - }, - "retext-spell": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/retext-spell/-/retext-spell-2.4.1.tgz", - "integrity": "sha512-l2C37Sz+JMLgUJHqqNA2bV3Qqh7V6zWT3fCi8MtsZn2PoanDh57Tz2NW/DJpoEIsK9mV7o2EMvQmIMt5cgcgAg==", - "requires": { - "lodash.includes": "^4.2.0", - "nlcst-is-literal": "^1.0.0", - "nlcst-to-string": "^2.0.0", - "nspell": "^2.0.0", - "quotation": "^1.1.0", - "unist-util-visit": "^1.0.0" - } - }, - "retext-stringify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz", - "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==", - "requires": { - "nlcst-to-string": "^2.0.0" - } - }, - "retext-syntax-mentions": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/retext-syntax-mentions/-/retext-syntax-mentions-1.1.6.tgz", - "integrity": "sha512-e6+Kh3dhzdBn0mHeiiKGUJMMqKTC7O2t+blKZWR1VeP0Kbm6CU4D1p5r+eH24GNCWRnqv3NbDk7RbdALqPLTeQ==", - "requires": { - "nlcst-to-string": "^2.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.0" - } - }, - "retext-syntax-urls": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/retext-syntax-urls/-/retext-syntax-urls-1.0.2.tgz", - "integrity": "sha512-Ud7i50IEP33OK9g5xCBIKh/DjoEdZi6sRJqnWDW3Wxt4B48llgfSbGLgiLeXZvJD923mOf7EAoLt/WjundXmwg==", - "requires": { - "nlcst-to-string": "^2.0.0", - "unist-util-is": "^3.0.0", - "unist-util-modify-children": "^1.1.1", - "unist-util-position": "^3.0.0" - }, - "dependencies": { - "unist-util-modify-children": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz", - "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==", - "requires": { - "array-iterate": "^1.0.0" - } - } - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rndm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", - "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" - }, - "router": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/router/-/router-1.3.5.tgz", - "integrity": "sha512-kozCJZUhuSJ5VcLhSb3F8fsmGXy+8HaDbKCAerR1G6tq3mnMZFMuSohbFvGv1c5oMFipijDjRZuuN/Sq5nMf3g==", - "requires": { - "array-flatten": "3.0.0", - "debug": "2.6.9", - "methods": "~1.1.2", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "setprototypeof": "1.2.0", - "utils-merge": "1.0.1" - }, - "dependencies": { - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==" - }, - "run-waterfall": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz", - "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz", - "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==", - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "slugify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.0.tgz", - "integrity": "sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" - }, - "spellchecker-cli": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.8.0.tgz", - "integrity": "sha512-ZGJSm5Q6Cef2+XswPMYeZEmUgSGoOKKicNOQE4b0eVAPHAimRp0zemg8E1SErIkB+rECTt3A7akJLIkXaEVTyA==", - "requires": { - "app-root-path": "^3.0.0", - "chalk": "^2.4.2", - "command-line-args": "^5.1.1", - "command-line-usage": "^5.0.4", - "dictionary-en-au": "^2.3.0", - "dictionary-en-ca": "^2.3.0", - "dictionary-en-gb": "^2.3.0", - "dictionary-en-us": "^2.2.1", - "dictionary-en-za": "^2.0.4", - "dictionary-vi": "^2.1.3", - "fs-extra": "^6.0.1", - "globby": "^11.0.0", - "js-yaml": "^3.14.1", - "jsonc": "^2.0.0", - "junit-report-builder": "^1.3.3", - "lodash": "^4.17.21", - "remark": "^13.0.0", - "remark-frontmatter": "^3.0.0", - "remark-gemoji-to-emoji": "^1.1.0", - "remark-retext": "^3.1.3", - "retext": "^5.0.0", - "retext-indefinite-article": "^1.1.7", - "retext-repeated-words": "^1.2.3", - "retext-spell": "^2.4.1", - "retext-syntax-mentions": "^1.1.6", - "retext-syntax-urls": "^1.0.2", - "toml": "^3.0.0", - "unist-util-visit": "^1.4.1", - "vfile": "^3.0.1", - "vfile-reporter": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } - } - }, - "split": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", - "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", - "requires": { - "through": "2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "strftime": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", - "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "string.prototype.trim": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", - "integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "subleveldown": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-5.0.1.tgz", - "integrity": "sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw==", - "requires": { - "abstract-leveldown": "^6.3.0", - "encoding-down": "^6.2.0", - "inherits": "^2.0.3", - "level-option-wrap": "^1.1.0", - "levelup": "^4.4.0", - "reachdown": "^1.1.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "symlink-or-copy": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz", - "integrity": "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==" - }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - } - }, - "table-layout": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", - "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", - "requires": { - "array-back": "^2.0.0", - "deep-extend": "~0.6.0", - "lodash.padend": "^4.6.1", - "typical": "^2.6.1", - "wordwrapjs": "^3.0.0" - }, - "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "requires": { - "typical": "^2.6.1" - } - }, - "typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" - } - } - }, - "tap-out": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", - "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", - "requires": { - "re-emitter": "1.1.3", - "readable-stream": "2.2.9", - "split": "1.0.0", - "trim": "0.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "readable-stream": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", - "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tap-spec": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", - "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", - "requires": { - "chalk": "^1.0.0", - "duplexer": "^0.1.1", - "figures": "^1.4.0", - "lodash": "^4.17.10", - "pretty-ms": "^2.1.0", - "repeat-string": "^1.5.2", - "tap-out": "^2.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "tape": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.3.0.tgz", - "integrity": "sha512-C4MJ44uuvFail8XhZD6D2j2u1+lar6KMkEdtJBApkC/5Hfk99OvyRcQFwiHWZLKwvxnEDeXBoTRw53p1o3Wgxw==", - "requires": { - "call-bind": "^1.0.2", - "deep-equal": "^2.0.5", - "defined": "^1.0.0", - "dotignore": "^0.1.2", - "for-each": "^0.3.3", - "get-package-type": "^0.1.0", - "glob": "^7.1.7", - "has": "^1.0.3", - "has-dynamic-import": "^2.0.0", - "inherits": "^2.0.4", - "is-regex": "^1.1.3", - "minimist": "^1.2.5", - "object-inspect": "^1.11.0", - "object-is": "^1.1.5", - "object.assign": "^4.1.2", - "resolve": "^2.0.0-next.3", - "resumer": "^0.0.0", - "string.prototype.trim": "^1.2.4", - "through": "^2.3.8" - }, - "dependencies": { - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tiny-each-async": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", - "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=" - }, - "tiny-json-http": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.0.tgz", - "integrity": "sha512-dZrf9ZGZQhe8QhhPN3o4uDCQuBc3Gaq4CtbU/67hQDWXuvjLI1mayr8AOFSiUGa3F818SpIgUnC3mM673VRHGQ==" - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "tsconfig-paths": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", - "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", - "requires": { - "json5": "^2.2.0", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "requires": { - "random-bytes": "~1.0.0" - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "dependencies": { - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - } - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-modify-children": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz", - "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==", - "requires": { - "array-iterate": "^1.0.0" - } - }, - "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-children": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", - "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==" - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - } - } - }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - } - } - }, - "vfile-reporter": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz", - "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==", - "requires": { - "repeat-string": "^1.5.0", - "string-width": "^4.0.0", - "supports-color": "^6.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-sort": "^2.1.2", - "vfile-statistics": "^1.1.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "vfile-sort": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.2.tgz", - "integrity": "sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA==" - }, - "vfile-statistics": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.4.tgz", - "integrity": "sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "wordwrapjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", - "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", - "requires": { - "reduce-flatten": "^1.0.1", - "typical": "^2.6.1" - }, - "dependencies": { - "typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" - } - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "requires": {} - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - }, - "dependencies": { - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - } - } - }, - "xmlbuilder": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", - "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "requires": { - "buffer-crc32": "~0.2.3" - } - }, - "yesno": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.3.1.tgz", - "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==" - }, - "zip-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz", - "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==", - "requires": { - "async": "^3.2.0", - "jszip": "^3.2.2" - }, - "dependencies": { - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - } - } - }, - "zipit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/zipit/-/zipit-2.0.0.tgz", - "integrity": "sha512-e/y9Xf1eYElSSo1s1e1+0QraquqaCmfnCvxd2IlvILtKK+F93kpV+/TIRUDYW7UnYtDMeYijG5kyEA7B+66wgg==", - "requires": { - "insync": "2.1.1", - "yazl": "2.5.1" - } - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" - } - } -} From 995ae0ec427b7b1a270b5336b4751d2c3e1e294d Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 31 Aug 2021 15:43:26 -0600 Subject: [PATCH 108/680] start custom theme for Hemisu scheme --- public/css/syntax.css | 14 ++++++++++++++ public/static.json | 2 +- src/http/get-docs-000lang-catchall/highlighter.js | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 2053bcfc..e3e9360e 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -2,6 +2,20 @@ margin: 0; } +:root { + --shiki-color-text: #EEEEEE; + --shiki-color-background: #333333; + --shiki-token-constant: #660000; + --shiki-token-string: #770000; + --shiki-token-comment: #880000; + --shiki-token-keyword: #990000; + --shiki-token-parameter: #AA0000; + --shiki-token-function: #BB0000; + --shiki-token-string-expression: #CC0000; + --shiki-token-punctuation: #DD0000; + --shiki-token-link: #EE0000; +} + /* Code blocks */ .docs pre { padding: 1rem; diff --git a/public/static.json b/public/static.json index 22b7e4b9..207e0789 100644 --- a/public/static.json +++ b/public/static.json @@ -7,5 +7,5 @@ "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", "css/index.css": "css/index-d0b9d5ab0b.css", "css/styles.css": "css/styles-75499ddd30.css", - "css/syntax.css": "css/syntax-7394a1231e.css" + "css/syntax.css": "css/syntax-c8649aac10.css" } \ No newline at end of file diff --git a/src/http/get-docs-000lang-catchall/highlighter.js b/src/http/get-docs-000lang-catchall/highlighter.js index 7ee6e02c..0eb015a4 100644 --- a/src/http/get-docs-000lang-catchall/highlighter.js +++ b/src/http/get-docs-000lang-catchall/highlighter.js @@ -4,7 +4,7 @@ const arcGrammar = require('./arc.tmGrammar.json') module.exports.forMarkdown = async function () { const highlighter = await shiki.getHighlighter({ - theme: 'dracula-soft', + theme: 'css-variables', langs: [ 'bash', 'javascript', From c4c03e2c06865792e0b71aefa33d191f5425e55d Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 31 Aug 2021 16:36:14 -0600 Subject: [PATCH 109/680] adapt existing Hemisu-ish vim theme for Shiki to further improve highlighting we can use any VS Code theme. there doesn't seem to be one for Hemisu. so we could make one... :smile: --- package.json | 2 +- public/css/syntax.css | 29 +++++++++++-------- public/static.json | 2 +- src/views/docs/en/guides/extend/plugins.md | 2 +- .../en/guides/get-started/project-layout.md | 2 +- .../docs/en/guides/get-started/quickstart.md | 2 +- src/views/docs/en/reference/cli/env.md | 6 ++-- src/views/docs/en/reference/cli/sandbox.md | 14 ++++----- 8 files changed, 32 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index 0bbdc4a5..cfdc8dd6 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "markdown-it": "^12.1.0", "markdown-it-anchor": "^8.1.2", "markdown-it-front-matter": "^0.2.3", - "shiki": "^0.9.7", + "shiki": "^0.9.9", "slugify": "^1.6.0", "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", diff --git a/public/css/syntax.css b/public/css/syntax.css index e3e9360e..2fc8c0e5 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -2,24 +2,29 @@ margin: 0; } +/* Hemisu-ish vim theme */ :root { - --shiki-color-text: #EEEEEE; - --shiki-color-background: #333333; - --shiki-token-constant: #660000; - --shiki-token-string: #770000; - --shiki-token-comment: #880000; - --shiki-token-keyword: #990000; - --shiki-token-parameter: #AA0000; - --shiki-token-function: #BB0000; - --shiki-token-string-expression: #CC0000; - --shiki-token-punctuation: #DD0000; - --shiki-token-link: #EE0000; + --shiki-color-text: #eee; + --shiki-color-background: #282a36; + --shiki-token-constant: #9fd3e6; + --shiki-token-string: #b1d631; + --shiki-token-comment: #777; + --shiki-token-keyword: #bbffaa; + --shiki-token-parameter: #9fd3e6; + --shiki-token-function: #bbffaa; + --shiki-token-string-expression: #b1d631; + --shiki-token-punctuation: #eee; + --shiki-token-link: #ece1c8; } /* Code blocks */ +.docs pre.shiki { + /* https://github.com/shikijs/shiki/issues/214 */ + background-color: var(--shiki-color-background) !important; +} .docs pre { padding: 1rem; - margin-bottom: 1rem; + margin-bottom: 1.33rem; overflow: auto; border-radius: 0.3rem; } diff --git a/public/static.json b/public/static.json index 207e0789..7a87f30b 100644 --- a/public/static.json +++ b/public/static.json @@ -7,5 +7,5 @@ "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", "css/index.css": "css/index-d0b9d5ab0b.css", "css/styles.css": "css/styles-75499ddd30.css", - "css/syntax.css": "css/syntax-c8649aac10.css" + "css/syntax.css": "css/syntax-5387167f02.css" } \ No newline at end of file diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index 9423fe31..c293c16c 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -151,7 +151,7 @@ module.exports = { The above instructs Architect's various capabilities to interact with cloud functions under the `src/rules/` directory inside the project hierarchy. With the above `functions` method and given `app.arc` contents like so: -``` +```arc @rules rule-one rule-two diff --git a/src/views/docs/en/guides/get-started/project-layout.md b/src/views/docs/en/guides/get-started/project-layout.md index 10a278a3..0affc7b0 100644 --- a/src/views/docs/en/guides/get-started/project-layout.md +++ b/src/views/docs/en/guides/get-started/project-layout.md @@ -250,7 +250,7 @@ date="*String" Running `arc init` in the same directory as the file above generates the following Lambda function code: -``` +```bash . ├── src │ ├── http diff --git a/src/views/docs/en/guides/get-started/quickstart.md b/src/views/docs/en/guides/get-started/quickstart.md index 55746d53..e10765e4 100644 --- a/src/views/docs/en/guides/get-started/quickstart.md +++ b/src/views/docs/en/guides/get-started/quickstart.md @@ -55,7 +55,7 @@ arc deploy production Or eject to CloudFormation and deploy with the AWS SAM CLI: -``` +```bash arc deploy --dry-run sam package --template-file sam.json --output-template-file out.yaml --s3-bucket mybukkit sam deploy --template-file out.yaml --stack-name MyStack --s3-bucket mybukkit --capabilities CAPABILITY_IAM diff --git a/src/views/docs/en/reference/cli/env.md b/src/views/docs/en/reference/cli/env.md index fbc57fb7..00e95918 100644 --- a/src/views/docs/en/reference/cli/env.md +++ b/src/views/docs/en/reference/cli/env.md @@ -21,13 +21,13 @@ used to encode HTTP sessions if you use the [`@architect/functions` runtime help ### Display environment variables for the current `app.arc` -``` +```bash arc env ``` ### Save an environment variable to the staging environment -``` +```bash arc env staging FOO myvalue ``` @@ -35,7 +35,7 @@ arc env staging FOO myvalue ### Remove an environment variable -``` +```bash arc env remove staging FOO ``` diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index c2e2a18b..c2a1db39 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -3,7 +3,7 @@ title: arc sandbox description: Local development sandbox. --- -Architect projects work locally and offline. It emulates most app resources defined in `app.arc`: +Architect projects work locally and offline. It emulates most app resources defined in `app.arc`: - `@http` - `@static` @@ -12,11 +12,11 @@ Architect projects work locally and offline. It emulates most app resources defi - `@queues` - `@tables` and `@indexes` -> At this time `arc sandbox` does not emulate `@scheduled` +> At this time `arc sandbox` does not emulate `@scheduled` ## Usage -``` +```bash arc sandbox [--port|--verbose|--disable-symlinks|--no-hydrate] ``` @@ -50,17 +50,17 @@ arc sandbox [--port|--verbose|--disable-symlinks|--no-hydrate] Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@indexes` found in the `app.arc` file. When Sandbox is terminated, any data written is cleared from memory. The default endpoint is `http://localhost:5000`. You can set a custom port by using an environment variable, `ARC_TABLES_PORT=5555` -### Connect sandbox to the staging database +### Connect sandbox to the staging database ```bash NODE_ENV=staging ARC_LOCAL=1 arc sandbox ``` -### File watching +### File watching The sandbox restarts when the following files or directories are modified: -- `app.arc` -- `@views` source folder +- `app.arc` +- `@views` source folder - `@shared` source folder - `@static` source folder if fingerprinting is enabled From 3c3a77e4512939f1fe346b79f95bb3f725471e4c Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 31 Aug 2021 21:00:11 -0600 Subject: [PATCH 110/680] more true to OG Hemisu theme --- public/css/syntax.css | 8 ++++---- public/static.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 2fc8c0e5..e2a91bd4 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -6,11 +6,11 @@ :root { --shiki-color-text: #eee; --shiki-color-background: #282a36; - --shiki-token-constant: #9fd3e6; + --shiki-token-constant: #eee; --shiki-token-string: #b1d631; - --shiki-token-comment: #777; - --shiki-token-keyword: #bbffaa; - --shiki-token-parameter: #9fd3e6; + --shiki-token-comment: #999; + --shiki-token-keyword: #9fd3e6; + --shiki-token-parameter: #eee; --shiki-token-function: #bbffaa; --shiki-token-string-expression: #b1d631; --shiki-token-punctuation: #eee; diff --git a/public/static.json b/public/static.json index 7a87f30b..39d8491e 100644 --- a/public/static.json +++ b/public/static.json @@ -7,5 +7,5 @@ "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", "css/index.css": "css/index-d0b9d5ab0b.css", "css/styles.css": "css/styles-75499ddd30.css", - "css/syntax.css": "css/syntax-5387167f02.css" + "css/syntax.css": "css/syntax-6f68cd6c26.css" } \ No newline at end of file From 80d1b95cf1fc274c3404ab26c9b47bc55246eee5 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 1 Sep 2021 18:02:37 -0600 Subject: [PATCH 111/680] enable collapsible 4th level sidebar domains moved to 4th level --- public/css/index.css | 19 ++++++ public/static.json | 2 +- src/http/get-docs-000lang-catchall/index.js | 13 +--- .../docs/en/guides/domains/cloudflare.md | 11 ---- .../domains/{ => registrars}/dreamhost.md | 0 .../domains/{ => registrars}/godaddy.md | 1 - .../domains/{ => registrars}/namecheap.md | 0 .../en/guides/domains/{ => registrars}/one.md | 0 .../route53-and-cloudfront.md | 0 .../domains/{ => registrars}/route53.md | 0 src/views/docs/table-of-contents.js | 16 +++-- src/views/modules/components/sidebar.js | 59 ++++++++++++------- src/views/modules/helpers/list.js | 5 +- 13 files changed, 72 insertions(+), 54 deletions(-) delete mode 100644 src/views/docs/en/guides/domains/cloudflare.md rename src/views/docs/en/guides/domains/{ => registrars}/dreamhost.md (100%) rename src/views/docs/en/guides/domains/{ => registrars}/godaddy.md (99%) rename src/views/docs/en/guides/domains/{ => registrars}/namecheap.md (100%) rename src/views/docs/en/guides/domains/{ => registrars}/one.md (100%) rename src/views/docs/en/guides/domains/{ => registrars}/route53-and-cloudfront.md (100%) rename src/views/docs/en/guides/domains/{ => registrars}/route53.md (100%) diff --git a/public/css/index.css b/public/css/index.css index 8440be2a..4a412161 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -66,6 +66,25 @@ html { transition: fill 2s ease-out; } +label.sidebar-group-title { + display: block; +} +label.sidebar-group-title + ul { + height: 0; + overflow: hidden; +} +input.sidebar-group-control[type="checkbox"] { + visibility: hidden; + position: absolute; + left: -9999px; +} +input.sidebar-group-control[type="checkbox"]:checked + label.sidebar-group-title{ + font-style: italic; +} +input.sidebar-group-control[type="checkbox"]:checked ~ ul { + height: 100%; +} + @media only screen and (min-width:48em) { .open, .transition-x { diff --git a/public/static.json b/public/static.json index 3386de2d..673d8e19 100644 --- a/public/static.json +++ b/public/static.json @@ -5,7 +5,7 @@ "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", - "css/index.css": "css/index-d0b9d5ab0b.css", + "css/index.css": "css/index-bc2c5a8251.css", "css/styles.css": "css/styles-75499ddd30.css", "css/syntax.css": "css/syntax-605168cf6d.css" } \ No newline at end of file diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index da48306b..4a86e9b5 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -63,7 +63,7 @@ exports.handler = async function http (req) { file = cache[filePath] } catch (err) { - // TODO: Load next doc in section + // TODO: Load "index" landing or load next console.error(err) return { statusCode: 404, @@ -72,17 +72,6 @@ exports.handler = async function http (req) { } } - /** - * @typedef {Object} FrontMatterResult - * @property {string} [title] - Document title - * @property {string} [category] - document sidebar category - * @property {string} [group] - wip - * @property {string} [description] - document description for SEO - * @property {string[]} [sections] - set of document sections - */ - /** - * @type {FrontMatterResult} - */ let frontmatter = {} const md = Markdown({ highlight, diff --git a/src/views/docs/en/guides/domains/cloudflare.md b/src/views/docs/en/guides/domains/cloudflare.md deleted file mode 100644 index 565787ba..00000000 --- a/src/views/docs/en/guides/domains/cloudflare.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Cloudflare -description: Setting up a domain name with Cloudflare -sections: - - Overview - - - - - - ---- - -## Overview \ No newline at end of file diff --git a/src/views/docs/en/guides/domains/dreamhost.md b/src/views/docs/en/guides/domains/registrars/dreamhost.md similarity index 100% rename from src/views/docs/en/guides/domains/dreamhost.md rename to src/views/docs/en/guides/domains/registrars/dreamhost.md diff --git a/src/views/docs/en/guides/domains/godaddy.md b/src/views/docs/en/guides/domains/registrars/godaddy.md similarity index 99% rename from src/views/docs/en/guides/domains/godaddy.md rename to src/views/docs/en/guides/domains/registrars/godaddy.md index 5b55bc76..26bda552 100644 --- a/src/views/docs/en/guides/domains/godaddy.md +++ b/src/views/docs/en/guides/domains/registrars/godaddy.md @@ -1,7 +1,6 @@ --- title: GoDaddy category: Domains -group: Providers description: Setting up a domain name with GoDaddy --- diff --git a/src/views/docs/en/guides/domains/namecheap.md b/src/views/docs/en/guides/domains/registrars/namecheap.md similarity index 100% rename from src/views/docs/en/guides/domains/namecheap.md rename to src/views/docs/en/guides/domains/registrars/namecheap.md diff --git a/src/views/docs/en/guides/domains/one.md b/src/views/docs/en/guides/domains/registrars/one.md similarity index 100% rename from src/views/docs/en/guides/domains/one.md rename to src/views/docs/en/guides/domains/registrars/one.md diff --git a/src/views/docs/en/guides/domains/route53-and-cloudfront.md b/src/views/docs/en/guides/domains/registrars/route53-and-cloudfront.md similarity index 100% rename from src/views/docs/en/guides/domains/route53-and-cloudfront.md rename to src/views/docs/en/guides/domains/registrars/route53-and-cloudfront.md diff --git a/src/views/docs/en/guides/domains/route53.md b/src/views/docs/en/guides/domains/registrars/route53.md similarity index 100% rename from src/views/docs/en/guides/domains/route53.md rename to src/views/docs/en/guides/domains/registrars/route53.md diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index c4f10059..315faa22 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -23,12 +23,16 @@ let Guides = [ { ], 'Domains': [ 'Overview', - 'Route53', - 'Route53 & CloudFront', - 'Dreamhost', - 'GoDaddy', - 'Namecheap', - 'One' + { + 'Registrars': [ + 'Route53', + 'Route53 & CloudFront', + 'Dreamhost', + 'GoDaddy', + 'Namecheap', + 'One' + ] + } ], /* TODO 'Backend': [ diff --git a/src/views/modules/components/sidebar.js b/src/views/modules/components/sidebar.js index d31b97ab..3c691981 100644 --- a/src/views/modules/components/sidebar.js +++ b/src/views/modules/components/sidebar.js @@ -1,6 +1,5 @@ import listFromObject from '../helpers/list.js' import slugify from '../helpers/slugify.js' -import toc from '../../docs/table-of-contents.js' const map = { list: function List (state = {}) { @@ -31,8 +30,8 @@ const map = { > ${ isHeading - ? Heading({ children: child, depth, path, active }) - : Anchor({ children: child, depth, path, active }) + ? Heading({ name: child, depth, path, active }) + : Anchor({ name: child, depth, path, active }) } ${children} @@ -41,9 +40,9 @@ const map = { } function Anchor (state = {}) { - let { children, path, active } = state + let { name, path, active } = state let uri = path - .concat([ children ]) + .concat([ name ]) .map(part => slugify(part)) .join('/') let href = `/${uri}` @@ -51,33 +50,33 @@ function Anchor (state = {}) { let activeClass = isActive ? 'active' : '' - let pointer = isActive - ? '→' - : '' + let text = isActive + ? `→ ${name}` + : name return ` -${pointer} ${children} +${text} ` } function Heading3 (state = {}) { - let { children } = state + let { name } = state return `

- ${children} + ${name}


` } function Heading4 (state = {}) { - let { children } = state + let { name } = state return `

- ${children} + ${name}

` } -function Heading5 (state = {}) { - let { children } = state +function Group (state = {}) { + let { name, depth, active } = state + let slug = slugify(name) + let groupIsActive = active + .replace('/docs/en', '') + .split('/') + .indexOf(slug) === depth + let checked = groupIsActive ? 'checked' : '' + return ` - + ${name} + ` } @@ -111,13 +128,13 @@ function Heading (state = {}) { const headings = [ Heading3, Heading4, - Heading5 + Group ] return headings[depth - 1](state) } export default function Sidebar (props = {}) { - let { active } = props + let { active, toc } = props return `
+
+ We're moving the community chat, join us on + + Discord + +
${Sidebar(props)}
Date: Fri, 17 Sep 2021 17:08:49 -0400 Subject: [PATCH 141/680] 3.4.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e1fa72b0..5d559c12 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.4.4", + "version": "3.4.5", "architect": { "app": "v8-arc-codes", "aws": { From 92fc9687ea28f602df2210ed106b3982f8482a3f Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Sat, 18 Sep 2021 23:47:01 -0400 Subject: [PATCH 142/680] =?UTF-8?q?=F0=9F=92=84=20=20Add=20dark=20mode=20C?= =?UTF-8?q?SS=20variables?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/css/styles.css | 32 ++++++++++++++++++++++++++++++++ public/static.json | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/public/css/styles.css b/public/css/styles.css index 23b6b9b0..5b11aa89 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -23,8 +23,38 @@ --a2:#1D5266;/* #8E8E8E */ --d0:#797979;/* #797979 */ --d1:#636363;/* #636363 */ + --text-color: #222;/* #222 */ + --bkg-color: #FFF;/* #FFF */ } +:root[data-theme="dark"] { + --p0:#6EE8B5;/* #6EE8B5 */ + --p1:#46A9CB;/* #46A9CB */ + --p2:#E4FFDD;/* #E4FFDD */ + --p3:#ED59B3;/* #ED59B3 */ + --g0:#222222;/* #222222 */ + --g1:#383838;/* #383838 */ + --g2:#4D4D4D;/* #4D4D4D */ + --g3:#636363;/* #636363 */ + --g4:#797979;/* #797979 */ + --g5:#8E8E8E;/* #8E8E8E */ + --g6:#A4A4A4;/* #A4A4A4 */ + --g7:#BABABA;/* #BABABA */ + --g8:#CFCFCF;/* #CFCFCF */ + --g9:#E5E5E5;/* #E5E5E5 */ + --g10:#FBFBFB;/* #FBFBFB */ + --g11:#000; /* #FFF*/ + --h6:#CFCFCF;/* #CFCFCF */ + --a0:#A4A4A4;/* #A4A4A4 */ + --a1:#8E8E8E;/* #8E8E8E */ + --a2:#2E82A2;/* #2E82A2 */ + --d0:#797979;/* #797979 */ + --d1:#636363;/* #636363 */ + --text-color: #EEE;/* #EEE */ + --bkg-color: #121212;/* #121212 */ +} + + /* RESET */ *, *:before, @@ -54,6 +84,8 @@ body { text-rendering: geometricPrecision; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + background: var(--bkg-color); + color: var(--text-color); } diff --git a/public/static.json b/public/static.json index 2b29a4e9..71f73d6a 100644 --- a/public/static.json +++ b/public/static.json @@ -6,6 +6,6 @@ "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", "css/index.css": "css/index-092bdb8561.css", - "css/styles.css": "css/styles-2558bcf3d9.css", + "css/styles.css": "css/styles-7da4aeb100.css", "css/syntax.css": "css/syntax-03b095eb73.css" } \ No newline at end of file From 0ce07b7a2edccc7fc114f4c40e879a30966a3d78 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Sun, 19 Sep 2021 00:52:45 -0400 Subject: [PATCH 143/680] =?UTF-8?q?=F0=9F=8E=89=20=20Add=20light/dark=20to?= =?UTF-8?q?ggle=20button?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/css/styles.css | 7 +++++++ public/index.js | 14 +++++++++++++ public/static.json | 4 ++-- src/views/modules/components/theme-button.js | 21 ++++++++++++++++++++ src/views/modules/document/html.js | 2 ++ src/views/modules/document/symbols.js | 2 ++ 6 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/views/modules/components/theme-button.js diff --git a/public/css/styles.css b/public/css/styles.css index 5b11aa89..bca51cad 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -27,6 +27,7 @@ --bkg-color: #FFF;/* #FFF */ } + :root[data-theme="dark"] { --p0:#6EE8B5;/* #6EE8B5 */ --p1:#46A9CB;/* #46A9CB */ @@ -55,6 +56,12 @@ } +[data-theme='light'] .moon-icon, +[data-theme='dark'] .sun-icon { + display: block !important; +} + + /* RESET */ *, *:before, diff --git a/public/index.js b/public/index.js index e1d0b0e7..2d87b6c9 100644 --- a/public/index.js +++ b/public/index.js @@ -10,6 +10,8 @@ // Toggle sidebar on mobile let menuButton = document .getElementById('menu-button') + let themeButton = document + .getElementById('theme-button') let sidebar = document .getElementById('sidebar') let main = document @@ -23,6 +25,18 @@ sidebar.classList.toggle('open') } + /* Light/Dark Mode */ + // Get the user's theme preference from local storage, otherwise check OS default + let currentTheme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') + document.documentElement.setAttribute('data-theme', currentTheme) + + themeButton.onclick = function toggleTheme () { + let currentTheme = document.documentElement.getAttribute('data-theme') + let targetTheme = currentTheme === 'dark' ? 'light' : 'dark' + document.documentElement.setAttribute('data-theme', targetTheme) + localStorage.setItem('theme', targetTheme) + } + // Show percentage of page read on desktop let bar = document.querySelector('.indicator') let isDesktop = window.innerWidth > 768 diff --git a/public/static.json b/public/static.json index 71f73d6a..bef184c9 100644 --- a/public/static.json +++ b/public/static.json @@ -1,11 +1,11 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-13d945dd48.js", + "index.js": "index-18004274bb.js", "playground.html": "playground-d3d4c75ee9.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", "components/arc-viewer.js": "components/arc-viewer-53669af1ac.js", "css/index.css": "css/index-092bdb8561.css", - "css/styles.css": "css/styles-7da4aeb100.css", + "css/styles.css": "css/styles-cf4510a1b6.css", "css/syntax.css": "css/syntax-03b095eb73.css" } \ No newline at end of file diff --git a/src/views/modules/components/theme-button.js b/src/views/modules/components/theme-button.js new file mode 100644 index 00000000..28d9b369 --- /dev/null +++ b/src/views/modules/components/theme-button.js @@ -0,0 +1,21 @@ +import Icon from './icon.js' + +export default function ThemeButton (state = {}) { + let { classes } = state + return ` + + ` +} diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index c6c8ad1d..3d674069 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -7,6 +7,7 @@ import Icon from '../components/icon.js' import Sidebar from '../components/sidebar.js' import GithubLink from '../components/github-link.js' import DiscordLink from '../components/discord-link.js' +import ThemeButton from '../components/theme-button.js' export default function HTML (props = {}) { let { @@ -83,6 +84,7 @@ ${Symbols} > ${DiscordLink()} ${GithubLink({ classes: 'ml0' })} + ${ThemeButton({ classes: 'ml0' })} -
-
- -
- We've moved the community chat, join us on - - Discord - -
+ ${TopNav()} ${Sidebar(props)}
+ + ${Logo({ classes: 'logo' })} + +
+ ${Search({ classes: 'hidden inline-block-lg mr0' })} + ${DiscordLink()} + ${GithubLink({ classes: 'ml0' })} + ${ThemeButton({ classes: 'ml0' })} + +
+
+ +
+ + Community chat has moved to + + Discord + + +
+` +} From 6d5b1abd5df647daef114ce554e2fb1203597ddc Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 24 Sep 2021 14:47:09 -0600 Subject: [PATCH 157/680] 3.5.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1117cb63..54595b96 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.5.2", + "version": "3.5.3", "architect": { "app": "v8-arc-codes", "aws": { From 4294becfa52ef294cd471efecd171e723216e991 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 24 Sep 2021 16:32:22 -0600 Subject: [PATCH 158/680] Discord notifications for build and deploy (#404) * Update build.yml --- .github/workflows/build.yml | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5949b1c4..a74fb1ef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,17 +51,17 @@ jobs: CI: true - name: Notify - uses: homoluctus/slatify@master + uses: sarisia/actions-status-discord@v1 # Only fire alert once - if: github.ref == 'refs/heads/main' && failure() && matrix.node-version == '14.x' && matrix.os == 'ubuntu-latest' + # if: github.ref == 'refs/heads/main' && failure() && matrix.node-version == '14.x' && matrix.os == 'ubuntu-latest' + if: always() with: - type: ${{ job.status }} - job_name: '*Build*' - url: ${{ secrets.SLACK_WEBHOOK }} - commit: true - token: ${{ secrets.GITHUB_TOKEN }} + webhook: ${{ secrets.DISCORD_WEBHOOK }} + title: "build and test" + color: 0x222222 + username: GitHub Actions - # Assuming all that went fine (and it's master): deploy! + # Assuming all that went fine (and it's main): deploy! deploy: # Setup needs: build @@ -89,11 +89,10 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.V8_AWS_SECRET_ACCESS_KEY }} - name: Notify - uses: homoluctus/slatify@master + uses: sarisia/actions-status-discord@v1 if: always() with: - type: ${{ job.status }} - job_name: '*Deploy*' - url: ${{ secrets.SLACK_WEBHOOK }} - commit: true - token: ${{ secrets.GITHUB_TOKEN }} + webhook: ${{ secrets.DISCORD_WEBHOOK }} + title: "deploy build" + color: 0x222222 + username: GitHub Actions From c6a80014877595bbf6ea3eb2167c04441f15ea4e Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 24 Sep 2021 16:34:58 -0600 Subject: [PATCH 159/680] Use correct github build rule for notify action --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a74fb1ef..f390e100 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,8 +53,7 @@ jobs: - name: Notify uses: sarisia/actions-status-discord@v1 # Only fire alert once - # if: github.ref == 'refs/heads/main' && failure() && matrix.node-version == '14.x' && matrix.os == 'ubuntu-latest' - if: always() + if: github.ref == 'refs/heads/main' && failure() && matrix.node-version == '14.x' && matrix.os == 'ubuntu-latest' with: webhook: ${{ secrets.DISCORD_WEBHOOK }} title: "build and test" From 3cae7e49111463abaec4f6ae0669d9adab35c1fd Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Sun, 26 Sep 2021 09:05:54 -0700 Subject: [PATCH 160/680] Update minimum Node.js version, fixes #1224 --- src/views/docs/en/guides/get-started/detailed-aws-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/get-started/detailed-aws-setup.md b/src/views/docs/en/guides/get-started/detailed-aws-setup.md index d12285af..ba2cd24d 100644 --- a/src/views/docs/en/guides/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/guides/get-started/detailed-aws-setup.md @@ -21,7 +21,7 @@ description: Setting up and installing Architect. Architect supports the following runtime versions: -- Node `12.x` using `npm` +- Node.js `14.x` using `npm` - Deno `1.6.x` - Ruby `2.5` using `bundle` - Python `3.8` using `pip3` From 18138b19237de205aabb7676864cb4cc33214c80 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Sun, 26 Sep 2021 09:06:04 -0700 Subject: [PATCH 161/680] 3.5.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 54595b96..de33e3dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.5.3", + "version": "3.5.4", "architect": { "app": "v8-arc-codes", "aws": { From a9a67c0e6dbc322569c570b52f7287e65bd2e2a4 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Thu, 30 Sep 2021 08:21:08 -0700 Subject: [PATCH 162/680] Add `@aws architecture` setting documentation --- .../docs/en/reference/config.arc/architecture.md | 14 ++++++++++++++ src/views/docs/en/reference/config.arc/aws.md | 2 ++ src/views/docs/table-of-contents.js | 1 + 3 files changed, 17 insertions(+) create mode 100644 src/views/docs/en/reference/config.arc/architecture.md diff --git a/src/views/docs/en/reference/config.arc/architecture.md b/src/views/docs/en/reference/config.arc/architecture.md new file mode 100644 index 00000000..bfa5ca1b --- /dev/null +++ b/src/views/docs/en/reference/config.arc/architecture.md @@ -0,0 +1,14 @@ +--- +title: '@aws architecture' +category: config.arc +description: Lambda architecture configuration +--- + +Configure Lambda function CPU `architecture` to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. + +## Example + +```arc +@aws +architecture arm64 +``` diff --git a/src/views/docs/en/reference/config.arc/aws.md b/src/views/docs/en/reference/config.arc/aws.md index 52eb305c..7a16ad41 100644 --- a/src/views/docs/en/reference/config.arc/aws.md +++ b/src/views/docs/en/reference/config.arc/aws.md @@ -14,6 +14,7 @@ Configure individual Lambda function properties (e.g. `src/http/get-index/config - `concurrency` - number, `0` to AWS account maximum (if not present, concurrency is unthrottled) - `layers` - Up to 5 Lambda layer ARNs; **must be in the same region as deployed** - `policies` - configure [AWS SAM policy templates](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html) +- `architecture` - configure CPU architecture; one of `x86_64` or `arm64` (defaults to `x86_64` if not specified) > Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB. @@ -27,6 +28,7 @@ timeout 3 concurrency 1 layers {ARN} policies {ARN} +architecture arm64 ``` To use multiple layers or policies: diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 315faa22..3c3a046c 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -90,6 +90,7 @@ let Reference = [ { 'concurrency', 'layers', 'policies', + 'architecture', ], 'prefs.arc': [ '@create', From a1ce9e5035765d0ac499a28b5bfeb9b4c9bc2314 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Thu, 30 Sep 2021 08:21:29 -0700 Subject: [PATCH 163/680] 3.5.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index de33e3dc..ae14d97c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.5.4", + "version": "3.5.5", "architect": { "app": "v8-arc-codes", "aws": { From d3ffc4d0cbb9ad71ccb8a5b455732dbc7ca95883 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 1 Oct 2021 11:39:53 -0700 Subject: [PATCH 164/680] Fix weirdness from tape in esm blowing up Sandbox for some reason --- .github/workflows/build.yml | 4 ++-- package.json | 6 ++++-- test/{ => backend}/sandbox-http-test.js | 4 ++-- test/{ => frontend}/helpers/strip.js | 0 test/{ => frontend}/sidebar-test.js | 4 ++-- test/{ => frontend}/slugify-test.js | 2 +- 6 files changed, 11 insertions(+), 9 deletions(-) rename test/{ => backend}/sandbox-http-test.js (87%) rename test/{ => frontend}/helpers/strip.js (100%) rename test/{ => frontend}/sidebar-test.js (97%) rename test/{ => frontend}/slugify-test.js (77%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f390e100..c439116c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v2 - name: Set up Node.js - uses: actions/setup-node@v1 + uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} @@ -73,7 +73,7 @@ jobs: uses: actions/checkout@v2 - name: Set up Node.js - uses: actions/setup-node@v1 + uses: actions/setup-node@v2 with: node-version: 14 diff --git a/package.json b/package.json index ae14d97c..4dd1795d 100644 --- a/package.json +++ b/package.json @@ -34,10 +34,12 @@ "spellcheck": "cross-env npx spellchecker './src/views/docs/en/**/*.md' --no-suggestions -q -d ./scripts/dictionary.js --plugins spell indefinite-article repeated-words syntax-mentions syntax-urls", "lint": "eslint src --fix", "start": "sandbox", - "test": "npm run spellcheck && npm run lint && tape -r esm 'test/**/*.js' | tap-spec" + "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-spec", + "test:unit:backend": "tape 'test/backend/**/*.js' | tap-spec", + "test": "npm run spellcheck && npm run lint && npm run test:unit:frontend && npm run test:unit:backend" }, "dependencies": { - "@architect/architect": "^9.0.0", + "@architect/architect": "^9.1.0", "@architect/asap": "^4.0.0", "@architect/eslint-config": "^2.0.0", "@architect/functions": "^4.0.0", diff --git a/test/sandbox-http-test.js b/test/backend/sandbox-http-test.js similarity index 87% rename from test/sandbox-http-test.js rename to test/backend/sandbox-http-test.js index d0a93398..b1045955 100644 --- a/test/sandbox-http-test.js +++ b/test/backend/sandbox-http-test.js @@ -8,7 +8,7 @@ test('sandbox HTTP request', async t => { t.plan(4) await sandbox.start({ quiet: true }) - t.ok(true, `sandbox started on ${host}`) + t.pass(`sandbox started on ${host}`) let quickstart = await tiny.get({ url: `${host}/docs/en/guides/get-started/quickstart` }) t.ok(quickstart.body, 'got quickstart document') @@ -17,5 +17,5 @@ test('sandbox HTTP request', async t => { t.ok(playground.body, 'got static playground document') await sandbox.end() - t.ok(true, 'sandbox ended') + t.pass('sandbox ended') }) diff --git a/test/helpers/strip.js b/test/frontend/helpers/strip.js similarity index 100% rename from test/helpers/strip.js rename to test/frontend/helpers/strip.js diff --git a/test/sidebar-test.js b/test/frontend/sidebar-test.js similarity index 97% rename from test/sidebar-test.js rename to test/frontend/sidebar-test.js index 458db898..f3c1f953 100644 --- a/test/sidebar-test.js +++ b/test/frontend/sidebar-test.js @@ -1,7 +1,7 @@ import test from 'tape' -import listFromObject from '../src/views/modules/helpers/list.js' +import listFromObject from '../../src/views/modules/helpers/list.js' import strip from './helpers/strip.js' -import slugify from '../src/views/modules/helpers/slugify.js' +import slugify from '../../src/views/modules/helpers/slugify.js' function Ul(state={}) { let { children } = state diff --git a/test/slugify-test.js b/test/frontend/slugify-test.js similarity index 77% rename from test/slugify-test.js rename to test/frontend/slugify-test.js index 40e722ee..fe4c2d3d 100644 --- a/test/slugify-test.js +++ b/test/frontend/slugify-test.js @@ -1,5 +1,5 @@ import test from 'tape' -import slugify from '../src/views/modules/helpers/slugify.js' +import slugify from '../../src/views/modules/helpers/slugify.js' test('slugify', t=> { let input = 'Architect manifest & config' From 512e13ffd360876da20840de66063c8a4933bd2b Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 1 Oct 2021 12:51:58 -0600 Subject: [PATCH 165/680] 3.5.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4dd1795d..0d19a199 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.5.5", + "version": "3.5.6", "architect": { "app": "v8-arc-codes", "aws": { From b69bf246b03fa47c243e3231e0f1c8cdcbaa156f Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 4 Oct 2021 14:45:17 -0600 Subject: [PATCH 166/680] add details about Shiki usage to README --- readme.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 292efb8f..d32e61ec 100644 --- a/readme.md +++ b/readme.md @@ -37,12 +37,20 @@ The frontmatter attributes are technically optional but highly encouraged as the | **description** | `string` | HTML meta description | | **sections** | `string[]` | currently unused | +## [Shiki](https://github.com/shikijs/shiki) for code highlighting + +[Shiki](https://github.com/shikijs/shiki) is used automatically to add highlighting to "fenced" Markdown code blocks. + +Providing explicit languages to the highlighter (see `highlighter.js`) increases Shiki's performance. + +To slim down Shiki's footprint, we bundle the dependency directly to the docs catchall function with only the grammars for languages we intend to highlight. This can be done automatically with the `seed-dependencies` script. + ## Todo * dynamic category landing page * writing style guide * a homepage -* dark mode +* ~~dark mode~~ ## Contributing [Find out more about contributing to Architect](https://arc.codes/docs/en/about/contribute) From ef7cc65927a4bf49d524a0a26399dac22ed9abb2 Mon Sep 17 00:00:00 2001 From: Francis Gulotta Date: Fri, 1 Oct 2021 15:58:39 -0400 Subject: [PATCH 167/680] Add architecture information to @aws pragma on app.arc - make that page more consistent with styling - make config.arc language match app.arc language --- scripts/dictionary.js | 6 ++++-- src/views/docs/en/reference/app.arc/aws.md | 15 +++++++++------ .../docs/en/reference/config.arc/architecture.md | 4 +++- src/views/docs/en/reference/config.arc/aws.md | 4 +++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/scripts/dictionary.js b/scripts/dictionary.js index 2f4734cd..a3331c18 100644 --- a/scripts/dictionary.js +++ b/scripts/dictionary.js @@ -49,7 +49,6 @@ let dictionary = [ 'CLA', 'CLI.', 'CLI', - 'CLI', 'Cloudflare', 'CloudFormation-managed', 'CloudFormation', @@ -127,6 +126,7 @@ let dictionary = [ 'Frontend', 'globals', 'GoDaddy', + 'Graviton2', 'hardcode', 'hardcoding', 'hashids', @@ -289,7 +289,6 @@ let dictionary = [ 'TSX', 'TTL', 'UI', - 'Upsert', 'unauthenticated', 'unbreak', 'unformatted', @@ -298,6 +297,7 @@ let dictionary = [ 'unparsed', 'unsynced', 'unthrottled', + 'Upsert', 'userland', 'v5', 'vars', @@ -311,6 +311,8 @@ let dictionary = [ 'WebSocket', 'WebSockets', 'whitespace', + 'x86-based', + 'x86', 'XHR', 'xml', 'XSS', diff --git a/src/views/docs/en/reference/app.arc/aws.md b/src/views/docs/en/reference/app.arc/aws.md index 34e63b1a..992120e9 100644 --- a/src/views/docs/en/reference/app.arc/aws.md +++ b/src/views/docs/en/reference/app.arc/aws.md @@ -8,20 +8,23 @@ Define AWS specific configuration. ## Syntax - Accepts values for the following keys: - - **`region`**: [AWS region ID](https://docs.aws.amazon.com/general/latest/gr/rande.html) of the region you'll deploy this project to + - `region`: [AWS region ID](https://docs.aws.amazon.com/general/latest/gr/rande.html) of the region you'll deploy this project to - If not specified, defaults to `us-west-2` - - **`profile`**: name of the profile you prefer to use with this project, as defined in your local [AWS profile](/quickstart) + - `profile`: name of the profile you prefer to use with this project, as defined in your local [AWS profile](/quickstart) - Can also be specified in `AWS_PROFILE` environment variable - Required to deploy to AWS - `runtime`: Lambda runtime, can be one of: - `nodejs14.x`, `nodejs12.x`, `deno`, `python3.8`, `python3.7`, `python3.6`, `go1.x`, `ruby2.7`, `ruby2.5`, `dotnetcore3.1`, `dotnetcore2.1`, `java11`, `java8` - - **`bucket`**: bucket (in same region) for CloudFormation deployment artifacts + - `bucket`: bucket (in same region) for CloudFormation deployment artifacts - If not specified, a secure deployment bucket will be auto-created for your app - `apigateway`: API Gateway API type, can be one of: - - **`http` (default)** - `HTTP` API + Lambda payload format version 2.0 + - `http` (default) - `HTTP` API + Lambda payload format version 2.0 - `httpv2` – aliased to `http` - - **`httpv1`** - `HTTP` API + Lambda payload format version 1.0 - - **`rest`** - `REST` API + original API Gateway payload format + - `httpv1` - `HTTP` API + Lambda payload format version 1.0 + - `rest` - `REST` API + original API Gateway payload format + - `architecture` Lambda [CPU Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) + - `x86_64` - (default) 64-bit x86 architecture, for x86-based processors + - `arm64` - 64-bit ARM architecture, for the AWS Graviton2 processor. This only works if your region supports it. **Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. Alternatively, if you want a less granular approach, you can declare your preferred region and profile in your `.bashrc` ([more information here](https://docs.aws.amazon.com/cli/latest/userguide/cli-environment.html)). diff --git a/src/views/docs/en/reference/config.arc/architecture.md b/src/views/docs/en/reference/config.arc/architecture.md index bfa5ca1b..1348fcb4 100644 --- a/src/views/docs/en/reference/config.arc/architecture.md +++ b/src/views/docs/en/reference/config.arc/architecture.md @@ -4,7 +4,9 @@ category: config.arc description: Lambda architecture configuration --- -Configure Lambda function CPU `architecture` to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. +Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. `arm64` only works if your region supports it. + +**Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. ## Example diff --git a/src/views/docs/en/reference/config.arc/aws.md b/src/views/docs/en/reference/config.arc/aws.md index 7a16ad41..06f15fdc 100644 --- a/src/views/docs/en/reference/config.arc/aws.md +++ b/src/views/docs/en/reference/config.arc/aws.md @@ -14,7 +14,9 @@ Configure individual Lambda function properties (e.g. `src/http/get-index/config - `concurrency` - number, `0` to AWS account maximum (if not present, concurrency is unthrottled) - `layers` - Up to 5 Lambda layer ARNs; **must be in the same region as deployed** - `policies` - configure [AWS SAM policy templates](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html) -- `architecture` - configure CPU architecture; one of `x86_64` or `arm64` (defaults to `x86_64` if not specified) +- `architecture` [AWS Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) + - `x86_64` (default) 64-bit x86 architecture, for x86-based processors + - `arm64` 64-bit ARM architecture, for the AWS Graviton2 processor. This only works if your region supports it. **Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. > Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB. From 732bfc5bef72367d6561c7f989d31c05497509cf Mon Sep 17 00:00:00 2001 From: Ryan Bethel Date: Tue, 5 Oct 2021 14:54:27 -0400 Subject: [PATCH 168/680] add examples page --- .../shiki/dist/index.js | 1986 ++++++----------- src/views/docs/en/examples/examples.md | 35 + src/views/docs/table-of-contents.js | 7 +- 3 files changed, 669 insertions(+), 1359 deletions(-) create mode 100644 src/views/docs/en/examples/examples.md diff --git a/src/http/get-docs-000lang-catchall/shiki/dist/index.js b/src/http/get-docs-000lang-catchall/shiki/dist/index.js index 2483a9ec..c98d2496 100644 --- a/src/http/get-docs-000lang-catchall/shiki/dist/index.js +++ b/src/http/get-docs-000lang-catchall/shiki/dist/index.js @@ -827,1422 +827,685 @@ class StackElementMetadata { } } -// This is a generated file. Do not edit. -var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/; -var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/; -var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/; - -var unicode = { - Space_Separator: Space_Separator, - ID_Start: ID_Start, - ID_Continue: ID_Continue -}; - -var util = { - isSpaceSeparator (c) { - return typeof c === 'string' && unicode.Space_Separator.test(c) - }, - - isIdStartChar (c) { - return typeof c === 'string' && ( - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c === '$') || (c === '_') || - unicode.ID_Start.test(c) - ) - }, - - isIdContinueChar (c) { - return typeof c === 'string' && ( - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - (c === '$') || (c === '_') || - (c === '\u200C') || (c === '\u200D') || - unicode.ID_Continue.test(c) - ) - }, - - isDigit (c) { - return typeof c === 'string' && /[0-9]/.test(c) - }, - - isHexDigit (c) { - return typeof c === 'string' && /[0-9A-Fa-f]/.test(c) - }, -}; - -let source; -let parseState; -let stack; -let pos; -let line; -let column; -let token; -let key; -let root; - -var parse = function parse (text, reviver) { - source = String(text); - parseState = 'start'; - stack = []; - pos = 0; - line = 1; - column = 0; - token = undefined; - key = undefined; - root = undefined; - - do { - token = lex(); - - // This code is unreachable. - // if (!parseStates[parseState]) { - // throw invalidParseState() - // } - - parseStates[parseState](); - } while (token.type !== 'eof') - - if (typeof reviver === 'function') { - return internalize({'': root}, '', reviver) - } - - return root -}; +function trimEndSlash(str) { + if (str.endsWith('/') || str.endsWith('\\')) + return str.slice(0, -1); + return str; +} +function trimStartDot(str) { + if (str.startsWith('./')) + return str.slice(2); + return str; +} +function dirname(str) { + const parts = str.split(/[\/\\]/g); + return parts[parts.length - 2]; +} +function join(...parts) { + return parts.map(trimEndSlash).map(trimStartDot).join('/'); +} -function internalize (holder, name, reviver) { - const value = holder[name]; - if (value != null && typeof value === 'object') { - for (const key in value) { - const replacement = internalize(value, key, reviver); - if (replacement === undefined) { - delete value[key]; - } else { - value[key] = replacement; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +/** + * Creates a JSON scanner on the given text. + * If ignoreTrivia is set, whitespaces or comments are ignored. + */ +function createScanner(text, ignoreTrivia) { + if (ignoreTrivia === void 0) { ignoreTrivia = false; } + var len = text.length; + var pos = 0, value = '', tokenOffset = 0, token = 16 /* Unknown */, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0 /* None */; + function scanHexDigits(count, exact) { + var digits = 0; + var value = 0; + while (digits < count || !exact) { + var ch = text.charCodeAt(pos); + if (ch >= 48 /* _0 */ && ch <= 57 /* _9 */) { + value = value * 16 + ch - 48 /* _0 */; + } + else if (ch >= 65 /* A */ && ch <= 70 /* F */) { + value = value * 16 + ch - 65 /* A */ + 10; + } + else if (ch >= 97 /* a */ && ch <= 102 /* f */) { + value = value * 16 + ch - 97 /* a */ + 10; + } + else { + break; } + pos++; + digits++; } - } - - return reviver.call(holder, name, value) -} - -let lexState; -let buffer; -let doubleQuote; -let sign; -let c; - -function lex () { - lexState = 'default'; - buffer = ''; - doubleQuote = false; - sign = 1; - - for (;;) { - c = peek(); - - // This code is unreachable. - // if (!lexStates[lexState]) { - // throw invalidLexState(lexState) - // } - - const token = lexStates[lexState](); - if (token) { - return token + if (digits < count) { + value = -1; } + return value; } -} - -function peek () { - if (source[pos]) { - return String.fromCodePoint(source.codePointAt(pos)) + function setPosition(newPosition) { + pos = newPosition; + value = ''; + tokenOffset = 0; + token = 16 /* Unknown */; + scanError = 0 /* None */; } -} - -function read () { - const c = peek(); - - if (c === '\n') { - line++; - column = 0; - } else if (c) { - column += c.length; - } else { - column++; - } - - if (c) { - pos += c.length; - } - - return c -} - -const lexStates = { - default () { - switch (c) { - case '\t': - case '\v': - case '\f': - case ' ': - case '\u00A0': - case '\uFEFF': - case '\n': - case '\r': - case '\u2028': - case '\u2029': - read(); - return - - case '/': - read(); - lexState = 'comment'; - return - - case undefined: - read(); - return newToken('eof') - } - - if (util.isSpaceSeparator(c)) { - read(); - return - } - - // This code is unreachable. - // if (!lexStates[parseState]) { - // throw invalidLexState(parseState) - // } - - return lexStates[parseState]() - }, - - comment () { - switch (c) { - case '*': - read(); - lexState = 'multiLineComment'; - return - - case '/': - read(); - lexState = 'singleLineComment'; - return - } - - throw invalidChar(read()) - }, - - multiLineComment () { - switch (c) { - case '*': - read(); - lexState = 'multiLineCommentAsterisk'; - return - - case undefined: - throw invalidChar(read()) - } - - read(); - }, - - multiLineCommentAsterisk () { - switch (c) { - case '*': - read(); - return - - case '/': - read(); - lexState = 'default'; - return - - case undefined: - throw invalidChar(read()) - } - - read(); - lexState = 'multiLineComment'; - }, - - singleLineComment () { - switch (c) { - case '\n': - case '\r': - case '\u2028': - case '\u2029': - read(); - lexState = 'default'; - return - - case undefined: - read(); - return newToken('eof') - } - - read(); - }, - - value () { - switch (c) { - case '{': - case '[': - return newToken('punctuator', read()) - - case 'n': - read(); - literal('ull'); - return newToken('null', null) - - case 't': - read(); - literal('rue'); - return newToken('boolean', true) - - case 'f': - read(); - literal('alse'); - return newToken('boolean', false) - - case '-': - case '+': - if (read() === '-') { - sign = -1; + function scanNumber() { + var start = pos; + if (text.charCodeAt(pos) === 48 /* _0 */) { + pos++; + } + else { + pos++; + while (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; } - - lexState = 'sign'; - return - - case '.': - buffer = read(); - lexState = 'decimalPointLeading'; - return - - case '0': - buffer = read(); - lexState = 'zero'; - return - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - buffer = read(); - lexState = 'decimalInteger'; - return - - case 'I': - read(); - literal('nfinity'); - return newToken('numeric', Infinity) - - case 'N': - read(); - literal('aN'); - return newToken('numeric', NaN) - - case '"': - case "'": - doubleQuote = (read() === '"'); - buffer = ''; - lexState = 'string'; - return - } - - throw invalidChar(read()) - }, - - identifierNameStartEscape () { - if (c !== 'u') { - throw invalidChar(read()) } - - read(); - const u = unicodeEscape(); - switch (u) { - case '$': - case '_': - break - - default: - if (!util.isIdStartChar(u)) { - throw invalidIdentifier() + if (pos < text.length && text.charCodeAt(pos) === 46 /* dot */) { + pos++; + if (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; + while (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; + } } - - break - } - - buffer += u; - lexState = 'identifierName'; - }, - - identifierName () { - switch (c) { - case '$': - case '_': - case '\u200C': - case '\u200D': - buffer += read(); - return - - case '\\': - read(); - lexState = 'identifierNameEscape'; - return - } - - if (util.isIdContinueChar(c)) { - buffer += read(); - return - } - - return newToken('identifier', buffer) - }, - - identifierNameEscape () { - if (c !== 'u') { - throw invalidChar(read()) - } - - read(); - const u = unicodeEscape(); - switch (u) { - case '$': - case '_': - case '\u200C': - case '\u200D': - break - - default: - if (!util.isIdContinueChar(u)) { - throw invalidIdentifier() + else { + scanError = 3 /* UnexpectedEndOfNumber */; + return text.substring(start, pos); } - - break - } - - buffer += u; - lexState = 'identifierName'; - }, - - sign () { - switch (c) { - case '.': - buffer = read(); - lexState = 'decimalPointLeading'; - return - - case '0': - buffer = read(); - lexState = 'zero'; - return - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - buffer = read(); - lexState = 'decimalInteger'; - return - - case 'I': - read(); - literal('nfinity'); - return newToken('numeric', sign * Infinity) - - case 'N': - read(); - literal('aN'); - return newToken('numeric', NaN) } - - throw invalidChar(read()) - }, - - zero () { - switch (c) { - case '.': - buffer += read(); - lexState = 'decimalPoint'; - return - - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - - case 'x': - case 'X': - buffer += read(); - lexState = 'hexadecimal'; - return - } - - return newToken('numeric', sign * 0) - }, - - decimalInteger () { - switch (c) { - case '.': - buffer += read(); - lexState = 'decimalPoint'; - return - - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } - - if (util.isDigit(c)) { - buffer += read(); - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - decimalPointLeading () { - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalFraction'; - return - } - - throw invalidChar(read()) - }, - - decimalPoint () { - switch (c) { - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } - - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalFraction'; - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - decimalFraction () { - switch (c) { - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } - - if (util.isDigit(c)) { - buffer += read(); - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - decimalExponent () { - switch (c) { - case '+': - case '-': - buffer += read(); - lexState = 'decimalExponentSign'; - return - } - - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalExponentInteger'; - return - } - - throw invalidChar(read()) - }, - - decimalExponentSign () { - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalExponentInteger'; - return - } - - throw invalidChar(read()) - }, - - decimalExponentInteger () { - if (util.isDigit(c)) { - buffer += read(); - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - hexadecimal () { - if (util.isHexDigit(c)) { - buffer += read(); - lexState = 'hexadecimalInteger'; - return - } - - throw invalidChar(read()) - }, - - hexadecimalInteger () { - if (util.isHexDigit(c)) { - buffer += read(); - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - string () { - switch (c) { - case '\\': - read(); - buffer += escape(); - return - - case '"': - if (doubleQuote) { - read(); - return newToken('string', buffer) + var end = pos; + if (pos < text.length && (text.charCodeAt(pos) === 69 /* E */ || text.charCodeAt(pos) === 101 /* e */)) { + pos++; + if (pos < text.length && text.charCodeAt(pos) === 43 /* plus */ || text.charCodeAt(pos) === 45 /* minus */) { + pos++; } - - buffer += read(); - return - - case "'": - if (!doubleQuote) { - read(); - return newToken('string', buffer) + if (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; + while (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; + } + end = pos; + } + else { + scanError = 3 /* UnexpectedEndOfNumber */; } - - buffer += read(); - return - - case '\n': - case '\r': - throw invalidChar(read()) - - case '\u2028': - case '\u2029': - separatorChar(c); - break - - case undefined: - throw invalidChar(read()) - } - - buffer += read(); - }, - - start () { - switch (c) { - case '{': - case '[': - return newToken('punctuator', read()) - - // This code is unreachable since the default lexState handles eof. - // case undefined: - // return newToken('eof') - } - - lexState = 'value'; - }, - - beforePropertyName () { - switch (c) { - case '$': - case '_': - buffer = read(); - lexState = 'identifierName'; - return - - case '\\': - read(); - lexState = 'identifierNameStartEscape'; - return - - case '}': - return newToken('punctuator', read()) - - case '"': - case "'": - doubleQuote = (read() === '"'); - lexState = 'string'; - return - } - - if (util.isIdStartChar(c)) { - buffer += read(); - lexState = 'identifierName'; - return - } - - throw invalidChar(read()) - }, - - afterPropertyName () { - if (c === ':') { - return newToken('punctuator', read()) - } - - throw invalidChar(read()) - }, - - beforePropertyValue () { - lexState = 'value'; - }, - - afterPropertyValue () { - switch (c) { - case ',': - case '}': - return newToken('punctuator', read()) - } - - throw invalidChar(read()) - }, - - beforeArrayValue () { - if (c === ']') { - return newToken('punctuator', read()) - } - - lexState = 'value'; - }, - - afterArrayValue () { - switch (c) { - case ',': - case ']': - return newToken('punctuator', read()) - } - - throw invalidChar(read()) - }, - - end () { - // This code is unreachable since it's handled by the default lexState. - // if (c === undefined) { - // read() - // return newToken('eof') - // } - - throw invalidChar(read()) - }, -}; - -function newToken (type, value) { - return { - type, - value, - line, - column, - } -} - -function literal (s) { - for (const c of s) { - const p = peek(); - - if (p !== c) { - throw invalidChar(read()) - } - - read(); - } -} - -function escape () { - const c = peek(); - switch (c) { - case 'b': - read(); - return '\b' - - case 'f': - read(); - return '\f' - - case 'n': - read(); - return '\n' - - case 'r': - read(); - return '\r' - - case 't': - read(); - return '\t' - - case 'v': - read(); - return '\v' - - case '0': - read(); - if (util.isDigit(peek())) { - throw invalidChar(read()) - } - - return '\0' - - case 'x': - read(); - return hexEscape() - - case 'u': - read(); - return unicodeEscape() - - case '\n': - case '\u2028': - case '\u2029': - read(); - return '' - - case '\r': - read(); - if (peek() === '\n') { - read(); - } - - return '' - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - throw invalidChar(read()) - - case undefined: - throw invalidChar(read()) - } - - return read() -} - -function hexEscape () { - let buffer = ''; - let c = peek(); - - if (!util.isHexDigit(c)) { - throw invalidChar(read()) - } - - buffer += read(); - - c = peek(); - if (!util.isHexDigit(c)) { - throw invalidChar(read()) - } - - buffer += read(); - - return String.fromCodePoint(parseInt(buffer, 16)) -} - -function unicodeEscape () { - let buffer = ''; - let count = 4; - - while (count-- > 0) { - const c = peek(); - if (!util.isHexDigit(c)) { - throw invalidChar(read()) - } - - buffer += read(); - } - - return String.fromCodePoint(parseInt(buffer, 16)) -} - -const parseStates = { - start () { - if (token.type === 'eof') { - throw invalidEOF() - } - - push(); - }, - - beforePropertyName () { - switch (token.type) { - case 'identifier': - case 'string': - key = token.value; - parseState = 'afterPropertyName'; - return - - case 'punctuator': - // This code is unreachable since it's handled by the lexState. - // if (token.value !== '}') { - // throw invalidToken() - // } - - pop(); - return - - case 'eof': - throw invalidEOF() - } - - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, - - afterPropertyName () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator' || token.value !== ':') { - // throw invalidToken() - // } - - if (token.type === 'eof') { - throw invalidEOF() - } - - parseState = 'beforePropertyValue'; - }, - - beforePropertyValue () { - if (token.type === 'eof') { - throw invalidEOF() - } - - push(); - }, - - beforeArrayValue () { - if (token.type === 'eof') { - throw invalidEOF() - } - - if (token.type === 'punctuator' && token.value === ']') { - pop(); - return - } - - push(); - }, - - afterPropertyValue () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator') { - // throw invalidToken() - // } - - if (token.type === 'eof') { - throw invalidEOF() - } - - switch (token.value) { - case ',': - parseState = 'beforePropertyName'; - return - - case '}': - pop(); - } - - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, - - afterArrayValue () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator') { - // throw invalidToken() - // } - - if (token.type === 'eof') { - throw invalidEOF() - } - - switch (token.value) { - case ',': - parseState = 'beforeArrayValue'; - return - - case ']': - pop(); - } - - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, - - end () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'eof') { - // throw invalidToken() - // } - }, -}; - -function push () { - let value; - - switch (token.type) { - case 'punctuator': - switch (token.value) { - case '{': - value = {}; - break - - case '[': - value = []; - break } - - break - - case 'null': - case 'boolean': - case 'numeric': - case 'string': - value = token.value; - break - - // This code is unreachable. - // default: - // throw invalidToken() + return text.substring(start, end); } - - if (root === undefined) { - root = value; - } else { - const parent = stack[stack.length - 1]; - if (Array.isArray(parent)) { - parent.push(value); - } else { - parent[key] = value; + function scanString() { + var result = '', start = pos; + while (true) { + if (pos >= len) { + result += text.substring(start, pos); + scanError = 2 /* UnexpectedEndOfString */; + break; + } + var ch = text.charCodeAt(pos); + if (ch === 34 /* doubleQuote */) { + result += text.substring(start, pos); + pos++; + break; + } + if (ch === 92 /* backslash */) { + result += text.substring(start, pos); + pos++; + if (pos >= len) { + scanError = 2 /* UnexpectedEndOfString */; + break; + } + var ch2 = text.charCodeAt(pos++); + switch (ch2) { + case 34 /* doubleQuote */: + result += '\"'; + break; + case 92 /* backslash */: + result += '\\'; + break; + case 47 /* slash */: + result += '/'; + break; + case 98 /* b */: + result += '\b'; + break; + case 102 /* f */: + result += '\f'; + break; + case 110 /* n */: + result += '\n'; + break; + case 114 /* r */: + result += '\r'; + break; + case 116 /* t */: + result += '\t'; + break; + case 117 /* u */: + var ch3 = scanHexDigits(4, true); + if (ch3 >= 0) { + result += String.fromCharCode(ch3); + } + else { + scanError = 4 /* InvalidUnicode */; + } + break; + default: + scanError = 5 /* InvalidEscapeCharacter */; + } + start = pos; + continue; + } + if (ch >= 0 && ch <= 0x1f) { + if (isLineBreak(ch)) { + result += text.substring(start, pos); + scanError = 2 /* UnexpectedEndOfString */; + break; + } + else { + scanError = 6 /* InvalidCharacter */; + // mark as error but continue with string + } + } + pos++; } + return result; } - - if (value !== null && typeof value === 'object') { - stack.push(value); - - if (Array.isArray(value)) { - parseState = 'beforeArrayValue'; - } else { - parseState = 'beforePropertyName'; - } - } else { - const current = stack[stack.length - 1]; - if (current == null) { - parseState = 'end'; - } else if (Array.isArray(current)) { - parseState = 'afterArrayValue'; - } else { - parseState = 'afterPropertyValue'; + function scanNext() { + value = ''; + scanError = 0 /* None */; + tokenOffset = pos; + lineStartOffset = lineNumber; + prevTokenLineStartOffset = tokenLineStartOffset; + if (pos >= len) { + // at the end + tokenOffset = len; + return token = 17 /* EOF */; + } + var code = text.charCodeAt(pos); + // trivia: whitespace + if (isWhiteSpace(code)) { + do { + pos++; + value += String.fromCharCode(code); + code = text.charCodeAt(pos); + } while (isWhiteSpace(code)); + return token = 15 /* Trivia */; + } + // trivia: newlines + if (isLineBreak(code)) { + pos++; + value += String.fromCharCode(code); + if (code === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) { + pos++; + value += '\n'; + } + lineNumber++; + tokenLineStartOffset = pos; + return token = 14 /* LineBreakTrivia */; + } + switch (code) { + // tokens: []{}:, + case 123 /* openBrace */: + pos++; + return token = 1 /* OpenBraceToken */; + case 125 /* closeBrace */: + pos++; + return token = 2 /* CloseBraceToken */; + case 91 /* openBracket */: + pos++; + return token = 3 /* OpenBracketToken */; + case 93 /* closeBracket */: + pos++; + return token = 4 /* CloseBracketToken */; + case 58 /* colon */: + pos++; + return token = 6 /* ColonToken */; + case 44 /* comma */: + pos++; + return token = 5 /* CommaToken */; + // strings + case 34 /* doubleQuote */: + pos++; + value = scanString(); + return token = 10 /* StringLiteral */; + // comments + case 47 /* slash */: + var start = pos - 1; + // Single-line comment + if (text.charCodeAt(pos + 1) === 47 /* slash */) { + pos += 2; + while (pos < len) { + if (isLineBreak(text.charCodeAt(pos))) { + break; + } + pos++; + } + value = text.substring(start, pos); + return token = 12 /* LineCommentTrivia */; + } + // Multi-line comment + if (text.charCodeAt(pos + 1) === 42 /* asterisk */) { + pos += 2; + var safeLength = len - 1; // For lookahead. + var commentClosed = false; + while (pos < safeLength) { + var ch = text.charCodeAt(pos); + if (ch === 42 /* asterisk */ && text.charCodeAt(pos + 1) === 47 /* slash */) { + pos += 2; + commentClosed = true; + break; + } + pos++; + if (isLineBreak(ch)) { + if (ch === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) { + pos++; + } + lineNumber++; + tokenLineStartOffset = pos; + } + } + if (!commentClosed) { + pos++; + scanError = 1 /* UnexpectedEndOfComment */; + } + value = text.substring(start, pos); + return token = 13 /* BlockCommentTrivia */; + } + // just a single slash + value += String.fromCharCode(code); + pos++; + return token = 16 /* Unknown */; + // numbers + case 45 /* minus */: + value += String.fromCharCode(code); + pos++; + if (pos === len || !isDigit(text.charCodeAt(pos))) { + return token = 16 /* Unknown */; + } + // found a minus, followed by a number so + // we fall through to proceed with scanning + // numbers + case 48 /* _0 */: + case 49 /* _1 */: + case 50 /* _2 */: + case 51 /* _3 */: + case 52 /* _4 */: + case 53 /* _5 */: + case 54 /* _6 */: + case 55 /* _7 */: + case 56 /* _8 */: + case 57 /* _9 */: + value += scanNumber(); + return token = 11 /* NumericLiteral */; + // literals and unknown symbols + default: + // is a literal? Read the full word. + while (pos < len && isUnknownContentCharacter(code)) { + pos++; + code = text.charCodeAt(pos); + } + if (tokenOffset !== pos) { + value = text.substring(tokenOffset, pos); + // keywords: true, false, null + switch (value) { + case 'true': return token = 8 /* TrueKeyword */; + case 'false': return token = 9 /* FalseKeyword */; + case 'null': return token = 7 /* NullKeyword */; + } + return token = 16 /* Unknown */; + } + // some + value += String.fromCharCode(code); + pos++; + return token = 16 /* Unknown */; } } -} - -function pop () { - stack.pop(); - - const current = stack[stack.length - 1]; - if (current == null) { - parseState = 'end'; - } else if (Array.isArray(current)) { - parseState = 'afterArrayValue'; - } else { - parseState = 'afterPropertyValue'; + function isUnknownContentCharacter(code) { + if (isWhiteSpace(code) || isLineBreak(code)) { + return false; + } + switch (code) { + case 125 /* closeBrace */: + case 93 /* closeBracket */: + case 123 /* openBrace */: + case 91 /* openBracket */: + case 34 /* doubleQuote */: + case 58 /* colon */: + case 44 /* comma */: + case 47 /* slash */: + return false; + } + return true; } -} - -// This code is unreachable. -// function invalidParseState () { -// return new Error(`JSON5: invalid parse state '${parseState}'`) -// } - -// This code is unreachable. -// function invalidLexState (state) { -// return new Error(`JSON5: invalid lex state '${state}'`) -// } - -function invalidChar (c) { - if (c === undefined) { - return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) + function scanNextNonTrivia() { + var result; + do { + result = scanNext(); + } while (result >= 12 /* LineCommentTrivia */ && result <= 15 /* Trivia */); + return result; } - - return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) + return { + setPosition: setPosition, + getPosition: function () { return pos; }, + scan: ignoreTrivia ? scanNextNonTrivia : scanNext, + getToken: function () { return token; }, + getTokenValue: function () { return value; }, + getTokenOffset: function () { return tokenOffset; }, + getTokenLength: function () { return pos - tokenOffset; }, + getTokenStartLine: function () { return lineStartOffset; }, + getTokenStartCharacter: function () { return tokenOffset - prevTokenLineStartOffset; }, + getTokenError: function () { return scanError; }, + }; } - -function invalidEOF () { - return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) +function isWhiteSpace(ch) { + return ch === 32 /* space */ || ch === 9 /* tab */ || ch === 11 /* verticalTab */ || ch === 12 /* formFeed */ || + ch === 160 /* nonBreakingSpace */ || ch === 5760 /* ogham */ || ch >= 8192 /* enQuad */ && ch <= 8203 /* zeroWidthSpace */ || + ch === 8239 /* narrowNoBreakSpace */ || ch === 8287 /* mathematicalSpace */ || ch === 12288 /* ideographicSpace */ || ch === 65279 /* byteOrderMark */; } - -// This code is unreachable. -// function invalidToken () { -// if (token.type === 'eof') { -// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) -// } - -// const c = String.fromCodePoint(token.value.codePointAt(0)) -// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) -// } - -function invalidIdentifier () { - column -= 5; - return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`) +function isLineBreak(ch) { + return ch === 10 /* lineFeed */ || ch === 13 /* carriageReturn */ || ch === 8232 /* lineSeparator */ || ch === 8233 /* paragraphSeparator */; } - -function separatorChar (c) { - console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`); +function isDigit(ch) { + return ch >= 48 /* _0 */ && ch <= 57 /* _9 */; } -function formatChar (c) { - const replacements = { - "'": "\\'", - '"': '\\"', - '\\': '\\\\', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\v': '\\v', - '\0': '\\0', - '\u2028': '\\u2028', - '\u2029': '\\u2029', +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +var ParseOptions; +(function (ParseOptions) { + ParseOptions.DEFAULT = { + allowTrailingComma: false }; - - if (replacements[c]) { - return replacements[c] - } - - if (c < ' ') { - const hexString = c.charCodeAt(0).toString(16); - return '\\x' + ('00' + hexString).substring(hexString.length) +})(ParseOptions || (ParseOptions = {})); +/** + * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. + * Therefore always check the errors list to find out if the input was valid. + */ +function parse$1(text, errors, options) { + if (errors === void 0) { errors = []; } + if (options === void 0) { options = ParseOptions.DEFAULT; } + var currentProperty = null; + var currentParent = []; + var previousParents = []; + function onValue(value) { + if (Array.isArray(currentParent)) { + currentParent.push(value); + } + else if (currentProperty !== null) { + currentParent[currentProperty] = value; + } } - - return c -} - -function syntaxError (message) { - const err = new SyntaxError(message); - err.lineNumber = line; - err.columnNumber = column; - return err + var visitor = { + onObjectBegin: function () { + var object = {}; + onValue(object); + previousParents.push(currentParent); + currentParent = object; + currentProperty = null; + }, + onObjectProperty: function (name) { + currentProperty = name; + }, + onObjectEnd: function () { + currentParent = previousParents.pop(); + }, + onArrayBegin: function () { + var array = []; + onValue(array); + previousParents.push(currentParent); + currentParent = array; + currentProperty = null; + }, + onArrayEnd: function () { + currentParent = previousParents.pop(); + }, + onLiteralValue: onValue, + onError: function (error, offset, length) { + errors.push({ error: error, offset: offset, length: length }); + } + }; + visit(text, visitor, options); + return currentParent[0]; } - -var stringify = function stringify (value, replacer, space) { - const stack = []; - let indent = ''; - let propertyList; - let replacerFunc; - let gap = ''; - let quote; - - if ( - replacer != null && - typeof replacer === 'object' && - !Array.isArray(replacer) - ) { - space = replacer.space; - quote = replacer.quote; - replacer = replacer.replacer; +/** + * Parses the given text and invokes the visitor functions for each object, array and literal reached. + */ +function visit(text, visitor, options) { + if (options === void 0) { options = ParseOptions.DEFAULT; } + var _scanner = createScanner(text, false); + function toNoArgVisit(visitFunction) { + return visitFunction ? function () { return visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; }; } - - if (typeof replacer === 'function') { - replacerFunc = replacer; - } else if (Array.isArray(replacer)) { - propertyList = []; - for (const v of replacer) { - let item; - - if (typeof v === 'string') { - item = v; - } else if ( - typeof v === 'number' || - v instanceof String || - v instanceof Number - ) { - item = String(v); + function toOneArgVisit(visitFunction) { + return visitFunction ? function (arg) { return visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; }; + } + var onObjectBegin = toNoArgVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisit(visitor.onObjectProperty), onObjectEnd = toNoArgVisit(visitor.onObjectEnd), onArrayBegin = toNoArgVisit(visitor.onArrayBegin), onArrayEnd = toNoArgVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisit(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError); + var disallowComments = options && options.disallowComments; + var allowTrailingComma = options && options.allowTrailingComma; + function scanNext() { + while (true) { + var token = _scanner.scan(); + switch (_scanner.getTokenError()) { + case 4 /* InvalidUnicode */: + handleError(14 /* InvalidUnicode */); + break; + case 5 /* InvalidEscapeCharacter */: + handleError(15 /* InvalidEscapeCharacter */); + break; + case 3 /* UnexpectedEndOfNumber */: + handleError(13 /* UnexpectedEndOfNumber */); + break; + case 1 /* UnexpectedEndOfComment */: + if (!disallowComments) { + handleError(11 /* UnexpectedEndOfComment */); + } + break; + case 2 /* UnexpectedEndOfString */: + handleError(12 /* UnexpectedEndOfString */); + break; + case 6 /* InvalidCharacter */: + handleError(16 /* InvalidCharacter */); + break; } - - if (item !== undefined && propertyList.indexOf(item) < 0) { - propertyList.push(item); + switch (token) { + case 12 /* LineCommentTrivia */: + case 13 /* BlockCommentTrivia */: + if (disallowComments) { + handleError(10 /* InvalidCommentToken */); + } + else { + onComment(); + } + break; + case 16 /* Unknown */: + handleError(1 /* InvalidSymbol */); + break; + case 15 /* Trivia */: + case 14 /* LineBreakTrivia */: + break; + default: + return token; } } } - - if (space instanceof Number) { - space = Number(space); - } else if (space instanceof String) { - space = String(space); - } - - if (typeof space === 'number') { - if (space > 0) { - space = Math.min(10, Math.floor(space)); - gap = ' '.substr(0, space); - } - } else if (typeof space === 'string') { - gap = space.substr(0, 10); - } - - return serializeProperty('', {'': value}) - - function serializeProperty (key, holder) { - let value = holder[key]; - if (value != null) { - if (typeof value.toJSON5 === 'function') { - value = value.toJSON5(key); - } else if (typeof value.toJSON === 'function') { - value = value.toJSON(key); + function handleError(error, skipUntilAfter, skipUntil) { + if (skipUntilAfter === void 0) { skipUntilAfter = []; } + if (skipUntil === void 0) { skipUntil = []; } + onError(error); + if (skipUntilAfter.length + skipUntil.length > 0) { + var token = _scanner.getToken(); + while (token !== 17 /* EOF */) { + if (skipUntilAfter.indexOf(token) !== -1) { + scanNext(); + break; + } + else if (skipUntil.indexOf(token) !== -1) { + break; + } + token = scanNext(); } } - - if (replacerFunc) { - value = replacerFunc.call(holder, key, value); - } - - if (value instanceof Number) { - value = Number(value); - } else if (value instanceof String) { - value = String(value); - } else if (value instanceof Boolean) { - value = value.valueOf(); - } - - switch (value) { - case null: return 'null' - case true: return 'true' - case false: return 'false' + } + function parseString(isValue) { + var value = _scanner.getTokenValue(); + if (isValue) { + onLiteralValue(value); } - - if (typeof value === 'string') { - return quoteString(value) + else { + onObjectProperty(value); } - - if (typeof value === 'number') { - return String(value) + scanNext(); + return true; + } + function parseLiteral() { + switch (_scanner.getToken()) { + case 11 /* NumericLiteral */: + var tokenValue = _scanner.getTokenValue(); + var value = Number(tokenValue); + if (isNaN(value)) { + handleError(2 /* InvalidNumberFormat */); + value = 0; + } + onLiteralValue(value); + break; + case 7 /* NullKeyword */: + onLiteralValue(null); + break; + case 8 /* TrueKeyword */: + onLiteralValue(true); + break; + case 9 /* FalseKeyword */: + onLiteralValue(false); + break; + default: + return false; + } + scanNext(); + return true; + } + function parseProperty() { + if (_scanner.getToken() !== 10 /* StringLiteral */) { + handleError(3 /* PropertyNameExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); + return false; + } + parseString(false); + if (_scanner.getToken() === 6 /* ColonToken */) { + onSeparator(':'); + scanNext(); // consume colon + if (!parseValue()) { + handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); + } } - - if (typeof value === 'object') { - return Array.isArray(value) ? serializeArray(value) : serializeObject(value) + else { + handleError(5 /* ColonExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); } - - return undefined + return true; } - - function quoteString (value) { - const quotes = { - "'": 0.1, - '"': 0.2, - }; - - const replacements = { - "'": "\\'", - '"': '\\"', - '\\': '\\\\', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\v': '\\v', - '\0': '\\0', - '\u2028': '\\u2028', - '\u2029': '\\u2029', - }; - - let product = ''; - - for (let i = 0; i < value.length; i++) { - const c = value[i]; - switch (c) { - case "'": - case '"': - quotes[c]++; - product += c; - continue - - case '\0': - if (util.isDigit(value[i + 1])) { - product += '\\x00'; - continue + function parseObject() { + onObjectBegin(); + scanNext(); // consume open brace + var needsComma = false; + while (_scanner.getToken() !== 2 /* CloseBraceToken */ && _scanner.getToken() !== 17 /* EOF */) { + if (_scanner.getToken() === 5 /* CommaToken */) { + if (!needsComma) { + handleError(4 /* ValueExpected */, [], []); + } + onSeparator(','); + scanNext(); // consume comma + if (_scanner.getToken() === 2 /* CloseBraceToken */ && allowTrailingComma) { + break; } } - - if (replacements[c]) { - product += replacements[c]; - continue + else if (needsComma) { + handleError(6 /* CommaExpected */, [], []); } - - if (c < ' ') { - let hexString = c.charCodeAt(0).toString(16); - product += '\\x' + ('00' + hexString).substring(hexString.length); - continue + if (!parseProperty()) { + handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); } - - product += c; + needsComma = true; } - - const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b); - - product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]); - - return quoteChar + product + quoteChar - } - - function serializeObject (value) { - if (stack.indexOf(value) >= 0) { - throw TypeError('Converting circular structure to JSON5') + onObjectEnd(); + if (_scanner.getToken() !== 2 /* CloseBraceToken */) { + handleError(7 /* CloseBraceExpected */, [2 /* CloseBraceToken */], []); } - - stack.push(value); - - let stepback = indent; - indent = indent + gap; - - let keys = propertyList || Object.keys(value); - let partial = []; - for (const key of keys) { - const propertyString = serializeProperty(key, value); - if (propertyString !== undefined) { - let member = serializeKey(key) + ':'; - if (gap !== '') { - member += ' '; + else { + scanNext(); // consume close brace + } + return true; + } + function parseArray() { + onArrayBegin(); + scanNext(); // consume open bracket + var needsComma = false; + while (_scanner.getToken() !== 4 /* CloseBracketToken */ && _scanner.getToken() !== 17 /* EOF */) { + if (_scanner.getToken() === 5 /* CommaToken */) { + if (!needsComma) { + handleError(4 /* ValueExpected */, [], []); + } + onSeparator(','); + scanNext(); // consume comma + if (_scanner.getToken() === 4 /* CloseBracketToken */ && allowTrailingComma) { + break; } - member += propertyString; - partial.push(member); } - } - - let final; - if (partial.length === 0) { - final = '{}'; - } else { - let properties; - if (gap === '') { - properties = partial.join(','); - final = '{' + properties + '}'; - } else { - let separator = ',\n' + indent; - properties = partial.join(separator); - final = '{\n' + indent + properties + ',\n' + stepback + '}'; + else if (needsComma) { + handleError(6 /* CommaExpected */, [], []); } + if (!parseValue()) { + handleError(4 /* ValueExpected */, [], [4 /* CloseBracketToken */, 5 /* CommaToken */]); + } + needsComma = true; } - - stack.pop(); - indent = stepback; - return final - } - - function serializeKey (key) { - if (key.length === 0) { - return quoteString(key) - } - - const firstChar = String.fromCodePoint(key.codePointAt(0)); - if (!util.isIdStartChar(firstChar)) { - return quoteString(key) + onArrayEnd(); + if (_scanner.getToken() !== 4 /* CloseBracketToken */) { + handleError(8 /* CloseBracketExpected */, [4 /* CloseBracketToken */], []); } - - for (let i = firstChar.length; i < key.length; i++) { - if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) { - return quoteString(key) - } + else { + scanNext(); // consume close bracket } - - return key + return true; } - - function serializeArray (value) { - if (stack.indexOf(value) >= 0) { - throw TypeError('Converting circular structure to JSON5') + function parseValue() { + switch (_scanner.getToken()) { + case 3 /* OpenBracketToken */: + return parseArray(); + case 1 /* OpenBraceToken */: + return parseObject(); + case 10 /* StringLiteral */: + return parseString(true); + default: + return parseLiteral(); } - - stack.push(value); - - let stepback = indent; - indent = indent + gap; - - let partial = []; - for (let i = 0; i < value.length; i++) { - const propertyString = serializeProperty(String(i), value); - partial.push((propertyString !== undefined) ? propertyString : 'null'); - } - - let final; - if (partial.length === 0) { - final = '[]'; - } else { - if (gap === '') { - let properties = partial.join(','); - final = '[' + properties + ']'; - } else { - let separator = ',\n' + indent; - let properties = partial.join(separator); - final = '[\n' + indent + properties + ',\n' + stepback + ']'; - } + } + scanNext(); + if (_scanner.getToken() === 17 /* EOF */) { + if (options.allowEmptyContent) { + return true; } - - stack.pop(); - indent = stepback; - return final + handleError(4 /* ValueExpected */, [], []); + return false; } -}; - -const JSON5 = { - parse, - stringify, -}; - -var lib = JSON5; - -function trimEndSlash(str) { - if (str.endsWith('/') || str.endsWith('\\')) - return str.slice(0, -1); - return str; -} -function trimStartDot(str) { - if (str.startsWith('./')) - return str.slice(2); - return str; -} -function dirname(str) { - const parts = str.split(/[\/\\]/g); - return parts[parts.length - 2]; -} -function join(...parts) { - return parts.map(trimEndSlash).map(trimStartDot).join('/'); + if (!parseValue()) { + handleError(4 /* ValueExpected */, [], []); + return false; + } + if (_scanner.getToken() !== 17 /* EOF */) { + handleError(9 /* EndOfFileExpected */, [], []); + } + return true; } +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +/** + * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. + * Therefore, always check the errors list to find out if the input was valid. + */ +var parse = parse$1; + const isWebWorker = typeof self !== 'undefined' && typeof self.WorkerGlobalScope !== 'undefined'; const isBrowser = isWebWorker || (typeof window !== 'undefined' && @@ -2330,7 +1593,14 @@ async function _fetchAssets(filepath) { } } async function _fetchJSONAssets(filepath) { - return lib.parse(await _fetchAssets(filepath)); + const errors = []; + const rawTheme = parse(await _fetchAssets(filepath), errors, { + allowTrailingComma: true + }); + if (errors.length) { + throw errors[0]; + } + return rawTheme; } /** * @param themePath related path to theme.json diff --git a/src/views/docs/en/examples/examples.md b/src/views/docs/en/examples/examples.md new file mode 100644 index 00000000..22c2311b --- /dev/null +++ b/src/views/docs/en/examples/examples.md @@ -0,0 +1,35 @@ +--- +title: Examples +category: Examples +description: Examples of Architect projects from the organization and the community +--- + +Architect is a flexible framework for dynamic applications. The following examples represent some of ways to use it. Some of these examples are part of the project and others are contributed by community members. + +## Working with functions + +- [Example of using WebSockets in Architect 5.0](https://github.com/architect-examples/arc-example-ws) + + +## Working with data + +- [Best Practices for Modeling Relational Data in DynamoDB](https://github.com/konsumer/arc-example) + - Created by community member [konsumer](https://github.com/konsumer) + - This is a complete example app, with a focus on [the original AWS article](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-relational-modeling.html) + + +## Example apps + +- [Frontend patterns: Using `@views`](https://github.com/architect-examples/arc-examples-views) + +- [Frontend patterns: Serving ES Modules](https://github.com/architect-examples/arc-example-es-modules) + +- [An example docs site (that also happens to be our real docs site)](https://github.com/architect/arc.codes) + +- [Example login / logout flow](https://github.com/architect-examples/arc-example-login-flow) + +- [Example note taking app with support for multiple users](https://github.com/architect-examples/arc-example-notes) + +- [Example repo for working offline and locally](https://github.com/architect-examples/arc-example-working-locally) + +- [Random quote generator](https://github.com/architect-examples/arc-example-random-mitch-hedberg-quote) diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 3c3a046c..7f0497de 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -109,8 +109,13 @@ let About = [ 'Playground', ] +let Examples = [ + 'Examples' +] + module.exports = { Guides, Reference, - About + About, + Examples } From f22d755964b35e02e996dbad5b4d5332564bcd62 Mon Sep 17 00:00:00 2001 From: Ryan Bethel Date: Tue, 5 Oct 2021 15:31:47 -0400 Subject: [PATCH 169/680] putting shiki back --- .../shiki/dist/index.js | 1986 +++++++++++------ 1 file changed, 1358 insertions(+), 628 deletions(-) diff --git a/src/http/get-docs-000lang-catchall/shiki/dist/index.js b/src/http/get-docs-000lang-catchall/shiki/dist/index.js index c98d2496..2483a9ec 100644 --- a/src/http/get-docs-000lang-catchall/shiki/dist/index.js +++ b/src/http/get-docs-000lang-catchall/shiki/dist/index.js @@ -827,684 +827,1421 @@ class StackElementMetadata { } } -function trimEndSlash(str) { - if (str.endsWith('/') || str.endsWith('\\')) - return str.slice(0, -1); - return str; -} -function trimStartDot(str) { - if (str.startsWith('./')) - return str.slice(2); - return str; -} -function dirname(str) { - const parts = str.split(/[\/\\]/g); - return parts[parts.length - 2]; -} -function join(...parts) { - return parts.map(trimEndSlash).map(trimStartDot).join('/'); -} +// This is a generated file. Do not edit. +var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/; +var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/; +var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/; -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -/** - * Creates a JSON scanner on the given text. - * If ignoreTrivia is set, whitespaces or comments are ignored. - */ -function createScanner(text, ignoreTrivia) { - if (ignoreTrivia === void 0) { ignoreTrivia = false; } - var len = text.length; - var pos = 0, value = '', tokenOffset = 0, token = 16 /* Unknown */, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0 /* None */; - function scanHexDigits(count, exact) { - var digits = 0; - var value = 0; - while (digits < count || !exact) { - var ch = text.charCodeAt(pos); - if (ch >= 48 /* _0 */ && ch <= 57 /* _9 */) { - value = value * 16 + ch - 48 /* _0 */; - } - else if (ch >= 65 /* A */ && ch <= 70 /* F */) { - value = value * 16 + ch - 65 /* A */ + 10; - } - else if (ch >= 97 /* a */ && ch <= 102 /* f */) { - value = value * 16 + ch - 97 /* a */ + 10; - } - else { - break; +var unicode = { + Space_Separator: Space_Separator, + ID_Start: ID_Start, + ID_Continue: ID_Continue +}; + +var util = { + isSpaceSeparator (c) { + return typeof c === 'string' && unicode.Space_Separator.test(c) + }, + + isIdStartChar (c) { + return typeof c === 'string' && ( + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c === '$') || (c === '_') || + unicode.ID_Start.test(c) + ) + }, + + isIdContinueChar (c) { + return typeof c === 'string' && ( + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || + (c === '$') || (c === '_') || + (c === '\u200C') || (c === '\u200D') || + unicode.ID_Continue.test(c) + ) + }, + + isDigit (c) { + return typeof c === 'string' && /[0-9]/.test(c) + }, + + isHexDigit (c) { + return typeof c === 'string' && /[0-9A-Fa-f]/.test(c) + }, +}; + +let source; +let parseState; +let stack; +let pos; +let line; +let column; +let token; +let key; +let root; + +var parse = function parse (text, reviver) { + source = String(text); + parseState = 'start'; + stack = []; + pos = 0; + line = 1; + column = 0; + token = undefined; + key = undefined; + root = undefined; + + do { + token = lex(); + + // This code is unreachable. + // if (!parseStates[parseState]) { + // throw invalidParseState() + // } + + parseStates[parseState](); + } while (token.type !== 'eof') + + if (typeof reviver === 'function') { + return internalize({'': root}, '', reviver) + } + + return root +}; + +function internalize (holder, name, reviver) { + const value = holder[name]; + if (value != null && typeof value === 'object') { + for (const key in value) { + const replacement = internalize(value, key, reviver); + if (replacement === undefined) { + delete value[key]; + } else { + value[key] = replacement; } - pos++; - digits++; } - if (digits < count) { - value = -1; + } + + return reviver.call(holder, name, value) +} + +let lexState; +let buffer; +let doubleQuote; +let sign; +let c; + +function lex () { + lexState = 'default'; + buffer = ''; + doubleQuote = false; + sign = 1; + + for (;;) { + c = peek(); + + // This code is unreachable. + // if (!lexStates[lexState]) { + // throw invalidLexState(lexState) + // } + + const token = lexStates[lexState](); + if (token) { + return token } - return value; } - function setPosition(newPosition) { - pos = newPosition; - value = ''; - tokenOffset = 0; - token = 16 /* Unknown */; - scanError = 0 /* None */; +} + +function peek () { + if (source[pos]) { + return String.fromCodePoint(source.codePointAt(pos)) } - function scanNumber() { - var start = pos; - if (text.charCodeAt(pos) === 48 /* _0 */) { - pos++; - } - else { - pos++; - while (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - } +} + +function read () { + const c = peek(); + + if (c === '\n') { + line++; + column = 0; + } else if (c) { + column += c.length; + } else { + column++; + } + + if (c) { + pos += c.length; + } + + return c +} + +const lexStates = { + default () { + switch (c) { + case '\t': + case '\v': + case '\f': + case ' ': + case '\u00A0': + case '\uFEFF': + case '\n': + case '\r': + case '\u2028': + case '\u2029': + read(); + return + + case '/': + read(); + lexState = 'comment'; + return + + case undefined: + read(); + return newToken('eof') } - if (pos < text.length && text.charCodeAt(pos) === 46 /* dot */) { - pos++; - if (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - while (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - } + + if (util.isSpaceSeparator(c)) { + read(); + return + } + + // This code is unreachable. + // if (!lexStates[parseState]) { + // throw invalidLexState(parseState) + // } + + return lexStates[parseState]() + }, + + comment () { + switch (c) { + case '*': + read(); + lexState = 'multiLineComment'; + return + + case '/': + read(); + lexState = 'singleLineComment'; + return + } + + throw invalidChar(read()) + }, + + multiLineComment () { + switch (c) { + case '*': + read(); + lexState = 'multiLineCommentAsterisk'; + return + + case undefined: + throw invalidChar(read()) + } + + read(); + }, + + multiLineCommentAsterisk () { + switch (c) { + case '*': + read(); + return + + case '/': + read(); + lexState = 'default'; + return + + case undefined: + throw invalidChar(read()) + } + + read(); + lexState = 'multiLineComment'; + }, + + singleLineComment () { + switch (c) { + case '\n': + case '\r': + case '\u2028': + case '\u2029': + read(); + lexState = 'default'; + return + + case undefined: + read(); + return newToken('eof') + } + + read(); + }, + + value () { + switch (c) { + case '{': + case '[': + return newToken('punctuator', read()) + + case 'n': + read(); + literal('ull'); + return newToken('null', null) + + case 't': + read(); + literal('rue'); + return newToken('boolean', true) + + case 'f': + read(); + literal('alse'); + return newToken('boolean', false) + + case '-': + case '+': + if (read() === '-') { + sign = -1; } - else { - scanError = 3 /* UnexpectedEndOfNumber */; - return text.substring(start, pos); + + lexState = 'sign'; + return + + case '.': + buffer = read(); + lexState = 'decimalPointLeading'; + return + + case '0': + buffer = read(); + lexState = 'zero'; + return + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + buffer = read(); + lexState = 'decimalInteger'; + return + + case 'I': + read(); + literal('nfinity'); + return newToken('numeric', Infinity) + + case 'N': + read(); + literal('aN'); + return newToken('numeric', NaN) + + case '"': + case "'": + doubleQuote = (read() === '"'); + buffer = ''; + lexState = 'string'; + return + } + + throw invalidChar(read()) + }, + + identifierNameStartEscape () { + if (c !== 'u') { + throw invalidChar(read()) + } + + read(); + const u = unicodeEscape(); + switch (u) { + case '$': + case '_': + break + + default: + if (!util.isIdStartChar(u)) { + throw invalidIdentifier() } + + break + } + + buffer += u; + lexState = 'identifierName'; + }, + + identifierName () { + switch (c) { + case '$': + case '_': + case '\u200C': + case '\u200D': + buffer += read(); + return + + case '\\': + read(); + lexState = 'identifierNameEscape'; + return + } + + if (util.isIdContinueChar(c)) { + buffer += read(); + return + } + + return newToken('identifier', buffer) + }, + + identifierNameEscape () { + if (c !== 'u') { + throw invalidChar(read()) } - var end = pos; - if (pos < text.length && (text.charCodeAt(pos) === 69 /* E */ || text.charCodeAt(pos) === 101 /* e */)) { - pos++; - if (pos < text.length && text.charCodeAt(pos) === 43 /* plus */ || text.charCodeAt(pos) === 45 /* minus */) { - pos++; + + read(); + const u = unicodeEscape(); + switch (u) { + case '$': + case '_': + case '\u200C': + case '\u200D': + break + + default: + if (!util.isIdContinueChar(u)) { + throw invalidIdentifier() } - if (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - while (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - } - end = pos; + + break + } + + buffer += u; + lexState = 'identifierName'; + }, + + sign () { + switch (c) { + case '.': + buffer = read(); + lexState = 'decimalPointLeading'; + return + + case '0': + buffer = read(); + lexState = 'zero'; + return + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + buffer = read(); + lexState = 'decimalInteger'; + return + + case 'I': + read(); + literal('nfinity'); + return newToken('numeric', sign * Infinity) + + case 'N': + read(); + literal('aN'); + return newToken('numeric', NaN) + } + + throw invalidChar(read()) + }, + + zero () { + switch (c) { + case '.': + buffer += read(); + lexState = 'decimalPoint'; + return + + case 'e': + case 'E': + buffer += read(); + lexState = 'decimalExponent'; + return + + case 'x': + case 'X': + buffer += read(); + lexState = 'hexadecimal'; + return + } + + return newToken('numeric', sign * 0) + }, + + decimalInteger () { + switch (c) { + case '.': + buffer += read(); + lexState = 'decimalPoint'; + return + + case 'e': + case 'E': + buffer += read(); + lexState = 'decimalExponent'; + return + } + + if (util.isDigit(c)) { + buffer += read(); + return + } + + return newToken('numeric', sign * Number(buffer)) + }, + + decimalPointLeading () { + if (util.isDigit(c)) { + buffer += read(); + lexState = 'decimalFraction'; + return + } + + throw invalidChar(read()) + }, + + decimalPoint () { + switch (c) { + case 'e': + case 'E': + buffer += read(); + lexState = 'decimalExponent'; + return + } + + if (util.isDigit(c)) { + buffer += read(); + lexState = 'decimalFraction'; + return + } + + return newToken('numeric', sign * Number(buffer)) + }, + + decimalFraction () { + switch (c) { + case 'e': + case 'E': + buffer += read(); + lexState = 'decimalExponent'; + return + } + + if (util.isDigit(c)) { + buffer += read(); + return + } + + return newToken('numeric', sign * Number(buffer)) + }, + + decimalExponent () { + switch (c) { + case '+': + case '-': + buffer += read(); + lexState = 'decimalExponentSign'; + return + } + + if (util.isDigit(c)) { + buffer += read(); + lexState = 'decimalExponentInteger'; + return + } + + throw invalidChar(read()) + }, + + decimalExponentSign () { + if (util.isDigit(c)) { + buffer += read(); + lexState = 'decimalExponentInteger'; + return + } + + throw invalidChar(read()) + }, + + decimalExponentInteger () { + if (util.isDigit(c)) { + buffer += read(); + return + } + + return newToken('numeric', sign * Number(buffer)) + }, + + hexadecimal () { + if (util.isHexDigit(c)) { + buffer += read(); + lexState = 'hexadecimalInteger'; + return + } + + throw invalidChar(read()) + }, + + hexadecimalInteger () { + if (util.isHexDigit(c)) { + buffer += read(); + return + } + + return newToken('numeric', sign * Number(buffer)) + }, + + string () { + switch (c) { + case '\\': + read(); + buffer += escape(); + return + + case '"': + if (doubleQuote) { + read(); + return newToken('string', buffer) } - else { - scanError = 3 /* UnexpectedEndOfNumber */; + + buffer += read(); + return + + case "'": + if (!doubleQuote) { + read(); + return newToken('string', buffer) } + + buffer += read(); + return + + case '\n': + case '\r': + throw invalidChar(read()) + + case '\u2028': + case '\u2029': + separatorChar(c); + break + + case undefined: + throw invalidChar(read()) + } + + buffer += read(); + }, + + start () { + switch (c) { + case '{': + case '[': + return newToken('punctuator', read()) + + // This code is unreachable since the default lexState handles eof. + // case undefined: + // return newToken('eof') + } + + lexState = 'value'; + }, + + beforePropertyName () { + switch (c) { + case '$': + case '_': + buffer = read(); + lexState = 'identifierName'; + return + + case '\\': + read(); + lexState = 'identifierNameStartEscape'; + return + + case '}': + return newToken('punctuator', read()) + + case '"': + case "'": + doubleQuote = (read() === '"'); + lexState = 'string'; + return + } + + if (util.isIdStartChar(c)) { + buffer += read(); + lexState = 'identifierName'; + return + } + + throw invalidChar(read()) + }, + + afterPropertyName () { + if (c === ':') { + return newToken('punctuator', read()) + } + + throw invalidChar(read()) + }, + + beforePropertyValue () { + lexState = 'value'; + }, + + afterPropertyValue () { + switch (c) { + case ',': + case '}': + return newToken('punctuator', read()) } - return text.substring(start, end); + + throw invalidChar(read()) + }, + + beforeArrayValue () { + if (c === ']') { + return newToken('punctuator', read()) + } + + lexState = 'value'; + }, + + afterArrayValue () { + switch (c) { + case ',': + case ']': + return newToken('punctuator', read()) + } + + throw invalidChar(read()) + }, + + end () { + // This code is unreachable since it's handled by the default lexState. + // if (c === undefined) { + // read() + // return newToken('eof') + // } + + throw invalidChar(read()) + }, +}; + +function newToken (type, value) { + return { + type, + value, + line, + column, } - function scanString() { - var result = '', start = pos; - while (true) { - if (pos >= len) { - result += text.substring(start, pos); - scanError = 2 /* UnexpectedEndOfString */; - break; - } - var ch = text.charCodeAt(pos); - if (ch === 34 /* doubleQuote */) { - result += text.substring(start, pos); - pos++; - break; - } - if (ch === 92 /* backslash */) { - result += text.substring(start, pos); - pos++; - if (pos >= len) { - scanError = 2 /* UnexpectedEndOfString */; - break; - } - var ch2 = text.charCodeAt(pos++); - switch (ch2) { - case 34 /* doubleQuote */: - result += '\"'; - break; - case 92 /* backslash */: - result += '\\'; - break; - case 47 /* slash */: - result += '/'; - break; - case 98 /* b */: - result += '\b'; - break; - case 102 /* f */: - result += '\f'; - break; - case 110 /* n */: - result += '\n'; - break; - case 114 /* r */: - result += '\r'; - break; - case 116 /* t */: - result += '\t'; - break; - case 117 /* u */: - var ch3 = scanHexDigits(4, true); - if (ch3 >= 0) { - result += String.fromCharCode(ch3); - } - else { - scanError = 4 /* InvalidUnicode */; - } - break; - default: - scanError = 5 /* InvalidEscapeCharacter */; - } - start = pos; - continue; - } - if (ch >= 0 && ch <= 0x1f) { - if (isLineBreak(ch)) { - result += text.substring(start, pos); - scanError = 2 /* UnexpectedEndOfString */; - break; - } - else { - scanError = 6 /* InvalidCharacter */; - // mark as error but continue with string - } - } - pos++; +} + +function literal (s) { + for (const c of s) { + const p = peek(); + + if (p !== c) { + throw invalidChar(read()) + } + + read(); + } +} + +function escape () { + const c = peek(); + switch (c) { + case 'b': + read(); + return '\b' + + case 'f': + read(); + return '\f' + + case 'n': + read(); + return '\n' + + case 'r': + read(); + return '\r' + + case 't': + read(); + return '\t' + + case 'v': + read(); + return '\v' + + case '0': + read(); + if (util.isDigit(peek())) { + throw invalidChar(read()) } - return result; + + return '\0' + + case 'x': + read(); + return hexEscape() + + case 'u': + read(); + return unicodeEscape() + + case '\n': + case '\u2028': + case '\u2029': + read(); + return '' + + case '\r': + read(); + if (peek() === '\n') { + read(); + } + + return '' + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + throw invalidChar(read()) + + case undefined: + throw invalidChar(read()) } - function scanNext() { - value = ''; - scanError = 0 /* None */; - tokenOffset = pos; - lineStartOffset = lineNumber; - prevTokenLineStartOffset = tokenLineStartOffset; - if (pos >= len) { - // at the end - tokenOffset = len; - return token = 17 /* EOF */; - } - var code = text.charCodeAt(pos); - // trivia: whitespace - if (isWhiteSpace(code)) { - do { - pos++; - value += String.fromCharCode(code); - code = text.charCodeAt(pos); - } while (isWhiteSpace(code)); - return token = 15 /* Trivia */; - } - // trivia: newlines - if (isLineBreak(code)) { - pos++; - value += String.fromCharCode(code); - if (code === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) { - pos++; - value += '\n'; - } - lineNumber++; - tokenLineStartOffset = pos; - return token = 14 /* LineBreakTrivia */; - } - switch (code) { - // tokens: []{}:, - case 123 /* openBrace */: - pos++; - return token = 1 /* OpenBraceToken */; - case 125 /* closeBrace */: - pos++; - return token = 2 /* CloseBraceToken */; - case 91 /* openBracket */: - pos++; - return token = 3 /* OpenBracketToken */; - case 93 /* closeBracket */: - pos++; - return token = 4 /* CloseBracketToken */; - case 58 /* colon */: - pos++; - return token = 6 /* ColonToken */; - case 44 /* comma */: - pos++; - return token = 5 /* CommaToken */; - // strings - case 34 /* doubleQuote */: - pos++; - value = scanString(); - return token = 10 /* StringLiteral */; - // comments - case 47 /* slash */: - var start = pos - 1; - // Single-line comment - if (text.charCodeAt(pos + 1) === 47 /* slash */) { - pos += 2; - while (pos < len) { - if (isLineBreak(text.charCodeAt(pos))) { - break; - } - pos++; - } - value = text.substring(start, pos); - return token = 12 /* LineCommentTrivia */; - } - // Multi-line comment - if (text.charCodeAt(pos + 1) === 42 /* asterisk */) { - pos += 2; - var safeLength = len - 1; // For lookahead. - var commentClosed = false; - while (pos < safeLength) { - var ch = text.charCodeAt(pos); - if (ch === 42 /* asterisk */ && text.charCodeAt(pos + 1) === 47 /* slash */) { - pos += 2; - commentClosed = true; - break; - } - pos++; - if (isLineBreak(ch)) { - if (ch === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) { - pos++; - } - lineNumber++; - tokenLineStartOffset = pos; - } - } - if (!commentClosed) { - pos++; - scanError = 1 /* UnexpectedEndOfComment */; - } - value = text.substring(start, pos); - return token = 13 /* BlockCommentTrivia */; - } - // just a single slash - value += String.fromCharCode(code); - pos++; - return token = 16 /* Unknown */; - // numbers - case 45 /* minus */: - value += String.fromCharCode(code); - pos++; - if (pos === len || !isDigit(text.charCodeAt(pos))) { - return token = 16 /* Unknown */; - } - // found a minus, followed by a number so - // we fall through to proceed with scanning - // numbers - case 48 /* _0 */: - case 49 /* _1 */: - case 50 /* _2 */: - case 51 /* _3 */: - case 52 /* _4 */: - case 53 /* _5 */: - case 54 /* _6 */: - case 55 /* _7 */: - case 56 /* _8 */: - case 57 /* _9 */: - value += scanNumber(); - return token = 11 /* NumericLiteral */; - // literals and unknown symbols - default: - // is a literal? Read the full word. - while (pos < len && isUnknownContentCharacter(code)) { - pos++; - code = text.charCodeAt(pos); - } - if (tokenOffset !== pos) { - value = text.substring(tokenOffset, pos); - // keywords: true, false, null - switch (value) { - case 'true': return token = 8 /* TrueKeyword */; - case 'false': return token = 9 /* FalseKeyword */; - case 'null': return token = 7 /* NullKeyword */; - } - return token = 16 /* Unknown */; - } - // some - value += String.fromCharCode(code); - pos++; - return token = 16 /* Unknown */; + + return read() +} + +function hexEscape () { + let buffer = ''; + let c = peek(); + + if (!util.isHexDigit(c)) { + throw invalidChar(read()) + } + + buffer += read(); + + c = peek(); + if (!util.isHexDigit(c)) { + throw invalidChar(read()) + } + + buffer += read(); + + return String.fromCodePoint(parseInt(buffer, 16)) +} + +function unicodeEscape () { + let buffer = ''; + let count = 4; + + while (count-- > 0) { + const c = peek(); + if (!util.isHexDigit(c)) { + throw invalidChar(read()) } + + buffer += read(); } - function isUnknownContentCharacter(code) { - if (isWhiteSpace(code) || isLineBreak(code)) { - return false; - } - switch (code) { - case 125 /* closeBrace */: - case 93 /* closeBracket */: - case 123 /* openBrace */: - case 91 /* openBracket */: - case 34 /* doubleQuote */: - case 58 /* colon */: - case 44 /* comma */: - case 47 /* slash */: - return false; - } - return true; + + return String.fromCodePoint(parseInt(buffer, 16)) +} + +const parseStates = { + start () { + if (token.type === 'eof') { + throw invalidEOF() + } + + push(); + }, + + beforePropertyName () { + switch (token.type) { + case 'identifier': + case 'string': + key = token.value; + parseState = 'afterPropertyName'; + return + + case 'punctuator': + // This code is unreachable since it's handled by the lexState. + // if (token.value !== '}') { + // throw invalidToken() + // } + + pop(); + return + + case 'eof': + throw invalidEOF() + } + + // This code is unreachable since it's handled by the lexState. + // throw invalidToken() + }, + + afterPropertyName () { + // This code is unreachable since it's handled by the lexState. + // if (token.type !== 'punctuator' || token.value !== ':') { + // throw invalidToken() + // } + + if (token.type === 'eof') { + throw invalidEOF() + } + + parseState = 'beforePropertyValue'; + }, + + beforePropertyValue () { + if (token.type === 'eof') { + throw invalidEOF() + } + + push(); + }, + + beforeArrayValue () { + if (token.type === 'eof') { + throw invalidEOF() + } + + if (token.type === 'punctuator' && token.value === ']') { + pop(); + return + } + + push(); + }, + + afterPropertyValue () { + // This code is unreachable since it's handled by the lexState. + // if (token.type !== 'punctuator') { + // throw invalidToken() + // } + + if (token.type === 'eof') { + throw invalidEOF() + } + + switch (token.value) { + case ',': + parseState = 'beforePropertyName'; + return + + case '}': + pop(); + } + + // This code is unreachable since it's handled by the lexState. + // throw invalidToken() + }, + + afterArrayValue () { + // This code is unreachable since it's handled by the lexState. + // if (token.type !== 'punctuator') { + // throw invalidToken() + // } + + if (token.type === 'eof') { + throw invalidEOF() + } + + switch (token.value) { + case ',': + parseState = 'beforeArrayValue'; + return + + case ']': + pop(); + } + + // This code is unreachable since it's handled by the lexState. + // throw invalidToken() + }, + + end () { + // This code is unreachable since it's handled by the lexState. + // if (token.type !== 'eof') { + // throw invalidToken() + // } + }, +}; + +function push () { + let value; + + switch (token.type) { + case 'punctuator': + switch (token.value) { + case '{': + value = {}; + break + + case '[': + value = []; + break + } + + break + + case 'null': + case 'boolean': + case 'numeric': + case 'string': + value = token.value; + break + + // This code is unreachable. + // default: + // throw invalidToken() } - function scanNextNonTrivia() { - var result; - do { - result = scanNext(); - } while (result >= 12 /* LineCommentTrivia */ && result <= 15 /* Trivia */); - return result; + + if (root === undefined) { + root = value; + } else { + const parent = stack[stack.length - 1]; + if (Array.isArray(parent)) { + parent.push(value); + } else { + parent[key] = value; + } + } + + if (value !== null && typeof value === 'object') { + stack.push(value); + + if (Array.isArray(value)) { + parseState = 'beforeArrayValue'; + } else { + parseState = 'beforePropertyName'; + } + } else { + const current = stack[stack.length - 1]; + if (current == null) { + parseState = 'end'; + } else if (Array.isArray(current)) { + parseState = 'afterArrayValue'; + } else { + parseState = 'afterPropertyValue'; + } } - return { - setPosition: setPosition, - getPosition: function () { return pos; }, - scan: ignoreTrivia ? scanNextNonTrivia : scanNext, - getToken: function () { return token; }, - getTokenValue: function () { return value; }, - getTokenOffset: function () { return tokenOffset; }, - getTokenLength: function () { return pos - tokenOffset; }, - getTokenStartLine: function () { return lineStartOffset; }, - getTokenStartCharacter: function () { return tokenOffset - prevTokenLineStartOffset; }, - getTokenError: function () { return scanError; }, - }; } -function isWhiteSpace(ch) { - return ch === 32 /* space */ || ch === 9 /* tab */ || ch === 11 /* verticalTab */ || ch === 12 /* formFeed */ || - ch === 160 /* nonBreakingSpace */ || ch === 5760 /* ogham */ || ch >= 8192 /* enQuad */ && ch <= 8203 /* zeroWidthSpace */ || - ch === 8239 /* narrowNoBreakSpace */ || ch === 8287 /* mathematicalSpace */ || ch === 12288 /* ideographicSpace */ || ch === 65279 /* byteOrderMark */; + +function pop () { + stack.pop(); + + const current = stack[stack.length - 1]; + if (current == null) { + parseState = 'end'; + } else if (Array.isArray(current)) { + parseState = 'afterArrayValue'; + } else { + parseState = 'afterPropertyValue'; + } } -function isLineBreak(ch) { - return ch === 10 /* lineFeed */ || ch === 13 /* carriageReturn */ || ch === 8232 /* lineSeparator */ || ch === 8233 /* paragraphSeparator */; + +// This code is unreachable. +// function invalidParseState () { +// return new Error(`JSON5: invalid parse state '${parseState}'`) +// } + +// This code is unreachable. +// function invalidLexState (state) { +// return new Error(`JSON5: invalid lex state '${state}'`) +// } + +function invalidChar (c) { + if (c === undefined) { + return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) + } + + return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) +} + +function invalidEOF () { + return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) +} + +// This code is unreachable. +// function invalidToken () { +// if (token.type === 'eof') { +// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) +// } + +// const c = String.fromCodePoint(token.value.codePointAt(0)) +// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) +// } + +function invalidIdentifier () { + column -= 5; + return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`) } -function isDigit(ch) { - return ch >= 48 /* _0 */ && ch <= 57 /* _9 */; + +function separatorChar (c) { + console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`); } -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -var ParseOptions; -(function (ParseOptions) { - ParseOptions.DEFAULT = { - allowTrailingComma: false +function formatChar (c) { + const replacements = { + "'": "\\'", + '"': '\\"', + '\\': '\\\\', + '\b': '\\b', + '\f': '\\f', + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', + '\v': '\\v', + '\0': '\\0', + '\u2028': '\\u2028', + '\u2029': '\\u2029', }; -})(ParseOptions || (ParseOptions = {})); -/** - * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. - * Therefore always check the errors list to find out if the input was valid. - */ -function parse$1(text, errors, options) { - if (errors === void 0) { errors = []; } - if (options === void 0) { options = ParseOptions.DEFAULT; } - var currentProperty = null; - var currentParent = []; - var previousParents = []; - function onValue(value) { - if (Array.isArray(currentParent)) { - currentParent.push(value); - } - else if (currentProperty !== null) { - currentParent[currentProperty] = value; - } + + if (replacements[c]) { + return replacements[c] } - var visitor = { - onObjectBegin: function () { - var object = {}; - onValue(object); - previousParents.push(currentParent); - currentParent = object; - currentProperty = null; - }, - onObjectProperty: function (name) { - currentProperty = name; - }, - onObjectEnd: function () { - currentParent = previousParents.pop(); - }, - onArrayBegin: function () { - var array = []; - onValue(array); - previousParents.push(currentParent); - currentParent = array; - currentProperty = null; - }, - onArrayEnd: function () { - currentParent = previousParents.pop(); - }, - onLiteralValue: onValue, - onError: function (error, offset, length) { - errors.push({ error: error, offset: offset, length: length }); - } - }; - visit(text, visitor, options); - return currentParent[0]; -} -/** - * Parses the given text and invokes the visitor functions for each object, array and literal reached. - */ -function visit(text, visitor, options) { - if (options === void 0) { options = ParseOptions.DEFAULT; } - var _scanner = createScanner(text, false); - function toNoArgVisit(visitFunction) { - return visitFunction ? function () { return visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; }; + + if (c < ' ') { + const hexString = c.charCodeAt(0).toString(16); + return '\\x' + ('00' + hexString).substring(hexString.length) } - function toOneArgVisit(visitFunction) { - return visitFunction ? function (arg) { return visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; }; + + return c +} + +function syntaxError (message) { + const err = new SyntaxError(message); + err.lineNumber = line; + err.columnNumber = column; + return err +} + +var stringify = function stringify (value, replacer, space) { + const stack = []; + let indent = ''; + let propertyList; + let replacerFunc; + let gap = ''; + let quote; + + if ( + replacer != null && + typeof replacer === 'object' && + !Array.isArray(replacer) + ) { + space = replacer.space; + quote = replacer.quote; + replacer = replacer.replacer; } - var onObjectBegin = toNoArgVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisit(visitor.onObjectProperty), onObjectEnd = toNoArgVisit(visitor.onObjectEnd), onArrayBegin = toNoArgVisit(visitor.onArrayBegin), onArrayEnd = toNoArgVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisit(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError); - var disallowComments = options && options.disallowComments; - var allowTrailingComma = options && options.allowTrailingComma; - function scanNext() { - while (true) { - var token = _scanner.scan(); - switch (_scanner.getTokenError()) { - case 4 /* InvalidUnicode */: - handleError(14 /* InvalidUnicode */); - break; - case 5 /* InvalidEscapeCharacter */: - handleError(15 /* InvalidEscapeCharacter */); - break; - case 3 /* UnexpectedEndOfNumber */: - handleError(13 /* UnexpectedEndOfNumber */); - break; - case 1 /* UnexpectedEndOfComment */: - if (!disallowComments) { - handleError(11 /* UnexpectedEndOfComment */); - } - break; - case 2 /* UnexpectedEndOfString */: - handleError(12 /* UnexpectedEndOfString */); - break; - case 6 /* InvalidCharacter */: - handleError(16 /* InvalidCharacter */); - break; + + if (typeof replacer === 'function') { + replacerFunc = replacer; + } else if (Array.isArray(replacer)) { + propertyList = []; + for (const v of replacer) { + let item; + + if (typeof v === 'string') { + item = v; + } else if ( + typeof v === 'number' || + v instanceof String || + v instanceof Number + ) { + item = String(v); } - switch (token) { - case 12 /* LineCommentTrivia */: - case 13 /* BlockCommentTrivia */: - if (disallowComments) { - handleError(10 /* InvalidCommentToken */); - } - else { - onComment(); - } - break; - case 16 /* Unknown */: - handleError(1 /* InvalidSymbol */); - break; - case 15 /* Trivia */: - case 14 /* LineBreakTrivia */: - break; - default: - return token; + + if (item !== undefined && propertyList.indexOf(item) < 0) { + propertyList.push(item); } } } - function handleError(error, skipUntilAfter, skipUntil) { - if (skipUntilAfter === void 0) { skipUntilAfter = []; } - if (skipUntil === void 0) { skipUntil = []; } - onError(error); - if (skipUntilAfter.length + skipUntil.length > 0) { - var token = _scanner.getToken(); - while (token !== 17 /* EOF */) { - if (skipUntilAfter.indexOf(token) !== -1) { - scanNext(); - break; - } - else if (skipUntil.indexOf(token) !== -1) { - break; - } - token = scanNext(); - } - } + + if (space instanceof Number) { + space = Number(space); + } else if (space instanceof String) { + space = String(space); } - function parseString(isValue) { - var value = _scanner.getTokenValue(); - if (isValue) { - onLiteralValue(value); - } - else { - onObjectProperty(value); + + if (typeof space === 'number') { + if (space > 0) { + space = Math.min(10, Math.floor(space)); + gap = ' '.substr(0, space); } - scanNext(); - return true; - } - function parseLiteral() { - switch (_scanner.getToken()) { - case 11 /* NumericLiteral */: - var tokenValue = _scanner.getTokenValue(); - var value = Number(tokenValue); - if (isNaN(value)) { - handleError(2 /* InvalidNumberFormat */); - value = 0; - } - onLiteralValue(value); - break; - case 7 /* NullKeyword */: - onLiteralValue(null); - break; - case 8 /* TrueKeyword */: - onLiteralValue(true); - break; - case 9 /* FalseKeyword */: - onLiteralValue(false); - break; - default: - return false; - } - scanNext(); - return true; + } else if (typeof space === 'string') { + gap = space.substr(0, 10); } - function parseProperty() { - if (_scanner.getToken() !== 10 /* StringLiteral */) { - handleError(3 /* PropertyNameExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); - return false; - } - parseString(false); - if (_scanner.getToken() === 6 /* ColonToken */) { - onSeparator(':'); - scanNext(); // consume colon - if (!parseValue()) { - handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); + + return serializeProperty('', {'': value}) + + function serializeProperty (key, holder) { + let value = holder[key]; + if (value != null) { + if (typeof value.toJSON5 === 'function') { + value = value.toJSON5(key); + } else if (typeof value.toJSON === 'function') { + value = value.toJSON(key); } } - else { - handleError(5 /* ColonExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); + + if (replacerFunc) { + value = replacerFunc.call(holder, key, value); + } + + if (value instanceof Number) { + value = Number(value); + } else if (value instanceof String) { + value = String(value); + } else if (value instanceof Boolean) { + value = value.valueOf(); + } + + switch (value) { + case null: return 'null' + case true: return 'true' + case false: return 'false' + } + + if (typeof value === 'string') { + return quoteString(value) + } + + if (typeof value === 'number') { + return String(value) + } + + if (typeof value === 'object') { + return Array.isArray(value) ? serializeArray(value) : serializeObject(value) } - return true; + + return undefined } - function parseObject() { - onObjectBegin(); - scanNext(); // consume open brace - var needsComma = false; - while (_scanner.getToken() !== 2 /* CloseBraceToken */ && _scanner.getToken() !== 17 /* EOF */) { - if (_scanner.getToken() === 5 /* CommaToken */) { - if (!needsComma) { - handleError(4 /* ValueExpected */, [], []); - } - onSeparator(','); - scanNext(); // consume comma - if (_scanner.getToken() === 2 /* CloseBraceToken */ && allowTrailingComma) { - break; + + function quoteString (value) { + const quotes = { + "'": 0.1, + '"': 0.2, + }; + + const replacements = { + "'": "\\'", + '"': '\\"', + '\\': '\\\\', + '\b': '\\b', + '\f': '\\f', + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', + '\v': '\\v', + '\0': '\\0', + '\u2028': '\\u2028', + '\u2029': '\\u2029', + }; + + let product = ''; + + for (let i = 0; i < value.length; i++) { + const c = value[i]; + switch (c) { + case "'": + case '"': + quotes[c]++; + product += c; + continue + + case '\0': + if (util.isDigit(value[i + 1])) { + product += '\\x00'; + continue } } - else if (needsComma) { - handleError(6 /* CommaExpected */, [], []); + + if (replacements[c]) { + product += replacements[c]; + continue } - if (!parseProperty()) { - handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); + + if (c < ' ') { + let hexString = c.charCodeAt(0).toString(16); + product += '\\x' + ('00' + hexString).substring(hexString.length); + continue } - needsComma = true; - } - onObjectEnd(); - if (_scanner.getToken() !== 2 /* CloseBraceToken */) { - handleError(7 /* CloseBraceExpected */, [2 /* CloseBraceToken */], []); - } - else { - scanNext(); // consume close brace + + product += c; } - return true; + + const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b); + + product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]); + + return quoteChar + product + quoteChar } - function parseArray() { - onArrayBegin(); - scanNext(); // consume open bracket - var needsComma = false; - while (_scanner.getToken() !== 4 /* CloseBracketToken */ && _scanner.getToken() !== 17 /* EOF */) { - if (_scanner.getToken() === 5 /* CommaToken */) { - if (!needsComma) { - handleError(4 /* ValueExpected */, [], []); - } - onSeparator(','); - scanNext(); // consume comma - if (_scanner.getToken() === 4 /* CloseBracketToken */ && allowTrailingComma) { - break; + + function serializeObject (value) { + if (stack.indexOf(value) >= 0) { + throw TypeError('Converting circular structure to JSON5') + } + + stack.push(value); + + let stepback = indent; + indent = indent + gap; + + let keys = propertyList || Object.keys(value); + let partial = []; + for (const key of keys) { + const propertyString = serializeProperty(key, value); + if (propertyString !== undefined) { + let member = serializeKey(key) + ':'; + if (gap !== '') { + member += ' '; } + member += propertyString; + partial.push(member); } - else if (needsComma) { - handleError(6 /* CommaExpected */, [], []); - } - if (!parseValue()) { - handleError(4 /* ValueExpected */, [], [4 /* CloseBracketToken */, 5 /* CommaToken */]); + } + + let final; + if (partial.length === 0) { + final = '{}'; + } else { + let properties; + if (gap === '') { + properties = partial.join(','); + final = '{' + properties + '}'; + } else { + let separator = ',\n' + indent; + properties = partial.join(separator); + final = '{\n' + indent + properties + ',\n' + stepback + '}'; } - needsComma = true; } - onArrayEnd(); - if (_scanner.getToken() !== 4 /* CloseBracketToken */) { - handleError(8 /* CloseBracketExpected */, [4 /* CloseBracketToken */], []); + + stack.pop(); + indent = stepback; + return final + } + + function serializeKey (key) { + if (key.length === 0) { + return quoteString(key) + } + + const firstChar = String.fromCodePoint(key.codePointAt(0)); + if (!util.isIdStartChar(firstChar)) { + return quoteString(key) } - else { - scanNext(); // consume close bracket + + for (let i = firstChar.length; i < key.length; i++) { + if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) { + return quoteString(key) + } } - return true; + + return key } - function parseValue() { - switch (_scanner.getToken()) { - case 3 /* OpenBracketToken */: - return parseArray(); - case 1 /* OpenBraceToken */: - return parseObject(); - case 10 /* StringLiteral */: - return parseString(true); - default: - return parseLiteral(); + + function serializeArray (value) { + if (stack.indexOf(value) >= 0) { + throw TypeError('Converting circular structure to JSON5') } - } - scanNext(); - if (_scanner.getToken() === 17 /* EOF */) { - if (options.allowEmptyContent) { - return true; + + stack.push(value); + + let stepback = indent; + indent = indent + gap; + + let partial = []; + for (let i = 0; i < value.length; i++) { + const propertyString = serializeProperty(String(i), value); + partial.push((propertyString !== undefined) ? propertyString : 'null'); } - handleError(4 /* ValueExpected */, [], []); - return false; - } - if (!parseValue()) { - handleError(4 /* ValueExpected */, [], []); - return false; - } - if (_scanner.getToken() !== 17 /* EOF */) { - handleError(9 /* EndOfFileExpected */, [], []); + + let final; + if (partial.length === 0) { + final = '[]'; + } else { + if (gap === '') { + let properties = partial.join(','); + final = '[' + properties + ']'; + } else { + let separator = ',\n' + indent; + let properties = partial.join(separator); + final = '[\n' + indent + properties + ',\n' + stepback + ']'; + } + } + + stack.pop(); + indent = stepback; + return final } - return true; -} +}; + +const JSON5 = { + parse, + stringify, +}; + +var lib = JSON5; -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -/** - * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. - * Therefore, always check the errors list to find out if the input was valid. - */ -var parse = parse$1; +function trimEndSlash(str) { + if (str.endsWith('/') || str.endsWith('\\')) + return str.slice(0, -1); + return str; +} +function trimStartDot(str) { + if (str.startsWith('./')) + return str.slice(2); + return str; +} +function dirname(str) { + const parts = str.split(/[\/\\]/g); + return parts[parts.length - 2]; +} +function join(...parts) { + return parts.map(trimEndSlash).map(trimStartDot).join('/'); +} const isWebWorker = typeof self !== 'undefined' && typeof self.WorkerGlobalScope !== 'undefined'; const isBrowser = isWebWorker || @@ -1593,14 +2330,7 @@ async function _fetchAssets(filepath) { } } async function _fetchJSONAssets(filepath) { - const errors = []; - const rawTheme = parse(await _fetchAssets(filepath), errors, { - allowTrailingComma: true - }); - if (errors.length) { - throw errors[0]; - } - return rawTheme; + return lib.parse(await _fetchAssets(filepath)); } /** * @param themePath related path to theme.json From dfbe561a8df7795620124cb9d21bb253b5908523 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 5 Oct 2021 15:51:55 -0600 Subject: [PATCH 170/680] move doc and add redirect for /examples a couple quick changes per discussion with @ryanbethel --- scripts/dictionary.js | 1 + src/http/any-catchall/redirect.js | 2 + .../docs/en/{examples => guides}/examples.md | 4 +- src/views/docs/table-of-contents.js | 114 +++++++++--------- 4 files changed, 61 insertions(+), 60 deletions(-) rename src/views/docs/en/{examples => guides}/examples.md (96%) diff --git a/scripts/dictionary.js b/scripts/dictionary.js index a3331c18..fd7fa962 100644 --- a/scripts/dictionary.js +++ b/scripts/dictionary.js @@ -160,6 +160,7 @@ let dictionary = [ 'keypress', 'Kinesis', 'KMS', + 'konsumer', 'LEANX', 'learnable', 'learnings', diff --git a/src/http/any-catchall/redirect.js b/src/http/any-catchall/redirect.js index 721add1e..42dee5af 100644 --- a/src/http/any-catchall/redirect.js +++ b/src/http/any-catchall/redirect.js @@ -3,6 +3,8 @@ let redirects = { // tmp until marketing landing page work done '/': '/docs/en/guides/get-started/quickstart', + '/examples': '/docs/en/guides/examples', + // Intro '/intro/philosophy': '/docs/en/guides/get-started/why-architect', '/intro/limits': '/docs/en/guides/get-started/detailed-aws-setup', diff --git a/src/views/docs/en/examples/examples.md b/src/views/docs/en/guides/examples.md similarity index 96% rename from src/views/docs/en/examples/examples.md rename to src/views/docs/en/guides/examples.md index 22c2311b..64a4b143 100644 --- a/src/views/docs/en/examples/examples.md +++ b/src/views/docs/en/guides/examples.md @@ -1,6 +1,6 @@ --- title: Examples -category: Examples +category: Guides description: Examples of Architect projects from the organization and the community --- @@ -13,7 +13,7 @@ Architect is a flexible framework for dynamic applications. The following exampl ## Working with data -- [Best Practices for Modeling Relational Data in DynamoDB](https://github.com/konsumer/arc-example) +- [Best Practices for Modeling Relational Data in DynamoDB](https://github.com/konsumer/arc-example) - Created by community member [konsumer](https://github.com/konsumer) - This is a complete example app, with a focus on [the original AWS article](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-relational-modeling.html) diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 7f0497de..707b1dd6 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -1,55 +1,58 @@ -let Guides = [ { - 'Get started': [ - 'Why Architect?', - 'Quickstart', - 'Project layout', - 'Detailed AWS setup', - ], - 'Developer experience': [ - 'Local development', // preview, debug and test - 'Dependency management', - 'Sharing code', // src/shared and src/views - 'Custom source paths', - 'Deployment', - 'Logging & monitoring', // cloudwatch - 'Using TypeScript', - ], - 'Frontend': [ - 'Static assets', // fingerprint, ignore, folder, link to cdn - // TODO 'HTTP functions', //inc cors - // TODO 'Sessions', - // TODO 'Middleware', - // TODO 'WebSockets functions', - ], - 'Domains': [ - 'Overview', - { - 'Registrars': [ - 'Route53', - 'Route53 & CloudFront', - 'Dreamhost', - 'GoDaddy', - 'Namecheap', - 'One' - ] - } - ], - /* TODO - 'Backend': [ - 'Database tables & indexes', - 'Database stream functions', - 'Event functions', - 'Queue functions', - 'Scheduled functions', - ],*/ - 'Extend': [ - // TODO 'Migrate legacy code', // @proxy, arc.http.express - 'Custom CloudFormation', - 'Plugins', - // TODO 'Add a custom domain', - // TODO 'Ejecting', - ] -} ] +let Guides = [ + { + 'Get started': [ + 'Why Architect?', + 'Quickstart', + 'Project layout', + 'Detailed AWS setup', + ], + 'Developer experience': [ + 'Local development', // preview, debug and test + 'Dependency management', + 'Sharing code', // src/shared and src/views + 'Custom source paths', + 'Deployment', + 'Logging & monitoring', // cloudwatch + 'Using TypeScript', + ], + 'Frontend': [ + 'Static assets', // fingerprint, ignore, folder, link to cdn + // TODO 'HTTP functions', //inc cors + // TODO 'Sessions', + // TODO 'Middleware', + // TODO 'WebSockets functions', + ], + 'Domains': [ + 'Overview', + { + 'Registrars': [ + 'Route53', + 'Route53 & CloudFront', + 'Dreamhost', + 'GoDaddy', + 'Namecheap', + 'One' + ] + } + ], + /* TODO + 'Backend': [ + 'Database tables & indexes', + 'Database stream functions', + 'Event functions', + 'Queue functions', + 'Scheduled functions', + ],*/ + 'Extend': [ + // TODO 'Migrate legacy code', // @proxy, arc.http.express + 'Custom CloudFormation', + 'Plugins', + // TODO 'Add a custom domain', + // TODO 'Ejecting', + ] + }, + 'Examples' +] let Reference = [ { 'Runtime': [ @@ -109,13 +112,8 @@ let About = [ 'Playground', ] -let Examples = [ - 'Examples' -] - module.exports = { Guides, Reference, - About, - Examples + About } From 0dccf2a75bbc0a578e2319bedf8069f0bcc0ed38 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 5 Oct 2021 16:20:40 -0600 Subject: [PATCH 171/680] 3.5.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d19a199..6b46ed4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.5.6", + "version": "3.5.7", "architect": { "app": "v8-arc-codes", "aws": { From 99c52b7c60377fac9c3257e994f7ae460880f016 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 5 Oct 2021 17:35:19 -0600 Subject: [PATCH 172/680] move Discord notice to banner and remove some cruft --- public/css/index.css | 6 +- public/static.json | 2 +- src/views/modules/components/algolia.js | 2 +- src/views/modules/components/anchor.js | 6 - src/views/modules/components/banner.js | 39 + src/views/modules/components/heading.js | 8 - src/views/modules/components/item.js | 8 - src/views/modules/components/list.js | 8 - src/views/modules/components/sidebar.js | 3 - src/views/modules/components/star-link.js | 20 - src/views/modules/data/store.js | 42 - src/views/modules/document/html.js | 2 - src/views/modules/document/styles.js | 1198 --------------------- src/views/modules/document/symbols.js | 1 - src/views/modules/document/top-nav.js | 38 +- src/views/modules/layouts/one-column.js | 4 - src/views/modules/layouts/two-column.js | 43 - src/views/modules/pages/main.js | 5 - 18 files changed, 47 insertions(+), 1388 deletions(-) delete mode 100644 src/views/modules/components/anchor.js create mode 100644 src/views/modules/components/banner.js delete mode 100644 src/views/modules/components/heading.js delete mode 100644 src/views/modules/components/item.js delete mode 100644 src/views/modules/components/list.js delete mode 100644 src/views/modules/components/star-link.js delete mode 100644 src/views/modules/data/store.js delete mode 100644 src/views/modules/document/styles.js delete mode 100644 src/views/modules/layouts/one-column.js delete mode 100644 src/views/modules/layouts/two-column.js delete mode 100644 src/views/modules/pages/main.js diff --git a/public/css/index.css b/public/css/index.css index 8dc71ae6..189f5b56 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -18,7 +18,7 @@ html { } .two-column { /* Height: Header | Content */ - grid-template-rows: 3rem 3rem 1fr; + grid-template-rows: 3rem 1fr; /* Width: Sidebar | Content */ grid-template-columns: 17.666rem 1fr; } @@ -26,10 +26,6 @@ html { width: 1.25rem; height: 1.25rem; } -.star-icon { - width: 1rem; - height: 1rem; -} .discord-icon { width: 1.3rem; height: 1.3rem; diff --git a/public/static.json b/public/static.json index d1152572..1cffe089 100644 --- a/public/static.json +++ b/public/static.json @@ -6,7 +6,7 @@ "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", "components/arc-viewer.js": "components/arc-viewer-3de6ce2a83.js", "css/docsearch.css": "css/docsearch-27dbba82ed.css", - "css/index.css": "css/index-092bdb8561.css", + "css/index.css": "css/index-b7b5744cd1.css", "css/styles.css": "css/styles-cf4510a1b6.css", "css/syntax.css": "css/syntax-03b095eb73.css" } \ No newline at end of file diff --git a/src/views/modules/components/algolia.js b/src/views/modules/components/algolia.js index d9ed02b0..02f0e576 100644 --- a/src/views/modules/components/algolia.js +++ b/src/views/modules/components/algolia.js @@ -19,4 +19,4 @@ var docsearchParams = { docsearch(docsearchParams); -` + ` diff --git a/src/views/modules/components/anchor.js b/src/views/modules/components/anchor.js deleted file mode 100644 index eb63cd0d..00000000 --- a/src/views/modules/components/anchor.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function Anchor (props = {}) { - let { children, href = '#' } = props - return ` -${children} - ` -} diff --git a/src/views/modules/components/banner.js b/src/views/modules/components/banner.js new file mode 100644 index 00000000..4733f9c6 --- /dev/null +++ b/src/views/modules/components/banner.js @@ -0,0 +1,39 @@ +// enabling the banner will require general CSS layout changes + +export default function Banner (state = {}) { + const { enabled } = state + + return enabled ? ` +
+ + Community chat has moved to + + Discord + + +
+ ` : '' +} diff --git a/src/views/modules/components/heading.js b/src/views/modules/components/heading.js deleted file mode 100644 index 298fe83f..00000000 --- a/src/views/modules/components/heading.js +++ /dev/null @@ -1,8 +0,0 @@ -export default function Heading (state = {}) { - let { children, classes, level = '1' } = state - return ` - - ${children} - - ` -} diff --git a/src/views/modules/components/item.js b/src/views/modules/components/item.js deleted file mode 100644 index 65d9e075..00000000 --- a/src/views/modules/components/item.js +++ /dev/null @@ -1,8 +0,0 @@ -export default function Item (state = {}) { - let { children, classes } = state - return ` -
  • - ${children} -
  • - ` -} diff --git a/src/views/modules/components/list.js b/src/views/modules/components/list.js deleted file mode 100644 index 1d99f7c6..00000000 --- a/src/views/modules/components/list.js +++ /dev/null @@ -1,8 +0,0 @@ -export default function List (props = {}) { - let { children, classes } = props - return ` -
      - ${children} -
    - ` -} diff --git a/src/views/modules/components/sidebar.js b/src/views/modules/components/sidebar.js index c1c59a6e..7fc43592 100644 --- a/src/views/modules/components/sidebar.js +++ b/src/views/modules/components/sidebar.js @@ -131,9 +131,6 @@ export default function Sidebar (props = {}) { overflow-auto sidebar-w transition-x - col-start-1 - col-end-2 - row-start-3 bg-g0 " > diff --git a/src/views/modules/components/star-link.js b/src/views/modules/components/star-link.js deleted file mode 100644 index 481a7981..00000000 --- a/src/views/modules/components/star-link.js +++ /dev/null @@ -1,20 +0,0 @@ -import Icon from './icon.js' - -export default function StarLink (state = {}) { - let { classes } = state - return ` - - ${Icon({ classes: 'icon fill-current transition-fill', href: 'star' })} - - ` -} diff --git a/src/views/modules/data/store.js b/src/views/modules/data/store.js deleted file mode 100644 index d8d35efe..00000000 --- a/src/views/modules/data/store.js +++ /dev/null @@ -1,42 +0,0 @@ -const listeners = [] -const state = {} -let noop = x => x - -function subscribe (fn) { - listeners.push(fn) -} - -function unsubscribe (fn) { - listeners.splice(listeners.indexOf(fn), 1) -} - -function mutate (mutation) { - mutation = mutation || noop - let i = 0 - let l = listeners.length - let fn - mutation(state) - for (i; i < l; i++) { - fn = listeners[i] - fn(state) - } -} - -function merge (o, n) { - for (let prop in n) { - o[prop] = n[prop] - } -} - -function store (initialState) { - if (initialState) { - merge(state, initialState) - } - return state -} - -store.subscribe = subscribe -store.unsubscribe = unsubscribe -store.mutate = mutate - -export default store diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index 5a21cfb5..2538d959 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -47,8 +47,6 @@ ${Symbols} id="main" class=" h-full - row-start-3 - col-start-2 p3 overflow-auto " diff --git a/src/views/modules/document/styles.js b/src/views/modules/document/styles.js deleted file mode 100644 index 43735137..00000000 --- a/src/views/modules/document/styles.js +++ /dev/null @@ -1,1198 +0,0 @@ -export default ` -/* ----- THEME ----- */ -/* VARIABLES */ -:root { - --p0:#2CDD93;/* Medium Aquamarine light */ - --p1:#1F74D6;/* Bright Navy Blue light */ - --p2:hsl(267, 50%, 55%);/* Royal Purple light */ - --p3:#E21893;/* Barbie Pink light */ - --p4:#FF6263;/* Bittersweet Orange light */ - --p5:hsl(267, 75%, 45%);/* Royal purple */ - --g0:#FBFBFB;/* #FBFBFB */ - --g1:#E5E5E5;/* #E5E5E5 */ - --g2:#CFCFCF;/* #CFCFCF */ - --g3:#BABABA;/* #BABABA */ - --g4:#A4A4A4;/* #A4A4A4 */ - --g5:#8E8E8E;/* #8E8E8E */ - --g6:#797979;/* #797979 */ - --g7:#636363;/* #636363 */ - --g8:#4D4D4D;/* #4D4D4D */ - --g9:#383838;/* #383838 */ - --g10:#222222;/* #222222 */ - --h0:#3EE09C;/* Medium Aquamarine */ - --h1:#2a80e0;/* Bright Navy Blue */ - --h2:hsl(267, 90%, 55%);/* Royal Purple Hover */ - --h3:#DE1792;/* Barbie Pink */ - --h4:#FF4747;/* Bittersweet Orange */ - --h5:#FAE05D;/* Minion Yellow */ - --a0:#A4A4A4;/* #A4A4A4 */ - --a1:#8E8E8E;/* #8E8E8E */ - --d0:#797979;/* #797979 */ - --d1:#636363;/* #636363 */ -} - -/* RESET */ -*, -*:before, -*:after { - margin: 0; - padding: 0; - border: none; - box-sizing: border-box; -} -img {max-width: 100%;} -svg { - width: 100%; - height: 100%; - vertical-align: top; -} -select, -textarea, -button, -input {font-family: inherit;} - - -/* TYPEFACE */ -html {font-size: 18px;} -body { - font-weight: normal; - line-height: 1.5; - text-rendering: geometricPrecision; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - - -/* COLOR */ -.text-current{color:currentColor;}/* current color */ -.text-transparent{color:transparent;}/* transparent */ -.text-p0{color:var(--p0);}/* Medium Aquamarine light */ -.text-p1{color:var(--p1);}/* Bright Navy Blue light */ -.text-p2{color:var(--p2);}/* Royal Purple light */ -.text-p3{color:var(--p3);}/* Barbie Pink light */ -.text-p4{color:var(--p4);}/* Bittersweet Orange light */ -.text-p5{color:var(--p5);}/* Royal purple */ -.text-g0{color:var(--g0);}/* #FBFBFB */ -.text-g1{color:var(--g1);}/* #E5E5E5 */ -.text-g2{color:var(--g2);}/* #CFCFCF */ -.text-g3{color:var(--g3);}/* #BABABA */ -.text-g4{color:var(--g4);}/* #A4A4A4 */ -.text-g5{color:var(--g5);}/* #8E8E8E */ -.text-g6{color:var(--g6);}/* #797979 */ -.text-g7{color:var(--g7);}/* #636363 */ -.text-g8{color:var(--g8);}/* #4D4D4D */ -.text-g9{color:var(--g9);}/* #383838 */ -.text-g10{color:var(--g10);}/* #222222 */ -.text-h0:hover{color:var(--h0);}/* Medium Aquamarine */ -.text-h1:hover{color:var(--h1);}/* Bright Navy Blue */ -.text-h2:hover{color:var(--h2);}/* Royal Purple Hover */ -.text-h3:hover{color:var(--h3);}/* Barbie Pink */ -.text-h4:hover{color:var(--h4);}/* Bittersweet Orange */ -.text-h5:hover{color:var(--h5);}/* Minion Yellow */ -.text-a0:active{color:var(--a0);}/* #A4A4A4 */ -.text-a0.active{color:var(--a0);}/* #A4A4A4 */ -.text-a1:active{color:var(--a1);}/* #8E8E8E */ -.text-a1.active{color:var(--a1);}/* #8E8E8E */ -.text-d0:disabled{color:var(--d0);}/* #797979 */ -.text-d1:disabled{color:var(--d1);}/* #636363 */ - - -/* BACKGROUND */ -.bg-fixed{background-attachment:fixed;} -.bg-local{background-attachment:local;} -.bg-scroll{background-attachment:scroll;} -.bg-bottom{background-position:bottom;} -.bg-center{background-position:center;} -.bg-left{background-position:left;} -.bg-left-bottom{background-position:left bottom;} -.bg-left-top{background-position:left top;} -.bg-right{background-position:right;} -.bg-right-bottom{background-position:right bottom;} -.bg-right-top{background-position:right top;} -.bg-top{background-position:top;} -.bg-repeat{background-repeat:repeat;} -.bg-no-repeat{background-repeat:no-repeat;} -.bg-repeat-x{background-repeat:repeat-x;} -.bg-repeat-y{background-repeat:repeat-y;} -.bg-repeat-round{background-repeat:round;} -.bg-repeat-space{background-repeat:space;} -.bg-auto{background-size:auto;} -.bg-cover{background-size:cover;} -.bg-contain{background-size:contain;} -.bg-unset{background-color:unset;} -.bg-p0{background-color:var(--p0);} -.bg-p1{background-color:var(--p1);} -.bg-p2{background-color:var(--p2);} -.bg-p3{background-color:var(--p3);} -.bg-p4{background-color:var(--p4);} -.bg-p5{background-color:var(--p5);} -.bg-g0{background-color:var(--g0);} -.bg-g1{background-color:var(--g1);} -.bg-g2{background-color:var(--g2);} -.bg-g3{background-color:var(--g3);} -.bg-g4{background-color:var(--g4);} -.bg-g5{background-color:var(--g5);} -.bg-g6{background-color:var(--g6);} -.bg-g7{background-color:var(--g7);} -.bg-g8{background-color:var(--g8);} -.bg-g9{background-color:var(--g9);} -.bg-g10{background-color:var(--g10);} -.bg-h0:hover{background-color:var(--h0);} -.bg-h1:hover{background-color:var(--h1);} -.bg-h2:hover{background-color:var(--h2);} -.bg-h3:hover{background-color:var(--h3);} -.bg-h4:hover{background-color:var(--h4);} -.bg-h5:hover{background-color:var(--h5);} -.bg-a0:active{background-color:var(--a0);} -.bg-a0.active{background-color:var(--a0);} -.bg-a1:active{background-color:var(--a1);} -.bg-a1.active{background-color:var(--a1);} -.bg-d0:disabled{background-color:var(--d0);} -.bg-d1:disabled{background-color:var(--d1);} - - - /* GRADIENT */.bg-image0{background-image:linear-gradient(0.4turn, #0100ca, #00e5ff, #f50057);}/* outrun */ - - -/* BORDER */ -.border-solid{border-style:solid;} -.border-dashed{border-style:dashed;} -.border-dotted{border-style:dotted;} -.border-double{border-style:double;} -.border-none{border-style:none;} -.border-t-none{border-top:none;} -.border-r-none{border-right:none;} -.border-b-none{border-bottom:none;} -.border-l-none{border-left:none;} - -.border0{border-width:0px;} -.border-t0{border-top-width:0px;} -.border-r0{border-right-width:0px;} -.border-b0{border-bottom-width:0px;} -.border-l0{border-left-width:0px;} -.border1{border-width:1px;} -.border-t1{border-top-width:1px;} -.border-r1{border-right-width:1px;} -.border-b1{border-bottom-width:1px;} -.border-l1{border-left-width:1px;} -.border2{border-width:2px;} -.border-t2{border-top-width:2px;} -.border-r2{border-right-width:2px;} -.border-b2{border-bottom-width:2px;} -.border-l2{border-left-width:2px;} -.border3{border-width:4px;} -.border-t3{border-top-width:4px;} -.border-r3{border-right-width:4px;} -.border-b3{border-bottom-width:4px;} -.border-l3{border-left-width:4px;} -.border4{border-width:8px;} -.border-t4{border-top-width:8px;} -.border-r4{border-right-width:8px;} -.border-b4{border-bottom-width:8px;} -.border-l4{border-left-width:8px;} -.border5{border-width:16px;} -.border-t5{border-top-width:16px;} -.border-r5{border-right-width:16px;} -.border-b5{border-bottom-width:16px;} -.border-l5{border-left-width:16px;} -.border6{border-width:32px;} -.border-t6{border-top-width:32px;} -.border-r6{border-right-width:32px;} -.border-b6{border-bottom-width:32px;} -.border-l6{border-left-width:32px;}.border-p0{border-color:var(--p0);}/* Medium Aquamarine light */.border-p1{border-color:var(--p1);}/* Bright Navy Blue light */.border-p2{border-color:var(--p2);}/* Royal Purple light */.border-p3{border-color:var(--p3);}/* Barbie Pink light */.border-p4{border-color:var(--p4);}/* Bittersweet Orange light */.border-p5{border-color:var(--p5);}/* Royal purple */.border-g0{border-color:var(--g0);}/* #FBFBFB */.border-g1{border-color:var(--g1);}/* #E5E5E5 */.border-g2{border-color:var(--g2);}/* #CFCFCF */.border-g3{border-color:var(--g3);}/* #BABABA */.border-g4{border-color:var(--g4);}/* #A4A4A4 */.border-g5{border-color:var(--g5);}/* #8E8E8E */.border-g6{border-color:var(--g6);}/* #797979 */.border-g7{border-color:var(--g7);}/* #636363 */.border-g8{border-color:var(--g8);}/* #4D4D4D */.border-g9{border-color:var(--g9);}/* #383838 */.border-g10{border-color:var(--g10);}/* #222222 */.border-h0:hover{border-color:var(--h0);}/* Medium Aquamarine */ -.border-h1:hover{border-color:var(--h1);}/* Bright Navy Blue */ -.border-h2:hover{border-color:var(--h2);}/* Royal Purple Hover */ -.border-h3:hover{border-color:var(--h3);}/* Barbie Pink */ -.border-h4:hover{border-color:var(--h4);}/* Bittersweet Orange */ -.border-h5:hover{border-color:var(--h5);}/* Minion Yellow */ -.border-a0:active{border-color:var(--a0);}/* #A4A4A4 */ -.border-a0.active{border-color:var(--a0);}/* #A4A4A4 */ -.border-a1:active{border-color:var(--a1);}/* #8E8E8E */ -.border-a1.active{border-color:var(--a1);}/* #8E8E8E */ -.border-d0:disabled{border-color:var(--d0);}/* #797979 */ -.border-d1:disabled{border-color:var(--d1);}/* #636363 */ - - -/* RADIUS */ -.radius-none{border-radius:0;} -.radius-100{border-radius:100%;} -.radius-pill{border-radius:9999px;} -.radius-tr-none{border-top-right-radius:0;} -.radius-br-none{border-bottom-right-radius:0;} -.radius-tl-none{border-top-left-radius:0;} -.radius-bl-none{border-bottom-left-radius:0;} -.radius0{border-radius:4px;} -.radius1{border-radius:6px;} -.radius2{border-radius:15px;} -.radius3{border-radius:9999px;} - - -/* FILL */ -.fill-none{fill:none;} -.fill-current{fill:currentColor;} - - -/* STROKE */ -.stroke-none{stroke:none;} -.stroke-current{stroke:currentColor;} - - - -/* CONTAINER */ -.container{max-width:100%;} - - - -/* FAMILY */ -.font-sans{font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";} -.font-serif{font-family: Georgia, Cambria, "Times New Roman", Times, serif;} -.font-mono{font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;} - - -/* SIZES */ -.text5{font-size:4.209rem;}/* 75.757px */ -.text4{font-size:3.157rem;}/* 56.832px */ -.text3{font-size:2.369rem;}/* 42.635px */ -.text2{font-size:1.777rem;}/* 31.984px */ -.text1{font-size:1.333rem;}/* 23.994px */ -.text0{font-size:1rem;}/* 18px */ -.text-1{font-size:0.75rem;}/* 13.503px */ -.text-2{font-size:0.563rem;}/* 10.13px */ -.text-3{font-size:0.422rem;}/* 7.599px */ -.text-4{font-size:0.317rem;}/* 5.701px */ -.text-5{font-size:0.238rem;}/* 4.277px */ - - -/* Style */ -.italic{font-style:italic;} -.not-italic{font-style:normal;} - - -/* LINE HEIGHT */ -.leading5{line-height: 2;} -.leading4{line-height: 1.625;} -.leading3{line-height: 1.5;} -.leading2{line-height: 1.375;} -.leading1{line-height: 1.25;} -.leading0, -.leading-none{line-height:1;} - - -/* TRACKING */ -.tracking3{letter-spacing: 0.1em;} -.tracking2{letter-spacing: 0.05em;} -.tracking1{letter-spacing: 0.025em;} -.tracking0{letter-spacing: 0;} -.tracking-1{letter-spacing: -0.025em;} -.tracking-2{letter-spacing: -0.05em;} - - -/* WEIGHTS */ -.font-hairline{font-weight:100;} -.font-thin{font-weight:200;} -.font-light{font-weight:300;} -.font-normal{font-weight:400;} -.font-medium{font-weight:500;} -.font-semibold{font-weight:600;} -.font-bold{font-weight:700;} -.font-extrabold{font-weight:800;} -.font-black{font-weight:900;} - - -/* TEXT TRANSFORM */ -.uppercase{text-transform:uppercase;} -.lowercase{text-transform:lowercase;} -.capitalize{text-transform:capitalize;} -.normal-case{text-transform:none;} - - -/* ALIGN */ -.text-inherit{text-align:inherit;} -.text-center{text-align:center;} -.text-left{text-align:left;} -.text-right{text-align:right;} - - -/* DECORATION */ -.no-underline{text-decoration:none;} -.underline{text-decoration:underline;} -.line-through{text-decoration:line-through;} - - -/* LIST */ -.list-none{list-style:none;} -.list-disc{list-style:disc;} -.list-decimal{list-style:decimal;} - - -/* WHITESPACE */ -.whitespace-normal{white-space:normal;} -.truncate, -.whitespace-no-wrap{white-space:nowrap;} -.whitespace-pre{white-space:pre;} -.whitespace-pre-line{white-space:pre-line;} -.whitespace-pre-wrap{white-space:pre-wrap;} - - -/* WORDBREAK */ -.break-normal{word-break:normal;} -.break-normal, -.break-words{overflow-wrap:normal;} -.break-all{word-break:break-all;} -.truncate, -.ellipsis{text-overflow:ellipsis;} - - - -/* ----- LAYOUT ----- */ - - -/* POSITION */ -.sticky{position:sticky;} -.static{position:static;} -.absolute{position:absolute;} -.relative{position:relative;} -.fixed{position:fixed;} - - - /* POSITIONING */ -.top0{top:0;} -.left0{left:0;} -.right0{right:0;} -.bottom0{bottom:0;} - - -/* DISPLAY */ -.hidden{display:none;} -.block{display:block;} -.inline{display:inline;} -.inline-block{display:inline-block;} -.flex{display:flex;} -.inline-flex{display:inline-flex;} -.grid{display:grid;} -.inline-grid{display:inline-grid;} - - -/* WIDTH */ -.w-0{width:0;} -.w-full{width:100%;} -.w-screen{width:100vw;} -.min-w-0{min-width:0;} -.min-w-full{min-width:100%;} -.max-width-none{max-width:none;} -.max-w-full{max-width:100%;} - - -/* HEIGHT */ -.h-0{height:0;} -.h-full{height:100%;} -.h-screen{height:100vh;} -.min-h-0{min-height:0;} -.min-h-full{min-height:100%;} -.min-h-screen{min-height:100vh;} -.max-h-full{max-height:100%;} -.max-h-screen{max-height:100vh;} - - -/* FLEX */ -.flex-1{flex: 1 1 0%;} -.flex-auto{flex: 1 1 auto;} -.flex-initial{flex: 0 1 auto;} -.flex-none{flex:none;} -.flex-row{flex-direction:row;} -.flex-row-reverse{flex-direction:row-reverse;} -.flex-col{flex-direction:column;} -.flex-col-reverse{flex-direction:column-reverse;} -.items-stretch{align-items:stretch;} -.items-start{align-items:flex-start;} -.items-end{align-items:flex-end;} -.items-center{align-items:center;} -.content-start{align-content:start;} -.content-center{align-content:center;} -.content-end{align-content:end;} -.content-between{align-content:space-between;} -.content-around{align-content:space-around;} -.self-auto{align-self:auto;} -.self-start{align-self:flex-start;} -.self-end{align-self:flex-end;} -.self-center{align-self:center;} -.self-stretch{align-self:stretch;} -.justify-start{justify-content:flex-start;} -.justify-end{justify-content: flex-end;} -.justify-around{justify-content:space-around;} -.justify-between{justify-content:space-between;} -.justify-center{justify-content:center;} -.flex-grow{flex-grow:1;} -.flex-grow-0{flex-grow:0;} -.flex-shrink{flex-shrink:1;} -.flex-shrink-0{flex-shrink:0;} -.flex-wrap{flex-wrap:wrap;} -.flex-wrap-reverse{flex-wrap:wrap-reverse;} -.flex-no-wrap{flex-wrap:nowrap;} -.order-first{order:-9999;} -.order-last{order:9999;} -.order-none{order:0;} -.order-1{order:1;} -.order-2{order:2;} -.order-3{order:3;} -.order-4{order:4;} -.order-5{order:5;} -.order-6{order:6;} - - -/* GRID */ -.flow-row{grid-auto-flow:row;} -.flow-col{grid-auto-flow:column;} -.flow-row-dense{grid-auto-flow:row dense;} -.flow-column-dense{grid-auto-flow:column dense;} -.row-auto{grid-row:auto;} -.col-auto{grid-column:auto;} -.col-end-auto{grid-column-end: auto;} -.rows-end-auto{grid-row-end:auto;} -.rows-none{grid-template-rows:none;} -.col-1{grid-template-columns:repeat(1, minmax(0, 1fr));} -.col-span-1{grid-column: span 1 / span 1;} -.col-start-1{grid-column-start: 1;} -.row-start-1{grid-row-start: 1;} -.col-end-1{grid-column-end: 1;} -.row-end-1{grid-row-end: 1;} -.row-1{grid-template-rows: repeat(1, minmax(0, 1fr));} -.col-2{grid-template-columns:repeat(2, minmax(0, 1fr));} -.col-span-2{grid-column: span 2 / span 2;} -.col-start-2{grid-column-start: 2;} -.row-start-2{grid-row-start: 2;} -.col-end-2{grid-column-end: 2;} -.row-end-2{grid-row-end: 2;} -.row-2{grid-template-rows: repeat(2, minmax(0, 1fr));} -.col-3{grid-template-columns:repeat(3, minmax(0, 1fr));} -.col-span-3{grid-column: span 3 / span 3;} -.col-start-3{grid-column-start: 3;} -.row-start-3{grid-row-start: 3;} -.col-end-3{grid-column-end: 3;} -.row-end-3{grid-row-end: 3;} -.row-3{grid-template-rows: repeat(3, minmax(0, 1fr));} -.col-4{grid-template-columns:repeat(4, minmax(0, 1fr));} -.col-span-4{grid-column: span 4 / span 4;} -.col-start-4{grid-column-start: 4;} -.row-start-4{grid-row-start: 4;} -.col-end-4{grid-column-end: 4;} -.row-end-4{grid-row-end: 4;} -.row-4{grid-template-rows: repeat(4, minmax(0, 1fr));} -.col-5{grid-template-columns:repeat(5, minmax(0, 1fr));} -.col-span-5{grid-column: span 5 / span 5;} -.col-start-5{grid-column-start: 5;} -.row-start-5{grid-row-start: 5;} -.col-end-5{grid-column-end: 5;} -.row-end-5{grid-row-end: 5;} -.row-5{grid-template-rows: repeat(5, minmax(0, 1fr));} -.col-6{grid-template-columns:repeat(6, minmax(0, 1fr));} -.col-span-6{grid-column: span 6 / span 6;} -.col-start-6{grid-column-start: 6;} -.row-start-6{grid-row-start: 6;} -.col-end-6{grid-column-end: 6;} -.row-end-6{grid-row-end: 6;} -.row-6{grid-template-rows: repeat(6, minmax(0, 1fr));} -.row-auto-160{grid-auto-rows:minmax(8.889rem, auto);} -.gap4{gap:4.209rem;} -.gap3{gap:3.157rem;} -.gap2{gap:2.369rem;} -.gap1{gap:1.777rem;} -.gap0{gap:1.333rem;} -.gap-1{gap:1rem;} -.gap-2{gap:0.75rem;} -.gap-3{gap:0.563rem;} -.gap-4{gap:0.422rem;} -.gap-5{gap:0.317rem;} -.gap-6{gap:0.238rem;} - - -/* Z-INDEX */ -.z-auto{z-index:auto;} -.z1{z-index:1;} -.z0{z-index:0;} -.z-1{z-index:-1;} - - - -/* MARGIN */ -.m-none{margin:0;} -.mt-none{margin-top:0;} -.mr-none{margin-right:0;} -.mb-none{margin-bottom:0;} -.ml-none{margin-left:0;} -.m-auto{margin-right:auto;margin-left:auto;} -.mr-auto{margin-right:auto;} -.ml-auto{margin-left:auto;} -.m5{margin:4.209rem;} -.mt5{margin-top:4.209rem;} -.mr5{margin-right:4.209rem;} -.mb5{margin-bottom:4.209rem;} -.ml5{margin-left:4.209rem;} -.m4{margin:3.157rem;} -.mt4{margin-top:3.157rem;} -.mr4{margin-right:3.157rem;} -.mb4{margin-bottom:3.157rem;} -.ml4{margin-left:3.157rem;} -.m3{margin:2.369rem;} -.mt3{margin-top:2.369rem;} -.mr3{margin-right:2.369rem;} -.mb3{margin-bottom:2.369rem;} -.ml3{margin-left:2.369rem;} -.m2{margin:1.777rem;} -.mt2{margin-top:1.777rem;} -.mr2{margin-right:1.777rem;} -.mb2{margin-bottom:1.777rem;} -.ml2{margin-left:1.777rem;} -.m1{margin:1.333rem;} -.mt1{margin-top:1.333rem;} -.mr1{margin-right:1.333rem;} -.mb1{margin-bottom:1.333rem;} -.ml1{margin-left:1.333rem;} -.m0{margin:1rem;} -.mt0{margin-top:1rem;} -.mr0{margin-right:1rem;} -.mb0{margin-bottom:1rem;} -.ml0{margin-left:1rem;} -.m-1{margin:0.75rem;} -.mt-1{margin-top:0.75rem;} -.mr-1{margin-right:0.75rem;} -.mb-1{margin-bottom:0.75rem;} -.ml-1{margin-left:0.75rem;} -.m-2{margin:0.563rem;} -.mt-2{margin-top:0.563rem;} -.mr-2{margin-right:0.563rem;} -.mb-2{margin-bottom:0.563rem;} -.ml-2{margin-left:0.563rem;} -.m-3{margin:0.422rem;} -.mt-3{margin-top:0.422rem;} -.mr-3{margin-right:0.422rem;} -.mb-3{margin-bottom:0.422rem;} -.ml-3{margin-left:0.422rem;} -.m-4{margin:0.317rem;} -.mt-4{margin-top:0.317rem;} -.mr-4{margin-right:0.317rem;} -.mb-4{margin-bottom:0.317rem;} -.ml-4{margin-left:0.317rem;} -.m-5{margin:0.238rem;} -.mt-5{margin-top:0.238rem;} -.mr-5{margin-right:0.238rem;} -.mb-5{margin-bottom:0.238rem;} -.ml-5{margin-left:0.238rem;} - - -/* PADDING */ -.p-none{padding:0;} -.pt-none{padding-top:0;} -.pr-none{padding-right:0;} -.pb-none{padding-bottom:0;} -.pl-none{padding-left:0;} -.p5{padding:4.209rem;} -.pt5{padding-top:4.209rem;} -.pr5{padding-right:4.209rem;} -.pb5{padding-bottom:4.209rem;} -.pl5{padding-left:4.209rem;} -.p4{padding:3.157rem;} -.pt4{padding-top:3.157rem;} -.pr4{padding-right:3.157rem;} -.pb4{padding-bottom:3.157rem;} -.pl4{padding-left:3.157rem;} -.p3{padding:2.369rem;} -.pt3{padding-top:2.369rem;} -.pr3{padding-right:2.369rem;} -.pb3{padding-bottom:2.369rem;} -.pl3{padding-left:2.369rem;} -.p2{padding:1.777rem;} -.pt2{padding-top:1.777rem;} -.pr2{padding-right:1.777rem;} -.pb2{padding-bottom:1.777rem;} -.pl2{padding-left:1.777rem;} -.p1{padding:1.333rem;} -.pt1{padding-top:1.333rem;} -.pr1{padding-right:1.333rem;} -.pb1{padding-bottom:1.333rem;} -.pl1{padding-left:1.333rem;} -.p0{padding:1rem;} -.pt0{padding-top:1rem;} -.pr0{padding-right:1rem;} -.pb0{padding-bottom:1rem;} -.pl0{padding-left:1rem;} -.p-1{padding:0.75rem;} -.pt-1{padding-top:0.75rem;} -.pr-1{padding-right:0.75rem;} -.pb-1{padding-bottom:0.75rem;} -.pl-1{padding-left:0.75rem;} -.p-2{padding:0.563rem;} -.pt-2{padding-top:0.563rem;} -.pr-2{padding-right:0.563rem;} -.pb-2{padding-bottom:0.563rem;} -.pl-2{padding-left:0.563rem;} -.p-3{padding:0.422rem;} -.pt-3{padding-top:0.422rem;} -.pr-3{padding-right:0.422rem;} -.pb-3{padding-bottom:0.422rem;} -.pl-3{padding-left:0.422rem;} -.p-4{padding:0.317rem;} -.pt-4{padding-top:0.317rem;} -.pr-4{padding-right:0.317rem;} -.pb-4{padding-bottom:0.317rem;} -.pl-4{padding-left:0.317rem;} -.p-5{padding:0.238rem;} -.pt-5{padding-top:0.238rem;} -.pr-5{padding-right:0.238rem;} -.pb-5{padding-bottom:0.238rem;} -.pl-5{padding-left:0.238rem;} - - -/* OVERFLOW */ -.overflow-auto{overflow:auto;} -.truncate, -.overflow-hidden{overflow:hidden;} -.overflow-visible{overflow:visible;} -.overflow-scroll{overflow:scroll;} -.overflow-x-auto{overflow-x:auto;} -.overflow-y-auto{overflow-y:auto;} -.overflow-x-scroll{overflow-x:scroll;} -.overflow-x-hidden{overflow-x:hidden;} -.overflow-y-scroll{overflow-y:scroll;} -.overflow-y-hidden{overflow-y:hidden;} -.scrolling-touch{webkit-overflow-scrolling:touch;} -.scrolling-auto{webkit-overflow-scrolling:auto;} - - -/* VISIBILITY */ -.invisible{visibility:hidden;} -.visible{visibility:visible;} - - -/* OBJECT FIT */ -.object-contain{object-fit:contain;} -.object-cover{object-fit:cover;} -.object-fill{object-fit:fill;} -.object-none{object-fit:none;} -.object-scale-down{object-fit:scale-down;} - - -/* OBJECT POSITION */ -.object-b{object-position:bottom;} -.object-c{object-position:center;} -.object-t{object-position:top;} -.object-r{object-position:right;} -.object-rt{object-position:right top;} -.object-rb{object-position:right bottom;} -.object-l{object-position:left;} -.object-lt{object-position:left top;} -.object-lb{object-position:left bottom;} - - -/* OUTLINE */ -.outline-none{outline:0;} - - -/* OPACITY */ -.opacity-0{opacity:0;} -.opacity-25{opacity:0.25;} -.opacity-50{opacity:0.5;} -.opacity-75{opacity:0.75;} -.opacity-100{opacity:1.0;} - - -/* CURSOR */ -.cursor-auto{cursor:auto;} -.cursor-default{cursor:default;} -.cursor-pointer{cursor:pointer;} -.cursor-wait{cursor:wait;} -.cursor-text{cursor:text;} -.cursor-move{cursor:move;} -.cursor-not-allowed{cursor:not-allowed;} -.cursor-grab{cursor:grab;} -.cursor-grabbing{cursor:grabbing;} - - -/* USER SELECT */ -.select-none{user-select:none;} -.select-text{user-select:text;} -.select-all{user-select:all;} -.select-auto{user-select:auto;} - - -@media only screen and (min-width:48em) { - - -/* CONTAINER */ -.container-lg{max-width:48em;} - - - -/* FAMILY */ -.font-sans-lg{font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";} -.font-serif-lg{font-family: Georgia, Cambria, "Times New Roman", Times, serif;} -.font-mono-lg{font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;} - - -/* SIZES */ -.text5-lg{font-size:4.209rem;}/* 75.757px */ -.text4-lg{font-size:3.157rem;}/* 56.832px */ -.text3-lg{font-size:2.369rem;}/* 42.635px */ -.text2-lg{font-size:1.777rem;}/* 31.984px */ -.text1-lg{font-size:1.333rem;}/* 23.994px */ -.text0-lg{font-size:1rem;}/* 18px */ -.text-1-lg{font-size:0.75rem;}/* 13.503px */ -.text-2-lg{font-size:0.563rem;}/* 10.13px */ -.text-3-lg{font-size:0.422rem;}/* 7.599px */ -.text-4-lg{font-size:0.317rem;}/* 5.701px */ -.text-5-lg{font-size:0.238rem;}/* 4.277px */ - - -/* Style */ -.italic-lg{font-style:italic;} -.not-italic-lg{font-style:normal;} - - -/* LINE HEIGHT */ -.leading5-lg{line-height: 2;} -.leading4-lg{line-height: 1.625;} -.leading3-lg{line-height: 1.5;} -.leading2-lg{line-height: 1.375;} -.leading1-lg{line-height: 1.25;} -.leading0-lg, -.leading-none-lg{line-height:1;} - - -/* TRACKING */ -.tracking3-lg{letter-spacing: 0.1em;} -.tracking2-lg{letter-spacing: 0.05em;} -.tracking1-lg{letter-spacing: 0.025em;} -.tracking0-lg{letter-spacing: 0;} -.tracking-1-lg{letter-spacing: -0.025em;} -.tracking-2-lg{letter-spacing: -0.05em;} - - -/* WEIGHTS */ -.font-hairline-lg{font-weight:100;} -.font-thin-lg{font-weight:200;} -.font-light-lg{font-weight:300;} -.font-normal-lg{font-weight:400;} -.font-medium-lg{font-weight:500;} -.font-semibold-lg{font-weight:600;} -.font-bold-lg{font-weight:700;} -.font-extrabold-lg{font-weight:800;} -.font-black-lg{font-weight:900;} - - -/* TEXT TRANSFORM */ -.uppercase-lg{text-transform:uppercase;} -.lowercase-lg{text-transform:lowercase;} -.capitalize-lg{text-transform:capitalize;} -.normal-case-lg{text-transform:none;} - - -/* ALIGN */ -.text-inherit-lg{text-align:inherit;} -.text-center-lg{text-align:center;} -.text-left-lg{text-align:left;} -.text-right-lg{text-align:right;} - - -/* DECORATION */ -.no-underline-lg{text-decoration:none;} -.underline-lg{text-decoration:underline;} -.line-through-lg{text-decoration:line-through;} - - -/* LIST */ -.list-none-lg{list-style:none;} -.list-disc-lg{list-style:disc;} -.list-decimal-lg{list-style:decimal;} - - -/* WHITESPACE */ -.whitespace-normal-lg{white-space:normal;} -.truncate, -.whitespace-no-wrap-lg{white-space:nowrap;} -.whitespace-pre-lg{white-space:pre;} -.whitespace-pre-line-lg{white-space:pre-line;} -.whitespace-pre-wrap-lg{white-space:pre-wrap;} - - -/* WORDBREAK */ -.break-normal-lg{word-break:normal;} -.break-normal, -.break-words-lg{overflow-wrap:normal;} -.break-all-lg{word-break:break-all;} -.truncate, -.ellipsis-lg{text-overflow:ellipsis;} - - - -/* ----- LAYOUT ----- */ - - -/* POSITION */ -.sticky-lg{position:sticky;} -.static-lg{position:static;} -.absolute-lg{position:absolute;} -.relative-lg{position:relative;} -.fixed-lg{position:fixed;} - - - /* POSITIONING */ -.top0-lg{top:0;} -.left0-lg{left:0;} -.right0-lg{right:0;} -.bottom0-lg{bottom:0;} - - -/* DISPLAY */ -.hidden-lg{display:none;} -.block-lg{display:block;} -.inline-lg{display:inline;} -.inline-block-lg{display:inline-block;} -.flex-lg{display:flex;} -.inline-flex-lg{display:inline-flex;} -.grid-lg{display:grid;} -.inline-grid-lg{display:inline-grid;} - - -/* WIDTH */ -.w-0-lg{width:0;} -.w-full-lg{width:100%;} -.w-screen-lg{width:100vw;} -.min-w-0-lg{min-width:0;} -.min-w-full-lg{min-width:100%;} -.max-width-none-lg{max-width:none;} -.max-w-full-lg{max-width:100%;} - - -/* HEIGHT */ -.h-0-lg{height:0;} -.h-full-lg{height:100%;} -.h-screen-lg{height:100vh;} -.min-h-0-lg{min-height:0;} -.min-h-full-lg{min-height:100%;} -.min-h-screen-lg{min-height:100vh;} -.max-h-full-lg{max-height:100%;} -.max-h-screen-lg{max-height:100vh;} - - -/* FLEX */ -.flex-1-lg{flex: 1 1 0%;} -.flex-auto-lg{flex: 1 1 auto;} -.flex-initial-lg{flex: 0 1 auto;} -.flex-none-lg{flex:none;} -.flex-row-lg{flex-direction:row;} -.flex-row-reverse-lg{flex-direction:row-reverse;} -.flex-col-lg{flex-direction:column;} -.flex-col-reverse-lg{flex-direction:column-reverse;} -.items-stretch-lg{align-items:stretch;} -.items-start-lg{align-items:flex-start;} -.items-end-lg{align-items:flex-end;} -.items-center-lg{align-items:center;} -.content-start-lg{align-content:start;} -.content-center-lg{align-content:center;} -.content-end-lg{align-content:end;} -.content-between-lg{align-content:space-between;} -.content-around-lg{align-content:space-around;} -.self-auto-lg{align-self:auto;} -.self-start-lg{align-self:flex-start;} -.self-end-lg{align-self:flex-end;} -.self-center-lg{align-self:center;} -.self-stretch-lg{align-self:stretch;} -.justify-start-lg{justify-content:flex-start;} -.justify-end-lg{justify-content: flex-end;} -.justify-around-lg{justify-content:space-around;} -.justify-between-lg{justify-content:space-between;} -.justify-center-lg{justify-content:center;} -.flex-grow-lg{flex-grow:1;} -.flex-grow-0-lg{flex-grow:0;} -.flex-shrink-lg{flex-shrink:1;} -.flex-shrink-0-lg{flex-shrink:0;} -.flex-wrap-lg{flex-wrap:wrap;} -.flex-wrap-reverse-lg{flex-wrap:wrap-reverse;} -.flex-no-wrap-lg{flex-wrap:nowrap;} -.order-first-lg{order:-9999;} -.order-last-lg{order:9999;} -.order-none-lg{order:0;} -.order-1-lg{order:1;} -.order-2-lg{order:2;} -.order-3-lg{order:3;} -.order-4-lg{order:4;} -.order-5-lg{order:5;} -.order-6-lg{order:6;} - - -/* GRID */ -.flow-row-lg{grid-auto-flow:row;} -.flow-col-lg{grid-auto-flow:column;} -.flow-row-dense-lg{grid-auto-flow:row dense;} -.flow-column-dense-lg{grid-auto-flow:column dense;} -.row-auto-lg{grid-row:auto;} -.col-auto-lg{grid-column:auto;} -.col-end-auto-lg{grid-column-end: auto;} -.rows-end-auto-lg{grid-row-end:auto;} -.rows-none-lg{grid-template-rows:none;} -.col-1-lg{grid-template-columns:repeat(1, minmax(0, 1fr));} -.col-span-1-lg{grid-column: span 1 / span 1;} -.col-start-1-lg{grid-column-start: 1;} -.row-start-1-lg{grid-row-start: 1;} -.col-end-1-lg{grid-column-end: 1;} -.row-end-1-lg{grid-row-end: 1;} -.row-1-lg{grid-template-rows: repeat(1, minmax(0, 1fr));} -.col-2-lg{grid-template-columns:repeat(2, minmax(0, 1fr));} -.col-span-2-lg{grid-column: span 2 / span 2;} -.col-start-2-lg{grid-column-start: 2;} -.row-start-2-lg{grid-row-start: 2;} -.col-end-2-lg{grid-column-end: 2;} -.row-end-2-lg{grid-row-end: 2;} -.row-2-lg{grid-template-rows: repeat(2, minmax(0, 1fr));} -.col-3-lg{grid-template-columns:repeat(3, minmax(0, 1fr));} -.col-span-3-lg{grid-column: span 3 / span 3;} -.col-start-3-lg{grid-column-start: 3;} -.row-start-3-lg{grid-row-start: 3;} -.col-end-3-lg{grid-column-end: 3;} -.row-end-3-lg{grid-row-end: 3;} -.row-3-lg{grid-template-rows: repeat(3, minmax(0, 1fr));} -.col-4-lg{grid-template-columns:repeat(4, minmax(0, 1fr));} -.col-span-4-lg{grid-column: span 4 / span 4;} -.col-start-4-lg{grid-column-start: 4;} -.row-start-4-lg{grid-row-start: 4;} -.col-end-4-lg{grid-column-end: 4;} -.row-end-4-lg{grid-row-end: 4;} -.row-4-lg{grid-template-rows: repeat(4, minmax(0, 1fr));} -.col-5-lg{grid-template-columns:repeat(5, minmax(0, 1fr));} -.col-span-5-lg{grid-column: span 5 / span 5;} -.col-start-5-lg{grid-column-start: 5;} -.row-start-5-lg{grid-row-start: 5;} -.col-end-5-lg{grid-column-end: 5;} -.row-end-5-lg{grid-row-end: 5;} -.row-5-lg{grid-template-rows: repeat(5, minmax(0, 1fr));} -.col-6-lg{grid-template-columns:repeat(6, minmax(0, 1fr));} -.col-span-6-lg{grid-column: span 6 / span 6;} -.col-start-6-lg{grid-column-start: 6;} -.row-start-6-lg{grid-row-start: 6;} -.col-end-6-lg{grid-column-end: 6;} -.row-end-6-lg{grid-row-end: 6;} -.row-6-lg{grid-template-rows: repeat(6, minmax(0, 1fr));} -.row-auto-160-lg{grid-auto-rows:minmax(8.889rem, auto);} -.gap4-lg{gap:4.209rem;} -.gap3-lg{gap:3.157rem;} -.gap2-lg{gap:2.369rem;} -.gap1-lg{gap:1.777rem;} -.gap0-lg{gap:1.333rem;} -.gap-1-lg{gap:1rem;} -.gap-2-lg{gap:0.75rem;} -.gap-3-lg{gap:0.563rem;} -.gap-4-lg{gap:0.422rem;} -.gap-5-lg{gap:0.317rem;} -.gap-6-lg{gap:0.238rem;} - - -/* Z-INDEX */ -.z-auto-lg{z-index:auto;} -.z1-lg{z-index:1;} -.z0-lg{z-index:0;} -.z-1-lg{z-index:-1;} - - - -/* MARGIN */ -.m-none-lg{margin:0;} -.mt-none-lg{margin-top:0;} -.mr-none-lg{margin-right:0;} -.mb-none-lg{margin-bottom:0;} -.ml-none-lg{margin-left:0;} -.m-auto-lg{margin-right:auto;margin-left:auto;} -.mr-auto-lg{margin-right:auto;} -.ml-auto-lg{margin-left:auto;} -.m5-lg{margin:4.209rem;} -.mt5-lg{margin-top:4.209rem;} -.mr5-lg{margin-right:4.209rem;} -.mb5-lg{margin-bottom:4.209rem;} -.ml5-lg{margin-left:4.209rem;} -.m4-lg{margin:3.157rem;} -.mt4-lg{margin-top:3.157rem;} -.mr4-lg{margin-right:3.157rem;} -.mb4-lg{margin-bottom:3.157rem;} -.ml4-lg{margin-left:3.157rem;} -.m3-lg{margin:2.369rem;} -.mt3-lg{margin-top:2.369rem;} -.mr3-lg{margin-right:2.369rem;} -.mb3-lg{margin-bottom:2.369rem;} -.ml3-lg{margin-left:2.369rem;} -.m2-lg{margin:1.777rem;} -.mt2-lg{margin-top:1.777rem;} -.mr2-lg{margin-right:1.777rem;} -.mb2-lg{margin-bottom:1.777rem;} -.ml2-lg{margin-left:1.777rem;} -.m1-lg{margin:1.333rem;} -.mt1-lg{margin-top:1.333rem;} -.mr1-lg{margin-right:1.333rem;} -.mb1-lg{margin-bottom:1.333rem;} -.ml1-lg{margin-left:1.333rem;} -.m0-lg{margin:1rem;} -.mt0-lg{margin-top:1rem;} -.mr0-lg{margin-right:1rem;} -.mb0-lg{margin-bottom:1rem;} -.ml0-lg{margin-left:1rem;} -.m-1-lg{margin:0.75rem;} -.mt-1-lg{margin-top:0.75rem;} -.mr-1-lg{margin-right:0.75rem;} -.mb-1-lg{margin-bottom:0.75rem;} -.ml-1-lg{margin-left:0.75rem;} -.m-2-lg{margin:0.563rem;} -.mt-2-lg{margin-top:0.563rem;} -.mr-2-lg{margin-right:0.563rem;} -.mb-2-lg{margin-bottom:0.563rem;} -.ml-2-lg{margin-left:0.563rem;} -.m-3-lg{margin:0.422rem;} -.mt-3-lg{margin-top:0.422rem;} -.mr-3-lg{margin-right:0.422rem;} -.mb-3-lg{margin-bottom:0.422rem;} -.ml-3-lg{margin-left:0.422rem;} -.m-4-lg{margin:0.317rem;} -.mt-4-lg{margin-top:0.317rem;} -.mr-4-lg{margin-right:0.317rem;} -.mb-4-lg{margin-bottom:0.317rem;} -.ml-4-lg{margin-left:0.317rem;} -.m-5-lg{margin:0.238rem;} -.mt-5-lg{margin-top:0.238rem;} -.mr-5-lg{margin-right:0.238rem;} -.mb-5-lg{margin-bottom:0.238rem;} -.ml-5-lg{margin-left:0.238rem;} - - -/* PADDING */ -.p-none-lg{padding:0;} -.pt-none-lg{padding-top:0;} -.pr-none-lg{padding-right:0;} -.pb-none-lg{padding-bottom:0;} -.pl-none-lg{padding-left:0;} -.p5-lg{padding:4.209rem;} -.pt5-lg{padding-top:4.209rem;} -.pr5-lg{padding-right:4.209rem;} -.pb5-lg{padding-bottom:4.209rem;} -.pl5-lg{padding-left:4.209rem;} -.p4-lg{padding:3.157rem;} -.pt4-lg{padding-top:3.157rem;} -.pr4-lg{padding-right:3.157rem;} -.pb4-lg{padding-bottom:3.157rem;} -.pl4-lg{padding-left:3.157rem;} -.p3-lg{padding:2.369rem;} -.pt3-lg{padding-top:2.369rem;} -.pr3-lg{padding-right:2.369rem;} -.pb3-lg{padding-bottom:2.369rem;} -.pl3-lg{padding-left:2.369rem;} -.p2-lg{padding:1.777rem;} -.pt2-lg{padding-top:1.777rem;} -.pr2-lg{padding-right:1.777rem;} -.pb2-lg{padding-bottom:1.777rem;} -.pl2-lg{padding-left:1.777rem;} -.p1-lg{padding:1.333rem;} -.pt1-lg{padding-top:1.333rem;} -.pr1-lg{padding-right:1.333rem;} -.pb1-lg{padding-bottom:1.333rem;} -.pl1-lg{padding-left:1.333rem;} -.p0-lg{padding:1rem;} -.pt0-lg{padding-top:1rem;} -.pr0-lg{padding-right:1rem;} -.pb0-lg{padding-bottom:1rem;} -.pl0-lg{padding-left:1rem;} -.p-1-lg{padding:0.75rem;} -.pt-1-lg{padding-top:0.75rem;} -.pr-1-lg{padding-right:0.75rem;} -.pb-1-lg{padding-bottom:0.75rem;} -.pl-1-lg{padding-left:0.75rem;} -.p-2-lg{padding:0.563rem;} -.pt-2-lg{padding-top:0.563rem;} -.pr-2-lg{padding-right:0.563rem;} -.pb-2-lg{padding-bottom:0.563rem;} -.pl-2-lg{padding-left:0.563rem;} -.p-3-lg{padding:0.422rem;} -.pt-3-lg{padding-top:0.422rem;} -.pr-3-lg{padding-right:0.422rem;} -.pb-3-lg{padding-bottom:0.422rem;} -.pl-3-lg{padding-left:0.422rem;} -.p-4-lg{padding:0.317rem;} -.pt-4-lg{padding-top:0.317rem;} -.pr-4-lg{padding-right:0.317rem;} -.pb-4-lg{padding-bottom:0.317rem;} -.pl-4-lg{padding-left:0.317rem;} -.p-5-lg{padding:0.238rem;} -.pt-5-lg{padding-top:0.238rem;} -.pr-5-lg{padding-right:0.238rem;} -.pb-5-lg{padding-bottom:0.238rem;} -.pl-5-lg{padding-left:0.238rem;} - - -/* OVERFLOW */ -.overflow-auto-lg{overflow:auto;} -.truncate, -.overflow-hidden-lg{overflow:hidden;} -.overflow-visible-lg{overflow:visible;} -.overflow-scroll-lg{overflow:scroll;} -.overflow-x-auto-lg{overflow-x:auto;} -.overflow-y-auto-lg{overflow-y:auto;} -.overflow-x-scroll-lg{overflow-x:scroll;} -.overflow-x-hidden-lg{overflow-x:hidden;} -.overflow-y-scroll-lg{overflow-y:scroll;} -.overflow-y-hidden-lg{overflow-y:hidden;} -.scrolling-touch-lg{webkit-overflow-scrolling:touch;} -.scrolling-auto-lg{webkit-overflow-scrolling:auto;} - - -/* VISIBILITY */ -.invisible-lg{visibility:hidden;} -.visible-lg{visibility:visible;} - - -/* OBJECT FIT */ -.object-contain-lg{object-fit:contain;} -.object-cover-lg{object-fit:cover;} -.object-fill-lg{object-fit:fill;} -.object-none-lg{object-fit:none;} -.object-scale-down-lg{object-fit:scale-down;} - - -/* OBJECT POSITION */ -.object-b-lg{object-position:bottom;} -.object-c-lg{object-position:center;} -.object-t-lg{object-position:top;} -.object-r-lg{object-position:right;} -.object-rt-lg{object-position:right top;} -.object-rb-lg{object-position:right bottom;} -.object-l-lg{object-position:left;} -.object-lt-lg{object-position:left top;} -.object-lb-lg{object-position:left bottom;} - - -/* OUTLINE */ -.outline-none-lg{outline:0;} - - -/* OPACITY */ -.opacity-0-lg{opacity:0;} -.opacity-25-lg{opacity:0.25;} -.opacity-50-lg{opacity:0.5;} -.opacity-75-lg{opacity:0.75;} -.opacity-100-lg{opacity:1.0;} - - -/* CURSOR */ -.cursor-auto-lg{cursor:auto;} -.cursor-default-lg{cursor:default;} -.cursor-pointer-lg{cursor:pointer;} -.cursor-wait-lg{cursor:wait;} -.cursor-text-lg{cursor:text;} -.cursor-move-lg{cursor:move;} -.cursor-not-allowed-lg{cursor:not-allowed;} -.cursor-grab-lg{cursor:grab;} -.cursor-grabbing-lg{cursor:grabbing;} - - -/* USER SELECT */ -.select-none-lg{user-select:none;} -.select-text-lg{user-select:text;} -.select-all-lg{user-select:all;} -.select-auto-lg{user-select:auto;} - -} -` diff --git a/src/views/modules/document/symbols.js b/src/views/modules/document/symbols.js index a8e41a67..81868d8f 100644 --- a/src/views/modules/document/symbols.js +++ b/src/views/modules/document/symbols.js @@ -3,7 +3,6 @@ export default ` - ` diff --git a/src/views/modules/document/top-nav.js b/src/views/modules/document/top-nav.js index ac607b8e..d4ce145a 100644 --- a/src/views/modules/document/top-nav.js +++ b/src/views/modules/document/top-nav.js @@ -4,10 +4,11 @@ import Search from '../components/search.js' import GithubLink from '../components/github-link.js' import DiscordLink from '../components/discord-link.js' import ThemeButton from '../components/theme-button.js' +import Banner from '../components/banner.js' export default function TopNav () { return ` -
    -
    - - Community chat has moved to - - Discord - - -
    -` + +${Banner()} + ` } diff --git a/src/views/modules/layouts/one-column.js b/src/views/modules/layouts/one-column.js deleted file mode 100644 index b3071979..00000000 --- a/src/views/modules/layouts/one-column.js +++ /dev/null @@ -1,4 +0,0 @@ -export default function OneColumn (/* props = {} */) { - return ` - ` -} diff --git a/src/views/modules/layouts/two-column.js b/src/views/modules/layouts/two-column.js deleted file mode 100644 index deb90dd7..00000000 --- a/src/views/modules/layouts/two-column.js +++ /dev/null @@ -1,43 +0,0 @@ -import Sidebar from '../components/sidebar.js' - -export default function TwoColumn (props = {}) { - let { children } = props - - return ` -
    -
    -
    - ${Sidebar(props)} -
    - ${children} -
    - ` -} diff --git a/src/views/modules/pages/main.js b/src/views/modules/pages/main.js deleted file mode 100644 index 9f2ba5c9..00000000 --- a/src/views/modules/pages/main.js +++ /dev/null @@ -1,5 +0,0 @@ -export default function Main (/* props = {} */) { - return ` -
    Welcome!
    - ` -} From 8ca06543b9220021446fc14472feb2a438ce6af0 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 5 Oct 2021 17:55:06 -0600 Subject: [PATCH 173/680] move Banner to main html.js and explicitly disable --- src/views/modules/components/banner.js | 2 -- src/views/modules/document/html.js | 2 ++ src/views/modules/document/top-nav.js | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/views/modules/components/banner.js b/src/views/modules/components/banner.js index 4733f9c6..40949eb4 100644 --- a/src/views/modules/components/banner.js +++ b/src/views/modules/components/banner.js @@ -1,5 +1,3 @@ -// enabling the banner will require general CSS layout changes - export default function Banner (state = {}) { const { enabled } = state diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index 2538d959..7aea35a2 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -1,4 +1,5 @@ import Head from './head.js' +import Banner from '../components/banner.js' import Symbols from './symbols.js' import Script from './script.js' import TopNav from './top-nav.js' @@ -42,6 +43,7 @@ ${Symbols} " > ${TopNav()} + ${Banner({ enabled: false })} ${Sidebar(props)}
    - -${Banner()} ` } From b2f8c51c521d571a50fd90296263beb172822581 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 4 Oct 2021 15:11:04 -0600 Subject: [PATCH 174/680] rename top levels under Reference category --- readme.md | 4 +- .../function-config}/architecture.md | 0 .../function-config}/aws.md | 0 .../function-config}/concurrency.md | 0 .../function-config}/layers.md | 0 .../function-config}/memory.md | 0 .../function-config}/policies.md | 0 .../function-config}/runtime.md | 0 .../function-config}/timeout.md | 0 .../local-preferences}/.env.md | 0 .../local-preferences}/create.md | 0 .../local-preferences}/env.md | 0 .../local-preferences}/sandbox-startup.md | 0 .../local-preferences}/sandbox.md | 0 .../{app.arc => project-manifest}/app.md | 0 .../{app.arc => project-manifest}/aws.md | 0 .../{app.arc => project-manifest}/events.md | 0 .../{app.arc => project-manifest}/http.md | 0 .../{app.arc => project-manifest}/indexes.md | 0 .../{app.arc => project-manifest}/macros.md | 0 .../{app.arc => project-manifest}/proxy.md | 0 .../{app.arc => project-manifest}/queues.md | 0 .../scheduled.md | 0 .../{app.arc => project-manifest}/shared.md | 0 .../{app.arc => project-manifest}/static.md | 0 .../{app.arc => project-manifest}/tables.md | 0 .../{app.arc => project-manifest}/views.md | 0 .../{app.arc => project-manifest}/ws.md | 0 .../{runtime => runtime-helpers}/deno.md | 0 .../{runtime => runtime-helpers}/node.js.md | 0 .../{runtime => runtime-helpers}/python.md | 0 .../{runtime => runtime-helpers}/ruby.md | 0 src/views/docs/table-of-contents.js | 68 ++++++++++--------- 33 files changed, 39 insertions(+), 33 deletions(-) rename src/views/docs/en/reference/{config.arc => configuration/function-config}/architecture.md (100%) rename src/views/docs/en/reference/{config.arc => configuration/function-config}/aws.md (100%) rename src/views/docs/en/reference/{config.arc => configuration/function-config}/concurrency.md (100%) rename src/views/docs/en/reference/{config.arc => configuration/function-config}/layers.md (100%) rename src/views/docs/en/reference/{config.arc => configuration/function-config}/memory.md (100%) rename src/views/docs/en/reference/{config.arc => configuration/function-config}/policies.md (100%) rename src/views/docs/en/reference/{config.arc => configuration/function-config}/runtime.md (100%) rename src/views/docs/en/reference/{config.arc => configuration/function-config}/timeout.md (100%) rename src/views/docs/en/reference/{prefs.arc => configuration/local-preferences}/.env.md (100%) rename src/views/docs/en/reference/{prefs.arc => configuration/local-preferences}/create.md (100%) rename src/views/docs/en/reference/{prefs.arc => configuration/local-preferences}/env.md (100%) rename src/views/docs/en/reference/{prefs.arc => configuration/local-preferences}/sandbox-startup.md (100%) rename src/views/docs/en/reference/{prefs.arc => configuration/local-preferences}/sandbox.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/app.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/aws.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/events.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/http.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/indexes.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/macros.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/proxy.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/queues.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/scheduled.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/shared.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/static.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/tables.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/views.md (100%) rename src/views/docs/en/reference/{app.arc => project-manifest}/ws.md (100%) rename src/views/docs/en/reference/{runtime => runtime-helpers}/deno.md (100%) rename src/views/docs/en/reference/{runtime => runtime-helpers}/node.js.md (100%) rename src/views/docs/en/reference/{runtime => runtime-helpers}/python.md (100%) rename src/views/docs/en/reference/{runtime => runtime-helpers}/ruby.md (100%) diff --git a/readme.md b/readme.md index d32e61ec..27637f5a 100644 --- a/readme.md +++ b/readme.md @@ -12,8 +12,6 @@ This docs site is its own Architect project 🎉 so it can be run locally with `arc sandbox` -Use `npm run seed-dependencies` to move Shiki/dist (+ select languages) and the Arc syntax highlighting grammar to the docs catchall function. This drastically reduces that function's size on disk. - ## Table of Contents & Sidebar The Sidebar is dynamically built from `table-of-contents.js` and the current state. @@ -45,6 +43,8 @@ Providing explicit languages to the highlighter (see `highlighter.js`) increases To slim down Shiki's footprint, we bundle the dependency directly to the docs catchall function with only the grammars for languages we intend to highlight. This can be done automatically with the `seed-dependencies` script. +Use `npm run seed-dependencies` to move Shiki/dist (+ select languages) and the Arc syntax highlighting grammar to the docs catchall function. This drastically reduces that function's size on disk. + ## Todo * dynamic category landing page diff --git a/src/views/docs/en/reference/config.arc/architecture.md b/src/views/docs/en/reference/configuration/function-config/architecture.md similarity index 100% rename from src/views/docs/en/reference/config.arc/architecture.md rename to src/views/docs/en/reference/configuration/function-config/architecture.md diff --git a/src/views/docs/en/reference/config.arc/aws.md b/src/views/docs/en/reference/configuration/function-config/aws.md similarity index 100% rename from src/views/docs/en/reference/config.arc/aws.md rename to src/views/docs/en/reference/configuration/function-config/aws.md diff --git a/src/views/docs/en/reference/config.arc/concurrency.md b/src/views/docs/en/reference/configuration/function-config/concurrency.md similarity index 100% rename from src/views/docs/en/reference/config.arc/concurrency.md rename to src/views/docs/en/reference/configuration/function-config/concurrency.md diff --git a/src/views/docs/en/reference/config.arc/layers.md b/src/views/docs/en/reference/configuration/function-config/layers.md similarity index 100% rename from src/views/docs/en/reference/config.arc/layers.md rename to src/views/docs/en/reference/configuration/function-config/layers.md diff --git a/src/views/docs/en/reference/config.arc/memory.md b/src/views/docs/en/reference/configuration/function-config/memory.md similarity index 100% rename from src/views/docs/en/reference/config.arc/memory.md rename to src/views/docs/en/reference/configuration/function-config/memory.md diff --git a/src/views/docs/en/reference/config.arc/policies.md b/src/views/docs/en/reference/configuration/function-config/policies.md similarity index 100% rename from src/views/docs/en/reference/config.arc/policies.md rename to src/views/docs/en/reference/configuration/function-config/policies.md diff --git a/src/views/docs/en/reference/config.arc/runtime.md b/src/views/docs/en/reference/configuration/function-config/runtime.md similarity index 100% rename from src/views/docs/en/reference/config.arc/runtime.md rename to src/views/docs/en/reference/configuration/function-config/runtime.md diff --git a/src/views/docs/en/reference/config.arc/timeout.md b/src/views/docs/en/reference/configuration/function-config/timeout.md similarity index 100% rename from src/views/docs/en/reference/config.arc/timeout.md rename to src/views/docs/en/reference/configuration/function-config/timeout.md diff --git a/src/views/docs/en/reference/prefs.arc/.env.md b/src/views/docs/en/reference/configuration/local-preferences/.env.md similarity index 100% rename from src/views/docs/en/reference/prefs.arc/.env.md rename to src/views/docs/en/reference/configuration/local-preferences/.env.md diff --git a/src/views/docs/en/reference/prefs.arc/create.md b/src/views/docs/en/reference/configuration/local-preferences/create.md similarity index 100% rename from src/views/docs/en/reference/prefs.arc/create.md rename to src/views/docs/en/reference/configuration/local-preferences/create.md diff --git a/src/views/docs/en/reference/prefs.arc/env.md b/src/views/docs/en/reference/configuration/local-preferences/env.md similarity index 100% rename from src/views/docs/en/reference/prefs.arc/env.md rename to src/views/docs/en/reference/configuration/local-preferences/env.md diff --git a/src/views/docs/en/reference/prefs.arc/sandbox-startup.md b/src/views/docs/en/reference/configuration/local-preferences/sandbox-startup.md similarity index 100% rename from src/views/docs/en/reference/prefs.arc/sandbox-startup.md rename to src/views/docs/en/reference/configuration/local-preferences/sandbox-startup.md diff --git a/src/views/docs/en/reference/prefs.arc/sandbox.md b/src/views/docs/en/reference/configuration/local-preferences/sandbox.md similarity index 100% rename from src/views/docs/en/reference/prefs.arc/sandbox.md rename to src/views/docs/en/reference/configuration/local-preferences/sandbox.md diff --git a/src/views/docs/en/reference/app.arc/app.md b/src/views/docs/en/reference/project-manifest/app.md similarity index 100% rename from src/views/docs/en/reference/app.arc/app.md rename to src/views/docs/en/reference/project-manifest/app.md diff --git a/src/views/docs/en/reference/app.arc/aws.md b/src/views/docs/en/reference/project-manifest/aws.md similarity index 100% rename from src/views/docs/en/reference/app.arc/aws.md rename to src/views/docs/en/reference/project-manifest/aws.md diff --git a/src/views/docs/en/reference/app.arc/events.md b/src/views/docs/en/reference/project-manifest/events.md similarity index 100% rename from src/views/docs/en/reference/app.arc/events.md rename to src/views/docs/en/reference/project-manifest/events.md diff --git a/src/views/docs/en/reference/app.arc/http.md b/src/views/docs/en/reference/project-manifest/http.md similarity index 100% rename from src/views/docs/en/reference/app.arc/http.md rename to src/views/docs/en/reference/project-manifest/http.md diff --git a/src/views/docs/en/reference/app.arc/indexes.md b/src/views/docs/en/reference/project-manifest/indexes.md similarity index 100% rename from src/views/docs/en/reference/app.arc/indexes.md rename to src/views/docs/en/reference/project-manifest/indexes.md diff --git a/src/views/docs/en/reference/app.arc/macros.md b/src/views/docs/en/reference/project-manifest/macros.md similarity index 100% rename from src/views/docs/en/reference/app.arc/macros.md rename to src/views/docs/en/reference/project-manifest/macros.md diff --git a/src/views/docs/en/reference/app.arc/proxy.md b/src/views/docs/en/reference/project-manifest/proxy.md similarity index 100% rename from src/views/docs/en/reference/app.arc/proxy.md rename to src/views/docs/en/reference/project-manifest/proxy.md diff --git a/src/views/docs/en/reference/app.arc/queues.md b/src/views/docs/en/reference/project-manifest/queues.md similarity index 100% rename from src/views/docs/en/reference/app.arc/queues.md rename to src/views/docs/en/reference/project-manifest/queues.md diff --git a/src/views/docs/en/reference/app.arc/scheduled.md b/src/views/docs/en/reference/project-manifest/scheduled.md similarity index 100% rename from src/views/docs/en/reference/app.arc/scheduled.md rename to src/views/docs/en/reference/project-manifest/scheduled.md diff --git a/src/views/docs/en/reference/app.arc/shared.md b/src/views/docs/en/reference/project-manifest/shared.md similarity index 100% rename from src/views/docs/en/reference/app.arc/shared.md rename to src/views/docs/en/reference/project-manifest/shared.md diff --git a/src/views/docs/en/reference/app.arc/static.md b/src/views/docs/en/reference/project-manifest/static.md similarity index 100% rename from src/views/docs/en/reference/app.arc/static.md rename to src/views/docs/en/reference/project-manifest/static.md diff --git a/src/views/docs/en/reference/app.arc/tables.md b/src/views/docs/en/reference/project-manifest/tables.md similarity index 100% rename from src/views/docs/en/reference/app.arc/tables.md rename to src/views/docs/en/reference/project-manifest/tables.md diff --git a/src/views/docs/en/reference/app.arc/views.md b/src/views/docs/en/reference/project-manifest/views.md similarity index 100% rename from src/views/docs/en/reference/app.arc/views.md rename to src/views/docs/en/reference/project-manifest/views.md diff --git a/src/views/docs/en/reference/app.arc/ws.md b/src/views/docs/en/reference/project-manifest/ws.md similarity index 100% rename from src/views/docs/en/reference/app.arc/ws.md rename to src/views/docs/en/reference/project-manifest/ws.md diff --git a/src/views/docs/en/reference/runtime/deno.md b/src/views/docs/en/reference/runtime-helpers/deno.md similarity index 100% rename from src/views/docs/en/reference/runtime/deno.md rename to src/views/docs/en/reference/runtime-helpers/deno.md diff --git a/src/views/docs/en/reference/runtime/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md similarity index 100% rename from src/views/docs/en/reference/runtime/node.js.md rename to src/views/docs/en/reference/runtime-helpers/node.js.md diff --git a/src/views/docs/en/reference/runtime/python.md b/src/views/docs/en/reference/runtime-helpers/python.md similarity index 100% rename from src/views/docs/en/reference/runtime/python.md rename to src/views/docs/en/reference/runtime-helpers/python.md diff --git a/src/views/docs/en/reference/runtime/ruby.md b/src/views/docs/en/reference/runtime-helpers/ruby.md similarity index 100% rename from src/views/docs/en/reference/runtime/ruby.md rename to src/views/docs/en/reference/runtime-helpers/ruby.md diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 707b1dd6..958946ed 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -55,21 +55,7 @@ let Guides = [ ] let Reference = [ { - 'Runtime': [ - 'Node.js', - 'Deno', - 'Ruby', - 'Python' - ], - 'CLI': [ - 'deploy', - 'destroy', - 'env', - 'init', - 'logs', - 'sandbox', - ], - 'app.arc': [ + 'Project manifest': [ '@app', '@aws', '@events', @@ -85,23 +71,43 @@ let Reference = [ { '@views', '@ws' ], - 'config.arc': [ - '@aws', - 'runtime', - 'memory', - 'timeout', - 'concurrency', - 'layers', - 'policies', - 'architecture', + 'Configuration': [ + { + 'Function config': [ + '@aws', + 'runtime', + 'memory', + 'timeout', + 'concurrency', + 'layers', + 'policies', + 'architecture', + ] + }, + { + 'Local Preferences': [ + '@create', + '@env', + '.env', + '@sandbox', + '@sandbox-startup' + ] + } + ], + 'CLI': [ + 'deploy', + 'destroy', + 'env', + 'init', + 'logs', + 'sandbox', + ], + 'Runtime helpers': [ + 'Node.js', + 'Deno', + 'Ruby', + 'Python' ], - 'prefs.arc': [ - '@create', - '@env', - '.env', - '@sandbox', - '@sandbox-startup' - ] } ] let About = [ From fafd33664a1dcbbc1e6e25ed1e1d49b21df69df2 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 6 Oct 2021 13:30:55 -0600 Subject: [PATCH 175/680] move redirect middleware to shared and use in main doc renderer --- src/http/any-catchall/index.js | 10 +- src/http/any-catchall/redirect.js | 92 ------------- src/http/get-docs-000lang-catchall/index.js | 23 ++-- src/shared/redirect.js | 142 ++++++++++++++++++++ src/views/docs/table-of-contents.js | 25 +--- 5 files changed, 164 insertions(+), 128 deletions(-) delete mode 100644 src/http/any-catchall/redirect.js create mode 100644 src/shared/redirect.js diff --git a/src/http/any-catchall/index.js b/src/http/any-catchall/index.js index b82f2257..d452b9b3 100644 --- a/src/http/any-catchall/index.js +++ b/src/http/any-catchall/index.js @@ -1,11 +1,9 @@ -let { http } = require('@architect/functions') -let asap = require('@architect/asap') - -// middleware to preserve old urls -let redirect = require('./redirect') +const { http } = require('@architect/functions') +const asap = require('@architect/asap') +const redirect = require('@architect/shared/redirect') // middleware to preserve old urls // middleware proxy s3 assets -let staticProxy = asap({ +const staticProxy = asap({ spa: false, alias: { '/playground': '/playground.html' diff --git a/src/http/any-catchall/redirect.js b/src/http/any-catchall/redirect.js deleted file mode 100644 index 42dee5af..00000000 --- a/src/http/any-catchall/redirect.js +++ /dev/null @@ -1,92 +0,0 @@ -// redirect v6 arc urls to v8 -let redirects = { - // tmp until marketing landing page work done - '/': '/docs/en/guides/get-started/quickstart', - - '/examples': '/docs/en/guides/examples', - - // Intro - '/intro/philosophy': '/docs/en/guides/get-started/why-architect', - '/intro/limits': '/docs/en/guides/get-started/detailed-aws-setup', - '/intro/community': '/docs/en/about/contribute', - - // Quickstart - '/quickstart': '/docs/en/guides/get-started/quickstart', - '/quickstart/install': '/docs/en/guides/get-started/quickstart', - '/quickstart/layout': '/docs/en/guides/get-started/project-layout', - - // Primitives - '/primitives/http': '/docs/en/reference/app.arc/http', - '/primitives/ws': '/docs/en/reference/app.arc/ws', - '/primitives/static': '/docs/en/reference/app.arc/static', - '/primitives/cdn': '/docs/en/reference/app.arc/static', - '/primitives/scheduled': '/docs/en/reference/app.arc/scheduled', - '/primitives/events': '/docs/en/reference/app.arc/events', - '/primitives/queues': '/docs/en/reference/app.arc/queues', - '/primitives/tables': '/docs/en/reference/app.arc/tables', - '/primitives/macros': '/docs/en/reference/app.arc/macros', - - // Guides - '/guides/upgrade': '/docs/en/about/upgrade', - '/guides/testing': '/docs/en/guides/developer-experience/local-development', - '/guides/project-manifest': '/docs/en/guides/get-started/project-layout', - '/guides/share-code': '/docs/en/guides/developer-experience/sharing-code', - '/guides/custom-file-paths': '/docs/en/guides/developer-experience/custom-source-paths', - - // CLI - '/reference/cli/deploy': '/docs/en/reference/cli/deploy', - '/reference/cli/destroy': '/docs/en/reference/cli/destroy', - '/reference/cli/env': '/docs/en/reference/cli/env', - '/reference/cli/hydrate': '/docs/en/reference/cli/sandbox', - '/reference/cli/init': '/docs/en/reference/cli/init', - '/reference/cli/logs': '/docs/en/reference/cli/logs', - '/reference/cli/package': '/docs/en/reference/cli/deploy', - '/reference/cli/sandbox': '/docs/en/reference/cli/sandbox', - - '/reference/arc/app': '/docs/en/reference/app.arc/app', - '/reference/arc/aws': '/docs/en/reference/app.arc/aws', - '/reference/arc/events': '/docs/en/reference/app.arc/events', - '/reference/arc/http': '/docs/en/reference/app.arc/http', - '/reference/arc/indexes': '/docs/en/reference/app.arc/indexes', - '/reference/arc/proxy': '/docs/en/reference/app.arc/proxy', - '/reference/arc/queues': '/docs/en/reference/app.arc/queues', - '/reference/arc/scheduled': '/docs/en/reference/app.arc/scheduled', - '/reference/arc/static': '/docs/en/reference/app.arc/static', - '/reference/arc/tables': '/docs/en/reference/app.arc/tables', - '/reference/arc/ws': '/docs/en/reference/app.arc/ws', - - '/reference/arc-config/aws': '/docs/en/reference/config.arc/aws', - '/reference/arc-config/runtime': '/docs/en/reference/config.arc/runtime', - '/reference/arc-config/memory': '/docs/en/reference/config.arc/memory', - '/reference/arc-config/timeout': '/docs/en/reference/config.arc/timeout', - '/reference/arc-config/concurrency': '/docs/en/reference/config.arc/concurrency', - '/reference/arc-config/layers': '/docs/en/reference/config.arc/layers', - '/reference/arc-config/policies': '/docs/en/reference/config.arc/policies', - - '/reference/preferences#create': '/docs/en/reference/prefs.arc/create', - '/reference/preferences#env': '/docs/en/reference/prefs.arc/env', - '/reference/preferences#.env': '/docs/en/reference/prefs.arc/.env', - '/reference/preferences#sandbox': '/docs/en/reference/prefs.arc/sandbox', - - '/reference/functions/events': '/docs/en/reference/runtime/node', - '/reference/functions/http': '/docs/en/reference/runtime/node', - '/reference/functions/http/node/async': '/docs/en/reference/runtime/node', - '/reference/functions/queues': '/docs/en/reference/runtime/node', - '/reference/functions/static': '/docs/en/reference/runtime/node', - '/reference/functions/tables': '/docs/en/reference/runtime/node', - '/reference/functions/ws': '/docs/en/reference/runtime/node', -} - -// eslint-disable-next-line -module.exports = async function redirect (req) { - let isGet = req.requestContext.http.method.toLowerCase() === 'get' - let isPath = Object.keys(redirects).includes(req.requestContext.http.path) - if (isGet && isPath) { - return { - statusCode: 301, - headers: { - location: redirects[req.requestContext.http.path] - } - } - } -} diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 5c7899ad..5e276e16 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -1,22 +1,24 @@ -require = require('esm')(module) // eslint-disable-line +// eslint-disable-next-line +require = require('esm')(module) + const path = require('path') -const util = require('util') -const fs = require('fs') +const { readFile } = require('fs/promises') +const { http } = require('@architect/functions') +const redirect = require('@architect/shared/redirect') const Markdown = require('markdown-it') const markdownClass = require('@toycode/markdown-it-class') const markdownAnchor = require('markdown-it-anchor') const frontmatterParser = require('markdown-it-front-matter') +const yaml = require('js-yaml') const classMapping = require('./markdown-class-mappings') const highlighter = require('./highlighter') -const readFile = util.promisify(fs.readFile) +const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default const algolia = require('@architect/views/modules/components/algolia.js').default -const toc = require('@architect/views/docs/table-of-contents') -const yaml = require('js-yaml') -const EDIT_DOCS = `edit/main/src/views/docs/` + const cache = {} // cheap warm cache -exports.handler = async function http (req) { +async function handler (req) { let { pathParameters } = req let { lang, proxy } = pathParameters let parts = proxy.split('/') @@ -32,9 +34,8 @@ exports.handler = async function http (req) { ...parts, docName ) - let editURL = 'https://github.com/architect/arc.codes/' + let editURL = 'https://github.com/architect/arc.codes/edit/main/src/views/docs/' editURL += path.join( - EDIT_DOCS, lang, ...parts, doc @@ -110,3 +111,5 @@ exports.handler = async function http (req) { }) } } + +exports.handler = http.async(redirect, handler) diff --git a/src/shared/redirect.js b/src/shared/redirect.js new file mode 100644 index 00000000..41e4126a --- /dev/null +++ b/src/shared/redirect.js @@ -0,0 +1,142 @@ +// redirect known v6 arc urls to v8 and then to v9 +const redirects = { + // tmp until marketing landing page work done + '/': '/docs/en/guides/get-started/quickstart', + + '/examples': '/docs/en/guides/examples', + + // Intro + // round 1: Q1 2021 + '/intro/philosophy': '/docs/en/guides/get-started/why-architect', + '/intro/limits': '/docs/en/guides/get-started/detailed-aws-setup', + '/intro/community': '/docs/en/about/contribute', + + // Quickstart + // round 1: Q1 2021 + '/quickstart': '/docs/en/guides/get-started/quickstart', + '/quickstart/install': '/docs/en/guides/get-started/quickstart', + '/quickstart/layout': '/docs/en/guides/get-started/project-layout', + + // Primitives + // round 1: Q1 2021 + '/primitives/http': '/docs/en/reference/app.arc/http', + '/primitives/ws': '/docs/en/reference/app.arc/ws', + '/primitives/static': '/docs/en/reference/app.arc/static', + '/primitives/cdn': '/docs/en/reference/app.arc/static', + '/primitives/scheduled': '/docs/en/reference/app.arc/scheduled', + '/primitives/events': '/docs/en/reference/app.arc/events', + '/primitives/queues': '/docs/en/reference/app.arc/queues', + '/primitives/tables': '/docs/en/reference/app.arc/tables', + '/primitives/macros': '/docs/en/reference/app.arc/macros', + + // Guides + // round 1: Q1 2021 + '/guides/upgrade': '/docs/en/about/upgrade', + '/guides/testing': '/docs/en/guides/developer-experience/local-development', + '/guides/project-manifest': '/docs/en/guides/get-started/project-layout', + '/guides/share-code': '/docs/en/guides/developer-experience/sharing-code', + '/guides/custom-file-paths': '/docs/en/guides/developer-experience/custom-source-paths', + + // Reference > Project Manifest + // round 1: Q1 2021 + '/reference/arc/app': '/docs/en/reference/project-manifest/app', + '/reference/arc/aws': '/docs/en/reference/project-manifest/aws', + '/reference/arc/events': '/docs/en/reference/project-manifest/events', + '/reference/arc/http': '/docs/en/reference/project-manifest/http', + '/reference/arc/indexes': '/docs/en/reference/project-manifest/indexes', + '/reference/arc/proxy': '/docs/en/reference/project-manifest/proxy', + '/reference/arc/queues': '/docs/en/reference/project-manifest/queues', + '/reference/arc/scheduled': '/docs/en/reference/project-manifest/scheduled', + '/reference/arc/static': '/docs/en/reference/project-manifest/static', + '/reference/arc/tables': '/docs/en/reference/project-manifest/tables', + '/reference/arc/ws': '/docs/en/reference/project-manifest/ws', + // round 2: Q4 2021 + '/docs/en/reference/app.arc/app': '/docs/en/reference/project-manifest/app', + '/docs/en/reference/app.arc/aws': '/docs/en/reference/project-manifest/aws', + '/docs/en/reference/app.arc/events': '/docs/en/reference/project-manifest/events', + '/docs/en/reference/app.arc/http': '/docs/en/reference/project-manifest/http', + '/docs/en/reference/app.arc/indexes': '/docs/en/reference/project-manifest/indexes', + '/docs/en/reference/app.arc/proxy': '/docs/en/reference/project-manifest/proxy', + '/docs/en/reference/app.arc/queues': '/docs/en/reference/project-manifest/queues', + '/docs/en/reference/app.arc/scheduled': '/docs/en/reference/project-manifest/scheduled', + '/docs/en/reference/app.arc/shared': '/docs/en/reference/project-manifest/shared', + '/docs/en/reference/app.arc/static': '/docs/en/reference/project-manifest/static', + '/docs/en/reference/app.arc/tables': '/docs/en/reference/project-manifest/tables', + '/docs/en/reference/app.arc/views': '/docs/en/reference/project-manifest/views', + '/docs/en/reference/app.arc/ws': '/docs/en/reference/project-manifest/ws', + + // Reference > Configuration > Function config + // round 1: Q1 2021 + '/reference/arc-config/aws': '/docs/en/reference/configuration/function-config/aws', + '/reference/arc-config/runtime': '/docs/en/reference/configuration/function-config/runtime', + '/reference/arc-config/memory': '/docs/en/reference/configuration/function-config/memory', + '/reference/arc-config/timeout': '/docs/en/reference/configuration/function-config/timeout', + '/reference/arc-config/concurrency': '/docs/en/reference/configuration/function-config/concurrency', + '/reference/arc-config/layers': '/docs/en/reference/configuration/function-config/layers', + '/reference/arc-config/policies': '/docs/en/reference/configuration/function-config/policies', + // round 2: Q4 2021 + '/docs/en/reference/config.arc/aws': '/docs/en/reference/configuration/function-config/aws', + '/docs/en/reference/config.arc/runtime': '/docs/en/reference/configuration/function-config/runtime', + '/docs/en/reference/config.arc/memory': '/docs/en/reference/configuration/function-config/memory', + '/docs/en/reference/config.arc/timeout': '/docs/en/reference/configuration/function-config/timeout', + '/docs/en/reference/config.arc/concurrency': '/docs/en/reference/configuration/function-config/concurrency', + '/docs/en/reference/config.arc/layers': '/docs/en/reference/configuration/function-config/layers', + '/docs/en/reference/config.arc/policies': '/docs/en/reference/configuration/function-config/policies', + '/docs/en/reference/config.arc/architecture': '/docs/en/reference/configuration/function-config/architecture', + + // Reference > Configuration > Local preferences + // round 1: Q1 2021 + '/reference/preferences#create': '/docs/en/reference/configuration/local-preferences/create', + '/reference/preferences#env': '/docs/en/reference/configuration/local-preferences/env', + '/reference/preferences#.env': '/docs/en/reference/configuration/local-preferences/.env', + '/reference/preferences#sandbox': '/docs/en/reference/configuration/local-preferences/sandbox', + // round 2: Q4 2021 + '/docs/en/reference/prefs.arc/create': '/docs/en/reference/configuration/local-preferences/create', + '/docs/en/reference/prefs.arc/env': '/docs/en/reference/configuration/local-preferences/env', + '/docs/en/reference/prefs.arc/.env': '/docs/en/reference/configuration/local-preferences/.env', + '/docs/en/reference/prefs.arc/sandbox': '/docs/en/reference/configuration/local-preferences/sandbox', + '/docs/en/reference/prefs.arc/sandbox-startup': '/docs/en/reference/configuration/local-preferences/sandbox-startup', + + // Reference > CLI + // round 1: Q1 2021 + '/reference/cli/deploy': '/docs/en/reference/cli/deploy', + '/reference/cli/package': '/docs/en/reference/cli/deploy', + '/reference/cli/destroy': '/docs/en/reference/cli/destroy', + '/reference/cli/env': '/docs/en/reference/cli/env', + '/reference/cli/init': '/docs/en/reference/cli/init', + '/reference/cli/logs': '/docs/en/reference/cli/logs', + '/reference/cli/sandbox': '/docs/en/reference/cli/sandbox', + '/reference/cli/hydrate': '/docs/en/reference/cli/sandbox', + // round 2: Q4 2021 - no change + + // Reference > Runtime helpers + // round 1: Q1 2021 + '/reference/functions/events': '/docs/en/reference/runtime-helpers/node.js', + '/reference/functions/http': '/docs/en/reference/runtime-helpers/node.js', + '/reference/functions/http/node/async': '/docs/en/reference/runtime-helpers/node.js', + '/reference/functions/queues': '/docs/en/reference/runtime-helpers/node.js', + '/reference/functions/static': '/docs/en/reference/runtime-helpers/node.js', + '/reference/functions/tables': '/docs/en/reference/runtime-helpers/node.js', + '/reference/functions/ws': '/docs/en/reference/runtime-helpers/node.js', + // round 2: Q4 2021 + '/docs/en/reference/runtime/node': '/docs/en/reference/runtime-helpers/node.js', + '/docs/en/reference/runtime/node.js': '/docs/en/reference/runtime-helpers/node.js', + '/docs/en/reference/runtime/deno': '/docs/en/reference/runtime-helpers/deno', + '/docs/en/reference/runtime/ruby': '/docs/en/reference/runtime-helpers/ruby', + '/docs/en/reference/runtime/python': '/docs/en/reference/runtime-helpers/python', +} + +// eslint-disable-next-line +module.exports = async function redirect (req) { + const isGet = req.requestContext.http.method.toLowerCase() === 'get' + const isPath = Object.keys(redirects).includes(req.requestContext.http.path) + + if (isGet && isPath) { + return { + statusCode: 301, + headers: { + location: redirects[req.requestContext.http.path] + } + } + } +} diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 958946ed..1a687aaf 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -7,20 +7,16 @@ let Guides = [ 'Detailed AWS setup', ], 'Developer experience': [ - 'Local development', // preview, debug and test + 'Local development', 'Dependency management', - 'Sharing code', // src/shared and src/views + 'Sharing code', 'Custom source paths', 'Deployment', - 'Logging & monitoring', // cloudwatch + 'Logging & monitoring', 'Using TypeScript', ], 'Frontend': [ - 'Static assets', // fingerprint, ignore, folder, link to cdn - // TODO 'HTTP functions', //inc cors - // TODO 'Sessions', - // TODO 'Middleware', - // TODO 'WebSockets functions', + 'Static assets', ], 'Domains': [ 'Overview', @@ -35,20 +31,9 @@ let Guides = [ ] } ], - /* TODO - 'Backend': [ - 'Database tables & indexes', - 'Database stream functions', - 'Event functions', - 'Queue functions', - 'Scheduled functions', - ],*/ 'Extend': [ - // TODO 'Migrate legacy code', // @proxy, arc.http.express 'Custom CloudFormation', 'Plugins', - // TODO 'Add a custom domain', - // TODO 'Ejecting', ] }, 'Examples' @@ -85,7 +70,7 @@ let Reference = [ { ] }, { - 'Local Preferences': [ + 'Local preferences': [ '@create', '@env', '.env', From 216f1827744f1323bc5dfb421e48296c4ed24564 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 6 Oct 2021 16:30:39 -0600 Subject: [PATCH 176/680] /docs/lang/ 404 --- src/http/get-docs-000lang-catchall/index.js | 21 ++++++++++++++++----- src/views/modules/components/edit-link.js | 8 ++++++++ src/views/modules/components/not-found.js | 13 +++++++++++++ src/views/modules/document/html.js | 16 +++++++--------- 4 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 src/views/modules/components/edit-link.js create mode 100644 src/views/modules/components/not-found.js diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 5e276e16..dfcacbe1 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -14,6 +14,7 @@ const classMapping = require('./markdown-class-mappings') const highlighter = require('./highlighter') const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default +const NotFound = require('@architect/views/modules/components/not-found.js').default const algolia = require('@architect/views/modules/components/algolia.js').default const cache = {} // cheap warm cache @@ -59,13 +60,23 @@ async function handler (req) { cache[filePath] = await readFile(filePath, 'utf8') file = cache[filePath] } - catch (err) { - // TODO: Load category "index" landing or load next in section - console.error(err) + catch (error) { + // TODO: Load category "index" landing if available + console.error(error) return { statusCode: 404, - // TODO: send a friendly error page with message - body: err.message + headers: { + 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', + 'content-type': 'text/html; charset=utf8' + }, + body: Html({ + active, + children: NotFound({ term: docName, error }), + lang, + state: { notFoundTerm: docName }, + thirdparty: algolia, + toc + }) } } diff --git a/src/views/modules/components/edit-link.js b/src/views/modules/components/edit-link.js new file mode 100644 index 00000000..370869c8 --- /dev/null +++ b/src/views/modules/components/edit-link.js @@ -0,0 +1,8 @@ +export default function EditLink (state = {}) { + const { editURL } = state + return editURL ? ` + +` : '' +} diff --git a/src/views/modules/components/not-found.js b/src/views/modules/components/not-found.js new file mode 100644 index 00000000..c7e1dc2e --- /dev/null +++ b/src/views/modules/components/not-found.js @@ -0,0 +1,13 @@ +export default function FourOFour (state = {}) { + const { term } = state + return ` +
    +

    + 404: ${term ? `"${term}"` : 'that one'} is missing +

    +

    + Try using the search. +

    +
    +` +} diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index 7aea35a2..202bf80d 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -1,10 +1,11 @@ -import Head from './head.js' import Banner from '../components/banner.js' -import Symbols from './symbols.js' +import EditLink from '../components/edit-link.js' +import Head from './head.js' import Script from './script.js' -import TopNav from './top-nav.js' -import State from './state.js' import Sidebar from '../components/sidebar.js' +import State from './state.js' +import Symbols from './symbols.js' +import TopNav from './top-nav.js' export default function HTML (props = {}) { let { @@ -20,8 +21,7 @@ export default function HTML (props = {}) { Array.isArray(props.scripts) ? scripts.map(src => Script({ src })).join('') : Script(scripts) - let stateTag = state && - State(state) || '' + let stateTag = state && State(state) || '' return ` @@ -70,9 +70,7 @@ ${Symbols}
    ${children} - + ${EditLink({ editURL })}
    From d0d01cf6a1bafb710561aefb6329123b2c8a60d7 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 6 Oct 2021 17:15:40 -0600 Subject: [PATCH 177/680] 404 for root catchall leverage asap passthru --- src/http/any-catchall/index.js | 33 +++++++++++++++++---- src/http/get-docs-000lang-catchall/index.js | 11 +++---- src/shared/not-found-response.js | 8 +++++ src/shared/{redirect.js => redirect-map.js} | 1 - 4 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 src/shared/not-found-response.js rename src/shared/{redirect.js => redirect-map.js} (99%) diff --git a/src/http/any-catchall/index.js b/src/http/any-catchall/index.js index d452b9b3..8a3c450f 100644 --- a/src/http/any-catchall/index.js +++ b/src/http/any-catchall/index.js @@ -1,13 +1,34 @@ +// eslint-disable-next-line +require = require('esm')(module) + const { http } = require('@architect/functions') const asap = require('@architect/asap') -const redirect = require('@architect/shared/redirect') // middleware to preserve old urls +const redirectMiddleware = require('@architect/shared/redirect-map') +const notFoundResponse = require('@architect/shared/not-found-response') +const toc = require('@architect/views/docs/table-of-contents') +const Html = require('@architect/views/modules/document/html.js').default +const NotFound = require('@architect/views/modules/components/not-found.js').default +const algolia = require('@architect/views/modules/components/algolia.js').default // middleware proxy s3 assets const staticProxy = asap({ - spa: false, - alias: { - '/playground': '/playground.html' - } + alias: { '/playground': '/playground.html' }, + passthru: true, + spa: false }) -exports.handler = http.async(redirect, staticProxy) +async function notFound (req) { + const term = req.path + + return { + ...notFoundResponse, + body: Html({ + active: term, + children: NotFound({ term }), + thirdparty: algolia, + toc + }) + } +} + +exports.handler = http.async(redirectMiddleware, staticProxy, notFound) diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index dfcacbe1..968ad32d 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -4,7 +4,8 @@ require = require('esm')(module) const path = require('path') const { readFile } = require('fs/promises') const { http } = require('@architect/functions') -const redirect = require('@architect/shared/redirect') +const redirectMiddleware = require('@architect/shared/redirect-map') +const notFoundResponse = require('@architect/shared/not-found-response') const Markdown = require('markdown-it') const markdownClass = require('@toycode/markdown-it-class') const markdownAnchor = require('markdown-it-anchor') @@ -64,11 +65,7 @@ async function handler (req) { // TODO: Load category "index" landing if available console.error(error) return { - statusCode: 404, - headers: { - 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', - 'content-type': 'text/html; charset=utf8' - }, + ...notFoundResponse, body: Html({ active, children: NotFound({ term: docName, error }), @@ -123,4 +120,4 @@ async function handler (req) { } } -exports.handler = http.async(redirect, handler) +exports.handler = http.async(redirectMiddleware, handler) diff --git a/src/shared/not-found-response.js b/src/shared/not-found-response.js new file mode 100644 index 00000000..7851ae9c --- /dev/null +++ b/src/shared/not-found-response.js @@ -0,0 +1,8 @@ +module.exports = { + statusCode: 404, + headers: { + 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', + 'content-type': 'text/html; charset=utf8' + }, + body: '

    404: Not found

    ' +} diff --git a/src/shared/redirect.js b/src/shared/redirect-map.js similarity index 99% rename from src/shared/redirect.js rename to src/shared/redirect-map.js index 41e4126a..e77241d0 100644 --- a/src/shared/redirect.js +++ b/src/shared/redirect-map.js @@ -126,7 +126,6 @@ const redirects = { '/docs/en/reference/runtime/python': '/docs/en/reference/runtime-helpers/python', } -// eslint-disable-next-line module.exports = async function redirect (req) { const isGet = req.requestContext.http.method.toLowerCase() === 'get' const isPath = Object.keys(redirects).includes(req.requestContext.http.path) From 18fd9d9078219610733eee94160e1fc56efca40d Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 7 Oct 2021 09:36:02 -0600 Subject: [PATCH 178/680] 404s should load index.js --- public/index.js | 22 ++++++++------------- public/static.json | 2 +- src/http/any-catchall/index.js | 1 + src/http/get-docs-000lang-catchall/index.js | 1 + 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/public/index.js b/public/index.js index 2d87b6c9..f4133330 100644 --- a/public/index.js +++ b/public/index.js @@ -1,22 +1,18 @@ (function (){ + let activeLink = document.querySelector('a.active') + let main = document.getElementById('main') + let menuButton = document.getElementById('menu-button') + let sidebar = document.getElementById('sidebar') + let themeButton = document.getElementById('theme-button') + // Scroll active sidebar link into view - document - .querySelector('a.active') - .scrollIntoView({ + if (activeLink) + activeLink.scrollIntoView({ behavior: 'smooth', block: 'center' }) // Toggle sidebar on mobile - let menuButton = document - .getElementById('menu-button') - let themeButton = document - .getElementById('theme-button') - let sidebar = document - .getElementById('sidebar') - let main = document - .getElementById('main') - main.onclick = function hideSidebar () { sidebar.classList.remove('open') } @@ -62,6 +58,4 @@ let currentHeight = (el[scrollHeight] || body[scrollHeight]) - body.clientHeight return Math.floor((currentTop / currentHeight) * 100) } - - }()) diff --git a/public/static.json b/public/static.json index 1cffe089..dc41e630 100644 --- a/public/static.json +++ b/public/static.json @@ -1,6 +1,6 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-18004274bb.js", + "index.js": "index-cba7721432.js", "playground.html": "playground-d3d4c75ee9.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", diff --git a/src/http/any-catchall/index.js b/src/http/any-catchall/index.js index 8a3c450f..0509f402 100644 --- a/src/http/any-catchall/index.js +++ b/src/http/any-catchall/index.js @@ -25,6 +25,7 @@ async function notFound (req) { body: Html({ active: term, children: NotFound({ term }), + scripts: [ '/index.js' ], thirdparty: algolia, toc }) diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 968ad32d..555c229b 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -70,6 +70,7 @@ async function handler (req) { active, children: NotFound({ term: docName, error }), lang, + scripts: [ '/index.js' ], state: { notFoundTerm: docName }, thirdparty: algolia, toc From 28e4f7dfc040660188225fdb276294c66c3f0d2a Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 7 Oct 2021 10:57:14 -0600 Subject: [PATCH 179/680] consolidate to single pages --- src/shared/redirect-map.js | 30 +-- .../configuration/function-config.md | 194 ++++++++++++++++++ .../function-config/architecture.md | 16 -- .../configuration/function-config/aws.md | 54 ----- .../function-config/concurrency.md | 25 --- .../configuration/function-config/layers.md | 29 --- .../configuration/function-config/memory.md | 14 -- .../configuration/function-config/policies.md | 45 ---- .../configuration/function-config/runtime.md | 25 --- .../configuration/function-config/timeout.md | 16 -- .../configuration/local-preferences.md | 124 +++++++++++ .../configuration/local-preferences/.env.md | 16 -- .../configuration/local-preferences/create.md | 31 --- .../configuration/local-preferences/env.md | 28 --- .../local-preferences/sandbox-startup.md | 15 -- .../local-preferences/sandbox.md | 38 ---- src/views/docs/table-of-contents.js | 23 +-- 17 files changed, 335 insertions(+), 388 deletions(-) create mode 100644 src/views/docs/en/reference/configuration/function-config.md delete mode 100644 src/views/docs/en/reference/configuration/function-config/architecture.md delete mode 100644 src/views/docs/en/reference/configuration/function-config/aws.md delete mode 100644 src/views/docs/en/reference/configuration/function-config/concurrency.md delete mode 100644 src/views/docs/en/reference/configuration/function-config/layers.md delete mode 100644 src/views/docs/en/reference/configuration/function-config/memory.md delete mode 100644 src/views/docs/en/reference/configuration/function-config/policies.md delete mode 100644 src/views/docs/en/reference/configuration/function-config/runtime.md delete mode 100644 src/views/docs/en/reference/configuration/function-config/timeout.md create mode 100644 src/views/docs/en/reference/configuration/local-preferences.md delete mode 100644 src/views/docs/en/reference/configuration/local-preferences/.env.md delete mode 100644 src/views/docs/en/reference/configuration/local-preferences/create.md delete mode 100644 src/views/docs/en/reference/configuration/local-preferences/env.md delete mode 100644 src/views/docs/en/reference/configuration/local-preferences/sandbox-startup.md delete mode 100644 src/views/docs/en/reference/configuration/local-preferences/sandbox.md diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index e77241d0..6546f24d 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -67,22 +67,22 @@ const redirects = { // Reference > Configuration > Function config // round 1: Q1 2021 - '/reference/arc-config/aws': '/docs/en/reference/configuration/function-config/aws', - '/reference/arc-config/runtime': '/docs/en/reference/configuration/function-config/runtime', - '/reference/arc-config/memory': '/docs/en/reference/configuration/function-config/memory', - '/reference/arc-config/timeout': '/docs/en/reference/configuration/function-config/timeout', - '/reference/arc-config/concurrency': '/docs/en/reference/configuration/function-config/concurrency', - '/reference/arc-config/layers': '/docs/en/reference/configuration/function-config/layers', - '/reference/arc-config/policies': '/docs/en/reference/configuration/function-config/policies', + '/reference/arc-config/aws': '/docs/en/reference/configuration/function-config', + '/reference/arc-config/runtime': '/docs/en/reference/configuration/function-config#runtime', + '/reference/arc-config/memory': '/docs/en/reference/configuration/function-config#memory', + '/reference/arc-config/timeout': '/docs/en/reference/configuration/function-config#timeout', + '/reference/arc-config/concurrency': '/docs/en/reference/configuration/function-config#concurrency', + '/reference/arc-config/layers': '/docs/en/reference/configuration/function-config#layers', + '/reference/arc-config/policies': '/docs/en/reference/configuration/function-config#policies', // round 2: Q4 2021 - '/docs/en/reference/config.arc/aws': '/docs/en/reference/configuration/function-config/aws', - '/docs/en/reference/config.arc/runtime': '/docs/en/reference/configuration/function-config/runtime', - '/docs/en/reference/config.arc/memory': '/docs/en/reference/configuration/function-config/memory', - '/docs/en/reference/config.arc/timeout': '/docs/en/reference/configuration/function-config/timeout', - '/docs/en/reference/config.arc/concurrency': '/docs/en/reference/configuration/function-config/concurrency', - '/docs/en/reference/config.arc/layers': '/docs/en/reference/configuration/function-config/layers', - '/docs/en/reference/config.arc/policies': '/docs/en/reference/configuration/function-config/policies', - '/docs/en/reference/config.arc/architecture': '/docs/en/reference/configuration/function-config/architecture', + '/docs/en/reference/config.arc/aws': '/docs/en/reference/configuration/function-config', + '/docs/en/reference/config.arc/runtime': '/docs/en/reference/configuration/function-config#runtime', + '/docs/en/reference/config.arc/memory': '/docs/en/reference/configuration/function-config#memory', + '/docs/en/reference/config.arc/timeout': '/docs/en/reference/configuration/function-config#timeout', + '/docs/en/reference/config.arc/concurrency': '/docs/en/reference/configuration/function-config#concurrency', + '/docs/en/reference/config.arc/layers': '/docs/en/reference/configuration/function-config#layers', + '/docs/en/reference/config.arc/policies': '/docs/en/reference/configuration/function-config#policies', + '/docs/en/reference/config.arc/architecture': '/docs/en/reference/configuration/function-config#architecture', // Reference > Configuration > Local preferences // round 1: Q1 2021 diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md new file mode 100644 index 00000000..9e33aa8f --- /dev/null +++ b/src/views/docs/en/reference/configuration/function-config.md @@ -0,0 +1,194 @@ +--- +title: Function config +category: Configuration +description: Lambda function configuration +sections: + - 'runtime' + - 'memory' + - 'timeout' + - 'concurrency' + - 'layers' + - 'policies' + - 'architecture' +--- + +Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`). + +- [`runtime`](#runtime) - Officially supported: one of `nodejs14.x` (default), `deno`, `python3.7`, `python3.6`, or `ruby.5`, etc. + Also configurable, but not officially supported by Architect: `java8`, `go1.x`, `dotnetcore2.1` +- [`memory`](#memory) - number, between `128`MB and `3008`MB in 64 MB increments. + Memory size also directly correlates with CPU speed; higher memory levels are available in more capable Lambda clusters +- [`timeout`](#timeout) - number, in seconds (max `900`) +- [`concurrency`](#concurrency) - number, `0` to AWS account maximum (if not present, concurrency is unthrottled) +- [`layers`](#layers) - Up to 5 Lambda layer ARNs; **must be in the same region as deployed** +- [`policies`](#policies) - configure [AWS SAM policy templates](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html) +- [`architecture`](#architecture) [AWS Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) + - `x86_64` (default) 64-bit x86 architecture, for x86-based processors + - `arm64` 64-bit ARM architecture, for the AWS Graviton2 processor. This only works if your region supports it. **Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. + +> Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB. + +## Example + +```arc +@aws +runtime python3.7 +memory 256 +timeout 3 +concurrency 1 +layers {ARN} +policies {ARN} +architecture arm64 +``` + +Read more about the [Lambda limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) and [resource model](https://docs.aws.amazon.com/lambda/latest/dg/resource-model.html). + + +# `runtime` + +Configure Lambda function `runtime`: + +- `nodejs14.x` (default) +- `deno` +- `python3.8` +- `ruby2.5` + +Also configurable but not supported by Architect Sandbox: + +- `java8` +- `go1.x` +- `dotnetcore2.1` + +## Example + +```arc +@aws +runtime deno +``` + +# `memory` + +Configure Lambda function `memory` between `128` MB to `10240` MB, in `1` MB increments. + +## Example + +```arc +@aws +memory 1024 +``` + +# `timeout` + +Configure Lambda function `timeout` in seconds to a max of `900`. (`15` minutes.) + +The default timeout (if no value supplied) is `5`. (`5` seconds.) + +## Example + +```arc +@aws +timeout 30 +``` + +# `concurrency` + +Configure Lambda function concurrency. If not present concurrency is unthrottled. + +## Examples + +### Limit execution to one invocation at a time + +```arc +@aws +concurrency 1 +``` + +> Tip: `@events` functions with `concurrency 1` create a queue-like primitive + +### Disable invocation by setting concurrency to zero + +```arc +@aws +concurrency 0 +``` + +# `layers` + +Configure Lambda function `layers` with max 5 Lambda Layer ARNs. + +> Warning: Lambda Layers must be in the same region as they are deployed + +## Examples + +Add one layer: + +```arc +@aws +layers arn:aws:lambda:us-east-1:764866452798:layer:ghostscript:1 +``` + +Or multiple layers: + +```arc +@aws +layers + arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda:4 + arn:aws:lambda:us-east-1:145266761615:layer:pandoc:1 +``` + +> Tip: find [awesome layers](https://github.com/mthenw/awesome-layers) + +# `policies` + +Configure custom Lambda function `policies`, enabling granular and specific privileges and access controls. + +The `policies` setting takes one or more IAM policy ARNs or AWS-managed policy names (e.g. `AmazonDynamoDBFullAccess`). + +Configuring one or more policies will completely remove all of Architect's default Lambda privileges. To restore Architect's default privileges, include a policy named `architect-default-policies`. + +> Note: `architect-default-policies` is an internal Architect framework setting based on the least-privilege permissions specific to your project. It is not a managed / public IAM policy, and will not be found in your AWS console. + + +## Examples + +Lambda only has a single set of permissions (as defined by the AWS-managed `S3CrudPolicy` policy): + +```arc +@aws +policies + S3CrudPolicy +``` + +Lambda has both an AWS-managed policy (`S3CrudPolicy`) and all default Architect permissions: +```arc +@aws +policies + S3CrudPolicy + architect-default-policies +``` + +Terser single-line version of the above example: +```arc +@aws +policies S3CrudPolicy architect-default-policies +``` + +--- + +## Additional resources + +- [AWS IAM policy ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns) +- [Community-maintained list of AWS-managed policies](https://github.com/z0ph/MAMIP/tree/master/policies) + +# `architecture` + +Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. `arm64` only works if your region supports it. + +**Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. + +## Example + +```arc +@aws +architecture arm64 +``` diff --git a/src/views/docs/en/reference/configuration/function-config/architecture.md b/src/views/docs/en/reference/configuration/function-config/architecture.md deleted file mode 100644 index 1348fcb4..00000000 --- a/src/views/docs/en/reference/configuration/function-config/architecture.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: '@aws architecture' -category: config.arc -description: Lambda architecture configuration ---- - -Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. `arm64` only works if your region supports it. - -**Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. - -## Example - -```arc -@aws -architecture arm64 -``` diff --git a/src/views/docs/en/reference/configuration/function-config/aws.md b/src/views/docs/en/reference/configuration/function-config/aws.md deleted file mode 100644 index 06f15fdc..00000000 --- a/src/views/docs/en/reference/configuration/function-config/aws.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: '@aws' -category: config.arc -description: Lambda function configuration ---- - -Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`). - -- `runtime` - Officially supported: one of `nodejs14.x` (default), `deno`, `python3.7`, `python3.6`, or `ruby.5`, etc. - - Also configurable, but not officially supported by Architect: `java8`, `go1.x`, `dotnetcore2.1` -- `memory` - number, between `128`MB and `3008`MB in 64 MB increments - - Memory size also directly correlates with CPU speed; higher memory levels are available in more capable Lambda clusters -- `timeout` - number, in seconds (max `900`) -- `concurrency` - number, `0` to AWS account maximum (if not present, concurrency is unthrottled) -- `layers` - Up to 5 Lambda layer ARNs; **must be in the same region as deployed** -- `policies` - configure [AWS SAM policy templates](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html) -- `architecture` [AWS Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) - - `x86_64` (default) 64-bit x86 architecture, for x86-based processors - - `arm64` 64-bit ARM architecture, for the AWS Graviton2 processor. This only works if your region supports it. **Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. - -> Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB. - -## Example - -```arc -@aws -runtime python3.7 -memory 256 -timeout 3 -concurrency 1 -layers {ARN} -policies {ARN} -architecture arm64 -``` - -To use multiple layers or policies: - -```arc -@aws -runtime python3.7 -memory 256 -timeout 3 -concurrency 1 -layers - {ARN1} - {ARN2} - {ARN3} -policies - {ARN4} - {ARN5} - {ARN6} -``` - -Read more about the [Lambda limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) and [resource model](https://docs.aws.amazon.com/lambda/latest/dg/resource-model.html). diff --git a/src/views/docs/en/reference/configuration/function-config/concurrency.md b/src/views/docs/en/reference/configuration/function-config/concurrency.md deleted file mode 100644 index 3db4ad7c..00000000 --- a/src/views/docs/en/reference/configuration/function-config/concurrency.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: '@aws concurrency' -category: config.arc -description: Lambda function configuration ---- - -Configure Lambda function concurrency. If not present concurrency is unthrottled. - -## Examples - -### Limit execution to one invocation at a time - -```arc -@aws -concurrency 1 -``` - -> Tip: `@events` functions with `concurrency 1` create a queue-like primitive - -### Disable invocation by setting concurrency to zero - -```arc -@aws -concurrency 0 -``` diff --git a/src/views/docs/en/reference/configuration/function-config/layers.md b/src/views/docs/en/reference/configuration/function-config/layers.md deleted file mode 100644 index 0585c930..00000000 --- a/src/views/docs/en/reference/configuration/function-config/layers.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: '@aws layers' -category: config.arc -description: Lambda function configuration ---- - -Configure Lambda function `layers` with max 5 Lambda Layer ARNs. - -> Warning: Lambda Layers must be in the same region as they are deployed - -## Examples - -Add one layer: - -```arc -@aws -layers arn:aws:lambda:us-east-1:764866452798:layer:ghostscript:1 -``` - -Or multiple layers: - -```arc -@aws -layers - arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda:4 - arn:aws:lambda:us-east-1:145266761615:layer:pandoc:1 -``` - -> Tip: find [awesome layers](https://github.com/mthenw/awesome-layers) diff --git a/src/views/docs/en/reference/configuration/function-config/memory.md b/src/views/docs/en/reference/configuration/function-config/memory.md deleted file mode 100644 index a924aec5..00000000 --- a/src/views/docs/en/reference/configuration/function-config/memory.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: '@aws memory' -category: config.arc -description: Lambda function configuration ---- - -Configure Lambda function `memory` between `128` MB to `10240` MB, in `1` MB increments. - -## Example - -```arc -@aws -memory 1024 -``` diff --git a/src/views/docs/en/reference/configuration/function-config/policies.md b/src/views/docs/en/reference/configuration/function-config/policies.md deleted file mode 100644 index 9cfcac81..00000000 --- a/src/views/docs/en/reference/configuration/function-config/policies.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: '@aws policies' -category: config.arc -description: Lambda function `policies` ---- - -Configure custom Lambda function `policies`, enabling granular and specific privileges and access controls. - -The `policies` setting takes one or more IAM policy ARNs or AWS-managed policy names (e.g. `AmazonDynamoDBFullAccess`). - -Configuring one or more policies will completely remove all of Architect's default Lambda privileges. To restore Architect's default privileges, include a policy named `architect-default-policies`. - -> Note: `architect-default-policies` is an internal Architect framework setting based on the least-privilege permissions specific to your project. It is not a managed / public IAM policy, and will not be found in your AWS console. - - -## Examples - -Lambda only has a single set of permissions (as defined by the AWS-managed `S3CrudPolicy` policy): - -```arc -@aws -policies - S3CrudPolicy -``` - -Lambda has both an AWS-managed policy (`S3CrudPolicy`) and all default Architect permissions: -```arc -@aws -policies - S3CrudPolicy - architect-default-policies -``` - -Terser single-line version of the above example: -```arc -@aws -policies S3CrudPolicy architect-default-policies -``` - ---- - -## Additional resources - -- [AWS IAM policy ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns) -- [Community-maintained list of AWS-managed policies](https://github.com/z0ph/MAMIP/tree/master/policies) diff --git a/src/views/docs/en/reference/configuration/function-config/runtime.md b/src/views/docs/en/reference/configuration/function-config/runtime.md deleted file mode 100644 index 7ea85441..00000000 --- a/src/views/docs/en/reference/configuration/function-config/runtime.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: '@aws runtime' -category: config.arc -description: Lambda function configuration ---- - -Configure Lambda function `runtime`: - -- `nodejs14.x` (default) -- `deno` -- `python3.8` -- `ruby2.5` - -Also configurable but not supported by Architect Sandbox: - -- `java8` -- `go1.x` -- `dotnetcore2.1` - -## Example - -```arc -@aws -runtime deno -``` diff --git a/src/views/docs/en/reference/configuration/function-config/timeout.md b/src/views/docs/en/reference/configuration/function-config/timeout.md deleted file mode 100644 index 0ee6a658..00000000 --- a/src/views/docs/en/reference/configuration/function-config/timeout.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: '@aws timeout' -category: config.arc -description: Lambda function configuration ---- - -Configure Lambda function `timeout` in seconds to a max of `900`. (`15` minutes.) - -The default timeout (if no value supplied) is `5`. (`5` seconds.) - -## Example - -```arc -@aws -timeout 30 -``` diff --git a/src/views/docs/en/reference/configuration/local-preferences.md b/src/views/docs/en/reference/configuration/local-preferences.md new file mode 100644 index 00000000..6a2f791e --- /dev/null +++ b/src/views/docs/en/reference/configuration/local-preferences.md @@ -0,0 +1,124 @@ +--- +title: Local preferences +category: Configuration +description: Sandbox local preferences +sections: + - '@create' + - '@env' + - '@sandbox' + - '@sandbox-startup' +--- + +> Architect preferences (`preferences.arc`, or `prefs.arc`) defines settings for local Architect workflows. This file is intended to be added to `.gitignore`. + +- [`@create`](#%40create) - Preferences for resource creation with `arc init` +- [`@env`](#%40env) - Configure environment variables +- [`@sandbox`](#%40sandbox) - Define Sandbox preferences +- [`@sandbox-startup`](#%40sandbox-startup) - Hook into Sandbox's startup + +# `@create` + +Preferences for resource creation with `arc init`. + +## `autocreate` + +By adding the `@create` pragma to your preferences file and specifying `autocreate true`, you can enable `arc sandbox`, `arc deploy`, and other workflows to automatically run `arc init` to create boilerplate Lambda handlers and static assets if they do not exist. + +```arc +@create +autocreate true +``` + +## `templates` + +Define custom boilerplate Lambda handlers on a per-pragma basis with `templates`: + +```arc +@create +templates + http path/to/template/http.js + events path/to/template/events.py +``` + +In the above example, new `@http` functions will use your `path/to/template/http.js` template instead of the Architect default, while creating new `@events` functions will use the `path/to/template/events.py`. This will work for either `autocreate true` or the `arc init` command. + +# `@env` + +Configure environment variables for `testing` with `arc sandbox` and deployed `staging` and `production` environments. + +Sync environment variables to your project by using the [`arc env` CLI command](/reference/cli/env). If the preferences file does not exist Architect will generate `preferences.arc` file. + +> Note: any time you run `arc env`, your unsynced local environment variables will be overwritten. + +## Example + +```arc +@env +testing + A_TESTING_ENV_VAR something-for-testing + ANOTHER_VAR only-for-testing + +staging + A_STAGING_ENV_VAR something-for-staging + +production + A_PRODUCTION_ENV_VAR something-for-production +``` + +## `.env` + +Architect sandbox supports loading environment variables from a `.env` file. The `.env` will override your `preferences.arc` or `prefs.arc` and environment variables it defines will be loaded for whichever environment the sandbox is running (`testing`, `staging`, or `production`). + +(NB: Recall that key/value pairs in `.env` files are separated by the `=` symbol) + +## Example `.env` file + +```shell +A_TESTING_ENV_VAR=something-for-testing +ANOTHER_VAR=only-for-testing +``` + +# `@sandbox` + +Define [`arc sandbox`](../cli/sandbox) preferences. If you are not using a [`.env` file](.env) then any environment variables set using the [`arc env` CLI](../cli/env) will be stored in the preferences file. In this scenario it is best _not_ to revision the preferences file in source control. + +### `env` - String + +Advanced option: set the `ARC_ENV` + `NODE_ENV` stage to `staging` or `production` and use the env vars for that stage (see the `@env` pragma above); if not specified, defaults to `testing`. This setting may introduce unexpected side effects, so only use it if you have a specific technical reason. + +```arc +@sandbox +env staging +``` + +### `useAWS` - Boolean + +Advanced option that uses live AWS infrastructure where deployed, specifically: `@tables` / `@indexes` (DynamoDB), `@events` (EventBridge), and `@queues` (SQS). Notes: +- To use this feature, your local AWS credentials file must have valid keys to use this infrastructure (or calls to AWS will fail) +- If you do not specify an environment, `staging` will be set automatically; you can also use `production` + +```arc +@sandbox +useAWS true +``` + +### `no-hydrate` - Boolean + +Disables hydration + +```arc +@sandbox +no-hydrate true +``` + +# `@sandbox-startup` + +Hook up CLI commands into [`arc sandbox`](../cli/sandbox) startup. Helpful for repetitive tasks like seeding a database or starting up additional services for local development. Each command should be a separate unindented line under the `@sandbox-startup` pragma. + +### Example + +```arc +@sandbox-startup +node scripts/seed_db.js +echo 'hello' +``` diff --git a/src/views/docs/en/reference/configuration/local-preferences/.env.md b/src/views/docs/en/reference/configuration/local-preferences/.env.md deleted file mode 100644 index 0765cb8a..00000000 --- a/src/views/docs/en/reference/configuration/local-preferences/.env.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: '.env' -category: prefs.arc -description: Sandbox environment variables ---- - -Architect sandbox supports loading environment variables from a `.env` file. The `.env` will override your `preferences.arc` or `prefs.arc` and environment variables it defines will be loaded for whichever environment the sandbox is running (`testing`, `staging`, or `production`). - -(NB: Recall that key/value pairs in `.env` files are separated by the `=` symbol) - -## Example `.env` file - -```shell -A_TESTING_ENV_VAR=something-for-testing -ANOTHER_VAR=only-for-testing -``` diff --git a/src/views/docs/en/reference/configuration/local-preferences/create.md b/src/views/docs/en/reference/configuration/local-preferences/create.md deleted file mode 100644 index c50ea626..00000000 --- a/src/views/docs/en/reference/configuration/local-preferences/create.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: '@create' -category: prefs.arc -description: Sandbox environment variables ---- - -> Architect preferences (`preferences.arc`, or `prefs.arc`) defines settings for local Architect workflows. This file is intended to be added to `.gitignore`. - -Preferences for resource creation with `arc init`. - -## `autocreate` - -By adding the `@create` pragma to your preferences file and specifying `autocreate true`, you can enable `arc sandbox`, `arc deploy`, and other workflows to automatically run `arc init` to create boilerplate Lambda handlers and static assets if they do not exist. - -```arc -@create -autocreate true -``` - -## `templates` - -Define custom boilerplate Lambda handlers on a per-pragma basis with `templates`: - -```arc -@create -templates - http path/to/template/http.js - events path/to/template/events.py -``` - -In the above example, new `@http` functions will use your `path/to/template/http.js` template instead of the Architect default, while creating new `@events` functions will use the `path/to/template/events.py`. This will work for either `autocreate true` or the `arc init` command. diff --git a/src/views/docs/en/reference/configuration/local-preferences/env.md b/src/views/docs/en/reference/configuration/local-preferences/env.md deleted file mode 100644 index 38829c51..00000000 --- a/src/views/docs/en/reference/configuration/local-preferences/env.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: '@env' -category: prefs.arc -description: Sandbox environment variables ---- - -> Architect preferences (`preferences.arc`, or `prefs.arc`) defines settings for local workflows. This file is intended to be added to `.gitignore`. - -Configure environment variables for `testing` with `arc sandbox` and deployed `staging` and `production` environments. - -Sync environment variables to your project by using the [`arc env` CLI command](/reference/cli/env). If the preferences file does not exist Architect will generate `preferences.arc` file. - -> Note: any time you run `arc env`, your unsynced local environment variables will be overwritten. - -## Example - -```arc -@env -testing - A_TESTING_ENV_VAR something-for-testing - ANOTHER_VAR only-for-testing - -staging - A_STAGING_ENV_VAR something-for-staging - -production - A_PRODUCTION_ENV_VAR something-for-production -``` diff --git a/src/views/docs/en/reference/configuration/local-preferences/sandbox-startup.md b/src/views/docs/en/reference/configuration/local-preferences/sandbox-startup.md deleted file mode 100644 index ddc29600..00000000 --- a/src/views/docs/en/reference/configuration/local-preferences/sandbox-startup.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: '@sandbox-startup' -category: prefs.arc -description: Sandbox scripts ---- - -Hook up CLI commands into [`arc sandbox`](../cli/sandbox) startup. Helpful for repetitive tasks like seeding a database or starting up additional services for local development. Each command should be a separate unindented line under the `@sandbox-startup` pragma. - -### Example - -```arc -@sandbox-startup -node scripts/seed_db.js -echo 'hello' -``` diff --git a/src/views/docs/en/reference/configuration/local-preferences/sandbox.md b/src/views/docs/en/reference/configuration/local-preferences/sandbox.md deleted file mode 100644 index 5b112de3..00000000 --- a/src/views/docs/en/reference/configuration/local-preferences/sandbox.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: '@sandbox' -category: prefs.arc -description: Sandbox environment variables ---- - -> Architect preferences (`preferences.arc`, or `prefs.arc`) defines settings for local Architect workflows. - -Define [`arc sandbox`](../cli/sandbox) preferences. If you are not using a [`.env` file](.env) then any environment variables set using the [`arc env` CLI](../cli/env) will be stored in the preferences file. In this scenario it is best _not_ to revision the preferences file in source control. - -### `env` - String - -Advanced option: set the `ARC_ENV` + `NODE_ENV` stage to `staging` or `production` and use the env vars for that stage (see the `@env` pragma above); if not specified, defaults to `testing`. This setting may introduce unexpected side effects, so only use it if you have a specific technical reason. - -```arc -@sandbox -env staging -``` - -### `useAWS` - Boolean - -Advanced option that uses live AWS infrastructure where deployed, specifically: `@tables` / `@indexes` (DynamoDB), `@events` (EventBridge), and `@queues` (SQS). Notes: -- To use this feature, your local AWS credentials file must have valid keys to use this infrastructure (or calls to AWS will fail) -- If you do not specify an environment, `staging` will be set automatically; you can also use `production` - -```arc -@sandbox -useAWS true -``` - -### `no-hydrate` - Boolean - -Disables hydration - -```arc -@sandbox -no-hydrate true -``` diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 1a687aaf..03ab1260 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -57,27 +57,8 @@ let Reference = [ { '@ws' ], 'Configuration': [ - { - 'Function config': [ - '@aws', - 'runtime', - 'memory', - 'timeout', - 'concurrency', - 'layers', - 'policies', - 'architecture', - ] - }, - { - 'Local preferences': [ - '@create', - '@env', - '.env', - '@sandbox', - '@sandbox-startup' - ] - } + 'Function config', + 'Local preferences', ], 'CLI': [ 'deploy', From 5dd8b1883067b106bbc23c3109d353a2af400872 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 7 Oct 2021 11:48:22 -0600 Subject: [PATCH 180/680] structure and formatting changes --- .../configuration/function-config.md | 38 +++++++++---------- .../configuration/local-preferences.md | 18 ++++----- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md index 9e33aa8f..f2160815 100644 --- a/src/views/docs/en/reference/configuration/function-config.md +++ b/src/views/docs/en/reference/configuration/function-config.md @@ -28,7 +28,7 @@ Configure individual Lambda function properties (e.g. `src/http/get-index/config > Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB. -## Example +### Example ```arc @aws @@ -44,7 +44,7 @@ architecture arm64 Read more about the [Lambda limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) and [resource model](https://docs.aws.amazon.com/lambda/latest/dg/resource-model.html). -# `runtime` +## `runtime` Configure Lambda function `runtime`: @@ -59,44 +59,44 @@ Also configurable but not supported by Architect Sandbox: - `go1.x` - `dotnetcore2.1` -## Example +### Example ```arc @aws runtime deno ``` -# `memory` +## `memory` Configure Lambda function `memory` between `128` MB to `10240` MB, in `1` MB increments. -## Example +### Example ```arc @aws memory 1024 ``` -# `timeout` +## `timeout` Configure Lambda function `timeout` in seconds to a max of `900`. (`15` minutes.) The default timeout (if no value supplied) is `5`. (`5` seconds.) -## Example +### Example ```arc @aws timeout 30 ``` -# `concurrency` +## `concurrency` Configure Lambda function concurrency. If not present concurrency is unthrottled. -## Examples +#### Examples -### Limit execution to one invocation at a time +Limit execution to one invocation at a time ```arc @aws @@ -105,20 +105,20 @@ concurrency 1 > Tip: `@events` functions with `concurrency 1` create a queue-like primitive -### Disable invocation by setting concurrency to zero +Disable invocation by setting concurrency to zero ```arc @aws concurrency 0 ``` -# `layers` +## `layers` Configure Lambda function `layers` with max 5 Lambda Layer ARNs. > Warning: Lambda Layers must be in the same region as they are deployed -## Examples +### Examples Add one layer: @@ -138,7 +138,7 @@ layers > Tip: find [awesome layers](https://github.com/mthenw/awesome-layers) -# `policies` +## `policies` Configure custom Lambda function `policies`, enabling granular and specific privileges and access controls. @@ -149,7 +149,7 @@ Configuring one or more policies will completely remove all of Architect's defau > Note: `architect-default-policies` is an internal Architect framework setting based on the least-privilege permissions specific to your project. It is not a managed / public IAM policy, and will not be found in your AWS console. -## Examples +### Examples Lambda only has a single set of permissions (as defined by the AWS-managed `S3CrudPolicy` policy): @@ -175,18 +175,18 @@ policies S3CrudPolicy architect-default-policies --- -## Additional resources +### Additional resources - [AWS IAM policy ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns) - [Community-maintained list of AWS-managed policies](https://github.com/z0ph/MAMIP/tree/master/policies) -# `architecture` +## `architecture` Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. `arm64` only works if your region supports it. -**Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. +> **Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. -## Example +### Example ```arc @aws diff --git a/src/views/docs/en/reference/configuration/local-preferences.md b/src/views/docs/en/reference/configuration/local-preferences.md index 6a2f791e..d3bc2dbd 100644 --- a/src/views/docs/en/reference/configuration/local-preferences.md +++ b/src/views/docs/en/reference/configuration/local-preferences.md @@ -16,11 +16,11 @@ sections: - [`@sandbox`](#%40sandbox) - Define Sandbox preferences - [`@sandbox-startup`](#%40sandbox-startup) - Hook into Sandbox's startup -# `@create` +## `@create` Preferences for resource creation with `arc init`. -## `autocreate` +### `autocreate` By adding the `@create` pragma to your preferences file and specifying `autocreate true`, you can enable `arc sandbox`, `arc deploy`, and other workflows to automatically run `arc init` to create boilerplate Lambda handlers and static assets if they do not exist. @@ -29,7 +29,7 @@ By adding the `@create` pragma to your preferences file and specifying `autocrea autocreate true ``` -## `templates` +### `templates` Define custom boilerplate Lambda handlers on a per-pragma basis with `templates`: @@ -42,7 +42,7 @@ templates In the above example, new `@http` functions will use your `path/to/template/http.js` template instead of the Architect default, while creating new `@events` functions will use the `path/to/template/events.py`. This will work for either `autocreate true` or the `arc init` command. -# `@env` +## `@env` Configure environment variables for `testing` with `arc sandbox` and deployed `staging` and `production` environments. @@ -50,7 +50,7 @@ Sync environment variables to your project by using the [`arc env` CLI command]( > Note: any time you run `arc env`, your unsynced local environment variables will be overwritten. -## Example +### Example ```arc @env @@ -65,20 +65,20 @@ production A_PRODUCTION_ENV_VAR something-for-production ``` -## `.env` +### `.env` file support Architect sandbox supports loading environment variables from a `.env` file. The `.env` will override your `preferences.arc` or `prefs.arc` and environment variables it defines will be loaded for whichever environment the sandbox is running (`testing`, `staging`, or `production`). (NB: Recall that key/value pairs in `.env` files are separated by the `=` symbol) -## Example `.env` file +### Example `.env` file ```shell A_TESTING_ENV_VAR=something-for-testing ANOTHER_VAR=only-for-testing ``` -# `@sandbox` +## `@sandbox` Define [`arc sandbox`](../cli/sandbox) preferences. If you are not using a [`.env` file](.env) then any environment variables set using the [`arc env` CLI](../cli/env) will be stored in the preferences file. In this scenario it is best _not_ to revision the preferences file in source control. @@ -111,7 +111,7 @@ Disables hydration no-hydrate true ``` -# `@sandbox-startup` +## `@sandbox-startup` Hook up CLI commands into [`arc sandbox`](../cli/sandbox) startup. Helpful for repetitive tasks like seeding a database or starting up additional services for local development. Each command should be a separate unindented line under the `@sandbox-startup` pragma. From 1a14c015dce1f97b88945cd4ca31c1ad562fd61d Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 7 Oct 2021 13:29:22 -0600 Subject: [PATCH 181/680] adjust heading levels only one h1 per doc --- .github/CODE_OF_CONDUCT.md | 4 ++-- .../en/reference/runtime-helpers/node.js.md | 17 ++++++++--------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index e48f5c41..651d26f7 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -6,8 +6,8 @@ As such, the Architect project adheres to the [OpenJS Foundation Code of Conduct Lack of familiarity with this or the OpenJS Foundation Codes of Conduct, or the Contributor covenant, is not an excuse for non-adherence. +## Reporting -# Reporting If you are the subject of any behavior prohibited by this Code of Conduct, or observe someone who is, please contact an Architect team member immediately. If you know an Architect team member, you may wish to contact them personally (and you should); but if not, please [contact us via email](mailto:conduct@arc.codes). @@ -16,6 +16,6 @@ If possible, please attempt to collect any relevant information and evidence, in Reports will be handled with the utmost care, confidence, and sensitivity towards the individual(s) reporting. +## Enforcement -# Enforcement Should incidents arise, upon adjudication those found to be in violation of this Code of Conduct may be immediately expelled from the Architect community, including events, forums, chat workspaces, code repositories, and any other place where Architect community members collaborate. diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index 9af7827d..1d3887f9 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -17,9 +17,9 @@ Architect has two primary runtime helpers for Node.js: --- -# `@architect/functions` +## `@architect/functions` -## Setup +### Setup Install the Architect runtime helpers for Node.js: @@ -34,7 +34,7 @@ let arc = require('@architect/functions') ``` -## API +### API - [`arc.events`](#arc.events) Publish / subscribe helpers for `@events` functions - [`arc.http`](#arc.http) Middleware and request/response normalization for `@http` functions using callbacks @@ -246,7 +246,7 @@ function handler(req, res) { ``` --- -### `arc.http.async` +#### `arc.http.async` #### API @@ -298,7 +298,7 @@ async function handler(req) { --- -### `arc.http.express` +#### `arc.http.express` [Express](https://expressjs.com) migration helper. @@ -318,7 +318,7 @@ exports.handler = arc.http.express(app) --- -### `arc.http.session` +#### `arc.http.session` `arc.http.session` provides methods for reading the current session in an `@http` request, and writing it back to a cookie. @@ -578,9 +578,9 @@ await arc.ws.send({ --- -# `@architect/asap` +## `@architect/asap` -## Setup +### Setup Install the Architect static asset proxy (ASAP) for Node.js: @@ -588,7 +588,6 @@ Install the Architect static asset proxy (ASAP) for Node.js: npm install @architect/asap ``` - ### API ASAP takes an optional configuration object with the following properties and returns an `async` Lambda handler: From aa44dc4dd96a0e97bcb3fd24ae08083a5ae80ec5 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 7 Oct 2021 14:35:57 -0600 Subject: [PATCH 182/680] 3.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6b46ed4e..bce74944 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.5.7", + "version": "3.6.0", "architect": { "app": "v8-arc-codes", "aws": { From 1ae1b89d5a7b7d4ac6edcdb9895b7dfc22d8b509 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 7 Oct 2021 14:40:59 -0600 Subject: [PATCH 183/680] update deploy regex for semver This will match "3.5.7" but not "404s should load index" --- scripts/deploy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deploy b/scripts/deploy index f9b0528e..a4851155 100755 --- a/scripts/deploy +++ b/scripts/deploy @@ -1,9 +1,9 @@ #!/bin/bash -# Checks if last commit message was semver +# Checks if last commit message was semver-ish # - If so, deploy to production # - And always deploy to staging TAG=`git log -1 --pretty=%B` -if echo "$TAG" | grep '^\([0-9]\{1,\}\.\?\)\{3\}'; then +if echo "$TAG" | grep -E '^([0-9]+\.){0,2}(\*|[0-9]+)$'; then npx arc deploy --production fi npx arc deploy --staging From 81c6c0eb7e947e8d372c033f848c0d3066b45f15 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 7 Oct 2021 14:52:04 -0600 Subject: [PATCH 184/680] deploy to staging when main commit and to prod when tagged --- .github/workflows/build.yml | 15 ++++++++++++--- scripts/deploy | 9 --------- 2 files changed, 12 insertions(+), 12 deletions(-) delete mode 100755 scripts/deploy diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c439116c..faa45942 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,7 +64,7 @@ jobs: deploy: # Setup needs: build - if: github.ref == 'refs/heads/main' + if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest # Go @@ -80,8 +80,17 @@ jobs: - name: Install run: npm i --production - - name: Deploy - run: npm run deploy + - name: Staging Deploy + if: github.ref == 'refs/heads/main' + run: npx arc deploy --staging + env: + CI: true + AWS_ACCESS_KEY_ID: ${{ secrets.V8_AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.V8_AWS_SECRET_ACCESS_KEY }} + + - name: Production Deploy + if: startsWith(github.ref, 'refs/tags/v') + run: npx arc deploy --production env: CI: true AWS_ACCESS_KEY_ID: ${{ secrets.V8_AWS_ACCESS_KEY_ID }} diff --git a/scripts/deploy b/scripts/deploy deleted file mode 100755 index a4851155..00000000 --- a/scripts/deploy +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -# Checks if last commit message was semver-ish -# - If so, deploy to production -# - And always deploy to staging -TAG=`git log -1 --pretty=%B` -if echo "$TAG" | grep -E '^([0-9]+\.){0,2}(\*|[0-9]+)$'; then - npx arc deploy --production -fi -npx arc deploy --staging From 79743d0c3696892dcd1090258022ed423f029edc Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 7 Oct 2021 15:39:09 -0600 Subject: [PATCH 185/680] 3.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bce74944..166b7832 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.0", + "version": "3.6.1", "architect": { "app": "v8-arc-codes", "aws": { From c2b8bcde05d101ef3d6aaa5180741837da3a888f Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 8 Oct 2021 13:15:12 -0600 Subject: [PATCH 186/680] simplify some syntax and progress bar --- public/index.js | 25 +++++++------------------ src/views/modules/document/top-nav.js | 2 +- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/public/index.js b/public/index.js index f4133330..72362238 100644 --- a/public/index.js +++ b/public/index.js @@ -1,3 +1,4 @@ +/* eslint-env browser */ (function (){ let activeLink = document.querySelector('a.active') let main = document.getElementById('main') @@ -13,13 +14,8 @@ }) // Toggle sidebar on mobile - main.onclick = function hideSidebar () { - sidebar.classList.remove('open') - } - - menuButton.onclick = function toggleSidebar () { - sidebar.classList.toggle('open') - } + main.onclick = () => sidebar.classList.remove('open') + menuButton.onclick = () => sidebar.classList.toggle('open') /* Light/Dark Mode */ // Get the user's theme preference from local storage, otherwise check OS default @@ -33,19 +29,12 @@ localStorage.setItem('theme', targetTheme) } - // Show percentage of page read on desktop - let bar = document.querySelector('.indicator') - let isDesktop = window.innerWidth > 768 - - if (isDesktop) { - // If we want this to work on mobile - // we need to add a second function - // for handling window.onscroll - let el = main - bar.style.width = getScrollPercent(el) - el.onscroll = setReadPercent.bind(null, el) } + let bar = document.querySelector('.indicator') + bar.style.width = getScrollPercent(main) + main.onscroll = setReadPercent.bind(null, main) + function setReadPercent (el) { bar.style.width = `${getScrollPercent(el)}%` } diff --git a/src/views/modules/document/top-nav.js b/src/views/modules/document/top-nav.js index bab72827..1e53398a 100644 --- a/src/views/modules/document/top-nav.js +++ b/src/views/modules/document/top-nav.js @@ -68,7 +68,7 @@ export default function TopNav () { ${Icon({ href: 'hamburger', classes: 'icon fill-current' })} -
    + ` } From 3eb3731e83d0e821c6627289f48e511015aa1a00 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 8 Oct 2021 13:15:40 -0600 Subject: [PATCH 187/680] copy button feature --- public/css/syntax.css | 19 +++++++--- public/index.js | 52 ++++++++++++++++++++++++--- public/static.json | 4 +-- src/views/modules/document/symbols.js | 6 ++-- 4 files changed, 67 insertions(+), 14 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 3a434e9f..d2bb9d2a 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -2,6 +2,12 @@ margin: 0; } +/* all code font family */ +.docs pre code, .docs :not(pre) > code { + font-family: Menlo, Monaco, Consolas, monospace; +} + +/* highlighted/Shiki code blocks */ .docs pre { padding: 1rem; margin-bottom: 1.33rem; @@ -9,12 +15,18 @@ border-radius: 0.3rem; white-space: pre-wrap; word-break: break-word; -} -.docs pre { /* fallback when Shiki encounters unknown syntax */ color: var(--g2); background-color: var(--g9); } + +/* code copy button */ +.docs pre button.icon { + width: 1rem; + height: 1rem; +} + +/* inline code, not highlighted blocks */ .docs :not(pre) > code { background-color: var(--g1); padding: 0.1rem 0.2rem; @@ -24,6 +36,3 @@ min-width: auto; border-radius: 0.25rem; } -.docs pre code, .docs :not(pre) > code { - font-family: Menlo, Monaco, Consolas, monospace; -} diff --git a/public/index.js b/public/index.js index 72362238..24bff007 100644 --- a/public/index.js +++ b/public/index.js @@ -1,10 +1,11 @@ /* eslint-env browser */ (function (){ - let activeLink = document.querySelector('a.active') - let main = document.getElementById('main') - let menuButton = document.getElementById('menu-button') - let sidebar = document.getElementById('sidebar') - let themeButton = document.getElementById('theme-button') + const activeLink = document.querySelector('a.active') + const main = document.getElementById('main') + const menuButton = document.getElementById('menu-button') + const sidebar = document.getElementById('sidebar') + const themeButton = document.getElementById('theme-button') + const codeBlocks = document.querySelectorAll('pre.shiki') // Scroll active sidebar link into view if (activeLink) @@ -29,6 +30,47 @@ localStorage.setItem('theme', targetTheme) } + // Copy-Paste function for code blocks + const buttonClassList = [ + 'invisible', + 'visible-lg', + 'absolute', + 'top0', + 'right0', + 'mt-2', + 'mr-2', + 'cursor-pointer', + 'text-g0', + 'text-h0', + 'text-a2', + 'bg-unset', + 'fill-current', + 'icon' + ] + const svgCopy = '' + const svgCheck = '' + for (const codeBlock of codeBlocks) { + codeBlock.classList.add('relative') + // create copy button + const button = document.createElement('button') + button.className = buttonClassList.join(' ') + button.innerHTML = svgCopy + + button.onclick = (evt) => { + const target = evt.target + const parent = target.closest('pre') + const codeText = parent.querySelector('code').textContent.trim() + + navigator.clipboard.writeText(codeText).then( + () => { + target.innerHTML = svgCheck + setTimeout(() => target.innerHTML = svgCopy, 2000) + }, + () => target.innerHTML = 'Error copying!' + ) + } + + codeBlock.appendChild(button) } let bar = document.querySelector('.indicator') diff --git a/public/static.json b/public/static.json index dc41e630..225fe7b1 100644 --- a/public/static.json +++ b/public/static.json @@ -1,6 +1,6 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-cba7721432.js", + "index.js": "index-e6b6c15962.js", "playground.html": "playground-d3d4c75ee9.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-b7b5744cd1.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-03b095eb73.css" + "css/syntax.css": "css/syntax-0785bc780c.css" } \ No newline at end of file diff --git a/src/views/modules/document/symbols.js b/src/views/modules/document/symbols.js index 81868d8f..2bf8f101 100644 --- a/src/views/modules/document/symbols.js +++ b/src/views/modules/document/symbols.js @@ -3,6 +3,8 @@ export default ` - - + + + + ` From cb4de6c913787aecc661e0d04e5bdb503cca8185 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Fri, 8 Oct 2021 16:26:06 -0400 Subject: [PATCH 188/680] Force code copy button not to change color --- public/css/syntax.css | 1 + public/index.js | 1 - public/static.json | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index d2bb9d2a..2ba61e67 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -24,6 +24,7 @@ .docs pre button.icon { width: 1rem; height: 1rem; + color: white; } /* inline code, not highlighted blocks */ diff --git a/public/index.js b/public/index.js index 24bff007..5a65a038 100644 --- a/public/index.js +++ b/public/index.js @@ -40,7 +40,6 @@ 'mt-2', 'mr-2', 'cursor-pointer', - 'text-g0', 'text-h0', 'text-a2', 'bg-unset', diff --git a/public/static.json b/public/static.json index 225fe7b1..21f57687 100644 --- a/public/static.json +++ b/public/static.json @@ -1,6 +1,6 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-e6b6c15962.js", + "index.js": "index-1ba8af551e.js", "playground.html": "playground-d3d4c75ee9.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-b7b5744cd1.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-0785bc780c.css" + "css/syntax.css": "css/syntax-07adc2d577.css" } \ No newline at end of file From 2113b267fb6a5f0c0702cbc2aeb19a3da56e3419 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 8 Oct 2021 15:08:12 -0600 Subject: [PATCH 189/680] improve copy button click target --- public/css/syntax.css | 3 +++ public/index.js | 2 +- public/static.json | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 2ba61e67..7c698c93 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -26,6 +26,9 @@ height: 1rem; color: white; } +.docs pre button.icon svg { + pointer-events: none; +} /* inline code, not highlighted blocks */ .docs :not(pre) > code { diff --git a/public/index.js b/public/index.js index 5a65a038..018e943b 100644 --- a/public/index.js +++ b/public/index.js @@ -32,6 +32,7 @@ // Copy-Paste function for code blocks const buttonClassList = [ + 'icon', 'invisible', 'visible-lg', 'absolute', @@ -44,7 +45,6 @@ 'text-a2', 'bg-unset', 'fill-current', - 'icon' ] const svgCopy = '' const svgCheck = '' diff --git a/public/static.json b/public/static.json index 21f57687..a484ec54 100644 --- a/public/static.json +++ b/public/static.json @@ -1,6 +1,6 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-1ba8af551e.js", + "index.js": "index-272710e748.js", "playground.html": "playground-d3d4c75ee9.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-b7b5744cd1.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-07adc2d577.css" + "css/syntax.css": "css/syntax-2c5de4051e.css" } \ No newline at end of file From 4b7b60d4f177214190ac154e003af8eb3e2cd956 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 8 Oct 2021 15:25:50 -0600 Subject: [PATCH 190/680] 3.6.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 166b7832..d6ac5599 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.1", + "version": "3.6.2", "architect": { "app": "v8-arc-codes", "aws": { From 0a59297714516a9da0145d07c708c715a241d2cb Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 8 Oct 2021 19:02:16 -0600 Subject: [PATCH 191/680] update outdated references --- .github/pull_request_template.md | 2 +- src/shared/redirect-map.js | 18 ++++++------- .../dependency-management.md | 2 +- src/views/docs/en/guides/extend/plugins.md | 15 ++++++----- .../guides/get-started/detailed-aws-setup.md | 2 +- .../en/guides/get-started/project-layout.md | 26 +++++++++---------- src/views/docs/en/reference/cli/destroy.md | 4 +-- .../docs/en/reference/project-manifest/ws.md | 2 +- .../en/reference/runtime-helpers/node.js.md | 2 +- 9 files changed, 37 insertions(+), 36 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9f274442..78ccaaf2 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,6 +11,6 @@ To maintain a high standard of quality in our releases, before merging every pul Please also be sure to completed the CLA as it's required for your PR to be merged. A github comment will prompt you if you haven't already. -Learn more about [contributing to Architect here](https://arc.codes/intro/community). +Learn more about [contributing to Architect here](/docs/en/about/contribute). Thanks again! diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index 6546f24d..ba6bb551 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -19,15 +19,15 @@ const redirects = { // Primitives // round 1: Q1 2021 - '/primitives/http': '/docs/en/reference/app.arc/http', - '/primitives/ws': '/docs/en/reference/app.arc/ws', - '/primitives/static': '/docs/en/reference/app.arc/static', - '/primitives/cdn': '/docs/en/reference/app.arc/static', - '/primitives/scheduled': '/docs/en/reference/app.arc/scheduled', - '/primitives/events': '/docs/en/reference/app.arc/events', - '/primitives/queues': '/docs/en/reference/app.arc/queues', - '/primitives/tables': '/docs/en/reference/app.arc/tables', - '/primitives/macros': '/docs/en/reference/app.arc/macros', + '/primitives/http': '/docs/en/reference/project-manifest/http', + '/primitives/ws': '/docs/en/reference/project-manifest/ws', + '/primitives/static': '/docs/en/reference/project-manifest/static', + '/primitives/cdn': '/docs/en/reference/project-manifest/static', + '/primitives/scheduled': '/docs/en/reference/project-manifest/scheduled', + '/primitives/events': '/docs/en/reference/project-manifest/events', + '/primitives/queues': '/docs/en/reference/project-manifest/queues', + '/primitives/tables': '/docs/en/reference/project-manifest/tables', + '/primitives/macros': '/docs/en/reference/project-manifest/macros', // Guides // round 1: Q1 2021 diff --git a/src/views/docs/en/guides/developer-experience/dependency-management.md b/src/views/docs/en/guides/developer-experience/dependency-management.md index 4581707c..738dcf08 100644 --- a/src/views/docs/en/guides/developer-experience/dependency-management.md +++ b/src/views/docs/en/guides/developer-experience/dependency-management.md @@ -29,7 +29,7 @@ let foo = require('@architect/shared/foo') Recommended additional reading for working with the Node runtime: - Use `@shared` and `@views` to [share code](/docs/en/guides/developer-experience/sharing-code) between functions -- Use [`@architect/functions`](/docs/en/reference/runtime/node.js) to make working with Node a bit nicer +- Use [`@architect/functions`](/docs/en/reference/runtime-helpers/node.js) to make working with Node a bit nicer ## Ruby diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md index 7f22fbcf..52149929 100644 --- a/src/views/docs/en/guides/extend/plugins.md +++ b/src/views/docs/en/guides/extend/plugins.md @@ -307,7 +307,7 @@ For common Architect Plugin use cases, Architect provides a few helper functions This method should be leveraged inside a plugin's [`package`](#package) method in order to more easily define CloudFormation JSON representing Lambdas created by the plugin. Use of this method for defining Lambdas is an Architect best practice as certain specific conventions that Architect relies on can be maintained. -While the AWS Lambda logical ID is generally not a concern for developers using Architect, Architect relies on a logical ID naming convention to e.g. retrieve execution logs of a deployed Lambda via [`arc logs`][logs]. This helper method helps enforce such conventions. Leveraging this method also gives the plugin-generated Lambdas transparent support for [Architect's per-function runtime configuration via the `config.arc` file](https://arc.codes/docs/en/reference/config.arc/aws). +While the AWS Lambda logical ID is generally not a concern for developers using Architect, Architect relies on a logical ID naming convention to e.g. retrieve execution logs of a deployed Lambda via [`arc logs`][logs]. This helper method helps enforce such conventions. Leveraging this method also gives the plugin-generated Lambdas transparent support for [Architect's per-function runtime configuration via the `config.arc` file][config-arc]. #### Arguments @@ -433,17 +433,18 @@ module.exports = { [inv]: https://github.com/architect/inventory [macros]: custom-cloudformation -[http]: ../../reference/app.arc/http -[events]: ../../reference/app.arc/events -[queues]: ../../reference/app.arc/queues -[tables]: ../../reference/app.arc/tables +[config-arc]: ../../reference/configuration/function-config +[http]: ../../reference/project-manifest/http +[events]: ../../reference/project-manifest/events +[queues]: ../../reference/project-manifest/queues +[tables]: ../../reference/project-manifest/tables [sandbox]: ../../reference/cli/sandbox [create]: ../../reference/cli/init [hydrate]: ../../reference/cli/hydrate [logs]: ../../reference/cli/logs [deploy]: ../../reference/cli/deploy -[functions]: ../../reference/runtime/node.js -[services]: ../../reference/runtime/node.js#arc.services +[functions]: ../../reference/runtime-helpers/node.js +[services]: ../../reference/runtime-helpers/node.js#arc.services [cfn-ref]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html [discovery]: https://en.wikipedia.org/wiki/Service_discovery [ssm]: https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html diff --git a/src/views/docs/en/guides/get-started/detailed-aws-setup.md b/src/views/docs/en/guides/get-started/detailed-aws-setup.md index ba2cd24d..789f0c74 100644 --- a/src/views/docs/en/guides/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/guides/get-started/detailed-aws-setup.md @@ -41,7 +41,7 @@ To change the default runtime add it to the `app.arc` under the `@aws` pragma: runtime python3.8 ``` -> This setting can be overridden on a function-by-function basis with [`config.arc`](/docs/en/reference/config.arc/@aws). +> This setting can be overridden on a function-by-function basis with [`config.arc`](/docs/en/reference/configuration/function-config). Architect supports the following standard AWS managed runtimes in live infra, but not while working locally (at present): diff --git a/src/views/docs/en/guides/get-started/project-layout.md b/src/views/docs/en/guides/get-started/project-layout.md index 0affc7b0..570ed253 100644 --- a/src/views/docs/en/guides/get-started/project-layout.md +++ b/src/views/docs/en/guides/get-started/project-layout.md @@ -61,29 +61,29 @@ The `app.arc` format follows a few simple rules: These sections are for global system level env configuration. The most important being the `@app` namespace which is used to prefix all generated resources. -- [`@app`](/docs/en/reference/app.arc/app) **[Required]** application namespace -- [`@aws`](/docs/en/reference/app.arc/aws) AWS specific configuration -- [`@views`](/docs/en/reference/app.arc/views) configure path to view source code -- [`@shared`](/docs/en/reference/app.arc/shared) configure path to shared source code -- [`@macros`](/docs/en/reference/app.arc/macros) modify generated CloudFormation +- [`@app`](../../reference/project-manifest/app) **[Required]** application namespace +- [`@aws`](../../reference/project-manifest/aws) AWS specific configuration +- [`@views`](../../reference/project-manifest/views) configure path to view source code +- [`@shared`](../../reference/project-manifest/shared) configure path to shared source code +- [`@macros`](../../reference/project-manifest/macros) modify generated CloudFormation ### Lambda resource definition These sections deal with Lambda functions and their event sources. Architect conventionally promotes one event source per function. Single responsibility functions are faster to deploy, easier to debug and secure to least privilege. -- [`@http`](/docs/en/reference/app.arc/http) HTTP routes (API Gateway) -- [`@events`](/docs/en/reference/app.arc/events) Event pub/sub (SNS) -- [`@queues`](/docs/en/reference/app.arc/queues) queues and handlers for them (SQS) -- [`@scheduled`](/docs/en/reference/app.arc/scheduled) Invoke functions specified times (CloudWatch Events) -- [`@ws`](/docs/en/reference/app.arc/ws) Web Socket functions (API Gateway) +- [`@http`](../../reference/project-manifest/http) HTTP routes (API Gateway) +- [`@events`](../../reference/project-manifest/events) Event pub/sub (SNS) +- [`@queues`](../../reference/project-manifest/queues) queues and handlers for them (SQS) +- [`@scheduled`](../../reference/project-manifest/scheduled) Invoke functions specified times (CloudWatch Events) +- [`@ws`](../../reference/project-manifest/ws) Web Socket functions (API Gateway) ### Persistence resource definition These pragmas represent persistence resources. -- [`@static`](/docs/en/reference/app.arc/static) Bucket for hosting static assets (S3) -- [`@tables`](/docs/en/reference/app.arc/tables) Database tables and trigger functions (DynamoDB) -- [`@indexes`](/docs/en/reference/app.arc/indexes) Table global secondary indexes (DynamoDB) +- [`@static`](../../reference/project-manifest/static) Bucket for hosting static assets (S3) +- [`@tables`](../../reference/project-manifest/tables) Database tables and trigger functions (DynamoDB) +- [`@indexes`](../../reference/project-manifest/indexes) Table global secondary indexes (DynamoDB) ## Example diff --git a/src/views/docs/en/reference/cli/destroy.md b/src/views/docs/en/reference/cli/destroy.md index f5e9f803..4d933ecb 100644 --- a/src/views/docs/en/reference/cli/destroy.md +++ b/src/views/docs/en/reference/cli/destroy.md @@ -49,5 +49,5 @@ arc destroy --app my-app --force --name Dev ``` [deploy]: deploy -[tables]: ../app.arc/tables -[static]: ../app.arc/static +[tables]: ../project-manifest/tables +[static]: ../project-manifest/static diff --git a/src/views/docs/en/reference/project-manifest/ws.md b/src/views/docs/en/reference/project-manifest/ws.md index 7e97c1ba..df7d93c8 100644 --- a/src/views/docs/en/reference/project-manifest/ws.md +++ b/src/views/docs/en/reference/project-manifest/ws.md @@ -113,4 +113,4 @@ The functions created by the `@ws` pragma handle events from a WebSocket client. To publish a message to a WebSocket client you can use arc's runtime library `@architect/functions`' `ws.send` method. You can call this method from any of your application's functions. -Docs: [node](/docs/en/reference/runtime/node.js#arc.ws) - [ruby](/docs/en/reference/runtime/ruby#arc.ws) - [python](/docs/en/reference/runtime/python#arc.ws) +Docs: [node](/docs/en/reference/runtime-helpers/node.js#arc.ws) - [ruby](/docs/en/reference/runtime-helpers/ruby#arc.ws) - [python](/docs/en/reference/runtime-helpers/python#arc.ws) diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index 1d3887f9..032a724d 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -561,7 +561,7 @@ let data = await arc.tables() ### `arc.ws` -Send a message via WebSocket ([`@ws`](/docs/en/reference/app.arc/ws)). An object containing two properties is required: +Send a message via WebSocket ([`@ws`](/docs/en/reference/project-manifest/ws)). An object containing two properties is required: - **`id`** (string) - API Gateway `connectionId` of the client you'd like to send the message to - **`payload`** (object or array) - payload to be sent (as JSON) From 52e66a8f718569e886bc77a2c653d9978819ea91 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 12 Oct 2021 16:24:59 -0600 Subject: [PATCH 192/680] Eslint and arc/eslint-config upgrade (#422) * upgrade eslint-config and test Node 16 --- .github/workflows/build.yml | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index faa45942..18f6273d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - node-version: [ 14.x ] + node-version: [ 14.x, 16.x ] os: [ ubuntu-latest ] # Go diff --git a/package.json b/package.json index d6ac5599..a7aa6124 100644 --- a/package.json +++ b/package.json @@ -41,14 +41,14 @@ "dependencies": { "@architect/architect": "^9.1.0", "@architect/asap": "^4.0.0", - "@architect/eslint-config": "^2.0.0", + "@architect/eslint-config": "^2.0.1", "@architect/functions": "^4.0.0", "@architect/inventory": "^2.0.4", "@architect/package": "^7.0.1", "@architect/sandbox": "^4.0.1", "@architect/syntaxes": "github:architect/syntaxes#v1.0.1", "@toycode/markdown-it-class": "^1.2.4", - "eslint": "^7.31.0", + "eslint": "^8.0.0", "esm": "^3.2.25", "js-yaml": "^4.1.0", "markdown-it": "^12.1.0", From 0cdac67467d936f8e509173b3478311a5f1ec3c4 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 12 Oct 2021 19:05:49 -0600 Subject: [PATCH 193/680] update dependencies and rehydrate shiki rename script for moving shiki directly to function source --- package.json | 20 +- readme.md | 4 +- .../{seed-dependencies => hydrate-shiki-deps} | 10 +- .../shiki/dist/index.js | 2016 ++++++----------- 4 files changed, 668 insertions(+), 1382 deletions(-) rename scripts/{seed-dependencies => hydrate-shiki-deps} (69%) diff --git a/package.json b/package.json index a7aa6124..e2919cc1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ ] }, "scripts": { - "seed-dependencies": "./scripts/seed-dependencies", + "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", "spellcheck": "cross-env npx spellchecker './src/views/docs/en/**/*.md' --no-suggestions -q -d ./scripts/dictionary.js --plugins spell indefinite-article repeated-words syntax-mentions syntax-urls", "lint": "eslint src --fix", @@ -40,26 +40,26 @@ }, "dependencies": { "@architect/architect": "^9.1.0", - "@architect/asap": "^4.0.0", + "@architect/asap": "^4.1.0", "@architect/eslint-config": "^2.0.1", "@architect/functions": "^4.0.0", - "@architect/inventory": "^2.0.4", - "@architect/package": "^7.0.1", - "@architect/sandbox": "^4.0.1", + "@architect/inventory": "^2.1.0", + "@architect/package": "^7.1.1", + "@architect/sandbox": "^4.1.1", "@architect/syntaxes": "github:architect/syntaxes#v1.0.1", "@toycode/markdown-it-class": "^1.2.4", "eslint": "^8.0.0", "esm": "^3.2.25", "js-yaml": "^4.1.0", - "markdown-it": "^12.1.0", - "markdown-it-anchor": "^8.1.2", + "markdown-it": "^12.2.0", + "markdown-it-anchor": "^8.4.1", "markdown-it-front-matter": "^0.2.3", "onigasm": "^2.2.5", - "shiki": "^0.9.10", - "slugify": "^1.6.0", + "shiki": "^0.9.12", + "slugify": "^1.6.1", "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", - "tape": "^5.3.0", + "tape": "^5.3.1", "tiny-json-http": "^7.3.0", "vscode-textmate": "^5.4.0" }, diff --git a/readme.md b/readme.md index 27637f5a..f3a31785 100644 --- a/readme.md +++ b/readme.md @@ -41,9 +41,9 @@ The frontmatter attributes are technically optional but highly encouraged as the Providing explicit languages to the highlighter (see `highlighter.js`) increases Shiki's performance. -To slim down Shiki's footprint, we bundle the dependency directly to the docs catchall function with only the grammars for languages we intend to highlight. This can be done automatically with the `seed-dependencies` script. +To slim down Shiki's footprint, we bundle the dependency directly to the docs catchall function with only the grammars for languages we intend to highlight. This can be done automatically with the `hydrate-shiki-des` script. -Use `npm run seed-dependencies` to move Shiki/dist (+ select languages) and the Arc syntax highlighting grammar to the docs catchall function. This drastically reduces that function's size on disk. +Use `npm run hydrate-shiki` to move Shiki/dist (+ select languages) and the Arc syntax highlighting grammar to the docs catchall function. This drastically reduces that function's size on disk. ## Todo diff --git a/scripts/seed-dependencies b/scripts/hydrate-shiki-deps similarity index 69% rename from scripts/seed-dependencies rename to scripts/hydrate-shiki-deps index c5aefb12..9f558312 100755 --- a/scripts/seed-dependencies +++ b/scripts/hydrate-shiki-deps @@ -1,8 +1,9 @@ #!/bin/bash # move Shiki dist to main doc catch all to reduce footprint -mkdir src/http/get-docs-000lang-catchall/shiki -mkdir src/http/get-docs-000lang-catchall/shiki/dist -mkdir src/http/get-docs-000lang-catchall/shiki/languages +echo "Copying Shiki and arc grammar from node_modules to get-docs-000lang-catchall/shiki..." +mkdir src/http/get-docs-000lang-catchall/shiki &> /dev/null +mkdir src/http/get-docs-000lang-catchall/shiki/dist &> /dev/null +mkdir src/http/get-docs-000lang-catchall/shiki/languages &> /dev/null cp node_modules/shiki/dist/index.js src/http/get-docs-000lang-catchall/shiki/dist/index.js cp node_modules/shiki/languages/shellscript.tmLanguage.json \ node_modules/shiki/languages/ruby.tmLanguage.json \ @@ -13,5 +14,6 @@ cp node_modules/shiki/languages/shellscript.tmLanguage.json \ node_modules/shiki/languages/python.tmLanguage.json \ node_modules/shiki/languages/powershell.tmLanguage.json \ src/http/get-docs-000lang-catchall/shiki/languages/ -# move specific Arc syntax highlighter grammar for Shiki +# move Arc syntax highlighter grammar for Shiki cp node_modules/@architect/syntaxes/arc-textmate.json src/http/get-docs-000lang-catchall/arc-textmate.json +echo "Done." diff --git a/src/http/get-docs-000lang-catchall/shiki/dist/index.js b/src/http/get-docs-000lang-catchall/shiki/dist/index.js index 2483a9ec..53f9e8ae 100644 --- a/src/http/get-docs-000lang-catchall/shiki/dist/index.js +++ b/src/http/get-docs-000lang-catchall/shiki/dist/index.js @@ -85,6 +85,7 @@ const languages = [ id: 'astro', scopeName: 'text.html.astro', path: 'astro.tmLanguage.json', + samplePath: 'astro.sample', embeddedLangs: ['css', 'sass', 'scss', 'tsx'] }, { @@ -93,6 +94,12 @@ const languages = [ path: 'awk.tmLanguage.json', samplePath: 'awk.sample' }, + { + id: 'ballerina', + scopeName: 'source.ballerina', + path: 'ballerina.tmLanguage.json', + samplePath: 'ballerina.sample' + }, { id: 'bat', scopeName: 'source.batchfile', @@ -648,6 +655,12 @@ const languages = [ scopeName: 'source.systemverilog', path: 'system-verilog.tmLanguage.json' }, + { + id: 'tasl', + scopeName: 'source.tasl', + path: 'tasl.tmLanguage.json', + samplePath: 'tasl.sample' + }, { id: 'tcl', scopeName: 'source.tcl', @@ -827,1422 +840,685 @@ class StackElementMetadata { } } -// This is a generated file. Do not edit. -var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/; -var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/; -var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/; - -var unicode = { - Space_Separator: Space_Separator, - ID_Start: ID_Start, - ID_Continue: ID_Continue -}; - -var util = { - isSpaceSeparator (c) { - return typeof c === 'string' && unicode.Space_Separator.test(c) - }, - - isIdStartChar (c) { - return typeof c === 'string' && ( - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c === '$') || (c === '_') || - unicode.ID_Start.test(c) - ) - }, - - isIdContinueChar (c) { - return typeof c === 'string' && ( - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - (c === '$') || (c === '_') || - (c === '\u200C') || (c === '\u200D') || - unicode.ID_Continue.test(c) - ) - }, - - isDigit (c) { - return typeof c === 'string' && /[0-9]/.test(c) - }, - - isHexDigit (c) { - return typeof c === 'string' && /[0-9A-Fa-f]/.test(c) - }, -}; - -let source; -let parseState; -let stack; -let pos; -let line; -let column; -let token; -let key; -let root; - -var parse = function parse (text, reviver) { - source = String(text); - parseState = 'start'; - stack = []; - pos = 0; - line = 1; - column = 0; - token = undefined; - key = undefined; - root = undefined; - - do { - token = lex(); - - // This code is unreachable. - // if (!parseStates[parseState]) { - // throw invalidParseState() - // } - - parseStates[parseState](); - } while (token.type !== 'eof') - - if (typeof reviver === 'function') { - return internalize({'': root}, '', reviver) - } - - return root -}; +function trimEndSlash(str) { + if (str.endsWith('/') || str.endsWith('\\')) + return str.slice(0, -1); + return str; +} +function trimStartDot(str) { + if (str.startsWith('./')) + return str.slice(2); + return str; +} +function dirname(str) { + const parts = str.split(/[\/\\]/g); + return parts[parts.length - 2]; +} +function join(...parts) { + return parts.map(trimEndSlash).map(trimStartDot).join('/'); +} -function internalize (holder, name, reviver) { - const value = holder[name]; - if (value != null && typeof value === 'object') { - for (const key in value) { - const replacement = internalize(value, key, reviver); - if (replacement === undefined) { - delete value[key]; - } else { - value[key] = replacement; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +/** + * Creates a JSON scanner on the given text. + * If ignoreTrivia is set, whitespaces or comments are ignored. + */ +function createScanner(text, ignoreTrivia) { + if (ignoreTrivia === void 0) { ignoreTrivia = false; } + var len = text.length; + var pos = 0, value = '', tokenOffset = 0, token = 16 /* Unknown */, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0 /* None */; + function scanHexDigits(count, exact) { + var digits = 0; + var value = 0; + while (digits < count || !exact) { + var ch = text.charCodeAt(pos); + if (ch >= 48 /* _0 */ && ch <= 57 /* _9 */) { + value = value * 16 + ch - 48 /* _0 */; + } + else if (ch >= 65 /* A */ && ch <= 70 /* F */) { + value = value * 16 + ch - 65 /* A */ + 10; + } + else if (ch >= 97 /* a */ && ch <= 102 /* f */) { + value = value * 16 + ch - 97 /* a */ + 10; + } + else { + break; } + pos++; + digits++; } - } - - return reviver.call(holder, name, value) -} - -let lexState; -let buffer; -let doubleQuote; -let sign; -let c; - -function lex () { - lexState = 'default'; - buffer = ''; - doubleQuote = false; - sign = 1; - - for (;;) { - c = peek(); - - // This code is unreachable. - // if (!lexStates[lexState]) { - // throw invalidLexState(lexState) - // } - - const token = lexStates[lexState](); - if (token) { - return token + if (digits < count) { + value = -1; } + return value; } -} - -function peek () { - if (source[pos]) { - return String.fromCodePoint(source.codePointAt(pos)) - } -} - -function read () { - const c = peek(); - - if (c === '\n') { - line++; - column = 0; - } else if (c) { - column += c.length; - } else { - column++; - } - - if (c) { - pos += c.length; + function setPosition(newPosition) { + pos = newPosition; + value = ''; + tokenOffset = 0; + token = 16 /* Unknown */; + scanError = 0 /* None */; } - - return c -} - -const lexStates = { - default () { - switch (c) { - case '\t': - case '\v': - case '\f': - case ' ': - case '\u00A0': - case '\uFEFF': - case '\n': - case '\r': - case '\u2028': - case '\u2029': - read(); - return - - case '/': - read(); - lexState = 'comment'; - return - - case undefined: - read(); - return newToken('eof') - } - - if (util.isSpaceSeparator(c)) { - read(); - return - } - - // This code is unreachable. - // if (!lexStates[parseState]) { - // throw invalidLexState(parseState) - // } - - return lexStates[parseState]() - }, - - comment () { - switch (c) { - case '*': - read(); - lexState = 'multiLineComment'; - return - - case '/': - read(); - lexState = 'singleLineComment'; - return - } - - throw invalidChar(read()) - }, - - multiLineComment () { - switch (c) { - case '*': - read(); - lexState = 'multiLineCommentAsterisk'; - return - - case undefined: - throw invalidChar(read()) - } - - read(); - }, - - multiLineCommentAsterisk () { - switch (c) { - case '*': - read(); - return - - case '/': - read(); - lexState = 'default'; - return - - case undefined: - throw invalidChar(read()) - } - - read(); - lexState = 'multiLineComment'; - }, - - singleLineComment () { - switch (c) { - case '\n': - case '\r': - case '\u2028': - case '\u2029': - read(); - lexState = 'default'; - return - - case undefined: - read(); - return newToken('eof') - } - - read(); - }, - - value () { - switch (c) { - case '{': - case '[': - return newToken('punctuator', read()) - - case 'n': - read(); - literal('ull'); - return newToken('null', null) - - case 't': - read(); - literal('rue'); - return newToken('boolean', true) - - case 'f': - read(); - literal('alse'); - return newToken('boolean', false) - - case '-': - case '+': - if (read() === '-') { - sign = -1; + function scanNumber() { + var start = pos; + if (text.charCodeAt(pos) === 48 /* _0 */) { + pos++; + } + else { + pos++; + while (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; } - - lexState = 'sign'; - return - - case '.': - buffer = read(); - lexState = 'decimalPointLeading'; - return - - case '0': - buffer = read(); - lexState = 'zero'; - return - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - buffer = read(); - lexState = 'decimalInteger'; - return - - case 'I': - read(); - literal('nfinity'); - return newToken('numeric', Infinity) - - case 'N': - read(); - literal('aN'); - return newToken('numeric', NaN) - - case '"': - case "'": - doubleQuote = (read() === '"'); - buffer = ''; - lexState = 'string'; - return - } - - throw invalidChar(read()) - }, - - identifierNameStartEscape () { - if (c !== 'u') { - throw invalidChar(read()) } - - read(); - const u = unicodeEscape(); - switch (u) { - case '$': - case '_': - break - - default: - if (!util.isIdStartChar(u)) { - throw invalidIdentifier() + if (pos < text.length && text.charCodeAt(pos) === 46 /* dot */) { + pos++; + if (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; + while (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; + } } - - break - } - - buffer += u; - lexState = 'identifierName'; - }, - - identifierName () { - switch (c) { - case '$': - case '_': - case '\u200C': - case '\u200D': - buffer += read(); - return - - case '\\': - read(); - lexState = 'identifierNameEscape'; - return - } - - if (util.isIdContinueChar(c)) { - buffer += read(); - return - } - - return newToken('identifier', buffer) - }, - - identifierNameEscape () { - if (c !== 'u') { - throw invalidChar(read()) - } - - read(); - const u = unicodeEscape(); - switch (u) { - case '$': - case '_': - case '\u200C': - case '\u200D': - break - - default: - if (!util.isIdContinueChar(u)) { - throw invalidIdentifier() + else { + scanError = 3 /* UnexpectedEndOfNumber */; + return text.substring(start, pos); } - - break - } - - buffer += u; - lexState = 'identifierName'; - }, - - sign () { - switch (c) { - case '.': - buffer = read(); - lexState = 'decimalPointLeading'; - return - - case '0': - buffer = read(); - lexState = 'zero'; - return - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - buffer = read(); - lexState = 'decimalInteger'; - return - - case 'I': - read(); - literal('nfinity'); - return newToken('numeric', sign * Infinity) - - case 'N': - read(); - literal('aN'); - return newToken('numeric', NaN) - } - - throw invalidChar(read()) - }, - - zero () { - switch (c) { - case '.': - buffer += read(); - lexState = 'decimalPoint'; - return - - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - - case 'x': - case 'X': - buffer += read(); - lexState = 'hexadecimal'; - return - } - - return newToken('numeric', sign * 0) - }, - - decimalInteger () { - switch (c) { - case '.': - buffer += read(); - lexState = 'decimalPoint'; - return - - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } - - if (util.isDigit(c)) { - buffer += read(); - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - decimalPointLeading () { - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalFraction'; - return - } - - throw invalidChar(read()) - }, - - decimalPoint () { - switch (c) { - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } - - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalFraction'; - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - decimalFraction () { - switch (c) { - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } - - if (util.isDigit(c)) { - buffer += read(); - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - decimalExponent () { - switch (c) { - case '+': - case '-': - buffer += read(); - lexState = 'decimalExponentSign'; - return - } - - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalExponentInteger'; - return - } - - throw invalidChar(read()) - }, - - decimalExponentSign () { - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalExponentInteger'; - return - } - - throw invalidChar(read()) - }, - - decimalExponentInteger () { - if (util.isDigit(c)) { - buffer += read(); - return - } - - return newToken('numeric', sign * Number(buffer)) - }, - - hexadecimal () { - if (util.isHexDigit(c)) { - buffer += read(); - lexState = 'hexadecimalInteger'; - return - } - - throw invalidChar(read()) - }, - - hexadecimalInteger () { - if (util.isHexDigit(c)) { - buffer += read(); - return } - - return newToken('numeric', sign * Number(buffer)) - }, - - string () { - switch (c) { - case '\\': - read(); - buffer += escape(); - return - - case '"': - if (doubleQuote) { - read(); - return newToken('string', buffer) + var end = pos; + if (pos < text.length && (text.charCodeAt(pos) === 69 /* E */ || text.charCodeAt(pos) === 101 /* e */)) { + pos++; + if (pos < text.length && text.charCodeAt(pos) === 43 /* plus */ || text.charCodeAt(pos) === 45 /* minus */) { + pos++; } - - buffer += read(); - return - - case "'": - if (!doubleQuote) { - read(); - return newToken('string', buffer) + if (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; + while (pos < text.length && isDigit(text.charCodeAt(pos))) { + pos++; + } + end = pos; + } + else { + scanError = 3 /* UnexpectedEndOfNumber */; } - - buffer += read(); - return - - case '\n': - case '\r': - throw invalidChar(read()) - - case '\u2028': - case '\u2029': - separatorChar(c); - break - - case undefined: - throw invalidChar(read()) - } - - buffer += read(); - }, - - start () { - switch (c) { - case '{': - case '[': - return newToken('punctuator', read()) - - // This code is unreachable since the default lexState handles eof. - // case undefined: - // return newToken('eof') - } - - lexState = 'value'; - }, - - beforePropertyName () { - switch (c) { - case '$': - case '_': - buffer = read(); - lexState = 'identifierName'; - return - - case '\\': - read(); - lexState = 'identifierNameStartEscape'; - return - - case '}': - return newToken('punctuator', read()) - - case '"': - case "'": - doubleQuote = (read() === '"'); - lexState = 'string'; - return - } - - if (util.isIdStartChar(c)) { - buffer += read(); - lexState = 'identifierName'; - return - } - - throw invalidChar(read()) - }, - - afterPropertyName () { - if (c === ':') { - return newToken('punctuator', read()) - } - - throw invalidChar(read()) - }, - - beforePropertyValue () { - lexState = 'value'; - }, - - afterPropertyValue () { - switch (c) { - case ',': - case '}': - return newToken('punctuator', read()) - } - - throw invalidChar(read()) - }, - - beforeArrayValue () { - if (c === ']') { - return newToken('punctuator', read()) - } - - lexState = 'value'; - }, - - afterArrayValue () { - switch (c) { - case ',': - case ']': - return newToken('punctuator', read()) - } - - throw invalidChar(read()) - }, - - end () { - // This code is unreachable since it's handled by the default lexState. - // if (c === undefined) { - // read() - // return newToken('eof') - // } - - throw invalidChar(read()) - }, -}; - -function newToken (type, value) { - return { - type, - value, - line, - column, - } -} - -function literal (s) { - for (const c of s) { - const p = peek(); - - if (p !== c) { - throw invalidChar(read()) - } - - read(); - } -} - -function escape () { - const c = peek(); - switch (c) { - case 'b': - read(); - return '\b' - - case 'f': - read(); - return '\f' - - case 'n': - read(); - return '\n' - - case 'r': - read(); - return '\r' - - case 't': - read(); - return '\t' - - case 'v': - read(); - return '\v' - - case '0': - read(); - if (util.isDigit(peek())) { - throw invalidChar(read()) - } - - return '\0' - - case 'x': - read(); - return hexEscape() - - case 'u': - read(); - return unicodeEscape() - - case '\n': - case '\u2028': - case '\u2029': - read(); - return '' - - case '\r': - read(); - if (peek() === '\n') { - read(); - } - - return '' - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - throw invalidChar(read()) - - case undefined: - throw invalidChar(read()) - } - - return read() -} - -function hexEscape () { - let buffer = ''; - let c = peek(); - - if (!util.isHexDigit(c)) { - throw invalidChar(read()) - } - - buffer += read(); - - c = peek(); - if (!util.isHexDigit(c)) { - throw invalidChar(read()) - } - - buffer += read(); - - return String.fromCodePoint(parseInt(buffer, 16)) -} - -function unicodeEscape () { - let buffer = ''; - let count = 4; - - while (count-- > 0) { - const c = peek(); - if (!util.isHexDigit(c)) { - throw invalidChar(read()) } - - buffer += read(); + return text.substring(start, end); } - - return String.fromCodePoint(parseInt(buffer, 16)) -} - -const parseStates = { - start () { - if (token.type === 'eof') { - throw invalidEOF() - } - - push(); - }, - - beforePropertyName () { - switch (token.type) { - case 'identifier': - case 'string': - key = token.value; - parseState = 'afterPropertyName'; - return - - case 'punctuator': - // This code is unreachable since it's handled by the lexState. - // if (token.value !== '}') { - // throw invalidToken() - // } - - pop(); - return - - case 'eof': - throw invalidEOF() - } - - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, - - afterPropertyName () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator' || token.value !== ':') { - // throw invalidToken() - // } - - if (token.type === 'eof') { - throw invalidEOF() - } - - parseState = 'beforePropertyValue'; - }, - - beforePropertyValue () { - if (token.type === 'eof') { - throw invalidEOF() - } - - push(); - }, - - beforeArrayValue () { - if (token.type === 'eof') { - throw invalidEOF() - } - - if (token.type === 'punctuator' && token.value === ']') { - pop(); - return - } - - push(); - }, - - afterPropertyValue () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator') { - // throw invalidToken() - // } - - if (token.type === 'eof') { - throw invalidEOF() - } - - switch (token.value) { - case ',': - parseState = 'beforePropertyName'; - return - - case '}': - pop(); - } - - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, - - afterArrayValue () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator') { - // throw invalidToken() - // } - - if (token.type === 'eof') { - throw invalidEOF() - } - - switch (token.value) { - case ',': - parseState = 'beforeArrayValue'; - return - - case ']': - pop(); - } - - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, - - end () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'eof') { - // throw invalidToken() - // } - }, -}; - -function push () { - let value; - - switch (token.type) { - case 'punctuator': - switch (token.value) { - case '{': - value = {}; - break - - case '[': - value = []; - break + function scanString() { + var result = '', start = pos; + while (true) { + if (pos >= len) { + result += text.substring(start, pos); + scanError = 2 /* UnexpectedEndOfString */; + break; + } + var ch = text.charCodeAt(pos); + if (ch === 34 /* doubleQuote */) { + result += text.substring(start, pos); + pos++; + break; + } + if (ch === 92 /* backslash */) { + result += text.substring(start, pos); + pos++; + if (pos >= len) { + scanError = 2 /* UnexpectedEndOfString */; + break; + } + var ch2 = text.charCodeAt(pos++); + switch (ch2) { + case 34 /* doubleQuote */: + result += '\"'; + break; + case 92 /* backslash */: + result += '\\'; + break; + case 47 /* slash */: + result += '/'; + break; + case 98 /* b */: + result += '\b'; + break; + case 102 /* f */: + result += '\f'; + break; + case 110 /* n */: + result += '\n'; + break; + case 114 /* r */: + result += '\r'; + break; + case 116 /* t */: + result += '\t'; + break; + case 117 /* u */: + var ch3 = scanHexDigits(4, true); + if (ch3 >= 0) { + result += String.fromCharCode(ch3); + } + else { + scanError = 4 /* InvalidUnicode */; + } + break; + default: + scanError = 5 /* InvalidEscapeCharacter */; + } + start = pos; + continue; + } + if (ch >= 0 && ch <= 0x1f) { + if (isLineBreak(ch)) { + result += text.substring(start, pos); + scanError = 2 /* UnexpectedEndOfString */; + break; + } + else { + scanError = 6 /* InvalidCharacter */; + // mark as error but continue with string + } + } + pos++; } - - break - - case 'null': - case 'boolean': - case 'numeric': - case 'string': - value = token.value; - break - - // This code is unreachable. - // default: - // throw invalidToken() + return result; } - - if (root === undefined) { - root = value; - } else { - const parent = stack[stack.length - 1]; - if (Array.isArray(parent)) { - parent.push(value); - } else { - parent[key] = value; + function scanNext() { + value = ''; + scanError = 0 /* None */; + tokenOffset = pos; + lineStartOffset = lineNumber; + prevTokenLineStartOffset = tokenLineStartOffset; + if (pos >= len) { + // at the end + tokenOffset = len; + return token = 17 /* EOF */; + } + var code = text.charCodeAt(pos); + // trivia: whitespace + if (isWhiteSpace(code)) { + do { + pos++; + value += String.fromCharCode(code); + code = text.charCodeAt(pos); + } while (isWhiteSpace(code)); + return token = 15 /* Trivia */; + } + // trivia: newlines + if (isLineBreak(code)) { + pos++; + value += String.fromCharCode(code); + if (code === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) { + pos++; + value += '\n'; + } + lineNumber++; + tokenLineStartOffset = pos; + return token = 14 /* LineBreakTrivia */; + } + switch (code) { + // tokens: []{}:, + case 123 /* openBrace */: + pos++; + return token = 1 /* OpenBraceToken */; + case 125 /* closeBrace */: + pos++; + return token = 2 /* CloseBraceToken */; + case 91 /* openBracket */: + pos++; + return token = 3 /* OpenBracketToken */; + case 93 /* closeBracket */: + pos++; + return token = 4 /* CloseBracketToken */; + case 58 /* colon */: + pos++; + return token = 6 /* ColonToken */; + case 44 /* comma */: + pos++; + return token = 5 /* CommaToken */; + // strings + case 34 /* doubleQuote */: + pos++; + value = scanString(); + return token = 10 /* StringLiteral */; + // comments + case 47 /* slash */: + var start = pos - 1; + // Single-line comment + if (text.charCodeAt(pos + 1) === 47 /* slash */) { + pos += 2; + while (pos < len) { + if (isLineBreak(text.charCodeAt(pos))) { + break; + } + pos++; + } + value = text.substring(start, pos); + return token = 12 /* LineCommentTrivia */; + } + // Multi-line comment + if (text.charCodeAt(pos + 1) === 42 /* asterisk */) { + pos += 2; + var safeLength = len - 1; // For lookahead. + var commentClosed = false; + while (pos < safeLength) { + var ch = text.charCodeAt(pos); + if (ch === 42 /* asterisk */ && text.charCodeAt(pos + 1) === 47 /* slash */) { + pos += 2; + commentClosed = true; + break; + } + pos++; + if (isLineBreak(ch)) { + if (ch === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) { + pos++; + } + lineNumber++; + tokenLineStartOffset = pos; + } + } + if (!commentClosed) { + pos++; + scanError = 1 /* UnexpectedEndOfComment */; + } + value = text.substring(start, pos); + return token = 13 /* BlockCommentTrivia */; + } + // just a single slash + value += String.fromCharCode(code); + pos++; + return token = 16 /* Unknown */; + // numbers + case 45 /* minus */: + value += String.fromCharCode(code); + pos++; + if (pos === len || !isDigit(text.charCodeAt(pos))) { + return token = 16 /* Unknown */; + } + // found a minus, followed by a number so + // we fall through to proceed with scanning + // numbers + case 48 /* _0 */: + case 49 /* _1 */: + case 50 /* _2 */: + case 51 /* _3 */: + case 52 /* _4 */: + case 53 /* _5 */: + case 54 /* _6 */: + case 55 /* _7 */: + case 56 /* _8 */: + case 57 /* _9 */: + value += scanNumber(); + return token = 11 /* NumericLiteral */; + // literals and unknown symbols + default: + // is a literal? Read the full word. + while (pos < len && isUnknownContentCharacter(code)) { + pos++; + code = text.charCodeAt(pos); + } + if (tokenOffset !== pos) { + value = text.substring(tokenOffset, pos); + // keywords: true, false, null + switch (value) { + case 'true': return token = 8 /* TrueKeyword */; + case 'false': return token = 9 /* FalseKeyword */; + case 'null': return token = 7 /* NullKeyword */; + } + return token = 16 /* Unknown */; + } + // some + value += String.fromCharCode(code); + pos++; + return token = 16 /* Unknown */; } } - - if (value !== null && typeof value === 'object') { - stack.push(value); - - if (Array.isArray(value)) { - parseState = 'beforeArrayValue'; - } else { - parseState = 'beforePropertyName'; - } - } else { - const current = stack[stack.length - 1]; - if (current == null) { - parseState = 'end'; - } else if (Array.isArray(current)) { - parseState = 'afterArrayValue'; - } else { - parseState = 'afterPropertyValue'; - } + function isUnknownContentCharacter(code) { + if (isWhiteSpace(code) || isLineBreak(code)) { + return false; + } + switch (code) { + case 125 /* closeBrace */: + case 93 /* closeBracket */: + case 123 /* openBrace */: + case 91 /* openBracket */: + case 34 /* doubleQuote */: + case 58 /* colon */: + case 44 /* comma */: + case 47 /* slash */: + return false; + } + return true; } -} - -function pop () { - stack.pop(); - - const current = stack[stack.length - 1]; - if (current == null) { - parseState = 'end'; - } else if (Array.isArray(current)) { - parseState = 'afterArrayValue'; - } else { - parseState = 'afterPropertyValue'; + function scanNextNonTrivia() { + var result; + do { + result = scanNext(); + } while (result >= 12 /* LineCommentTrivia */ && result <= 15 /* Trivia */); + return result; } + return { + setPosition: setPosition, + getPosition: function () { return pos; }, + scan: ignoreTrivia ? scanNextNonTrivia : scanNext, + getToken: function () { return token; }, + getTokenValue: function () { return value; }, + getTokenOffset: function () { return tokenOffset; }, + getTokenLength: function () { return pos - tokenOffset; }, + getTokenStartLine: function () { return lineStartOffset; }, + getTokenStartCharacter: function () { return tokenOffset - prevTokenLineStartOffset; }, + getTokenError: function () { return scanError; }, + }; } - -// This code is unreachable. -// function invalidParseState () { -// return new Error(`JSON5: invalid parse state '${parseState}'`) -// } - -// This code is unreachable. -// function invalidLexState (state) { -// return new Error(`JSON5: invalid lex state '${state}'`) -// } - -function invalidChar (c) { - if (c === undefined) { - return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) - } - - return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) +function isWhiteSpace(ch) { + return ch === 32 /* space */ || ch === 9 /* tab */ || ch === 11 /* verticalTab */ || ch === 12 /* formFeed */ || + ch === 160 /* nonBreakingSpace */ || ch === 5760 /* ogham */ || ch >= 8192 /* enQuad */ && ch <= 8203 /* zeroWidthSpace */ || + ch === 8239 /* narrowNoBreakSpace */ || ch === 8287 /* mathematicalSpace */ || ch === 12288 /* ideographicSpace */ || ch === 65279 /* byteOrderMark */; } - -function invalidEOF () { - return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) +function isLineBreak(ch) { + return ch === 10 /* lineFeed */ || ch === 13 /* carriageReturn */ || ch === 8232 /* lineSeparator */ || ch === 8233 /* paragraphSeparator */; } - -// This code is unreachable. -// function invalidToken () { -// if (token.type === 'eof') { -// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) -// } - -// const c = String.fromCodePoint(token.value.codePointAt(0)) -// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) -// } - -function invalidIdentifier () { - column -= 5; - return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`) +function isDigit(ch) { + return ch >= 48 /* _0 */ && ch <= 57 /* _9 */; } -function separatorChar (c) { - console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`); -} - -function formatChar (c) { - const replacements = { - "'": "\\'", - '"': '\\"', - '\\': '\\\\', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\v': '\\v', - '\0': '\\0', - '\u2028': '\\u2028', - '\u2029': '\\u2029', +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +var ParseOptions; +(function (ParseOptions) { + ParseOptions.DEFAULT = { + allowTrailingComma: false }; - - if (replacements[c]) { - return replacements[c] - } - - if (c < ' ') { - const hexString = c.charCodeAt(0).toString(16); - return '\\x' + ('00' + hexString).substring(hexString.length) +})(ParseOptions || (ParseOptions = {})); +/** + * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. + * Therefore always check the errors list to find out if the input was valid. + */ +function parse$1(text, errors, options) { + if (errors === void 0) { errors = []; } + if (options === void 0) { options = ParseOptions.DEFAULT; } + var currentProperty = null; + var currentParent = []; + var previousParents = []; + function onValue(value) { + if (Array.isArray(currentParent)) { + currentParent.push(value); + } + else if (currentProperty !== null) { + currentParent[currentProperty] = value; + } } - - return c -} - -function syntaxError (message) { - const err = new SyntaxError(message); - err.lineNumber = line; - err.columnNumber = column; - return err + var visitor = { + onObjectBegin: function () { + var object = {}; + onValue(object); + previousParents.push(currentParent); + currentParent = object; + currentProperty = null; + }, + onObjectProperty: function (name) { + currentProperty = name; + }, + onObjectEnd: function () { + currentParent = previousParents.pop(); + }, + onArrayBegin: function () { + var array = []; + onValue(array); + previousParents.push(currentParent); + currentParent = array; + currentProperty = null; + }, + onArrayEnd: function () { + currentParent = previousParents.pop(); + }, + onLiteralValue: onValue, + onError: function (error, offset, length) { + errors.push({ error: error, offset: offset, length: length }); + } + }; + visit(text, visitor, options); + return currentParent[0]; } - -var stringify = function stringify (value, replacer, space) { - const stack = []; - let indent = ''; - let propertyList; - let replacerFunc; - let gap = ''; - let quote; - - if ( - replacer != null && - typeof replacer === 'object' && - !Array.isArray(replacer) - ) { - space = replacer.space; - quote = replacer.quote; - replacer = replacer.replacer; +/** + * Parses the given text and invokes the visitor functions for each object, array and literal reached. + */ +function visit(text, visitor, options) { + if (options === void 0) { options = ParseOptions.DEFAULT; } + var _scanner = createScanner(text, false); + function toNoArgVisit(visitFunction) { + return visitFunction ? function () { return visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; }; } - - if (typeof replacer === 'function') { - replacerFunc = replacer; - } else if (Array.isArray(replacer)) { - propertyList = []; - for (const v of replacer) { - let item; - - if (typeof v === 'string') { - item = v; - } else if ( - typeof v === 'number' || - v instanceof String || - v instanceof Number - ) { - item = String(v); + function toOneArgVisit(visitFunction) { + return visitFunction ? function (arg) { return visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; }; + } + var onObjectBegin = toNoArgVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisit(visitor.onObjectProperty), onObjectEnd = toNoArgVisit(visitor.onObjectEnd), onArrayBegin = toNoArgVisit(visitor.onArrayBegin), onArrayEnd = toNoArgVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisit(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError); + var disallowComments = options && options.disallowComments; + var allowTrailingComma = options && options.allowTrailingComma; + function scanNext() { + while (true) { + var token = _scanner.scan(); + switch (_scanner.getTokenError()) { + case 4 /* InvalidUnicode */: + handleError(14 /* InvalidUnicode */); + break; + case 5 /* InvalidEscapeCharacter */: + handleError(15 /* InvalidEscapeCharacter */); + break; + case 3 /* UnexpectedEndOfNumber */: + handleError(13 /* UnexpectedEndOfNumber */); + break; + case 1 /* UnexpectedEndOfComment */: + if (!disallowComments) { + handleError(11 /* UnexpectedEndOfComment */); + } + break; + case 2 /* UnexpectedEndOfString */: + handleError(12 /* UnexpectedEndOfString */); + break; + case 6 /* InvalidCharacter */: + handleError(16 /* InvalidCharacter */); + break; } - - if (item !== undefined && propertyList.indexOf(item) < 0) { - propertyList.push(item); + switch (token) { + case 12 /* LineCommentTrivia */: + case 13 /* BlockCommentTrivia */: + if (disallowComments) { + handleError(10 /* InvalidCommentToken */); + } + else { + onComment(); + } + break; + case 16 /* Unknown */: + handleError(1 /* InvalidSymbol */); + break; + case 15 /* Trivia */: + case 14 /* LineBreakTrivia */: + break; + default: + return token; } } } - - if (space instanceof Number) { - space = Number(space); - } else if (space instanceof String) { - space = String(space); - } - - if (typeof space === 'number') { - if (space > 0) { - space = Math.min(10, Math.floor(space)); - gap = ' '.substr(0, space); - } - } else if (typeof space === 'string') { - gap = space.substr(0, 10); - } - - return serializeProperty('', {'': value}) - - function serializeProperty (key, holder) { - let value = holder[key]; - if (value != null) { - if (typeof value.toJSON5 === 'function') { - value = value.toJSON5(key); - } else if (typeof value.toJSON === 'function') { - value = value.toJSON(key); + function handleError(error, skipUntilAfter, skipUntil) { + if (skipUntilAfter === void 0) { skipUntilAfter = []; } + if (skipUntil === void 0) { skipUntil = []; } + onError(error); + if (skipUntilAfter.length + skipUntil.length > 0) { + var token = _scanner.getToken(); + while (token !== 17 /* EOF */) { + if (skipUntilAfter.indexOf(token) !== -1) { + scanNext(); + break; + } + else if (skipUntil.indexOf(token) !== -1) { + break; + } + token = scanNext(); } } - - if (replacerFunc) { - value = replacerFunc.call(holder, key, value); - } - - if (value instanceof Number) { - value = Number(value); - } else if (value instanceof String) { - value = String(value); - } else if (value instanceof Boolean) { - value = value.valueOf(); + } + function parseString(isValue) { + var value = _scanner.getTokenValue(); + if (isValue) { + onLiteralValue(value); } - - switch (value) { - case null: return 'null' - case true: return 'true' - case false: return 'false' + else { + onObjectProperty(value); } - - if (typeof value === 'string') { - return quoteString(value) - } - - if (typeof value === 'number') { - return String(value) + scanNext(); + return true; + } + function parseLiteral() { + switch (_scanner.getToken()) { + case 11 /* NumericLiteral */: + var tokenValue = _scanner.getTokenValue(); + var value = Number(tokenValue); + if (isNaN(value)) { + handleError(2 /* InvalidNumberFormat */); + value = 0; + } + onLiteralValue(value); + break; + case 7 /* NullKeyword */: + onLiteralValue(null); + break; + case 8 /* TrueKeyword */: + onLiteralValue(true); + break; + case 9 /* FalseKeyword */: + onLiteralValue(false); + break; + default: + return false; + } + scanNext(); + return true; + } + function parseProperty() { + if (_scanner.getToken() !== 10 /* StringLiteral */) { + handleError(3 /* PropertyNameExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); + return false; + } + parseString(false); + if (_scanner.getToken() === 6 /* ColonToken */) { + onSeparator(':'); + scanNext(); // consume colon + if (!parseValue()) { + handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); + } } - - if (typeof value === 'object') { - return Array.isArray(value) ? serializeArray(value) : serializeObject(value) + else { + handleError(5 /* ColonExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); } - - return undefined + return true; } - - function quoteString (value) { - const quotes = { - "'": 0.1, - '"': 0.2, - }; - - const replacements = { - "'": "\\'", - '"': '\\"', - '\\': '\\\\', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\v': '\\v', - '\0': '\\0', - '\u2028': '\\u2028', - '\u2029': '\\u2029', - }; - - let product = ''; - - for (let i = 0; i < value.length; i++) { - const c = value[i]; - switch (c) { - case "'": - case '"': - quotes[c]++; - product += c; - continue - - case '\0': - if (util.isDigit(value[i + 1])) { - product += '\\x00'; - continue + function parseObject() { + onObjectBegin(); + scanNext(); // consume open brace + var needsComma = false; + while (_scanner.getToken() !== 2 /* CloseBraceToken */ && _scanner.getToken() !== 17 /* EOF */) { + if (_scanner.getToken() === 5 /* CommaToken */) { + if (!needsComma) { + handleError(4 /* ValueExpected */, [], []); + } + onSeparator(','); + scanNext(); // consume comma + if (_scanner.getToken() === 2 /* CloseBraceToken */ && allowTrailingComma) { + break; } } - - if (replacements[c]) { - product += replacements[c]; - continue + else if (needsComma) { + handleError(6 /* CommaExpected */, [], []); } - - if (c < ' ') { - let hexString = c.charCodeAt(0).toString(16); - product += '\\x' + ('00' + hexString).substring(hexString.length); - continue + if (!parseProperty()) { + handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); } - - product += c; + needsComma = true; } - - const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b); - - product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]); - - return quoteChar + product + quoteChar - } - - function serializeObject (value) { - if (stack.indexOf(value) >= 0) { - throw TypeError('Converting circular structure to JSON5') + onObjectEnd(); + if (_scanner.getToken() !== 2 /* CloseBraceToken */) { + handleError(7 /* CloseBraceExpected */, [2 /* CloseBraceToken */], []); } - - stack.push(value); - - let stepback = indent; - indent = indent + gap; - - let keys = propertyList || Object.keys(value); - let partial = []; - for (const key of keys) { - const propertyString = serializeProperty(key, value); - if (propertyString !== undefined) { - let member = serializeKey(key) + ':'; - if (gap !== '') { - member += ' '; + else { + scanNext(); // consume close brace + } + return true; + } + function parseArray() { + onArrayBegin(); + scanNext(); // consume open bracket + var needsComma = false; + while (_scanner.getToken() !== 4 /* CloseBracketToken */ && _scanner.getToken() !== 17 /* EOF */) { + if (_scanner.getToken() === 5 /* CommaToken */) { + if (!needsComma) { + handleError(4 /* ValueExpected */, [], []); + } + onSeparator(','); + scanNext(); // consume comma + if (_scanner.getToken() === 4 /* CloseBracketToken */ && allowTrailingComma) { + break; } - member += propertyString; - partial.push(member); } - } - - let final; - if (partial.length === 0) { - final = '{}'; - } else { - let properties; - if (gap === '') { - properties = partial.join(','); - final = '{' + properties + '}'; - } else { - let separator = ',\n' + indent; - properties = partial.join(separator); - final = '{\n' + indent + properties + ',\n' + stepback + '}'; + else if (needsComma) { + handleError(6 /* CommaExpected */, [], []); + } + if (!parseValue()) { + handleError(4 /* ValueExpected */, [], [4 /* CloseBracketToken */, 5 /* CommaToken */]); } + needsComma = true; } - - stack.pop(); - indent = stepback; - return final - } - - function serializeKey (key) { - if (key.length === 0) { - return quoteString(key) + onArrayEnd(); + if (_scanner.getToken() !== 4 /* CloseBracketToken */) { + handleError(8 /* CloseBracketExpected */, [4 /* CloseBracketToken */], []); } - - const firstChar = String.fromCodePoint(key.codePointAt(0)); - if (!util.isIdStartChar(firstChar)) { - return quoteString(key) + else { + scanNext(); // consume close bracket } - - for (let i = firstChar.length; i < key.length; i++) { - if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) { - return quoteString(key) - } - } - - return key + return true; } - - function serializeArray (value) { - if (stack.indexOf(value) >= 0) { - throw TypeError('Converting circular structure to JSON5') + function parseValue() { + switch (_scanner.getToken()) { + case 3 /* OpenBracketToken */: + return parseArray(); + case 1 /* OpenBraceToken */: + return parseObject(); + case 10 /* StringLiteral */: + return parseString(true); + default: + return parseLiteral(); } - - stack.push(value); - - let stepback = indent; - indent = indent + gap; - - let partial = []; - for (let i = 0; i < value.length; i++) { - const propertyString = serializeProperty(String(i), value); - partial.push((propertyString !== undefined) ? propertyString : 'null'); - } - - let final; - if (partial.length === 0) { - final = '[]'; - } else { - if (gap === '') { - let properties = partial.join(','); - final = '[' + properties + ']'; - } else { - let separator = ',\n' + indent; - let properties = partial.join(separator); - final = '[\n' + indent + properties + ',\n' + stepback + ']'; - } + } + scanNext(); + if (_scanner.getToken() === 17 /* EOF */) { + if (options.allowEmptyContent) { + return true; } - - stack.pop(); - indent = stepback; - return final + handleError(4 /* ValueExpected */, [], []); + return false; } -}; - -const JSON5 = { - parse, - stringify, -}; - -var lib = JSON5; - -function trimEndSlash(str) { - if (str.endsWith('/') || str.endsWith('\\')) - return str.slice(0, -1); - return str; -} -function trimStartDot(str) { - if (str.startsWith('./')) - return str.slice(2); - return str; -} -function dirname(str) { - const parts = str.split(/[\/\\]/g); - return parts[parts.length - 2]; -} -function join(...parts) { - return parts.map(trimEndSlash).map(trimStartDot).join('/'); + if (!parseValue()) { + handleError(4 /* ValueExpected */, [], []); + return false; + } + if (_scanner.getToken() !== 17 /* EOF */) { + handleError(9 /* EndOfFileExpected */, [], []); + } + return true; } +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +/** + * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. + * Therefore, always check the errors list to find out if the input was valid. + */ +var parse = parse$1; + const isWebWorker = typeof self !== 'undefined' && typeof self.WorkerGlobalScope !== 'undefined'; const isBrowser = isWebWorker || (typeof window !== 'undefined' && @@ -2330,7 +1606,14 @@ async function _fetchAssets(filepath) { } } async function _fetchJSONAssets(filepath) { - return lib.parse(await _fetchAssets(filepath)); + const errors = []; + const rawTheme = parse(await _fetchAssets(filepath), errors, { + allowTrailingComma: true + }); + if (errors.length) { + throw errors[0]; + } + return rawTheme; } /** * @param themePath related path to theme.json @@ -2607,11 +1890,6 @@ function explainThemeScope(theme, scope, parentScopes) { return result; } -const FONT_STYLE_TO_CSS = { - [exports.FontStyle.Italic]: 'font-style: italic', - [exports.FontStyle.Bold]: 'font-weight: bold', - [exports.FontStyle.Underline]: 'text-decoration: underline' -}; function renderToHtml(lines, options = {}) { const bg = options.bg || '#fff'; let html = ''; @@ -2624,8 +1902,14 @@ function renderToHtml(lines, options = {}) { html += ``; l.forEach(token => { const cssDeclarations = [`color: ${token.color || options.fg}`]; - if (token.fontStyle > exports.FontStyle.None) { - cssDeclarations.push(FONT_STYLE_TO_CSS[token.fontStyle]); + if (token.fontStyle & exports.FontStyle.Italic) { + cssDeclarations.push('font-style: italic'); + } + if (token.fontStyle & exports.FontStyle.Bold) { + cssDeclarations.push('font-weight: bold'); + } + if (token.fontStyle & exports.FontStyle.Underline) { + cssDeclarations.push('text-decoration: underline'); } html += `${escapeHtml(token.content)}`; }); @@ -2744,7 +2028,7 @@ async function getHighlighter(options) { let _currentTheme; await _registry.loadLanguages(_languages); /** - * Shiki was designed for VSCode, so CSS variables are not currently supported. + * Shiki was designed for VS Code, so CSS variables are not currently supported. * See: https://github.com/shikijs/shiki/pull/212#issuecomment-906924986 * * Instead, we work around this by using valid hex color codes as lookups in a From 798f62a5806eaef767108500cc2810be92ff998c Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 12 Oct 2021 19:06:23 -0600 Subject: [PATCH 194/680] remove options for markdownit-anchor the permalinkSymbol hasn't been used since v7. no opts accomplishes the same thing --- src/http/get-docs-000lang-catchall/index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 555c229b..c9810bc6 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -86,9 +86,7 @@ async function handler (req) { highlight: await highlighter.forMarkdown() }) .use(markdownClass, classMapping) - .use(markdownAnchor, { - permalinkSymbol: ' ' - }) + .use(markdownAnchor) .use(frontmatterParser, function (str) { frontmatter = yaml.load(str) }) From 6c69c554b520f3673ffaf3aa09eaddc763ae4a17 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 12 Oct 2021 19:06:42 -0600 Subject: [PATCH 195/680] add favicon to playground --- public/playground.html | 3 +++ public/static.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/public/playground.html b/public/playground.html index 0b0f713f..67516e9a 100644 --- a/public/playground.html +++ b/public/playground.html @@ -2,6 +2,9 @@ + + + Architect Playground diff --git a/public/static.json b/public/static.json index a484ec54..116b0242 100644 --- a/public/static.json +++ b/public/static.json @@ -1,7 +1,7 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", "index.js": "index-272710e748.js", - "playground.html": "playground-d3d4c75ee9.html", + "playground.html": "playground-be6bd7b6cb.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", "components/arc-viewer.js": "components/arc-viewer-3de6ce2a83.js", From 93d9f109719a51c2374d5fb47a9b65f328ea0af5 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 12 Oct 2021 19:07:43 -0600 Subject: [PATCH 196/680] improve layering on mobile where pre blocks appear above top nav --- src/views/modules/document/top-nav.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/modules/document/top-nav.js b/src/views/modules/document/top-nav.js index 1e53398a..41753d9c 100644 --- a/src/views/modules/document/top-nav.js +++ b/src/views/modules/document/top-nav.js @@ -27,6 +27,7 @@ export default function TopNav () { col-start-1 col-end-3 text-g0 + z1 " > Date: Fri, 8 Oct 2021 18:39:22 -0600 Subject: [PATCH 197/680] reduce copy in function-config outline similar for project-manifest/aws adjust contrast of a couple text elements --- public/css/syntax.css | 3 ++ public/static.json | 2 +- .../markdown-class-mappings.js | 2 +- .../configuration/function-config.md | 20 ++++---- .../docs/en/reference/project-manifest/aws.md | 51 +++++++------------ .../docs/en/reference/project-manifest/ws.md | 2 +- 6 files changed, 34 insertions(+), 46 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 7c698c93..c2d5087a 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -1,6 +1,9 @@ .docs blockquote > p { margin: 0; } +.docs blockquote > p code { + background-color: var(--g2); +} /* all code font family */ .docs pre code, .docs :not(pre) > code { diff --git a/public/static.json b/public/static.json index 116b0242..8c3c8c12 100644 --- a/public/static.json +++ b/public/static.json @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-b7b5744cd1.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-2c5de4051e.css" + "css/syntax.css": "css/syntax-f7947528a2.css" } \ No newline at end of file diff --git a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js index 8ee7f391..7a7ad308 100644 --- a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js +++ b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js @@ -34,7 +34,7 @@ module.exports = { blockquote: [ 'mb-1', 'p0', - 'text-g8', + 'text-g9', 'bg-g1', 'border-solid', 'border-t0', diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md index f2160815..13e0e543 100644 --- a/src/views/docs/en/reference/configuration/function-config.md +++ b/src/views/docs/en/reference/configuration/function-config.md @@ -12,23 +12,19 @@ sections: - 'architecture' --- -Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`). +Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`) with the `@aws` pragma and the following properties: -- [`runtime`](#runtime) - Officially supported: one of `nodejs14.x` (default), `deno`, `python3.7`, `python3.6`, or `ruby.5`, etc. - Also configurable, but not officially supported by Architect: `java8`, `go1.x`, `dotnetcore2.1` +- [`runtime`](#runtime) - `nodejs14.x` (default), `deno`, `python3.7`, `python3.6`, or `ruby.5`, etc. - [`memory`](#memory) - number, between `128`MB and `3008`MB in 64 MB increments. - Memory size also directly correlates with CPU speed; higher memory levels are available in more capable Lambda clusters - [`timeout`](#timeout) - number, in seconds (max `900`) - [`concurrency`](#concurrency) - number, `0` to AWS account maximum (if not present, concurrency is unthrottled) - [`layers`](#layers) - Up to 5 Lambda layer ARNs; **must be in the same region as deployed** -- [`policies`](#policies) - configure [AWS SAM policy templates](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html) -- [`architecture`](#architecture) [AWS Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) - - `x86_64` (default) 64-bit x86 architecture, for x86-based processors - - `arm64` 64-bit ARM architecture, for the AWS Graviton2 processor. This only works if your region supports it. **Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. +- [`policies`](#policies) - Configure [AWS SAM policy templates](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html) +- [`architecture`](#architecture) - [AWS Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) for the function: `x86_64` (default) or `arm64` > Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB. -### Example +### Example `config.arc` ```arc @aws @@ -70,6 +66,8 @@ runtime deno Configure Lambda function `memory` between `128` MB to `10240` MB, in `1` MB increments. +Memory size also directly correlates with CPU speed; higher memory levels are available in more capable Lambda clusters + ### Example ```arc @@ -182,9 +180,9 @@ policies S3CrudPolicy architect-default-policies ## `architecture` -Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. `arm64` only works if your region supports it. +Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. `arm64` only available in supported AWS regions. -> **Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. +> Note: locally, Architect Sandbox executes the function's runtime with your machine's native architecture. ### Example diff --git a/src/views/docs/en/reference/project-manifest/aws.md b/src/views/docs/en/reference/project-manifest/aws.md index 992120e9..c3531983 100644 --- a/src/views/docs/en/reference/project-manifest/aws.md +++ b/src/views/docs/en/reference/project-manifest/aws.md @@ -7,24 +7,25 @@ description: Define AWS specific configuration. Define AWS specific configuration. ## Syntax -- Accepts values for the following keys: - - `region`: [AWS region ID](https://docs.aws.amazon.com/general/latest/gr/rande.html) of the region you'll deploy this project to - - If not specified, defaults to `us-west-2` - - `profile`: name of the profile you prefer to use with this project, as defined in your local [AWS profile](/quickstart) - - Can also be specified in `AWS_PROFILE` environment variable - - Required to deploy to AWS - - `runtime`: Lambda runtime, can be one of: - - `nodejs14.x`, `nodejs12.x`, `deno`, `python3.8`, `python3.7`, `python3.6`, `go1.x`, `ruby2.7`, `ruby2.5`, `dotnetcore3.1`, `dotnetcore2.1`, `java11`, `java8` - - `bucket`: bucket (in same region) for CloudFormation deployment artifacts - - If not specified, a secure deployment bucket will be auto-created for your app - - `apigateway`: API Gateway API type, can be one of: - - `http` (default) - `HTTP` API + Lambda payload format version 2.0 - - `httpv2` – aliased to `http` - - `httpv1` - `HTTP` API + Lambda payload format version 1.0 - - `rest` - `REST` API + original API Gateway payload format - - `architecture` Lambda [CPU Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) - - `x86_64` - (default) 64-bit x86 architecture, for x86-based processors - - `arm64` - 64-bit ARM architecture, for the AWS Graviton2 processor. This only works if your region supports it. **Warning** the architect sandbox doesn't not yet have support for ARM architectures so be wary of packages with binary modules. + +- `region`: [AWS region ID](https://docs.aws.amazon.com/general/latest/gr/rande.html) of the region you'll deploy this project to + - If not specified, defaults to `us-west-2` +- `profile`: name of the profile you prefer to use with this project, as defined in your local [AWS profile](/quickstart) + - Can also be specified in `AWS_PROFILE` environment variable + - Required to deploy to AWS +- `runtime`: Lambda runtime, can be one of: + - `nodejs14.x` (default), `nodejs12.x`, `deno`, `python3.8`, `python3.7`, `python3.6`, `ruby2.7`, `ruby2.5` + - Unsupported by [Sandbox](/docs/en/reference/cli/sandbox): `go1.x`, `dotnetcore3.1`, `dotnetcore2.1`, `java11`, `java8` +- `bucket`: bucket (in same region) for CloudFormation deployment artifacts + - If not specified, a secure deployment bucket will be auto-created for your app +- `apigateway`: API Gateway API type, can be one of: + - `http` (default) - `HTTP` API + Lambda payload format version 2.0 + - `httpv2` – aliased of `http` + - `httpv1` - `HTTP` API + Lambda payload format version 1.0 + - `rest` - `REST` API + original API Gateway payload format +- `architecture`: Lambda [CPU Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) + - `x86_64` (default) - 64-bit x86 architecture + - `arm64` - (only available in certain AWS regions) 64-bit ARM architecture Alternatively, if you want a less granular approach, you can declare your preferred region and profile in your `.bashrc` ([more information here](https://docs.aws.amazon.com/cli/latest/userguide/cli-environment.html)). @@ -35,13 +36,10 @@ If you have AWS exports in your `.bashrc` and `@aws` specified in your `app.arc` For example, to deploy to the northern California AWS AZ with your AWS `work` profile's credentials, use: -
    -
    arc
    -
    ```arc @@ -51,13 +49,10 @@ profile work ```
    -
    -
    json
    -
    ```json @@ -70,13 +65,10 @@ profile work ```
    -
    -
    toml
    -
    ```toml @@ -86,13 +78,10 @@ profile="work" ```
    -
    -
    yaml
    -
    ```yaml @@ -103,11 +92,9 @@ aws: ```
    -
    -
    diff --git a/src/views/docs/en/reference/project-manifest/ws.md b/src/views/docs/en/reference/project-manifest/ws.md index df7d93c8..6796cb44 100644 --- a/src/views/docs/en/reference/project-manifest/ws.md +++ b/src/views/docs/en/reference/project-manifest/ws.md @@ -113,4 +113,4 @@ The functions created by the `@ws` pragma handle events from a WebSocket client. To publish a message to a WebSocket client you can use arc's runtime library `@architect/functions`' `ws.send` method. You can call this method from any of your application's functions. -Docs: [node](/docs/en/reference/runtime-helpers/node.js#arc.ws) - [ruby](/docs/en/reference/runtime-helpers/ruby#arc.ws) - [python](/docs/en/reference/runtime-helpers/python#arc.ws) +Docs: [Node.js](/docs/en/reference/runtime-helpers/node.js#arc.ws) - [Ruby](/docs/en/reference/runtime-helpers/ruby#arc.ws) - [Python](/docs/en/reference/runtime-helpers/python#arc.ws) From c9151a6e52d67b8d13cdc03f262745b10f9992e6 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 13 Oct 2021 09:26:14 -0600 Subject: [PATCH 198/680] move Arc configuration to app.arc fixes #423 --- app.arc | 17 +++++++++++++++++ package.json | 27 --------------------------- 2 files changed, 17 insertions(+), 27 deletions(-) create mode 100644 app.arc diff --git a/app.arc b/app.arc new file mode 100644 index 00000000..13460403 --- /dev/null +++ b/app.arc @@ -0,0 +1,17 @@ +@app +v8-arc-codes + +@aws +region us-west-1 +profile openjsf +bucket arc.codes-deploy +apigateway http + +@static +folder public +fingerprint true + +@http +get /docs/:lang/* +get /api/package +any /* diff --git a/package.json b/package.json index e2919cc1..80ca57a0 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,6 @@ { "name": "@architect/arc.codes", "version": "3.6.2", - "architect": { - "app": "v8-arc-codes", - "aws": { - "region": "us-west-1", - "profile": "openjsf", - "bucket": "arc.codes-deploy", - "apigateway": "http" - }, - "static": { - "folder": "public", - "fingerprint": true - }, - "http": [ - [ - "get", - "/docs/:lang/*" - ], - [ - "get", - "/api/package" - ], - [ - "any", - "/*" - ] - ] - }, "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", From d37432e01b5a858d107b9f9e0ae970c9e7b3346a Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 13 Oct 2021 11:33:35 -0600 Subject: [PATCH 199/680] 3.6.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 80ca57a0..cada70eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.2", + "version": "3.6.3", "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", From 1853d598c50a3799e97a593b8cefcd847a6989c6 Mon Sep 17 00:00:00 2001 From: filmaj Date: Sun, 17 Oct 2021 12:01:57 -0400 Subject: [PATCH 200/680] Adding documentation for index projections (relates to architect/architect#1083) --- .../en/reference/project-manifest/indexes.md | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/views/docs/en/reference/project-manifest/indexes.md b/src/views/docs/en/reference/project-manifest/indexes.md index 72b82812..a2e8b972 100644 --- a/src/views/docs/en/reference/project-manifest/indexes.md +++ b/src/views/docs/en/reference/project-manifest/indexes.md @@ -22,10 +22,17 @@ Defines [Global Secondary Indexes][gsi] for your project's [DynamoDB][ddb] table - Sort key, defined by `**`, is optional - Currently only `*String`, `**String`, `*Number` and `**Number` are supported - An optional `name` property can be provided to explicitly name the index. This is helpful when [querying the index with the AWS SDK as you know what to pass to the `IndexName` query parameter](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#query-property) +- An optional `projection` property can be provided to explicitly define which [item attributes get projected][projection], or included, in query results. By default, arc will project _all_ item attributes (the `ALL` projection type as described in the [DynamoDB documentation on attribute projections][projection]) + - 💸 Customizing which attributes to project can be helpful when trying to save on [storage costs][pricing] + - Note that once a projection is defined, it cannot be changed; a new index would need to be created + - Acceptable values for `projection` are: + - `all`: the default, all item attributes from the table are projected into the index + - `keys`: only the base table primary (and sort, if defined) keys as well as the index primary (and sort, if defined) keys are projected into the index + - custom: otherwise, you may define one or more attribute names to explicitly project into the index. Note that the base table and index keys always get projected ## Example -The following `app.arc` file defines a [DynamoDB][ddb] table with two [Global Secondary Indexes][gsi]: +The following `app.arc` file defines a [DynamoDB][ddb] table with two named [Global Secondary Indexes][gsi], both with `projection` explicitly defined: @@ -45,10 +52,12 @@ accounts @indexes accounts email *String + projection keys # only project base table and index keys (in this example that would be accountID and email) name byEmail accounts created *String + projection updated lastAccessed # only project base table and index keys plus the updated and lastAccessed attributes name byDate ``` @@ -65,8 +74,8 @@ accounts { "accounts": { "accountID": "*String" } } ], "indexes": [ - { "accounts": { "email": "*String", "name": "byEmail" } }, - { "accounts": { "created": "*String", "name": "byDate" } } + { "accounts": { "email": "*String", "name": "byEmail", "projection": "keys" } }, + { "accounts": { "created": "*String", "name": "byDate", "projection": ["updated", "lastAccessed"] } } ] } ``` @@ -85,8 +94,8 @@ app="testapp" accountID="*String" indexes = [ -{ "accounts" = { "email" = "*String", "name" = "byEmail" } }, -{ "accounts" = { "created" = "*String", "name" = "byDate" } } +{ "accounts" = { "email" = "*String", "name" = "byEmail", "projection" = "keys" } }, +{ "accounts" = { "created" = "*String", "name" = "byDate", "projection" = ["updated", "lastAccessed"] } } ] ``` @@ -108,9 +117,11 @@ indexes: - accounts: - email: "*String" - name: "byEmail" + - projection: "keys" - accounts: - created: "*String" - name: "byDate" + - projection: ["updated", "lastAccessed"] ``` @@ -122,3 +133,5 @@ indexes: [core]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html [ddb]: https://aws.amazon.com/documentation/dynamodb/ [gsi]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html +[projection]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Projections +[pricing]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.StorageConsiderations From 21fb75526c6ff9e8db45bc7aabfe541b1a6f3155 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 18 Oct 2021 19:29:06 -0600 Subject: [PATCH 201/680] add tutorials and app-development stubs --- scripts/dictionary.js | 3 +++ .../docs/en/app-development/cloud-functions.md | 9 +++++++++ src/views/docs/en/app-development/code-sharing.md | 9 +++++++++ src/views/docs/en/app-development/debugging.md | 5 +++++ .../en/app-development/environment-variables.md | 9 +++++++++ src/views/docs/en/app-development/event-queues.md | 5 +++++ .../en/app-development/function-dependencies.md | 10 ++++++++++ .../en/app-development/logging-and-monitoring.md | 5 +++++ src/views/docs/en/app-development/routes.md | 9 +++++++++ .../docs/en/app-development/scheduled-tasks.md | 5 +++++ src/views/docs/en/app-development/sessions.md | 9 +++++++++ src/views/docs/en/app-development/static-assets.md | 5 +++++ .../docs/en/app-development/working-locally.md | 13 +++++++++++++ src/views/docs/en/tutorials/beyond-hello-world.md | 14 ++++++++++++++ src/views/docs/en/tutorials/configuring-aws.md | 13 +++++++++++++ src/views/docs/en/tutorials/using-plugins.md | 14 ++++++++++++++ 16 files changed, 137 insertions(+) create mode 100644 src/views/docs/en/app-development/cloud-functions.md create mode 100644 src/views/docs/en/app-development/code-sharing.md create mode 100644 src/views/docs/en/app-development/debugging.md create mode 100644 src/views/docs/en/app-development/environment-variables.md create mode 100644 src/views/docs/en/app-development/event-queues.md create mode 100644 src/views/docs/en/app-development/function-dependencies.md create mode 100644 src/views/docs/en/app-development/logging-and-monitoring.md create mode 100644 src/views/docs/en/app-development/routes.md create mode 100644 src/views/docs/en/app-development/scheduled-tasks.md create mode 100644 src/views/docs/en/app-development/sessions.md create mode 100644 src/views/docs/en/app-development/static-assets.md create mode 100644 src/views/docs/en/app-development/working-locally.md create mode 100644 src/views/docs/en/tutorials/beyond-hello-world.md create mode 100644 src/views/docs/en/tutorials/configuring-aws.md create mode 100644 src/views/docs/en/tutorials/using-plugins.md diff --git a/scripts/dictionary.js b/scripts/dictionary.js index fd7fa962..39c4e121 100644 --- a/scripts/dictionary.js +++ b/scripts/dictionary.js @@ -1,4 +1,5 @@ let dictionary = [ + '.env', '.vimrc', '`build`ing', 'ACM', @@ -167,6 +168,8 @@ let dictionary = [ 'Lex', 'lifecycle', 'linter', + 'localhost', + 'localhost:3333', 'LTS', 'macOS', 'Microservices', diff --git a/src/views/docs/en/app-development/cloud-functions.md b/src/views/docs/en/app-development/cloud-functions.md new file mode 100644 index 00000000..3bbdb022 --- /dev/null +++ b/src/views/docs/en/app-development/cloud-functions.md @@ -0,0 +1,9 @@ +--- +title: Developing with cloud functions +category: App development +description: +sections: + - "Overview" + - "Principles & key concepts" + - "Using cloud function middleware" +--- diff --git a/src/views/docs/en/app-development/code-sharing.md b/src/views/docs/en/app-development/code-sharing.md new file mode 100644 index 00000000..d0b96f9f --- /dev/null +++ b/src/views/docs/en/app-development/code-sharing.md @@ -0,0 +1,9 @@ +--- +title: Code sharing across functions +category: App development +description: +sections: + - "Principles" + - "Shared" + - "Views" +--- diff --git a/src/views/docs/en/app-development/debugging.md b/src/views/docs/en/app-development/debugging.md new file mode 100644 index 00000000..cfb71543 --- /dev/null +++ b/src/views/docs/en/app-development/debugging.md @@ -0,0 +1,5 @@ +--- +title: Debugging Architect applications +category: App development +description: +--- diff --git a/src/views/docs/en/app-development/environment-variables.md b/src/views/docs/en/app-development/environment-variables.md new file mode 100644 index 00000000..2a27a0f1 --- /dev/null +++ b/src/views/docs/en/app-development/environment-variables.md @@ -0,0 +1,9 @@ +--- +title: Managing environment variables +category: App development +description: +sections: + - "Overview" + - "Architect environments" # testing, staging, production + - "Local environment variables" # prefs.arc + .env; when they are synced vs. not synced +--- diff --git a/src/views/docs/en/app-development/event-queues.md b/src/views/docs/en/app-development/event-queues.md new file mode 100644 index 00000000..36f17d34 --- /dev/null +++ b/src/views/docs/en/app-development/event-queues.md @@ -0,0 +1,5 @@ +--- +title: Building async events & queues +category: App development +description: Background tasks +--- diff --git a/src/views/docs/en/app-development/function-dependencies.md b/src/views/docs/en/app-development/function-dependencies.md new file mode 100644 index 00000000..022f24c1 --- /dev/null +++ b/src/views/docs/en/app-development/function-dependencies.md @@ -0,0 +1,10 @@ +--- +title: Function dependencies +category: App development +description: +sections: + - "Overview" + - "Updating dependencies" + - "Hydrating dependencies" + - "Dependency management" +--- diff --git a/src/views/docs/en/app-development/logging-and-monitoring.md b/src/views/docs/en/app-development/logging-and-monitoring.md new file mode 100644 index 00000000..6da61f82 --- /dev/null +++ b/src/views/docs/en/app-development/logging-and-monitoring.md @@ -0,0 +1,5 @@ +--- +title: Logging and monitoring +category: App development +description: +--- diff --git a/src/views/docs/en/app-development/routes.md b/src/views/docs/en/app-development/routes.md new file mode 100644 index 00000000..cc32af31 --- /dev/null +++ b/src/views/docs/en/app-development/routes.md @@ -0,0 +1,9 @@ +--- +title: Building HTTP & WebSocket routes +category: App development +description: +sections: + - "Overview" + - "HTTP routes" + - "WebSocket routes" +--- diff --git a/src/views/docs/en/app-development/scheduled-tasks.md b/src/views/docs/en/app-development/scheduled-tasks.md new file mode 100644 index 00000000..48cdfc68 --- /dev/null +++ b/src/views/docs/en/app-development/scheduled-tasks.md @@ -0,0 +1,5 @@ +--- +title: Building scheduled tasks +category: App development +description: cron jobs +--- diff --git a/src/views/docs/en/app-development/sessions.md b/src/views/docs/en/app-development/sessions.md new file mode 100644 index 00000000..2cc39757 --- /dev/null +++ b/src/views/docs/en/app-development/sessions.md @@ -0,0 +1,9 @@ +--- +title: Using HTTP & WebSocket sessions +category: App development +description: +sections: + - "Overview" + - "HTTP sessions" + - "WebSocket routes" +--- diff --git a/src/views/docs/en/app-development/static-assets.md b/src/views/docs/en/app-development/static-assets.md new file mode 100644 index 00000000..ef728f34 --- /dev/null +++ b/src/views/docs/en/app-development/static-assets.md @@ -0,0 +1,5 @@ +--- +title: Using static assets +category: App development +description: +--- diff --git a/src/views/docs/en/app-development/working-locally.md b/src/views/docs/en/app-development/working-locally.md new file mode 100644 index 00000000..5e61f6e3 --- /dev/null +++ b/src/views/docs/en/app-development/working-locally.md @@ -0,0 +1,13 @@ +--- +title: Working locally and offline +category: App development +description: +sections: + - "Overview + - "Initializing new functions" # arc init, preferences + - "Environment variables" # prefs.arc + .env + - "Previewing" # localhost:3333 + - "Testing HTTP routes & endpoints" + - "Testing events & queues" # future: add queues, scheduled + - "Testing database tables & indexes" +--- diff --git a/src/views/docs/en/tutorials/beyond-hello-world.md b/src/views/docs/en/tutorials/beyond-hello-world.md new file mode 100644 index 00000000..674455eb --- /dev/null +++ b/src/views/docs/en/tutorials/beyond-hello-world.md @@ -0,0 +1,14 @@ +--- +title: 'Going Beyond "Hello World"' +category: Tutorials +description: Next steps in developing an application with Architect +sections: + - "Static assets + CDNs" + - "Database tables" + - "Environment variables" + - "CI/CD" + - "Event functions" + - "Scheduled Functions" + - "Queue functions" + - "Macros" +--- diff --git a/src/views/docs/en/tutorials/configuring-aws.md b/src/views/docs/en/tutorials/configuring-aws.md new file mode 100644 index 00000000..01cda9dd --- /dev/null +++ b/src/views/docs/en/tutorials/configuring-aws.md @@ -0,0 +1,13 @@ +--- +title: Configuring AWS +category: Tutorials +description: Set up your Architect project for AWS +sections: + - "Get AWS IAM credentials" + - "Minimum viable permissions" + - "Configure AWS CLI" + - "Working with multiple profiles" + - "Credentials file vs. environment variables" + - "Deploy buckets" + - "Default runtime" +--- diff --git a/src/views/docs/en/tutorials/using-plugins.md b/src/views/docs/en/tutorials/using-plugins.md new file mode 100644 index 00000000..a7c3efc0 --- /dev/null +++ b/src/views/docs/en/tutorials/using-plugins.md @@ -0,0 +1,14 @@ +--- +title: Using Architect plugins +category: Tutorials +description: Install and use Arc plugins +sections: + - "Overview" + - "Installation" + - "Plugin API" + - "Helper methods" + - "Examples" + # - "Modeling & persisting data" + # - "Building single page apps (SPAs); include aliasing" + # - "Implementing CORS" +--- From 6c1ef866347f82141152fdf2acae3864cfdd1d99 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 06:32:59 -0600 Subject: [PATCH 202/680] copy domains to tutorials --- .../en/tutorials/set-up-a-domain/overview.md | 52 ++++++++++++++++ .../set-up-a-domain/registrars/dreamhost.md | 62 +++++++++++++++++++ .../set-up-a-domain/registrars/godaddy.md | 58 +++++++++++++++++ .../set-up-a-domain/registrars/namecheap.md | 60 ++++++++++++++++++ .../set-up-a-domain/registrars/one.md | 60 ++++++++++++++++++ .../registrars/route53-and-cloudfront.md | 53 ++++++++++++++++ .../set-up-a-domain/registrars/route53.md | 51 +++++++++++++++ 7 files changed, 396 insertions(+) create mode 100644 src/views/docs/en/tutorials/set-up-a-domain/overview.md create mode 100644 src/views/docs/en/tutorials/set-up-a-domain/registrars/dreamhost.md create mode 100644 src/views/docs/en/tutorials/set-up-a-domain/registrars/godaddy.md create mode 100644 src/views/docs/en/tutorials/set-up-a-domain/registrars/namecheap.md create mode 100644 src/views/docs/en/tutorials/set-up-a-domain/registrars/one.md create mode 100644 src/views/docs/en/tutorials/set-up-a-domain/registrars/route53-and-cloudfront.md create mode 100644 src/views/docs/en/tutorials/set-up-a-domain/registrars/route53.md diff --git a/src/views/docs/en/tutorials/set-up-a-domain/overview.md b/src/views/docs/en/tutorials/set-up-a-domain/overview.md new file mode 100644 index 00000000..6435545f --- /dev/null +++ b/src/views/docs/en/tutorials/set-up-a-domain/overview.md @@ -0,0 +1,52 @@ +--- +title: Setting up a domain +category: Tutorials +description: Setting up a domain for an Architect application +sections: + - "Overview" + - "DNS guides" + - "Setting up your project" +--- + +## Give your Architect application a proper domain name + +DNS is how you assign a domain name to a deployed app. This guide lists ways to set up custom DNS with several popular DNS providers and we are always happy to accept contributions for steps to use additional providers. + +You may use a free registrar-based DNS to host your domain such as GoDaddy, Namecheap, One, etc., but Route53 is the preferred registrar and DNS management system for Architect users. This is because: + +- It's integrated with Amazon's other cloud services. +- Your DNS will resolve from 15+ locations worldwide, making your website faster for your end-users. +- Route53 is a DNS management system (Smart DNS) compared to all the others, which are merely domain registrars with a limited feature set for manipulating DNS. + +## Setting up your project + +To prepare your arc app for setting up a custom domain, you first have to deploy your app to `staging` and `production`. + +Deploy to a `staging` stack: + +```bash +arc deploy +``` +> Protip: create additional `staging` stacks with `--name` + +Ship a `production` stack: + +```bash +arc deploy production +``` + +All done! + +> Remember to save the two generated `URLs` because we will need to input these into the AWS console in the next steps. + +## DNS guides + +Setting up a custom domain for each registrar will be a bit different. To manually configure DNS, you can follow these guides below: + + +- [Route53](/docs/en/guides/domains/registrars/route53) +- [Route53 & CloudFront](/docs/en/guides/domains/registrars/route53-and-cloudfront) +- [Dreamhost](/docs/en/guides/domains/registrars/dreamhost) +- [GoDaddy](/docs/en/guides/domains/registrars/godaddy) +- [Namecheap](/docs/en/guides/domains/registrars/namecheap) +- [One](/docs/en/guides/domains/registrars/one) diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/dreamhost.md b/src/views/docs/en/tutorials/set-up-a-domain/registrars/dreamhost.md new file mode 100644 index 00000000..46dc140a --- /dev/null +++ b/src/views/docs/en/tutorials/set-up-a-domain/registrars/dreamhost.md @@ -0,0 +1,62 @@ +--- +title: Dreamhost +category: Domain Registrars +description: Setting up a domain name with Dreamhost +--- + +## Prerequisites + +- Sign up for a domain on [Dreamhost](https://www.dreamhost.com/domains/) +- Make sure your domain is set to `DNS Only` in the Dreamhost console. +- Deploy an app with Architect and make note of the `staging` and `production` URLs +- Make sure your app is deployed to `us-east-1` +- Ensure the `@app` name is uniquely named after the domain. + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Open up Dreamhost backend and click `Manage Domains` +- Click the `DNS` link under your domain to add custom DNS records +- Create CNAME records of both issued certificates +- Wait until they change from `pending` to `success` + +## Step 2: setup CloudFront + +Generate a CloudFront distribution with the certificate from step 1. + +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Open API Gateway and make note of the Invoke URL. +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` +- Repeat for `staging` domain. + +## Step 3: configure the domain Alias in Dreamhost + +Add `Alias` and `CNAME` records to DNS. + +- Sign into Dreamhost +- Navigate to the domain by clicking `Manage Domains` in the sidebar. +- Click `DNS` under the domain +- Click `Add Record` +- Use record type `Alias` for the root domain. + - Leave `Host` input blank and add the CloudFront domain that was created in step 2 to the `Points to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the CloudFront domain that was created in step 2 to the `Points to` input. +- Click `Add records` + +## Conclusion + +Now we're done! You can check to see if your domains are online with the DNS checker tool provided by Dreamhost. You can also use this [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/godaddy.md b/src/views/docs/en/tutorials/set-up-a-domain/registrars/godaddy.md new file mode 100644 index 00000000..40e8a635 --- /dev/null +++ b/src/views/docs/en/tutorials/set-up-a-domain/registrars/godaddy.md @@ -0,0 +1,58 @@ +--- +title: GoDaddy +category: Domain Registrars +description: Setting up a domain name with GoDaddy +--- + +## Prerequisites + +- Sign up for a domain on [GoDaddy](https://www.godaddy.com/) +- Deploy an app with Architect and make note of the `staging` and `production` URLs +- Ensure the app is deployed to `us-east-1` +- Ensure the `@app` name is uniquely named after the domain. + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Open up GoDaddy account dashboard and find the `DNS` settings for the particular domain you want to use. +- Click `ADD` and select `CNAME` +- Create CNAME records of both issued certificates +- Wait until they change from `pending` to `success` + +## Step 2: setup CloudFront + +Generate a CloudFront distribution with the certificate from step 1. + +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Open API Gateway and make note of the `Invoke URL`. +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` +- Repeat for `staging` domain. + +## Step 3: configure the domain Alias in GoDaddy + +Add `A` and `CNAME` records to DNS. + +- Open up GoDaddy account dashboard and find the `DNS` settings for the particular domain you want to use. +- Click `ADD`. +- Use record type `A` for the root domain. + - Leave `Host` input empty and add the IP address of the CloudFront domain that was created in step 2 to the `Points to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the CloudFront domain that was created in step 2 to the `Points to` input. + +## Conclusion + +Now we're done! You can check to see if your domains are online with the DNS checker tool [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/namecheap.md b/src/views/docs/en/tutorials/set-up-a-domain/registrars/namecheap.md new file mode 100644 index 00000000..0b8caae8 --- /dev/null +++ b/src/views/docs/en/tutorials/set-up-a-domain/registrars/namecheap.md @@ -0,0 +1,60 @@ +--- +title: Namecheap +category: Domain Registrars +description: Setting up a domain name with Namecheap +--- + +## Prerequisites + +- Sign up for a domain on [Namecheap](https://www.Namecheap.com/domains/) +- Deploy an app with Architect and make note of the `staging` and `production` URLs +- Make sure your app is deployed to `us-east-1` +- Ensure the `@app` name is uniquely named after the domain. + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Open up Namecheap account dashboard and click `Manage` for the particular domain you want to use. +- Open the `Advanced DNS` tab. +- Click `ADD A NEW RECORD` +- Create CNAME records of both issued certificates +- Wait until they change from `pending` to `success` + +## Step 2: setup CloudFront + +Generate a CloudFront distribution with the certificate from step 1. + +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Open API Gateway and make note of the `Invoke URL`. +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` +- Repeat for `staging` domain. + +## Step 3: configure the domain Alias in Namecheap + +Add `Alias` and `CNAME` records to DNS. + +- Open up Namecheap account dashboard and click `Manage` for the particular domain you want to use. +- Open the `Advanced DNS` tab. +- Click `ADD A NEW RECORD` +- Use record type `Alias` for the root domain. + - Add `@` in the `Host` input and add the CloudFront domain that was created in step 2 to the `Value` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Host` input and add the CloudFront domain that was created in step 2 to the `Value` input. + +## Conclusion + +Now we're done! You can check to see if your domains are online with the DNS checker tool [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/one.md b/src/views/docs/en/tutorials/set-up-a-domain/registrars/one.md new file mode 100644 index 00000000..f17bb460 --- /dev/null +++ b/src/views/docs/en/tutorials/set-up-a-domain/registrars/one.md @@ -0,0 +1,60 @@ +--- +title: One +category: Domain Registrars +description: Setting up a domain name with One +--- + +## Prerequisites + +- Sign up for a domain on [One](https://www.one.com/en/domain) +- Deploy an app with Architect and make note of the `staging` and `production` URLs +- Ensure the app is deployed to `us-east-1` +- Ensure the `@app` name is uniquely named after the domain. + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Open up One account dashboard and click `DNS settings` for the particular domain you want to use. +- Open the `DNS records` tab. +- Click the `CNAME` tab in the `Create new record` box +- Create CNAME records of both issued certificates +- Wait until they change from `pending` to `success` + +## Step 2: setup CloudFront + +Generate a CloudFront distribution with the certificate from step 1. + +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Open API Gateway and make note of the `Invoke URL`. +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Add the `Alternate Domain Names (CNAMEs)` that you will be using. ex. `example.com`. +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` +- Repeat for `staging` domain. + +## Step 3: configure the domain Alias in One + +Add `A` and `CNAME` records to DNS. + +- Open up One account dashboard and click `DNS settings` for the particular domain you want to use. +- Open the `DNS records` tab. +- Click the `A` tab in the `Create new record` box +- Use record type `A` for the root domain. + - Leave `Hostname` input empty and add the IP address of the CloudFront domain that was created in step 2 to the `Will point to` input. +- Use record type `CNAME` for the `staging` domain. + - Add the word `staging` to the `Hostname` input and add the CloudFront domain that was created in step 2 to the `Is an alias of` input. + +## Conclusion + +Now we're done! You can check to see if your domains are online with the DNS checker tool [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/route53-and-cloudfront.md b/src/views/docs/en/tutorials/set-up-a-domain/registrars/route53-and-cloudfront.md new file mode 100644 index 00000000..5e00cab5 --- /dev/null +++ b/src/views/docs/en/tutorials/set-up-a-domain/registrars/route53-and-cloudfront.md @@ -0,0 +1,53 @@ +--- +title: Route53 & CloudFront +category: Domain Registrars +description: Setting up a domain name with Route53 and CloudFront +--- + +## Prerequisites + +- [Register](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html) or [transfer](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) a domain with Route53 +- Deploy an app with Architect and make note of the `staging` and `production` URLs + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Expand the domain and click `Create record in Route53` button +- Verify CNAME record created in Route53 console Hosted zone + +## Step 2: setup CloudFront + +Generate a CloudFront distribution with the certificate from step 1. + +- Sign into AWS CloudFront in the AWS Console +- Click `Create Distribution` and then click `Get Started` +- Enter the URL from API Gateway in `Origin Domain Name` +- Set `Origin Protocol Policy` to `Match Viewer` +- Set `Viewer Protocol Policy` to `Redirect HTTP to HTTPS` +- Set `Allowed HTTP Methods` to `GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE` +- Set `Compress Objects Automatically` to `Yes` +- Enter the domain alias in `Alternate Domain Names` (which you will configure in step 3) +- Set `SSL Certificate` to `Custom SSL Certificate` and select the cert from step 1 +- Click `Create Distribution` + +## Step 3: configure the domain Alias in AWS Route53 + +- Sign into AWS Route53 in the AWS Console +- Navigate to the Hosted zone for the domain +- Click `Create record` +- Enter the `Record name` +- Record type is `A` and toggle `Alias` checkbox on +- Select `Alias to CloudFront` +- Select the region +- Select the CloudFront distribution domain (should be the same value as the domain generated in Step 2) +- Click `Create records` + +## Conclusion + +Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/route53.md b/src/views/docs/en/tutorials/set-up-a-domain/registrars/route53.md new file mode 100644 index 00000000..58491512 --- /dev/null +++ b/src/views/docs/en/tutorials/set-up-a-domain/registrars/route53.md @@ -0,0 +1,51 @@ +--- +title: Route53 +category: Domain Registrars +description: Setting up a domain name with Route53 +--- + +## Prerequisites + +- [Register](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html) or [transfer](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html) a domain with Route53 +- Deploy an app with Architect and make note of the `staging` and `production` URLs + +## Step 1: setup SSL certificates with AWS Certificate Manager + +In this step we will request a certificate from Amazon for our domain. + +- Open up AWS Certificate Manager in the AWS Console in `us-east-1` (region is required!) +- Click `Request a certificate` and then `Request a public certificate` +- Ensure `example.com` and `*.example.com` for sub domains to work +- Choose `DNS validation` and click `Next` +- Add any tags and confirm the request +- Expand the domain and click `Create record in Route53` button +- Verify CNAME record created in Route53 console Hosted zone + +## Step 2: setup custom domain with AWS API Gateway + +Generate a domain with the certificate from Step 1. + +- Sign into AWS API Gateway in the AWS Console +- Navigate to `Custom domain names` and click `Create` +- Enter the domain name (e.g. `staging.example.com` for the `staging` app or `example.com` for the `production` app) +- Select the certificate created in Step 1 +- Click `Create domain name` +- Make note of the generated `API Gateway domain name` in `Endpoint configuration` +- Click on the tab `API mappings` and `Configure API mappings` +- For `API` select the API and for `Stage` select `$default` and click `Save` + +## Step 3: configure the domain Alias in AWS Route53 + +- Sign into AWS Route53 in the AWS Console +- Navigate to the Hosted zone for the domain +- Click `Create record` +- Enter the `Record name` +- Record type is `A` and toggle `Alias` checkbox on +- Select `Alias to API Gateway` +- Select the region +- Select the API (should be the same value as the domain generated in Step 2) +- Click `Create records` + +## Conclusion + +Now we're done! You can check to see if your domains are online with this [DNS Checker tool](https://dnschecker.org/). From c56441743acc16ed3d7cde57c8f1d48a882c3492 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 07:24:42 -0600 Subject: [PATCH 203/680] rename unimplemented doc groups --- .../cloud-functions.md | 0 .../code-sharing.md | 0 .../debugging.md | 0 .../environment-variables.md | 0 .../event-queues.md | 0 .../function-dependencies.md | 0 .../logging-and-monitoring.md | 0 .../routes.md | 0 .../scheduled-tasks.md | 0 .../sessions.md | 0 .../static-assets.md | 0 .../working-locally.md | 0 .../en/:get-started/project-files-folders.md | 5 ++ .../docs/en/:get-started/project-manifest.md | 5 ++ src/views/docs/en/:get-started/quickstart.md | 62 +++++++++++++++++++ .../beyond-hello-world.md | 0 .../configuring-aws.md | 0 .../set-up-a-domain/overview.md | 0 .../set-up-a-domain/registrars/dreamhost.md | 0 .../set-up-a-domain/registrars/godaddy.md | 0 .../set-up-a-domain/registrars/namecheap.md | 0 .../set-up-a-domain/registrars/one.md | 0 .../registrars/route53-and-cloudfront.md | 0 .../set-up-a-domain/registrars/route53.md | 0 .../using-plugins.md | 0 src/views/docs/en/introduction.md | 8 +++ 26 files changed, 80 insertions(+) rename src/views/docs/en/{app-development => :app-development}/cloud-functions.md (100%) rename src/views/docs/en/{app-development => :app-development}/code-sharing.md (100%) rename src/views/docs/en/{app-development => :app-development}/debugging.md (100%) rename src/views/docs/en/{app-development => :app-development}/environment-variables.md (100%) rename src/views/docs/en/{app-development => :app-development}/event-queues.md (100%) rename src/views/docs/en/{app-development => :app-development}/function-dependencies.md (100%) rename src/views/docs/en/{app-development => :app-development}/logging-and-monitoring.md (100%) rename src/views/docs/en/{app-development => :app-development}/routes.md (100%) rename src/views/docs/en/{app-development => :app-development}/scheduled-tasks.md (100%) rename src/views/docs/en/{app-development => :app-development}/sessions.md (100%) rename src/views/docs/en/{app-development => :app-development}/static-assets.md (100%) rename src/views/docs/en/{app-development => :app-development}/working-locally.md (100%) create mode 100644 src/views/docs/en/:get-started/project-files-folders.md create mode 100644 src/views/docs/en/:get-started/project-manifest.md create mode 100644 src/views/docs/en/:get-started/quickstart.md rename src/views/docs/en/{tutorials => :tutorials}/beyond-hello-world.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/configuring-aws.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/set-up-a-domain/overview.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/set-up-a-domain/registrars/dreamhost.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/set-up-a-domain/registrars/godaddy.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/set-up-a-domain/registrars/namecheap.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/set-up-a-domain/registrars/one.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/set-up-a-domain/registrars/route53-and-cloudfront.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/set-up-a-domain/registrars/route53.md (100%) rename src/views/docs/en/{tutorials => :tutorials}/using-plugins.md (100%) create mode 100644 src/views/docs/en/introduction.md diff --git a/src/views/docs/en/app-development/cloud-functions.md b/src/views/docs/en/:app-development/cloud-functions.md similarity index 100% rename from src/views/docs/en/app-development/cloud-functions.md rename to src/views/docs/en/:app-development/cloud-functions.md diff --git a/src/views/docs/en/app-development/code-sharing.md b/src/views/docs/en/:app-development/code-sharing.md similarity index 100% rename from src/views/docs/en/app-development/code-sharing.md rename to src/views/docs/en/:app-development/code-sharing.md diff --git a/src/views/docs/en/app-development/debugging.md b/src/views/docs/en/:app-development/debugging.md similarity index 100% rename from src/views/docs/en/app-development/debugging.md rename to src/views/docs/en/:app-development/debugging.md diff --git a/src/views/docs/en/app-development/environment-variables.md b/src/views/docs/en/:app-development/environment-variables.md similarity index 100% rename from src/views/docs/en/app-development/environment-variables.md rename to src/views/docs/en/:app-development/environment-variables.md diff --git a/src/views/docs/en/app-development/event-queues.md b/src/views/docs/en/:app-development/event-queues.md similarity index 100% rename from src/views/docs/en/app-development/event-queues.md rename to src/views/docs/en/:app-development/event-queues.md diff --git a/src/views/docs/en/app-development/function-dependencies.md b/src/views/docs/en/:app-development/function-dependencies.md similarity index 100% rename from src/views/docs/en/app-development/function-dependencies.md rename to src/views/docs/en/:app-development/function-dependencies.md diff --git a/src/views/docs/en/app-development/logging-and-monitoring.md b/src/views/docs/en/:app-development/logging-and-monitoring.md similarity index 100% rename from src/views/docs/en/app-development/logging-and-monitoring.md rename to src/views/docs/en/:app-development/logging-and-monitoring.md diff --git a/src/views/docs/en/app-development/routes.md b/src/views/docs/en/:app-development/routes.md similarity index 100% rename from src/views/docs/en/app-development/routes.md rename to src/views/docs/en/:app-development/routes.md diff --git a/src/views/docs/en/app-development/scheduled-tasks.md b/src/views/docs/en/:app-development/scheduled-tasks.md similarity index 100% rename from src/views/docs/en/app-development/scheduled-tasks.md rename to src/views/docs/en/:app-development/scheduled-tasks.md diff --git a/src/views/docs/en/app-development/sessions.md b/src/views/docs/en/:app-development/sessions.md similarity index 100% rename from src/views/docs/en/app-development/sessions.md rename to src/views/docs/en/:app-development/sessions.md diff --git a/src/views/docs/en/app-development/static-assets.md b/src/views/docs/en/:app-development/static-assets.md similarity index 100% rename from src/views/docs/en/app-development/static-assets.md rename to src/views/docs/en/:app-development/static-assets.md diff --git a/src/views/docs/en/app-development/working-locally.md b/src/views/docs/en/:app-development/working-locally.md similarity index 100% rename from src/views/docs/en/app-development/working-locally.md rename to src/views/docs/en/:app-development/working-locally.md diff --git a/src/views/docs/en/:get-started/project-files-folders.md b/src/views/docs/en/:get-started/project-files-folders.md new file mode 100644 index 00000000..200b9974 --- /dev/null +++ b/src/views/docs/en/:get-started/project-files-folders.md @@ -0,0 +1,5 @@ +--- +title: Project files & folders +category: Get started +description: Architect project structure +--- diff --git a/src/views/docs/en/:get-started/project-manifest.md b/src/views/docs/en/:get-started/project-manifest.md new file mode 100644 index 00000000..0c5d8521 --- /dev/null +++ b/src/views/docs/en/:get-started/project-manifest.md @@ -0,0 +1,5 @@ +--- +title: Project manifest format +category: Get started +description: Architect project manifest and app.arc +--- diff --git a/src/views/docs/en/:get-started/quickstart.md b/src/views/docs/en/:get-started/quickstart.md new file mode 100644 index 00000000..e10765e4 --- /dev/null +++ b/src/views/docs/en/:get-started/quickstart.md @@ -0,0 +1,62 @@ +--- +title: Quickstart +category: Get started +description: Get started quickly with Architect +--- + +> Architect is the quickest way to build serverless web apps on AWS + +Open your terminal to install `arc` and the AWS SDK: + +```bash +npm i -g @architect/architect aws-sdk +``` + +Check the version: + +```bash +arc version +``` + +> Protip: run `arc` with no arguments to get help + +## Work locally + +Create a new app: + +```bash +mkdir testapp +cd testapp +arc init +``` + +Kick up the local dev server: + +```bash +arc sandbox +``` +> `Cmd / Ctrl + c` exits the sandbox + +## Deploy to AWS + +Deploy to a `staging` stack: + +```bash +arc deploy +``` +> Protip: create additional `staging` stacks with `--name` + +Ship a `production` stack: + +```bash +arc deploy production +``` +> Be safe! Set the `ARC_APP_SECRET` environment variable in production to secure your HTTP sessions; more information in the [`env` CLI reference](../../reference/cli/env) + +Or eject to CloudFormation and deploy with the AWS SAM CLI: + +```bash +arc deploy --dry-run +sam package --template-file sam.json --output-template-file out.yaml --s3-bucket mybukkit +sam deploy --template-file out.yaml --stack-name MyStack --s3-bucket mybukkit --capabilities CAPABILITY_IAM +``` diff --git a/src/views/docs/en/tutorials/beyond-hello-world.md b/src/views/docs/en/:tutorials/beyond-hello-world.md similarity index 100% rename from src/views/docs/en/tutorials/beyond-hello-world.md rename to src/views/docs/en/:tutorials/beyond-hello-world.md diff --git a/src/views/docs/en/tutorials/configuring-aws.md b/src/views/docs/en/:tutorials/configuring-aws.md similarity index 100% rename from src/views/docs/en/tutorials/configuring-aws.md rename to src/views/docs/en/:tutorials/configuring-aws.md diff --git a/src/views/docs/en/tutorials/set-up-a-domain/overview.md b/src/views/docs/en/:tutorials/set-up-a-domain/overview.md similarity index 100% rename from src/views/docs/en/tutorials/set-up-a-domain/overview.md rename to src/views/docs/en/:tutorials/set-up-a-domain/overview.md diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/dreamhost.md b/src/views/docs/en/:tutorials/set-up-a-domain/registrars/dreamhost.md similarity index 100% rename from src/views/docs/en/tutorials/set-up-a-domain/registrars/dreamhost.md rename to src/views/docs/en/:tutorials/set-up-a-domain/registrars/dreamhost.md diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/godaddy.md b/src/views/docs/en/:tutorials/set-up-a-domain/registrars/godaddy.md similarity index 100% rename from src/views/docs/en/tutorials/set-up-a-domain/registrars/godaddy.md rename to src/views/docs/en/:tutorials/set-up-a-domain/registrars/godaddy.md diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/namecheap.md b/src/views/docs/en/:tutorials/set-up-a-domain/registrars/namecheap.md similarity index 100% rename from src/views/docs/en/tutorials/set-up-a-domain/registrars/namecheap.md rename to src/views/docs/en/:tutorials/set-up-a-domain/registrars/namecheap.md diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/one.md b/src/views/docs/en/:tutorials/set-up-a-domain/registrars/one.md similarity index 100% rename from src/views/docs/en/tutorials/set-up-a-domain/registrars/one.md rename to src/views/docs/en/:tutorials/set-up-a-domain/registrars/one.md diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/route53-and-cloudfront.md b/src/views/docs/en/:tutorials/set-up-a-domain/registrars/route53-and-cloudfront.md similarity index 100% rename from src/views/docs/en/tutorials/set-up-a-domain/registrars/route53-and-cloudfront.md rename to src/views/docs/en/:tutorials/set-up-a-domain/registrars/route53-and-cloudfront.md diff --git a/src/views/docs/en/tutorials/set-up-a-domain/registrars/route53.md b/src/views/docs/en/:tutorials/set-up-a-domain/registrars/route53.md similarity index 100% rename from src/views/docs/en/tutorials/set-up-a-domain/registrars/route53.md rename to src/views/docs/en/:tutorials/set-up-a-domain/registrars/route53.md diff --git a/src/views/docs/en/tutorials/using-plugins.md b/src/views/docs/en/:tutorials/using-plugins.md similarity index 100% rename from src/views/docs/en/tutorials/using-plugins.md rename to src/views/docs/en/:tutorials/using-plugins.md diff --git a/src/views/docs/en/introduction.md b/src/views/docs/en/introduction.md new file mode 100644 index 00000000..0e913083 --- /dev/null +++ b/src/views/docs/en/introduction.md @@ -0,0 +1,8 @@ +--- +title: Introduction +category: Architect +description: Architect introduction +--- + + + From 8ca337adbac78cd45bc3dfb7a69f9465454467d7 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 08:33:23 -0600 Subject: [PATCH 204/680] root level doc stubs still need to refactor sidebar to handle these --- src/views/docs/en/app-limits.md | 4 ++++ src/views/docs/en/faq.md | 4 ++++ src/views/docs/en/index.md | 8 ++++++++ src/views/docs/en/the-architect-way.md | 19 +++++++++++++++++++ src/views/docs/en/upgrade-guide.md | 4 ++++ 5 files changed, 39 insertions(+) create mode 100644 src/views/docs/en/app-limits.md create mode 100644 src/views/docs/en/faq.md create mode 100644 src/views/docs/en/index.md create mode 100644 src/views/docs/en/the-architect-way.md create mode 100644 src/views/docs/en/upgrade-guide.md diff --git a/src/views/docs/en/app-limits.md b/src/views/docs/en/app-limits.md new file mode 100644 index 00000000..1afafe4c --- /dev/null +++ b/src/views/docs/en/app-limits.md @@ -0,0 +1,4 @@ +--- +title: App limits +category: Architect +--- diff --git a/src/views/docs/en/faq.md b/src/views/docs/en/faq.md new file mode 100644 index 00000000..5943529b --- /dev/null +++ b/src/views/docs/en/faq.md @@ -0,0 +1,4 @@ +--- +title: FAQ +category: Architect +--- diff --git a/src/views/docs/en/index.md b/src/views/docs/en/index.md new file mode 100644 index 00000000..30a2f8cf --- /dev/null +++ b/src/views/docs/en/index.md @@ -0,0 +1,8 @@ +--- +title: Home +category: Architect +sections: + - "Welcome" + - "Installation" + - "Get started" +--- diff --git a/src/views/docs/en/the-architect-way.md b/src/views/docs/en/the-architect-way.md new file mode 100644 index 00000000..15e41802 --- /dev/null +++ b/src/views/docs/en/the-architect-way.md @@ -0,0 +1,19 @@ +--- +title: The Architect Way +category: Architect +description: Building applications with Architect +sections: + - "Excellent developer experience" + - "Cloud function-centric development" + - "Local, offline development" # note: possible to work online with real infra + - "Code sharing across functions" + - "Automated dependency management" + - "Discrete environments" + - "Declarative deployment" + - "Runtime resource discovery" + - "Optional helpers" + - "Secured to least privilege by default" + - "Incremental enhancement & development" + - "Open source and open governance" + # - "¿Comparison to other frameworks?" +--- diff --git a/src/views/docs/en/upgrade-guide.md b/src/views/docs/en/upgrade-guide.md new file mode 100644 index 00000000..0c84a803 --- /dev/null +++ b/src/views/docs/en/upgrade-guide.md @@ -0,0 +1,4 @@ +--- +title: Upgrade guide +category: Architect +--- From cbaef867f493da5bfabc4df4723939198fe315b8 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 08:51:05 -0600 Subject: [PATCH 205/680] Update the-architect-way.md --- src/views/docs/en/the-architect-way.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/the-architect-way.md b/src/views/docs/en/the-architect-way.md index 15e41802..16f6cd9a 100644 --- a/src/views/docs/en/the-architect-way.md +++ b/src/views/docs/en/the-architect-way.md @@ -4,7 +4,7 @@ category: Architect description: Building applications with Architect sections: - "Excellent developer experience" - - "Cloud function-centric development" + - "Cloud function centric development" - "Local, offline development" # note: possible to work online with real infra - "Code sharing across functions" - "Automated dependency management" From d449b6fe12f9dd417dcccc24ae2ed5965229d5e4 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 08:52:59 -0600 Subject: [PATCH 206/680] Update dictionary.js --- scripts/dictionary.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/dictionary.js b/scripts/dictionary.js index 39c4e121..088a88e6 100644 --- a/scripts/dictionary.js +++ b/scripts/dictionary.js @@ -43,6 +43,7 @@ let dictionary = [ 'cd', 'CDN', 'CDNs', + 'centric', 'changelog', 'Changelog', 'cheatsheet', From a4911827f415324434657d4fc442db4313a2aedd Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 10:25:18 -0600 Subject: [PATCH 207/680] spellcheck frontmatter --- package.json | 2 +- src/views/docs/en/:app-development/working-locally.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index cada70eb..446860e8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", - "spellcheck": "cross-env npx spellchecker './src/views/docs/en/**/*.md' --no-suggestions -q -d ./scripts/dictionary.js --plugins spell indefinite-article repeated-words syntax-mentions syntax-urls", + "spellcheck": "cross-env npx spellchecker './src/views/docs/en/**/*.md' --no-suggestions -q -d ./scripts/dictionary.js --plugins spell indefinite-article repeated-words syntax-mentions syntax-urls frontmatter --frontmatter-keys title category description", "lint": "eslint src --fix", "start": "sandbox", "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-spec", diff --git a/src/views/docs/en/:app-development/working-locally.md b/src/views/docs/en/:app-development/working-locally.md index 5e61f6e3..14e798f6 100644 --- a/src/views/docs/en/:app-development/working-locally.md +++ b/src/views/docs/en/:app-development/working-locally.md @@ -3,7 +3,7 @@ title: Working locally and offline category: App development description: sections: - - "Overview + - "Overview" - "Initializing new functions" # arc init, preferences - "Environment variables" # prefs.arc + .env - "Previewing" # localhost:3333 From ef1ca951b54d78c06b787ae7771dbfd3bfbfb2f4 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 10:45:20 -0600 Subject: [PATCH 208/680] spellchecker config options file --- package.json | 2 +- scripts/dictionary.js | 1 + scripts/spellcheckerrc.json | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 scripts/spellcheckerrc.json diff --git a/package.json b/package.json index 446860e8..e37d7927 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", - "spellcheck": "cross-env npx spellchecker './src/views/docs/en/**/*.md' --no-suggestions -q -d ./scripts/dictionary.js --plugins spell indefinite-article repeated-words syntax-mentions syntax-urls frontmatter --frontmatter-keys title category description", + "spellcheck": "cross-env npx spellchecker --config ./scripts/spellcheckerrc.json", "lint": "eslint src --fix", "start": "sandbox", "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-spec", diff --git a/scripts/dictionary.js b/scripts/dictionary.js index 088a88e6..d9fcfcbf 100644 --- a/scripts/dictionary.js +++ b/scripts/dictionary.js @@ -1,6 +1,7 @@ let dictionary = [ '.env', '.vimrc', + '&rarr', '`build`ing', 'ACM', 'Alexa', diff --git a/scripts/spellcheckerrc.json b/scripts/spellcheckerrc.json new file mode 100644 index 00000000..8a222937 --- /dev/null +++ b/scripts/spellcheckerrc.json @@ -0,0 +1,20 @@ +{ + "files": ["./src/views/docs/en/**/*.md"], + "quiet": true, + "noSuggestions": true, + "dictionaries": ["./scripts/dictionary.js"], + "plugins": [ + "spell", + "indefinite-article", + "repeated-words", + "syntax-mentions", + "syntax-urls", + "frontmatter" + ], + "frontmatterKeys": [ + "title", + "category", + "description", + "sections" + ] +} From 6327c714186954f786eecb5414e0a7d70342b29b Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 11:33:57 -0600 Subject: [PATCH 209/680] move dictionary to txt --- scripts/dictionary.js | 331 ------------------------------------ scripts/dictionary.txt | 326 +++++++++++++++++++++++++++++++++++ scripts/spellcheckerrc.json | 2 +- 3 files changed, 327 insertions(+), 332 deletions(-) delete mode 100644 scripts/dictionary.js create mode 100644 scripts/dictionary.txt diff --git a/scripts/dictionary.js b/scripts/dictionary.js deleted file mode 100644 index d9fcfcbf..00000000 --- a/scripts/dictionary.js +++ /dev/null @@ -1,331 +0,0 @@ -let dictionary = [ - '.env', - '.vimrc', - '&rarr', - '`build`ing', - 'ACM', - 'Alexa', - 'APIs', - 'arc-example-cors', - 'arc-repos', - 'arcana', - 'arcfile', - 'ARN', - 'ARNs', - 'async', - 'auth', - 'Auth', - 'authorizer', - 'authorizers', - 'authortime', - 'authortime', - 'automagical', - 'Automagical', - 'aws-sdk', - 'AWS', - 'AWSLambdaSQSQueueExecutionRole', - 'AZ', - 'backend', - 'Backends', - 'base64-encoded', - 'Base64', - 'bashrc', - 'bcrypt', - 'birb', - 'blockchain', - 'Blockquoted', - 'Browserify', - 'BuddyBuild', - 'bundler', - 'bundlers', - 'CA', - 'cacheControl', - 'Catalope', - 'cd', - 'CDN', - 'CDNs', - 'centric', - 'changelog', - 'Changelog', - 'cheatsheet', - 'Chupacabra', - 'CLA', - 'CLI.', - 'CLI', - 'Cloudflare', - 'CloudFormation-managed', - 'CloudFormation', - 'CloudFront', - 'CloudFront', - 'ClouDNS', - 'CloudWatch', - 'CMK', - 'CNAME', - 'codebase', - 'Codeship', - 'coldstart', - 'config', - 'Config', - 'configs', - 'configurability', - 'congrats', - 'Congrats', - 'cors', - 'CORS', - 'cron', - 'Cron', - 'CRON', - 'cross-env', - 'cruft', - 'cryptographically', - 'CSR', - 'CSRF', - 'css', - 'CSS', - 'Ctrl', - 'customizable', - 'CVEs', - 'debuggable', - 'declaratively', - 'Declaratively', - 'Deno', - 'deployable', - 'deploytime', - 'deps', - 'deterministically', - 'dev', - 'devdep', - 'devs', - 'dir', - 'disambiguate', - 'disambiguates', - 'DNS-based', - 'DNS', - 'DNSimple', - 'DocumentClient', - 'DocumentDB', - 'Dreamhost', - 'Dyn', - 'dynalite', - 'DynamoDB.', - 'DynamoDB', - 'easyDNS', - 'EC2', - 'El', - 'endpoint', - 'endpoints', - 'env', - 'envs', - 'EOL', - 'errback', - 'esbuild', - 'eslint', - 'esmodules', - 'EventBridge', - 'filesystem', - 'filetype', - 'FQDN', - 'frontend', - 'Frontend', - 'globals', - 'GoDaddy', - 'Graviton2', - 'hardcode', - 'hardcoding', - 'hashids', - 'headless', - 'headlessly', - 'hoc', - 'hostname', - 'html', - 'HTTP', - 'httpOnly', - 'HTTPS', - 'IaC', - 'IAM', - 'ing', - 'init', - 'installable', - 'integrations', - 'internets', - 'IoT', - 'isBase64Encoded', - 'js', - 'JS', - 'JSF', - 'JSON-encodes', - 'JSON-like', - 'JSON-style', - 'json', - 'JSON', - 'jsx', - 'JSX', - 'keypress', - 'Kinesis', - 'KMS', - 'konsumer', - 'LEANX', - 'learnable', - 'learnings', - 'Lex', - 'lifecycle', - 'linter', - 'localhost', - 'localhost:3333', - 'LTS', - 'macOS', - 'Microservices', - 'middleware', - 'Middleware', - 'minify', - 'mjs', - 'MMO', - 'Mongo', - 'MongoDB', - 'Namecheap', - 'NameCheap', - 'namespace', - 'namespaced', - 'namespaces', - 'nav', - 'NewOps', - 'Node', - 'NodeJS', - 'Nodemon', - 'non-serverless', - 'NoSQL', - 'npm', - 'NPM', - 'NS1', - 'OAuth', - 'Ogopogo', - 'ok', - 'Ok', - 'OpenJS', - 'param', - 'params', - 'Params', - 'ParcelJS', - 'payload', - 'payloads', - 'PEM', - 'per-pragma', - 'plaintext', - 'positionally', - 'powershell', - 'PowerShell', - 'pragma', - 'pragmas', - 'pre-compiled', - 'pre-configured', - 'pre-deploy', - 'pre-existing', - 'pre-installed', - 'pre-parsed', - 'pre-provision', - 'pre-provisioning', - 'pre-wired', - 'prepending', - 'prepopulated', - 'Prerendering', - 'privs', - 'protip', - 'Protip', - 'proxying', - 'Proxying', - 'PRs', - 'quickstart', - 'Quickstart', - 'readme', - 'Reference', - 'renderer', - 'repeatable', - 'REPL', - 'repo', - 'repos', - 'resiliance', - 'roadmap', - 'Roadmap', - 'Route53', - 'RSA', - 'Running', - 'runs', - 'runtime', - 'Runtime', - 'runtimes', - 'Runtimes', - 'S3.', - 'S3', - 'scalable', - 'SCSS', - 'SDK', - 'SemVer', - 'serverless', - 'Serverless', - 'serverlessly', - 'SHA', - 'signup', - 'Signup', - 'signups', - 'SNS', - 'SQS', - 'src', - 'SSL', - 'SSM', - 'stateful', - 'statusCode', - 'stderr', - 'stdout', - 'subdirectories', - 'subdomain', - 'subdomains', - 'svg', - 'symlinking', - 'teardown', - 'TestFlight', - 'tiny-json-http', - 'tldr', - 'transpilation', - 'transpile', - 'transpiled', - 'transpilers', - 'transpiling', - 'truthy', - 'tsx', - 'TSX', - 'TTL', - 'UI', - 'unauthenticated', - 'unbreak', - 'unformatted', - 'unindented', - 'Unordered', - 'unparsed', - 'unsynced', - 'unthrottled', - 'Upsert', - 'userland', - 'v5', - 'vars', - 'vimrc', - 'VMs', - 'vs', - 'webby', - 'webhooks', - 'Webpack', - 'WebSocket-enabled', - 'WebSocket', - 'WebSockets', - 'whitespace', - 'x86-based', - 'x86', - 'XHR', - 'xml', - 'XSS', - 'YAML', - 'ZoneEdit', -] - -dictionary.unshift(/[KMG]B/) // Data quantities, ostensibly - -module.exports = dictionary diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt new file mode 100644 index 00000000..5abaf35c --- /dev/null +++ b/scripts/dictionary.txt @@ -0,0 +1,326 @@ +\d+[KMG]B +.env +.vimrc +&rarr +`build`ing +ACM +Alexa +APIs +arc-example-cors +arc-repos +arcana +arcfile +ARN +ARNs +async +auth +Auth +authorizer +authorizers +authortime +authortime +automagical +Automagical +aws-sdk +AWS +AWSLambdaSQSQueueExecutionRole +AZ +backend +Backends +base64-encoded +Base64 +bashrc +bcrypt +birb +blockchain +Blockquoted +Browserify +BuddyBuild +bundler +bundlers +CA +cacheControl +Catalope +cd +CDN +CDNs +centric +changelog +Changelog +cheatsheet +Chupacabra +CLA +CLI. +CLI +Cloudflare +CloudFormation-managed +CloudFormation +CloudFront +CloudFront +ClouDNS +CloudWatch +CMK +CNAME +codebase +Codeship +coldstart +config +Config +configs +configurability +congrats +Congrats +cors +CORS +cron +Cron +CRON +cross-env +cruft +cryptographically +CSR +CSRF +css +CSS +Ctrl +customizable +CVEs +debuggable +declaratively +Declaratively +Deno +deployable +deploytime +deps +deterministically +dev +devdep +devs +dir +disambiguate +disambiguates +DNS-based +DNS +DNSimple +DocumentClient +DocumentDB +Dreamhost +Dyn +dynalite +DynamoDB. +DynamoDB +easyDNS +EC2 +El +endpoint +endpoints +env +envs +EOL +errback +esbuild +eslint +esmodules +EventBridge +filesystem +filetype +FQDN +frontend +Frontend +globals +GoDaddy +Graviton2 +hardcode +hardcoding +hashids +headless +headlessly +hoc +hostname +html +HTTP +httpOnly +HTTPS +IaC +IAM +ing +init +installable +integrations +internets +IoT +isBase64Encoded +js +JS +JSF +JSON-encodes +JSON-like +JSON-style +json +JSON +jsx +JSX +keypress +Kinesis +KMS +konsumer +LEANX +learnable +learnings +Lex +lifecycle +linter +localhost +localhost:3333 +LTS +macOS +Microservices +middleware +Middleware +minify +mjs +MMO +Mongo +MongoDB +Namecheap +NameCheap +namespace +namespaced +namespaces +nav +NewOps +Node +NodeJS +Nodemon +non-serverless +NoSQL +npm +NPM +NS1 +OAuth +Ogopogo +ok +Ok +OpenJS +param +params +Params +ParcelJS +payload +payloads +PEM +per-pragma +plaintext +positionally +powershell +PowerShell +pragma +pragmas +pre-compiled +pre-configured +pre-deploy +pre-existing +pre-installed +pre-parsed +pre-provision +pre-provisioning +pre-wired +prepending +prepopulated +Prerendering +privs +protip +Protip +proxying +Proxying +PRs +quickstart +Quickstart +readme +Reference +renderer +repeatable +REPL +repo +repos +resiliance +roadmap +Roadmap +Route53 +RSA +Running +runs +runtime +Runtime +runtimes +Runtimes +S3. +S3 +scalable +SCSS +SDK +SemVer +serverless +Serverless +serverlessly +SHA +signup +Signup +signups +SNS +SQS +src +SSL +SSM +stateful +statusCode +stderr +stdout +subdirectories +subdomain +subdomains +svg +symlinking +teardown +TestFlight +tiny-json-http +tldr +transpilation +transpile +transpiled +transpilers +transpiling +truthy +tsx +TSX +TTL +UI +unauthenticated +unbreak +unformatted +unindented +Unordered +unparsed +unsynced +unthrottled +Upsert +userland +v5 +vars +vimrc +VMs +vs +webby +webhooks +Webpack +WebSocket-enabled +WebSocket +WebSockets +whitespace +x86-based +x86 +XHR +xml +XSS +YAML +ZoneEdit diff --git a/scripts/spellcheckerrc.json b/scripts/spellcheckerrc.json index 8a222937..41de8711 100644 --- a/scripts/spellcheckerrc.json +++ b/scripts/spellcheckerrc.json @@ -2,7 +2,7 @@ "files": ["./src/views/docs/en/**/*.md"], "quiet": true, "noSuggestions": true, - "dictionaries": ["./scripts/dictionary.js"], + "dictionaries": ["./scripts/dictionary.txt"], "plugins": [ "spell", "indefinite-article", From 673beec2a51010565a2391fdf9fb14d28b76ad60 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 19 Oct 2021 13:10:11 -0600 Subject: [PATCH 210/680] use architect spellcheck-dictionary --- package.json | 3 +- scripts/dictionary.txt | 313 ------------------------------------ scripts/spellcheckerrc.json | 5 +- 3 files changed, 6 insertions(+), 315 deletions(-) diff --git a/package.json b/package.json index e37d7927..783a7aef 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", - "spellcheck": "cross-env npx spellchecker --config ./scripts/spellcheckerrc.json", + "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", "lint": "eslint src --fix", "start": "sandbox", "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-spec", @@ -20,6 +20,7 @@ "@architect/package": "^7.1.1", "@architect/sandbox": "^4.1.1", "@architect/syntaxes": "github:architect/syntaxes#v1.0.1", + "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary", "@toycode/markdown-it-class": "^1.2.4", "eslint": "^8.0.0", "esm": "^3.2.25", diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt index 5abaf35c..7a12cf20 100644 --- a/scripts/dictionary.txt +++ b/scripts/dictionary.txt @@ -1,326 +1,13 @@ -\d+[KMG]B -.env -.vimrc &rarr -`build`ing ACM -Alexa -APIs arc-example-cors -arc-repos -arcana -arcfile -ARN -ARNs -async -auth -Auth -authorizer -authorizers -authortime -authortime -automagical -Automagical -aws-sdk -AWS -AWSLambdaSQSQueueExecutionRole -AZ -backend -Backends -base64-encoded -Base64 -bashrc -bcrypt -birb -blockchain -Blockquoted -Browserify -BuddyBuild -bundler -bundlers -CA -cacheControl -Catalope -cd -CDN -CDNs -centric -changelog -Changelog -cheatsheet -Chupacabra -CLA -CLI. -CLI Cloudflare -CloudFormation-managed -CloudFormation -CloudFront -CloudFront -ClouDNS -CloudWatch -CMK -CNAME -codebase -Codeship -coldstart -config -Config -configs -configurability -congrats -Congrats -cors -CORS -cron -Cron -CRON -cross-env -cruft -cryptographically -CSR -CSRF -css -CSS -Ctrl -customizable -CVEs -debuggable -declaratively -Declaratively -Deno -deployable -deploytime -deps -deterministically -dev -devdep -devs -dir -disambiguate -disambiguates -DNS-based -DNS -DNSimple -DocumentClient -DocumentDB Dreamhost -Dyn -dynalite -DynamoDB. -DynamoDB -easyDNS -EC2 -El -endpoint -endpoints -env -envs -EOL -errback -esbuild -eslint -esmodules -EventBridge -filesystem -filetype FQDN -frontend -Frontend -globals GoDaddy Graviton2 -hardcode -hardcoding -hashids -headless -headlessly -hoc -hostname -html -HTTP -httpOnly -HTTPS -IaC -IAM -ing -init -installable -integrations -internets -IoT -isBase64Encoded -js -JS -JSF -JSON-encodes -JSON-like -JSON-style -json -JSON -jsx -JSX -keypress -Kinesis -KMS konsumer LEANX -learnable -learnings -Lex -lifecycle -linter -localhost -localhost:3333 -LTS -macOS -Microservices -middleware -Middleware -minify -mjs -MMO -Mongo -MongoDB Namecheap NameCheap -namespace -namespaced -namespaces -nav -NewOps -Node -NodeJS -Nodemon -non-serverless -NoSQL -npm -NPM -NS1 -OAuth -Ogopogo -ok -Ok -OpenJS -param -params -Params ParcelJS -payload -payloads -PEM -per-pragma -plaintext -positionally -powershell -PowerShell -pragma -pragmas -pre-compiled -pre-configured -pre-deploy -pre-existing -pre-installed -pre-parsed -pre-provision -pre-provisioning -pre-wired -prepending -prepopulated -Prerendering -privs -protip -Protip -proxying -Proxying -PRs -quickstart -Quickstart -readme -Reference -renderer -repeatable -REPL -repo -repos -resiliance -roadmap -Roadmap -Route53 -RSA -Running -runs -runtime -Runtime -runtimes -Runtimes -S3. -S3 -scalable -SCSS -SDK -SemVer -serverless -Serverless -serverlessly -SHA -signup -Signup -signups -SNS -SQS -src -SSL -SSM -stateful -statusCode -stderr -stdout -subdirectories -subdomain -subdomains -svg -symlinking -teardown -TestFlight -tiny-json-http -tldr -transpilation -transpile -transpiled -transpilers -transpiling -truthy -tsx -TSX -TTL -UI -unauthenticated -unbreak -unformatted -unindented -Unordered -unparsed -unsynced -unthrottled -Upsert -userland -v5 -vars -vimrc -VMs -vs -webby -webhooks -Webpack -WebSocket-enabled -WebSocket -WebSockets -whitespace -x86-based -x86 -XHR -xml -XSS -YAML -ZoneEdit diff --git a/scripts/spellcheckerrc.json b/scripts/spellcheckerrc.json index 41de8711..fcc9edf9 100644 --- a/scripts/spellcheckerrc.json +++ b/scripts/spellcheckerrc.json @@ -2,7 +2,10 @@ "files": ["./src/views/docs/en/**/*.md"], "quiet": true, "noSuggestions": true, - "dictionaries": ["./scripts/dictionary.txt"], + "dictionaries": [ + "./scripts/dictionary.txt", + "./node_modules/@architect/spellcheck-dictionary/dictionary.txt" + ], "plugins": [ "spell", "indefinite-article", From 6402702d8abcd7dc5a096a066b78b9e48c62e413 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 20 Oct 2021 09:47:06 -0600 Subject: [PATCH 211/680] use doc lang for facet filtering in algolia * disable Algolia lang facet filter until needed --- src/http/get-docs-000lang-catchall/index.js | 4 ++-- src/views/modules/components/algolia.js | 9 ++++++--- src/views/modules/document/head.js | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index c9810bc6..3e79c2f9 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -72,7 +72,7 @@ async function handler (req) { lang, scripts: [ '/index.js' ], state: { notFoundTerm: docName }, - thirdparty: algolia, + thirdparty: algolia(lang), toc }) } @@ -112,7 +112,7 @@ async function handler (req) { '/components/arc-viewer.js', '/components/arc-tab.js' ], - thirdparty: algolia, + thirdparty: algolia(lang), title, toc }) diff --git a/src/views/modules/components/algolia.js b/src/views/modules/components/algolia.js index 02f0e576..29bf0055 100644 --- a/src/views/modules/components/algolia.js +++ b/src/views/modules/components/algolia.js @@ -1,7 +1,8 @@ // related docsearch config // https://github.com/algolia/docsearch-configs/blob/master/configs/arc.json -export default ` +export default function Algolia (lang) { + return ` - ` +` +} diff --git a/src/views/modules/document/head.js b/src/views/modules/document/head.js index a1d50bd0..a67ee666 100644 --- a/src/views/modules/document/head.js +++ b/src/views/modules/document/head.js @@ -1,5 +1,5 @@ export default function Head (props = {}) { - let { category, description, title } = props + let { category, description, lang = 'en', title } = props let descriptionContent = description || 'Architect documentation' let fullTitle = '' if (category && title) @@ -52,6 +52,7 @@ export default function Head (props = {}) { + ` } From 139a5cbcb83c42449f876f414272da052dd5f2f0 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 20 Oct 2021 19:06:59 -0700 Subject: [PATCH 212/680] Typo --- src/views/docs/en/reference/project-manifest/http.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/project-manifest/http.md b/src/views/docs/en/reference/project-manifest/http.md index 4e0dcf31..091d5ede 100644 --- a/src/views/docs/en/reference/project-manifest/http.md +++ b/src/views/docs/en/reference/project-manifest/http.md @@ -8,7 +8,7 @@ Define HTTP routes in API Gateway with Lambda handler functions. ## Syntax -Each route is made up of by two parts: `verb` & `path` +Each route is made of two parts: `verb` & `path` - HTTP Verb - `get` From 0ae6ce6ac0e5164a70bfcc671822ddcd47c34fa6 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 20 Oct 2021 19:07:03 -0700 Subject: [PATCH 213/680] 3.6.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 783a7aef..0e10ac32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.3", + "version": "3.6.4", "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", From 78e3b1e03adb0607221ec80b010d2545aeeca870 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 20 Oct 2021 19:28:27 -0700 Subject: [PATCH 214/680] Cycle keys --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 18f6273d..141fbc25 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,16 +85,16 @@ jobs: run: npx arc deploy --staging env: CI: true - AWS_ACCESS_KEY_ID: ${{ secrets.V8_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.V8_AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - name: Production Deploy if: startsWith(github.ref, 'refs/tags/v') run: npx arc deploy --production env: CI: true - AWS_ACCESS_KEY_ID: ${{ secrets.V8_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.V8_AWS_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - name: Notify uses: sarisia/actions-status-discord@v1 From 1c6280e713920f33002f334ada8a137e401aa95e Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 25 Oct 2021 09:44:24 -0600 Subject: [PATCH 215/680] Update redirect-map.js (#434) * add canonical pragma to redirect-map --- src/shared/redirect-map.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index ba6bb551..06fdeef2 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -5,6 +5,24 @@ const redirects = { '/examples': '/docs/en/guides/examples', + // Canonical pragma paths + '/@app': '/docs/en/reference/project-manifest/app', + '/@aws': '/docs/en/reference/project-manifest/aws', + '/@events': '/docs/en/reference/project-manifest/events', + '/@http': '/docs/en/reference/project-manifest/http', + '/@indexes': '/docs/en/reference/project-manifest/indexes', + '/@macros': '/docs/en/reference/project-manifest/macros', + '/@plugins': '/docs/en/reference/project-manifest/plugins', + '/@proxy': '/docs/en/reference/project-manifest/proxy', + '/@queues': '/docs/en/reference/project-manifest/queues', + '/@scheduled': '/docs/en/reference/project-manifest/scheduled', + '/@shared': '/docs/en/reference/project-manifest/shared', + '/@static': '/docs/en/reference/project-manifest/static', + '/@streams': '/docs/en/reference/project-manifest/tables', // TODO: update with new streams doc + '/@tables': '/docs/en/reference/project-manifest/tables', + '/@views': '/docs/en/reference/project-manifest/views', + '/@ws': '/docs/en/reference/project-manifest/ws', + // Intro // round 1: Q1 2021 '/intro/philosophy': '/docs/en/guides/get-started/why-architect', @@ -127,14 +145,15 @@ const redirects = { } module.exports = async function redirect (req) { + const path = req.requestContext.http.path const isGet = req.requestContext.http.method.toLowerCase() === 'get' - const isPath = Object.keys(redirects).includes(req.requestContext.http.path) + const isPath = Object.keys(redirects).includes(path) if (isGet && isPath) { return { statusCode: 301, headers: { - location: redirects[req.requestContext.http.path] + location: redirects[path] } } } From ca66052e71393417a66ba12df8019b7a02a39f37 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 25 Oct 2021 17:36:40 -0600 Subject: [PATCH 216/680] 3.6.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e10ac32..ae9a7193 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.4", + "version": "3.6.5", "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", From e173fab735d4d5a5396c171bf7b921c2a40ee2bc Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 26 Oct 2021 19:57:15 -0700 Subject: [PATCH 217/680] Update app name, retire old deploy bucket, organize deps, move to arm64 --- app.arc | 8 +++----- package.json | 18 +++++++++--------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/app.arc b/app.arc index 13460403..7dcb1bb3 100644 --- a/app.arc +++ b/app.arc @@ -1,14 +1,12 @@ @app -v8-arc-codes +arc-codes @aws -region us-west-1 +region us-west-2 profile openjsf -bucket arc.codes-deploy -apigateway http +architecture arm64 @static -folder public fingerprint true @http diff --git a/package.json b/package.json index ae9a7193..887dd592 100644 --- a/package.json +++ b/package.json @@ -12,17 +12,11 @@ "test": "npm run spellcheck && npm run lint && npm run test:unit:frontend && npm run test:unit:backend" }, "dependencies": { - "@architect/architect": "^9.1.0", "@architect/asap": "^4.1.0", - "@architect/eslint-config": "^2.0.1", "@architect/functions": "^4.0.0", "@architect/inventory": "^2.1.0", "@architect/package": "^7.1.1", - "@architect/sandbox": "^4.1.1", - "@architect/syntaxes": "github:architect/syntaxes#v1.0.1", - "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary", "@toycode/markdown-it-class": "^1.2.4", - "eslint": "^8.0.0", "esm": "^3.2.25", "js-yaml": "^4.1.0", "markdown-it": "^12.2.0", @@ -30,12 +24,18 @@ "markdown-it-front-matter": "^0.2.3", "onigasm": "^2.2.5", "shiki": "^0.9.12", - "slugify": "^1.6.1", + "slugify": "^1.6.1" + }, + "devDependencies": { + "@architect/architect": "^9.2.0", + "@architect/eslint-config": "^2.0.1", + "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary", + "@architect/syntaxes": "github:architect/syntaxes#v1.0.1", + "eslint": "^8.0.0", "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", "tape": "^5.3.1", - "tiny-json-http": "^7.3.0", - "vscode-textmate": "^5.4.0" + "tiny-json-http": "^7.3.0" }, "eslintConfig": { "extends": "@architect/eslint-config" From 93c9c5fd2f570ba232b3f9293b6f1aa723bb4b25 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 26 Oct 2021 19:59:33 -0700 Subject: [PATCH 218/680] Add pragma redirects without `@` --- src/shared/redirect-map.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index 06fdeef2..035be1bd 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -6,21 +6,37 @@ const redirects = { '/examples': '/docs/en/guides/examples', // Canonical pragma paths + '/app': '/docs/en/reference/project-manifest/app', '/@app': '/docs/en/reference/project-manifest/app', + '/aws': '/docs/en/reference/project-manifest/aws', '/@aws': '/docs/en/reference/project-manifest/aws', + '/events': '/docs/en/reference/project-manifest/events', '/@events': '/docs/en/reference/project-manifest/events', + '/http': '/docs/en/reference/project-manifest/http', '/@http': '/docs/en/reference/project-manifest/http', + '/indexes': '/docs/en/reference/project-manifest/indexes', '/@indexes': '/docs/en/reference/project-manifest/indexes', + '/macros': '/docs/en/reference/project-manifest/macros', '/@macros': '/docs/en/reference/project-manifest/macros', + '/plugins': '/docs/en/reference/project-manifest/plugins', '/@plugins': '/docs/en/reference/project-manifest/plugins', + '/proxy': '/docs/en/reference/project-manifest/proxy', '/@proxy': '/docs/en/reference/project-manifest/proxy', + '/queues': '/docs/en/reference/project-manifest/queues', '/@queues': '/docs/en/reference/project-manifest/queues', + '/scheduled': '/docs/en/reference/project-manifest/scheduled', '/@scheduled': '/docs/en/reference/project-manifest/scheduled', + '/shared': '/docs/en/reference/project-manifest/shared', '/@shared': '/docs/en/reference/project-manifest/shared', + '/static': '/docs/en/reference/project-manifest/static', '/@static': '/docs/en/reference/project-manifest/static', + '/streams': '/docs/en/reference/project-manifest/tables', // TODO: update with new streams doc '/@streams': '/docs/en/reference/project-manifest/tables', // TODO: update with new streams doc + '/tables': '/docs/en/reference/project-manifest/tables', '/@tables': '/docs/en/reference/project-manifest/tables', + '/views': '/docs/en/reference/project-manifest/views', '/@views': '/docs/en/reference/project-manifest/views', + '/ws': '/docs/en/reference/project-manifest/ws', '/@ws': '/docs/en/reference/project-manifest/ws', // Intro From eaac9bcc9550dcb04b53f2cb43e20963559bbe0d Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 26 Oct 2021 20:20:40 -0700 Subject: [PATCH 219/680] Update CI --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 141fbc25..f005d752 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -78,7 +78,7 @@ jobs: node-version: 14 - name: Install - run: npm i --production + run: npm i - name: Staging Deploy if: github.ref == 'refs/heads/main' From f4dd9e8ee12c6c281bd41e79f3af5b2a32656cbf Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 26 Oct 2021 21:13:56 -0700 Subject: [PATCH 220/680] Employ 302s, not just 301s; add support for legacy arc.codes DNS forwarding --- src/shared/redirect-map.js | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index 035be1bd..89a19bbe 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -1,10 +1,8 @@ -// redirect known v6 arc urls to v8 and then to v9 -const redirects = { +// these are soft redirects, not forever/caonincal +const tempRedirects = { // tmp until marketing landing page work done '/': '/docs/en/guides/get-started/quickstart', - '/examples': '/docs/en/guides/examples', - // Canonical pragma paths '/app': '/docs/en/reference/project-manifest/app', '/@app': '/docs/en/reference/project-manifest/app', @@ -38,6 +36,11 @@ const redirects = { '/@views': '/docs/en/reference/project-manifest/views', '/ws': '/docs/en/reference/project-manifest/ws', '/@ws': '/docs/en/reference/project-manifest/ws', +} + +// redirect known v6 arc urls to v8 and then to v9 +const permanentRedirects = { + '/examples': '/docs/en/guides/examples', // Intro // round 1: Q1 2021 @@ -161,16 +164,23 @@ const redirects = { } module.exports = async function redirect (req) { - const path = req.requestContext.http.path + const reqPath = req.requestContext.http.path const isGet = req.requestContext.http.method.toLowerCase() === 'get' - const isPath = Object.keys(redirects).includes(path) - if (isGet && isPath) { + if (isGet && (tempRedirects[reqPath] || permanentRedirects[reqPath])) { + let env = process.env.ARC_ENV + let url = (stage, path) => `https://${stage}arc.codes${path}` + + let location = tempRedirects[reqPath] || permanentRedirects[reqPath] + if (env === 'staging') location = url('staging.', location) + if (env === 'production') location = url('', location) + return { - statusCode: 301, + statusCode: tempRedirects[reqPath] ? 302 : 301, headers: { - location: redirects[path] + location } } } + return } From 26760d619c7ab65381f2efc2c6b667ef7495139a Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 26 Oct 2021 21:18:33 -0700 Subject: [PATCH 221/680] Add a few missing redirects --- src/shared/redirect-map.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index 89a19bbe..a0442d98 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -53,6 +53,7 @@ const permanentRedirects = { '/quickstart': '/docs/en/guides/get-started/quickstart', '/quickstart/install': '/docs/en/guides/get-started/quickstart', '/quickstart/layout': '/docs/en/guides/get-started/project-layout', + '/quickstart/what-next': '/docs/en/guides/get-started/quickstart', // Primitives // round 1: Q1 2021 @@ -72,6 +73,7 @@ const permanentRedirects = { '/guides/testing': '/docs/en/guides/developer-experience/local-development', '/guides/project-manifest': '/docs/en/guides/get-started/project-layout', '/guides/share-code': '/docs/en/guides/developer-experience/sharing-code', + '/guides/sharing-common-code': '/docs/en/guides/developer-experience/sharing-code', '/guides/custom-file-paths': '/docs/en/guides/developer-experience/custom-source-paths', // Reference > Project Manifest From 2f424fac22e754911a3b6681dd269301db058912 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 26 Oct 2021 21:29:46 -0700 Subject: [PATCH 222/680] 3.6.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 887dd592..a012c91b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.5", + "version": "3.6.6", "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", From 111e184ab1805cc50331ccfbf7a3c1a627205761 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Wed, 27 Oct 2021 13:28:53 -0400 Subject: [PATCH 223/680] Issue #436: Zindex on mobile borked Signed-off-by: Simon MacDonald --- public/css/index.css | 1 + public/static.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/public/css/index.css b/public/css/index.css index 189f5b56..8e9d012f 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -40,6 +40,7 @@ html { .left-sidebar { /* Hide Sidebar off screen in mobile */ left: calc(var(--sidebar) * -1); + z-index: 1; } .table-fixed { table-layout: fixed; diff --git a/public/static.json b/public/static.json index 8c3c8c12..db89726b 100644 --- a/public/static.json +++ b/public/static.json @@ -6,7 +6,7 @@ "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", "components/arc-viewer.js": "components/arc-viewer-3de6ce2a83.js", "css/docsearch.css": "css/docsearch-27dbba82ed.css", - "css/index.css": "css/index-b7b5744cd1.css", + "css/index.css": "css/index-ab76f8f61e.css", "css/styles.css": "css/styles-cf4510a1b6.css", "css/syntax.css": "css/syntax-f7947528a2.css" } \ No newline at end of file From f25bd2a0a9bc1eec4a8a5defb56de7eff35e0dd9 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Wed, 27 Oct 2021 13:31:54 -0400 Subject: [PATCH 224/680] Issue #440: wrapping in code blocks makes code unreadable Signed-off-by: Simon MacDonald --- public/css/syntax.css | 8 +++++++- public/static.json | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index c2d5087a..b4fec6f2 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -16,7 +16,7 @@ margin-bottom: 1.33rem; overflow: auto; border-radius: 0.3rem; - white-space: pre-wrap; + white-space: nowrap; word-break: break-word; /* fallback when Shiki encounters unknown syntax */ color: var(--g2); @@ -43,3 +43,9 @@ min-width: auto; border-radius: 0.25rem; } + +@media only screen and (min-width:48em) { + .docs pre { + white-space: pre-wrap; + } +} diff --git a/public/static.json b/public/static.json index db89726b..af769df9 100644 --- a/public/static.json +++ b/public/static.json @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-ab76f8f61e.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-f7947528a2.css" + "css/syntax.css": "css/syntax-47baa01ef0.css" } \ No newline at end of file From 7c6df28ba8fcaa0b5b784f75abb6fb4cccfcda61 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 27 Oct 2021 10:38:31 -0700 Subject: [PATCH 225/680] Update and make quicker the quickstart --- .../docs/en/guides/get-started/quickstart.md | 49 +++++-------------- 1 file changed, 13 insertions(+), 36 deletions(-) diff --git a/src/views/docs/en/guides/get-started/quickstart.md b/src/views/docs/en/guides/get-started/quickstart.md index e10765e4..3f57367a 100644 --- a/src/views/docs/en/guides/get-started/quickstart.md +++ b/src/views/docs/en/guides/get-started/quickstart.md @@ -4,59 +4,36 @@ category: Get started description: Get started quickly with Architect --- -> Architect is the quickest way to build serverless web apps on AWS +> Architect is a simple tool to build and deliver powerful cloud function-based web apps and APIs -Open your terminal to install `arc` and the AWS SDK: +Assuming Node.js 14+ is installed, open your terminal and create a new Architect project: ```bash -npm i -g @architect/architect aws-sdk +npm init @architect new-app ``` -Check the version: +Start the local dev server: ```bash -arc version -``` - -> Protip: run `arc` with no arguments to get help - -## Work locally - -Create a new app: - -```bash -mkdir testapp -cd testapp -arc init -``` - -Kick up the local dev server: - -```bash -arc sandbox +cd new-app +npx arc sandbox ``` > `Cmd / Ctrl + c` exits the sandbox + ## Deploy to AWS -Deploy to a `staging` stack: +Deploy to your built-in `staging` environment: ```bash -arc deploy +npx arc deploy ``` -> Protip: create additional `staging` stacks with `--name` +> Protip: create additional named development environments with the `--name` flag -Ship a `production` stack: +Ship to your built-in `production` environment: ```bash -arc deploy production +npx arc deploy --production ``` -> Be safe! Set the `ARC_APP_SECRET` environment variable in production to secure your HTTP sessions; more information in the [`env` CLI reference](../../reference/cli/env) -Or eject to CloudFormation and deploy with the AWS SAM CLI: - -```bash -arc deploy --dry-run -sam package --template-file sam.json --output-template-file out.yaml --s3-bucket mybukkit -sam deploy --template-file out.yaml --stack-name MyStack --s3-bucket mybukkit --capabilities CAPABILITY_IAM -``` +> Be safe! Set the `ARC_APP_SECRET` environment variable in production to secure your HTTP sessions; more information in the [`env` CLI reference](../../reference/cli/env) From d3b794d340c293422f3ea11115992fe9c49b5b0e Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Wed, 27 Oct 2021 14:12:07 -0400 Subject: [PATCH 226/680] Issue #441: arc-viewer tab code block rounded corners in dark mode Signed-off-by: Simon MacDonald --- public/css/syntax.css | 4 ++++ public/static.json | 2 +- src/views/docs/en/guides/get-started/project-layout.md | 2 +- src/views/docs/en/reference/project-manifest/app.md | 2 +- src/views/docs/en/reference/project-manifest/aws.md | 2 +- src/views/docs/en/reference/project-manifest/events.md | 2 +- src/views/docs/en/reference/project-manifest/http.md | 2 +- src/views/docs/en/reference/project-manifest/indexes.md | 2 +- src/views/docs/en/reference/project-manifest/macros.md | 2 +- src/views/docs/en/reference/project-manifest/proxy.md | 2 +- src/views/docs/en/reference/project-manifest/queues.md | 2 +- src/views/docs/en/reference/project-manifest/scheduled.md | 2 +- src/views/docs/en/reference/project-manifest/shared.md | 2 +- src/views/docs/en/reference/project-manifest/static.md | 2 +- src/views/docs/en/reference/project-manifest/tables.md | 2 +- src/views/docs/en/reference/project-manifest/views.md | 2 +- src/views/docs/en/reference/project-manifest/ws.md | 2 +- 17 files changed, 20 insertions(+), 16 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index b4fec6f2..013b30b4 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -23,6 +23,10 @@ background-color: var(--g9); } +.docs div[slot='content'] pre { + border-radius: 0 0.3rem 0.3rem 0.3rem; +} + /* code copy button */ .docs pre button.icon { width: 1rem; diff --git a/public/static.json b/public/static.json index af769df9..ea532e4f 100644 --- a/public/static.json +++ b/public/static.json @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-ab76f8f61e.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-47baa01ef0.css" + "css/syntax.css": "css/syntax-5bbab8cffd.css" } \ No newline at end of file diff --git a/src/views/docs/en/guides/get-started/project-layout.md b/src/views/docs/en/guides/get-started/project-layout.md index 570ed253..02a6a011 100644 --- a/src/views/docs/en/guides/get-started/project-layout.md +++ b/src/views/docs/en/guides/get-started/project-layout.md @@ -88,7 +88,7 @@ These pragmas represent persistence resources. ## Example -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/app.md b/src/views/docs/en/reference/project-manifest/app.md index c874b51c..d6f9b41d 100644 --- a/src/views/docs/en/reference/project-manifest/app.md +++ b/src/views/docs/en/reference/project-manifest/app.md @@ -18,7 +18,7 @@ description: Define the application namespace Create an app with the namespace "foobaz": -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/aws.md b/src/views/docs/en/reference/project-manifest/aws.md index c3531983..52d343d7 100644 --- a/src/views/docs/en/reference/project-manifest/aws.md +++ b/src/views/docs/en/reference/project-manifest/aws.md @@ -36,7 +36,7 @@ If you have AWS exports in your `.bashrc` and `@aws` specified in your `app.arc` For example, to deploy to the northern California AWS AZ with your AWS `work` profile's credentials, use: -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/events.md b/src/views/docs/en/reference/project-manifest/events.md index 0cc70b2b..c37678d4 100644 --- a/src/views/docs/en/reference/project-manifest/events.md +++ b/src/views/docs/en/reference/project-manifest/events.md @@ -18,7 +18,7 @@ category: app.arc These configuration examples show how to define events: -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/http.md b/src/views/docs/en/reference/project-manifest/http.md index 091d5ede..2bfc3637 100644 --- a/src/views/docs/en/reference/project-manifest/http.md +++ b/src/views/docs/en/reference/project-manifest/http.md @@ -31,7 +31,7 @@ Each route is made of two parts: `verb` & `path` These configuration examples show how to define `@http` routes: -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/indexes.md b/src/views/docs/en/reference/project-manifest/indexes.md index 72b82812..dee3ee3f 100644 --- a/src/views/docs/en/reference/project-manifest/indexes.md +++ b/src/views/docs/en/reference/project-manifest/indexes.md @@ -29,7 +29,7 @@ The following `app.arc` file defines a [DynamoDB][ddb] table with two [Global Se -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/macros.md b/src/views/docs/en/reference/project-manifest/macros.md index f6e50488..55fc9f22 100644 --- a/src/views/docs/en/reference/project-manifest/macros.md +++ b/src/views/docs/en/reference/project-manifest/macros.md @@ -11,7 +11,7 @@ Extend the functionality of your Architect app with standard CloudFormation. The These example configuration files declare a macro saved to `src/macros/my-custom-macro.js` -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/proxy.md b/src/views/docs/en/reference/project-manifest/proxy.md index 3e11e7b8..9ba4f626 100644 --- a/src/views/docs/en/reference/project-manifest/proxy.md +++ b/src/views/docs/en/reference/project-manifest/proxy.md @@ -16,7 +16,7 @@ Defines a URL for API Gateway to forward all requests by default. Override with The following configuration file defines a `@proxy` for production that will handle requests for routes not defined in the `@http` section. -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/queues.md b/src/views/docs/en/reference/project-manifest/queues.md index 897339f7..29a50210 100644 --- a/src/views/docs/en/reference/project-manifest/queues.md +++ b/src/views/docs/en/reference/project-manifest/queues.md @@ -18,7 +18,7 @@ Define SQS topics with Lambda handler functions. This `app.arc` file defines two `@queues`: -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/scheduled.md b/src/views/docs/en/reference/project-manifest/scheduled.md index 5639fde1..da531bfe 100644 --- a/src/views/docs/en/reference/project-manifest/scheduled.md +++ b/src/views/docs/en/reference/project-manifest/scheduled.md @@ -22,7 +22,7 @@ Define EventBridge schedule expressions with Lambda handler functions. These configuration examples show how to define scheduled functions: -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/shared.md b/src/views/docs/en/reference/project-manifest/shared.md index a62434b3..7392fa40 100644 --- a/src/views/docs/en/reference/project-manifest/shared.md +++ b/src/views/docs/en/reference/project-manifest/shared.md @@ -18,7 +18,7 @@ Configure the location of shared code. The following configuration examples define a different folder than the default `src/shared` directory. -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/static.md b/src/views/docs/en/reference/project-manifest/static.md index a30faad1..61e908e1 100644 --- a/src/views/docs/en/reference/project-manifest/static.md +++ b/src/views/docs/en/reference/project-manifest/static.md @@ -18,7 +18,7 @@ Configure the static asset S3 bucket. This `app.arc` file defines a static bucket: -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/tables.md b/src/views/docs/en/reference/project-manifest/tables.md index 4aa4985d..c443cb65 100644 --- a/src/views/docs/en/reference/project-manifest/tables.md +++ b/src/views/docs/en/reference/project-manifest/tables.md @@ -63,7 +63,7 @@ DynamoDB has a feature which lets you [recover your data][recovery] to any point This `app.arc` file defines two database tables: -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/views.md b/src/views/docs/en/reference/project-manifest/views.md index ab13f12a..cda43be8 100644 --- a/src/views/docs/en/reference/project-manifest/views.md +++ b/src/views/docs/en/reference/project-manifest/views.md @@ -18,7 +18,7 @@ You can also specify only the routes you want views copied to with the `@views` This `app.arc` file defines specific `@http` functions to copy `src/views/` to: -
    +
    arc
    diff --git a/src/views/docs/en/reference/project-manifest/ws.md b/src/views/docs/en/reference/project-manifest/ws.md index 6796cb44..06037797 100644 --- a/src/views/docs/en/reference/project-manifest/ws.md +++ b/src/views/docs/en/reference/project-manifest/ws.md @@ -11,7 +11,7 @@ Define WebSocket endpoint and Lambda handler functions. This `app.arc` file defines both HTTP and WebSocket endpoints: -
    +
    arc
    From 8c1736dbfebc50ead1b28402e9429014e25d37e2 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Wed, 27 Oct 2021 14:20:24 -0400 Subject: [PATCH 227/680] Issue #440: Fix wrapping on mobile Signed-off-by: Simon MacDonald --- public/css/syntax.css | 2 +- public/static.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 013b30b4..544d8be9 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -16,7 +16,7 @@ margin-bottom: 1.33rem; overflow: auto; border-radius: 0.3rem; - white-space: nowrap; + white-space: pre; word-break: break-word; /* fallback when Shiki encounters unknown syntax */ color: var(--g2); diff --git a/public/static.json b/public/static.json index ea532e4f..61f4b6e7 100644 --- a/public/static.json +++ b/public/static.json @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-ab76f8f61e.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-5bbab8cffd.css" + "css/syntax.css": "css/syntax-4bc1a5ea54.css" } \ No newline at end of file From 4d0a08ad99fbc45707a7d5a67793406f83b58c3b Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 28 Oct 2021 10:30:43 -0600 Subject: [PATCH 228/680] Update custom source path examples (#433) * example custom source syntax updates * test and update all arc configs for custom source paths * update YAML examples with `---` --- .../custom-source-paths.md | 144 +++++++++++++++++- .../en/guides/get-started/project-layout.md | 1 + .../en/reference/project-manifest/events.md | 56 +++++-- .../en/reference/project-manifest/http.md | 85 +++++++---- .../en/reference/project-manifest/proxy.md | 1 + .../en/reference/project-manifest/queues.md | 1 + .../reference/project-manifest/scheduled.md | 52 +++++-- .../en/reference/project-manifest/shared.md | 1 + 8 files changed, 278 insertions(+), 63 deletions(-) diff --git a/src/views/docs/en/guides/developer-experience/custom-source-paths.md b/src/views/docs/en/guides/developer-experience/custom-source-paths.md index 99ae1e81..6943b39c 100644 --- a/src/views/docs/en/guides/developer-experience/custom-source-paths.md +++ b/src/views/docs/en/guides/developer-experience/custom-source-paths.md @@ -13,32 +13,164 @@ Define resources in a more verbose format to configure custom Lambda source dire ## Example + +
    + + +
    arc
    +
    + ```arc +@app +my-arc-app + @http # simple get /foo - # verbose /bar method get - src whatever/dir/you/want + src whatever/http/dir/you/want @events # simple an-event - # verbose another-event - src foo + src whatever/events/dir/you/want @scheduled # simple a-schedule rate(1 day) - # verbose another-schedule rate 1 day - src something + src whatever/scheduled/dir/you/want + +``` +
    +
    + + +
    json
    +
    + +```json +{ + "app": "my-arc-app", + "http": [ + ["get", "/foo"], + { + "/bar": { + "method": "get", + "src": "whatever/http/dir/you/want" + } + } + ], + "events": [ + "an-event", + { + "another-event": { + "src": "whatever/events/dir/you/want" + } + } + ], + "scheduled": { + "a-schedule": { + "rate": [1, "day"] + }, + "another-schedule": { + "rate": [1, "day"], + "src": "whatever/schedueld/dir/you/want" + } + } +} + +``` +
    +
    + + +
    yaml
    +
    + +```yaml +--- +app: my-arc-app + +http: +# simple +- get: "/foo" +# verbose +- "/bar": + method: "get" + src: "whatever/http/dir/you/want" + +events: +# simple +- "an-event" +# verbose +- "another-event": + src: "whatever/events/dir/you/want" + +scheduled: +# simple +- "a-schedule": + rate: + - 1 + - day +# verbose +- "another-schedule": + rate: + - 1 + - day + src: "whatever/scheduled/dir/you/want" + ``` +
    +
    + + +
    toml
    +
    + +```toml +app = "my-arc-app" +# TOML doesn't allow mixed types in an array +# "simple" entries are expanded + +# simple +[[http]] +[http."/foo"] +method = "get" +# verbose +[[http]] +[http."/bar"] +method = "get" +src = "whatever/http/dir/you/want" + +# simple +[[events]] +[events."an-event"] +# verbose +[[events]] +[events."another-event"] +src = "whatever/events/dir/you/want" + +# simple +[[scheduled]] +[scheduled."a-schedule"] +rate = ["1", "day"] +[[scheduled]] +# verbose +[scheduled."another-schedule"] +rate = ["1", "day"] +src = "whatever/scheduled/dir/you/want" + +``` +
    +
    +
    +
    diff --git a/src/views/docs/en/guides/get-started/project-layout.md b/src/views/docs/en/guides/get-started/project-layout.md index 02a6a011..e77739e4 100644 --- a/src/views/docs/en/guides/get-started/project-layout.md +++ b/src/views/docs/en/guides/get-started/project-layout.md @@ -180,6 +180,7 @@ likes
    ```yaml +--- app: "hello" static: fingerprint: true diff --git a/src/views/docs/en/reference/project-manifest/events.md b/src/views/docs/en/reference/project-manifest/events.md index c37678d4..1a63b635 100644 --- a/src/views/docs/en/reference/project-manifest/events.md +++ b/src/views/docs/en/reference/project-manifest/events.md @@ -13,6 +13,8 @@ category: app.arc - Dashes are allowed; underscores are not allowed - Must begin with a letter +Events can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `src` for each event. + ## Example These configuration examples show how to define events: @@ -31,6 +33,10 @@ myapp @events hit-counter likes +# verbose custom source: +custom-webhook + src custom/source + ```
    @@ -44,13 +50,35 @@ likes "app": "myapp", "events": [ "hit-counter", - "likes" + "likes", + { + "custom-webhook": { + "src": "custom/source" + } + } ] } ```
    + +
    yaml
    +
    + +```yaml +--- +app: "myapp" +events: +- hit-counter +- likes +# verbose custom source: +- "custom-webhook": + src: "custom/source" +``` +
    +
    +
    toml
    @@ -61,20 +89,13 @@ events=[ "hit-counter", "likes" ] -``` -
    -
    - -
    yaml
    -
    +# TOML doesn't allow mixed types in an array. +# Theoretically a "table" entry with a custom source would look like: -```yaml ---- -app: "myapp" -events: -- hit-counter -- likes +[[events]] +[events."custom-webhook"] +src = "custom/source" ```
    @@ -86,9 +107,12 @@ Which generates the following scaffolding: ```bash / -├── events -│ ├── hit-counter/ -│ └── likes/ +├── custom +│ └── source/ +├── src +│ └── events +│ ├── hit-counter/ +│ └── likes/ ├── app.arc └── package.json ``` diff --git a/src/views/docs/en/reference/project-manifest/http.md b/src/views/docs/en/reference/project-manifest/http.md index 2bfc3637..133b5fc5 100644 --- a/src/views/docs/en/reference/project-manifest/http.md +++ b/src/views/docs/en/reference/project-manifest/http.md @@ -8,7 +8,7 @@ Define HTTP routes in API Gateway with Lambda handler functions. ## Syntax -Each route is made of two parts: `verb` & `path` +Each route is made up of two parts: HTTP verb and a route path. - HTTP Verb - `get` @@ -17,14 +17,19 @@ Each route is made of two parts: `verb` & `path` - `patch` - `delete` -- Path +- Route Path - Dashes and underscores are not allowed - Must begin with a letter - URL parameters are defined with a leading colon (`:`) +Routes can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `method` and `src` for each route: + +- `method` - HTTP verb +- `src` - path to the function source + ### Additional bits -- Advised maximum of 100 characters +- Advised maximum of 100 characters for paths ## Example @@ -47,6 +52,10 @@ get /pages get /pages/:dateID get /contact post /contact +# verbose custom source: +/weather + method get + src custom/source ```
    @@ -59,17 +68,44 @@ post /contact { "app": "myapp", "http": [ - ["get", "/"]. + ["get", "/"], ["get", "/pages"], ["get", "/pages/:dateID"], ["get", "/contact"], - ["post", "/contact"] + ["post", "/contact"], + { + "/weather": { + "method": "get", + "src": "custom/source", + } + }, ] } ```
    + +
    yaml
    +
    + +```yaml +--- +app: myapp +http: +- get: "/" +- get: "/pages" +- get: "/pages/:dateID" +- get: "/contact" +- post: "/contact" +# verbose custom source: +- "/weather": + method: get + src: "custom/source" +``` +
    +
    +
    toml
    @@ -83,23 +119,13 @@ http=[ ["get", "/contact"], ["post", "/contact"] ] -``` -
    -
    - -
    yaml
    -
    - -```yaml ---- -app: myapp -http: -- get: "/" -- get: "/pages" -- get: "/pages/:dateID" -- get: "/contact" -- post: "/contact" +# TOML doesn't allow mixed types in an array. +# Theoretically a "table" entry with a custom source would look like: +[[http]] +[http."/weather"] +method = "get" +src = "custom/source" ```
    @@ -107,16 +133,19 @@ http:
    -Which generates the following scaffolding: +Which utilizes the following project directory structure: ```bash / -├── http -│ ├── get-index/ -│ ├── get-pages/ -│ ├── get-pages-000dateID/ -│ ├── get-contact/ -│ └── post-contact/ +├── custom +│ └── source/ +├── src +│ └── http +│ ├── get-index/ +│ ├── get-pages/ +│ ├── get-pages-000dateID/ +│ ├── get-contact/ +│ └── post-contact/ ├── app.arc └── package.json ``` diff --git a/src/views/docs/en/reference/project-manifest/proxy.md b/src/views/docs/en/reference/project-manifest/proxy.md index 9ba4f626..2e540034 100644 --- a/src/views/docs/en/reference/project-manifest/proxy.md +++ b/src/views/docs/en/reference/project-manifest/proxy.md @@ -84,6 +84,7 @@ production="https://example.biz"
    ```yaml +--- app: myapp http: - get: "/v2/*" diff --git a/src/views/docs/en/reference/project-manifest/queues.md b/src/views/docs/en/reference/project-manifest/queues.md index 29a50210..97a35b39 100644 --- a/src/views/docs/en/reference/project-manifest/queues.md +++ b/src/views/docs/en/reference/project-manifest/queues.md @@ -71,6 +71,7 @@ queues=[
    ```yaml +--- app: myapp queues: - convert-image diff --git a/src/views/docs/en/reference/project-manifest/scheduled.md b/src/views/docs/en/reference/project-manifest/scheduled.md index da531bfe..a7c4d953 100644 --- a/src/views/docs/en/reference/project-manifest/scheduled.md +++ b/src/views/docs/en/reference/project-manifest/scheduled.md @@ -17,6 +17,8 @@ Define EventBridge schedule expressions with Lambda handler functions. - Interval - A valid `rate` or `cron` expression ([more info here](https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html)) +Scheduled functions can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `rate` or `cron` and `src` for each event. + ### Example These configuration examples show how to define scheduled functions: @@ -35,6 +37,10 @@ myapp @scheduled daily-update-buddy rate(1 day) friyay-only cron(0 15 ? * FRI *) +# verbose custom source: +annual-review + rate 1 year + src custom/source ```
    @@ -49,13 +55,38 @@ friyay-only cron(0 15 ? * FRI *) "app": "myapp", "scheduled": { "daily-update-buddy": "rate(1 day)", - "friyay-only": "cron(0 15 ? * FRI *)" } + "friyay-only": "cron(0 15 ? * FRI *)" }, + "annual-review": { + "rate": [1, "year"], + "src": "whatever/schedueld/dir/you/want" + } } ```
    + +
    yaml
    +
    + +```yaml +--- +app: myapp +scheduled: + - daily-update-buddy: rate(1 day) + - friyay-only: cron(0 15 ? * FRI *) + # verbose custom source: + - "annual-review": + rate: + - 1, + - year + src: "custom/source" +``` + +
    +
    +
    toml
    @@ -66,20 +97,13 @@ app="myapp" [scheduled] daily-update-buddy="rate(1 day)" friyay-only="cron(0 15 ? * FRI *)" -``` -
    -
    - - -
    yaml
    -
    +# TOML doesn't allow mixed types in an array. +# Theoretically a "table" entry with a custom source would look like: -```yaml -app: myapp -scheduled: - - daily-update-buddy: rate(1 day) - - friyay-only: cron(0 15 ? * FRI *) +[scheduled."annual-review"] +rate = ["1", "year"] +src = "custom/source" ```
    @@ -93,6 +117,8 @@ Which generates the following scaffolding: ```bash / +├── custom +│ └── source/ ├── src/ │ └── scheduled/ │ ├── daily-update-buddy/ diff --git a/src/views/docs/en/reference/project-manifest/shared.md b/src/views/docs/en/reference/project-manifest/shared.md index 7392fa40..97b3bd13 100644 --- a/src/views/docs/en/reference/project-manifest/shared.md +++ b/src/views/docs/en/reference/project-manifest/shared.md @@ -67,6 +67,7 @@ src="path/to/code"
    ```yaml +--- app: myapp shared: - src: path/to/code From 36bc9f8d05631c71ff1df6f2d4a34527ba0d6693 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Fri, 29 Oct 2021 13:49:10 -0400 Subject: [PATCH 229/680] Switch from Shiki to hljs Signed-off-by: Simon MacDonald --- package.json | 2 +- public/css/syntax.css | 30 ++++++++++ public/index.js | 4 +- public/static.json | 4 +- .../get-docs-000lang-catchall/arc-grammar.js | 55 +++++++++++++++++++ .../get-docs-000lang-catchall/highlighter.js | 31 ++--------- src/http/get-docs-000lang-catchall/index.js | 15 ++++- 7 files changed, 108 insertions(+), 33 deletions(-) create mode 100644 src/http/get-docs-000lang-catchall/arc-grammar.js diff --git a/package.json b/package.json index a012c91b..2f559d45 100644 --- a/package.json +++ b/package.json @@ -18,12 +18,12 @@ "@architect/package": "^7.1.1", "@toycode/markdown-it-class": "^1.2.4", "esm": "^3.2.25", + "highlight.js": "^11.3.1", "js-yaml": "^4.1.0", "markdown-it": "^12.2.0", "markdown-it-anchor": "^8.4.1", "markdown-it-front-matter": "^0.2.3", "onigasm": "^2.2.5", - "shiki": "^0.9.12", "slugify": "^1.6.1" }, "devDependencies": { diff --git a/public/css/syntax.css b/public/css/syntax.css index 544d8be9..5cc9bd13 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -1,3 +1,30 @@ +/* Atom One Dark */ +.hljs{display:block;overflow-x:auto;padding:.5em;color:#abb2bf;background:#282c34} +.hljs-keyword,.hljs-operator{color:#C678DD} +.hljs-pattern-match{color:#f92672} +.hljs-pattern-match .hljs-constructor{color:#61aeee} +.hljs-function{color:#61aeee} +.hljs-function .hljs-params{color:#a6e22e} +.hljs-function .hljs-params .hljs-typing{color:#fd971f} +.hljs-module-access .hljs-module{color:#7e57c2} +.hljs-constructor{color:#e2b93d} +.hljs-constructor .hljs-string{color:#9ccc65} +.hljs-comment,.hljs-quote{color:#5C6370;;font-style:italic} +.hljs-doctag,.hljs-formula{color:#c678dd} +.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75} +.hljs-literal{color:#D19A66} +.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#98c379} +.hljs-built_in,.hljs-class{color:#56B6C2} +.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type{color:#d19a66} +.hljs-variable{color:#ABB2BF} +.hljs-attr{color:#E06C75} +.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol{color:#61aeee} +.hljs-title{color:#61AFEF;} +.hljs-emphasis{font-style:italic} +.hljs-strong{font-weight:700} +.hljs-link{text-decoration:underline} +.hljs-property{color:#E06C75} + .docs blockquote > p { margin: 0; } @@ -9,6 +36,9 @@ .docs pre code, .docs :not(pre) > code { font-family: Menlo, Monaco, Consolas, monospace; } +.docs pre code { + color: #ABB2BF; +} /* highlighted/Shiki code blocks */ .docs pre { diff --git a/public/index.js b/public/index.js index 018e943b..b08c2181 100644 --- a/public/index.js +++ b/public/index.js @@ -5,7 +5,7 @@ const menuButton = document.getElementById('menu-button') const sidebar = document.getElementById('sidebar') const themeButton = document.getElementById('theme-button') - const codeBlocks = document.querySelectorAll('pre.shiki') + const codeBlocks = document.querySelectorAll('pre.hljs') // Scroll active sidebar link into view if (activeLink) @@ -60,6 +60,8 @@ const parent = target.closest('pre') const codeText = parent.querySelector('code').textContent.trim() + console.log(target) + navigator.clipboard.writeText(codeText).then( () => { target.innerHTML = svgCheck diff --git a/public/static.json b/public/static.json index 61f4b6e7..9c41442d 100644 --- a/public/static.json +++ b/public/static.json @@ -1,6 +1,6 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-272710e748.js", + "index.js": "index-9a00fbd1e9.js", "playground.html": "playground-be6bd7b6cb.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-ab76f8f61e.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-4bc1a5ea54.css" + "css/syntax.css": "css/syntax-adcd2a3ec0.css" } \ No newline at end of file diff --git a/src/http/get-docs-000lang-catchall/arc-grammar.js b/src/http/get-docs-000lang-catchall/arc-grammar.js new file mode 100644 index 00000000..8fe2e4a8 --- /dev/null +++ b/src/http/get-docs-000lang-catchall/arc-grammar.js @@ -0,0 +1,55 @@ +module.exports = function (hljs) { + const LITERALS = [ + 'true', + 'false', + 'null' + ].join(' ') + const PRAGMAS = { + className: 'built_in', + begin: '^@.*' + } + return { + aliases: [ + 'arc', + 'architect' + ], + case_insensitive: true, + keywords: { + literal: LITERALS, + keyword: [ + 'get', + 'post', + 'put', + 'patch', + 'delete', + 'options', + 'head', + 'any', + 'region', + 'profile', + 'runtime', + 'bucket', + 'httpv1', + 'rest', + 'apigateway', + 'fingerprint', + 'folder', + 'staging', + 'production', + 'session', + '_idx', + '_ttl' + ].join(' ') + }, + contains: [ + { + className: 'string', + begin: "'", end: "'" + }, + hljs.COMMENT( + '#.*' + ), + PRAGMAS + ] + } +} diff --git a/src/http/get-docs-000lang-catchall/highlighter.js b/src/http/get-docs-000lang-catchall/highlighter.js index 72c43549..7664d910 100644 --- a/src/http/get-docs-000lang-catchall/highlighter.js +++ b/src/http/get-docs-000lang-catchall/highlighter.js @@ -1,35 +1,14 @@ -const path = require('path') -const shiki = require('./shiki/dist') -const arcGrammar = require('./arc-textmate.json') +module.exports = function (hljs, escapeHtml, str, lang) { + if (lang && hljs.getLanguage(lang)) { -module.exports.forMarkdown = async function () { - const theme = await shiki.loadTheme(path.join(__dirname, './themes/atom-one-dark.json')) - const highlighter = await shiki.getHighlighter({ - theme, - langs: [ - 'bash', - 'javascript', - 'json', - 'powershell', - 'python', - 'ruby', - 'toml', - 'yaml', - { - id: 'arc', - scopeName: 'source.arc', - grammar: arcGrammar - } - ], - }) - - return function (code, lang) { try { - return highlighter.codeToHtml(code, lang) + return `
    ${hljs.highlight(str, { language: lang, ignoreIllegals: true }).value}
    ` } catch (error) { console.log(`Highlighter unsupported language: ${lang}`) return '' } } + + return `
    ${escapeHtml(str)}
    ` } diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 3e79c2f9..5a719993 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -12,7 +12,12 @@ const markdownAnchor = require('markdown-it-anchor') const frontmatterParser = require('markdown-it-front-matter') const yaml = require('js-yaml') const classMapping = require('./markdown-class-mappings') -const highlighter = require('./highlighter') +const hljs = require('highlight.js') +const { escapeHtml } = Markdown().utils +const highlight = require('./highlighter') + .bind(null, hljs, escapeHtml) +const arcGrammar = require('./arc-grammar') +hljs.registerLanguage('arc', arcGrammar) const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default const NotFound = require('@architect/views/modules/components/not-found.js').default @@ -21,6 +26,7 @@ const algolia = require('@architect/views/modules/components/algolia.js').defaul const cache = {} // cheap warm cache async function handler (req) { + console.time('get-docs-000lang-catchall') let { pathParameters } = req let { lang, proxy } = pathParameters let parts = proxy.split('/') @@ -83,7 +89,7 @@ async function handler (req) { linkify: true, html: true, typographer: true, - highlight: await highlighter.forMarkdown() + highlight }) .use(markdownClass, classMapping) .use(markdownAnchor) @@ -93,7 +99,7 @@ async function handler (req) { const children = markdown.render(file) const { category, description, sections, title } = frontmatter - return { + const retval = { statusCode: 200, headers: { 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', @@ -117,6 +123,9 @@ async function handler (req) { toc }) } + console.timeEnd('get-docs-000lang-catchall') + + return retval } exports.handler = http.async(redirectMiddleware, handler) From 012fd4298d07d2a9e85269eac20096a1fd0c488b Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Fri, 29 Oct 2021 14:01:48 -0400 Subject: [PATCH 230/680] Always use dark mode for code blocks Signed-off-by: Simon MacDonald --- public/css/syntax.css | 10 ++++++++-- public/static.json | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 5cc9bd13..36e09bd7 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -40,7 +40,7 @@ color: #ABB2BF; } -/* highlighted/Shiki code blocks */ +/* highlighted/hljs code blocks */ .docs pre { padding: 1rem; margin-bottom: 1.33rem; @@ -48,11 +48,17 @@ border-radius: 0.3rem; white-space: pre; word-break: break-word; - /* fallback when Shiki encounters unknown syntax */ + /* fallback when hljs encounters unknown syntax */ color: var(--g2); background-color: var(--g9); } +:root[data-theme="dark"] .docs pre { + /* fallback when hljs encounters unknown syntax */ + color: var(--g8); + background-color: var(--g1); +} + .docs div[slot='content'] pre { border-radius: 0 0.3rem 0.3rem 0.3rem; } diff --git a/public/static.json b/public/static.json index 9c41442d..63d82329 100644 --- a/public/static.json +++ b/public/static.json @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-ab76f8f61e.css", "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-adcd2a3ec0.css" + "css/syntax.css": "css/syntax-0339098006.css" } \ No newline at end of file From fd86ccf656f8a9a91eb63cdef11ef31e4ec25c5d Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Fri, 29 Oct 2021 14:13:53 -0400 Subject: [PATCH 231/680] Use shared grammar package Signed-off-by: Simon MacDonald --- package.json | 1 + .../get-docs-000lang-catchall/arc-grammar.js | 55 ------------------- src/http/get-docs-000lang-catchall/index.js | 4 +- 3 files changed, 3 insertions(+), 57 deletions(-) delete mode 100644 src/http/get-docs-000lang-catchall/arc-grammar.js diff --git a/package.json b/package.json index 2f559d45..7e8dc2c4 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "@architect/asap": "^4.1.0", "@architect/functions": "^4.0.0", + "@architect/grammars": "github:architect/grammars", "@architect/inventory": "^2.1.0", "@architect/package": "^7.1.1", "@toycode/markdown-it-class": "^1.2.4", diff --git a/src/http/get-docs-000lang-catchall/arc-grammar.js b/src/http/get-docs-000lang-catchall/arc-grammar.js deleted file mode 100644 index 8fe2e4a8..00000000 --- a/src/http/get-docs-000lang-catchall/arc-grammar.js +++ /dev/null @@ -1,55 +0,0 @@ -module.exports = function (hljs) { - const LITERALS = [ - 'true', - 'false', - 'null' - ].join(' ') - const PRAGMAS = { - className: 'built_in', - begin: '^@.*' - } - return { - aliases: [ - 'arc', - 'architect' - ], - case_insensitive: true, - keywords: { - literal: LITERALS, - keyword: [ - 'get', - 'post', - 'put', - 'patch', - 'delete', - 'options', - 'head', - 'any', - 'region', - 'profile', - 'runtime', - 'bucket', - 'httpv1', - 'rest', - 'apigateway', - 'fingerprint', - 'folder', - 'staging', - 'production', - 'session', - '_idx', - '_ttl' - ].join(' ') - }, - contains: [ - { - className: 'string', - begin: "'", end: "'" - }, - hljs.COMMENT( - '#.*' - ), - PRAGMAS - ] - } -} diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 5a719993..22ccded0 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -16,8 +16,8 @@ const hljs = require('highlight.js') const { escapeHtml } = Markdown().utils const highlight = require('./highlighter') .bind(null, hljs, escapeHtml) -const arcGrammar = require('./arc-grammar') -hljs.registerLanguage('arc', arcGrammar) +const { arc } = require('@architect/grammars') +hljs.registerLanguage('arc', arc) const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default const NotFound = require('@architect/views/modules/components/not-found.js').default From a5460547d69b0f70584bba3c7d3b07a0e2aa784f Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Fri, 29 Oct 2021 15:17:25 -0400 Subject: [PATCH 232/680] 3.6.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e8dc2c4..3465b225 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.6", + "version": "3.6.7", "scripts": { "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", From 36e42d5a48f03da272637517b382f5e82f294671 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 28 Oct 2021 22:22:01 -0600 Subject: [PATCH 233/680] test redirect map and add v5/6 entries using my best guess for destinations for old docs. when in doubt, it is redirected to the root --- package.json | 6 +- src/http/any-catchall/index.js | 2 +- src/http/get-docs-000lang-catchall/index.js | 2 +- src/shared/redirect-map.js | 104 +++++++++++++++++--- test/backend/redirect-map-test.js | 82 +++++++++++++++ 5 files changed, 175 insertions(+), 21 deletions(-) create mode 100644 test/backend/redirect-map-test.js diff --git a/package.json b/package.json index 3465b225..fbaa9612 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@architect/asap": "^4.1.0", "@architect/functions": "^4.0.0", "@architect/grammars": "github:architect/grammars", - "@architect/inventory": "^2.1.0", + "@architect/inventory": "^2.1.1", "@architect/package": "^7.1.1", "@toycode/markdown-it-class": "^1.2.4", "esm": "^3.2.25", @@ -32,11 +32,11 @@ "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary", "@architect/syntaxes": "github:architect/syntaxes#v1.0.1", - "eslint": "^8.0.0", + "eslint": "^8.1.0", "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", "tape": "^5.3.1", - "tiny-json-http": "^7.3.0" + "tiny-json-http": "^7.3.1" }, "eslintConfig": { "extends": "@architect/eslint-config" diff --git a/src/http/any-catchall/index.js b/src/http/any-catchall/index.js index 0509f402..4bddfd7a 100644 --- a/src/http/any-catchall/index.js +++ b/src/http/any-catchall/index.js @@ -3,7 +3,7 @@ require = require('esm')(module) const { http } = require('@architect/functions') const asap = require('@architect/asap') -const redirectMiddleware = require('@architect/shared/redirect-map') +const { redirect: redirectMiddleware } = require('@architect/shared/redirect-map') const notFoundResponse = require('@architect/shared/not-found-response') const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 22ccded0..7ea2f31d 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -4,7 +4,7 @@ require = require('esm')(module) const path = require('path') const { readFile } = require('fs/promises') const { http } = require('@architect/functions') -const redirectMiddleware = require('@architect/shared/redirect-map') +const { redirect: redirectMiddleware } = require('@architect/shared/redirect-map') const notFoundResponse = require('@architect/shared/not-found-response') const Markdown = require('markdown-it') const markdownClass = require('@toycode/markdown-it-class') diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index a0442d98..1cf7c7c9 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -1,7 +1,9 @@ -// these are soft redirects, not forever/caonincal +const currentRoot = '/docs/en/guides/get-started/quickstart' + +// these are soft redirects, not forever/canonical const tempRedirects = { // tmp until marketing landing page work done - '/': '/docs/en/guides/get-started/quickstart', + '/': currentRoot, // Canonical pragma paths '/app': '/docs/en/reference/project-manifest/app', @@ -16,8 +18,8 @@ const tempRedirects = { '/@indexes': '/docs/en/reference/project-manifest/indexes', '/macros': '/docs/en/reference/project-manifest/macros', '/@macros': '/docs/en/reference/project-manifest/macros', - '/plugins': '/docs/en/reference/project-manifest/plugins', - '/@plugins': '/docs/en/reference/project-manifest/plugins', + '/plugins': '/docs/en/reference/project-manifest/macros', // TODO: update with new plugins doc + '/@plugins': '/docs/en/reference/project-manifest/macros', // TODO: update with new plugins doc '/proxy': '/docs/en/reference/project-manifest/proxy', '/@proxy': '/docs/en/reference/project-manifest/proxy', '/queues': '/docs/en/reference/project-manifest/queues', @@ -38,7 +40,7 @@ const tempRedirects = { '/@ws': '/docs/en/reference/project-manifest/ws', } -// redirect known v6 arc urls to v8 and then to v9 +// redirect known v5/6 arc urls to v8 and then to v9 const permanentRedirects = { '/examples': '/docs/en/guides/examples', @@ -69,7 +71,7 @@ const permanentRedirects = { // Guides // round 1: Q1 2021 - '/guides/upgrade': '/docs/en/about/upgrade', + '/guides/upgrade': '/docs/en/about/upgrade-guide', '/guides/testing': '/docs/en/guides/developer-experience/local-development', '/guides/project-manifest': '/docs/en/guides/get-started/project-layout', '/guides/share-code': '/docs/en/guides/developer-experience/sharing-code', @@ -125,16 +127,16 @@ const permanentRedirects = { // Reference > Configuration > Local preferences // round 1: Q1 2021 - '/reference/preferences#create': '/docs/en/reference/configuration/local-preferences/create', - '/reference/preferences#env': '/docs/en/reference/configuration/local-preferences/env', - '/reference/preferences#.env': '/docs/en/reference/configuration/local-preferences/.env', - '/reference/preferences#sandbox': '/docs/en/reference/configuration/local-preferences/sandbox', + '/reference/preferences#create': '/docs/en/reference/configuration/local-preferences#%40create', + '/reference/preferences#env': '/docs/en/reference/configuration/local-preferences#%40env', + '/reference/preferences#.env': '/docs/en/reference/configuration/local-preferences#%40env', + '/reference/preferences#sandbox': '/docs/en/reference/configuration/local-preferences#%40sandbox', // round 2: Q4 2021 - '/docs/en/reference/prefs.arc/create': '/docs/en/reference/configuration/local-preferences/create', - '/docs/en/reference/prefs.arc/env': '/docs/en/reference/configuration/local-preferences/env', - '/docs/en/reference/prefs.arc/.env': '/docs/en/reference/configuration/local-preferences/.env', - '/docs/en/reference/prefs.arc/sandbox': '/docs/en/reference/configuration/local-preferences/sandbox', - '/docs/en/reference/prefs.arc/sandbox-startup': '/docs/en/reference/configuration/local-preferences/sandbox-startup', + '/docs/en/reference/prefs.arc/create': '/docs/en/reference/configuration/local-preferences#%40create', + '/docs/en/reference/prefs.arc/env': '/docs/en/reference/configuration/local-preferences#%40env', + '/docs/en/reference/prefs.arc/.env': '/docs/en/reference/configuration/local-preferences#%40env', + '/docs/en/reference/prefs.arc/sandbox': '/docs/en/reference/configuration/local-preferences#%40sandbox', + '/docs/en/reference/prefs.arc/sandbox-startup': '/docs/en/reference/configuration/local-preferences#%40sandbox-startup', // Reference > CLI // round 1: Q1 2021 @@ -163,9 +165,79 @@ const permanentRedirects = { '/docs/en/reference/runtime/deno': '/docs/en/reference/runtime-helpers/deno', '/docs/en/reference/runtime/ruby': '/docs/en/reference/runtime-helpers/ruby', '/docs/en/reference/runtime/python': '/docs/en/reference/runtime-helpers/python', + + // v5 and v6 archive + // round 1 addendum + // TODO: revisit these as new guides and tutorials are added + '/guides/http': '/docs/en/reference/runtime-helpers/node.js#arc.http', + '/guides/offline': '/docs/en/guides/developer-experience/local-development', + '/guides/static-assets': '/docs/en/guides/frontend/static-assets', + '/guides/spa': '/docs/en/reference/runtime-helpers/node.js#%40architect%2Fasap', + '/guides/sessions': '/docs/en/reference/runtime-helpers/node.js#arc.http.session', + '/guides/middleware': '/docs/en/reference/runtime-helpers/node.js#arc.http', + '/guides/data': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/guides/background-tasks': '/docs/en/reference/runtime-helpers/node.js#arc.events', + '/guides/cors': '/docs/en/reference/runtime-helpers/node.js#responses', + '/guides/logging': '/docs/en/guides/developer-experience/logging-and-monitoring', + '/guides/custom-dns': '/docs/en/guides/domains/overview', + '/guides/ws': '/docs/en/reference/runtime-helpers/node.js#arc.ws', + '/guides/documentdb': currentRoot, + '/guides/multiple-aws-accounts': '/docs/en/guides/get-started/detailed-aws-setup', + '/guides/iam': '/docs/en/guides/get-started/detailed-aws-setup', + '/guides/yaml-and-json': '/docs/en/guides/get-started/project-layout', + '/guides/deps': '/docs/en/guides/developer-experience/dependency-management', + '/reference/arc-audit': currentRoot, + '/reference/arc-config': currentRoot, + '/reference/arc-create': '/docs/en/reference/cli/init', + '/reference/arc-deploy': '/docs/en/reference/cli/deploy', + '/reference/arc-dns': currentRoot, + '/reference/arc-env': '/docs/en/reference/cli/env', + '/reference/arc-hydrate': '/docs/en/reference/cli/hydrate', + '/reference/arc-inventory': currentRoot, + '/reference/arc-logs': '/docs/en/reference/cli/logs', + '/reference/arc-repl': currentRoot, + '/reference/arc-sandbox': '/docs/en/reference/cli/sandbox', + '/reference/app': '/docs/en/reference/project-manifest/app', + '/reference/aws': '/docs/en/reference/project-manifest/aws', + '/reference/domain': currentRoot, + '/reference/events': '/docs/en/reference/project-manifest/events', + '/reference/http': '/docs/en/reference/project-manifest/http', + '/reference/indexes': '/docs/en/reference/project-manifest/indexes', + '/reference/queues': '/docs/en/reference/project-manifest/queues', + '/reference/scheduled': '/docs/en/reference/project-manifest/scheduled', + '/reference/static': '/docs/en/reference/project-manifest/static', + '/reference/tables': '/docs/en/reference/project-manifest/tables', + '/reference/ws': '/docs/en/reference/project-manifest/ws', + '/reference/events-publish': '/docs/en/reference/runtime-helpers/node.js#arc.events', + '/reference/events-subscribe': '/docs/en/reference/runtime-helpers/node.js#arc.events', + '/reference/http-functions': '/docs/en/reference/runtime-helpers/node.js#arc.http', + '/reference/http-helpers': '/docs/en/reference/runtime-helpers/node.js#arc.http', + '/reference/http-session': '/docs/en/reference/runtime-helpers/node.js#arc.http.session', + '/reference/middleware': '/docs/en/reference/runtime-helpers/node.js#arc.http', + '/reference/proxy-public': '/docs/en/reference/runtime-helpers/node.js#%40architect%2Fasap', + '/reference/proxy-read': '/docs/en/reference/runtime-helpers/node.js#%40architect%2Fasap', + '/reference/queues-publish': '/docs/en/reference/runtime-helpers/node.js#arc.queues', + '/reference/queues-subscribe': '/docs/en/reference/runtime-helpers/node.js#arc.queues', + '/reference/tables-destroy': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/tables-insert': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/tables-update': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/ws-functions': '/docs/en/reference/runtime-helpers/node.js#arc.ws', + '/reference/data': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-name': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-db': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-doc': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-get': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-query': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-scan': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-put': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-update': '/docs/en/reference/runtime-helpers/node.js#arc.tables', + '/reference/data-delete': '/docs/en/reference/runtime-helpers/node.js#arc.tables', } -module.exports = async function redirect (req) { +exports.tempRedirects = tempRedirects +exports.permanentRedirects = permanentRedirects + +exports.redirect = async function redirect (req) { const reqPath = req.requestContext.http.path const isGet = req.requestContext.http.method.toLowerCase() === 'get' diff --git a/test/backend/redirect-map-test.js b/test/backend/redirect-map-test.js new file mode 100644 index 00000000..24bce77c --- /dev/null +++ b/test/backend/redirect-map-test.js @@ -0,0 +1,82 @@ +const { stat } = require('fs/promises') +const path = require('path') +const test = require('tape') +const { redirect, tempRedirects, permanentRedirects } = require('../../src/shared/redirect-map') + +test('redirect map middleware', async t => { + t.plan(5) + + t.equal(typeof redirect, 'function', 'Redirect middleware is a function') + + const redirectResponse = await redirect({ + requestContext: { + http: { + method: 'GET', + path: '/examples', + } + } + }) + const expectedResponse = { + statusCode: 301, + headers: { + location: '/docs/en/guides/examples', + }, + } + t.deepEqual(redirectResponse, expectedResponse, 'Correctly redirect permanent mapped path') + + const tempRedirectResponse = await redirect({ + requestContext: { + http: { + method: 'GET', + path: '/', + } + } + }) + const expectedTempResponse = { + statusCode: 302, + headers: { + location: '/docs/en/guides/get-started/quickstart', + }, + } + t.deepEqual(tempRedirectResponse, expectedTempResponse, 'Correctly redirect temporary mapped path') + + const nonRedirectResponse = await redirect({ + requestContext: { + http: { + method: 'get', + path: '/unmapped/path' + } + } + }) + t.notOk(nonRedirectResponse, "Don't respond to unmapped path") + + const postResponse = await redirect({ + requestContext: { + http: { + method: 'POST', + path: '/examples' + } + } + }) + t.notOk(postResponse, "Don't respond to POST method") +}) + +test('all redirect destinations exist', async t => { + t.plan(3) + + t.equal(typeof tempRedirects, 'object', 'tempRedirects map') + t.equal(typeof permanentRedirects, 'object', 'permanentRedirects map') + + const destinations = [ ...Object.values(tempRedirects), ...Object.values(permanentRedirects) ] + for (const destination of destinations) { + const filePath = destination.split('#')[0] + '.md' + try { + await stat(path.join(__dirname, '../../src/views', filePath)) + } + catch (error) { + t.fail(error) + } + } + + t.pass(`Checked for ${destinations.length} files`) +}) From 75e8032a4a7e434cfb7abf0a834886d90f1506cc Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 28 Oct 2021 22:29:23 -0600 Subject: [PATCH 234/680] don't url encode redirect destination paths --- src/shared/redirect-map.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index 1cf7c7c9..8c825978 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -127,16 +127,16 @@ const permanentRedirects = { // Reference > Configuration > Local preferences // round 1: Q1 2021 - '/reference/preferences#create': '/docs/en/reference/configuration/local-preferences#%40create', - '/reference/preferences#env': '/docs/en/reference/configuration/local-preferences#%40env', - '/reference/preferences#.env': '/docs/en/reference/configuration/local-preferences#%40env', - '/reference/preferences#sandbox': '/docs/en/reference/configuration/local-preferences#%40sandbox', + '/reference/preferences#create': '/docs/en/reference/configuration/local-preferences#@create', + '/reference/preferences#env': '/docs/en/reference/configuration/local-preferences#@env', + '/reference/preferences#.env': '/docs/en/reference/configuration/local-preferences#@env', + '/reference/preferences#sandbox': '/docs/en/reference/configuration/local-preferences#@sandbox', // round 2: Q4 2021 - '/docs/en/reference/prefs.arc/create': '/docs/en/reference/configuration/local-preferences#%40create', - '/docs/en/reference/prefs.arc/env': '/docs/en/reference/configuration/local-preferences#%40env', - '/docs/en/reference/prefs.arc/.env': '/docs/en/reference/configuration/local-preferences#%40env', - '/docs/en/reference/prefs.arc/sandbox': '/docs/en/reference/configuration/local-preferences#%40sandbox', - '/docs/en/reference/prefs.arc/sandbox-startup': '/docs/en/reference/configuration/local-preferences#%40sandbox-startup', + '/docs/en/reference/prefs.arc/create': '/docs/en/reference/configuration/local-preferences#@create', + '/docs/en/reference/prefs.arc/env': '/docs/en/reference/configuration/local-preferences#@env', + '/docs/en/reference/prefs.arc/.env': '/docs/en/reference/configuration/local-preferences#@env', + '/docs/en/reference/prefs.arc/sandbox': '/docs/en/reference/configuration/local-preferences#@sandbox', + '/docs/en/reference/prefs.arc/sandbox-startup': '/docs/en/reference/configuration/local-preferences#@sandbox-startup', // Reference > CLI // round 1: Q1 2021 @@ -172,7 +172,7 @@ const permanentRedirects = { '/guides/http': '/docs/en/reference/runtime-helpers/node.js#arc.http', '/guides/offline': '/docs/en/guides/developer-experience/local-development', '/guides/static-assets': '/docs/en/guides/frontend/static-assets', - '/guides/spa': '/docs/en/reference/runtime-helpers/node.js#%40architect%2Fasap', + '/guides/spa': '/docs/en/reference/runtime-helpers/node.js#@architect/asap', '/guides/sessions': '/docs/en/reference/runtime-helpers/node.js#arc.http.session', '/guides/middleware': '/docs/en/reference/runtime-helpers/node.js#arc.http', '/guides/data': '/docs/en/reference/runtime-helpers/node.js#arc.tables', @@ -214,8 +214,8 @@ const permanentRedirects = { '/reference/http-helpers': '/docs/en/reference/runtime-helpers/node.js#arc.http', '/reference/http-session': '/docs/en/reference/runtime-helpers/node.js#arc.http.session', '/reference/middleware': '/docs/en/reference/runtime-helpers/node.js#arc.http', - '/reference/proxy-public': '/docs/en/reference/runtime-helpers/node.js#%40architect%2Fasap', - '/reference/proxy-read': '/docs/en/reference/runtime-helpers/node.js#%40architect%2Fasap', + '/reference/proxy-public': '/docs/en/reference/runtime-helpers/node.js#@architect/Fasap', + '/reference/proxy-read': '/docs/en/reference/runtime-helpers/node.js#@architect/Fasap', '/reference/queues-publish': '/docs/en/reference/runtime-helpers/node.js#arc.queues', '/reference/queues-subscribe': '/docs/en/reference/runtime-helpers/node.js#arc.queues', '/reference/tables-destroy': '/docs/en/reference/runtime-helpers/node.js#arc.tables', From fe47c3473ec1f1ba350ee1a416c381d36a1f360e Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 29 Oct 2021 15:27:09 -0600 Subject: [PATCH 235/680] Runtime docs with new aliases (#444) Rearrange and update "Detailed AWS setup" doc Update @aws doc Update Function Config doc Update Deno doc/statement --- scripts/dictionary.txt | 1 + .../guides/get-started/detailed-aws-setup.md | 48 +++++++++---------- .../configuration/function-config.md | 22 ++++----- .../docs/en/reference/project-manifest/aws.md | 30 ++++++++++-- .../docs/en/reference/runtime-helpers/deno.md | 7 ++- src/views/docs/table-of-contents.js | 12 ++--- 6 files changed, 69 insertions(+), 51 deletions(-) diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt index 7a12cf20..121a0e5d 100644 --- a/scripts/dictionary.txt +++ b/scripts/dictionary.txt @@ -1,3 +1,4 @@ +ℹ &rarr ACM arc-example-cors diff --git a/src/views/docs/en/guides/get-started/detailed-aws-setup.md b/src/views/docs/en/guides/get-started/detailed-aws-setup.md index 789f0c74..7ee89150 100644 --- a/src/views/docs/en/guides/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/guides/get-started/detailed-aws-setup.md @@ -1,55 +1,51 @@ --- -title: Detailed setup +title: Detailed AWS setup category: Get started -description: Setting up and installing Architect. +description: Setting up, installing, and working with Architect and AWS. --- -> To work locally all you need is [Node](https://nodejs.org), any additional [supported runtimes](#supported-runtimes) you plan to use, and the [Architect CLI](#install-architect). +> To work locally all you need is [Node](https://nodejs.org), any additional [supported runtimes](#runtime-environments) you plan to use, and the [Architect CLI](#install-architect). ## AWS deployment requirements 1. [Node](https://nodejs.org) for Architect 2. [Python](https://www.python.org) for the AWS CLI -3. Any additional [supported runtimes](#supported-runtimes) you plan to use +3. Any additional [supported runtimes](#runtime-environments) you plan to use 4. [AWS CLI](#aws-cli) 5. [AWS credentials](#credentials) 6. [Architect CLI](#install-architect) --- -### Supported runtimes +### Runtime Environments Architect supports the following runtime versions: -- Node.js `14.x` using `npm` -- Deno `1.6.x` -- Ruby `2.5` using `bundle` -- Python `3.8` using `pip3` +- **Node.js**: `14.x` (default) using `npm` +- **Ruby**: `2.7` using `bundle` +- **Python**: `3.9`, `3.8`, `3.7`, and `3.6` using `pip3` +- **Deno**: `1.6.x` ([under development](../../reference/runtime-helpers/deno)) -> Working locally with the Architect `sandbox` requires target runtimes to be available in your `$PATH`. +> ⚠️ Working locally with the Architect `sandbox` requires target runtimes to be available in your `$PATH`. -To change the default runtime add it to the `app.arc` under the `@aws` pragma: +Additionally, standard AWS managed runtimes are supported in live infra, but not while working locally with [Sandbox](../../reference/cli/sandbox) (at present): -```arc -# Valid runtimes: -# - nodejs14.x (default) -# - deno -# - python3.8 -# - ruby2.5 +- **Go**: `1.x` +- **.NET**: `3.1` +- **Java**: `11`, and `8` -@aws -runtime python3.8 -``` +Architect also supports _any custom runtime_ in live infra using either [Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) or [Lambda container images](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html). -> This setting can be overridden on a function-by-function basis with [`config.arc`](/docs/en/reference/configuration/function-config). +Change a project's default runtime by specifying [an explicit environment](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) or an alias in `app.arc` with [the `@aws` pragma](../../reference/project-manifest/aws). -Architect supports the following standard AWS managed runtimes in live infra, but not while working locally (at present): +#### Example -- Go: `1.x`, -- .NET: `2.1` -- Java: `8` +```arc +@aws +runtime python3.8 +``` -Architect can support _any custom runtime_ in live infra using either [Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) or [Lambda container images](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html). +> ℹ️ This setting can be overridden on a function-by-function basis with [`config.arc`](../../reference/configuration/function-config). --- diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md index 13e0e543..bed9bf42 100644 --- a/src/views/docs/en/reference/configuration/function-config.md +++ b/src/views/docs/en/reference/configuration/function-config.md @@ -12,9 +12,9 @@ sections: - 'architecture' --- -Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`) with the `@aws` pragma and the following properties: +Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`) with [the `@aws` pragma](../project-manifest/aws) and the following properties: -- [`runtime`](#runtime) - `nodejs14.x` (default), `deno`, `python3.7`, `python3.6`, or `ruby.5`, etc. +- [`runtime`](#runtime) - string, Lambda runtime or alias: `nodejs14.x` (default), `python3.7`, `dotnetcore3.1`, `node`, `py`, `.net`, etc. - [`memory`](#memory) - number, between `128`MB and `3008`MB in 64 MB increments. - [`timeout`](#timeout) - number, in seconds (max `900`) - [`concurrency`](#concurrency) - number, `0` to AWS account maximum (if not present, concurrency is unthrottled) @@ -28,7 +28,7 @@ Configure individual Lambda function properties (e.g. `src/http/get-index/config ```arc @aws -runtime python3.7 +runtime ruby memory 256 timeout 3 concurrency 1 @@ -44,22 +44,18 @@ Read more about the [Lambda limits](https://docs.aws.amazon.com/lambda/latest/dg Configure Lambda function `runtime`: -- `nodejs14.x` (default) -- `deno` -- `python3.8` -- `ruby2.5` +- `nodejs14.x` (default), `nodejs12.x`, `python3.9`, `ruby2.7` +- Unsupported by Sandbox locally: `dotnetcore3.1`, `go1.x`, `java11` +- Or a runtime alias: `nodejs`, `python`, `ruby`, `.net`, `go`, `java` + - Aliases always default to the latest version of the matched runtime: `ruby` => `ruby2.7`. -Also configurable but not supported by Architect Sandbox: - -- `java8` -- `go1.x` -- `dotnetcore2.1` +See [@aws](../project-manifest/aws) for further reference. ### Example ```arc @aws -runtime deno +runtime ruby ``` ## `memory` diff --git a/src/views/docs/en/reference/project-manifest/aws.md b/src/views/docs/en/reference/project-manifest/aws.md index 52d343d7..2b46e9b3 100644 --- a/src/views/docs/en/reference/project-manifest/aws.md +++ b/src/views/docs/en/reference/project-manifest/aws.md @@ -4,7 +4,7 @@ category: app.arc description: Define AWS specific configuration. --- -Define AWS specific configuration. +Define AWS specific configuration for an entire project or [per function](../configuration/function-config). ## Syntax @@ -13,9 +13,25 @@ Define AWS specific configuration. - `profile`: name of the profile you prefer to use with this project, as defined in your local [AWS profile](/quickstart) - Can also be specified in `AWS_PROFILE` environment variable - Required to deploy to AWS -- `runtime`: Lambda runtime, can be one of: - - `nodejs14.x` (default), `nodejs12.x`, `deno`, `python3.8`, `python3.7`, `python3.6`, `ruby2.7`, `ruby2.5` - - Unsupported by [Sandbox](/docs/en/reference/cli/sandbox): `go1.x`, `dotnetcore3.1`, `dotnetcore2.1`, `java11`, `java8` +- `runtime`: Lambda runtime, as defined by the [`lambda-runtimes`](https://github.com/architect/lambda-runtimes/blob/cad3b158968805a01103e47c08da48132620594e/cjs/index.js) lib: + - Explicit runtime version: + - `nodejs14.x` (default) + - `nodejs12.x` + - `python3.9` + - `python3.8` + - `ruby2.7` + - Explicit but unsupported locally in [Sandbox](../cli/sandbox): + - `dotnetcore3.1` + - `go1.x` + - `java11` + - `java8` + - Simple runtime alias (defaults to the latest version): + - `node` / `nodejs` / `node.js` + - `python` / `py` + - `ruby` / `rb` + - `java` + - `golang` / `go` + - `dotnet` / `.net` - `bucket`: bucket (in same region) for CloudFormation deployment artifacts - If not specified, a secure deployment bucket will be auto-created for your app - `apigateway`: API Gateway API type, can be one of: @@ -33,7 +49,7 @@ If you have AWS exports in your `.bashrc` and `@aws` specified in your `app.arc` ## Example -For example, to deploy to the northern California AWS AZ with your AWS `work` profile's credentials, use: +For example, to deploy Ruby to the northern California AWS AZ with your AWS `work` profile's credentials, use:
    @@ -44,6 +60,7 @@ For example, to deploy to the northern California AWS AZ with your AWS `work` pr ```arc @aws +runtime ruby region us-west-1 profile work ``` @@ -58,6 +75,7 @@ profile work ```json { "aws": { + "runtime": "ruby", "region": "us-west-1", "profile": "work" } @@ -73,6 +91,7 @@ profile work ```toml [aws] +runtime="ruby" region="us-west-1" profile="work" ``` @@ -87,6 +106,7 @@ profile="work" ```yaml --- aws: + runtime: ruby region: us-west-1 profile: work ``` diff --git a/src/views/docs/en/reference/runtime-helpers/deno.md b/src/views/docs/en/reference/runtime-helpers/deno.md index 30ec0075..bea7970e 100644 --- a/src/views/docs/en/reference/runtime-helpers/deno.md +++ b/src/views/docs/en/reference/runtime-helpers/deno.md @@ -4,4 +4,9 @@ category: Runtime description: Deno runtime support --- -Coming soon: and you can help out! [Track the issue here.](https://github.com/architect/architect/issues/1035) +The Architect team has a strong interest in [Deno](https://deno.land/) as a runtime. Ideally, Deno would be supported both locally with Sandbox and in live infrastructure on AWS. + +* Track [runtime helper](https://github.com/architect/functions-deno) progress. +* Join the discussion on [GitHub](https://github.com/architect/architect/discussions) and [Discord](https://discord.gg/y5A2eTsCRX). + +Contributions are always welcome! diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 03ab1260..dd26be83 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -27,7 +27,7 @@ let Guides = [ 'Dreamhost', 'GoDaddy', 'Namecheap', - 'One' + 'One', ] } ], @@ -36,7 +36,7 @@ let Guides = [ 'Plugins', ] }, - 'Examples' + 'Examples', ] let Reference = [ { @@ -54,7 +54,7 @@ let Reference = [ { '@static', '@tables', '@views', - '@ws' + '@ws', ], 'Configuration': [ 'Function config', @@ -70,9 +70,9 @@ let Reference = [ { ], 'Runtime helpers': [ 'Node.js', - 'Deno', 'Ruby', - 'Python' + 'Python', + 'Deno', ], } ] @@ -87,5 +87,5 @@ let About = [ module.exports = { Guides, Reference, - About + About, } From 242a69295b4ea8d83bf10feb6c300acdd5228721 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 29 Oct 2021 15:39:45 -0600 Subject: [PATCH 236/680] remove shiki remnants --- package.json | 6 +- public/index.js | 2 - public/static.json | 2 +- readme.md | 10 - scripts/hydrate-shiki-deps | 19 - .../shiki/dist/index.js | 2143 ------ .../languages/javascript.tmLanguage.json | 5876 ----------------- .../shiki/languages/json.tmLanguage.json | 213 - .../languages/powershell.tmLanguage.json | 1029 --- .../shiki/languages/python.tmLanguage.json | 5332 --------------- .../shiki/languages/ruby.tmLanguage.json | 2775 -------- .../languages/shellscript.tmLanguage.json | 1283 ---- .../shiki/languages/toml.tmLanguage.json | 430 -- .../shiki/languages/yaml.tmLanguage.json | 621 -- 14 files changed, 2 insertions(+), 19739 deletions(-) delete mode 100755 scripts/hydrate-shiki-deps delete mode 100644 src/http/get-docs-000lang-catchall/shiki/dist/index.js delete mode 100644 src/http/get-docs-000lang-catchall/shiki/languages/javascript.tmLanguage.json delete mode 100644 src/http/get-docs-000lang-catchall/shiki/languages/json.tmLanguage.json delete mode 100644 src/http/get-docs-000lang-catchall/shiki/languages/powershell.tmLanguage.json delete mode 100644 src/http/get-docs-000lang-catchall/shiki/languages/python.tmLanguage.json delete mode 100644 src/http/get-docs-000lang-catchall/shiki/languages/ruby.tmLanguage.json delete mode 100644 src/http/get-docs-000lang-catchall/shiki/languages/shellscript.tmLanguage.json delete mode 100644 src/http/get-docs-000lang-catchall/shiki/languages/toml.tmLanguage.json delete mode 100644 src/http/get-docs-000lang-catchall/shiki/languages/yaml.tmLanguage.json diff --git a/package.json b/package.json index fbaa9612..7acc0f73 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,6 @@ "name": "@architect/arc.codes", "version": "3.6.7", "scripts": { - "hydrate-shiki": "./scripts/hydrate-shiki-deps", "deploy": "./scripts/deploy", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", "lint": "eslint src --fix", @@ -40,8 +39,5 @@ }, "eslintConfig": { "extends": "@architect/eslint-config" - }, - "eslintIgnore": [ - "**/shiki/**/*.js" - ] + } } diff --git a/public/index.js b/public/index.js index b08c2181..0753afb0 100644 --- a/public/index.js +++ b/public/index.js @@ -60,8 +60,6 @@ const parent = target.closest('pre') const codeText = parent.querySelector('code').textContent.trim() - console.log(target) - navigator.clipboard.writeText(codeText).then( () => { target.innerHTML = svgCheck diff --git a/public/static.json b/public/static.json index 63d82329..68a9a94b 100644 --- a/public/static.json +++ b/public/static.json @@ -1,6 +1,6 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-9a00fbd1e9.js", + "index.js": "index-0fe9efa0e6.js", "playground.html": "playground-be6bd7b6cb.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", diff --git a/readme.md b/readme.md index f3a31785..606aa30e 100644 --- a/readme.md +++ b/readme.md @@ -35,16 +35,6 @@ The frontmatter attributes are technically optional but highly encouraged as the | **description** | `string` | HTML meta description | | **sections** | `string[]` | currently unused | -## [Shiki](https://github.com/shikijs/shiki) for code highlighting - -[Shiki](https://github.com/shikijs/shiki) is used automatically to add highlighting to "fenced" Markdown code blocks. - -Providing explicit languages to the highlighter (see `highlighter.js`) increases Shiki's performance. - -To slim down Shiki's footprint, we bundle the dependency directly to the docs catchall function with only the grammars for languages we intend to highlight. This can be done automatically with the `hydrate-shiki-des` script. - -Use `npm run hydrate-shiki` to move Shiki/dist (+ select languages) and the Arc syntax highlighting grammar to the docs catchall function. This drastically reduces that function's size on disk. - ## Todo * dynamic category landing page diff --git a/scripts/hydrate-shiki-deps b/scripts/hydrate-shiki-deps deleted file mode 100755 index 9f558312..00000000 --- a/scripts/hydrate-shiki-deps +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# move Shiki dist to main doc catch all to reduce footprint -echo "Copying Shiki and arc grammar from node_modules to get-docs-000lang-catchall/shiki..." -mkdir src/http/get-docs-000lang-catchall/shiki &> /dev/null -mkdir src/http/get-docs-000lang-catchall/shiki/dist &> /dev/null -mkdir src/http/get-docs-000lang-catchall/shiki/languages &> /dev/null -cp node_modules/shiki/dist/index.js src/http/get-docs-000lang-catchall/shiki/dist/index.js -cp node_modules/shiki/languages/shellscript.tmLanguage.json \ - node_modules/shiki/languages/ruby.tmLanguage.json \ - node_modules/shiki/languages/javascript.tmLanguage.json \ - node_modules/shiki/languages/json.tmLanguage.json \ - node_modules/shiki/languages/toml.tmLanguage.json \ - node_modules/shiki/languages/yaml.tmLanguage.json \ - node_modules/shiki/languages/python.tmLanguage.json \ - node_modules/shiki/languages/powershell.tmLanguage.json \ - src/http/get-docs-000lang-catchall/shiki/languages/ -# move Arc syntax highlighter grammar for Shiki -cp node_modules/@architect/syntaxes/arc-textmate.json src/http/get-docs-000lang-catchall/arc-textmate.json -echo "Done." diff --git a/src/http/get-docs-000lang-catchall/shiki/dist/index.js b/src/http/get-docs-000lang-catchall/shiki/dist/index.js deleted file mode 100644 index 53f9e8ae..00000000 --- a/src/http/get-docs-000lang-catchall/shiki/dist/index.js +++ /dev/null @@ -1,2143 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var onigasm = require('onigasm'); -var vscodeTextmate = require('vscode-textmate'); - -const themes = [ - 'css-variables', - 'dark-plus', - 'dracula-soft', - 'dracula', - 'github-dark-dimmed', - 'github-dark', - 'github-light', - 'light-plus', - 'material-darker', - 'material-default', - 'material-lighter', - 'material-ocean', - 'material-palenight', - 'min-dark', - 'min-light', - 'monokai', - 'nord', - 'one-dark-pro', - 'poimandres', - 'slack-dark', - 'slack-ochin', - 'solarized-dark', - 'solarized-light', - 'vitesse-dark', - 'vitesse-light' -]; - -const languages = [ - { - id: 'abap', - scopeName: 'source.abap', - path: 'abap.tmLanguage.json', - samplePath: 'abap.sample' - }, - { - id: 'actionscript-3', - scopeName: 'source.actionscript.3', - path: 'actionscript-3.tmLanguage.json', - samplePath: 'actionscript-3.sample' - }, - { - id: 'ada', - scopeName: 'source.ada', - path: 'ada.tmLanguage.json', - samplePath: 'ada.sample' - }, - { - id: 'apache', - scopeName: 'source.apacheconf', - path: 'apache.tmLanguage.json' - }, - { - id: 'apex', - scopeName: 'source.apex', - path: 'apex.tmLanguage.json', - samplePath: 'apex.sample' - }, - { - id: 'apl', - scopeName: 'source.apl', - path: 'apl.tmLanguage.json', - embeddedLangs: ['html', 'xml', 'css', 'javascript', 'json'] - }, - { - id: 'applescript', - scopeName: 'source.applescript', - path: 'applescript.tmLanguage.json', - samplePath: 'applescript.sample' - }, - { - id: 'asm', - scopeName: 'source.asm.x86_64', - path: 'asm.tmLanguage.json', - samplePath: 'asm.sample' - }, - { - id: 'astro', - scopeName: 'text.html.astro', - path: 'astro.tmLanguage.json', - samplePath: 'astro.sample', - embeddedLangs: ['css', 'sass', 'scss', 'tsx'] - }, - { - id: 'awk', - scopeName: 'source.awk', - path: 'awk.tmLanguage.json', - samplePath: 'awk.sample' - }, - { - id: 'ballerina', - scopeName: 'source.ballerina', - path: 'ballerina.tmLanguage.json', - samplePath: 'ballerina.sample' - }, - { - id: 'bat', - scopeName: 'source.batchfile', - path: 'bat.tmLanguage.json', - samplePath: 'bat.sample', - aliases: ['batch'] - }, - { - id: 'c', - scopeName: 'source.c', - path: 'c.tmLanguage.json', - samplePath: 'c.sample' - }, - { - id: 'clojure', - scopeName: 'source.clojure', - path: 'clojure.tmLanguage.json', - samplePath: 'clojure.sample', - aliases: ['clj'] - }, - { - id: 'cobol', - scopeName: 'source.cobol', - path: 'cobol.tmLanguage.json', - samplePath: 'cobol.sample', - embeddedLangs: ['sql', 'html', 'java'] - }, - { - id: 'coffee', - scopeName: 'source.coffee', - path: 'coffee.tmLanguage.json', - samplePath: 'coffee.sample', - embeddedLangs: ['javascript'] - }, - { - id: 'cpp', - scopeName: 'source.cpp', - path: 'cpp.tmLanguage.json', - samplePath: 'cpp.sample', - embeddedLangs: ['sql'] - }, - { - id: 'crystal', - scopeName: 'source.crystal', - path: 'crystal.tmLanguage.json', - samplePath: 'crystal.sample', - embeddedLangs: ['html', 'sql', 'css', 'c', 'javascript', 'shellscript'] - }, - { - id: 'csharp', - scopeName: 'source.cs', - path: 'csharp.tmLanguage.json', - samplePath: 'csharp.sample', - aliases: ['c#'] - }, - { - id: 'css', - scopeName: 'source.css', - path: 'css.tmLanguage.json', - samplePath: 'css.sample' - }, - { - id: 'd', - scopeName: 'source.d', - path: 'd.tmLanguage.json', - samplePath: 'd.sample' - }, - { - id: 'dart', - scopeName: 'source.dart', - path: 'dart.tmLanguage.json', - samplePath: 'dart.sample' - }, - { - id: 'diff', - scopeName: 'source.diff', - path: 'diff.tmLanguage.json', - samplePath: 'diff.sample' - }, - { - id: 'docker', - scopeName: 'source.dockerfile', - path: 'docker.tmLanguage.json', - samplePath: 'docker.sample' - }, - { - id: 'dream-maker', - scopeName: 'source.dm', - path: 'dream-maker.tmLanguage.json' - }, - { - id: 'elixir', - scopeName: 'source.elixir', - path: 'elixir.tmLanguage.json', - samplePath: 'elixir.sample', - embeddedLangs: ['html'] - }, - { - id: 'elm', - scopeName: 'source.elm', - path: 'elm.tmLanguage.json', - samplePath: 'elm.sample' - }, - { - id: 'erb', - scopeName: 'text.html.erb', - path: 'erb.tmLanguage.json', - samplePath: 'erb.sample', - embeddedLangs: ['html', 'ruby'] - }, - { - id: 'erlang', - scopeName: 'source.erlang', - path: 'erlang.tmLanguage.json', - samplePath: 'erlang.sample' - }, - { - id: 'fish', - scopeName: 'source.fish', - path: 'fish.tmLanguage.json', - samplePath: 'fish.sample' - }, - { - id: 'fsharp', - scopeName: 'source.fsharp', - path: 'fsharp.tmLanguage.json', - samplePath: 'fsharp.sample', - aliases: ['f#'], - embeddedLangs: ['markdown'] - }, - { - id: 'gherkin', - scopeName: 'text.gherkin.feature', - path: 'gherkin.tmLanguage.json' - }, - { - id: 'git-commit', - scopeName: 'text.git-commit', - path: 'git-commit.tmLanguage.json', - embeddedLangs: ['diff'] - }, - { - id: 'git-rebase', - scopeName: 'text.git-rebase', - path: 'git-rebase.tmLanguage.json', - embeddedLangs: ['shellscript'] - }, - { - id: 'gnuplot', - scopeName: 'source.gnuplot', - path: 'gnuplot.tmLanguage.json' - }, - { - id: 'go', - scopeName: 'source.go', - path: 'go.tmLanguage.json', - samplePath: 'go.sample' - }, - { - id: 'graphql', - scopeName: 'source.graphql', - path: 'graphql.tmLanguage.json', - embeddedLangs: ['javascript', 'typescript', 'jsx', 'tsx'] - }, - { - id: 'groovy', - scopeName: 'source.groovy', - path: 'groovy.tmLanguage.json' - }, - { - id: 'hack', - scopeName: 'source.hack', - path: 'hack.tmLanguage.json', - embeddedLangs: ['html', 'sql'] - }, - { - id: 'haml', - scopeName: 'text.haml', - path: 'haml.tmLanguage.json', - embeddedLangs: ['ruby', 'javascript', 'sass', 'coffee', 'markdown', 'css'] - }, - { - id: 'handlebars', - scopeName: 'text.html.handlebars', - path: 'handlebars.tmLanguage.json', - aliases: ['hbs'], - embeddedLangs: ['html', 'css', 'javascript', 'yaml'] - }, - { - id: 'haskell', - scopeName: 'source.haskell', - path: 'haskell.tmLanguage.json' - }, - { - id: 'hcl', - scopeName: 'source.hcl', - path: 'hcl.tmLanguage.json' - }, - { - id: 'hlsl', - scopeName: 'source.hlsl', - path: 'hlsl.tmLanguage.json' - }, - { - id: 'html', - scopeName: 'text.html.basic', - path: 'html.tmLanguage.json', - samplePath: 'html.sample', - embeddedLangs: ['javascript', 'css'] - }, - { - id: 'ini', - scopeName: 'source.ini', - path: 'ini.tmLanguage.json' - }, - { - id: 'java', - scopeName: 'source.java', - path: 'java.tmLanguage.json', - samplePath: 'java.sample' - }, - { - id: 'javascript', - scopeName: 'source.js', - path: 'javascript.tmLanguage.json', - samplePath: 'javascript.sample', - aliases: ['js'] - }, - { - id: 'jinja-html', - scopeName: 'text.html.jinja', - path: 'jinja-html.tmLanguage.json', - embeddedLangs: ['html'] - }, - { - id: 'json', - scopeName: 'source.json', - path: 'json.tmLanguage.json' - }, - { - id: 'jsonc', - scopeName: 'source.json.comments', - path: 'jsonc.tmLanguage.json' - }, - { - id: 'jsonnet', - scopeName: 'source.jsonnet', - path: 'jsonnet.tmLanguage.json' - }, - { - id: 'jssm', - scopeName: 'source.jssm', - path: 'jssm.tmLanguage.json', - samplePath: 'jssm.sample', - aliases: ['fsl'] - }, - { - id: 'jsx', - scopeName: 'source.js.jsx', - path: 'jsx.tmLanguage.json' - }, - { - id: 'julia', - scopeName: 'source.julia', - path: 'julia.tmLanguage.json', - embeddedLangs: ['cpp', 'python', 'javascript', 'r', 'sql'] - }, - { - id: 'jupyter', - scopeName: 'source.jupyter', - path: 'jupyter.tmLanguage.json', - embeddedLangs: ['json'] - }, - { - id: 'kotlin', - scopeName: 'source.kotlin', - path: 'kotlin.tmLanguage.json' - }, - { - id: 'latex', - scopeName: 'text.tex.latex', - path: 'latex.tmLanguage.json', - embeddedLangs: ['tex', 'css', 'html', 'java', 'javascript', 'typescript', 'lua', 'python', 'julia', 'ruby', 'xml', 'yaml', 'cpp', 'haskell', 'scala', 'gnuplot'] - }, - { - id: 'less', - scopeName: 'source.css.less', - path: 'less.tmLanguage.json', - embeddedLangs: ['css'] - }, - { - id: 'lisp', - scopeName: 'source.lisp', - path: 'lisp.tmLanguage.json' - }, - { - id: 'logo', - scopeName: 'source.logo', - path: 'logo.tmLanguage.json' - }, - { - id: 'lua', - scopeName: 'source.lua', - path: 'lua.tmLanguage.json', - embeddedLangs: ['c'] - }, - { - id: 'make', - scopeName: 'source.makefile', - path: 'make.tmLanguage.json', - aliases: ['makefile'] - }, - { - id: 'markdown', - scopeName: 'text.html.markdown', - path: 'markdown.tmLanguage.json', - aliases: ['md'], - embeddedLangs: ['css', 'html', 'ini', 'java', 'lua', 'make', 'perl', 'r', 'ruby', 'php', 'sql', 'vb', 'xml', 'xsl', 'yaml', 'bat', 'clojure', 'coffee', 'c', 'cpp', 'diff', 'docker', 'git-commit', 'git-rebase', 'go', 'groovy', 'pug', 'javascript', 'json', 'jsonc', 'less', 'objective-c', 'swift', 'scss', 'raku', 'powershell', 'python', 'rust', 'scala', 'shellscript', 'typescript', 'tsx', 'csharp', 'fsharp', 'dart', 'handlebars', 'erlang', 'elixir'] - }, - { - id: 'matlab', - scopeName: 'source.matlab', - path: 'matlab.tmLanguage.json' - }, - { - id: 'mdx', - scopeName: 'text.html.markdown.jsx', - path: 'mdx.tmLanguage.json', - embeddedLangs: ['jsx', 'markdown'] - }, - { - id: 'nginx', - scopeName: 'source.nginx', - path: 'nginx.tmLanguage.json' - }, - { - id: 'nim', - scopeName: 'source.nim', - path: 'nim.tmLanguage.json', - embeddedLangs: ['c', 'html', 'xml', 'javascript', 'css', 'markdown'] - }, - { - id: 'nix', - scopeName: 'source.nix', - path: 'nix.tmLanguage.json' - }, - { - id: 'objective-c', - scopeName: 'source.objc', - path: 'objective-c.tmLanguage.json', - aliases: ['objc'] - }, - { - id: 'objective-cpp', - scopeName: 'source.objcpp', - path: 'objective-cpp.tmLanguage.json' - }, - { - id: 'ocaml', - scopeName: 'source.ocaml', - path: 'ocaml.tmLanguage.json' - }, - { - id: 'pascal', - scopeName: 'source.pascal', - path: 'pascal.tmLanguage.json' - }, - { - id: 'perl', - scopeName: 'source.perl', - path: 'perl.tmLanguage.json', - embeddedLangs: ['html', 'xml', 'css', 'javascript', 'sql'] - }, - { - id: 'php', - scopeName: 'source.php', - path: 'php.tmLanguage.json', - embeddedLangs: ['html', 'xml', 'sql', 'javascript', 'json', 'css'] - }, - { - id: 'plsql', - scopeName: 'source.plsql.oracle', - path: 'plsql.tmLanguage.json' - }, - { - id: 'postcss', - scopeName: 'source.css.postcss', - path: 'postcss.tmLanguage.json' - }, - { - id: 'powershell', - scopeName: 'source.powershell', - path: 'powershell.tmLanguage.json', - aliases: ['ps', 'ps1'] - }, - { - id: 'prisma', - scopeName: 'source.prisma', - path: 'prisma.tmLanguage.json', - samplePath: 'prisma.sample' - }, - { - id: 'prolog', - scopeName: 'source.prolog', - path: 'prolog.tmLanguage.json' - }, - { - id: 'pug', - scopeName: 'text.pug', - path: 'pug.tmLanguage.json', - aliases: ['jade'], - embeddedLangs: ['javascript', 'css', 'sass', 'stylus', 'coffee', 'html'] - }, - { - id: 'puppet', - scopeName: 'source.puppet', - path: 'puppet.tmLanguage.json' - }, - { - id: 'purescript', - scopeName: 'source.purescript', - path: 'purescript.tmLanguage.json' - }, - { - id: 'python', - scopeName: 'source.python', - path: 'python.tmLanguage.json', - samplePath: 'python.sample', - aliases: ['py'] - }, - { - id: 'r', - scopeName: 'source.r', - path: 'r.tmLanguage.json' - }, - { - id: 'raku', - scopeName: 'source.perl.6', - path: 'raku.tmLanguage.json', - aliases: ['perl6'] - }, - { - id: 'razor', - scopeName: 'text.aspnetcorerazor', - path: 'razor.tmLanguage.json', - embeddedLangs: ['html', 'csharp'] - }, - { - id: 'riscv', - scopeName: 'source.riscv', - path: 'riscv.tmLanguage.json' - }, - { - id: 'ruby', - scopeName: 'source.ruby', - path: 'ruby.tmLanguage.json', - samplePath: 'ruby.sample', - aliases: ['rb'], - embeddedLangs: ['html', 'xml', 'sql', 'css', 'c', 'javascript', 'shellscript', 'lua'] - }, - { - id: 'rust', - scopeName: 'source.rust', - path: 'rust.tmLanguage.json' - }, - { - id: 'sas', - scopeName: 'source.sas', - path: 'sas.tmLanguage.json', - embeddedLangs: ['sql'] - }, - { - id: 'sass', - scopeName: 'source.sass', - path: 'sass.tmLanguage.json' - }, - { - id: 'scala', - scopeName: 'source.scala', - path: 'scala.tmLanguage.json' - }, - { - id: 'scheme', - scopeName: 'source.scheme', - path: 'scheme.tmLanguage.json' - }, - { - id: 'scss', - scopeName: 'source.css.scss', - path: 'scss.tmLanguage.json', - embeddedLangs: ['css'] - }, - { - id: 'shaderlab', - scopeName: 'source.shaderlab', - path: 'shaderlab.tmLanguage.json', - aliases: ['shader'], - embeddedLangs: ['hlsl'] - }, - { - id: 'shellscript', - scopeName: 'source.shell', - path: 'shellscript.tmLanguage.json', - aliases: ['shell', 'bash', 'sh', 'zsh'], - embeddedLangs: ['ruby', 'python', 'applescript', 'html', 'markdown'] - }, - { - id: 'smalltalk', - scopeName: 'source.smalltalk', - path: 'smalltalk.tmLanguage.json' - }, - { - id: 'solidity', - scopeName: 'source.solidity', - path: 'solidity.tmLanguage.json' - }, - { - id: 'sparql', - scopeName: 'source.sparql', - path: 'sparql.tmLanguage.json', - samplePath: 'sparql.sample', - embeddedLangs: ['turtle'] - }, - { - id: 'sql', - scopeName: 'source.sql', - path: 'sql.tmLanguage.json' - }, - { - id: 'ssh-config', - scopeName: 'source.ssh-config', - path: 'ssh-config.tmLanguage.json' - }, - { - id: 'stylus', - scopeName: 'source.stylus', - path: 'stylus.tmLanguage.json', - aliases: ['styl'] - }, - { - id: 'svelte', - scopeName: 'source.svelte', - path: 'svelte.tmLanguage.json', - embeddedLangs: ['javascript', 'typescript', 'coffee', 'stylus', 'sass', 'css', 'scss', 'less', 'postcss', 'pug', 'markdown'] - }, - { - id: 'swift', - scopeName: 'source.swift', - path: 'swift.tmLanguage.json' - }, - { - id: 'system-verilog', - scopeName: 'source.systemverilog', - path: 'system-verilog.tmLanguage.json' - }, - { - id: 'tasl', - scopeName: 'source.tasl', - path: 'tasl.tmLanguage.json', - samplePath: 'tasl.sample' - }, - { - id: 'tcl', - scopeName: 'source.tcl', - path: 'tcl.tmLanguage.json' - }, - { - id: 'tex', - scopeName: 'text.tex', - path: 'tex.tmLanguage.json', - embeddedLangs: ['r'] - }, - { - id: 'toml', - scopeName: 'source.toml', - path: 'toml.tmLanguage.json' - }, - { - id: 'tsx', - scopeName: 'source.tsx', - path: 'tsx.tmLanguage.json', - samplePath: 'tsx.sample' - }, - { - id: 'turtle', - scopeName: 'source.turtle', - path: 'turtle.tmLanguage.json', - samplePath: 'turtle.sample' - }, - { - id: 'twig', - scopeName: 'text.html.twig', - path: 'twig.tmLanguage.json', - embeddedLangs: ['css', 'javascript', 'php', 'python', 'ruby'] - }, - { - id: 'typescript', - scopeName: 'source.ts', - path: 'typescript.tmLanguage.json', - aliases: ['ts'] - }, - { - id: 'vb', - scopeName: 'source.asp.vb.net', - path: 'vb.tmLanguage.json', - aliases: ['cmd'] - }, - { - id: 'verilog', - scopeName: 'source.verilog', - path: 'verilog.tmLanguage.json' - }, - { - id: 'vhdl', - scopeName: 'source.vhdl', - path: 'vhdl.tmLanguage.json' - }, - { - id: 'viml', - scopeName: 'source.viml', - path: 'viml.tmLanguage.json' - }, - { - id: 'vue-html', - scopeName: 'text.html.vue-html', - path: 'vue-html.tmLanguage.json', - embeddedLangs: ['vue', 'javascript'] - }, - { - id: 'vue', - scopeName: 'source.vue', - path: 'vue.tmLanguage.json', - embeddedLangs: ['json', 'markdown', 'pug', 'haml', 'vue-html', 'sass', 'scss', 'less', 'stylus', 'postcss', 'css', 'typescript', 'coffee', 'javascript'] - }, - { - id: 'wasm', - scopeName: 'source.wat', - path: 'wasm.tmLanguage.json' - }, - { - id: 'wenyan', - scopeName: 'source.wenyan', - path: 'wenyan.tmLanguage.json', - aliases: ['文言'] - }, - { - id: 'xml', - scopeName: 'text.xml', - path: 'xml.tmLanguage.json', - embeddedLangs: ['java'] - }, - { - id: 'xsl', - scopeName: 'text.xml.xsl', - path: 'xsl.tmLanguage.json', - embeddedLangs: ['xml'] - }, - { - id: 'yaml', - scopeName: 'source.yaml', - path: 'yaml.tmLanguage.json' - } -]; - -exports.FontStyle = void 0; -(function (FontStyle) { - FontStyle[FontStyle["NotSet"] = -1] = "NotSet"; - FontStyle[FontStyle["None"] = 0] = "None"; - FontStyle[FontStyle["Italic"] = 1] = "Italic"; - FontStyle[FontStyle["Bold"] = 2] = "Bold"; - FontStyle[FontStyle["Underline"] = 4] = "Underline"; -})(exports.FontStyle || (exports.FontStyle = {})); -class StackElementMetadata { - static toBinaryStr(metadata) { - let r = metadata.toString(2); - while (r.length < 32) { - r = '0' + r; - } - return r; - } - static printMetadata(metadata) { - let languageId = StackElementMetadata.getLanguageId(metadata); - let tokenType = StackElementMetadata.getTokenType(metadata); - let fontStyle = StackElementMetadata.getFontStyle(metadata); - let foreground = StackElementMetadata.getForeground(metadata); - let background = StackElementMetadata.getBackground(metadata); - console.log({ - languageId: languageId, - tokenType: tokenType, - fontStyle: fontStyle, - foreground: foreground, - background: background - }); - } - static getLanguageId(metadata) { - return (metadata & 255 /* LANGUAGEID_MASK */) >>> 0 /* LANGUAGEID_OFFSET */; - } - static getTokenType(metadata) { - return (metadata & 1792 /* TOKEN_TYPE_MASK */) >>> 8 /* TOKEN_TYPE_OFFSET */; - } - static getFontStyle(metadata) { - return (metadata & 14336 /* FONT_STYLE_MASK */) >>> 11 /* FONT_STYLE_OFFSET */; - } - static getForeground(metadata) { - return (metadata & 8372224 /* FOREGROUND_MASK */) >>> 14 /* FOREGROUND_OFFSET */; - } - static getBackground(metadata) { - return (metadata & 4286578688 /* BACKGROUND_MASK */) >>> 23 /* BACKGROUND_OFFSET */; - } - static set(metadata, languageId, tokenType, fontStyle, foreground, background) { - let _languageId = StackElementMetadata.getLanguageId(metadata); - let _tokenType = StackElementMetadata.getTokenType(metadata); - let _fontStyle = StackElementMetadata.getFontStyle(metadata); - let _foreground = StackElementMetadata.getForeground(metadata); - let _background = StackElementMetadata.getBackground(metadata); - if (languageId !== 0) { - _languageId = languageId; - } - if (tokenType !== 0 /* Other */) { - _tokenType = - tokenType === 8 /* MetaEmbedded */ ? 0 /* Other */ : tokenType; - } - if (fontStyle !== exports.FontStyle.NotSet) { - _fontStyle = fontStyle; - } - if (foreground !== 0) { - _foreground = foreground; - } - if (background !== 0) { - _background = background; - } - return (((_languageId << 0 /* LANGUAGEID_OFFSET */) | - (_tokenType << 8 /* TOKEN_TYPE_OFFSET */) | - (_fontStyle << 11 /* FONT_STYLE_OFFSET */) | - (_foreground << 14 /* FOREGROUND_OFFSET */) | - (_background << 23 /* BACKGROUND_OFFSET */)) >>> - 0); - } -} - -function trimEndSlash(str) { - if (str.endsWith('/') || str.endsWith('\\')) - return str.slice(0, -1); - return str; -} -function trimStartDot(str) { - if (str.startsWith('./')) - return str.slice(2); - return str; -} -function dirname(str) { - const parts = str.split(/[\/\\]/g); - return parts[parts.length - 2]; -} -function join(...parts) { - return parts.map(trimEndSlash).map(trimStartDot).join('/'); -} - -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -/** - * Creates a JSON scanner on the given text. - * If ignoreTrivia is set, whitespaces or comments are ignored. - */ -function createScanner(text, ignoreTrivia) { - if (ignoreTrivia === void 0) { ignoreTrivia = false; } - var len = text.length; - var pos = 0, value = '', tokenOffset = 0, token = 16 /* Unknown */, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0 /* None */; - function scanHexDigits(count, exact) { - var digits = 0; - var value = 0; - while (digits < count || !exact) { - var ch = text.charCodeAt(pos); - if (ch >= 48 /* _0 */ && ch <= 57 /* _9 */) { - value = value * 16 + ch - 48 /* _0 */; - } - else if (ch >= 65 /* A */ && ch <= 70 /* F */) { - value = value * 16 + ch - 65 /* A */ + 10; - } - else if (ch >= 97 /* a */ && ch <= 102 /* f */) { - value = value * 16 + ch - 97 /* a */ + 10; - } - else { - break; - } - pos++; - digits++; - } - if (digits < count) { - value = -1; - } - return value; - } - function setPosition(newPosition) { - pos = newPosition; - value = ''; - tokenOffset = 0; - token = 16 /* Unknown */; - scanError = 0 /* None */; - } - function scanNumber() { - var start = pos; - if (text.charCodeAt(pos) === 48 /* _0 */) { - pos++; - } - else { - pos++; - while (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - } - } - if (pos < text.length && text.charCodeAt(pos) === 46 /* dot */) { - pos++; - if (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - while (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - } - } - else { - scanError = 3 /* UnexpectedEndOfNumber */; - return text.substring(start, pos); - } - } - var end = pos; - if (pos < text.length && (text.charCodeAt(pos) === 69 /* E */ || text.charCodeAt(pos) === 101 /* e */)) { - pos++; - if (pos < text.length && text.charCodeAt(pos) === 43 /* plus */ || text.charCodeAt(pos) === 45 /* minus */) { - pos++; - } - if (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - while (pos < text.length && isDigit(text.charCodeAt(pos))) { - pos++; - } - end = pos; - } - else { - scanError = 3 /* UnexpectedEndOfNumber */; - } - } - return text.substring(start, end); - } - function scanString() { - var result = '', start = pos; - while (true) { - if (pos >= len) { - result += text.substring(start, pos); - scanError = 2 /* UnexpectedEndOfString */; - break; - } - var ch = text.charCodeAt(pos); - if (ch === 34 /* doubleQuote */) { - result += text.substring(start, pos); - pos++; - break; - } - if (ch === 92 /* backslash */) { - result += text.substring(start, pos); - pos++; - if (pos >= len) { - scanError = 2 /* UnexpectedEndOfString */; - break; - } - var ch2 = text.charCodeAt(pos++); - switch (ch2) { - case 34 /* doubleQuote */: - result += '\"'; - break; - case 92 /* backslash */: - result += '\\'; - break; - case 47 /* slash */: - result += '/'; - break; - case 98 /* b */: - result += '\b'; - break; - case 102 /* f */: - result += '\f'; - break; - case 110 /* n */: - result += '\n'; - break; - case 114 /* r */: - result += '\r'; - break; - case 116 /* t */: - result += '\t'; - break; - case 117 /* u */: - var ch3 = scanHexDigits(4, true); - if (ch3 >= 0) { - result += String.fromCharCode(ch3); - } - else { - scanError = 4 /* InvalidUnicode */; - } - break; - default: - scanError = 5 /* InvalidEscapeCharacter */; - } - start = pos; - continue; - } - if (ch >= 0 && ch <= 0x1f) { - if (isLineBreak(ch)) { - result += text.substring(start, pos); - scanError = 2 /* UnexpectedEndOfString */; - break; - } - else { - scanError = 6 /* InvalidCharacter */; - // mark as error but continue with string - } - } - pos++; - } - return result; - } - function scanNext() { - value = ''; - scanError = 0 /* None */; - tokenOffset = pos; - lineStartOffset = lineNumber; - prevTokenLineStartOffset = tokenLineStartOffset; - if (pos >= len) { - // at the end - tokenOffset = len; - return token = 17 /* EOF */; - } - var code = text.charCodeAt(pos); - // trivia: whitespace - if (isWhiteSpace(code)) { - do { - pos++; - value += String.fromCharCode(code); - code = text.charCodeAt(pos); - } while (isWhiteSpace(code)); - return token = 15 /* Trivia */; - } - // trivia: newlines - if (isLineBreak(code)) { - pos++; - value += String.fromCharCode(code); - if (code === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) { - pos++; - value += '\n'; - } - lineNumber++; - tokenLineStartOffset = pos; - return token = 14 /* LineBreakTrivia */; - } - switch (code) { - // tokens: []{}:, - case 123 /* openBrace */: - pos++; - return token = 1 /* OpenBraceToken */; - case 125 /* closeBrace */: - pos++; - return token = 2 /* CloseBraceToken */; - case 91 /* openBracket */: - pos++; - return token = 3 /* OpenBracketToken */; - case 93 /* closeBracket */: - pos++; - return token = 4 /* CloseBracketToken */; - case 58 /* colon */: - pos++; - return token = 6 /* ColonToken */; - case 44 /* comma */: - pos++; - return token = 5 /* CommaToken */; - // strings - case 34 /* doubleQuote */: - pos++; - value = scanString(); - return token = 10 /* StringLiteral */; - // comments - case 47 /* slash */: - var start = pos - 1; - // Single-line comment - if (text.charCodeAt(pos + 1) === 47 /* slash */) { - pos += 2; - while (pos < len) { - if (isLineBreak(text.charCodeAt(pos))) { - break; - } - pos++; - } - value = text.substring(start, pos); - return token = 12 /* LineCommentTrivia */; - } - // Multi-line comment - if (text.charCodeAt(pos + 1) === 42 /* asterisk */) { - pos += 2; - var safeLength = len - 1; // For lookahead. - var commentClosed = false; - while (pos < safeLength) { - var ch = text.charCodeAt(pos); - if (ch === 42 /* asterisk */ && text.charCodeAt(pos + 1) === 47 /* slash */) { - pos += 2; - commentClosed = true; - break; - } - pos++; - if (isLineBreak(ch)) { - if (ch === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) { - pos++; - } - lineNumber++; - tokenLineStartOffset = pos; - } - } - if (!commentClosed) { - pos++; - scanError = 1 /* UnexpectedEndOfComment */; - } - value = text.substring(start, pos); - return token = 13 /* BlockCommentTrivia */; - } - // just a single slash - value += String.fromCharCode(code); - pos++; - return token = 16 /* Unknown */; - // numbers - case 45 /* minus */: - value += String.fromCharCode(code); - pos++; - if (pos === len || !isDigit(text.charCodeAt(pos))) { - return token = 16 /* Unknown */; - } - // found a minus, followed by a number so - // we fall through to proceed with scanning - // numbers - case 48 /* _0 */: - case 49 /* _1 */: - case 50 /* _2 */: - case 51 /* _3 */: - case 52 /* _4 */: - case 53 /* _5 */: - case 54 /* _6 */: - case 55 /* _7 */: - case 56 /* _8 */: - case 57 /* _9 */: - value += scanNumber(); - return token = 11 /* NumericLiteral */; - // literals and unknown symbols - default: - // is a literal? Read the full word. - while (pos < len && isUnknownContentCharacter(code)) { - pos++; - code = text.charCodeAt(pos); - } - if (tokenOffset !== pos) { - value = text.substring(tokenOffset, pos); - // keywords: true, false, null - switch (value) { - case 'true': return token = 8 /* TrueKeyword */; - case 'false': return token = 9 /* FalseKeyword */; - case 'null': return token = 7 /* NullKeyword */; - } - return token = 16 /* Unknown */; - } - // some - value += String.fromCharCode(code); - pos++; - return token = 16 /* Unknown */; - } - } - function isUnknownContentCharacter(code) { - if (isWhiteSpace(code) || isLineBreak(code)) { - return false; - } - switch (code) { - case 125 /* closeBrace */: - case 93 /* closeBracket */: - case 123 /* openBrace */: - case 91 /* openBracket */: - case 34 /* doubleQuote */: - case 58 /* colon */: - case 44 /* comma */: - case 47 /* slash */: - return false; - } - return true; - } - function scanNextNonTrivia() { - var result; - do { - result = scanNext(); - } while (result >= 12 /* LineCommentTrivia */ && result <= 15 /* Trivia */); - return result; - } - return { - setPosition: setPosition, - getPosition: function () { return pos; }, - scan: ignoreTrivia ? scanNextNonTrivia : scanNext, - getToken: function () { return token; }, - getTokenValue: function () { return value; }, - getTokenOffset: function () { return tokenOffset; }, - getTokenLength: function () { return pos - tokenOffset; }, - getTokenStartLine: function () { return lineStartOffset; }, - getTokenStartCharacter: function () { return tokenOffset - prevTokenLineStartOffset; }, - getTokenError: function () { return scanError; }, - }; -} -function isWhiteSpace(ch) { - return ch === 32 /* space */ || ch === 9 /* tab */ || ch === 11 /* verticalTab */ || ch === 12 /* formFeed */ || - ch === 160 /* nonBreakingSpace */ || ch === 5760 /* ogham */ || ch >= 8192 /* enQuad */ && ch <= 8203 /* zeroWidthSpace */ || - ch === 8239 /* narrowNoBreakSpace */ || ch === 8287 /* mathematicalSpace */ || ch === 12288 /* ideographicSpace */ || ch === 65279 /* byteOrderMark */; -} -function isLineBreak(ch) { - return ch === 10 /* lineFeed */ || ch === 13 /* carriageReturn */ || ch === 8232 /* lineSeparator */ || ch === 8233 /* paragraphSeparator */; -} -function isDigit(ch) { - return ch >= 48 /* _0 */ && ch <= 57 /* _9 */; -} - -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -var ParseOptions; -(function (ParseOptions) { - ParseOptions.DEFAULT = { - allowTrailingComma: false - }; -})(ParseOptions || (ParseOptions = {})); -/** - * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. - * Therefore always check the errors list to find out if the input was valid. - */ -function parse$1(text, errors, options) { - if (errors === void 0) { errors = []; } - if (options === void 0) { options = ParseOptions.DEFAULT; } - var currentProperty = null; - var currentParent = []; - var previousParents = []; - function onValue(value) { - if (Array.isArray(currentParent)) { - currentParent.push(value); - } - else if (currentProperty !== null) { - currentParent[currentProperty] = value; - } - } - var visitor = { - onObjectBegin: function () { - var object = {}; - onValue(object); - previousParents.push(currentParent); - currentParent = object; - currentProperty = null; - }, - onObjectProperty: function (name) { - currentProperty = name; - }, - onObjectEnd: function () { - currentParent = previousParents.pop(); - }, - onArrayBegin: function () { - var array = []; - onValue(array); - previousParents.push(currentParent); - currentParent = array; - currentProperty = null; - }, - onArrayEnd: function () { - currentParent = previousParents.pop(); - }, - onLiteralValue: onValue, - onError: function (error, offset, length) { - errors.push({ error: error, offset: offset, length: length }); - } - }; - visit(text, visitor, options); - return currentParent[0]; -} -/** - * Parses the given text and invokes the visitor functions for each object, array and literal reached. - */ -function visit(text, visitor, options) { - if (options === void 0) { options = ParseOptions.DEFAULT; } - var _scanner = createScanner(text, false); - function toNoArgVisit(visitFunction) { - return visitFunction ? function () { return visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; }; - } - function toOneArgVisit(visitFunction) { - return visitFunction ? function (arg) { return visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; }; - } - var onObjectBegin = toNoArgVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisit(visitor.onObjectProperty), onObjectEnd = toNoArgVisit(visitor.onObjectEnd), onArrayBegin = toNoArgVisit(visitor.onArrayBegin), onArrayEnd = toNoArgVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisit(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError); - var disallowComments = options && options.disallowComments; - var allowTrailingComma = options && options.allowTrailingComma; - function scanNext() { - while (true) { - var token = _scanner.scan(); - switch (_scanner.getTokenError()) { - case 4 /* InvalidUnicode */: - handleError(14 /* InvalidUnicode */); - break; - case 5 /* InvalidEscapeCharacter */: - handleError(15 /* InvalidEscapeCharacter */); - break; - case 3 /* UnexpectedEndOfNumber */: - handleError(13 /* UnexpectedEndOfNumber */); - break; - case 1 /* UnexpectedEndOfComment */: - if (!disallowComments) { - handleError(11 /* UnexpectedEndOfComment */); - } - break; - case 2 /* UnexpectedEndOfString */: - handleError(12 /* UnexpectedEndOfString */); - break; - case 6 /* InvalidCharacter */: - handleError(16 /* InvalidCharacter */); - break; - } - switch (token) { - case 12 /* LineCommentTrivia */: - case 13 /* BlockCommentTrivia */: - if (disallowComments) { - handleError(10 /* InvalidCommentToken */); - } - else { - onComment(); - } - break; - case 16 /* Unknown */: - handleError(1 /* InvalidSymbol */); - break; - case 15 /* Trivia */: - case 14 /* LineBreakTrivia */: - break; - default: - return token; - } - } - } - function handleError(error, skipUntilAfter, skipUntil) { - if (skipUntilAfter === void 0) { skipUntilAfter = []; } - if (skipUntil === void 0) { skipUntil = []; } - onError(error); - if (skipUntilAfter.length + skipUntil.length > 0) { - var token = _scanner.getToken(); - while (token !== 17 /* EOF */) { - if (skipUntilAfter.indexOf(token) !== -1) { - scanNext(); - break; - } - else if (skipUntil.indexOf(token) !== -1) { - break; - } - token = scanNext(); - } - } - } - function parseString(isValue) { - var value = _scanner.getTokenValue(); - if (isValue) { - onLiteralValue(value); - } - else { - onObjectProperty(value); - } - scanNext(); - return true; - } - function parseLiteral() { - switch (_scanner.getToken()) { - case 11 /* NumericLiteral */: - var tokenValue = _scanner.getTokenValue(); - var value = Number(tokenValue); - if (isNaN(value)) { - handleError(2 /* InvalidNumberFormat */); - value = 0; - } - onLiteralValue(value); - break; - case 7 /* NullKeyword */: - onLiteralValue(null); - break; - case 8 /* TrueKeyword */: - onLiteralValue(true); - break; - case 9 /* FalseKeyword */: - onLiteralValue(false); - break; - default: - return false; - } - scanNext(); - return true; - } - function parseProperty() { - if (_scanner.getToken() !== 10 /* StringLiteral */) { - handleError(3 /* PropertyNameExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); - return false; - } - parseString(false); - if (_scanner.getToken() === 6 /* ColonToken */) { - onSeparator(':'); - scanNext(); // consume colon - if (!parseValue()) { - handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); - } - } - else { - handleError(5 /* ColonExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); - } - return true; - } - function parseObject() { - onObjectBegin(); - scanNext(); // consume open brace - var needsComma = false; - while (_scanner.getToken() !== 2 /* CloseBraceToken */ && _scanner.getToken() !== 17 /* EOF */) { - if (_scanner.getToken() === 5 /* CommaToken */) { - if (!needsComma) { - handleError(4 /* ValueExpected */, [], []); - } - onSeparator(','); - scanNext(); // consume comma - if (_scanner.getToken() === 2 /* CloseBraceToken */ && allowTrailingComma) { - break; - } - } - else if (needsComma) { - handleError(6 /* CommaExpected */, [], []); - } - if (!parseProperty()) { - handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]); - } - needsComma = true; - } - onObjectEnd(); - if (_scanner.getToken() !== 2 /* CloseBraceToken */) { - handleError(7 /* CloseBraceExpected */, [2 /* CloseBraceToken */], []); - } - else { - scanNext(); // consume close brace - } - return true; - } - function parseArray() { - onArrayBegin(); - scanNext(); // consume open bracket - var needsComma = false; - while (_scanner.getToken() !== 4 /* CloseBracketToken */ && _scanner.getToken() !== 17 /* EOF */) { - if (_scanner.getToken() === 5 /* CommaToken */) { - if (!needsComma) { - handleError(4 /* ValueExpected */, [], []); - } - onSeparator(','); - scanNext(); // consume comma - if (_scanner.getToken() === 4 /* CloseBracketToken */ && allowTrailingComma) { - break; - } - } - else if (needsComma) { - handleError(6 /* CommaExpected */, [], []); - } - if (!parseValue()) { - handleError(4 /* ValueExpected */, [], [4 /* CloseBracketToken */, 5 /* CommaToken */]); - } - needsComma = true; - } - onArrayEnd(); - if (_scanner.getToken() !== 4 /* CloseBracketToken */) { - handleError(8 /* CloseBracketExpected */, [4 /* CloseBracketToken */], []); - } - else { - scanNext(); // consume close bracket - } - return true; - } - function parseValue() { - switch (_scanner.getToken()) { - case 3 /* OpenBracketToken */: - return parseArray(); - case 1 /* OpenBraceToken */: - return parseObject(); - case 10 /* StringLiteral */: - return parseString(true); - default: - return parseLiteral(); - } - } - scanNext(); - if (_scanner.getToken() === 17 /* EOF */) { - if (options.allowEmptyContent) { - return true; - } - handleError(4 /* ValueExpected */, [], []); - return false; - } - if (!parseValue()) { - handleError(4 /* ValueExpected */, [], []); - return false; - } - if (_scanner.getToken() !== 17 /* EOF */) { - handleError(9 /* EndOfFileExpected */, [], []); - } - return true; -} - -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -/** - * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. - * Therefore, always check the errors list to find out if the input was valid. - */ -var parse = parse$1; - -const isWebWorker = typeof self !== 'undefined' && typeof self.WorkerGlobalScope !== 'undefined'; -const isBrowser = isWebWorker || - (typeof window !== 'undefined' && - typeof window.document !== 'undefined' && - typeof fetch !== 'undefined'); -// to be replaced by rollup -let CDN_ROOT = ''; -let ONIGASM_WASM = ''; -/** - * Set the route for loading the assets - * URL should end with `/` - * - * For example: - * ```ts - * setCDN('https://unpkg.com/shiki/') // use unpkg - * setCDN('/assets/shiki/') // serve by yourself - * ``` - */ -function setCDN(root) { - CDN_ROOT = root; -} -/** - * Explicitly set the source for loading the OnigasmWASM - * - * Accepts Url or ArrayBuffer - */ -function setOnigasmWASM(path) { - ONIGASM_WASM = path; -} -let _onigasmPromise = null; -async function getOnigasm() { - if (!_onigasmPromise) { - let loader; - if (isBrowser) { - loader = onigasm.loadWASM(ONIGASM_WASM || _resolvePath('dist/onigasm.wasm')); - } - else { - const path = require('path'); - const onigasmPath = path.join(require.resolve('onigasm'), '../onigasm.wasm'); - const fs = require('fs'); - const wasmBin = fs.readFileSync(onigasmPath).buffer; - loader = onigasm.loadWASM(wasmBin); - } - _onigasmPromise = loader.then(() => { - return { - createOnigScanner(patterns) { - return new onigasm.OnigScanner(patterns); - }, - createOnigString(s) { - return new onigasm.OnigString(s); - } - }; - }); - } - return _onigasmPromise; -} -function _resolvePath(filepath) { - if (isBrowser) { - if (!CDN_ROOT) { - console.warn('[Shiki] no CDN provider found, use `setCDN()` to specify the CDN for loading the resources before calling `getHighlighter()`'); - } - return `${CDN_ROOT}${filepath}`; - } - else { - const path = require('path'); - if (path.isAbsolute(filepath)) { - return filepath; - } - else { - return path.resolve(__dirname, '..', filepath); - } - } -} -/** - * @param filepath assert path related to ./packages/shiki - */ -async function _fetchAssets(filepath) { - const path = _resolvePath(filepath); - if (isBrowser) { - return await fetch(path).then(r => r.text()); - } - else { - const fs = require('fs'); - return await fs.promises.readFile(path, 'utf-8'); - } -} -async function _fetchJSONAssets(filepath) { - const errors = []; - const rawTheme = parse(await _fetchAssets(filepath), errors, { - allowTrailingComma: true - }); - if (errors.length) { - throw errors[0]; - } - return rawTheme; -} -/** - * @param themePath related path to theme.json - */ -async function fetchTheme(themePath) { - let theme = await _fetchJSONAssets(themePath); - const shikiTheme = toShikiTheme(theme); - if (shikiTheme.include) { - const includedTheme = await fetchTheme(join(dirname(themePath), shikiTheme.include)); - if (includedTheme.settings) { - shikiTheme.settings = includedTheme.settings.concat(shikiTheme.settings); - } - if (includedTheme.bg && !shikiTheme.bg) { - shikiTheme.bg = includedTheme.bg; - } - if (includedTheme.colors) { - shikiTheme.colors = Object.assign(Object.assign({}, includedTheme.colors), shikiTheme.colors); - } - delete shikiTheme.include; - } - return shikiTheme; -} -async function fetchGrammar(filepath) { - return await _fetchJSONAssets(filepath); -} -function repairTheme(theme) { - // Has the default no-scope setting with fallback colors - if (!theme.settings) - theme.settings = []; - if (theme.settings[0] && theme.settings[0].settings && !theme.settings[0].scope) { - return; - } - // Push a no-scope setting with fallback colors - theme.settings.unshift({ - settings: { - foreground: theme.fg, - background: theme.bg - } - }); -} -function toShikiTheme(rawTheme) { - const type = rawTheme.type || 'dark'; - const shikiTheme = Object.assign(Object.assign({ name: rawTheme.name, type }, rawTheme), getThemeDefaultColors(rawTheme)); - if (rawTheme.include) { - shikiTheme.include = rawTheme.include; - } - if (rawTheme.tokenColors) { - shikiTheme.settings = rawTheme.tokenColors; - delete shikiTheme.tokenColors; - } - repairTheme(shikiTheme); - return shikiTheme; -} -/** - * https://github.com/microsoft/vscode/blob/f7f05dee53fb33fe023db2e06e30a89d3094488f/src/vs/platform/theme/common/colorRegistry.ts#L258-L268 - */ -const VSCODE_FALLBACK_EDITOR_FG = { light: '#333333', dark: '#bbbbbb' }; -const VSCODE_FALLBACK_EDITOR_BG = { light: '#fffffe', dark: '#1e1e1e' }; -function getThemeDefaultColors(theme) { - var _a, _b, _c, _d, _e, _f; - let fg, bg; - /** - * First try: - * Theme might contain a global `tokenColor` without `name` or `scope` - * Used as default value for foreground/background - */ - let settings = theme.settings ? theme.settings : theme.tokenColors; - const globalSetting = settings - ? settings.find(s => { - return !s.name && !s.scope; - }) - : undefined; - if ((_a = globalSetting === null || globalSetting === void 0 ? void 0 : globalSetting.settings) === null || _a === void 0 ? void 0 : _a.foreground) { - fg = globalSetting.settings.foreground; - } - if ((_b = globalSetting === null || globalSetting === void 0 ? void 0 : globalSetting.settings) === null || _b === void 0 ? void 0 : _b.background) { - bg = globalSetting.settings.background; - } - /** - * Second try: - * If there's no global `tokenColor` without `name` or `scope` - * Use `editor.foreground` and `editor.background` - */ - if (!fg && ((_d = (_c = theme) === null || _c === void 0 ? void 0 : _c.colors) === null || _d === void 0 ? void 0 : _d['editor.foreground'])) { - fg = theme.colors['editor.foreground']; - } - if (!bg && ((_f = (_e = theme) === null || _e === void 0 ? void 0 : _e.colors) === null || _f === void 0 ? void 0 : _f['editor.background'])) { - bg = theme.colors['editor.background']; - } - /** - * Last try: - * If there's no fg/bg color specified in theme, use default - */ - if (!fg) { - fg = theme.type === 'light' ? VSCODE_FALLBACK_EDITOR_FG.light : VSCODE_FALLBACK_EDITOR_FG.dark; - } - if (!bg) { - bg = theme.type === 'light' ? VSCODE_FALLBACK_EDITOR_BG.light : VSCODE_FALLBACK_EDITOR_BG.dark; - } - return { - fg, - bg - }; -} - -/*--------------------------------------------------------- - * Copyright (C) Microsoft Corporation. All rights reserved. - *--------------------------------------------------------*/ -class Resolver { - constructor(onigLibPromise, onigLibName) { - this.languagesPath = 'languages/'; - this.languageMap = {}; - this.scopeToLangMap = {}; - this._onigLibPromise = onigLibPromise; - this._onigLibName = onigLibName; - } - get onigLib() { - return this._onigLibPromise; - } - getOnigLibName() { - return this._onigLibName; - } - getLangRegistration(langIdOrAlias) { - return this.languageMap[langIdOrAlias]; - } - async loadGrammar(scopeName) { - const lang = this.scopeToLangMap[scopeName]; - if (!lang) { - return null; - } - if (lang.grammar) { - return lang.grammar; - } - const g = await fetchGrammar(languages.includes(lang) ? `${this.languagesPath}${lang.path}` : lang.path); - lang.grammar = g; - return g; - } - addLanguage(l) { - this.languageMap[l.id] = l; - if (l.aliases) { - l.aliases.forEach(a => { - this.languageMap[a] = l; - }); - } - this.scopeToLangMap[l.scopeName] = l; - } -} - -/*--------------------------------------------------------- - * Copyright (C) Microsoft Corporation. All rights reserved. - *--------------------------------------------------------*/ -function tokenizeWithTheme(theme, colorMap, fileContents, grammar, options) { - let lines = fileContents.split(/\r\n|\r|\n/); - let ruleStack = vscodeTextmate.INITIAL; - let actual = []; - let final = []; - for (let i = 0, len = lines.length; i < len; i++) { - let line = lines[i]; - if (line === '') { - actual = []; - final.push([]); - continue; - } - let resultWithScopes; - let tokensWithScopes; - let tokensWithScopesIndex; - if (options.includeExplanation) { - resultWithScopes = grammar.tokenizeLine(line, ruleStack); - tokensWithScopes = resultWithScopes.tokens; - tokensWithScopesIndex = 0; - } - let result = grammar.tokenizeLine2(line, ruleStack); - let tokensLength = result.tokens.length / 2; - for (let j = 0; j < tokensLength; j++) { - let startIndex = result.tokens[2 * j]; - let nextStartIndex = j + 1 < tokensLength ? result.tokens[2 * j + 2] : line.length; - if (startIndex === nextStartIndex) { - continue; - } - let metadata = result.tokens[2 * j + 1]; - let foreground = StackElementMetadata.getForeground(metadata); - let foregroundColor = colorMap[foreground]; - let fontStyle = StackElementMetadata.getFontStyle(metadata); - let explanation = []; - if (options.includeExplanation) { - let offset = 0; - while (startIndex + offset < nextStartIndex) { - let tokenWithScopes = tokensWithScopes[tokensWithScopesIndex]; - let tokenWithScopesText = line.substring(tokenWithScopes.startIndex, tokenWithScopes.endIndex); - offset += tokenWithScopesText.length; - explanation.push({ - content: tokenWithScopesText, - scopes: explainThemeScopes(theme, tokenWithScopes.scopes) - }); - tokensWithScopesIndex++; - } - } - actual.push({ - content: line.substring(startIndex, nextStartIndex), - color: foregroundColor, - fontStyle, - explanation: explanation - }); - } - final.push(actual); - actual = []; - ruleStack = result.ruleStack; - } - return final; -} -function explainThemeScopes(theme, scopes) { - let result = []; - for (let i = 0, len = scopes.length; i < len; i++) { - let parentScopes = scopes.slice(0, i); - let scope = scopes[i]; - result[i] = { - scopeName: scope, - themeMatches: explainThemeScope(theme, scope, parentScopes) - }; - } - return result; -} -function matchesOne(selector, scope) { - let selectorPrefix = selector + '.'; - if (selector === scope || scope.substring(0, selectorPrefix.length) === selectorPrefix) { - return true; - } - return false; -} -function matches(selector, selectorParentScopes, scope, parentScopes) { - if (!matchesOne(selector, scope)) { - return false; - } - let selectorParentIndex = selectorParentScopes.length - 1; - let parentIndex = parentScopes.length - 1; - while (selectorParentIndex >= 0 && parentIndex >= 0) { - if (matchesOne(selectorParentScopes[selectorParentIndex], parentScopes[parentIndex])) { - selectorParentIndex--; - } - parentIndex--; - } - if (selectorParentIndex === -1) { - return true; - } - return false; -} -function explainThemeScope(theme, scope, parentScopes) { - let result = [], resultLen = 0; - for (let i = 0, len = theme.settings.length; i < len; i++) { - let setting = theme.settings[i]; - let selectors; - if (typeof setting.scope === 'string') { - selectors = setting.scope.split(/,/).map(scope => scope.trim()); - } - else if (Array.isArray(setting.scope)) { - selectors = setting.scope; - } - else { - continue; - } - for (let j = 0, lenJ = selectors.length; j < lenJ; j++) { - let rawSelector = selectors[j]; - let rawSelectorPieces = rawSelector.split(/ /); - let selector = rawSelectorPieces[rawSelectorPieces.length - 1]; - let selectorParentScopes = rawSelectorPieces.slice(0, rawSelectorPieces.length - 1); - if (matches(selector, selectorParentScopes, scope, parentScopes)) { - // match! - result[resultLen++] = setting; - // break the loop - j = lenJ; - } - } - } - return result; -} - -function renderToHtml(lines, options = {}) { - const bg = options.bg || '#fff'; - let html = ''; - html += `
    `;
    -    if (options.langId) {
    -        html += `
    ${options.langId}
    `; - } - html += ``; - lines.forEach((l) => { - html += ``; - l.forEach(token => { - const cssDeclarations = [`color: ${token.color || options.fg}`]; - if (token.fontStyle & exports.FontStyle.Italic) { - cssDeclarations.push('font-style: italic'); - } - if (token.fontStyle & exports.FontStyle.Bold) { - cssDeclarations.push('font-weight: bold'); - } - if (token.fontStyle & exports.FontStyle.Underline) { - cssDeclarations.push('text-decoration: underline'); - } - html += `${escapeHtml(token.content)}`; - }); - html += `\n`; - }); - html = html.replace(/\n*$/, ''); // Get rid of final new lines - html += `
    `; - return html; -} -const htmlEscapes = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' -}; -function escapeHtml(html) { - return html.replace(/[&<>"']/g, chr => htmlEscapes[chr]); -} - -class Registry extends vscodeTextmate.Registry { - constructor(_resolver) { - super(_resolver); - this._resolver = _resolver; - this.themesPath = 'themes/'; - this._resolvedThemes = {}; - this._resolvedGrammars = {}; - } - getTheme(theme) { - if (typeof theme === 'string') { - return this._resolvedThemes[theme]; - } - else { - return theme; - } - } - async loadTheme(theme) { - if (typeof theme === 'string') { - if (!this._resolvedThemes[theme]) { - this._resolvedThemes[theme] = await fetchTheme(`${this.themesPath}${theme}.json`); - } - return this._resolvedThemes[theme]; - } - else { - theme = toShikiTheme(theme); - if (theme.name) { - this._resolvedThemes[theme.name] = theme; - } - return theme; - } - } - async loadThemes(themes) { - return await Promise.all(themes.map(theme => this.loadTheme(theme))); - } - getLoadedThemes() { - return Object.keys(this._resolvedThemes); - } - getGrammer(name) { - return this._resolvedGrammars[name]; - } - async loadLanguage(lang) { - const g = await this.loadGrammar(lang.scopeName); - this._resolvedGrammars[lang.id] = g; - if (lang.aliases) { - lang.aliases.forEach(la => { - this._resolvedGrammars[la] = g; - }); - } - } - async loadLanguages(langs) { - for (const lang of langs) { - this._resolver.addLanguage(lang); - } - for (const lang of langs) { - await this.loadLanguage(lang); - } - } - getLoadedLanguages() { - return Object.keys(this._resolvedGrammars); - } -} - -function resolveLang(lang) { - return typeof lang === 'string' - ? languages.find(l => { var _a; return l.id === lang || ((_a = l.aliases) === null || _a === void 0 ? void 0 : _a.includes(lang)); }) - : lang; -} -function resolveOptions(options) { - var _a; - let _languages = languages; - let _themes = options.themes || []; - if ((_a = options.langs) === null || _a === void 0 ? void 0 : _a.length) { - _languages = options.langs.map(resolveLang); - } - if (options.theme) { - _themes.unshift(options.theme); - } - if (!_themes.length) { - _themes = ['nord']; - } - return { _languages, _themes }; -} -async function getHighlighter(options) { - var _a, _b; - const { _languages, _themes } = resolveOptions(options); - const _resolver = new Resolver(getOnigasm(), 'onigasm'); - const _registry = new Registry(_resolver); - if ((_a = options.paths) === null || _a === void 0 ? void 0 : _a.themes) { - _registry.themesPath = options.paths.themes; - } - if ((_b = options.paths) === null || _b === void 0 ? void 0 : _b.languages) { - _resolver.languagesPath = options.paths.languages; - } - const themes = await _registry.loadThemes(_themes); - const _defaultTheme = themes[0]; - let _currentTheme; - await _registry.loadLanguages(_languages); - /** - * Shiki was designed for VS Code, so CSS variables are not currently supported. - * See: https://github.com/shikijs/shiki/pull/212#issuecomment-906924986 - * - * Instead, we work around this by using valid hex color codes as lookups in a - * final "repair" step which translates those codes to the correct CSS variables. - */ - const COLOR_REPLACEMENTS = { - '#000001': 'var(--shiki-color-text)', - '#000002': 'var(--shiki-color-background)', - '#000004': 'var(--shiki-token-constant)', - '#000005': 'var(--shiki-token-string)', - '#000006': 'var(--shiki-token-comment)', - '#000007': 'var(--shiki-token-keyword)', - '#000008': 'var(--shiki-token-parameter)', - '#000009': 'var(--shiki-token-function)', - '#000010': 'var(--shiki-token-string-expression)', - '#000011': 'var(--shiki-token-punctuation)', - '#000012': 'var(--shiki-token-link)' - }; - function fixCssVariablesTheme(theme, colorMap) { - theme.bg = COLOR_REPLACEMENTS[theme.bg] || theme.bg; - theme.fg = COLOR_REPLACEMENTS[theme.fg] || theme.fg; - colorMap.forEach((val, i) => { - colorMap[i] = COLOR_REPLACEMENTS[val] || val; - }); - } - function getTheme(theme) { - const _theme = theme ? _registry.getTheme(theme) : _defaultTheme; - if (!_theme) { - throw Error(`No theme registration for ${theme}`); - } - if (!_currentTheme || _currentTheme.name !== _theme.name) { - _registry.setTheme(_theme); - _currentTheme = _theme; - } - const _colorMap = _registry.getColorMap(); - if (_theme.name === 'css-variables') { - fixCssVariablesTheme(_theme, _colorMap); - } - return { _theme, _colorMap }; - } - function getGrammer(lang) { - const _grammer = _registry.getGrammer(lang); - if (!_grammer) { - throw Error(`No language registration for ${lang}`); - } - return { _grammer }; - } - function codeToThemedTokens(code, lang = 'text', theme, options = { includeExplanation: true }) { - if (isPlaintext(lang)) { - return [[{ content: code }]]; - } - const { _grammer } = getGrammer(lang); - const { _theme, _colorMap } = getTheme(theme); - return tokenizeWithTheme(_theme, _colorMap, code, _grammer, options); - } - function codeToHtml(code, lang = 'text', theme) { - const tokens = codeToThemedTokens(code, lang, theme, { - includeExplanation: false - }); - const { _theme } = getTheme(theme); - return renderToHtml(tokens, { - fg: _theme.fg, - bg: _theme.bg - }); - } - async function loadTheme(theme) { - await _registry.loadTheme(theme); - } - async function loadLanguage(lang) { - const _lang = resolveLang(lang); - _resolver.addLanguage(_lang); - await _registry.loadLanguage(_lang); - } - function getLoadedThemes() { - return _registry.getLoadedThemes(); - } - function getLoadedLanguages() { - return _registry.getLoadedLanguages(); - } - function getBackgroundColor(theme) { - const { _theme } = getTheme(theme); - return _theme.bg; - } - function getForegroundColor(theme) { - const { _theme } = getTheme(theme); - return _theme.fg; - } - return { - codeToThemedTokens, - codeToHtml, - getTheme: (theme) => { - return getTheme(theme)._theme; - }, - loadTheme, - loadLanguage, - getBackgroundColor, - getForegroundColor, - getLoadedThemes, - getLoadedLanguages - }; -} -function isPlaintext(lang) { - return !lang || ['plaintext', 'txt', 'text'].includes(lang); -} - -exports.BUNDLED_LANGUAGES = languages; -exports.BUNDLED_THEMES = themes; -exports.getHighlighter = getHighlighter; -exports.loadTheme = fetchTheme; -exports.renderToHtml = renderToHtml; -exports.setCDN = setCDN; -exports.setOnigasmWASM = setOnigasmWASM; diff --git a/src/http/get-docs-000lang-catchall/shiki/languages/javascript.tmLanguage.json b/src/http/get-docs-000lang-catchall/shiki/languages/javascript.tmLanguage.json deleted file mode 100644 index 724afaa4..00000000 --- a/src/http/get-docs-000lang-catchall/shiki/languages/javascript.tmLanguage.json +++ /dev/null @@ -1,5876 +0,0 @@ -{ - "information_for_contributors": [ - "This file has been converted from https://github.com/microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage", - "If you want to provide a fix or improvement, please create a pull request against the original repository.", - "Once accepted there, we are happy to receive an update request." - ], - "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/33d8371c344f0b54746586313a939f742f9bcd3a", - "name": "javascript", - "scopeName": "source.js", - "patterns": [ - { - "include": "#directives" - }, - { - "include": "#statements" - }, - { - "include": "#shebang" - } - ], - "repository": { - "shebang": { - "name": "comment.line.shebang.js", - "match": "\\A(#!).*(?=$)", - "captures": { - "1": { - "name": "punctuation.definition.comment.js" - } - } - }, - "statements": { - "patterns": [ - { - "include": "#declaration" - }, - { - "include": "#control-statement" - }, - { - "include": "#after-operator-block-as-object-literal" - }, - { - "include": "#decl-block" - }, - { - "include": "#label" - }, - { - "include": "#expression" - }, - { - "include": "#punctuation-semicolon" - }, - { - "include": "#string" - }, - { - "include": "#comment" - } - ] - }, - "declaration": { - "patterns": [ - { - "include": "#decorator" - }, - { - "include": "#var-expr" - }, - { - "include": "#function-declaration" - }, - { - "include": "#class-declaration" - }, - { - "include": "#interface-declaration" - }, - { - "include": "#enum-declaration" - }, - { - "include": "#namespace-declaration" - }, - { - "include": "#type-alias-declaration" - }, - { - "include": "#import-equals-declaration" - }, - { - "include": "#import-declaration" - }, - { - "include": "#export-declaration" - }, - { - "name": "storage.modifier.js", - "match": "(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "beginCaptures": { - "1": { - "name": "meta.definition.variable.js entity.name.function.js" - }, - "2": { - "name": "keyword.operator.definiteassignment.js" - } - }, - "end": "(?=$|^|[;,=}]|((?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "beginCaptures": { - "1": { - "name": "meta.definition.variable.js variable.other.constant.js entity.name.function.js" - } - }, - "end": "(?=$|^|[;,=}]|((?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "1": { - "name": "storage.modifier.js" - }, - "2": { - "name": "keyword.operator.rest.js" - }, - "3": { - "name": "entity.name.function.js variable.language.this.js" - }, - "4": { - "name": "entity.name.function.js" - }, - "5": { - "name": "keyword.operator.optional.js" - } - } - }, - { - "match": "(?x)(?:(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "1": { - "name": "meta.definition.property.js entity.name.function.js" - }, - "2": { - "name": "keyword.operator.optional.js" - }, - "3": { - "name": "keyword.operator.definiteassignment.js" - } - } - }, - { - "name": "meta.definition.property.js variable.object.property.js", - "match": "\\#?[_$[:alpha:]][_$[:alnum:]]*" - }, - { - "name": "keyword.operator.optional.js", - "match": "\\?" - }, - { - "name": "keyword.operator.definiteassignment.js", - "match": "\\!" - } - ] - }, - "variable-initializer": { - "patterns": [ - { - "begin": "(?\\s*$)", - "beginCaptures": { - "1": { - "name": "keyword.operator.assignment.js" - } - }, - "end": "(?=$|^|[,);}\\]]|((?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?[\\(])", - "beginCaptures": { - "1": { - "name": "storage.modifier.js" - }, - "2": { - "name": "storage.modifier.js" - }, - "3": { - "name": "storage.modifier.js" - }, - "4": { - "name": "storage.modifier.async.js" - }, - "5": { - "name": "keyword.operator.new.js" - }, - "6": { - "name": "keyword.generator.asterisk.js" - } - }, - "end": "(?=\\}|;|,|$)|(?<=\\})", - "patterns": [ - { - "include": "#method-declaration-name" - }, - { - "include": "#function-body" - } - ] - }, - { - "name": "meta.method.declaration.js", - "begin": "(?x)(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?[\\(])", - "beginCaptures": { - "1": { - "name": "storage.modifier.js" - }, - "2": { - "name": "storage.modifier.js" - }, - "3": { - "name": "storage.modifier.js" - }, - "4": { - "name": "storage.modifier.async.js" - }, - "5": { - "name": "storage.type.property.js" - }, - "6": { - "name": "keyword.generator.asterisk.js" - } - }, - "end": "(?=\\}|;|,|$)|(?<=\\})", - "patterns": [ - { - "include": "#method-declaration-name" - }, - { - "include": "#function-body" - } - ] - } - ] - }, - "object-literal-method-declaration": { - "name": "meta.method.declaration.js", - "begin": "(?x)(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?[\\(])", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - }, - "2": { - "name": "storage.type.property.js" - }, - "3": { - "name": "keyword.generator.asterisk.js" - } - }, - "end": "(?=\\}|;|,)|(?<=\\})", - "patterns": [ - { - "include": "#method-declaration-name" - }, - { - "include": "#function-body" - }, - { - "begin": "(?x)(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?[\\(])", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - }, - "2": { - "name": "storage.type.property.js" - }, - "3": { - "name": "keyword.generator.asterisk.js" - } - }, - "end": "(?=\\(|\\<)", - "patterns": [ - { - "include": "#method-declaration-name" - } - ] - } - ] - }, - "method-declaration-name": { - "begin": "(?x)(?=((\\b(?)", - "captures": { - "1": { - "name": "storage.modifier.async.js" - }, - "2": { - "name": "variable.parameter.js" - } - } - }, - { - "name": "meta.arrow.js", - "begin": "(?x) (?:\n (? is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - } - }, - "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#type-parameters" - }, - { - "include": "#function-parameters" - }, - { - "include": "#arrow-return-type" - }, - { - "include": "#possibly-arrow-return-type" - } - ] - }, - { - "name": "meta.arrow.js", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.js" - } - }, - "end": "((?<=\\}|\\S)(?)|((?!\\{)(?=\\S)))(?!\\/[\\/\\*])", - "patterns": [ - { - "include": "#single-line-comment-consuming-line-ending" - }, - { - "include": "#decl-block" - }, - { - "include": "#expression" - } - ] - } - ] - }, - "indexer-declaration": { - "name": "meta.indexer.declaration.js", - "begin": "(?:(?]|^await|[^\\._$[:alnum:]]await|^return|[^\\._$[:alnum:]]return|^yield|[^\\._$[:alnum:]]yield|^throw|[^\\._$[:alnum:]]throw|^in|[^\\._$[:alnum:]]in|^of|[^\\._$[:alnum:]]of|^typeof|[^\\._$[:alnum:]]typeof|&&|\\|\\||\\*)\\s*(\\{)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.block.js" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.block.js" - } - }, - "patterns": [ - { - "include": "#object-member" - } - ] - }, - "object-literal": { - "name": "meta.objectliteral.js", - "begin": "\\{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.block.js" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.block.js" - } - }, - "patterns": [ - { - "include": "#object-member" - } - ] - }, - "object-member": { - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#object-literal-method-declaration" - }, - { - "name": "meta.object.member.js meta.object-literal.key.js", - "begin": "(?=\\[)", - "end": "(?=:)|((?<=[\\]])(?=\\s*[\\(\\<]))", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#array-literal" - } - ] - }, - { - "name": "meta.object.member.js meta.object-literal.key.js", - "begin": "(?=[\\'\\\"\\`])", - "end": "(?=:)|((?<=[\\'\\\"\\`])(?=((\\s*[\\(\\<,}])|(\\s+(as)\\s+))))", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#string" - } - ] - }, - { - "name": "meta.object.member.js meta.object-literal.key.js", - "begin": "(?x)(?=(\\b(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "0": { - "name": "meta.object-literal.key.js" - }, - "1": { - "name": "entity.name.function.js" - } - } - }, - { - "name": "meta.object.member.js", - "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*:)", - "captures": { - "0": { - "name": "meta.object-literal.key.js" - } - } - }, - { - "name": "meta.object.member.js", - "begin": "\\.\\.\\.", - "beginCaptures": { - "0": { - "name": "keyword.operator.spread.js" - } - }, - "end": "(?=,|\\})", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "name": "meta.object.member.js", - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$|\\/\\/|\\/\\*)", - "captures": { - "1": { - "name": "variable.other.readwrite.js" - } - } - }, - { - "name": "meta.object.member.js", - "match": "(?]|\\|\\||\\&\\&|\\!\\=\\=|$|^|((?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)\\(\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - } - }, - "end": "(?<=\\))", - "patterns": [ - { - "include": "#type-parameters" - }, - { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "meta.brace.round.js" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.js" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] - } - ] - }, - { - "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - }, - "2": { - "name": "meta.brace.round.js" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.js" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] - }, - { - "begin": "(?<=:)\\s*(async)?\\s*(?=\\<\\s*$)", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - } - }, - "end": "(?<=\\>)", - "patterns": [ - { - "include": "#type-parameters" - } - ] - }, - { - "begin": "(?<=\\>)\\s*(\\()(?=\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", - "beginCaptures": { - "1": { - "name": "meta.brace.round.js" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.js" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] - }, - { - "include": "#possibly-arrow-return-type" - }, - { - "include": "#expression" - } - ] - }, - { - "include": "#punctuation-comma" - } - ] - }, - "ternary-expression": { - "begin": "(?!\\?\\.\\s*[^[:digit:]])(\\?)(?!\\?)", - "beginCaptures": { - "1": { - "name": "keyword.operator.ternary.js" - } - }, - "end": "\\s*(:)", - "endCaptures": { - "1": { - "name": "keyword.operator.ternary.js" - } - }, - "patterns": [ - { - "include": "#expression" - } - ] - }, - "function-call": { - "patterns": [ - { - "begin": "(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\\)]))\\s*(?:(\\?\\.\\s*)|(\\!))?((<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?\\())", - "end": "(?<=\\))(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\\)]))\\s*(?:(\\?\\.\\s*)|(\\!))?((<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?\\())", - "patterns": [ - { - "name": "meta.function-call.js", - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(?:(\\?\\.\\s*)|(\\!))?((<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?\\())", - "patterns": [ - { - "include": "#function-call-target" - } - ] - }, - { - "include": "#comment" - }, - { - "include": "#function-call-optionals" - }, - { - "include": "#type-arguments" - }, - { - "include": "#paren-expression" - } - ] - }, - { - "begin": "(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\\)]))(<\\s*[\\{\\[\\(]\\s*$))", - "end": "(?<=\\>)(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\\)]))(<\\s*[\\{\\[\\(]\\s*$))", - "patterns": [ - { - "name": "meta.function-call.js", - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=(<\\s*[\\{\\[\\(]\\s*$))", - "patterns": [ - { - "include": "#function-call-target" - } - ] - }, - { - "include": "#comment" - }, - { - "include": "#function-call-optionals" - }, - { - "include": "#type-arguments" - } - ] - } - ] - }, - "function-call-target": { - "patterns": [ - { - "include": "#support-function-call-identifiers" - }, - { - "name": "entity.name.function.js", - "match": "(\\#?[_$[:alpha:]][_$[:alnum:]]*)" - } - ] - }, - "function-call-optionals": { - "patterns": [ - { - "name": "meta.function-call.js punctuation.accessor.optional.js", - "match": "\\?\\." - }, - { - "name": "meta.function-call.js keyword.operator.definiteassignment.js", - "match": "\\!" - } - ] - }, - "support-function-call-identifiers": { - "patterns": [ - { - "include": "#literal" - }, - { - "include": "#support-objects" - }, - { - "include": "#object-identifiers" - }, - { - "include": "#punctuation-accessor" - }, - { - "name": "keyword.operator.expression.import.js", - "match": "(?:(?]|\\|\\||\\&\\&|\\!\\=\\=|$|((?]|\\|\\||\\&\\&|\\!\\=\\=|$|(([\\&\\~\\^\\|]\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s+instanceof(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.)))|((?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?\\(\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - } - }, - "end": "(?<=\\))", - "patterns": [ - { - "include": "#paren-expression-possibly-arrow-with-typeparameters" - } - ] - }, - { - "begin": "(?<=[(=,]|=>|^return|[^\\._$[:alnum:]]return)\\s*(async)?(?=\\s*((((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?\\()|(<))\\s*$)", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - } - }, - "end": "(?<=\\))", - "patterns": [ - { - "include": "#paren-expression-possibly-arrow-with-typeparameters" - } - ] - }, - { - "include": "#possibly-arrow-return-type" - } - ] - }, - "paren-expression-possibly-arrow-with-typeparameters": { - "patterns": [ - { - "include": "#type-parameters" - }, - { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "meta.brace.round.js" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.js" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] - } - ] - }, - "expression-inside-possibly-arrow-parens": { - "patterns": [ - { - "include": "#expressionWithoutIdentifiers" - }, - { - "include": "#comment" - }, - { - "include": "#string" - }, - { - "include": "#decorator" - }, - { - "include": "#destructuring-parameter" - }, - { - "match": "(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "1": { - "name": "storage.modifier.js" - }, - "2": { - "name": "keyword.operator.rest.js" - }, - "3": { - "name": "entity.name.function.js variable.language.this.js" - }, - "4": { - "name": "entity.name.function.js" - }, - "5": { - "name": "keyword.operator.optional.js" - } - } - }, - { - "match": "(?x)(?:(?]|\\|\\||\\&\\&|\\!\\=\\=|$|((?>=|>>>=|\\|=" - }, - { - "name": "keyword.operator.bitwise.shift.js", - "match": "<<|>>>|>>" - }, - { - "name": "keyword.operator.comparison.js", - "match": "===|!==|==|!=" - }, - { - "name": "keyword.operator.relational.js", - "match": "<=|>=|<>|<|>" - }, - { - "match": "(?<=[_$[:alnum:]])(\\!)\\s*(?:(/=)|(?:(/)(?![/*])))", - "captures": { - "1": { - "name": "keyword.operator.logical.js" - }, - "2": { - "name": "keyword.operator.assignment.compound.js" - }, - "3": { - "name": "keyword.operator.arithmetic.js" - } - } - }, - { - "name": "keyword.operator.logical.js", - "match": "\\!|&&|\\|\\||\\?\\?" - }, - { - "name": "keyword.operator.bitwise.js", - "match": "\\&|~|\\^|\\|" - }, - { - "name": "keyword.operator.assignment.js", - "match": "\\=" - }, - { - "name": "keyword.operator.decrement.js", - "match": "--" - }, - { - "name": "keyword.operator.increment.js", - "match": "\\+\\+" - }, - { - "name": "keyword.operator.arithmetic.js", - "match": "%|\\*|/|-|\\+" - }, - { - "begin": "(?<=[_$[:alnum:])\\]])\\s*(?=(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)+(?:(/=)|(?:(/)(?![/*]))))", - "end": "(?:(/=)|(?:(/)(?!\\*([^\\*]|(\\*[^\\/]))*\\*\\/)))", - "endCaptures": { - "1": { - "name": "keyword.operator.assignment.compound.js" - }, - "2": { - "name": "keyword.operator.arithmetic.js" - } - }, - "patterns": [ - { - "include": "#comment" - } - ] - }, - { - "match": "(?<=[_$[:alnum:])\\]])\\s*(?:(/=)|(?:(/)(?![/*])))", - "captures": { - "1": { - "name": "keyword.operator.assignment.compound.js" - }, - "2": { - "name": "keyword.operator.arithmetic.js" - } - } - } - ] - }, - "typeof-operator": { - "begin": "(?:&|{\\?]|$|;|^\\s*$|(?:^\\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\\b))", - "patterns": [ - { - "include": "#expression" - } - ] - }, - "literal": { - "patterns": [ - { - "include": "#numeric-literal" - }, - { - "include": "#boolean-literal" - }, - { - "include": "#null-literal" - }, - { - "include": "#undefined-literal" - }, - { - "include": "#numericConstant-literal" - }, - { - "include": "#array-literal" - }, - { - "include": "#this-literal" - }, - { - "include": "#super-literal" - } - ] - }, - "array-literal": { - "name": "meta.array.literal.js", - "begin": "\\s*(\\[)", - "beginCaptures": { - "1": { - "name": "meta.brace.square.js" - } - }, - "end": "\\]", - "endCaptures": { - "0": { - "name": "meta.brace.square.js" - } - }, - "patterns": [ - { - "include": "#expression" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "numeric-literal": { - "patterns": [ - { - "name": "constant.numeric.hex.js", - "match": "\\b(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\\())\n |\n (?:(EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY)\\b(?!\\$)))", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "punctuation.accessor.optional.js" - }, - "3": { - "name": "support.variable.property.js" - }, - "4": { - "name": "support.constant.js" - } - } - }, - { - "match": "(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|([\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "punctuation.accessor.optional.js" - }, - "3": { - "name": "entity.name.function.js" - } - } - }, - { - "match": "(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*(\\#?[[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "punctuation.accessor.optional.js" - }, - "3": { - "name": "variable.other.constant.property.js" - } - } - }, - { - "match": "(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "punctuation.accessor.optional.js" - }, - "3": { - "name": "variable.other.property.js" - } - } - }, - { - "name": "variable.other.constant.js", - "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" - }, - { - "name": "variable.other.readwrite.js", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "object-identifiers": { - "patterns": [ - { - "name": "support.class.js", - "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\??\\.\\s*prototype\\b(?!\\$))" - }, - { - "match": "(?x)(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*(?:\n (\\#?[[:upper:]][_$[:digit:][:upper:]]*) |\n (\\#?[_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "punctuation.accessor.optional.js" - }, - "3": { - "name": "variable.other.constant.object.property.js" - }, - "4": { - "name": "variable.other.object.property.js" - } - } - }, - { - "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "variable.other.constant.object.js" - }, - "2": { - "name": "variable.other.object.js" - } - } - } - ] - }, - "type-annotation": { - "patterns": [ - { - "name": "meta.type.annotation.js", - "begin": "(:)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.js" - } - }, - "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - }, - { - "name": "meta.type.annotation.js", - "begin": "(:)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.js" - } - }, - "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "parameter-type-annotation": { - "patterns": [ - { - "name": "meta.type.annotation.js", - "begin": "(:)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.js" - } - }, - "end": "(?=[,)])|(?==[^>])", - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "return-type": { - "patterns": [ - { - "name": "meta.return.type.js", - "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.js" - } - }, - "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", - "patterns": [ - { - "include": "#arrow-return-type-body" - } - ] - }, - "possibly-arrow-return-type": { - "begin": "(?<=\\)|^)\\s*(:)(?=\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*=>)", - "beginCaptures": { - "1": { - "name": "meta.arrow.js meta.return.type.arrow.js keyword.operator.type.annotation.js" - } - }, - "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", - "contentName": "meta.arrow.js meta.return.type.arrow.js", - "patterns": [ - { - "include": "#arrow-return-type-body" - } - ] - }, - "arrow-return-type-body": { - "patterns": [ - { - "begin": "(?<=[:])(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-parameters": { - "name": "meta.type.parameters.js", - "begin": "(<)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.begin.js" - } - }, - "end": "(>)", - "endCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.end.js" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "name": "storage.modifier.js", - "match": "(?)" - } - ] - }, - "type-arguments": { - "name": "meta.type.parameters.js", - "begin": "\\<", - "beginCaptures": { - "0": { - "name": "punctuation.definition.typeparameters.begin.js" - } - }, - "end": "\\>", - "endCaptures": { - "0": { - "name": "punctuation.definition.typeparameters.end.js" - } - }, - "patterns": [ - { - "include": "#type-arguments-body" - } - ] - }, - "type-arguments-body": { - "patterns": [ - { - "match": "(?)\n ))\n ))\n)) |\n(:\\s*(?\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))))", - "captures": { - "1": { - "name": "storage.modifier.js" - }, - "2": { - "name": "keyword.operator.rest.js" - }, - "3": { - "name": "entity.name.function.js variable.language.this.js" - }, - "4": { - "name": "entity.name.function.js" - }, - "5": { - "name": "keyword.operator.optional.js" - } - } - }, - { - "match": "(?x)(?:(?)", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#type-parameters" - } - ] - }, - { - "name": "meta.type.constructor.js", - "begin": "(?)\n ))\n )\n )\n)", - "end": "(?<=\\))", - "patterns": [ - { - "include": "#function-parameters" - } - ] - } - ] - }, - "type-function-return-type": { - "patterns": [ - { - "name": "meta.type.function.return.js", - "begin": "(=>)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "storage.type.function.arrow.js" - } - }, - "end": "(?)(?:\\?]|//|$)", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - }, - { - "name": "meta.type.function.return.js", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.js" - } - }, - "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - } - ] - }, - "type-function-return-type-core": { - "patterns": [ - { - "include": "#comment" - }, - { - "begin": "(?<==>)(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-operators": { - "patterns": [ - { - "include": "#typeof-operator" - }, - { - "begin": "([&|])(?=\\s*\\{)", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.js" - } - }, - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "begin": "[&|]", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.js" - } - }, - "end": "(?=\\S)" - }, - { - "name": "keyword.operator.expression.keyof.js", - "match": "(?)", - "endCaptures": { - "1": { - "name": "meta.type.parameters.js punctuation.definition.typeparameters.end.js" - } - }, - "contentName": "meta.type.parameters.js", - "patterns": [ - { - "include": "#type-arguments-body" - } - ] - }, - { - "begin": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(<)", - "beginCaptures": { - "1": { - "name": "entity.name.type.js" - }, - "2": { - "name": "meta.type.parameters.js punctuation.definition.typeparameters.begin.js" - } - }, - "end": "(>)", - "endCaptures": { - "1": { - "name": "meta.type.parameters.js punctuation.definition.typeparameters.end.js" - } - }, - "contentName": "meta.type.parameters.js", - "patterns": [ - { - "include": "#type-arguments-body" - } - ] - }, - { - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))", - "captures": { - "1": { - "name": "entity.name.type.module.js" - }, - "2": { - "name": "punctuation.accessor.js" - }, - "3": { - "name": "punctuation.accessor.optional.js" - } - } - }, - { - "name": "entity.name.type.js", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "punctuation-comma": { - "name": "punctuation.separator.comma.js", - "match": "," - }, - "punctuation-semicolon": { - "name": "punctuation.terminator.statement.js", - "match": ";" - }, - "punctuation-accessor": { - "match": "(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "punctuation.accessor.optional.js" - } - } - }, - "string": { - "patterns": [ - { - "include": "#qstring-single" - }, - { - "include": "#qstring-double" - }, - { - "include": "#template" - } - ] - }, - "qstring-double": { - "name": "string.quoted.double.js", - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.js" - } - }, - "end": "(\")|((?:[^\\\\\\n])$)", - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.js" - }, - "2": { - "name": "invalid.illegal.newline.js" - } - }, - "patterns": [ - { - "include": "#string-character-escape" - } - ] - }, - "qstring-single": { - "name": "string.quoted.single.js", - "begin": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.js" - } - }, - "end": "(\\')|((?:[^\\\\\\n])$)", - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.js" - }, - "2": { - "name": "invalid.illegal.newline.js" - } - }, - "patterns": [ - { - "include": "#string-character-escape" - } - ] - }, - "string-character-escape": { - "name": "constant.character.escape.js", - "match": "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\\{[0-9A-Fa-f]+\\}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)" - }, - "template": { - "patterns": [ - { - "include": "#template-call" - }, - { - "name": "string.template.js", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.js" - }, - "2": { - "name": "punctuation.definition.string.template.begin.js" - } - }, - "end": "`", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.template.end.js" - } - }, - "patterns": [ - { - "include": "#template-substitution-element" - }, - { - "include": "#string-character-escape" - } - ] - } - ] - }, - "template-call": { - "patterns": [ - { - "name": "string.template.js", - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?`)", - "end": "(?=`)", - "patterns": [ - { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?`)", - "patterns": [ - { - "include": "#support-function-call-identifiers" - }, - { - "name": "entity.name.function.tagged-template.js", - "match": "([_$[:alpha:]][_$[:alnum:]]*)" - } - ] - }, - { - "include": "#type-arguments" - } - ] - }, - { - "name": "string.template.js", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)?\\s*(?=(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.js" - } - }, - "end": "(?=`)", - "patterns": [ - { - "include": "#type-arguments" - } - ] - } - ] - }, - "template-substitution-element": { - "name": "meta.template.expression.js", - "begin": "\\$\\{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.template-expression.begin.js" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.template-expression.end.js" - } - }, - "patterns": [ - { - "include": "#expression" - } - ], - "contentName": "meta.embedded.line.js" - }, - "type-string": { - "patterns": [ - { - "include": "#qstring-single" - }, - { - "include": "#qstring-double" - }, - { - "include": "#template-type" - } - ] - }, - "template-type": { - "patterns": [ - { - "include": "#template-call" - }, - { - "name": "string.template.js", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.js" - }, - "2": { - "name": "punctuation.definition.string.template.begin.js" - } - }, - "end": "`", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.template.end.js" - } - }, - "patterns": [ - { - "include": "#template-type-substitution-element" - }, - { - "include": "#string-character-escape" - } - ] - } - ] - }, - "template-type-substitution-element": { - "name": "meta.template.expression.js", - "begin": "\\$\\{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.template-expression.begin.js" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.template-expression.end.js" - } - }, - "patterns": [ - { - "include": "#type" - } - ], - "contentName": "meta.embedded.line.js" - }, - "regex": { - "patterns": [ - { - "name": "string.regexp.js", - "begin": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[\\()]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\]|\\(([^\\)\\\\]|\\\\.)+\\))+\\/([dgimsuy]+|(?![\\/\\*])|(?=\\/\\*))(?!\\s*[a-zA-Z0-9_$]))", - "beginCaptures": { - "1": { - "name": "punctuation.definition.string.begin.js" - } - }, - "end": "(/)([dgimsuy]*)", - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.js" - }, - "2": { - "name": "keyword.other.js" - } - }, - "patterns": [ - { - "include": "#regexp" - } - ] - }, - { - "name": "string.regexp.js", - "begin": "((?", - "captures": { - "0": { - "name": "keyword.other.back-reference.regexp" - }, - "1": { - "name": "variable.other.regexp" - } - } - }, - { - "name": "keyword.operator.quantifier.regexp", - "match": "[?+*]|\\{(\\d+,\\d+|\\d+,|,\\d+|\\d+)\\}\\??" - }, - { - "name": "keyword.operator.or.regexp", - "match": "\\|" - }, - { - "name": "meta.group.assertion.regexp", - "begin": "(\\()((\\?=)|(\\?!)|(\\?<=)|(\\?))?", - "beginCaptures": { - "0": { - "name": "punctuation.definition.group.regexp" - }, - "1": { - "name": "punctuation.definition.group.no-capture.regexp" - }, - "2": { - "name": "variable.other.regexp" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.group.regexp" - } - }, - "patterns": [ - { - "include": "#regexp" - } - ] - }, - { - "name": "constant.other.character-class.set.regexp", - "begin": "(\\[)(\\^)?", - "beginCaptures": { - "1": { - "name": "punctuation.definition.character-class.regexp" - }, - "2": { - "name": "keyword.operator.negation.regexp" - } - }, - "end": "(\\])", - "endCaptures": { - "1": { - "name": "punctuation.definition.character-class.regexp" - } - }, - "patterns": [ - { - "name": "constant.other.character-class.range.regexp", - "match": "(?:.|(\\\\(?:[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}))|(\\\\c[A-Z])|(\\\\.))\\-(?:[^\\]\\\\]|(\\\\(?:[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}))|(\\\\c[A-Z])|(\\\\.))", - "captures": { - "1": { - "name": "constant.character.numeric.regexp" - }, - "2": { - "name": "constant.character.control.regexp" - }, - "3": { - "name": "constant.character.escape.backslash.regexp" - }, - "4": { - "name": "constant.character.numeric.regexp" - }, - "5": { - "name": "constant.character.control.regexp" - }, - "6": { - "name": "constant.character.escape.backslash.regexp" - } - } - }, - { - "include": "#regex-character-class" - } - ] - }, - { - "include": "#regex-character-class" - } - ] - }, - "regex-character-class": { - "patterns": [ - { - "name": "constant.other.character-class.regexp", - "match": "\\\\[wWsSdDtrnvf]|\\." - }, - { - "name": "constant.character.numeric.regexp", - "match": "\\\\([0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4})" - }, - { - "name": "constant.character.control.regexp", - "match": "\\\\c[A-Z]" - }, - { - "name": "constant.character.escape.backslash.regexp", - "match": "\\\\." - } - ] - }, - "comment": { - "patterns": [ - { - "name": "comment.block.documentation.js", - "begin": "/\\*\\*(?!/)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.js" - } - }, - "end": "\\*/", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.js" - } - }, - "patterns": [ - { - "include": "#docblock" - } - ] - }, - { - "name": "comment.block.js", - "begin": "(/\\*)(?:\\s*((@)internal)(?=\\s|(\\*/)))?", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.js" - }, - "2": { - "name": "storage.type.internaldeclaration.js" - }, - "3": { - "name": "punctuation.decorator.internaldeclaration.js" - } - }, - "end": "\\*/", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.js" - } - } - }, - { - "begin": "(^[ \\t]+)?((//)(?:\\s*((@)internal)(?=\\s|$))?)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.js" - }, - "2": { - "name": "comment.line.double-slash.js" - }, - "3": { - "name": "punctuation.definition.comment.js" - }, - "4": { - "name": "storage.type.internaldeclaration.js" - }, - "5": { - "name": "punctuation.decorator.internaldeclaration.js" - } - }, - "end": "(?=$)", - "contentName": "comment.line.double-slash.js" - } - ] - }, - "single-line-comment-consuming-line-ending": { - "begin": "(^[ \\t]+)?((//)(?:\\s*((@)internal)(?=\\s|$))?)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.js" - }, - "2": { - "name": "comment.line.double-slash.js" - }, - "3": { - "name": "punctuation.definition.comment.js" - }, - "4": { - "name": "storage.type.internaldeclaration.js" - }, - "5": { - "name": "punctuation.decorator.internaldeclaration.js" - } - }, - "end": "(?=^)", - "contentName": "comment.line.double-slash.js" - }, - "directives": { - "name": "comment.line.triple-slash.directive.js", - "begin": "^(///)\\s*(?=<(reference|amd-dependency|amd-module)(\\s+(path|types|no-default-lib|lib|name)\\s*=\\s*((\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`)))+\\s*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.js" - } - }, - "end": "(?=$)", - "patterns": [ - { - "name": "meta.tag.js", - "begin": "(<)(reference|amd-dependency|amd-module)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.directive.js" - }, - "2": { - "name": "entity.name.tag.directive.js" - } - }, - "end": "/>", - "endCaptures": { - "0": { - "name": "punctuation.definition.tag.directive.js" - } - }, - "patterns": [ - { - "name": "entity.other.attribute-name.directive.js", - "match": "path|types|no-default-lib|lib|name" - }, - { - "name": "keyword.operator.assignment.js", - "match": "=" - }, - { - "include": "#string" - } - ] - } - ] - }, - "docblock": { - "patterns": [ - { - "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "constant.language.access-type.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - }, - "4": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "5": { - "name": "constant.other.email.link.underline.jsdoc" - }, - "6": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - }, - "4": { - "name": "keyword.operator.control.jsdoc" - }, - "5": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "name": "meta.example.jsdoc", - "begin": "((@)example)\\s+", - "end": "(?=@|\\*/)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "patterns": [ - { - "match": "^\\s\\*\\s+" - }, - { - "contentName": "constant.other.description.jsdoc", - "begin": "\\G(<)caption(>)", - "beginCaptures": { - "0": { - "name": "entity.name.tag.inline.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - }, - "end": "()|(?=\\*/)", - "endCaptures": { - "0": { - "name": "entity.name.tag.inline.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - } - }, - { - "match": "[^\\s@*](?:[^*]|\\*[^/])*", - "captures": { - "0": { - "name": "source.embedded.js" - } - } - } - ] - }, - { - "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "constant.language.symbol-type.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.link.underline.jsdoc" - }, - "4": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "begin": "((@)typedef)\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - }, - { - "name": "entity.name.type.instance.jsdoc", - "match": "(?:[^@\\s*/]|\\*[^/])+" - } - ] - }, - { - "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - }, - { - "name": "variable.other.jsdoc", - "match": "([A-Za-z_$][\\w$.\\[\\]]*)" - }, - { - "name": "variable.other.jsdoc", - "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", - "captures": { - "1": { - "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" - }, - "2": { - "name": "keyword.operator.assignment.jsdoc" - }, - "3": { - "name": "source.embedded.js" - }, - "4": { - "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" - }, - "5": { - "name": "invalid.illegal.syntax.jsdoc" - } - } - } - ] - }, - { - "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - } - ] - }, - { - "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "contentName": "variable.other.jsdoc", - "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - }, - "4": { - "name": "punctuation.definition.string.begin.jsdoc" - } - }, - "end": "(\\3)|(?=$|\\*/)", - "endCaptures": { - "0": { - "name": "variable.other.jsdoc" - }, - "1": { - "name": "punctuation.definition.string.end.jsdoc" - } - } - }, - { - "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "name": "storage.type.class.jsdoc", - "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", - "captures": { - "1": { - "name": "punctuation.definition.block.tag.jsdoc" - } - } - }, - { - "include": "#inline-tags" - }, - { - "match": "((@)(?:[_$[:alpha:]][_$[:alnum:]]*))(?=\\s+)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - } - } - ] - }, - "brackets": { - "patterns": [ - { - "begin": "{", - "end": "}|(?=\\*/)", - "patterns": [ - { - "include": "#brackets" - } - ] - }, - { - "begin": "\\[", - "end": "\\]|(?=\\*/)", - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "inline-tags": { - "patterns": [ - { - "name": "constant.other.description.jsdoc", - "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", - "captures": { - "1": { - "name": "punctuation.definition.bracket.square.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.square.end.jsdoc" - } - } - }, - { - "name": "entity.name.type.instance.jsdoc", - "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", - "beginCaptures": { - "1": { - "name": "punctuation.definition.bracket.curly.begin.jsdoc" - }, - "2": { - "name": "storage.type.class.jsdoc" - }, - "3": { - "name": "punctuation.definition.inline.tag.jsdoc" - } - }, - "end": "}|(?=\\*/)", - "endCaptures": { - "0": { - "name": "punctuation.definition.bracket.curly.end.jsdoc" - } - }, - "patterns": [ - { - "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", - "captures": { - "1": { - "name": "variable.other.link.underline.jsdoc" - }, - "2": { - "name": "punctuation.separator.pipe.jsdoc" - } - } - }, - { - "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", - "captures": { - "1": { - "name": "variable.other.description.jsdoc" - }, - "2": { - "name": "punctuation.separator.pipe.jsdoc" - } - } - } - ] - } - ] - }, - "jsdoctype": { - "patterns": [ - { - "contentName": "entity.name.type.instance.jsdoc", - "begin": "\\G({)", - "beginCaptures": { - "0": { - "name": "entity.name.type.instance.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.curly.begin.jsdoc" - } - }, - "end": "((}))\\s*|(?=\\*/)", - "endCaptures": { - "1": { - "name": "entity.name.type.instance.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.curly.end.jsdoc" - } - }, - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "jsx": { - "patterns": [ - { - "include": "#jsx-tag-without-attributes-in-expression" - }, - { - "include": "#jsx-tag-in-expression" - } - ] - }, - "jsx-tag-without-attributes-in-expression": { - "begin": "(?:*]|&&|\\|\\||\\?|\\*\\/|^await|[^\\._$[:alnum:]]await|^return|[^\\._$[:alnum:]]return|^default|[^\\._$[:alnum:]]default|^yield|[^\\._$[:alnum:]]yield|^)\\s*(?=(<)\\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?))", - "end": "(?!(<)\\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?))", - "patterns": [ - { - "include": "#jsx-tag-without-attributes" - } - ] - }, - "jsx-tag-without-attributes": { - "name": "meta.tag.without-attributes.js", - "begin": "(<)\\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?)", - "end": "()", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.js" - }, - "2": { - "name": "entity.name.tag.namespace.js" - }, - "3": { - "name": "punctuation.separator.namespace.js" - }, - "4": { - "name": "entity.name.tag.js" - }, - "5": { - "name": "support.class.component.js" - }, - "6": { - "name": "punctuation.definition.tag.end.js" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.js" - }, - "2": { - "name": "entity.name.tag.namespace.js" - }, - "3": { - "name": "punctuation.separator.namespace.js" - }, - "4": { - "name": "entity.name.tag.js" - }, - "5": { - "name": "support.class.component.js" - }, - "6": { - "name": "punctuation.definition.tag.end.js" - } - }, - "contentName": "meta.jsx.children.js", - "patterns": [ - { - "include": "#jsx-children" - } - ] - }, - "jsx-tag-in-expression": { - "begin": "(?x)\n (?:*]|&&|\\|\\||\\?|\\*\\/|^await|[^\\._$[:alnum:]]await|^return|[^\\._$[:alnum:]]return|^default|[^\\._$[:alnum:]]default|^yield|[^\\._$[:alnum:]]yield|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?))", - "end": "(?!(<)\\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?))", - "patterns": [ - { - "include": "#jsx-tag" - } - ] - }, - "jsx-tag": { - "name": "meta.tag.js", - "begin": "(?=(<)\\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?))", - "end": "(/>)|(?:())", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.end.js" - }, - "2": { - "name": "punctuation.definition.tag.begin.js" - }, - "3": { - "name": "entity.name.tag.namespace.js" - }, - "4": { - "name": "punctuation.separator.namespace.js" - }, - "5": { - "name": "entity.name.tag.js" - }, - "6": { - "name": "support.class.component.js" - }, - "7": { - "name": "punctuation.definition.tag.end.js" - } - }, - "patterns": [ - { - "begin": "(<)\\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.js" - }, - "2": { - "name": "entity.name.tag.namespace.js" - }, - "3": { - "name": "punctuation.separator.namespace.js" - }, - "4": { - "name": "entity.name.tag.js" - }, - "5": { - "name": "support.class.component.js" - } - }, - "end": "(?=[/]?>)", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#type-arguments" - }, - { - "include": "#jsx-tag-attributes" - } - ] - }, - { - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.js" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#jsx-tag-attribute-name" - }, - { - "include": "#jsx-tag-attribute-assignment" - }, - { - "include": "#jsx-string-double-quoted" - }, - { - "include": "#jsx-string-single-quoted" - }, - { - "include": "#jsx-evaluated-code" - }, - { - "include": "#jsx-tag-attributes-illegal" - } - ] - }, - "jsx-tag-attribute-name": { - "match": "(?x)\n \\s*\n (?:([_$[:alpha:]][-_$[:alnum:].]*)(:))?\n ([_$[:alpha:]][-_$[:alnum:]]*)\n (?=\\s|=|/?>|/\\*|//)", - "captures": { - "1": { - "name": "entity.other.attribute-name.namespace.js" - }, - "2": { - "name": "punctuation.separator.namespace.js" - }, - "3": { - "name": "entity.other.attribute-name.js" - } - } - }, - "jsx-tag-attribute-assignment": { - "name": "keyword.operator.assignment.js", - "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" - }, - "jsx-string-double-quoted": { - "name": "string.quoted.double.js", - "begin": "\"", - "end": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.js" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.js" - } - }, - "patterns": [ - { - "include": "#jsx-entities" - } - ] - }, - "jsx-string-single-quoted": { - "name": "string.quoted.single.js", - "begin": "'", - "end": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.js" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.js" - } - }, - "patterns": [ - { - "include": "#jsx-entities" - } - ] - }, - "jsx-tag-attributes-illegal": { - "name": "invalid.illegal.attribute.js", - "match": "\\S+" - } - } -} diff --git a/src/http/get-docs-000lang-catchall/shiki/languages/json.tmLanguage.json b/src/http/get-docs-000lang-catchall/shiki/languages/json.tmLanguage.json deleted file mode 100644 index f11db55c..00000000 --- a/src/http/get-docs-000lang-catchall/shiki/languages/json.tmLanguage.json +++ /dev/null @@ -1,213 +0,0 @@ -{ - "information_for_contributors": [ - "This file has been converted from https://github.com/microsoft/vscode-JSON.tmLanguage/blob/master/JSON.tmLanguage", - "If you want to provide a fix or improvement, please create a pull request against the original repository.", - "Once accepted there, we are happy to receive an update request." - ], - "version": "https://github.com/microsoft/vscode-JSON.tmLanguage/commit/9bd83f1c252b375e957203f21793316203f61f70", - "name": "json", - "scopeName": "source.json", - "patterns": [ - { - "include": "#value" - } - ], - "repository": { - "array": { - "begin": "\\[", - "beginCaptures": { - "0": { - "name": "punctuation.definition.array.begin.json" - } - }, - "end": "\\]", - "endCaptures": { - "0": { - "name": "punctuation.definition.array.end.json" - } - }, - "name": "meta.structure.array.json", - "patterns": [ - { - "include": "#value" - }, - { - "match": ",", - "name": "punctuation.separator.array.json" - }, - { - "match": "[^\\s\\]]", - "name": "invalid.illegal.expected-array-separator.json" - } - ] - }, - "comments": { - "patterns": [ - { - "begin": "/\\*\\*(?!/)", - "captures": { - "0": { - "name": "punctuation.definition.comment.json" - } - }, - "end": "\\*/", - "name": "comment.block.documentation.json" - }, - { - "begin": "/\\*", - "captures": { - "0": { - "name": "punctuation.definition.comment.json" - } - }, - "end": "\\*/", - "name": "comment.block.json" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.comment.json" - } - }, - "match": "(//).*$\\n?", - "name": "comment.line.double-slash.js" - } - ] - }, - "constant": { - "match": "\\b(?:true|false|null)\\b", - "name": "constant.language.json" - }, - "number": { - "match": "(?x) # turn on extended mode\n -? # an optional minus\n (?:\n 0 # a zero\n | # ...or...\n [1-9] # a 1-9 character\n \\d* # followed by zero or more digits\n )\n (?:\n (?:\n \\. # a period\n \\d+ # followed by one or more digits\n )?\n (?:\n [eE] # an e character\n [+-]? # followed by an option +/-\n \\d+ # followed by one or more digits\n )? # make exponent optional\n )? # make decimal portion optional", - "name": "constant.numeric.json" - }, - "object": { - "begin": "\\{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.dictionary.begin.json" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.dictionary.end.json" - } - }, - "name": "meta.structure.dictionary.json", - "patterns": [ - { - "comment": "the JSON object key", - "include": "#objectkey" - }, - { - "include": "#comments" - }, - { - "begin": ":", - "beginCaptures": { - "0": { - "name": "punctuation.separator.dictionary.key-value.json" - } - }, - "end": "(,)|(?=\\})", - "endCaptures": { - "1": { - "name": "punctuation.separator.dictionary.pair.json" - } - }, - "name": "meta.structure.dictionary.value.json", - "patterns": [ - { - "comment": "the JSON object value", - "include": "#value" - }, - { - "match": "[^\\s,]", - "name": "invalid.illegal.expected-dictionary-separator.json" - } - ] - }, - { - "match": "[^\\s\\}]", - "name": "invalid.illegal.expected-dictionary-separator.json" - } - ] - }, - "string": { - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.json" - } - }, - "end": "\"", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.json" - } - }, - "name": "string.quoted.double.json", - "patterns": [ - { - "include": "#stringcontent" - } - ] - }, - "objectkey": { - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.support.type.property-name.begin.json" - } - }, - "end": "\"", - "endCaptures": { - "0": { - "name": "punctuation.support.type.property-name.end.json" - } - }, - "name": "string.json support.type.property-name.json", - "patterns": [ - { - "include": "#stringcontent" - } - ] - }, - "stringcontent": { - "patterns": [ - { - "match": "(?x) # turn on extended mode\n \\\\ # a literal backslash\n (?: # ...followed by...\n [\"\\\\/bfnrt] # one of these characters\n | # ...or...\n u # a u\n [0-9a-fA-F]{4}) # and four hex digits", - "name": "constant.character.escape.json" - }, - { - "match": "\\\\.", - "name": "invalid.illegal.unrecognized-string-escape.json" - } - ] - }, - "value": { - "patterns": [ - { - "include": "#constant" - }, - { - "include": "#number" - }, - { - "include": "#string" - }, - { - "include": "#array" - }, - { - "include": "#object" - }, - { - "include": "#comments" - } - ] - } - } -} diff --git a/src/http/get-docs-000lang-catchall/shiki/languages/powershell.tmLanguage.json b/src/http/get-docs-000lang-catchall/shiki/languages/powershell.tmLanguage.json deleted file mode 100644 index f9c9d51d..00000000 --- a/src/http/get-docs-000lang-catchall/shiki/languages/powershell.tmLanguage.json +++ /dev/null @@ -1,1029 +0,0 @@ -{ - "information_for_contributors": [ - "This file has been converted from https://github.com/PowerShell/EditorSyntax/blob/master/PowerShellSyntax.tmLanguage", - "If you want to provide a fix or improvement, please create a pull request against the original repository.", - "Once accepted there, we are happy to receive an update request." - ], - "version": "https://github.com/PowerShell/EditorSyntax/commit/c150c15cca30cafd2159e3f53514f93ccf4c5649", - "name": "powershell", - "scopeName": "source.powershell", - "patterns": [ - { - "begin": "<#", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.block.begin.powershell" - } - }, - "end": "#>", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.block.end.powershell" - } - }, - "name": "comment.block.powershell", - "patterns": [ - { - "include": "#commentEmbeddedDocs" - } - ] - }, - { - "match": "[2-6]>&1|>>|>|<<|<|>|>\\||[1-6]>|[1-6]>>", - "name": "keyword.operator.redirection.powershell" - }, - { - "include": "#commands" - }, - { - "include": "#commentLine" - }, - { - "include": "#variable" - }, - { - "include": "#subexpression" - }, - { - "include": "#function" - }, - { - "include": "#attribute" - }, - { - "include": "#UsingDirective" - }, - { - "include": "#type" - }, - { - "include": "#hashtable" - }, - { - "include": "#doubleQuotedString" - }, - { - "include": "#scriptblock" - }, - { - "comment": "Needed to parse stuff correctly in 'argument mode'. (See about_parsing.)", - "include": "#doubleQuotedStringEscapes" - }, - { - "begin": "['\\x{2018}-\\x{201B}]", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.powershell" - } - }, - "end": "['\\x{2018}-\\x{201B}]", - "applyEndPatternLast": true, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.powershell" - } - }, - "name": "string.quoted.single.powershell", - "patterns": [ - { - "match": "['\\x{2018}-\\x{201B}]{2}", - "name": "constant.character.escape.powershell" - } - ] - }, - { - "begin": "(@[\"\\x{201C}-\\x{201E}])\\s*$", - "beginCaptures": { - "1": { - "name": "punctuation.definition.string.begin.powershell" - } - }, - "end": "^[\"\\x{201C}-\\x{201E}]@", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.powershell" - } - }, - "name": "string.quoted.double.heredoc.powershell", - "patterns": [ - { - "include": "#variableNoProperty" - }, - { - "include": "#doubleQuotedStringEscapes" - }, - { - "include": "#interpolation" - } - ] - }, - { - "begin": "(@['\\x{2018}-\\x{201B}])\\s*$", - "beginCaptures": { - "1": { - "name": "punctuation.definition.string.begin.powershell" - } - }, - "end": "^['\\x{2018}-\\x{201B}]@", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.powershell" - } - }, - "name": "string.quoted.single.heredoc.powershell" - }, - { - "include": "#numericConstant" - }, - { - "begin": "(@)(\\()", - "beginCaptures": { - "1": { - "name": "keyword.other.array.begin.powershell" - }, - "2": { - "name": "punctuation.section.group.begin.powershell" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.group.end.powershell" - } - }, - "name": "meta.group.array-expression.powershell", - "patterns": [ - { - "include": "$self" - } - ] - }, - { - "begin": "((\\$))(\\()", - "beginCaptures": { - "1": { - "name": "keyword.other.substatement.powershell" - }, - "2": { - "name": "punctuation.definition.subexpression.powershell" - }, - "3": { - "name": "punctuation.section.group.begin.powershell" - } - }, - "comment": "TODO: move to repo; make recursive.", - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.group.end.powershell" - } - }, - "name": "meta.group.complex.subexpression.powershell", - "patterns": [ - { - "include": "$self" - } - ] - }, - { - "match": "(\\b(([A-Za-z0-9\\-_\\.]+)\\.(?i:exe|com|cmd|bat))\\b)", - "name": "support.function.powershell" - }, - { - "match": "(?{1,5})}", - "name": "constant.character.escape.powershell" - }, - { - "match": "`u(?:\\{[0-9a-fA-F]{,6}.)?", - "name": "invalid.character.escape.powershell" - } - ] - }, - "function": { - "begin": "^(?:\\s*+)(?i)(function|filter|configuration|workflow)\\s+(?:(global|local|script|private):)?((?:\\p{L}|\\d|_|-|\\.)+)", - "beginCaptures": { - "0": { - "name": "meta.function.powershell" - }, - "1": { - "name": "storage.type.powershell" - }, - "2": { - "name": "storage.modifier.scope.powershell" - }, - "3": { - "name": "entity.name.function.powershell" - } - }, - "end": "(?=\\{|\\()", - "patterns": [ - { - "include": "#commentLine" - } - ] - }, - "subexpression": { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.section.group.begin.powershell" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.group.end.powershell" - } - }, - "name": "meta.group.simple.subexpression.powershell", - "patterns": [ - { - "include": "$self" - } - ] - }, - "interpolation": { - "begin": "(((\\$)))((\\())", - "beginCaptures": { - "1": { - "name": "keyword.other.substatement.powershell" - }, - "2": { - "name": "punctuation.definition.substatement.powershell" - }, - "3": { - "name": "punctuation.section.embedded.substatement.begin.powershell" - }, - "4": { - "name": "punctuation.section.group.begin.powershell" - }, - "5": { - "name": "punctuation.section.embedded.substatement.begin.powershell" - } - }, - "contentName": "interpolated.complex.source.powershell", - "end": "(\\))", - "endCaptures": { - "0": { - "name": "punctuation.section.group.end.powershell" - }, - "1": { - "name": "punctuation.section.embedded.substatement.end.powershell" - } - }, - "name": "meta.embedded.substatement.powershell", - "patterns": [ - { - "include": "$self" - } - ] - }, - "numericConstant": { - "patterns": [ - { - "captures": { - "1": { - "name": "constant.numeric.hex.powershell" - }, - "2": { - "name": "keyword.other.powershell" - } - }, - "match": "(?))" - }, - { - "name": "comment.typehint.variable.notation.python", - "match": "([[:alpha:]_]\\w*)" - } - ] - }, - { - "include": "#comments-base" - } - ] - }, - "docstring-statement": { - "begin": "^(?=\\s*[rR]?(\\'\\'\\'|\\\"\\\"\\\"|\\'|\\\"))", - "comment": "the string either terminates correctly or by the beginning of a new line (this is for single line docstrings that aren't terminated) AND it's not followed by another docstring", - "end": "((?<=\\1)|^)(?!\\s*[rR]?(\\'\\'\\'|\\\"\\\"\\\"|\\'|\\\"))", - "patterns": [ - { - "include": "#docstring" - } - ] - }, - "docstring": { - "patterns": [ - { - "name": "string.quoted.docstring.multi.python", - "begin": "(\\'\\'\\'|\\\"\\\"\\\")", - "end": "(\\1)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.string.begin.python" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.python" - } - }, - "patterns": [ - { - "include": "#docstring-prompt" - }, - { - "include": "#codetags" - }, - { - "include": "#docstring-guts-unicode" - } - ] - }, - { - "name": "string.quoted.docstring.raw.multi.python", - "begin": "([rR])(\\'\\'\\'|\\\"\\\"\\\")", - "end": "(\\2)", - "beginCaptures": { - "1": { - "name": "storage.type.string.python" - }, - "2": { - "name": "punctuation.definition.string.begin.python" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.python" - } - }, - "patterns": [ - { - "include": "#string-consume-escape" - }, - { - "include": "#docstring-prompt" - }, - { - "include": "#codetags" - } - ] - }, - { - "name": "string.quoted.docstring.single.python", - "begin": "(\\'|\\\")", - "end": "(\\1)|(\\n)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.string.begin.python" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.python" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#codetags" - }, - { - "include": "#docstring-guts-unicode" - } - ] - }, - { - "name": "string.quoted.docstring.raw.single.python", - "begin": "([rR])(\\'|\\\")", - "end": "(\\2)|(\\n)", - "beginCaptures": { - "1": { - "name": "storage.type.string.python" - }, - "2": { - "name": "punctuation.definition.string.begin.python" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.python" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#string-consume-escape" - }, - { - "include": "#codetags" - } - ] - } - ] - }, - "docstring-guts-unicode": { - "patterns": [ - { - "include": "#escape-sequence-unicode" - }, - { - "include": "#escape-sequence" - }, - { - "include": "#string-line-continuation" - } - ] - }, - "docstring-prompt": { - "match": "(?x)\n (?:\n (?:^|\\G) \\s* (?# '\\G' is necessary for ST)\n ((?:>>>|\\.\\.\\.) \\s) (?=\\s*\\S)\n )\n", - "captures": { - "1": { - "name": "keyword.control.flow.python" - } - } - }, - "statement-keyword": { - "patterns": [ - { - "name": "storage.type.function.python", - "match": "\\b((async\\s+)?\\s*def)\\b" - }, - { - "name": "keyword.control.flow.python", - "comment": "if `as` is eventually followed by `:` or line continuation\nit's probably control flow like:\n with foo as bar, \\\n Foo as Bar:\n try:\n do_stuff()\n except Exception as e:\n pass\n", - "match": "\\b(?>= | //= | \\*\\*=\n | \\+= | -= | /= | @=\n | \\*= | %= | ~= | \\^= | &= | \\|=\n | =(?!=)\n" - }, - "operator": { - "match": "(?x)\n \\b(?> | & | \\| | \\^ | ~) (?# 3)\n\n | (\\*\\* | \\* | \\+ | - | % | // | / | @) (?# 4)\n\n | (!= | == | >= | <= | < | >) (?# 5)\n", - "captures": { - "1": { - "name": "keyword.operator.logical.python" - }, - "2": { - "name": "keyword.control.flow.python" - }, - "3": { - "name": "keyword.operator.bitwise.python" - }, - "4": { - "name": "keyword.operator.arithmetic.python" - }, - "5": { - "name": "keyword.operator.comparison.python" - } - } - }, - "punctuation": { - "patterns": [ - { - "name": "punctuation.separator.colon.python", - "match": ":" - }, - { - "name": "punctuation.separator.element.python", - "match": "," - } - ] - }, - "literal": { - "patterns": [ - { - "name": "constant.language.python", - "match": "\\b(True|False|None|NotImplemented|Ellipsis)\\b" - }, - { - "include": "#number" - } - ] - }, - "number": { - "name": "constant.numeric.python", - "patterns": [ - { - "include": "#number-float" - }, - { - "include": "#number-dec" - }, - { - "include": "#number-hex" - }, - { - "include": "#number-oct" - }, - { - "include": "#number-bin" - }, - { - "include": "#number-long" - }, - { - "name": "invalid.illegal.name.python", - "match": "\\b[0-9]+\\w+" - } - ] - }, - "number-float": { - "name": "constant.numeric.float.python", - "match": "(?x)\n (?=^]? [-+ ]? \\#?\n \\d* ,? (\\.\\d+)? [bcdeEfFgGnosxX%]? )?\n })\n )\n", - "captures": { - "1": { - "name": "constant.character.format.placeholder.other.python" - }, - "3": { - "name": "storage.type.format.python" - }, - "4": { - "name": "storage.type.format.python" - } - } - }, - { - "name": "meta.format.brace.python", - "match": "(?x)\n (\n {\n \\w* (\\.[[:alpha:]_]\\w* | \\[[^\\]'\"]+\\])*\n (![rsa])?\n (:)\n [^'\"{}\\n]* (?:\n \\{ [^'\"}\\n]*? \\} [^'\"{}\\n]*\n )*\n }\n )\n", - "captures": { - "1": { - "name": "constant.character.format.placeholder.other.python" - }, - "3": { - "name": "storage.type.format.python" - }, - "4": { - "name": "storage.type.format.python" - } - } - } - ] - }, - "fstring-formatting": { - "patterns": [ - { - "include": "#fstring-formatting-braces" - }, - { - "include": "#fstring-formatting-singe-brace" - } - ] - }, - "fstring-formatting-singe-brace": { - "name": "invalid.illegal.brace.python", - "match": "(}(?!}))" - }, - "import": { - "comment": "Import statements used to correctly mark `from`, `import`, and `as`\n", - "patterns": [ - { - "begin": "\\b(?)", - "end": "(?=:)", - "beginCaptures": { - "1": { - "name": "punctuation.separator.annotation.result.python" - } - }, - "patterns": [ - { - "include": "#expression" - } - ] - }, - "item-access": { - "patterns": [ - { - "name": "meta.item-access.python", - "begin": "(?x)\n \\b(?=\n [[:alpha:]_]\\w* \\s* \\[\n )\n", - "end": "(\\])", - "endCaptures": { - "1": { - "name": "punctuation.definition.arguments.end.python" - } - }, - "patterns": [ - { - "include": "#item-name" - }, - { - "include": "#item-index" - }, - { - "include": "#expression" - } - ] - } - ] - }, - "item-name": { - "patterns": [ - { - "include": "#special-variables" - }, - { - "include": "#builtin-functions" - }, - { - "include": "#special-names" - }, - { - "name": "meta.indexed-name.python", - "match": "(?x)\n \\b ([[:alpha:]_]\\w*) \\b\n" - } - ] - }, - "item-index": { - "begin": "(\\[)", - "end": "(?=\\])", - "beginCaptures": { - "1": { - "name": "punctuation.definition.arguments.begin.python" - } - }, - "contentName": "meta.item-access.arguments.python", - "patterns": [ - { - "name": "punctuation.separator.slice.python", - "match": ":" - }, - { - "include": "#expression" - } - ] - }, - "decorator": { - "name": "meta.function.decorator.python", - "begin": "(?x)\n ^\\s*\n ((@)) \\s* (?=[[:alpha:]_]\\w*)\n", - "end": "(?x)\n ( \\) )\n # trailing whitespace and comments are legal\n (?: (.*?) (?=\\s*(?:\\#|$)) )\n | (?=\\n|\\#)\n", - "beginCaptures": { - "1": { - "name": "entity.name.function.decorator.python" - }, - "2": { - "name": "punctuation.definition.decorator.python" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.arguments.end.python" - }, - "2": { - "name": "invalid.illegal.decorator.python" - } - }, - "patterns": [ - { - "include": "#decorator-name" - }, - { - "include": "#function-arguments" - } - ] - }, - "decorator-name": { - "patterns": [ - { - "include": "#builtin-callables" - }, - { - "include": "#illegal-object-name" - }, - { - "name": "entity.name.function.decorator.python", - "match": "(?x)\n ([[:alpha:]_]\\w*) | (\\.)\n", - "captures": { - "2": { - "name": "punctuation.separator.period.python" - } - } - }, - { - "include": "#line-continuation" - }, - { - "name": "invalid.illegal.decorator.python", - "match": "(?x)\n \\s* ([^([:alpha:]\\s_\\.#\\\\] .*?) (?=\\#|$)\n", - "captures": { - "1": { - "name": "invalid.illegal.decorator.python" - } - } - } - ] - }, - "call-wrapper-inheritance": { - "comment": "same as a function call, but in inheritance context", - "name": "meta.function-call.python", - "begin": "(?x)\n \\b(?=\n ([[:alpha:]_]\\w*) \\s* (\\()\n )\n", - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.definition.arguments.end.python" - } - }, - "patterns": [ - { - "include": "#inheritance-name" - }, - { - "include": "#function-arguments" - } - ] - }, - "inheritance-name": { - "patterns": [ - { - "include": "#lambda-incomplete" - }, - { - "include": "#builtin-possible-callables" - }, - { - "include": "#inheritance-identifier" - } - ] - }, - "function-call": { - "name": "meta.function-call.python", - "comment": "Regular function call of the type \"name(args)\"", - "begin": "(?x)\n \\b(?=\n ([[:alpha:]_]\\w*) \\s* (\\()\n )\n", - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.definition.arguments.end.python" - } - }, - "patterns": [ - { - "include": "#special-variables" - }, - { - "include": "#function-name" - }, - { - "include": "#function-arguments" - } - ] - }, - "function-name": { - "patterns": [ - { - "include": "#builtin-possible-callables" - }, - { - "comment": "Some color schemas support meta.function-call.generic scope", - "name": "meta.function-call.generic.python", - "match": "(?x)\n \\b ([[:alpha:]_]\\w*) \\b\n" - } - ] - }, - "function-arguments": { - "begin": "(\\()", - "end": "(?=\\))(?!\\)\\s*\\()", - "beginCaptures": { - "1": { - "name": "punctuation.definition.arguments.begin.python" - } - }, - "contentName": "meta.function-call.arguments.python", - "patterns": [ - { - "name": "punctuation.separator.arguments.python", - "match": "(,)" - }, - { - "match": "(?x)\n (?:(?<=[,(])|^) \\s* (\\*{1,2})\n", - "captures": { - "1": { - "name": "keyword.operator.unpacking.arguments.python" - } - } - }, - { - "include": "#lambda-incomplete" - }, - { - "include": "#illegal-names" - }, - { - "match": "\\b([[:alpha:]_]\\w*)\\s*(=)(?!=)", - "captures": { - "1": { - "name": "variable.parameter.function-call.python" - }, - "2": { - "name": "keyword.operator.assignment.python" - } - } - }, - { - "name": "keyword.operator.assignment.python", - "match": "=(?!=)" - }, - { - "include": "#expression" - }, - { - "match": "\\s*(\\))\\s*(\\()", - "captures": { - "1": { - "name": "punctuation.definition.arguments.end.python" - }, - "2": { - "name": "punctuation.definition.arguments.begin.python" - } - } - } - ] - }, - "builtin-callables": { - "patterns": [ - { - "include": "#illegal-names" - }, - { - "include": "#illegal-object-name" - }, - { - "include": "#builtin-exceptions" - }, - { - "include": "#builtin-functions" - }, - { - "include": "#builtin-types" - } - ] - }, - "builtin-possible-callables": { - "patterns": [ - { - "include": "#builtin-callables" - }, - { - "include": "#magic-names" - } - ] - }, - "builtin-exceptions": { - "name": "support.type.exception.python", - "match": "(?x) (?" - }, - "regexp-base-expression": { - "patterns": [ - { - "include": "#regexp-quantifier" - }, - { - "include": "#regexp-base-common" - } - ] - }, - "fregexp-base-expression": { - "patterns": [ - { - "include": "#fregexp-quantifier" - }, - { - "include": "#fstring-formatting-braces" - }, - { - "match": "\\{.*?\\}" - }, - { - "include": "#regexp-base-common" - } - ] - }, - "fstring-formatting-braces": { - "patterns": [ - { - "comment": "empty braces are illegal", - "match": "({)(\\s*?)(})", - "captures": { - "1": { - "name": "constant.character.format.placeholder.other.python" - }, - "2": { - "name": "invalid.illegal.brace.python" - }, - "3": { - "name": "constant.character.format.placeholder.other.python" - } - } - }, - { - "name": "constant.character.escape.python", - "match": "({{|}})" - } - ] - }, - "regexp-base-common": { - "patterns": [ - { - "name": "support.other.match.any.regexp", - "match": "\\." - }, - { - "name": "support.other.match.begin.regexp", - "match": "\\^" - }, - { - "name": "support.other.match.end.regexp", - "match": "\\$" - }, - { - "name": "keyword.operator.quantifier.regexp", - "match": "[+*?]\\??" - }, - { - "name": "keyword.operator.disjunction.regexp", - "match": "\\|" - }, - { - "include": "#regexp-escape-sequence" - } - ] - }, - "regexp-quantifier": { - "name": "keyword.operator.quantifier.regexp", - "match": "(?x)\n \\{(\n \\d+ | \\d+,(\\d+)? | ,\\d+\n )\\}\n" - }, - "fregexp-quantifier": { - "name": "keyword.operator.quantifier.regexp", - "match": "(?x)\n \\{\\{(\n \\d+ | \\d+,(\\d+)? | ,\\d+\n )\\}\\}\n" - }, - "regexp-backreference-number": { - "name": "meta.backreference.regexp", - "match": "(\\\\[1-9]\\d?)", - "captures": { - "1": { - "name": "entity.name.tag.backreference.regexp" - } - } - }, - "regexp-backreference": { - "name": "meta.backreference.named.regexp", - "match": "(?x)\n (\\() (\\?P= \\w+(?:\\s+[[:alnum:]]+)?) (\\))\n", - "captures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.backreference.named.begin.regexp" - }, - "2": { - "name": "entity.name.tag.named.backreference.regexp" - }, - "3": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.backreference.named.end.regexp" - } - } - }, - "regexp-flags": { - "name": "storage.modifier.flag.regexp", - "match": "\\(\\?[aiLmsux]+\\)" - }, - "regexp-escape-special": { - "name": "support.other.escape.special.regexp", - "match": "\\\\([AbBdDsSwWZ])" - }, - "regexp-escape-character": { - "name": "constant.character.escape.regexp", - "match": "(?x)\n \\\\ (\n x[0-9A-Fa-f]{2}\n | 0[0-7]{1,2}\n | [0-7]{3}\n )\n" - }, - "regexp-escape-unicode": { - "name": "constant.character.unicode.regexp", - "match": "(?x)\n \\\\ (\n u[0-9A-Fa-f]{4}\n | U[0-9A-Fa-f]{8}\n )\n" - }, - "regexp-escape-catchall": { - "name": "constant.character.escape.regexp", - "match": "\\\\(.|\\n)" - }, - "regexp-escape-sequence": { - "patterns": [ - { - "include": "#regexp-escape-special" - }, - { - "include": "#regexp-escape-character" - }, - { - "include": "#regexp-escape-unicode" - }, - { - "include": "#regexp-backreference-number" - }, - { - "include": "#regexp-escape-catchall" - } - ] - }, - "regexp-charecter-set-escapes": { - "patterns": [ - { - "name": "constant.character.escape.regexp", - "match": "\\\\[abfnrtv\\\\]" - }, - { - "include": "#regexp-escape-special" - }, - { - "name": "constant.character.escape.regexp", - "match": "\\\\([0-7]{1,3})" - }, - { - "include": "#regexp-escape-character" - }, - { - "include": "#regexp-escape-unicode" - }, - { - "include": "#regexp-escape-catchall" - } - ] - }, - "codetags": { - "match": "(?:\\b(NOTE|XXX|HACK|FIXME|BUG|TODO)\\b)", - "captures": { - "1": { - "name": "keyword.codetag.notation.python" - } - } - }, - "comments-base": { - "name": "comment.line.number-sign.python", - "begin": "(\\#)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.python" - } - }, - "end": "($)", - "patterns": [ - { - "include": "#codetags" - } - ] - }, - "comments-string-single-three": { - "name": "comment.line.number-sign.python", - "begin": "(\\#)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.python" - } - }, - "end": "($|(?='''))", - "patterns": [ - { - "include": "#codetags" - } - ] - }, - "comments-string-double-three": { - "name": "comment.line.number-sign.python", - "begin": "(\\#)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.python" - } - }, - "end": "($|(?=\"\"\"))", - "patterns": [ - { - "include": "#codetags" - } - ] - }, - "single-one-regexp-expression": { - "patterns": [ - { - "include": "#regexp-base-expression" - }, - { - "include": "#single-one-regexp-character-set" - }, - { - "include": "#single-one-regexp-comments" - }, - { - "include": "#regexp-flags" - }, - { - "include": "#single-one-regexp-named-group" - }, - { - "include": "#regexp-backreference" - }, - { - "include": "#single-one-regexp-lookahead" - }, - { - "include": "#single-one-regexp-lookahead-negative" - }, - { - "include": "#single-one-regexp-lookbehind" - }, - { - "include": "#single-one-regexp-lookbehind-negative" - }, - { - "include": "#single-one-regexp-conditional" - }, - { - "include": "#single-one-regexp-parentheses-non-capturing" - }, - { - "include": "#single-one-regexp-parentheses" - } - ] - }, - "single-one-regexp-character-set": { - "patterns": [ - { - "match": "(?x)\n \\[ \\^? \\] (?! .*?\\])\n" - }, - { - "name": "meta.character.set.regexp", - "begin": "(\\[)(\\^)?(\\])?", - "end": "(\\]|(?=\\'))|((?=(?)\n", - "end": "(\\)|(?=\\'))|((?=(?)\n", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp" - }, - "2": { - "name": "entity.name.tag.named.group.regexp" - } - }, - "endCaptures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#single-three-regexp-expression" - }, - { - "include": "#comments-string-single-three" - } - ] - }, - "single-three-regexp-comments": { - "name": "comment.regexp", - "begin": "\\(\\?#", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "0": { - "name": "punctuation.comment.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.comment.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#codetags" - } - ] - }, - "single-three-regexp-lookahead": { - "begin": "(\\()\\?=", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookahead.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookahead.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#single-three-regexp-expression" - }, - { - "include": "#comments-string-single-three" - } - ] - }, - "single-three-regexp-lookahead-negative": { - "begin": "(\\()\\?!", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookahead.negative.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookahead.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#single-three-regexp-expression" - }, - { - "include": "#comments-string-single-three" - } - ] - }, - "single-three-regexp-lookbehind": { - "begin": "(\\()\\?<=", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookbehind.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookbehind.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#single-three-regexp-expression" - }, - { - "include": "#comments-string-single-three" - } - ] - }, - "single-three-regexp-lookbehind-negative": { - "begin": "(\\()\\?)\n", - "end": "(\\)|(?=\"))|((?=(?)\n", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp" - }, - "2": { - "name": "entity.name.tag.named.group.regexp" - } - }, - "endCaptures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#double-three-regexp-expression" - }, - { - "include": "#comments-string-double-three" - } - ] - }, - "double-three-regexp-comments": { - "name": "comment.regexp", - "begin": "\\(\\?#", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "0": { - "name": "punctuation.comment.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.comment.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#codetags" - } - ] - }, - "double-three-regexp-lookahead": { - "begin": "(\\()\\?=", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookahead.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookahead.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#double-three-regexp-expression" - }, - { - "include": "#comments-string-double-three" - } - ] - }, - "double-three-regexp-lookahead-negative": { - "begin": "(\\()\\?!", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookahead.negative.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookahead.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#double-three-regexp-expression" - }, - { - "include": "#comments-string-double-three" - } - ] - }, - "double-three-regexp-lookbehind": { - "begin": "(\\()\\?<=", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookbehind.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookbehind.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#double-three-regexp-expression" - }, - { - "include": "#comments-string-double-three" - } - ] - }, - "double-three-regexp-lookbehind-negative": { - "begin": "(\\()\\?)\n", - "end": "(\\)|(?=\\'))|((?=(?)\n", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp" - }, - "2": { - "name": "entity.name.tag.named.group.regexp" - } - }, - "endCaptures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#single-three-fregexp-expression" - }, - { - "include": "#comments-string-single-three" - } - ] - }, - "single-three-fregexp-lookahead": { - "begin": "(\\()\\?=", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookahead.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookahead.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#single-three-fregexp-expression" - }, - { - "include": "#comments-string-single-three" - } - ] - }, - "single-three-fregexp-lookahead-negative": { - "begin": "(\\()\\?!", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookahead.negative.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookahead.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#single-three-fregexp-expression" - }, - { - "include": "#comments-string-single-three" - } - ] - }, - "single-three-fregexp-lookbehind": { - "begin": "(\\()\\?<=", - "end": "(\\)|(?=\\'\\'\\'))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookbehind.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookbehind.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#single-three-fregexp-expression" - }, - { - "include": "#comments-string-single-three" - } - ] - }, - "single-three-fregexp-lookbehind-negative": { - "begin": "(\\()\\?)\n", - "end": "(\\)|(?=\"))|((?=(?)\n", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp" - }, - "2": { - "name": "entity.name.tag.named.group.regexp" - } - }, - "endCaptures": { - "1": { - "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#double-three-fregexp-expression" - }, - { - "include": "#comments-string-double-three" - } - ] - }, - "double-three-fregexp-lookahead": { - "begin": "(\\()\\?=", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookahead.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookahead.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#double-three-fregexp-expression" - }, - { - "include": "#comments-string-double-three" - } - ] - }, - "double-three-fregexp-lookahead-negative": { - "begin": "(\\()\\?!", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookahead.negative.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookahead.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#double-three-fregexp-expression" - }, - { - "include": "#comments-string-double-three" - } - ] - }, - "double-three-fregexp-lookbehind": { - "begin": "(\\()\\?<=", - "end": "(\\)|(?=\"\"\"))", - "beginCaptures": { - "0": { - "name": "keyword.operator.lookbehind.regexp" - }, - "1": { - "name": "punctuation.parenthesis.lookbehind.begin.regexp" - } - }, - "endCaptures": { - "1": { - "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#double-three-fregexp-expression" - }, - { - "include": "#comments-string-double-three" - } - ] - }, - "double-three-fregexp-lookbehind-negative": { - "begin": "(\\()\\?=^]? [-+ ]? \\#?\n \\d* ,? (\\.\\d+)? [bcdeEfFgGnosxX%]? )(?=})\n", - "captures": { - "1": { - "name": "storage.type.format.python" - }, - "2": { - "name": "storage.type.format.python" - } - } - }, - { - "include": "#fstring-terminator-single-tail" - } - ] - }, - "fstring-terminator-single-tail": { - "begin": "(![rsa])?(:)(?=.*?{)", - "end": "(?=})|(?=\\n)", - "beginCaptures": { - "1": { - "name": "storage.type.format.python" - }, - "2": { - "name": "storage.type.format.python" - } - }, - "patterns": [ - { - "include": "#fstring-illegal-single-brace" - }, - { - "include": "#fstring-single-brace" - }, - { - "name": "storage.type.format.python", - "match": "([bcdeEfFgGnosxX%])(?=})" - }, - { - "name": "storage.type.format.python", - "match": "(\\.\\d+)" - }, - { - "name": "storage.type.format.python", - "match": "(,)" - }, - { - "name": "storage.type.format.python", - "match": "(\\d+)" - }, - { - "name": "storage.type.format.python", - "match": "(\\#)" - }, - { - "name": "storage.type.format.python", - "match": "([-+ ])" - }, - { - "name": "storage.type.format.python", - "match": "([<>=^])" - }, - { - "name": "storage.type.format.python", - "match": "(\\w)" - } - ] - }, - "fstring-fnorm-quoted-multi-line": { - "name": "meta.fstring.python", - "begin": "(\\b[fF])([bBuU])?('''|\"\"\")", - "end": "(\\3)", - "beginCaptures": { - "1": { - "name": "string.interpolated.python string.quoted.multi.python storage.type.string.python" - }, - "2": { - "name": "invalid.illegal.prefix.python" - }, - "3": { - "name": "punctuation.definition.string.begin.python string.interpolated.python string.quoted.multi.python" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.multi.python" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#fstring-guts" - }, - { - "include": "#fstring-illegal-multi-brace" - }, - { - "include": "#fstring-multi-brace" - }, - { - "include": "#fstring-multi-core" - } - ] - }, - "fstring-normf-quoted-multi-line": { - "name": "meta.fstring.python", - "begin": "(\\b[bBuU])([fF])('''|\"\"\")", - "end": "(\\3)", - "beginCaptures": { - "1": { - "name": "invalid.illegal.prefix.python" - }, - "2": { - "name": "string.interpolated.python string.quoted.multi.python storage.type.string.python" - }, - "3": { - "name": "punctuation.definition.string.begin.python string.quoted.multi.python" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.multi.python" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#fstring-guts" - }, - { - "include": "#fstring-illegal-multi-brace" - }, - { - "include": "#fstring-multi-brace" - }, - { - "include": "#fstring-multi-core" - } - ] - }, - "fstring-raw-quoted-multi-line": { - "name": "meta.fstring.python", - "begin": "(\\b(?:[R][fF]|[fF][R]))('''|\"\"\")", - "end": "(\\2)", - "beginCaptures": { - "1": { - "name": "string.interpolated.python string.quoted.raw.multi.python storage.type.string.python" - }, - "2": { - "name": "punctuation.definition.string.begin.python string.quoted.raw.multi.python" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.raw.multi.python" - }, - "2": { - "name": "invalid.illegal.newline.python" - } - }, - "patterns": [ - { - "include": "#fstring-raw-guts" - }, - { - "include": "#fstring-illegal-multi-brace" - }, - { - "include": "#fstring-multi-brace" - }, - { - "include": "#fstring-raw-multi-core" - } - ] - }, - "fstring-multi-core": { - "name": "string.interpolated.python string.quoted.multi.python", - "match": "(?x)\n (.+?)\n (\n (?# .* and .*? in multi-line match need special handling of\n newlines otherwise SublimeText and Atom will match slightly\n differently.\n\n The guard for newlines has to be separate from the\n lookahead because of special $ matching rule.)\n ($\\n?)\n |\n (?=[\\\\\\}\\{]|'''|\"\"\")\n )\n (?# due to how multiline regexps are matched we need a special case\n for matching a newline character)\n | \\n\n" - }, - "fstring-raw-multi-core": { - "name": "string.interpolated.python string.quoted.raw.multi.python", - "match": "(?x)\n (.+?)\n (\n (?# .* and .*? in multi-line match need special handling of\n newlines otherwise SublimeText and Atom will match slightly\n differently.\n\n The guard for newlines has to be separate from the\n lookahead because of special $ matching rule.)\n ($\\n?)\n |\n (?=[\\\\\\}\\{]|'''|\"\"\")\n )\n (?# due to how multiline regexps are matched we need a special case\n for matching a newline character)\n | \\n\n" - }, - "fstring-multi-brace": { - "comment": "value interpolation using { ... }", - "begin": "(\\{)", - "end": "(?x)\n (\\})\n", - "beginCaptures": { - "1": { - "name": "constant.character.format.placeholder.other.python" - } - }, - "endCaptures": { - "1": { - "name": "constant.character.format.placeholder.other.python" - } - }, - "patterns": [ - { - "include": "#fstring-terminator-multi" - }, - { - "include": "#f-expression" - } - ] - }, - "fstring-terminator-multi": { - "patterns": [ - { - "name": "storage.type.format.python", - "match": "(![rsa])(?=})" - }, - { - "match": "(?x)\n (![rsa])?\n ( : \\w? [<>=^]? [-+ ]? \\#?\n \\d* ,? (\\.\\d+)? [bcdeEfFgGnosxX%]? )(?=})\n", - "captures": { - "1": { - "name": "storage.type.format.python" - }, - "2": { - "name": "storage.type.format.python" - } - } - }, - { - "include": "#fstring-terminator-multi-tail" - } - ] - }, - "fstring-terminator-multi-tail": { - "begin": "(![rsa])?(:)(?=.*?{)", - "end": "(?=})", - "beginCaptures": { - "1": { - "name": "storage.type.format.python" - }, - "2": { - "name": "storage.type.format.python" - } - }, - "patterns": [ - { - "include": "#fstring-illegal-multi-brace" - }, - { - "include": "#fstring-multi-brace" - }, - { - "name": "storage.type.format.python", - "match": "([bcdeEfFgGnosxX%])(?=})" - }, - { - "name": "storage.type.format.python", - "match": "(\\.\\d+)" - }, - { - "name": "storage.type.format.python", - "match": "(,)" - }, - { - "name": "storage.type.format.python", - "match": "(\\d+)" - }, - { - "name": "storage.type.format.python", - "match": "(\\#)" - }, - { - "name": "storage.type.format.python", - "match": "([-+ ])" - }, - { - "name": "storage.type.format.python", - "match": "([<>=^])" - }, - { - "name": "storage.type.format.python", - "match": "(\\w)" - } - ] - } - } -} diff --git a/src/http/get-docs-000lang-catchall/shiki/languages/ruby.tmLanguage.json b/src/http/get-docs-000lang-catchall/shiki/languages/ruby.tmLanguage.json deleted file mode 100644 index 0b044057..00000000 --- a/src/http/get-docs-000lang-catchall/shiki/languages/ruby.tmLanguage.json +++ /dev/null @@ -1,2775 +0,0 @@ -{ - "information_for_contributors": [ - "This file has been converted from https://github.com/textmate/ruby.tmbundle/blob/master/Syntaxes/Ruby.plist", - "If you want to provide a fix or improvement, please create a pull request against the original repository.", - "Once accepted there, we are happy to receive an update request." - ], - "version": "https://github.com/textmate/ruby.tmbundle/commit/efcb8941c701343f1b2e9fb105c678152fea6892", - "name": "ruby", - "scopeName": "source.ruby", - "comment": "\n\tTODO: unresolved issues\n\n\ttext:\n\t\"p <[a-zA-Z_]\\w*(?>[?!])?)(:)(?!:)", - "name": "constant.other.symbol.hashkey.ruby" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.constant.ruby" - } - }, - "comment": "symbols as hash key (1.8 syntax)", - "match": "(?[a-zA-Z_]\\w*(?>[?!])?)(?=\\s*=>)", - "name": "constant.other.symbol.hashkey.ruby" - }, - { - "comment": "everything being a reserved word, not a value and needing a 'end' is a..", - "match": "(?|_|\\*|\\$|\\?|:|\"|-[0adFiIlpvw])", - "name": "variable.other.readwrite.global.pre-defined.ruby" - }, - { - "begin": "\\b(ENV)\\[", - "beginCaptures": { - "1": { - "name": "variable.other.constant.ruby" - } - }, - "end": "\\]", - "name": "meta.environment-variable.ruby", - "patterns": [ - { - "include": "$self" - } - ] - }, - { - "match": "\\b[A-Z]\\w*(?=((\\.|::)[A-Za-z]|\\[))", - "name": "support.class.ruby" - }, - { - "match": "\\b(abort|at_exit|autoload[?]?|binding|callcc|caller|caller_locations|chomp|chop|eval|exec|exit|exit!|fork|format|gets|global_variables|gsub|lambda|load|local_variables|open|p|print|printf|proc|putc|puts|rand|readline|readlines|select|set_trace_func|sleep|spawn|sprintf|srand|sub|syscall|system|test|trace_var|trap|untrace_var|warn)(\\b|(?<=[?!]))(?![?!])", - "name": "support.function.kernel.ruby" - }, - { - "match": "\\b[A-Z]\\w*\\b", - "name": "variable.other.constant.ruby" - }, - { - "begin": "(?x)\n\t\t\t (?=def\\b) # an optimization to help Oniguruma fail fast\n\t\t\t (?<=^|\\s)(def)\\s+ # the def keyword\n\t\t\t ( (?>[a-zA-Z_]\\w*(?>\\.|::))? # a method name prefix\n\t\t\t (?>[a-zA-Z_]\\w*(?>[?!]|=(?!>))? # the method name\n\t\t\t |===?|!=|!~|>[>=]?|<=>|<[<=]?|[%&`/\\|^]|\\*\\*?|=?~|[-+]@?|\\[\\]=?) ) # …or an operator method\n\t\t\t \\s*(\\() # the openning parenthesis for arguments\n\t\t\t ", - "beginCaptures": { - "1": { - "name": "keyword.control.def.ruby" - }, - "2": { - "name": "entity.name.function.ruby" - }, - "3": { - "name": "punctuation.definition.parameters.ruby" - } - }, - "comment": "the method pattern comes from the symbol pattern, see there for a explaination", - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.parameters.ruby" - } - }, - "name": "meta.function.method.with-arguments.ruby", - "patterns": [ - { - "begin": "(?=[&*_a-zA-Z])", - "end": "(?=[,)])", - "patterns": [ - { - "captures": { - "1": { - "name": "storage.type.variable.ruby" - }, - "2": { - "name": "constant.other.symbol.hashkey.parameter.function.ruby" - }, - "3": { - "name": "punctuation.definition.constant.ruby" - }, - "4": { - "name": "variable.parameter.function.ruby" - } - }, - "match": "\\G([&*]?)(?:([_a-zA-Z]\\w*(:))|([_a-zA-Z]\\w*))" - }, - { - "include": "#parens" - }, - { - "include": "#braces" - }, - { - "include": "$self" - } - ] - } - ], - "repository": { - "braces": { - "begin": "\\{", - "beginCaptures": { - "0": { - "name": "punctuation.section.function.begin.ruby" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.section.function.end.ruby" - } - }, - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#braces" - }, - { - "include": "$self" - } - ] - }, - "parens": { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.section.function.begin.ruby" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.function.end.ruby" - } - }, - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#braces" - }, - { - "include": "$self" - } - ] - } - } - }, - { - "begin": "(?x)\n\t\t\t (?=def\\b) # an optimization to help Oniguruma fail fast\n\t\t\t (?<=^|\\s)(def)\\s+ # the def keyword\n\t\t\t ( (?>[a-zA-Z_]\\w*(?>\\.|::))? # a method name prefix\n\t\t\t (?>[a-zA-Z_]\\w*(?>[?!]|=(?!>))? # the method name\n\t\t\t |===?|!=|!~|>[>=]?|<=>|<[<=]?|[%&`/\\|^]|\\*\\*?|=?~|[-+]@?|\\[\\]=?) ) # …or an operator method\n\t\t\t [ \\t] # the space separating the arguments\n\t\t\t (?=[ \\t]*[^\\s#;]) # make sure arguments and not a comment follow\n\t\t\t ", - "beginCaptures": { - "1": { - "name": "keyword.control.def.ruby" - }, - "2": { - "name": "entity.name.function.ruby" - } - }, - "comment": "same as the previous rule, but without parentheses around the arguments", - "end": "$", - "name": "meta.function.method.with-arguments.ruby", - "patterns": [ - { - "begin": "(?![\\s,])", - "end": "(?=,|$)", - "patterns": [ - { - "captures": { - "1": { - "name": "storage.type.variable.ruby" - }, - "2": { - "name": "constant.other.symbol.hashkey.parameter.function.ruby" - }, - "3": { - "name": "punctuation.definition.constant.ruby" - }, - "4": { - "name": "variable.parameter.function.ruby" - } - }, - "match": "\\G([&*]?)(?:([_a-zA-Z]\\w*(:))|([_a-zA-Z]\\w*))", - "name": "variable.parameter.function.ruby" - }, - { - "include": "$self" - } - ] - } - ] - }, - { - "captures": { - "1": { - "name": "keyword.control.def.ruby" - }, - "3": { - "name": "entity.name.function.ruby" - } - }, - "comment": " the optional name is just to catch the def also without a method-name", - "match": "(?x)\n\t\t\t (?=def\\b) # an optimization to help Oniguruma fail fast\n\t\t\t (?<=^|\\s)(def)\\b # the def keyword\n\t\t\t ( \\s+ # an optional group of whitespace followed by…\n\t\t\t ( (?>[a-zA-Z_]\\w*(?>\\.|::))? # a method name prefix\n\t\t\t (?>[a-zA-Z_]\\w*(?>[?!]|=(?!>))? # the method name\n\t\t\t |===?|!=|!~|>[>=]?|<=>|<[<=]?|[%&`/\\|^]|\\*\\*?|=?~|[-+]@?|\\[\\]=?) ) )? # …or an operator method\n\t\t\t ", - "name": "meta.function.method.without-arguments.ruby" - }, - { - "match": "\\b\\d(?>_?\\d)*(?=\\.\\d|[eE])(\\.\\d(?>_?\\d)*)?([eE][-+]?\\d(?>_?\\d)*)?r?i?\\b", - "name": "constant.numeric.float.ruby" - }, - { - "match": "\\b(0|(0[dD]\\d|[1-9])(?>_?\\d)*)r?i?\\b", - "name": "constant.numeric.integer.ruby" - }, - { - "match": "\\b0[xX]\\h(?>_?\\h)*r?i?\\b", - "name": "constant.numeric.hex.ruby" - }, - { - "match": "\\b0[bB][01](?>_?[01])*r?i?\\b", - "name": "constant.numeric.binary.ruby" - }, - { - "match": "\\b0([oO]?[0-7](?>_?[0-7])*)?r?i?\\b", - "name": "constant.numeric.octal.ruby" - }, - { - "begin": ":'", - "captures": { - "0": { - "name": "punctuation.definition.constant.ruby" - } - }, - "end": "'", - "name": "constant.other.symbol.single-quoted.ruby", - "patterns": [ - { - "match": "\\\\['\\\\]", - "name": "constant.character.escape.ruby" - } - ] - }, - { - "begin": ":\"", - "captures": { - "0": { - "name": "punctuation.definition.constant.ruby" - } - }, - "end": "\"", - "name": "constant.other.symbol.double-quoted.ruby", - "patterns": [ - { - "include": "#interpolated_ruby" - }, - { - "include": "#escaped_char" - } - ] - }, - { - "comment": "Needs higher precedence than regular expressions.", - "match": "(?~(?:\\[,|&;]\n\t\t\t | [\\s;]if\\s\t\t\t# keywords\n\t\t\t | [\\s;]elsif\\s\n\t\t\t | [\\s;]while\\s\n\t\t\t | [\\s;]unless\\s\n\t\t\t | [\\s;]when\\s\n\t\t\t | [\\s;]assert_match\\s\n\t\t\t | [\\s;]or\\s\t\t\t# boolean opperators\n\t\t\t | [\\s;]and\\s\n\t\t\t | [\\s;]not\\s\n\t\t\t | [\\s.]index\\s\t\t\t# methods\n\t\t\t | [\\s.]scan\\s\n\t\t\t | [\\s.]sub\\s\n\t\t\t | [\\s.]sub!\\s\n\t\t\t | [\\s.]gsub\\s\n\t\t\t | [\\s.]gsub!\\s\n\t\t\t | [\\s.]match\\s\n\t\t\t )\n\t\t\t | (?<= # or a look-behind with line anchor:\n\t\t\t ^when\\s # duplication necessary due to limits of regex\n\t\t\t | ^if\\s\n\t\t\t | ^elsif\\s\n\t\t\t | ^while\\s\n\t\t\t | ^unless\\s\n\t\t\t )\n\t\t\t )\n\t\t\t \\s*((/))(?![*+{}?])\n\t\t\t", - "captures": { - "1": { - "name": "string.regexp.classic.ruby" - }, - "2": { - "name": "punctuation.definition.string.ruby" - } - }, - "comment": "regular expressions (normal)\n\t\t\twe only start a regexp if the character before it (excluding whitespace)\n\t\t\tis what we think is before a regexp\n\t\t\t", - "contentName": "string.regexp.classic.ruby", - "end": "((/[eimnosux]*))", - "patterns": [ - { - "include": "#regex_sub" - } - ] - }, - { - "captures": { - "1": { - "name": "punctuation.definition.constant.ruby" - } - }, - "comment": "symbols", - "match": "(?[a-zA-Z_]\\w*(?>[?!]|=(?![>=]))?|===?|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[\\]=?|(@@?|\\$)[a-zA-Z_]\\w*)", - "name": "constant.other.symbol.ruby" - }, - { - "begin": "^=begin", - "captures": { - "0": { - "name": "punctuation.definition.comment.ruby" - } - }, - "comment": "multiline comments", - "end": "^=end", - "name": "comment.block.documentation.ruby" - }, - { - "begin": "(^[ \\t]+)?(?=#)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.ruby" - } - }, - "end": "(?!\\G)", - "patterns": [ - { - "begin": "#", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.ruby" - } - }, - "end": "\\n", - "name": "comment.line.number-sign.ruby" - } - ] - }, - { - "comment": "\n\t\t\tmatches questionmark-letters.\n\n\t\t\texamples (1st alternation = hex):\n\t\t\t?\\x1 ?\\x61\n\n\t\t\texamples (2nd alternation = octal):\n\t\t\t?\\0 ?\\07 ?\\017\n\n\t\t\texamples (3rd alternation = escaped):\n\t\t\t?\\n ?\\b\n\n\t\t\texamples (4th alternation = meta-ctrl):\n\t\t\t?\\C-a ?\\M-a ?\\C-\\M-\\C-\\M-a\n\n\t\t\texamples (4th alternation = normal):\n\t\t\t?a ?A ?0 \n\t\t\t?* ?\" ?( \n\t\t\t?. ?#\n\t\t\t\n\t\t\t\n\t\t\tthe negative lookbehind prevents against matching\n\t\t\tp(42.tainted?)\n\t\t\t", - "match": "(?<<[-~](\"?)((?:[_\\w]+_|)HTML)\\b\\1))", - "comment": "Heredoc with embedded html", - "end": "(?!\\G)", - "name": "meta.embedded.block.html", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)HTML)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "text.html", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "text.html.basic" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)XML)\\b\\1))", - "comment": "Heredoc with embedded xml", - "end": "(?!\\G)", - "name": "meta.embedded.block.xml", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)XML)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "text.xml", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "text.xml" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)SQL)\\b\\1))", - "comment": "Heredoc with embedded sql", - "end": "(?!\\G)", - "name": "meta.embedded.block.sql", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)SQL)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.sql", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.sql" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)CSS)\\b\\1))", - "comment": "Heredoc with embedded css", - "end": "(?!\\G)", - "name": "meta.embedded.block.css", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)CSS)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.css", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.css" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)CPP)\\b\\1))", - "comment": "Heredoc with embedded c++", - "end": "(?!\\G)", - "name": "meta.embedded.block.c++", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)CPP)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.c++", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.c++" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)C)\\b\\1))", - "comment": "Heredoc with embedded c", - "end": "(?!\\G)", - "name": "meta.embedded.block.c", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)C)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.c", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.c" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1))", - "comment": "Heredoc with embedded javascript", - "end": "(?!\\G)", - "name": "meta.embedded.block.js", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.js", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.js" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)JQUERY)\\b\\1))", - "comment": "Heredoc with embedded jQuery javascript", - "end": "(?!\\G)", - "name": "meta.embedded.block.js.jquery", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)JQUERY)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.js.jquery", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.js.jquery" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1))", - "comment": "Heredoc with embedded shell", - "end": "(?!\\G)", - "name": "meta.embedded.block.shell", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.shell", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.shell" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)LUA)\\b\\1))", - "comment": "Heredoc with embedded lua", - "end": "(?!\\G)", - "name": "meta.embedded.block.lua", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)LUA)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.lua", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.lua" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)RUBY)\\b\\1))", - "comment": "Heredoc with embedded ruby", - "end": "(?!\\G)", - "name": "meta.embedded.block.ruby", - "patterns": [ - { - "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)RUBY)\\b\\1)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "contentName": "source.ruby", - "end": "\\s*\\2$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "source.ruby" - }, - { - "include": "#escaped_char" - } - ] - } - ] - }, - { - "begin": "(?>=\\s*<<(\\w+))", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "end": "^\\1$", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "#escaped_char" - } - ] - }, - { - "begin": "(?><<[-~](\\w+))", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "comment": "heredoc with indented terminator", - "end": "\\s*\\1$", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.unquoted.heredoc.ruby", - "patterns": [ - { - "include": "#heredoc" - }, - { - "include": "#interpolated_ruby" - }, - { - "include": "#escaped_char" - } - ] - }, - { - "begin": "(?<=\\{|do|\\{\\s|do\\s)(\\|)", - "captures": { - "1": { - "name": "punctuation.separator.arguments.ruby" - } - }, - "end": "(?", - "name": "punctuation.separator.key-value" - }, - { - "match": "->", - "name": "support.function.kernel.lambda.ruby" - }, - { - "match": "<<=|%=|&{1,2}=|\\*=|\\*\\*=|\\+=|-=|\\^=|\\|{1,2}=|<<", - "name": "keyword.operator.assignment.augmented.ruby" - }, - { - "match": "<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?<=[ \\t])\\?", - "name": "keyword.operator.comparison.ruby" - }, - { - "match": "(?>", - "name": "keyword.operator.other.ruby" - }, - { - "match": ";", - "name": "punctuation.separator.statement.ruby" - }, - { - "match": ",", - "name": "punctuation.separator.object.ruby" - }, - { - "captures": { - "1": { - "name": "punctuation.separator.namespace.ruby" - } - }, - "comment": "Mark as namespace separator if double colons followed by capital letter", - "match": "(::)\\s*(?=[A-Z])" - }, - { - "captures": { - "1": { - "name": "punctuation.separator.method.ruby" - } - }, - "comment": "Mark as method separator if double colons not followed by capital letter", - "match": "(\\.|::)\\s*(?![A-Z])" - }, - { - "comment": "Must come after method and constant separators to prefer double colons", - "match": ":", - "name": "punctuation.separator.other.ruby" - }, - { - "match": "\\{", - "name": "punctuation.section.scope.begin.ruby" - }, - { - "match": "\\}", - "name": "punctuation.section.scope.end.ruby" - }, - { - "match": "\\[", - "name": "punctuation.section.array.begin.ruby" - }, - { - "match": "\\]", - "name": "punctuation.section.array.end.ruby" - }, - { - "match": "\\(|\\)", - "name": "punctuation.section.function.ruby" - } - ], - "repository": { - "escaped_char": { - "match": "\\\\(?:[0-7]{1,3}|x[\\da-fA-F]{1,2}|.)", - "name": "constant.character.escape.ruby" - }, - "heredoc": { - "begin": "^<<[-~]?\\w+", - "end": "$", - "patterns": [ - { - "include": "$self" - } - ] - }, - "interpolated_ruby": { - "patterns": [ - { - "begin": "#\\{", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.ruby" - } - }, - "contentName": "source.ruby", - "end": "(\\})", - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.ruby" - }, - "1": { - "name": "source.ruby" - } - }, - "name": "meta.embedded.line.ruby", - "patterns": [ - { - "include": "#nest_curly_and_self" - }, - { - "include": "$self" - } - ], - "repository": { - "nest_curly_and_self": { - "patterns": [ - { - "begin": "\\{", - "captures": { - "0": { - "name": "punctuation.section.scope.ruby" - } - }, - "end": "\\}", - "patterns": [ - { - "include": "#nest_curly_and_self" - } - ] - }, - { - "include": "$self" - } - ] - } - } - }, - { - "captures": { - "1": { - "name": "punctuation.definition.variable.ruby" - } - }, - "match": "(#@)[a-zA-Z_]\\w*", - "name": "variable.other.readwrite.instance.ruby" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.variable.ruby" - } - }, - "match": "(#@@)[a-zA-Z_]\\w*", - "name": "variable.other.readwrite.class.ruby" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.variable.ruby" - } - }, - "match": "(#\\$)[a-zA-Z_]\\w*", - "name": "variable.other.readwrite.global.ruby" - } - ] - }, - "percent_literals": { - "patterns": [ - { - "begin": "%i(?:([(\\[{<])|([^\\w\\s]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.section.array.begin.ruby" - } - }, - "end": "[)\\]}>]\\2|\\1\\2", - "endCaptures": { - "0": { - "name": "punctuation.section.array.end.ruby" - } - }, - "name": "meta.array.symbol.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#symbol" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - }, - { - "include": "#symbol" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - }, - { - "include": "#symbol" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - }, - { - "include": "#symbol" - } - ] - }, - { - "include": "#symbol" - } - ], - "repository": { - "angles": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\<|\\\\>", - "name": "constant.other.symbol.ruby" - }, - { - "begin": "<", - "captures": { - "0": { - "name": "constant.other.symbol.ruby" - } - }, - "end": ">", - "patterns": [ - { - "include": "#angles" - }, - { - "include": "#symbol" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\\\{|\\\\\\}", - "name": "constant.other.symbol.ruby" - }, - { - "begin": "\\{", - "captures": { - "0": { - "name": "constant.other.symbol.ruby" - } - }, - "end": "\\}", - "patterns": [ - { - "include": "#braces" - }, - { - "include": "#symbol" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\\\[|\\\\\\]", - "name": "constant.other.symbol.ruby" - }, - { - "begin": "\\[", - "captures": { - "0": { - "name": "constant.other.symbol.ruby" - } - }, - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - }, - { - "include": "#symbol" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\\\(|\\\\\\)", - "name": "constant.other.symbol.ruby" - }, - { - "begin": "\\(", - "captures": { - "0": { - "name": "constant.other.symbol.ruby" - } - }, - "end": "\\)", - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#symbol" - } - ] - } - ] - }, - "symbol": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\\\\\|\\\\[ ]", - "name": "constant.other.symbol.ruby" - }, - { - "match": "\\S\\w*", - "name": "constant.other.symbol.ruby" - } - ] - } - } - }, - { - "begin": "%I(?:([(\\[{<])|([^\\w\\s]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.section.array.begin.ruby" - } - }, - "end": "[)\\]}>]\\2|\\1\\2", - "endCaptures": { - "0": { - "name": "punctuation.section.array.end.ruby" - } - }, - "name": "meta.array.symbol.interpolated.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#symbol" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - }, - { - "include": "#symbol" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - }, - { - "include": "#symbol" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - }, - { - "include": "#symbol" - } - ] - }, - { - "include": "#symbol" - } - ], - "repository": { - "angles": { - "patterns": [ - { - "begin": "<", - "captures": { - "0": { - "name": "constant.other.symbol.ruby" - } - }, - "end": ">", - "patterns": [ - { - "include": "#angles" - }, - { - "include": "#symbol" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "begin": "\\{", - "captures": { - "0": { - "name": "constant.other.symbol.ruby" - } - }, - "end": "\\}", - "patterns": [ - { - "include": "#braces" - }, - { - "include": "#symbol" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "begin": "\\[", - "captures": { - "0": { - "name": "constant.other.symbol.ruby" - } - }, - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - }, - { - "include": "#symbol" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "begin": "\\(", - "captures": { - "0": { - "name": "constant.other.symbol.ruby" - } - }, - "end": "\\)", - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#symbol" - } - ] - } - ] - }, - "symbol": { - "patterns": [ - { - "begin": "(?=\\\\|#\\{)", - "end": "(?!\\G)", - "name": "constant.other.symbol.ruby", - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - } - ] - }, - { - "match": "\\S\\w*", - "name": "constant.other.symbol.ruby" - } - ] - } - } - }, - { - "begin": "%q(?:([(\\[{<])|([^\\w\\s]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "end": "[)\\]}>]\\2|\\1\\2", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.quoted.other.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - } - ] - } - ], - "repository": { - "angles": { - "patterns": [ - { - "match": "\\\\<|\\\\>|\\\\\\\\", - "name": "constant.character.escape.ruby" - }, - { - "begin": "<", - "end": ">", - "patterns": [ - { - "include": "#angles" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "match": "\\\\\\{|\\\\\\}|\\\\\\\\", - "name": "constant.character.escape.ruby" - }, - { - "begin": "\\{", - "end": "\\}", - "patterns": [ - { - "include": "#braces" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "match": "\\\\\\[|\\\\\\]|\\\\\\\\", - "name": "constant.character.escape.ruby" - }, - { - "begin": "\\[", - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "match": "\\\\\\(|\\\\\\)|\\\\\\\\", - "name": "constant.character.escape.ruby" - }, - { - "begin": "\\(", - "end": "\\)", - "patterns": [ - { - "include": "#parens" - } - ] - } - ] - } - } - }, - { - "begin": "%Q?(?:([(\\[{<])|([^\\w\\s=]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "end": "[)\\]}>]\\2|\\1\\2", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.quoted.other.interpolated.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - } - ] - }, - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - } - ], - "repository": { - "angles": { - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - }, - { - "begin": "<", - "end": ">", - "patterns": [ - { - "include": "#angles" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - }, - { - "begin": "\\{", - "end": "\\}", - "patterns": [ - { - "include": "#braces" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - }, - { - "begin": "\\[", - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - }, - { - "begin": "\\(", - "end": "\\)", - "patterns": [ - { - "include": "#parens" - } - ] - } - ] - } - } - }, - { - "begin": "%r(?:([(\\[{<])|([^\\w\\s]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "end": "([)\\]}>]\\2|\\1\\2)[eimnosux]*", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.regexp.percent.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - } - ] - }, - { - "include": "#regex_sub" - } - ], - "repository": { - "angles": { - "patterns": [ - { - "include": "#regex_sub" - }, - { - "begin": "<", - "end": ">", - "patterns": [ - { - "include": "#angles" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "include": "#regex_sub" - }, - { - "begin": "\\{", - "end": "\\}", - "patterns": [ - { - "include": "#braces" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "include": "#regex_sub" - }, - { - "begin": "\\[", - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "include": "#regex_sub" - }, - { - "begin": "\\(", - "end": "\\)", - "patterns": [ - { - "include": "#parens" - } - ] - } - ] - } - } - }, - { - "begin": "%s(?:([(\\[{<])|([^\\w\\s]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.definition.constant.begin.ruby" - } - }, - "end": "[)\\]}>]\\2|\\1\\2", - "endCaptures": { - "0": { - "name": "punctuation.definition.constant.end.ruby" - } - }, - "name": "constant.other.symbol.percent.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - } - ] - } - ], - "repository": { - "angles": { - "patterns": [ - { - "match": "\\\\<|\\\\>|\\\\\\\\", - "name": "constant.character.escape.ruby" - }, - { - "begin": "<", - "end": ">", - "patterns": [ - { - "include": "#angles" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "match": "\\\\\\{|\\\\\\}|\\\\\\\\", - "name": "constant.character.escape.ruby" - }, - { - "begin": "\\{", - "end": "\\}", - "patterns": [ - { - "include": "#braces" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "match": "\\\\\\[|\\\\\\]|\\\\\\\\", - "name": "constant.character.escape.ruby" - }, - { - "begin": "\\[", - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "match": "\\\\\\(|\\\\\\)|\\\\\\\\", - "name": "constant.character.escape.ruby" - }, - { - "begin": "\\(", - "end": "\\)", - "patterns": [ - { - "include": "#parens" - } - ] - } - ] - } - } - }, - { - "begin": "%w(?:([(\\[{<])|([^\\w\\s]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.section.array.begin.ruby" - } - }, - "end": "[)\\]}>]\\2|\\1\\2", - "endCaptures": { - "0": { - "name": "punctuation.section.array.end.ruby" - } - }, - "name": "meta.array.string.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#string" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - }, - { - "include": "#string" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - }, - { - "include": "#string" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - }, - { - "include": "#string" - } - ] - }, - { - "include": "#string" - } - ], - "repository": { - "angles": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\<|\\\\>", - "name": "string.other.ruby" - }, - { - "begin": "<", - "captures": { - "0": { - "name": "string.other.ruby" - } - }, - "end": ">", - "patterns": [ - { - "include": "#angles" - }, - { - "include": "#string" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\\\{|\\\\\\}", - "name": "string.other.ruby" - }, - { - "begin": "\\{", - "captures": { - "0": { - "name": "string.other.ruby" - } - }, - "end": "\\}", - "patterns": [ - { - "include": "#braces" - }, - { - "include": "#string" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\\\[|\\\\\\]", - "name": "string.other.ruby" - }, - { - "begin": "\\[", - "captures": { - "0": { - "name": "string.other.ruby" - } - }, - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - }, - { - "include": "#string" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\\\(|\\\\\\)", - "name": "string.other.ruby" - }, - { - "begin": "\\(", - "captures": { - "0": { - "name": "string.other.ruby" - } - }, - "end": "\\)", - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#string" - } - ] - } - ] - }, - "string": { - "patterns": [ - { - "captures": { - "0": { - "name": "constant.character.escape.ruby" - } - }, - "match": "\\\\\\\\|\\\\[ ]", - "name": "string.other.ruby" - }, - { - "match": "\\S\\w*", - "name": "string.other.ruby" - } - ] - } - } - }, - { - "begin": "%W(?:([(\\[{<])|([^\\w\\s]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.section.array.begin.ruby" - } - }, - "end": "[)\\]}>]\\2|\\1\\2", - "endCaptures": { - "0": { - "name": "punctuation.section.array.end.ruby" - } - }, - "name": "meta.array.string.interpolated.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#string" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - }, - { - "include": "#string" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - }, - { - "include": "#string" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - }, - { - "include": "#string" - } - ] - }, - { - "include": "#string" - } - ], - "repository": { - "angles": { - "patterns": [ - { - "begin": "<", - "captures": { - "0": { - "name": "string.other.ruby" - } - }, - "end": ">", - "patterns": [ - { - "include": "#angles" - }, - { - "include": "#string" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "begin": "\\{", - "captures": { - "0": { - "name": "string.other.ruby" - } - }, - "end": "\\}", - "patterns": [ - { - "include": "#braces" - }, - { - "include": "#string" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "begin": "\\[", - "captures": { - "0": { - "name": "string.other.ruby" - } - }, - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - }, - { - "include": "#string" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "begin": "\\(", - "captures": { - "0": { - "name": "string.other.ruby" - } - }, - "end": "\\)", - "patterns": [ - { - "include": "#parens" - }, - { - "include": "#string" - } - ] - } - ] - }, - "string": { - "patterns": [ - { - "begin": "(?=\\\\|#\\{)", - "end": "(?!\\G)", - "name": "string.other.ruby", - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - } - ] - }, - { - "match": "\\S\\w*", - "name": "string.other.ruby" - } - ] - } - } - }, - { - "begin": "%x(?:([(\\[{<])|([^\\w\\s]|_))", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.ruby" - } - }, - "end": "[)\\]}>]\\2|\\1\\2", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.ruby" - } - }, - "name": "string.interpolated.percent.ruby", - "patterns": [ - { - "begin": "\\G(?<=\\()(?!\\))", - "end": "(?=\\))", - "patterns": [ - { - "include": "#parens" - } - ] - }, - { - "begin": "\\G(?<=\\[)(?!\\])", - "end": "(?=\\])", - "patterns": [ - { - "include": "#brackets" - } - ] - }, - { - "begin": "\\G(?<=\\{)(?!\\})", - "end": "(?=\\})", - "patterns": [ - { - "include": "#braces" - } - ] - }, - { - "begin": "\\G(?<=<)(?!>)", - "end": "(?=>)", - "patterns": [ - { - "include": "#angles" - } - ] - }, - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - } - ], - "repository": { - "angles": { - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - }, - { - "begin": "<", - "end": ">", - "patterns": [ - { - "include": "#angles" - } - ] - } - ] - }, - "braces": { - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - }, - { - "begin": "\\{", - "end": "\\}", - "patterns": [ - { - "include": "#braces" - } - ] - } - ] - }, - "brackets": { - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - }, - { - "begin": "\\[", - "end": "\\]", - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "parens": { - "patterns": [ - { - "include": "#escaped_char" - }, - { - "include": "#interpolated_ruby" - }, - { - "begin": "\\(", - "end": "\\)", - "patterns": [ - { - "include": "#parens" - } - ] - } - ] - } - } - } - ] - }, - "regex_sub": { - "patterns": [ - { - "include": "#interpolated_ruby" - }, - { - "include": "#escaped_char" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.quantifier.begin.ruby" - }, - "3": { - "name": "punctuation.definition.quantifier.end.ruby" - } - }, - "match": "(\\{)\\d+(,\\d+)?(\\})", - "name": "keyword.operator.quantifier.ruby" - }, - { - "begin": "\\[\\^?", - "beginCaptures": { - "0": { - "name": "punctuation.definition.character-class.begin.ruby" - } - }, - "end": "\\]", - "endCaptures": { - "0": { - "name": "punctuation.definition.character-class.end.ruby" - } - }, - "name": "constant.other.character-class.set.ruby", - "patterns": [ - { - "include": "#escaped_char" - } - ] - }, - { - "begin": "\\(\\?#", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.begin.ruby" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.end.ruby" - } - }, - "name": "comment.line.number-sign.ruby", - "patterns": [ - { - "include": "#escaped_char" - } - ] - }, - { - "begin": "\\(", - "captures": { - "0": { - "name": "punctuation.definition.group.ruby" - } - }, - "end": "\\)", - "name": "meta.group.regexp.ruby", - "patterns": [ - { - "include": "#regex_sub" - } - ] - }, - { - "begin": "(?<=^|\\s)(#)\\s(?=[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.ruby" - } - }, - "comment": "We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.", - "end": "$\\n?", - "name": "comment.line.number-sign.ruby" - } - ] - } - } -} diff --git a/src/http/get-docs-000lang-catchall/shiki/languages/shellscript.tmLanguage.json b/src/http/get-docs-000lang-catchall/shiki/languages/shellscript.tmLanguage.json deleted file mode 100644 index a8635c89..00000000 --- a/src/http/get-docs-000lang-catchall/shiki/languages/shellscript.tmLanguage.json +++ /dev/null @@ -1,1283 +0,0 @@ -{ - "information_for_contributors": [ - "This file has been converted from https://github.com/atom/language-shellscript/blob/master/grammars/shell-unix-bash.cson", - "If you want to provide a fix or improvement, please create a pull request against the original repository.", - "Once accepted there, we are happy to receive an update request." - ], - "version": "https://github.com/atom/language-shellscript/commit/4c3711edbe8eac6f501976893976b1ac6a043d50", - "name": "shellscript", - "scopeName": "source.shell", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#pipeline" - }, - { - "include": "#list" - }, - { - "include": "#compound-command" - }, - { - "include": "#loop" - }, - { - "include": "#string" - }, - { - "include": "#function-definition" - }, - { - "include": "#variable" - }, - { - "include": "#interpolation" - }, - { - "include": "#heredoc" - }, - { - "include": "#herestring" - }, - { - "include": "#redirection" - }, - { - "include": "#pathname" - }, - { - "include": "#keyword" - }, - { - "include": "#support" - } - ], - "repository": { - "case-clause": { - "patterns": [ - { - "begin": "(?=\\S)", - "end": ";;", - "endCaptures": { - "0": { - "name": "punctuation.terminator.case-clause.shell" - } - }, - "name": "meta.scope.case-clause.shell", - "patterns": [ - { - "begin": "\\(|(?=\\S)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.case-pattern.shell" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.case-pattern.shell" - } - }, - "name": "meta.scope.case-pattern.shell", - "patterns": [ - { - "match": "\\|", - "name": "punctuation.separator.pipe-sign.shell" - }, - { - "include": "#string" - }, - { - "include": "#variable" - }, - { - "include": "#interpolation" - }, - { - "include": "#pathname" - } - ] - }, - { - "begin": "(?<=\\))", - "end": "(?=;;)", - "name": "meta.scope.case-clause-body.shell", - "patterns": [ - { - "include": "$self" - } - ] - } - ] - } - ] - }, - "comment": { - "begin": "(^\\s+)?(?<=^|\\W)(?|&&|\\|\\|", - "name": "keyword.operator.logical.shell" - }, - { - "match": "(?[>=]?|==|!=|^|\\|{1,2}|&{1,2}|\\?|\\:|,|=|[*/%+\\-&^|]=|<<=|>>=", - "name": "keyword.operator.arithmetic.shell" - }, - { - "match": "0[xX][0-9A-Fa-f]+", - "name": "constant.numeric.hex.shell" - }, - { - "match": "0\\d+", - "name": "constant.numeric.octal.shell" - }, - { - "match": "\\d{1,2}#[0-9a-zA-Z@_]+", - "name": "constant.numeric.other.shell" - }, - { - "match": "\\d+", - "name": "constant.numeric.integer.shell" - } - ] - }, - "pathname": { - "patterns": [ - { - "match": "(?<=\\s|:|=|^)~", - "name": "keyword.operator.tilde.shell" - }, - { - "match": "\\*|\\?", - "name": "keyword.operator.glob.shell" - }, - { - "begin": "([?*+@!])(\\()", - "beginCaptures": { - "1": { - "name": "keyword.operator.extglob.shell" - }, - "2": { - "name": "punctuation.definition.extglob.shell" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.extglob.shell" - } - }, - "name": "meta.structure.extglob.shell", - "patterns": [ - { - "include": "$self" - } - ] - } - ] - }, - "pipeline": { - "patterns": [ - { - "match": "(?<=^|;|&|\\s)(time)(?=\\s|;|&|$)", - "name": "keyword.other.shell" - }, - { - "match": "[|!]", - "name": "keyword.operator.pipe.shell" - } - ] - }, - "redirection": { - "patterns": [ - { - "begin": "[><]\\(", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.shell" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.shell" - } - }, - "name": "string.interpolated.process-substitution.shell", - "patterns": [ - { - "include": "$self" - } - ] - }, - { - "match": "(?])(&>|\\d*>&\\d*|\\d*(>>|>|<)|\\d*<&|\\d*<>)(?![<>])", - "name": "keyword.operator.redirect.shell" - } - ] - }, - "string": { - "patterns": [ - { - "match": "\\\\.", - "name": "constant.character.escape.shell" - }, - { - "begin": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.shell" - } - }, - "end": "'", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.shell" - } - }, - "name": "string.quoted.single.shell" - }, - { - "begin": "\\$?\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.shell" - } - }, - "end": "\"", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.shell" - } - }, - "name": "string.quoted.double.shell", - "patterns": [ - { - "match": "\\\\[\\$`\"\\\\\\n]", - "name": "constant.character.escape.shell" - }, - { - "include": "#variable" - }, - { - "include": "#interpolation" - } - ] - }, - { - "begin": "\\$'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.shell" - } - }, - "end": "'", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.shell" - } - }, - "name": "string.quoted.single.dollar.shell", - "patterns": [ - { - "match": "\\\\(a|b|e|f|n|r|t|v|\\\\|')", - "name": "constant.character.escape.ansi-c.shell" - }, - { - "match": "\\\\[0-9]{3}", - "name": "constant.character.escape.octal.shell" - }, - { - "match": "\\\\x[0-9a-fA-F]{2}", - "name": "constant.character.escape.hex.shell" - }, - { - "match": "\\\\c.", - "name": "constant.character.escape.control-char.shell" - } - ] - } - ] - }, - "support": { - "patterns": [ - { - "match": "(?<=^|;|&|\\s)(?::|\\.)(?=\\s|;|&|$)", - "name": "support.function.builtin.shell" - }, - { - "match": "(?<=^|;|&|\\s)(?:alias|bg|bind|break|builtin|caller|cd|command|compgen|complete|dirs|disown|echo|enable|eval|exec|exit|false|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|times|trap|true|type|ulimit|umask|unalias|unset|wait)(?=\\s|;|&|$)", - "name": "support.function.builtin.shell" - } - ] - }, - "variable": { - "patterns": [ - { - "captures": { - "1": { - "name": "punctuation.definition.variable.shell" - } - }, - "match": "(\\$)[a-zA-Z_][a-zA-Z0-9_]*", - "name": "variable.other.normal.shell" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.variable.shell" - } - }, - "match": "(\\$)[-*@#?$!0_]", - "name": "variable.other.special.shell" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.variable.shell" - } - }, - "match": "(\\$)[1-9]", - "name": "variable.other.positional.shell" - }, - { - "begin": "\\${", - "beginCaptures": { - "0": { - "name": "punctuation.definition.variable.shell" - } - }, - "end": "}", - "endCaptures": { - "0": { - "name": "punctuation.definition.variable.shell" - } - }, - "name": "variable.other.bracket.shell", - "patterns": [ - { - "match": "!|:[-=?]?|\\*|@|#{1,2}|%{1,2}|/", - "name": "keyword.operator.expansion.shell" - }, - { - "captures": { - "1": { - "name": "punctuation.section.array.shell" - }, - "3": { - "name": "punctuation.section.array.shell" - } - }, - "match": "(\\[)([^\\]]+)(\\])" - }, - { - "include": "#variable" - }, - { - "include": "#string" - } - ] - } - ] - } - } -} diff --git a/src/http/get-docs-000lang-catchall/shiki/languages/toml.tmLanguage.json b/src/http/get-docs-000lang-catchall/shiki/languages/toml.tmLanguage.json deleted file mode 100644 index 6386b523..00000000 --- a/src/http/get-docs-000lang-catchall/shiki/languages/toml.tmLanguage.json +++ /dev/null @@ -1,430 +0,0 @@ -{ - "fileTypes": ["toml"], - "keyEquivalent": "^~T", - "name": "toml", - "patterns": [ - { - "include": "#comments" - }, - { - "include": "#groups" - }, - { - "include": "#key_pair" - }, - { - "include": "#invalid" - } - ], - "repository": { - "comments": { - "begin": "(^[ \\t]+)?(?=#)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.toml" - } - }, - "end": "(?!\\G)", - "patterns": [ - { - "begin": "#", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.toml" - } - }, - "end": "\\n", - "name": "comment.line.number-sign.toml" - } - ] - }, - "groups": { - "patterns": [ - { - "captures": { - "1": { - "name": "punctuation.definition.section.begin.toml" - }, - "2": { - "patterns": [ - { - "match": "[^\\s.]+", - "name": "entity.name.section.toml" - } - ] - }, - "3": { - "name": "punctuation.definition.section.begin.toml" - } - }, - "match": "^\\s*(\\[)([^\\[\\]]*)(\\])", - "name": "meta.group.toml" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.section.begin.toml" - }, - "2": { - "patterns": [ - { - "match": "[^\\s.]+", - "name": "entity.name.section.toml" - } - ] - }, - "3": { - "name": "punctuation.definition.section.begin.toml" - } - }, - "match": "^\\s*(\\[\\[)([^\\[\\]]*)(\\]\\])", - "name": "meta.group.double.toml" - } - ] - }, - "invalid": { - "match": "\\S+(\\s*(?=\\S))?", - "name": "invalid.illegal.not-allowed-here.toml" - }, - "key_pair": { - "patterns": [ - { - "begin": "([A-Za-z0-9_-]+)\\s*(=)\\s*", - "captures": { - "1": { - "name": "variable.other.key.toml" - }, - "2": { - "name": "punctuation.separator.key-value.toml" - } - }, - "end": "(?<=\\S)(?'\"%@`]]\n | [?:-] \\S\n )\n (\n [^\\s:]\n | : \\S\n | \\s+ (?![#\\s])\n )*\n \\s*\n :\n\t\t\t\t\t\t\t(\\s|$)\n )\n ", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n )\n ", - "patterns": [ - { - "include": "#flow-scalar-plain-out-implicit-type" - }, - { - "begin": "(?x)\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] \\S\n ", - "beginCaptures": { - "0": { - "name": "entity.name.tag.yaml" - } - }, - "contentName": "entity.name.tag.yaml", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n )\n ", - "name": "string.unquoted.plain.out.yaml" - } - ] - }, - { - "match": ":(?=\\s|$)", - "name": "punctuation.separator.key-value.mapping.yaml" - } - ] - }, - "block-scalar": { - "begin": "(?:(\\|)|(>))([1-9])?([-+])?(.*\\n?)", - "beginCaptures": { - "1": { - "name": "keyword.control.flow.block-scalar.literal.yaml" - }, - "2": { - "name": "keyword.control.flow.block-scalar.folded.yaml" - }, - "3": { - "name": "constant.numeric.indentation-indicator.yaml" - }, - "4": { - "name": "storage.modifier.chomping-indicator.yaml" - }, - "5": { - "patterns": [ - { - "include": "#comment" - }, - { - "match": ".+", - "name": "invalid.illegal.expected-comment-or-newline.yaml" - } - ] - } - }, - "end": "^(?=\\S)|(?!\\G)", - "patterns": [ - { - "begin": "^([ ]+)(?! )", - "end": "^(?!\\1|\\s*$)", - "name": "string.unquoted.block.yaml" - } - ] - }, - "block-sequence": { - "match": "(-)(?!\\S)", - "name": "punctuation.definition.block.sequence.item.yaml" - }, - "comment": { - "begin": "(?:(^[ \\t]*)|[ \\t]+)(?=#\\p{Print}*$)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.yaml" - } - }, - "end": "(?!\\G)", - "patterns": [ - { - "begin": "#", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.yaml" - } - }, - "end": "\\n", - "name": "comment.line.number-sign.yaml" - } - ] - }, - "directive": { - "begin": "^%", - "beginCaptures": { - "0": { - "name": "punctuation.definition.directive.begin.yaml" - } - }, - "end": "(?=$|[ \\t]+($|#))", - "name": "meta.directive.yaml", - "patterns": [ - { - "captures": { - "1": { - "name": "keyword.other.directive.yaml.yaml" - }, - "2": { - "name": "constant.numeric.yaml-version.yaml" - } - }, - "match": "\\G(YAML)[ \\t]+(\\d+\\.\\d+)" - }, - { - "captures": { - "1": { - "name": "keyword.other.directive.tag.yaml" - }, - "2": { - "name": "storage.type.tag-handle.yaml" - }, - "3": { - "name": "support.type.tag-prefix.yaml" - } - }, - "match": "(?x)\n \\G\n (TAG)\n (?:[ \\t]+\n ((?:!(?:[0-9A-Za-z\\-]*!)?))\n (?:[ \\t]+ (\n ! (?x: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )*\n | (?![,!\\[\\]{}]) (?x: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )+\n )\n )?\n )?\n " - }, - { - "captures": { - "1": { - "name": "support.other.directive.reserved.yaml" - }, - "2": { - "name": "string.unquoted.directive-name.yaml" - }, - "3": { - "name": "string.unquoted.directive-parameter.yaml" - } - }, - "match": "(?x) \\G (\\w+) (?:[ \\t]+ (\\w+) (?:[ \\t]+ (\\w+))? )?" - }, - { - "match": "\\S+", - "name": "invalid.illegal.unrecognized.yaml" - } - ] - }, - "flow-alias": { - "captures": { - "1": { - "name": "keyword.control.flow.alias.yaml" - }, - "2": { - "name": "punctuation.definition.alias.yaml" - }, - "3": { - "name": "variable.other.alias.yaml" - }, - "4": { - "name": "invalid.illegal.character.anchor.yaml" - } - }, - "match": "((\\*))([^\\s\\[\\]/{/},]+)([^\\s\\]},]\\S*)?" - }, - "flow-collection": { - "patterns": [ - { - "include": "#flow-sequence" - }, - { - "include": "#flow-mapping" - } - ] - }, - "flow-mapping": { - "begin": "\\{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.mapping.begin.yaml" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.mapping.end.yaml" - } - }, - "name": "meta.flow-mapping.yaml", - "patterns": [ - { - "include": "#prototype" - }, - { - "match": ",", - "name": "punctuation.separator.mapping.yaml" - }, - { - "include": "#flow-pair" - } - ] - }, - "flow-node": { - "patterns": [ - { - "include": "#prototype" - }, - { - "include": "#flow-alias" - }, - { - "include": "#flow-collection" - }, - { - "include": "#flow-scalar" - } - ] - }, - "flow-pair": { - "patterns": [ - { - "begin": "\\?", - "beginCaptures": { - "0": { - "name": "punctuation.definition.key-value.begin.yaml" - } - }, - "end": "(?=[},\\]])", - "name": "meta.flow-pair.explicit.yaml", - "patterns": [ - { - "include": "#prototype" - }, - { - "include": "#flow-pair" - }, - { - "include": "#flow-node" - }, - { - "begin": ":(?=\\s|$|[\\[\\]{},])", - "beginCaptures": { - "0": { - "name": "punctuation.separator.key-value.mapping.yaml" - } - }, - "end": "(?=[},\\]])", - "patterns": [ - { - "include": "#flow-value" - } - ] - } - ] - }, - { - "begin": "(?x)\n (?=\n (?:\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] [^\\s[\\[\\]{},]]\n )\n (\n [^\\s:[\\[\\]{},]]\n | : [^\\s[\\[\\]{},]]\n | \\s+ (?![#\\s])\n )*\n \\s*\n :\n\t\t\t\t\t\t\t(\\s|$)\n )\n ", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n | \\s* : [\\[\\]{},]\n | \\s* [\\[\\]{},]\n )\n ", - "name": "meta.flow-pair.key.yaml", - "patterns": [ - { - "include": "#flow-scalar-plain-in-implicit-type" - }, - { - "begin": "(?x)\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] [^\\s[\\[\\]{},]]\n ", - "beginCaptures": { - "0": { - "name": "entity.name.tag.yaml" - } - }, - "contentName": "entity.name.tag.yaml", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n | \\s* : [\\[\\]{},]\n | \\s* [\\[\\]{},]\n )\n ", - "name": "string.unquoted.plain.in.yaml" - } - ] - }, - { - "include": "#flow-node" - }, - { - "begin": ":(?=\\s|$|[\\[\\]{},])", - "captures": { - "0": { - "name": "punctuation.separator.key-value.mapping.yaml" - } - }, - "end": "(?=[},\\]])", - "name": "meta.flow-pair.yaml", - "patterns": [ - { - "include": "#flow-value" - } - ] - } - ] - }, - "flow-scalar": { - "patterns": [ - { - "include": "#flow-scalar-double-quoted" - }, - { - "include": "#flow-scalar-single-quoted" - }, - { - "include": "#flow-scalar-plain-in" - } - ] - }, - "flow-scalar-double-quoted": { - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.yaml" - } - }, - "end": "\"", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.yaml" - } - }, - "name": "string.quoted.double.yaml", - "patterns": [ - { - "match": "\\\\([0abtnvfre \"/\\\\N_Lp]|x\\d\\d|u\\d{4}|U\\d{8})", - "name": "constant.character.escape.yaml" - }, - { - "match": "\\\\\\n", - "name": "constant.character.escape.double-quoted.newline.yaml" - } - ] - }, - "flow-scalar-plain-in": { - "patterns": [ - { - "include": "#flow-scalar-plain-in-implicit-type" - }, - { - "begin": "(?x)\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] [^\\s[\\[\\]{},]]\n ", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n | \\s* : [\\[\\]{},]\n | \\s* [\\[\\]{},]\n )\n ", - "name": "string.unquoted.plain.in.yaml" - } - ] - }, - "flow-scalar-plain-in-implicit-type": { - "patterns": [ - { - "captures": { - "1": { - "name": "constant.language.null.yaml" - }, - "2": { - "name": "constant.language.boolean.yaml" - }, - "3": { - "name": "constant.numeric.integer.yaml" - }, - "4": { - "name": "constant.numeric.float.yaml" - }, - "5": { - "name": "constant.other.timestamp.yaml" - }, - "6": { - "name": "constant.language.value.yaml" - }, - "7": { - "name": "constant.language.merge.yaml" - } - }, - "match": "(?x)\n (?x:\n (null|Null|NULL|~)\n | (y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)\n | (\n (?:\n [-+]? 0b [0-1_]+ # (base 2)\n | [-+]? 0 [0-7_]+ # (base 8)\n | [-+]? (?: 0|[1-9][0-9_]*) # (base 10)\n | [-+]? 0x [0-9a-fA-F_]+ # (base 16)\n | [-+]? [1-9] [0-9_]* (?: :[0-5]?[0-9])+ # (base 60)\n )\n )\n | (\n (?x:\n [-+]? (?: [0-9] [0-9_]*)? \\. [0-9.]* (?: [eE] [-+] [0-9]+)? # (base 10)\n | [-+]? [0-9] [0-9_]* (?: :[0-5]?[0-9])+ \\. [0-9_]* # (base 60)\n | [-+]? \\. (?: inf|Inf|INF) # (infinity)\n | \\. (?: nan|NaN|NAN) # (not a number)\n )\n )\n | (\n (?x:\n \\d{4} - \\d{2} - \\d{2} # (y-m-d)\n | \\d{4} # (year)\n - \\d{1,2} # (month)\n - \\d{1,2} # (day)\n (?: [Tt] | [ \\t]+) \\d{1,2} # (hour)\n : \\d{2} # (minute)\n : \\d{2} # (second)\n (?: \\.\\d*)? # (fraction)\n (?:\n (?:[ \\t]*) Z\n | [-+] \\d{1,2} (?: :\\d{1,2})?\n )? # (time zone)\n )\n )\n | (=)\n | (<<)\n )\n (?:\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n | \\s* : [\\[\\]{},]\n | \\s* [\\[\\]{},]\n )\n )\n " - } - ] - }, - "flow-scalar-plain-out": { - "patterns": [ - { - "include": "#flow-scalar-plain-out-implicit-type" - }, - { - "begin": "(?x)\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] \\S\n ", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n )\n ", - "name": "string.unquoted.plain.out.yaml" - } - ] - }, - "flow-scalar-plain-out-implicit-type": { - "patterns": [ - { - "captures": { - "1": { - "name": "constant.language.null.yaml" - }, - "2": { - "name": "constant.language.boolean.yaml" - }, - "3": { - "name": "constant.numeric.integer.yaml" - }, - "4": { - "name": "constant.numeric.float.yaml" - }, - "5": { - "name": "constant.other.timestamp.yaml" - }, - "6": { - "name": "constant.language.value.yaml" - }, - "7": { - "name": "constant.language.merge.yaml" - } - }, - "match": "(?x)\n (?x:\n (null|Null|NULL|~)\n | (y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)\n | (\n (?:\n [-+]? 0b [0-1_]+ # (base 2)\n | [-+]? 0 [0-7_]+ # (base 8)\n | [-+]? (?: 0|[1-9][0-9_]*) # (base 10)\n | [-+]? 0x [0-9a-fA-F_]+ # (base 16)\n | [-+]? [1-9] [0-9_]* (?: :[0-5]?[0-9])+ # (base 60)\n )\n )\n | (\n (?x:\n [-+]? (?: [0-9] [0-9_]*)? \\. [0-9.]* (?: [eE] [-+] [0-9]+)? # (base 10)\n | [-+]? [0-9] [0-9_]* (?: :[0-5]?[0-9])+ \\. [0-9_]* # (base 60)\n | [-+]? \\. (?: inf|Inf|INF) # (infinity)\n | \\. (?: nan|NaN|NAN) # (not a number)\n )\n )\n | (\n (?x:\n \\d{4} - \\d{2} - \\d{2} # (y-m-d)\n | \\d{4} # (year)\n - \\d{1,2} # (month)\n - \\d{1,2} # (day)\n (?: [Tt] | [ \\t]+) \\d{1,2} # (hour)\n : \\d{2} # (minute)\n : \\d{2} # (second)\n (?: \\.\\d*)? # (fraction)\n (?:\n (?:[ \\t]*) Z\n | [-+] \\d{1,2} (?: :\\d{1,2})?\n )? # (time zone)\n )\n )\n | (=)\n | (<<)\n )\n (?x:\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n )\n )\n " - } - ] - }, - "flow-scalar-single-quoted": { - "begin": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.yaml" - } - }, - "end": "'(?!')", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.yaml" - } - }, - "name": "string.quoted.single.yaml", - "patterns": [ - { - "match": "''", - "name": "constant.character.escape.single-quoted.yaml" - } - ] - }, - "flow-sequence": { - "begin": "\\[", - "beginCaptures": { - "0": { - "name": "punctuation.definition.sequence.begin.yaml" - } - }, - "end": "\\]", - "endCaptures": { - "0": { - "name": "punctuation.definition.sequence.end.yaml" - } - }, - "name": "meta.flow-sequence.yaml", - "patterns": [ - { - "include": "#prototype" - }, - { - "match": ",", - "name": "punctuation.separator.sequence.yaml" - }, - { - "include": "#flow-pair" - }, - { - "include": "#flow-node" - } - ] - }, - "flow-value": { - "patterns": [ - { - "begin": "\\G(?![},\\]])", - "end": "(?=[},\\]])", - "name": "meta.flow-pair.value.yaml", - "patterns": [ - { - "include": "#flow-node" - } - ] - } - ] - }, - "node": { - "patterns": [ - { - "include": "#block-node" - } - ] - }, - "property": { - "begin": "(?=!|&)", - "end": "(?!\\G)", - "name": "meta.property.yaml", - "patterns": [ - { - "captures": { - "1": { - "name": "keyword.control.property.anchor.yaml" - }, - "2": { - "name": "punctuation.definition.anchor.yaml" - }, - "3": { - "name": "entity.name.type.anchor.yaml" - }, - "4": { - "name": "invalid.illegal.character.anchor.yaml" - } - }, - "match": "\\G((&))([^\\s\\[\\]/{/},]+)(\\S+)?" - }, - { - "match": "(?x)\n \\G\n (?:\n ! < (?: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )+ >\n | (?:!(?:[0-9A-Za-z\\-]*!)?) (?: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$_.~*'()] )+\n | !\n )\n (?=\\ |\\t|$)\n ", - "name": "storage.type.tag-handle.yaml" - }, - { - "match": "\\S+", - "name": "invalid.illegal.tag-handle.yaml" - } - ] - }, - "prototype": { - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#property" - } - ] - } - } -} From b03aec8b032211853f85fb438dfb1c40d2a8f98a Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 29 Oct 2021 15:50:16 -0600 Subject: [PATCH 237/680] name render timer with requested doc --- src/http/get-docs-000lang-catchall/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 7ea2f31d..7216919e 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -26,7 +26,9 @@ const algolia = require('@architect/views/modules/components/algolia.js').defaul const cache = {} // cheap warm cache async function handler (req) { - console.time('get-docs-000lang-catchall') + let timerName = `get-docs-000lang-catchall ${req.pathParameters.proxy}` + console.time(timerName) + let { pathParameters } = req let { lang, proxy } = pathParameters let parts = proxy.split('/') @@ -123,7 +125,7 @@ async function handler (req) { toc }) } - console.timeEnd('get-docs-000lang-catchall') + console.timeEnd(timerName) return retval } From 6c2174eb3e1f08427b2349a255b8a30257f8ab26 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 29 Oct 2021 15:50:34 -0600 Subject: [PATCH 238/680] 3.6.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7acc0f73..09e2b4f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.7", + "version": "3.6.8", "scripts": { "deploy": "./scripts/deploy", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 9d58dee3866a8113dca9ba79c9a9aaabab4fb6d5 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Mon, 1 Nov 2021 10:34:36 -0400 Subject: [PATCH 239/680] Switch to using syntaxes package --- package.json | 3 +-- src/http/get-docs-000lang-catchall/index.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 09e2b4f7..999a18eb 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,9 @@ "dependencies": { "@architect/asap": "^4.1.0", "@architect/functions": "^4.0.0", - "@architect/grammars": "github:architect/grammars", "@architect/inventory": "^2.1.1", "@architect/package": "^7.1.1", + "@architect/syntaxes": "github:architect/syntaxes#v1.2.0", "@toycode/markdown-it-class": "^1.2.4", "esm": "^3.2.25", "highlight.js": "^11.3.1", @@ -30,7 +30,6 @@ "@architect/architect": "^9.2.0", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary", - "@architect/syntaxes": "github:architect/syntaxes#v1.0.1", "eslint": "^8.1.0", "spellchecker-cli": "^4.8.0", "tap-spec": "^5.0.0", diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 7216919e..1fa1d63b 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -16,7 +16,7 @@ const hljs = require('highlight.js') const { escapeHtml } = Markdown().utils const highlight = require('./highlighter') .bind(null, hljs, escapeHtml) -const { arc } = require('@architect/grammars') +const arc = require('@architect/syntaxes/arc-grammar') hljs.registerLanguage('arc', arc) const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default From 21edd29bfcb98a13a0a287d350355be04a92122e Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Mon, 1 Nov 2021 10:45:15 -0400 Subject: [PATCH 240/680] 3.6.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 999a18eb..0b33310b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.8", + "version": "3.6.9", "scripts": { "deploy": "./scripts/deploy", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 8332a4e2175b0070101cfa87bc10fe73e36cae60 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Tue, 2 Nov 2021 08:29:42 -0400 Subject: [PATCH 241/680] 3.6.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0b33310b..1a5285b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.9", + "version": "3.6.11", "scripts": { "deploy": "./scripts/deploy", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 86fa94ff5b89ca910455a74709646f03cb99199e Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 1 Nov 2021 20:20:13 -0700 Subject: [PATCH 242/680] Add new hotness Architect Highlight.js grammar, get rid of unused files --- package.json | 4 +- scripts/dist.sh | 6 + .../arc-textmate.json | 152 ------------------ .../highlight/languages/arc.js | 60 +++++++ src/http/get-docs-000lang-catchall/index.js | 2 +- .../themes/atom-one-dark.json | 1 - .../themes/atom-one-light.json | 1 - .../docs/en/guides/extend/custom-iam-roles.md | 2 +- .../docs/en/guides/frontend/middleware.md | 2 +- 9 files changed, 71 insertions(+), 159 deletions(-) create mode 100755 scripts/dist.sh delete mode 100644 src/http/get-docs-000lang-catchall/arc-textmate.json create mode 100644 src/http/get-docs-000lang-catchall/highlight/languages/arc.js delete mode 100644 src/http/get-docs-000lang-catchall/themes/atom-one-dark.json delete mode 100644 src/http/get-docs-000lang-catchall/themes/atom-one-light.json diff --git a/package.json b/package.json index 1a5285b0..1fccf993 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@architect/arc.codes", "version": "3.6.11", "scripts": { - "deploy": "./scripts/deploy", + "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", "lint": "eslint src --fix", "start": "sandbox", @@ -15,7 +15,7 @@ "@architect/functions": "^4.0.0", "@architect/inventory": "^2.1.1", "@architect/package": "^7.1.1", - "@architect/syntaxes": "github:architect/syntaxes#v1.2.0", + "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "@toycode/markdown-it-class": "^1.2.4", "esm": "^3.2.25", "highlight.js": "^11.3.1", diff --git a/scripts/dist.sh b/scripts/dist.sh new file mode 100755 index 00000000..211b370c --- /dev/null +++ b/scripts/dist.sh @@ -0,0 +1,6 @@ +#!/bin/bash +echo "Copying Architect Highlight.js grammar from node_modules to get-docs-000lang-catchall/highlight..." +mkdir src/http/get-docs-000lang-catchall/highlight &> /dev/null +mkdir src/http/get-docs-000lang-catchall/highlight/languages &> /dev/null +cp node_modules/@architect/syntaxes/arc-hljs-grammar.js src/http/get-docs-000lang-catchall/highlight/languages/arc.js +echo "Done." diff --git a/src/http/get-docs-000lang-catchall/arc-textmate.json b/src/http/get-docs-000lang-catchall/arc-textmate.json deleted file mode 100644 index 0354ba0b..00000000 --- a/src/http/get-docs-000lang-catchall/arc-textmate.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "name": "Architect", - "scopeName": "source.arc", - "firstLineMatch": "^@[a-zA-Z0-9!$%^&*(){}\\[\\]<>\\-_\\+=\\|\\\\:;,\\.\\?/~]+", - "patterns": [ - { - "include": "#comments" - }, - { - "include": "#booleans" - }, - { - "include": "#numbers" - }, - { - "include": "#strings" - }, - { - "comment": "pragmas", - "name": "entity.name.function.arc", - "match": "^@[a-zA-Z0-9!$%^&*(){}\\[\\]<>\\-_\\+=\\|\\\\:;,\\.\\?/~]+" - }, - { - "comment": "map properties & implied vector values; map / vector names cannot be detected", - "begin": "(^[\\t ]{2})(?!#)([^#\\s]+)(?!\\s*#)(?=(([\\t ]+)\\S+))", - "beginCaptures": { - "0": { - "name": "variable.other.arc" - } - }, - "end": "(?=$|#)", - "patterns": [ - { - "include": "$self" - } - ] - } - ], - "repository": { - "comments": { - "patterns": [ - { - "name": "comment.line.arc", - "match": "#.*$" - } - ] - }, - "booleans": { - "patterns": [ - { - "name": "constant.language.boolean.true.arc", - "match": "(?<=\\s|^|\\G)(true)(?=\\s|#|$)" - }, - { - "name": "constant.language.boolean.false.arc", - "match": "(?<=\\s|^|\\G)(false)(?=\\s|#|$)" - } - ] - }, - "numbers": { - "patterns": [ - { - "name": "constant.numeric.decimal.arc", - "match": "(?<=\\s|^|\\G)((\\d*[.])?\\d+)(?=\\s|#|$)" - } - ] - }, - "strings": { - "patterns": [ - { - "name": "string.quoted.double.arc", - "begin": "(?<=\\s|^|\\G)(\")", - "beginCaptures": { - "0": { - "name": "string.quoted.double.arc" - } - }, - "end": "(\")(?=\\s|#|$)", - "endCaptures": { - "0": { - "name": "string.quoted.double.arc" - } - }, - "patterns": [ - { - "name": "string.quoted.double.arc", - "match": "(\\\\\")" - }, - { - "name": "invalid.illegal.arc", - "match": "\"" - } - ] - }, - { - "name": "string.quoted.single.arc", - "begin": "(?<=\\s|^|\\G)(')", - "beginCaptures": { - "0": { - "name": "string.quoted.single.arc" - } - }, - "end": "(')(?=\\s|#|$)", - "endCaptures": { - "0": { - "name": "string.quoted.single.arc" - } - }, - "patterns": [ - { - "name": "string.quoted.single.arc", - "match": "(\\\\')" - }, - { - "name": "invalid.illegal.arc", - "match": "'" - } - ] - }, - { - "name": "string.quoted.backtick.arc", - "begin": "(?<=\\s|^|\\G)(`)", - "beginCaptures": { - "0": { - "name": "string.quoted.backtick.arc" - } - }, - "end": "(`)(?=\\s|#|$)", - "endCaptures": { - "0": { - "name": "string.quoted.backtick.arc" - } - }, - "patterns": [ - { - "name": "string.quoted.backtick.arc", - "match": "(\\\\`)" - }, - { - "name": "invalid.illegal.arc", - "match": "`" - } - ] - }, - { - "name": "string.unquoted.arc", - "match": "(?<=\\s|^|\\G)([a-zA-Z0-9!$%^&*(){}\\[\\]<>\\-_\\+=\\|\\\\:;\"',\\.\\?/`~]+)(?=\\s|#|$)" - } - ] - } - } -} diff --git a/src/http/get-docs-000lang-catchall/highlight/languages/arc.js b/src/http/get-docs-000lang-catchall/highlight/languages/arc.js new file mode 100644 index 00000000..50859fb2 --- /dev/null +++ b/src/http/get-docs-000lang-catchall/highlight/languages/arc.js @@ -0,0 +1,60 @@ +let commentStart = '#.*$' +let booleans = { + scope: 'literal', + begin: '(?<=\\s|^|\\G)(true|false)', + end: '(?=\\s|#|$)' +} +let numbers = { + scope: 'number', + begin: '(?<=\\s|^|\\G)((\\d*[.])?\\d+)(?=\\s|#|$)', + end: '(?=\\s|#|$)' +} +let doubleQuotedStrings = { + scope: 'string', + begin: '(?<=\\s|^|\\G)(")', + end: '(")', + contains: [ { begin: '\\\\"' } ] +} +let singleQuotedStrings = { + scope: 'string', + begin: "(?<=\\s|^|\\G)(')", + end: "(')", + contains: [ { begin: "\\\\'" } ] +} +let backtickQuotedStrings = { + scope: 'string', + begin: '(?<=\\s|^|\\G)(`)', + end: '(`)', + contains: [ { begin: '\\\\`' } ] +} +let pragmas = { scope: 'title', begin: '^@[a-zA-Z0-9-_]+', end: '(?=\\s|#|$)' } +let mapVectorName = { + scope: 'variable', + begin: '(?<=^)(\\S+)(?=\\s|#|$)(?=#?[^\\r\\n]*[\\r\\n](^[\\t ]{2}\\S))', + end: '\\s' +} +let mapProperties = { + scope: 'property', + begin: '(^[\\t ]{2}[^#\\r\\n\\t ]+)(?=[\\t ]+[^#\\r\\n\\t ]+(?=\\s|#|$))', + end: '[\\t ]' +} +let string = { scope: 'string' } +module.exports = function index (hljs) { + return { + aliases: [ 'arc', 'architect' ], + case_insensitive: true, + contains: [ + booleans, + numbers, + doubleQuotedStrings, + singleQuotedStrings, + backtickQuotedStrings, + pragmas, + hljs.COMMENT(commentStart), + // Map / vector stuff goes after comments to ensure clean inline captures + mapVectorName, + mapProperties, + string, // String needs to be last, as anything not matched falls through to it + ] + } +} diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 1fa1d63b..6da5bd0f 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -16,7 +16,7 @@ const hljs = require('highlight.js') const { escapeHtml } = Markdown().utils const highlight = require('./highlighter') .bind(null, hljs, escapeHtml) -const arc = require('@architect/syntaxes/arc-grammar') +const arc = require('./highlight/languages/arc') hljs.registerLanguage('arc', arc) const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default diff --git a/src/http/get-docs-000lang-catchall/themes/atom-one-dark.json b/src/http/get-docs-000lang-catchall/themes/atom-one-dark.json deleted file mode 100644 index b294fbb3..00000000 --- a/src/http/get-docs-000lang-catchall/themes/atom-one-dark.json +++ /dev/null @@ -1 +0,0 @@ -{"author":"akamud","name":"OneDark","colors":{"activityBar.background":"#333842","activityBar.foreground":"#D7DAE0","activityBarBadge.background":"#528BFF","activityBarBadge.foreground":"#D7DAE0","button.background":"#4D78CC","button.foreground":"#FFFFFF","button.hoverBackground":"#6087CF","diffEditor.insertedTextBackground":"#00809B33","dropdown.background":"#353b45","dropdown.border":"#181A1F","editorIndentGuide.activeBackground":"#626772","editor.background":"#282C34","editor.foreground":"#ABB2BF","editor.lineHighlightBackground":"#99BBFF0A","editor.selectionBackground":"#3E4451","editorCursor.foreground":"#528BFF","editor.findMatchHighlightBackground":"#528BFF3D","editorGroup.background":"#21252B","editorGroup.border":"#181A1F","editorGroupHeader.tabsBackground":"#21252B","editorIndentGuide.background":"#ABB2BF26","editorLineNumber.foreground":"#636D83","editorLineNumber.activeForeground":"#ABB2BF","editorWhitespace.foreground":"#ABB2BF26","editorRuler.foreground":"#ABB2BF26","editorHoverWidget.background":"#21252B","editorHoverWidget.border":"#181A1F","editorSuggestWidget.background":"#21252B","editorSuggestWidget.border":"#181A1F","editorSuggestWidget.selectedBackground":"#2C313A","editorWidget.background":"#21252B","editorWidget.border":"#3A3F4B","input.background":"#1B1D23","input.border":"#181A1F","focusBorder":"#528BFF","list.activeSelectionBackground":"#2C313A","list.activeSelectionForeground":"#D7DAE0","list.focusBackground":"#2C313A","list.hoverBackground":"#2C313A66","list.highlightForeground":"#D7DAE0","list.inactiveSelectionBackground":"#2C313A","list.inactiveSelectionForeground":"#D7DAE0","notification.background":"#21252B","pickerGroup.border":"#528BFF","scrollbarSlider.background":"#4E566680","scrollbarSlider.activeBackground":"#747D9180","scrollbarSlider.hoverBackground":"#5A637580","sideBar.background":"#21252B","sideBarSectionHeader.background":"#333842","statusBar.background":"#21252B","statusBar.foreground":"#9DA5B4","statusBarItem.hoverBackground":"#2C313A","statusBar.noFolderBackground":"#21252B","tab.activeBackground":"#282C34","tab.activeForeground":"#D7DAE0","tab.border":"#181A1F","tab.inactiveBackground":"#21252B","titleBar.activeBackground":"#21252B","titleBar.activeForeground":"#9DA5B4","titleBar.inactiveBackground":"#21252B","titleBar.inactiveForeground":"#9DA5B4","statusBar.debuggingForeground":"#FFFFFF","extensionButton.prominentBackground":"#2BA143","extensionButton.prominentHoverBackground":"#37AF4E","badge.background":"#528BFF","badge.foreground":"#D7DAE0","peekView.border":"#528BFF","peekViewResult.background":"#21252B","peekViewResult.selectionBackground":"#2C313A","peekViewTitle.background":"#1B1D23","peekViewEditor.background":"#1B1D23"},"tokenColors":[{"name":"Comment","scope":["comment"],"settings":{"foreground":"#5C6370","fontStyle":"italic"}},{"name":"Comment Markup Link","scope":["comment markup.link"],"settings":{"foreground":"#5C6370"}},{"name":"Entity Name Type","scope":["entity.name.type"],"settings":{"foreground":"#E5C07B"}},{"name":"Entity Other Inherited Class","scope":["entity.other.inherited-class"],"settings":{"foreground":"#E5C07B"}},{"name":"Keyword","scope":["keyword"],"settings":{"foreground":"#C678DD"}},{"name":"Keyword Control","scope":["keyword.control"],"settings":{"foreground":"#C678DD"}},{"name":"Keyword Operator","scope":["keyword.operator"],"settings":{"foreground":"#C678DD"}},{"name":"Keyword Other Special Method","scope":["keyword.other.special-method"],"settings":{"foreground":"#61AFEF"}},{"name":"Keyword Other Unit","scope":["keyword.other.unit"],"settings":{"foreground":"#D19A66"}},{"name":"Storage","scope":["storage"],"settings":{"foreground":"#C678DD"}},{"name":"Storage Type Annotation,storage Type Primitive","scope":["storage.type.annotation","storage.type.primitive"],"settings":{"foreground":"#C678DD"}},{"name":"Storage Modifier Package,storage Modifier Import","scope":["storage.modifier.package","storage.modifier.import"],"settings":{"foreground":"#ABB2BF"}},{"name":"Constant","scope":["constant"],"settings":{"foreground":"#D19A66"}},{"name":"Constant Variable","scope":["constant.variable"],"settings":{"foreground":"#D19A66"}},{"name":"Constant Character Escape","scope":["constant.character.escape"],"settings":{"foreground":"#56B6C2"}},{"name":"Constant Numeric","scope":["constant.numeric"],"settings":{"foreground":"#D19A66"}},{"name":"Constant Other Color","scope":["constant.other.color"],"settings":{"foreground":"#56B6C2"}},{"name":"Constant Other Symbol","scope":["constant.other.symbol"],"settings":{"foreground":"#56B6C2"}},{"name":"Variable","scope":["variable"],"settings":{"foreground":"#E06C75"}},{"name":"Variable Interpolation","scope":["variable.interpolation"],"settings":{"foreground":"#BE5046"}},{"name":"Variable Parameter","scope":["variable.parameter"],"settings":{"foreground":"#ABB2BF"}},{"name":"String","scope":["string"],"settings":{"foreground":"#98C379"}},{"name":"String > Source,string Embedded","scope":["string > source","string embedded"],"settings":{"foreground":"#ABB2BF"}},{"name":"String Regexp","scope":["string.regexp"],"settings":{"foreground":"#56B6C2"}},{"name":"String Regexp Source Ruby Embedded","scope":["string.regexp source.ruby.embedded"],"settings":{"foreground":"#E5C07B"}},{"name":"String Other Link","scope":["string.other.link"],"settings":{"foreground":"#E06C75"}},{"name":"Punctuation Definition Comment","scope":["punctuation.definition.comment"],"settings":{"foreground":"#5C6370"}},{"name":"Punctuation Definition Method Parameters,punctuation Definition Function Parameters,punctuation Definition Parameters,punctuation Definition Separator,punctuation Definition Seperator,punctuation Definition Array","scope":["punctuation.definition.method-parameters","punctuation.definition.function-parameters","punctuation.definition.parameters","punctuation.definition.separator","punctuation.definition.seperator","punctuation.definition.array"],"settings":{"foreground":"#ABB2BF"}},{"name":"Punctuation Definition Heading,punctuation Definition Identity","scope":["punctuation.definition.heading","punctuation.definition.identity"],"settings":{"foreground":"#61AFEF"}},{"name":"Punctuation Definition Bold","scope":["punctuation.definition.bold"],"settings":{"foreground":"#E5C07B","fontStyle":"bold"}},{"name":"Punctuation Definition Italic","scope":["punctuation.definition.italic"],"settings":{"foreground":"#C678DD","fontStyle":"italic"}},{"name":"Punctuation Section Embedded","scope":["punctuation.section.embedded"],"settings":{"foreground":"#BE5046"}},{"name":"Punctuation Section Method,punctuation Section Class,punctuation Section Inner Class","scope":["punctuation.section.method","punctuation.section.class","punctuation.section.inner-class"],"settings":{"foreground":"#ABB2BF"}},{"name":"Support Class","scope":["support.class"],"settings":{"foreground":"#E5C07B"}},{"name":"Support Type","scope":["support.type"],"settings":{"foreground":"#56B6C2"}},{"name":"Support Function","scope":["support.function"],"settings":{"foreground":"#56B6C2"}},{"name":"Support Function Any Method","scope":["support.function.any-method"],"settings":{"foreground":"#61AFEF"}},{"name":"Entity Name Function","scope":["entity.name.function"],"settings":{"foreground":"#61AFEF"}},{"name":"Entity Name Class,entity Name Type Class","scope":["entity.name.class","entity.name.type.class"],"settings":{"foreground":"#E5C07B"}},{"name":"Entity Name Section","scope":["entity.name.section"],"settings":{"foreground":"#61AFEF"}},{"name":"Entity Name Tag","scope":["entity.name.tag"],"settings":{"foreground":"#E06C75"}},{"name":"Entity Other Attribute Name","scope":["entity.other.attribute-name"],"settings":{"foreground":"#D19A66"}},{"name":"Entity Other Attribute Name Id","scope":["entity.other.attribute-name.id"],"settings":{"foreground":"#61AFEF"}},{"name":"Meta Class","scope":["meta.class"],"settings":{"foreground":"#E5C07B"}},{"name":"Meta Class Body","scope":["meta.class.body"],"settings":{"foreground":"#ABB2BF"}},{"name":"Meta Method Call,meta Method","scope":["meta.method-call","meta.method"],"settings":{"foreground":"#ABB2BF"}},{"name":"Meta Definition Variable","scope":["meta.definition.variable"],"settings":{"foreground":"#E06C75"}},{"name":"Meta Link","scope":["meta.link"],"settings":{"foreground":"#D19A66"}},{"name":"Meta Require","scope":["meta.require"],"settings":{"foreground":"#61AFEF"}},{"name":"Meta Selector","scope":["meta.selector"],"settings":{"foreground":"#C678DD"}},{"name":"Meta Separator","scope":["meta.separator"],"settings":{"foreground":"#ABB2BF"}},{"name":"Meta Tag","scope":["meta.tag"],"settings":{"foreground":"#ABB2BF"}},{"name":"Underline","scope":["underline"],"settings":{"text-decoration":"underline"}},{"name":"None","scope":["none"],"settings":{"foreground":"#ABB2BF"}},{"name":"Invalid Deprecated","scope":["invalid.deprecated"],"settings":{"foreground":"#523D14","background":"#E0C285"}},{"name":"Invalid Illegal","scope":["invalid.illegal"],"settings":{"foreground":"white","background":"#E05252"}},{"name":"Markup Bold","scope":["markup.bold"],"settings":{"foreground":"#D19A66","fontStyle":"bold"}},{"name":"Markup Changed","scope":["markup.changed"],"settings":{"foreground":"#C678DD"}},{"name":"Markup Deleted","scope":["markup.deleted"],"settings":{"foreground":"#E06C75"}},{"name":"Markup Italic","scope":["markup.italic"],"settings":{"foreground":"#C678DD","fontStyle":"italic"}},{"name":"Markup Heading","scope":["markup.heading"],"settings":{"foreground":"#E06C75"}},{"name":"Markup Heading Punctuation Definition Heading","scope":["markup.heading punctuation.definition.heading"],"settings":{"foreground":"#61AFEF"}},{"name":"Markup Link","scope":["markup.link"],"settings":{"foreground":"#56B6C2"}},{"name":"Markup Inserted","scope":["markup.inserted"],"settings":{"foreground":"#98C379"}},{"name":"Markup Quote","scope":["markup.quote"],"settings":{"foreground":"#D19A66"}},{"name":"Markup Raw","scope":["markup.raw"],"settings":{"foreground":"#98C379"}},{"name":"Source C Keyword Operator","scope":["source.c keyword.operator"],"settings":{"foreground":"#C678DD"}},{"name":"Source Cpp Keyword Operator","scope":["source.cpp keyword.operator"],"settings":{"foreground":"#C678DD"}},{"name":"Source Cs Keyword Operator","scope":["source.cs keyword.operator"],"settings":{"foreground":"#C678DD"}},{"name":"Source Css Property Name,source Css Property Value","scope":["source.css property-name","source.css property-value"],"settings":{"foreground":"#828997"}},{"name":"Source Css Property Name Support,source Css Property Value Support","scope":["source.css property-name.support","source.css property-value.support"],"settings":{"foreground":"#ABB2BF"}},{"name":"Source Elixir Source Embedded Source","scope":["source.elixir source.embedded.source"],"settings":{"foreground":"#ABB2BF"}},{"name":"Source Elixir Constant Language,source Elixir Constant Numeric,source Elixir Constant Definition","scope":["source.elixir constant.language","source.elixir constant.numeric","source.elixir constant.definition"],"settings":{"foreground":"#61AFEF"}},{"name":"Source Elixir Variable Definition,source Elixir Variable Anonymous","scope":["source.elixir variable.definition","source.elixir variable.anonymous"],"settings":{"foreground":"#C678DD"}},{"name":"Source Elixir Parameter Variable Function","scope":["source.elixir parameter.variable.function"],"settings":{"foreground":"#D19A66","fontStyle":"italic"}},{"name":"Source Elixir Quoted","scope":["source.elixir quoted"],"settings":{"foreground":"#98C379"}},{"name":"Source Elixir Keyword Special Method,source Elixir Embedded Section,source Elixir Embedded Source Empty","scope":["source.elixir keyword.special-method","source.elixir embedded.section","source.elixir embedded.source.empty"],"settings":{"foreground":"#E06C75"}},{"name":"Source Elixir Readwrite Module Punctuation","scope":["source.elixir readwrite.module punctuation"],"settings":{"foreground":"#E06C75"}},{"name":"Source Elixir Regexp Section,source Elixir Regexp String","scope":["source.elixir regexp.section","source.elixir regexp.string"],"settings":{"foreground":"#BE5046"}},{"name":"Source Elixir Separator,source Elixir Keyword Operator","scope":["source.elixir separator","source.elixir keyword.operator"],"settings":{"foreground":"#D19A66"}},{"name":"Source Elixir Variable Constant","scope":["source.elixir variable.constant"],"settings":{"foreground":"#E5C07B"}},{"name":"Source Elixir Array,source Elixir Scope,source Elixir Section","scope":["source.elixir array","source.elixir scope","source.elixir section"],"settings":{"foreground":"#828997"}},{"name":"Source Gfm Markup","scope":["source.gfm markup"],"settings":{"-webkit-font-smoothing":"auto"}},{"name":"Source Gfm Link Entity","scope":["source.gfm link entity"],"settings":{"foreground":"#61AFEF"}},{"name":"Source Go Storage Type String","scope":["source.go storage.type.string"],"settings":{"foreground":"#C678DD"}},{"name":"Source Ini Keyword Other Definition Ini","scope":["source.ini keyword.other.definition.ini"],"settings":{"foreground":"#E06C75"}},{"name":"Source Java Storage Modifier Import","scope":["source.java storage.modifier.import"],"settings":{"foreground":"#E5C07B"}},{"name":"Source Java Storage Type","scope":["source.java storage.type"],"settings":{"foreground":"#E5C07B"}},{"name":"Source Java Keyword Operator Instanceof","scope":["source.java keyword.operator.instanceof"],"settings":{"foreground":"#C678DD"}},{"name":"Source Java Properties Meta Key Pair","scope":["source.java-properties meta.key-pair"],"settings":{"foreground":"#E06C75"}},{"name":"Source Java Properties Meta Key Pair > Punctuation","scope":["source.java-properties meta.key-pair > punctuation"],"settings":{"foreground":"#ABB2BF"}},{"name":"Source Js Keyword Operator","scope":["source.js keyword.operator"],"settings":{"foreground":"#56B6C2"}},{"name":"Source Js Keyword Operator Delete,source Js Keyword Operator In,source Js Keyword Operator Of,source Js Keyword Operator Instanceof,source Js Keyword Operator New,source Js Keyword Operator Typeof,source Js Keyword Operator Void","scope":["source.js keyword.operator.delete","source.js keyword.operator.in","source.js keyword.operator.of","source.js keyword.operator.instanceof","source.js keyword.operator.new","source.js keyword.operator.typeof","source.js keyword.operator.void"],"settings":{"foreground":"#C678DD"}},{"name":"Source Ts Keyword Operator","scope":["source.ts keyword.operator"],"settings":{"foreground":"#56B6C2"}},{"name":"Source Flow Keyword Operator","scope":["source.flow keyword.operator"],"settings":{"foreground":"#56B6C2"}},{"name":"Source Json Meta Structure Dictionary Json > String Quoted Json","scope":["source.json meta.structure.dictionary.json > string.quoted.json"],"settings":{"foreground":"#E06C75"}},{"name":"Source Json Meta Structure Dictionary Json > String Quoted Json > Punctuation String","scope":["source.json meta.structure.dictionary.json > string.quoted.json > punctuation.string"],"settings":{"foreground":"#E06C75"}},{"name":"Source Json Meta Structure Dictionary Json > Value Json > String Quoted Json,source Json Meta Structure Array Json > Value Json > String Quoted Json,source Json Meta Structure Dictionary Json > Value Json > String Quoted Json > Punctuation,source Json Meta Structure Array Json > Value Json > String Quoted Json > Punctuation","scope":["source.json meta.structure.dictionary.json > value.json > string.quoted.json","source.json meta.structure.array.json > value.json > string.quoted.json","source.json meta.structure.dictionary.json > value.json > string.quoted.json > punctuation","source.json meta.structure.array.json > value.json > string.quoted.json > punctuation"],"settings":{"foreground":"#98C379"}},{"name":"Source Json Meta Structure Dictionary Json > Constant Language Json,source Json Meta Structure Array Json > Constant Language Json","scope":["source.json meta.structure.dictionary.json > constant.language.json","source.json meta.structure.array.json > constant.language.json"],"settings":{"foreground":"#56B6C2"}},{"name":"Ng Interpolation","scope":["ng.interpolation"],"settings":{"foreground":"#E06C75"}},{"name":"Ng Interpolation Begin,ng Interpolation End","scope":["ng.interpolation.begin","ng.interpolation.end"],"settings":{"foreground":"#61AFEF"}},{"name":"Ng Interpolation Function","scope":["ng.interpolation function"],"settings":{"foreground":"#E06C75"}},{"name":"Ng Interpolation Function Begin,ng Interpolation Function End","scope":["ng.interpolation function.begin","ng.interpolation function.end"],"settings":{"foreground":"#61AFEF"}},{"name":"Ng Interpolation Bool","scope":["ng.interpolation bool"],"settings":{"foreground":"#D19A66"}},{"name":"Ng Interpolation Bracket","scope":["ng.interpolation bracket"],"settings":{"foreground":"#ABB2BF"}},{"name":"Ng Pipe,ng Operator","scope":["ng.pipe","ng.operator"],"settings":{"foreground":"#ABB2BF"}},{"name":"Ng Tag","scope":["ng.tag"],"settings":{"foreground":"#56B6C2"}},{"name":"Ng Attribute With Value Attribute Name","scope":["ng.attribute-with-value attribute-name"],"settings":{"foreground":"#E5C07B"}},{"name":"Ng Attribute With Value String","scope":["ng.attribute-with-value string"],"settings":{"foreground":"#C678DD"}},{"name":"Ng Attribute With Value String Begin,ng Attribute With Value String End","scope":["ng.attribute-with-value string.begin","ng.attribute-with-value string.end"],"settings":{"foreground":"#ABB2BF"}},{"name":"Source Ruby Constant Other Symbol > Punctuation","scope":["source.ruby constant.other.symbol > punctuation"],"settings":{"foreground":"inherit"}},{"name":"Source Php Class Bracket","scope":["source.php class.bracket"],"settings":{"foreground":"#ABB2BF"}},{"name":"Source Python Keyword Operator Logical Python","scope":["source.python keyword.operator.logical.python"],"settings":{"foreground":"#C678DD"}},{"name":"Source Python Variable Parameter","scope":["source.python variable.parameter"],"settings":{"foreground":"#D19A66"}},{"name":"customrule","scope":"customrule","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Support Type Property Name","scope":"support.type.property-name","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Punctuation for Quoted String","scope":"string.quoted.double punctuation","settings":{"foreground":"#98C379"}},{"name":"[VSCODE-CUSTOM] Support Constant","scope":"support.constant","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] JSON Property Name","scope":"support.type.property-name.json","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JSON Punctuation for Property Name","scope":"support.type.property-name.json punctuation","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation for key-value","scope":["punctuation.separator.key-value.ts","punctuation.separator.key-value.js","punctuation.separator.key-value.tsx"],"settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] JS/TS Embedded Operator","scope":["source.js.embedded.html keyword.operator","source.ts.embedded.html keyword.operator"],"settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] JS/TS Variable Other Readwrite","scope":["variable.other.readwrite.js","variable.other.readwrite.ts","variable.other.readwrite.tsx"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Support Variable Dom","scope":["support.variable.dom.js","support.variable.dom.ts"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JS/TS Support Variable Property Dom","scope":["support.variable.property.dom.js","support.variable.property.dom.ts"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JS/TS Interpolation String Punctuation","scope":["meta.template.expression.js punctuation.definition","meta.template.expression.ts punctuation.definition"],"settings":{"foreground":"#BE5046"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Type Parameters","scope":["source.ts punctuation.definition.typeparameters","source.js punctuation.definition.typeparameters","source.tsx punctuation.definition.typeparameters"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Definition Block","scope":["source.ts punctuation.definition.block","source.js punctuation.definition.block","source.tsx punctuation.definition.block"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Separator Comma","scope":["source.ts punctuation.separator.comma","source.js punctuation.separator.comma","source.tsx punctuation.separator.comma"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Variable Property","scope":["support.variable.property.js","support.variable.property.ts","support.variable.property.tsx"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JS/TS Default Keyword","scope":["keyword.control.default.js","keyword.control.default.ts","keyword.control.default.tsx"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JS/TS Instanceof Keyword","scope":["keyword.operator.expression.instanceof.js","keyword.operator.expression.instanceof.ts","keyword.operator.expression.instanceof.tsx"],"settings":{"foreground":"#C678DD"}},{"name":"[VSCODE-CUSTOM] JS/TS Of Keyword","scope":["keyword.operator.expression.of.js","keyword.operator.expression.of.ts","keyword.operator.expression.of.tsx"],"settings":{"foreground":"#C678DD"}},{"name":"[VSCODE-CUSTOM] JS/TS Braces/Brackets","scope":["meta.brace.round.js","meta.array-binding-pattern-variable.js","meta.brace.square.js","meta.brace.round.ts","meta.array-binding-pattern-variable.ts","meta.brace.square.ts","meta.brace.round.tsx","meta.array-binding-pattern-variable.tsx","meta.brace.square.tsx"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Accessor","scope":["source.js punctuation.accessor","source.ts punctuation.accessor","source.tsx punctuation.accessor"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Terminator Statement","scope":["punctuation.terminator.statement.js","punctuation.terminator.statement.ts","punctuation.terminator.statement.tsx"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Array variables","scope":["meta.array-binding-pattern-variable.js variable.other.readwrite.js","meta.array-binding-pattern-variable.ts variable.other.readwrite.ts","meta.array-binding-pattern-variable.tsx variable.other.readwrite.tsx"],"settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] JS/TS Support Variables","scope":["source.js support.variable","source.ts support.variable","source.tsx support.variable"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JS/TS Support Variables","scope":["variable.other.constant.property.js","variable.other.constant.property.ts","variable.other.constant.property.tsx"],"settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] JS/TS Keyword New","scope":["keyword.operator.new.ts","keyword.operator.new.j","keyword.operator.new.tsx"],"settings":{"foreground":"#C678DD"}},{"name":"[VSCODE-CUSTOM] TS Keyword Operator","scope":["source.ts keyword.operator","source.tsx keyword.operator"],"settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Parameter Separator","scope":["punctuation.separator.parameter.js","punctuation.separator.parameter.ts","punctuation.separator.parameter.tsx "],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Import","scope":["constant.language.import-export-all.js","constant.language.import-export-all.ts"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JSX/TSX Import","scope":["constant.language.import-export-all.jsx","constant.language.import-export-all.tsx"],"settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] JS/TS Keyword Control As","scope":["keyword.control.as.js","keyword.control.as.ts","keyword.control.as.jsx","keyword.control.as.tsx"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Variable Alias","scope":["variable.other.readwrite.alias.js","variable.other.readwrite.alias.ts","variable.other.readwrite.alias.jsx","variable.other.readwrite.alias.tsx"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JS/TS Constants","scope":["variable.other.constant.js","variable.other.constant.ts","variable.other.constant.jsx","variable.other.constant.tsx"],"settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] JS/TS Export Variable","scope":["meta.export.default.js variable.other.readwrite.js","meta.export.default.ts variable.other.readwrite.ts"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JS/TS Template Strings Punctuation Accessor","scope":["source.js meta.template.expression.js punctuation.accessor","source.ts meta.template.expression.ts punctuation.accessor","source.tsx meta.template.expression.tsx punctuation.accessor"],"settings":{"foreground":"#98C379"}},{"name":"[VSCODE-CUSTOM] JS/TS Import equals","scope":["source.js meta.import-equals.external.js keyword.operator","source.jsx meta.import-equals.external.jsx keyword.operator","source.ts meta.import-equals.external.ts keyword.operator","source.tsx meta.import-equals.external.tsx keyword.operator"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Type Module","scope":"entity.name.type.module.js,entity.name.type.module.ts,entity.name.type.module.jsx,entity.name.type.module.tsx","settings":{"foreground":"#98C379"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Class","scope":"meta.class.js,meta.class.ts,meta.class.jsx,meta.class.tsx","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Property Definition Variable","scope":["meta.definition.property.js variable","meta.definition.property.ts variable","meta.definition.property.jsx variable","meta.definition.property.tsx variable"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Type Parameters Type","scope":["meta.type.parameters.js support.type","meta.type.parameters.jsx support.type","meta.type.parameters.ts support.type","meta.type.parameters.tsx support.type"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Tag Keyword Operator","scope":["source.js meta.tag.js keyword.operator","source.jsx meta.tag.jsx keyword.operator","source.ts meta.tag.ts keyword.operator","source.tsx meta.tag.tsx keyword.operator"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Tag Punctuation","scope":["meta.tag.js punctuation.section.embedded","meta.tag.jsx punctuation.section.embedded","meta.tag.ts punctuation.section.embedded","meta.tag.tsx punctuation.section.embedded"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Array Literal Variable","scope":["meta.array.literal.js variable","meta.array.literal.jsx variable","meta.array.literal.ts variable","meta.array.literal.tsx variable"],"settings":{"foreground":"#E5C07B"}},{"name":"[VSCODE-CUSTOM] JS/TS Module Exports","scope":["support.type.object.module.js","support.type.object.module.jsx","support.type.object.module.ts","support.type.object.module.tsx"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] JSON Constants","scope":["constant.language.json"],"settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] JS/TS Object Constants","scope":["variable.other.constant.object.js","variable.other.constant.object.jsx","variable.other.constant.object.ts","variable.other.constant.object.tsx"],"settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] JS/TS Properties Keyword","scope":["storage.type.property.js","storage.type.property.jsx","storage.type.property.ts","storage.type.property.tsx"],"settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] JS/TS Single Quote Inside Templated String","scope":["meta.template.expression.js string.quoted punctuation.definition","meta.template.expression.jsx string.quoted punctuation.definition","meta.template.expression.ts string.quoted punctuation.definition","meta.template.expression.tsx string.quoted punctuation.definition"],"settings":{"foreground":"#98C379"}},{"name":"[VSCODE-CUSTOM] JS/TS Backtick inside Templated String","scope":["meta.template.expression.js string.template punctuation.definition.string.template","meta.template.expression.jsx string.template punctuation.definition.string.template","meta.template.expression.ts string.template punctuation.definition.string.template","meta.template.expression.tsx string.template punctuation.definition.string.template"],"settings":{"foreground":"#98C379"}},{"name":"[VSCODE-CUSTOM] JS/TS In Keyword for Loops","scope":["keyword.operator.expression.in.js","keyword.operator.expression.in.jsx","keyword.operator.expression.in.ts","keyword.operator.expression.in.tsx"],"settings":{"foreground":"#C678DD"}},{"name":"[VSCODE-CUSTOM] JS/TS Variable Other Object","scope":["variable.other.object.js","variable.other.object.ts"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Object Literal Key","scope":["meta.object-literal.key.js","meta.object-literal.key.ts"],"settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] Python Constants Other","scope":"source.python constant.other","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Python Constants","scope":"source.python constant","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Python Placeholder Character","scope":"constant.character.format.placeholder.other.python storage","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Python Magic","scope":"support.variable.magic.python","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] Python Meta Function Parameters","scope":"meta.function.parameters.python","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Python Function Separator Annotation","scope":"punctuation.separator.annotation.python","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Python Function Separator Punctuation","scope":"punctuation.separator.parameters.python","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] CSharp Fields","scope":"entity.name.variable.field.cs","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] CSharp Keyword Operators","scope":"source.cs keyword.operator","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] CSharp Variables","scope":"variable.other.readwrite.cs","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] CSharp Variables Other","scope":"variable.other.object.cs","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] CSharp Property Other","scope":"variable.other.object.property.cs","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] CSharp Property","scope":"entity.name.variable.property.cs","settings":{"foreground":"#61AFEF"}},{"name":"[VSCODE-CUSTOM] CSharp Storage Type","scope":"storage.type.cs","settings":{"foreground":"#E5C07B"}},{"name":"[VSCODE-CUSTOM] Rust Unsafe Keyword","scope":"keyword.other.unsafe.rust","settings":{"foreground":"#C678DD"}},{"name":"[VSCODE-CUSTOM] Rust Entity Name Type","scope":"entity.name.type.rust","settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] Rust Storage Modifier Lifetime","scope":"storage.modifier.lifetime.rust","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Rust Entity Name Lifetime","scope":"entity.name.lifetime.rust","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Rust Storage Type Core","scope":"storage.type.core.rust","settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] Rust Meta Attribute","scope":"meta.attribute.rust","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Rust Storage Class Std","scope":"storage.class.std.rust","settings":{"foreground":"#56B6C2"}},{"name":"[VSCODE-CUSTOM] Markdown Raw Block","scope":"markup.raw.block.markdown","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Shell Variables Punctuation Definition","scope":"punctuation.definition.variable.shell","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] Css Support Constant Value","scope":"support.constant.property-value.css","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Css Punctuation Definition Constant","scope":"punctuation.definition.constant.css","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Sass Punctuation for key-value","scope":"punctuation.separator.key-value.scss","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] Sass Punctuation for constants","scope":"punctuation.definition.constant.scss","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Sass Punctuation for key-value","scope":"meta.property-list.scss punctuation.separator.key-value.scss","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Java Storage Type Primitive Array","scope":"storage.type.primitive.array.java","settings":{"foreground":"#E5C07B"}},{"name":"[VSCODE-CUSTOM] Markdown headings","scope":"entity.name.section.markdown","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] Markdown heading Punctuation Definition","scope":"punctuation.definition.heading.markdown","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] Markdown heading setext","scope":"markup.heading.setext","settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Markdown Punctuation Definition Bold","scope":"punctuation.definition.bold.markdown","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Markdown Inline Raw","scope":"markup.inline.raw.markdown","settings":{"foreground":"#98C379"}},{"name":"[VSCODE-CUSTOM] Markdown List Punctuation Definition","scope":"beginning.punctuation.definition.list.markdown","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] Markdown Quote","scope":"markup.quote.markdown","settings":{"foreground":"#5C6370","fontStyle":"italic"}},{"name":"[VSCODE-CUSTOM] Markdown Punctuation Definition String","scope":["punctuation.definition.string.begin.markdown","punctuation.definition.string.end.markdown","punctuation.definition.metadata.markdown"],"settings":{"foreground":"#ABB2BF"}},{"name":"[VSCODE-CUSTOM] Markdown Punctuation Definition Link","scope":"punctuation.definition.metadata.markdown","settings":{"foreground":"#C678DD"}},{"name":"[VSCODE-CUSTOM] Markdown Underline Link/Image","scope":["markup.underline.link.markdown","markup.underline.link.image.markdown"],"settings":{"foreground":"#C678DD"}},{"name":"[VSCODE-CUSTOM] Markdown Link Title/Description","scope":["string.other.link.title.markdown","string.other.link.description.markdown"],"settings":{"foreground":"#61AFEF"}},{"name":"[VSCODE-CUSTOM] Ruby Punctuation Separator Variable","scope":"punctuation.separator.variable.ruby","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] Ruby Other Constant Variable","scope":"variable.other.constant.ruby","settings":{"foreground":"#D19A66"}},{"name":"[VSCODE-CUSTOM] Ruby Keyword Operator Other","scope":"keyword.operator.other.ruby","settings":{"foreground":"#98C379"}},{"name":"[VSCODE-CUSTOM] PHP Punctuation Variable Definition","scope":"punctuation.definition.variable.php","settings":{"foreground":"#E06C75"}},{"name":"[VSCODE-CUSTOM] PHP Meta Class","scope":"meta.class.php","settings":{"foreground":"#ABB2BF"}}],"uuid":"32bd64fa-d60a-4858-a5fc-5164cc49a2b8"} diff --git a/src/http/get-docs-000lang-catchall/themes/atom-one-light.json b/src/http/get-docs-000lang-catchall/themes/atom-one-light.json deleted file mode 100644 index 235d8613..00000000 --- a/src/http/get-docs-000lang-catchall/themes/atom-one-light.json +++ /dev/null @@ -1 +0,0 @@ -{"author":"akamud","name":"OneLight","colors":{"activityBar.background":"#FAFAFA","activityBar.foreground":"#121417","activityBarBadge.background":"#526FFF","activityBarBadge.foreground":"#FFFFFF","button.background":"#5871EF","button.foreground":"#FFFFFF","button.hoverBackground":"#6B83ED","diffEditor.insertedTextBackground":"#00809B33","dropdown.background":"#FFFFFF","dropdown.border":"#DBDBDC","editorIndentGuide.activeBackground":"#626772","editor.background":"#FAFAFA","editor.foreground":"#383A42","editor.lineHighlightBackground":"#383A420C","editor.selectionBackground":"#E5E5E6","editorCursor.foreground":"#526FFF","editor.findMatchHighlightBackground":"#526FFF33","editorGroup.background":"#EAEAEB","editorGroup.border":"#DBDBDC","editorGroupHeader.tabsBackground":"#EAEAEB","editorIndentGuide.background":"#383A4233","editorLineNumber.foreground":"#9D9D9F","editorLineNumber.activeForeground":"#383A42","editorWhitespace.foreground":"#383A4233","editorRuler.foreground":"#383A4233","editorHoverWidget.background":"#EAEAEB","editorHoverWidget.border":"#DBDBDC","editorSuggestWidget.background":"#EAEAEB","editorSuggestWidget.border":"#DBDBDC","editorSuggestWidget.selectedBackground":"#FFFFFF","editorWidget.background":"#EAEAEB","editorWidget.border":"#E5E5E6","input.background":"#FFFFFF","input.border":"#DBDBDC","focusBorder":"#526FFF","list.activeSelectionBackground":"#DBDBDC","list.activeSelectionForeground":"#232324","list.focusBackground":"#DBDBDC","list.hoverBackground":"#DBDBDC66","list.highlightForeground":"#121417","list.inactiveSelectionBackground":"#DBDBDC","list.inactiveSelectionForeground":"#232324","notification.background":"#333333","pickerGroup.border":"#526FFF","scrollbarSlider.background":"#4E566680","scrollbarSlider.activeBackground":"#747D9180","scrollbarSlider.hoverBackground":"#5A637580","sideBar.background":"#EAEAEB","sideBarSectionHeader.background":"#FAFAFA","statusBar.background":"#EAEAEB","statusBar.foreground":"#424243","statusBarItem.hoverBackground":"#DBDBDC","statusBar.noFolderBackground":"#EAEAEB","tab.activeBackground":"#FAFAFA","tab.activeForeground":"#121417","tab.border":"#DBDBDC","tab.inactiveBackground":"#EAEAEB","titleBar.activeBackground":"#EAEAEB","titleBar.activeForeground":"#424243","titleBar.inactiveBackground":"#EAEAEB","titleBar.inactiveForeground":"#424243","statusBar.debuggingForeground":"#FFFFFF","extensionButton.prominentBackground":"#3BBA54","extensionButton.prominentHoverBackground":"#4CC263","badge.background":"#526FFF","badge.foreground":"#FFFFFF","peekView.border":"#526FFF","peekViewResult.background":"#EAEAEB","peekViewResult.selectionBackground":"#DBDBDC","peekViewTitle.background":"#FFFFFF","peekViewEditor.background":"#FFFFFF"},"tokenColors":[{"name":"Comment","scope":["comment"],"settings":{"foreground":"#A0A1A7","fontStyle":"italic"}},{"name":"Comment Markup Link","scope":["comment markup.link"],"settings":{"foreground":"#A0A1A7"}},{"name":"Entity Name Type","scope":["entity.name.type"],"settings":{"foreground":"#C18401"}},{"name":"Entity Other Inherited Class","scope":["entity.other.inherited-class"],"settings":{"foreground":"#C18401"}},{"name":"Keyword","scope":["keyword"],"settings":{"foreground":"#A626A4"}},{"name":"Keyword Control","scope":["keyword.control"],"settings":{"foreground":"#A626A4"}},{"name":"Keyword Operator","scope":["keyword.operator"],"settings":{"foreground":"#383A42"}},{"name":"Keyword Other Special Method","scope":["keyword.other.special-method"],"settings":{"foreground":"#4078F2"}},{"name":"Keyword Other Unit","scope":["keyword.other.unit"],"settings":{"foreground":"#986801"}},{"name":"Storage","scope":["storage"],"settings":{"foreground":"#A626A4"}},{"name":"Storage Type Annotation,storage Type Primitive","scope":["storage.type.annotation","storage.type.primitive"],"settings":{"foreground":"#A626A4"}},{"name":"Storage Modifier Package,storage Modifier Import","scope":["storage.modifier.package","storage.modifier.import"],"settings":{"foreground":"#383A42"}},{"name":"Constant","scope":["constant"],"settings":{"foreground":"#986801"}},{"name":"Constant Variable","scope":["constant.variable"],"settings":{"foreground":"#986801"}},{"name":"Constant Character Escape","scope":["constant.character.escape"],"settings":{"foreground":"#0184BC"}},{"name":"Constant Numeric","scope":["constant.numeric"],"settings":{"foreground":"#986801"}},{"name":"Constant Other Color","scope":["constant.other.color"],"settings":{"foreground":"#0184BC"}},{"name":"Constant Other Symbol","scope":["constant.other.symbol"],"settings":{"foreground":"#0184BC"}},{"name":"Variable","scope":["variable"],"settings":{"foreground":"#E45649"}},{"name":"Variable Interpolation","scope":["variable.interpolation"],"settings":{"foreground":"#CA1243"}},{"name":"Variable Parameter","scope":["variable.parameter"],"settings":{"foreground":"#383A42"}},{"name":"String","scope":["string"],"settings":{"foreground":"#50A14F"}},{"name":"String > Source,string Embedded","scope":["string > source","string embedded"],"settings":{"foreground":"#383A42"}},{"name":"String Regexp","scope":["string.regexp"],"settings":{"foreground":"#0184BC"}},{"name":"String Regexp Source Ruby Embedded","scope":["string.regexp source.ruby.embedded"],"settings":{"foreground":"#C18401"}},{"name":"String Other Link","scope":["string.other.link"],"settings":{"foreground":"#E45649"}},{"name":"Punctuation Definition Comment","scope":["punctuation.definition.comment"],"settings":{"foreground":"#A0A1A7"}},{"name":"Punctuation Definition Method Parameters,punctuation Definition Function Parameters,punctuation Definition Parameters,punctuation Definition Separator,punctuation Definition Seperator,punctuation Definition Array","scope":["punctuation.definition.method-parameters","punctuation.definition.function-parameters","punctuation.definition.parameters","punctuation.definition.separator","punctuation.definition.seperator","punctuation.definition.array"],"settings":{"foreground":"#383A42"}},{"name":"Punctuation Definition Heading,punctuation Definition Identity","scope":["punctuation.definition.heading","punctuation.definition.identity"],"settings":{"foreground":"#4078F2"}},{"name":"Punctuation Definition Bold","scope":["punctuation.definition.bold"],"settings":{"foreground":"#C18401","fontStyle":"bold"}},{"name":"Punctuation Definition Italic","scope":["punctuation.definition.italic"],"settings":{"foreground":"#A626A4","fontStyle":"italic"}},{"name":"Punctuation Section Embedded","scope":["punctuation.section.embedded"],"settings":{"foreground":"#CA1243"}},{"name":"Punctuation Section Method,punctuation Section Class,punctuation Section Inner Class","scope":["punctuation.section.method","punctuation.section.class","punctuation.section.inner-class"],"settings":{"foreground":"#383A42"}},{"name":"Support Class","scope":["support.class"],"settings":{"foreground":"#C18401"}},{"name":"Support Type","scope":["support.type"],"settings":{"foreground":"#0184BC"}},{"name":"Support Function","scope":["support.function"],"settings":{"foreground":"#0184BC"}},{"name":"Support Function Any Method","scope":["support.function.any-method"],"settings":{"foreground":"#4078F2"}},{"name":"Entity Name Function","scope":["entity.name.function"],"settings":{"foreground":"#4078F2"}},{"name":"Entity Name Class,entity Name Type Class","scope":["entity.name.class","entity.name.type.class"],"settings":{"foreground":"#C18401"}},{"name":"Entity Name Section","scope":["entity.name.section"],"settings":{"foreground":"#4078F2"}},{"name":"Entity Name Tag","scope":["entity.name.tag"],"settings":{"foreground":"#E45649"}},{"name":"Entity Other Attribute Name","scope":["entity.other.attribute-name"],"settings":{"foreground":"#986801"}},{"name":"Entity Other Attribute Name Id","scope":["entity.other.attribute-name.id"],"settings":{"foreground":"#4078F2"}},{"name":"Meta Class","scope":["meta.class"],"settings":{"foreground":"#C18401"}},{"name":"Meta Class Body","scope":["meta.class.body"],"settings":{"foreground":"#383A42"}},{"name":"Meta Method Call,meta Method","scope":["meta.method-call","meta.method"],"settings":{"foreground":"#383A42"}},{"name":"Meta Definition Variable","scope":["meta.definition.variable"],"settings":{"foreground":"#E45649"}},{"name":"Meta Link","scope":["meta.link"],"settings":{"foreground":"#986801"}},{"name":"Meta Require","scope":["meta.require"],"settings":{"foreground":"#4078F2"}},{"name":"Meta Selector","scope":["meta.selector"],"settings":{"foreground":"#A626A4"}},{"name":"Meta Separator","scope":["meta.separator"],"settings":{"foreground":"#383A42"}},{"name":"Meta Tag","scope":["meta.tag"],"settings":{"foreground":"#383A42"}},{"name":"Underline","scope":["underline"],"settings":{"text-decoration":"underline"}},{"name":"None","scope":["none"],"settings":{"foreground":"#383A42"}},{"name":"Invalid Deprecated","scope":["invalid.deprecated"],"settings":{"foreground":"#000000","background":"#F2A60D"}},{"name":"Invalid Illegal","scope":["invalid.illegal"],"settings":{"foreground":"white","background":"#FF1414"}},{"name":"Markup Bold","scope":["markup.bold"],"settings":{"foreground":"#986801","fontStyle":"bold"}},{"name":"Markup Changed","scope":["markup.changed"],"settings":{"foreground":"#A626A4"}},{"name":"Markup Deleted","scope":["markup.deleted"],"settings":{"foreground":"#E45649"}},{"name":"Markup Italic","scope":["markup.italic"],"settings":{"foreground":"#A626A4","fontStyle":"italic"}},{"name":"Markup Heading","scope":["markup.heading"],"settings":{"foreground":"#E45649"}},{"name":"Markup Heading Punctuation Definition Heading","scope":["markup.heading punctuation.definition.heading"],"settings":{"foreground":"#4078F2"}},{"name":"Markup Link","scope":["markup.link"],"settings":{"foreground":"#0184BC"}},{"name":"Markup Inserted","scope":["markup.inserted"],"settings":{"foreground":"#50A14F"}},{"name":"Markup Quote","scope":["markup.quote"],"settings":{"foreground":"#986801"}},{"name":"Markup Raw","scope":["markup.raw"],"settings":{"foreground":"#50A14F"}},{"name":"Source C Keyword Operator","scope":["source.c keyword.operator"],"settings":{"foreground":"#A626A4"}},{"name":"Source Cpp Keyword Operator","scope":["source.cpp keyword.operator"],"settings":{"foreground":"#A626A4"}},{"name":"Source Cs Keyword Operator","scope":["source.cs keyword.operator"],"settings":{"foreground":"#A626A4"}},{"name":"Source Css Property Name,source Css Property Value","scope":["source.css property-name","source.css property-value"],"settings":{"foreground":"#696C77"}},{"name":"Source Css Property Name Support,source Css Property Value Support","scope":["source.css property-name.support","source.css property-value.support"],"settings":{"foreground":"#383A42"}},{"name":"Source Elixir Source Embedded Source","scope":["source.elixir source.embedded.source"],"settings":{"foreground":"#383A42"}},{"name":"Source Elixir Constant Language,source Elixir Constant Numeric,source Elixir Constant Definition","scope":["source.elixir constant.language","source.elixir constant.numeric","source.elixir constant.definition"],"settings":{"foreground":"#4078F2"}},{"name":"Source Elixir Variable Definition,source Elixir Variable Anonymous","scope":["source.elixir variable.definition","source.elixir variable.anonymous"],"settings":{"foreground":"#A626A4"}},{"name":"Source Elixir Parameter Variable Function","scope":["source.elixir parameter.variable.function"],"settings":{"foreground":"#986801","fontStyle":"italic"}},{"name":"Source Elixir Quoted","scope":["source.elixir quoted"],"settings":{"foreground":"#50A14F"}},{"name":"Source Elixir Keyword Special Method,source Elixir Embedded Section,source Elixir Embedded Source Empty","scope":["source.elixir keyword.special-method","source.elixir embedded.section","source.elixir embedded.source.empty"],"settings":{"foreground":"#E45649"}},{"name":"Source Elixir Readwrite Module Punctuation","scope":["source.elixir readwrite.module punctuation"],"settings":{"foreground":"#E45649"}},{"name":"Source Elixir Regexp Section,source Elixir Regexp String","scope":["source.elixir regexp.section","source.elixir regexp.string"],"settings":{"foreground":"#CA1243"}},{"name":"Source Elixir Separator,source Elixir Keyword Operator","scope":["source.elixir separator","source.elixir keyword.operator"],"settings":{"foreground":"#986801"}},{"name":"Source Elixir Variable Constant","scope":["source.elixir variable.constant"],"settings":{"foreground":"#C18401"}},{"name":"Source Elixir Array,source Elixir Scope,source Elixir Section","scope":["source.elixir array","source.elixir scope","source.elixir section"],"settings":{"foreground":"#696C77"}},{"name":"Source Gfm Markup","scope":["source.gfm markup"],"settings":{"-webkit-font-smoothing":"auto"}},{"name":"Source Gfm Link Entity","scope":["source.gfm link entity"],"settings":{"foreground":"#4078F2"}},{"name":"Source Go Storage Type String","scope":["source.go storage.type.string"],"settings":{"foreground":"#A626A4"}},{"name":"Source Ini Keyword Other Definition Ini","scope":["source.ini keyword.other.definition.ini"],"settings":{"foreground":"#E45649"}},{"name":"Source Java Storage Modifier Import","scope":["source.java storage.modifier.import"],"settings":{"foreground":"#C18401"}},{"name":"Source Java Storage Type","scope":["source.java storage.type"],"settings":{"foreground":"#C18401"}},{"name":"Source Java Keyword Operator Instanceof","scope":["source.java keyword.operator.instanceof"],"settings":{"foreground":"#A626A4"}},{"name":"Source Java Properties Meta Key Pair","scope":["source.java-properties meta.key-pair"],"settings":{"foreground":"#E45649"}},{"name":"Source Java Properties Meta Key Pair > Punctuation","scope":["source.java-properties meta.key-pair > punctuation"],"settings":{"foreground":"#383A42"}},{"name":"Source Js Keyword Operator","scope":["source.js keyword.operator"],"settings":{"foreground":"#0184BC"}},{"name":"Source Js Keyword Operator Delete,source Js Keyword Operator In,source Js Keyword Operator Of,source Js Keyword Operator Instanceof,source Js Keyword Operator New,source Js Keyword Operator Typeof,source Js Keyword Operator Void","scope":["source.js keyword.operator.delete","source.js keyword.operator.in","source.js keyword.operator.of","source.js keyword.operator.instanceof","source.js keyword.operator.new","source.js keyword.operator.typeof","source.js keyword.operator.void"],"settings":{"foreground":"#A626A4"}},{"name":"Source Ts Keyword Operator","scope":["source.ts keyword.operator"],"settings":{"foreground":"#0184BC"}},{"name":"Source Flow Keyword Operator","scope":["source.flow keyword.operator"],"settings":{"foreground":"#0184BC"}},{"name":"Source Json Meta Structure Dictionary Json > String Quoted Json","scope":["source.json meta.structure.dictionary.json > string.quoted.json"],"settings":{"foreground":"#E45649"}},{"name":"Source Json Meta Structure Dictionary Json > String Quoted Json > Punctuation String","scope":["source.json meta.structure.dictionary.json > string.quoted.json > punctuation.string"],"settings":{"foreground":"#E45649"}},{"name":"Source Json Meta Structure Dictionary Json > Value Json > String Quoted Json,source Json Meta Structure Array Json > Value Json > String Quoted Json,source Json Meta Structure Dictionary Json > Value Json > String Quoted Json > Punctuation,source Json Meta Structure Array Json > Value Json > String Quoted Json > Punctuation","scope":["source.json meta.structure.dictionary.json > value.json > string.quoted.json","source.json meta.structure.array.json > value.json > string.quoted.json","source.json meta.structure.dictionary.json > value.json > string.quoted.json > punctuation","source.json meta.structure.array.json > value.json > string.quoted.json > punctuation"],"settings":{"foreground":"#50A14F"}},{"name":"Source Json Meta Structure Dictionary Json > Constant Language Json,source Json Meta Structure Array Json > Constant Language Json","scope":["source.json meta.structure.dictionary.json > constant.language.json","source.json meta.structure.array.json > constant.language.json"],"settings":{"foreground":"#0184BC"}},{"name":"Ng Interpolation","scope":["ng.interpolation"],"settings":{"foreground":"#E45649"}},{"name":"Ng Interpolation Begin,ng Interpolation End","scope":["ng.interpolation.begin","ng.interpolation.end"],"settings":{"foreground":"#4078F2"}},{"name":"Ng Interpolation Function","scope":["ng.interpolation function"],"settings":{"foreground":"#E45649"}},{"name":"Ng Interpolation Function Begin,ng Interpolation Function End","scope":["ng.interpolation function.begin","ng.interpolation function.end"],"settings":{"foreground":"#4078F2"}},{"name":"Ng Interpolation Bool","scope":["ng.interpolation bool"],"settings":{"foreground":"#986801"}},{"name":"Ng Interpolation Bracket","scope":["ng.interpolation bracket"],"settings":{"foreground":"#383A42"}},{"name":"Ng Pipe,ng Operator","scope":["ng.pipe","ng.operator"],"settings":{"foreground":"#383A42"}},{"name":"Ng Tag","scope":["ng.tag"],"settings":{"foreground":"#0184BC"}},{"name":"Ng Attribute With Value Attribute Name","scope":["ng.attribute-with-value attribute-name"],"settings":{"foreground":"#C18401"}},{"name":"Ng Attribute With Value String","scope":["ng.attribute-with-value string"],"settings":{"foreground":"#A626A4"}},{"name":"Ng Attribute With Value String Begin,ng Attribute With Value String End","scope":["ng.attribute-with-value string.begin","ng.attribute-with-value string.end"],"settings":{"foreground":"#383A42"}},{"name":"Source Ruby Constant Other Symbol > Punctuation","scope":["source.ruby constant.other.symbol > punctuation"],"settings":{"foreground":"inherit"}},{"name":"Source Php Class Bracket","scope":["source.php class.bracket"],"settings":{"foreground":"#383A42"}},{"name":"Source Python Keyword Operator Logical Python","scope":["source.python keyword.operator.logical.python"],"settings":{"foreground":"#A626A4"}},{"name":"Source Python Variable Parameter","scope":["source.python variable.parameter"],"settings":{"foreground":"#986801"}},{"name":"customrule","scope":"customrule","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Support Type Property Name","scope":"support.type.property-name","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Punctuation for Quoted String","scope":"string.quoted.double punctuation","settings":{"foreground":"#50A14F"}},{"name":"[VSCODE-CUSTOM] Support Constant","scope":"support.constant","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] JSON Property Name","scope":"support.type.property-name.json","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JSON Punctuation for Property Name","scope":"support.type.property-name.json punctuation","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation for key-value","scope":["punctuation.separator.key-value.ts","punctuation.separator.key-value.js","punctuation.separator.key-value.tsx"],"settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] JS/TS Embedded Operator","scope":["source.js.embedded.html keyword.operator","source.ts.embedded.html keyword.operator"],"settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] JS/TS Variable Other Readwrite","scope":["variable.other.readwrite.js","variable.other.readwrite.ts","variable.other.readwrite.tsx"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Support Variable Dom","scope":["support.variable.dom.js","support.variable.dom.ts"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JS/TS Support Variable Property Dom","scope":["support.variable.property.dom.js","support.variable.property.dom.ts"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JS/TS Interpolation String Punctuation","scope":["meta.template.expression.js punctuation.definition","meta.template.expression.ts punctuation.definition"],"settings":{"foreground":"#CA1243"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Type Parameters","scope":["source.ts punctuation.definition.typeparameters","source.js punctuation.definition.typeparameters","source.tsx punctuation.definition.typeparameters"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Definition Block","scope":["source.ts punctuation.definition.block","source.js punctuation.definition.block","source.tsx punctuation.definition.block"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Separator Comma","scope":["source.ts punctuation.separator.comma","source.js punctuation.separator.comma","source.tsx punctuation.separator.comma"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Variable Property","scope":["support.variable.property.js","support.variable.property.ts","support.variable.property.tsx"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JS/TS Default Keyword","scope":["keyword.control.default.js","keyword.control.default.ts","keyword.control.default.tsx"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JS/TS Instanceof Keyword","scope":["keyword.operator.expression.instanceof.js","keyword.operator.expression.instanceof.ts","keyword.operator.expression.instanceof.tsx"],"settings":{"foreground":"#A626A4"}},{"name":"[VSCODE-CUSTOM] JS/TS Of Keyword","scope":["keyword.operator.expression.of.js","keyword.operator.expression.of.ts","keyword.operator.expression.of.tsx"],"settings":{"foreground":"#A626A4"}},{"name":"[VSCODE-CUSTOM] JS/TS Braces/Brackets","scope":["meta.brace.round.js","meta.array-binding-pattern-variable.js","meta.brace.square.js","meta.brace.round.ts","meta.array-binding-pattern-variable.ts","meta.brace.square.ts","meta.brace.round.tsx","meta.array-binding-pattern-variable.tsx","meta.brace.square.tsx"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Accessor","scope":["source.js punctuation.accessor","source.ts punctuation.accessor","source.tsx punctuation.accessor"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Terminator Statement","scope":["punctuation.terminator.statement.js","punctuation.terminator.statement.ts","punctuation.terminator.statement.tsx"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Array variables","scope":["meta.array-binding-pattern-variable.js variable.other.readwrite.js","meta.array-binding-pattern-variable.ts variable.other.readwrite.ts","meta.array-binding-pattern-variable.tsx variable.other.readwrite.tsx"],"settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] JS/TS Support Variables","scope":["source.js support.variable","source.ts support.variable","source.tsx support.variable"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JS/TS Support Variables","scope":["variable.other.constant.property.js","variable.other.constant.property.ts","variable.other.constant.property.tsx"],"settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] JS/TS Keyword New","scope":["keyword.operator.new.ts","keyword.operator.new.j","keyword.operator.new.tsx"],"settings":{"foreground":"#A626A4"}},{"name":"[VSCODE-CUSTOM] TS Keyword Operator","scope":["source.ts keyword.operator","source.tsx keyword.operator"],"settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] JS/TS Punctuation Parameter Separator","scope":["punctuation.separator.parameter.js","punctuation.separator.parameter.ts","punctuation.separator.parameter.tsx "],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Import","scope":["constant.language.import-export-all.js","constant.language.import-export-all.ts"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JSX/TSX Import","scope":["constant.language.import-export-all.jsx","constant.language.import-export-all.tsx"],"settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] JS/TS Keyword Control As","scope":["keyword.control.as.js","keyword.control.as.ts","keyword.control.as.jsx","keyword.control.as.tsx"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Variable Alias","scope":["variable.other.readwrite.alias.js","variable.other.readwrite.alias.ts","variable.other.readwrite.alias.jsx","variable.other.readwrite.alias.tsx"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JS/TS Constants","scope":["variable.other.constant.js","variable.other.constant.ts","variable.other.constant.jsx","variable.other.constant.tsx"],"settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] JS/TS Export Variable","scope":["meta.export.default.js variable.other.readwrite.js","meta.export.default.ts variable.other.readwrite.ts"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JS/TS Template Strings Punctuation Accessor","scope":["source.js meta.template.expression.js punctuation.accessor","source.ts meta.template.expression.ts punctuation.accessor","source.tsx meta.template.expression.tsx punctuation.accessor"],"settings":{"foreground":"#50A14F"}},{"name":"[VSCODE-CUSTOM] JS/TS Import equals","scope":["source.js meta.import-equals.external.js keyword.operator","source.jsx meta.import-equals.external.jsx keyword.operator","source.ts meta.import-equals.external.ts keyword.operator","source.tsx meta.import-equals.external.tsx keyword.operator"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Type Module","scope":"entity.name.type.module.js,entity.name.type.module.ts,entity.name.type.module.jsx,entity.name.type.module.tsx","settings":{"foreground":"#50A14F"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Class","scope":"meta.class.js,meta.class.ts,meta.class.jsx,meta.class.tsx","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Property Definition Variable","scope":["meta.definition.property.js variable","meta.definition.property.ts variable","meta.definition.property.jsx variable","meta.definition.property.tsx variable"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Type Parameters Type","scope":["meta.type.parameters.js support.type","meta.type.parameters.jsx support.type","meta.type.parameters.ts support.type","meta.type.parameters.tsx support.type"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Tag Keyword Operator","scope":["source.js meta.tag.js keyword.operator","source.jsx meta.tag.jsx keyword.operator","source.ts meta.tag.ts keyword.operator","source.tsx meta.tag.tsx keyword.operator"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Tag Punctuation","scope":["meta.tag.js punctuation.section.embedded","meta.tag.jsx punctuation.section.embedded","meta.tag.ts punctuation.section.embedded","meta.tag.tsx punctuation.section.embedded"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Array Literal Variable","scope":["meta.array.literal.js variable","meta.array.literal.jsx variable","meta.array.literal.ts variable","meta.array.literal.tsx variable"],"settings":{"foreground":"#C18401"}},{"name":"[VSCODE-CUSTOM] JS/TS Module Exports","scope":["support.type.object.module.js","support.type.object.module.jsx","support.type.object.module.ts","support.type.object.module.tsx"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] JSON Constants","scope":["constant.language.json"],"settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] JS/TS Object Constants","scope":["variable.other.constant.object.js","variable.other.constant.object.jsx","variable.other.constant.object.ts","variable.other.constant.object.tsx"],"settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] JS/TS Properties Keyword","scope":["storage.type.property.js","storage.type.property.jsx","storage.type.property.ts","storage.type.property.tsx"],"settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] JS/TS Single Quote Inside Templated String","scope":["meta.template.expression.js string.quoted punctuation.definition","meta.template.expression.jsx string.quoted punctuation.definition","meta.template.expression.ts string.quoted punctuation.definition","meta.template.expression.tsx string.quoted punctuation.definition"],"settings":{"foreground":"#50A14F"}},{"name":"[VSCODE-CUSTOM] JS/TS Backtick inside Templated String","scope":["meta.template.expression.js string.template punctuation.definition.string.template","meta.template.expression.jsx string.template punctuation.definition.string.template","meta.template.expression.ts string.template punctuation.definition.string.template","meta.template.expression.tsx string.template punctuation.definition.string.template"],"settings":{"foreground":"#50A14F"}},{"name":"[VSCODE-CUSTOM] JS/TS In Keyword for Loops","scope":["keyword.operator.expression.in.js","keyword.operator.expression.in.jsx","keyword.operator.expression.in.ts","keyword.operator.expression.in.tsx"],"settings":{"foreground":"#A626A4"}},{"name":"[VSCODE-CUSTOM] JS/TS Variable Other Object","scope":["variable.other.object.js","variable.other.object.ts"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] JS/TS Meta Object Literal Key","scope":["meta.object-literal.key.js","meta.object-literal.key.ts"],"settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] Python Constants Other","scope":"source.python constant.other","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Python Constants","scope":"source.python constant","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Python Placeholder Character","scope":"constant.character.format.placeholder.other.python storage","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Python Magic","scope":"support.variable.magic.python","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] Python Meta Function Parameters","scope":"meta.function.parameters.python","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Python Function Separator Annotation","scope":"punctuation.separator.annotation.python","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Python Function Separator Punctuation","scope":"punctuation.separator.parameters.python","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] CSharp Fields","scope":"entity.name.variable.field.cs","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] CSharp Keyword Operators","scope":"source.cs keyword.operator","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] CSharp Variables","scope":"variable.other.readwrite.cs","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] CSharp Variables Other","scope":"variable.other.object.cs","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] CSharp Property Other","scope":"variable.other.object.property.cs","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] CSharp Property","scope":"entity.name.variable.property.cs","settings":{"foreground":"#4078F2"}},{"name":"[VSCODE-CUSTOM] CSharp Storage Type","scope":"storage.type.cs","settings":{"foreground":"#C18401"}},{"name":"[VSCODE-CUSTOM] Rust Unsafe Keyword","scope":"keyword.other.unsafe.rust","settings":{"foreground":"#A626A4"}},{"name":"[VSCODE-CUSTOM] Rust Entity Name Type","scope":"entity.name.type.rust","settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] Rust Storage Modifier Lifetime","scope":"storage.modifier.lifetime.rust","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Rust Entity Name Lifetime","scope":"entity.name.lifetime.rust","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Rust Storage Type Core","scope":"storage.type.core.rust","settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] Rust Meta Attribute","scope":"meta.attribute.rust","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Rust Storage Class Std","scope":"storage.class.std.rust","settings":{"foreground":"#0184BC"}},{"name":"[VSCODE-CUSTOM] Markdown Raw Block","scope":"markup.raw.block.markdown","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Shell Variables Punctuation Definition","scope":"punctuation.definition.variable.shell","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] Css Support Constant Value","scope":"support.constant.property-value.css","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Css Punctuation Definition Constant","scope":"punctuation.definition.constant.css","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Sass Punctuation for key-value","scope":"punctuation.separator.key-value.scss","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] Sass Punctuation for constants","scope":"punctuation.definition.constant.scss","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Sass Punctuation for key-value","scope":"meta.property-list.scss punctuation.separator.key-value.scss","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Java Storage Type Primitive Array","scope":"storage.type.primitive.array.java","settings":{"foreground":"#C18401"}},{"name":"[VSCODE-CUSTOM] Markdown headings","scope":"entity.name.section.markdown","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] Markdown heading Punctuation Definition","scope":"punctuation.definition.heading.markdown","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] Markdown heading setext","scope":"markup.heading.setext","settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Markdown Punctuation Definition Bold","scope":"punctuation.definition.bold.markdown","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Markdown Inline Raw","scope":"markup.inline.raw.markdown","settings":{"foreground":"#50A14F"}},{"name":"[VSCODE-CUSTOM] Markdown List Punctuation Definition","scope":"beginning.punctuation.definition.list.markdown","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] Markdown Quote","scope":"markup.quote.markdown","settings":{"foreground":"#A0A1A7","fontStyle":"italic"}},{"name":"[VSCODE-CUSTOM] Markdown Punctuation Definition String","scope":["punctuation.definition.string.begin.markdown","punctuation.definition.string.end.markdown","punctuation.definition.metadata.markdown"],"settings":{"foreground":"#383A42"}},{"name":"[VSCODE-CUSTOM] Markdown Punctuation Definition Link","scope":"punctuation.definition.metadata.markdown","settings":{"foreground":"#A626A4"}},{"name":"[VSCODE-CUSTOM] Markdown Underline Link/Image","scope":["markup.underline.link.markdown","markup.underline.link.image.markdown"],"settings":{"foreground":"#A626A4"}},{"name":"[VSCODE-CUSTOM] Markdown Link Title/Description","scope":["string.other.link.title.markdown","string.other.link.description.markdown"],"settings":{"foreground":"#4078F2"}},{"name":"[VSCODE-CUSTOM] Ruby Punctuation Separator Variable","scope":"punctuation.separator.variable.ruby","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] Ruby Other Constant Variable","scope":"variable.other.constant.ruby","settings":{"foreground":"#986801"}},{"name":"[VSCODE-CUSTOM] Ruby Keyword Operator Other","scope":"keyword.operator.other.ruby","settings":{"foreground":"#50A14F"}},{"name":"[VSCODE-CUSTOM] PHP Punctuation Variable Definition","scope":"punctuation.definition.variable.php","settings":{"foreground":"#E45649"}},{"name":"[VSCODE-CUSTOM] PHP Meta Class","scope":"meta.class.php","settings":{"foreground":"#383A42"}}],"uuid":"1446a9a1-9d70-421a-bae3-87b3b112ddb0"} diff --git a/src/views/docs/en/guides/extend/custom-iam-roles.md b/src/views/docs/en/guides/extend/custom-iam-roles.md index aefb7a8c..eb880cd0 100644 --- a/src/views/docs/en/guides/extend/custom-iam-roles.md +++ b/src/views/docs/en/guides/extend/custom-iam-roles.md @@ -39,7 +39,7 @@ Using a custom IAM role allows you to limit interactions even further, like rest Here's how you would add a custom role to your Lambda with a `.arc-config` file. -```md +```arc // src/http/get-orders/.arc-config @aws diff --git a/src/views/docs/en/guides/frontend/middleware.md b/src/views/docs/en/guides/frontend/middleware.md index 86b71da6..be797ff4 100644 --- a/src/views/docs/en/guides/frontend/middleware.md +++ b/src/views/docs/en/guides/frontend/middleware.md @@ -215,7 +215,7 @@ exports.handler = arc.http(handler) 6. We can also replace the contents of `/src/http/post-count/index.js` with the following: -``` javascript +```javascript var arc = require('@architect/functions') function handler(req, res) { From 67df33b267acee9af04e8ad61b6c092643292dc4 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 1 Nov 2021 20:54:22 -0700 Subject: [PATCH 243/680] Ditch Highlight.js as a normal dependency, vendor it in and shed 7.4MB --- .eslintignore | 1 + .github/workflows/build.yml | 3 + .gitignore | 2 + prefs.arc | 3 + scripts/dist.sh | 8 ++- scripts/highlight/index.js | 20 +++++++ .../highlight/languages/arc.js | 60 ------------------- .../get-docs-000lang-catchall/highlighter.js | 1 - src/http/get-docs-000lang-catchall/index.js | 8 +-- 9 files changed, 37 insertions(+), 69 deletions(-) create mode 100644 .eslintignore create mode 100644 prefs.arc create mode 100644 scripts/highlight/index.js delete mode 100644 src/http/get-docs-000lang-catchall/highlight/languages/arc.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..1a862348 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +src/http/get-docs-000lang-catchall/highlight/**/* diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f005d752..7ec74468 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,6 +40,9 @@ jobs: - name: Install run: npm install + - name: Vendor dist files + run: npm run dist + - name: Hydrate run: npx arc hydrate env: diff --git a/.gitignore b/.gitignore index fc24aab5..3663d95b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ node_modules package-lock.json sam.json sam.yaml +scratch +src/http/get-docs-000lang-catchall/highlight/ diff --git a/prefs.arc b/prefs.arc new file mode 100644 index 00000000..f4eb0c44 --- /dev/null +++ b/prefs.arc @@ -0,0 +1,3 @@ +# Just here to ensure grammar dist files are vendored at startup! +@sandbox-startup +./scripts/dist.sh diff --git a/scripts/dist.sh b/scripts/dist.sh index 211b370c..9d16082a 100755 --- a/scripts/dist.sh +++ b/scripts/dist.sh @@ -1,6 +1,12 @@ #!/bin/bash -echo "Copying Architect Highlight.js grammar from node_modules to get-docs-000lang-catchall/highlight..." +echo "Copying Architect Highlight.js files & grammars from node_modules to get-docs-000lang-catchall/highlight/..." mkdir src/http/get-docs-000lang-catchall/highlight &> /dev/null mkdir src/http/get-docs-000lang-catchall/highlight/languages &> /dev/null +for lang in bash javascript json powershell python ruby yaml +do + cp node_modules/highlight.js/lib/languages/$lang.js src/http/get-docs-000lang-catchall/highlight/languages/ +done +cp node_modules/highlight.js/lib/core.js src/http/get-docs-000lang-catchall/highlight/ cp node_modules/@architect/syntaxes/arc-hljs-grammar.js src/http/get-docs-000lang-catchall/highlight/languages/arc.js +cp scripts/highlight/index.js src/http/get-docs-000lang-catchall/highlight/ echo "Done." diff --git a/scripts/highlight/index.js b/scripts/highlight/index.js new file mode 100644 index 00000000..7e0f7e61 --- /dev/null +++ b/scripts/highlight/index.js @@ -0,0 +1,20 @@ +var hljs = require('./core') + +// Shells +hljs.registerLanguage('bash', require('./languages/bash')) +hljs.registerLanguage('powershell', require('./languages/powershell')) + +// Languages +hljs.registerLanguage('ruby', require('./languages/ruby')) +hljs.registerLanguage('javascript', require('./languages/javascript')) +hljs.registerLanguage('python', require('./languages/python')) + +// Formats +hljs.registerLanguage('arc', require('./languages/arc')) +hljs.registerLanguage('json', require('./languages/json')) +hljs.registerLanguage('yaml', require('./languages/yaml')) +// TODO: add TOMLol + +hljs.HighlightJS = hljs +hljs.default = hljs +module.exports = hljs diff --git a/src/http/get-docs-000lang-catchall/highlight/languages/arc.js b/src/http/get-docs-000lang-catchall/highlight/languages/arc.js deleted file mode 100644 index 50859fb2..00000000 --- a/src/http/get-docs-000lang-catchall/highlight/languages/arc.js +++ /dev/null @@ -1,60 +0,0 @@ -let commentStart = '#.*$' -let booleans = { - scope: 'literal', - begin: '(?<=\\s|^|\\G)(true|false)', - end: '(?=\\s|#|$)' -} -let numbers = { - scope: 'number', - begin: '(?<=\\s|^|\\G)((\\d*[.])?\\d+)(?=\\s|#|$)', - end: '(?=\\s|#|$)' -} -let doubleQuotedStrings = { - scope: 'string', - begin: '(?<=\\s|^|\\G)(")', - end: '(")', - contains: [ { begin: '\\\\"' } ] -} -let singleQuotedStrings = { - scope: 'string', - begin: "(?<=\\s|^|\\G)(')", - end: "(')", - contains: [ { begin: "\\\\'" } ] -} -let backtickQuotedStrings = { - scope: 'string', - begin: '(?<=\\s|^|\\G)(`)', - end: '(`)', - contains: [ { begin: '\\\\`' } ] -} -let pragmas = { scope: 'title', begin: '^@[a-zA-Z0-9-_]+', end: '(?=\\s|#|$)' } -let mapVectorName = { - scope: 'variable', - begin: '(?<=^)(\\S+)(?=\\s|#|$)(?=#?[^\\r\\n]*[\\r\\n](^[\\t ]{2}\\S))', - end: '\\s' -} -let mapProperties = { - scope: 'property', - begin: '(^[\\t ]{2}[^#\\r\\n\\t ]+)(?=[\\t ]+[^#\\r\\n\\t ]+(?=\\s|#|$))', - end: '[\\t ]' -} -let string = { scope: 'string' } -module.exports = function index (hljs) { - return { - aliases: [ 'arc', 'architect' ], - case_insensitive: true, - contains: [ - booleans, - numbers, - doubleQuotedStrings, - singleQuotedStrings, - backtickQuotedStrings, - pragmas, - hljs.COMMENT(commentStart), - // Map / vector stuff goes after comments to ensure clean inline captures - mapVectorName, - mapProperties, - string, // String needs to be last, as anything not matched falls through to it - ] - } -} diff --git a/src/http/get-docs-000lang-catchall/highlighter.js b/src/http/get-docs-000lang-catchall/highlighter.js index 7664d910..77fb212c 100644 --- a/src/http/get-docs-000lang-catchall/highlighter.js +++ b/src/http/get-docs-000lang-catchall/highlighter.js @@ -1,6 +1,5 @@ module.exports = function (hljs, escapeHtml, str, lang) { if (lang && hljs.getLanguage(lang)) { - try { return `
    ${hljs.highlight(str, { language: lang, ignoreIllegals: true }).value}
    ` } diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 6da5bd0f..df954bb9 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -12,12 +12,10 @@ const markdownAnchor = require('markdown-it-anchor') const frontmatterParser = require('markdown-it-front-matter') const yaml = require('js-yaml') const classMapping = require('./markdown-class-mappings') -const hljs = require('highlight.js') +const hljs = require('./highlight') const { escapeHtml } = Markdown().utils const highlight = require('./highlighter') .bind(null, hljs, escapeHtml) -const arc = require('./highlight/languages/arc') -hljs.registerLanguage('arc', arc) const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default const NotFound = require('@architect/views/modules/components/not-found.js').default @@ -26,9 +24,6 @@ const algolia = require('@architect/views/modules/components/algolia.js').defaul const cache = {} // cheap warm cache async function handler (req) { - let timerName = `get-docs-000lang-catchall ${req.pathParameters.proxy}` - console.time(timerName) - let { pathParameters } = req let { lang, proxy } = pathParameters let parts = proxy.split('/') @@ -125,7 +120,6 @@ async function handler (req) { toc }) } - console.timeEnd(timerName) return retval } From b1fe29b66383eab962227e60bd3919ddc450cd05 Mon Sep 17 00:00:00 2001 From: Francis Gulotta Date: Fri, 29 Oct 2021 22:06:11 -0400 Subject: [PATCH 244/680] fix: old function return This example returns JSON instead of the html we intend. --- src/views/docs/en/guides/frontend/static-assets.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/frontend/static-assets.md b/src/views/docs/en/guides/frontend/static-assets.md index c6b6bf13..79d8de88 100644 --- a/src/views/docs/en/guides/frontend/static-assets.md +++ b/src/views/docs/en/guides/frontend/static-assets.md @@ -68,7 +68,10 @@ exports.handler = async function http () { ` return { - type: 'text/html', + statusCode: 200, + headers: { + 'Content-Type': 'text/html', + }, body: html.trim() } } From a9e09805b3dd316fc6afa362d7bbdf45ca8fff79 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Tue, 2 Nov 2021 08:58:50 -0400 Subject: [PATCH 245/680] Run vendor dist on deploy Signed-off-by: Simon MacDonald --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7ec74468..8dd0efd3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,6 +83,9 @@ jobs: - name: Install run: npm i + - name: Vendor dist files + run: npm run dist + - name: Staging Deploy if: github.ref == 'refs/heads/main' run: npx arc deploy --staging From 17f7f776cbfa40fde78cadad464584d37d5236e4 Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Tue, 2 Nov 2021 09:06:28 -0400 Subject: [PATCH 246/680] 3.6.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1fccf993..d08c8913 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.11", + "version": "3.6.12", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 50377c7a27fb77dafbdf1d7aa9ec43aa20146e51 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 3 Nov 2021 10:22:10 -0700 Subject: [PATCH 247/680] Update static asset URLs --- public/playground.html | 7 ++- .../docs/en/guides/backend/persist-data.md | 50 +++++++++---------- src/views/modules/document/head.js | 6 +-- 3 files changed, 30 insertions(+), 33 deletions(-) diff --git a/public/playground.html b/public/playground.html index 67516e9a..d6cb4917 100644 --- a/public/playground.html +++ b/public/playground.html @@ -2,9 +2,9 @@ - - - + + + Architect Playground @@ -157,4 +157,3 @@ - diff --git a/src/views/docs/en/guides/backend/persist-data.md b/src/views/docs/en/guides/backend/persist-data.md index 1472c3fd..08efa959 100644 --- a/src/views/docs/en/guides/backend/persist-data.md +++ b/src/views/docs/en/guides/backend/persist-data.md @@ -24,6 +24,7 @@ In this tutorial you will build a simple note taking application, with multiple **Sections** +- [Overview](#overview) - [Generating the Data Layer](#generating-the-data-layer) - [Implementing an Admin Interface](#implementing-an-admin-interface) - [Implementing Signup](#implementing-signup) @@ -99,13 +100,13 @@ touch src/shared/layout.js // src/shared/layout.js let arc = require('@architect/functions'), - url = arc.http.helpers.url, - static = arc.http.helpers.static + url = arc.http.helpers.url, + static = arc.http.helpers.static module.exports = function layout(contents, showNav = true, isLoggedIn = true) { - var nav = '' + let nav = '' - var navLinks = ` + let navLinks = ` Log in Sign up ` @@ -132,9 +133,7 @@ module.exports = function layout(contents, showNav = true, isLoggedIn = true) { Architect demo app - - - + ${ nav } @@ -154,8 +153,8 @@ Next, we require the layout module in the root of our application. This will sho // src/http/get-index/index.js let arc = require('@architect/functions'), - layout = require('@architect/shared/layout'), - url = arc.http.helpers.url + layout = require('@architect/shared/layout'), + url = arc.http.helpers.url require('@architect/shared/globals') @@ -165,7 +164,7 @@ exports.handler = async function http(request) { let isLoggedIn = !!state.person - var loggedInPage = ` + let loggedInPage = `

    Welcome back ${ email }!

    You've logged in. That's so cool.

    @@ -173,7 +172,7 @@ exports.handler = async function http(request) {

    ` - var notLoggedInPage = ` + let notLoggedInPage = `

    Welcome to the Architect demo app!

    It looks like it's your first time here. You should sign up now!

    @@ -199,9 +198,9 @@ Our signup page is a simple form: // src/http/get-signup/index.js let arc = require('@architect/functions'), - layout = require('@architect/shared/layout'), - url = arc.http.helpers.url, - static = arc.http.helpers.static + layout = require('@architect/shared/layout'), + url = arc.http.helpers.url, + static = arc.http.helpers.static require('@architect/shared/globals') @@ -216,7 +215,7 @@ exports.handler = async function http(req) { } } - var signupPage = ` + let signupPage = `

    +
    ${stateTag} From db48f88cd89304ac9a8a2b36ef9f7935ccc9849e Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Fri, 12 Nov 2021 14:09:33 -0500 Subject: [PATCH 266/680] 3.6.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3a97dff..708c13cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.17", + "version": "3.6.18", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 8bbbedc10ead813f5c2faef6e3a7c8696dae14db Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Mon, 15 Nov 2021 15:14:12 -0500 Subject: [PATCH 267/680] Remove onigasm Signed-off-by: Simon MacDonald --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 708c13cc..883fb166 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "markdown-it-external-anchor": "^1.0.0", "markdown-it-front-matter": "^0.2.3", "markdown-it-toc-and-anchor": "^4.2.0", - "onigasm": "^2.2.5", "slugify": "^1.6.1" }, "devDependencies": { From 10e315f845b812739f9944c2040f6c60ced24892 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 16 Nov 2021 15:59:28 -0700 Subject: [PATCH 268/680] @streams doc (#450) * add tables-streams doc * update project layout and tables docs with streams * demote legacy stream=true attr in tables doc * toml highlighting * indexes becomes tables-indexes --- package.json | 2 +- public/static.json | 2 +- scripts/dist.sh | 2 +- scripts/highlight/index.js | 2 +- .../{link-checker-test.js => link-checker.js} | 0 src/shared/redirect-map.js | 22 +-- .../docs/en/get-started/project-manifest.md | 72 +++++----- src/views/docs/en/reference/cli/sandbox.md | 4 +- .../configuration/local-preferences.md | 2 +- .../reference/project-manifest/scheduled.md | 2 +- .../{indexes.md => tables-indexes.md} | 19 +-- .../project-manifest/tables-streams.md | 131 ++++++++++++++++++ .../en/reference/project-manifest/tables.md | 43 +++--- src/views/docs/table-of-contents.js | 3 +- 14 files changed, 225 insertions(+), 81 deletions(-) rename scripts/{link-checker-test.js => link-checker.js} (100%) rename src/views/docs/en/reference/project-manifest/{indexes.md => tables-indexes.md} (80%) create mode 100644 src/views/docs/en/reference/project-manifest/tables-streams.md diff --git a/package.json b/package.json index 883fb166..64e8b97a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", - "link-checker": "node ./scripts/link-checker-test.js | tap-spec", + "link-checker": "node ./scripts/link-checker.js | tap-spec", "lint": "eslint src --fix", "start": "sandbox", "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-spec", diff --git a/public/static.json b/public/static.json index 8a35664f..5035fea6 100644 --- a/public/static.json +++ b/public/static.json @@ -9,4 +9,4 @@ "css/index.css": "css/index-547bdacc3e.css", "css/styles.css": "css/styles-cf4510a1b6.css", "css/syntax.css": "css/syntax-0339098006.css" -} \ No newline at end of file +} diff --git a/scripts/dist.sh b/scripts/dist.sh index 9d16082a..7014baf6 100755 --- a/scripts/dist.sh +++ b/scripts/dist.sh @@ -2,7 +2,7 @@ echo "Copying Architect Highlight.js files & grammars from node_modules to get-docs-000lang-catchall/highlight/..." mkdir src/http/get-docs-000lang-catchall/highlight &> /dev/null mkdir src/http/get-docs-000lang-catchall/highlight/languages &> /dev/null -for lang in bash javascript json powershell python ruby yaml +for lang in bash javascript json powershell python ruby yaml ini do cp node_modules/highlight.js/lib/languages/$lang.js src/http/get-docs-000lang-catchall/highlight/languages/ done diff --git a/scripts/highlight/index.js b/scripts/highlight/index.js index 7e0f7e61..b3be1607 100644 --- a/scripts/highlight/index.js +++ b/scripts/highlight/index.js @@ -13,7 +13,7 @@ hljs.registerLanguage('python', require('./languages/python')) hljs.registerLanguage('arc', require('./languages/arc')) hljs.registerLanguage('json', require('./languages/json')) hljs.registerLanguage('yaml', require('./languages/yaml')) -// TODO: add TOMLol +hljs.registerLanguage('toml', require('./languages/ini')) hljs.HighlightJS = hljs hljs.default = hljs diff --git a/scripts/link-checker-test.js b/scripts/link-checker.js similarity index 100% rename from scripts/link-checker-test.js rename to scripts/link-checker.js diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index a0128b19..0bc18320 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -14,12 +14,12 @@ const tempRedirects = { '/@events': '/docs/en/reference/project-manifest/events', '/http': '/docs/en/reference/project-manifest/http', '/@http': '/docs/en/reference/project-manifest/http', - '/indexes': '/docs/en/reference/project-manifest/indexes', - '/@indexes': '/docs/en/reference/project-manifest/indexes', + '/indexes': '/docs/en/reference/project-manifest/tables-indexes', + '/@indexes': '/docs/en/reference/project-manifest/tables-indexes', '/macros': '/docs/en/reference/project-manifest/macros', '/@macros': '/docs/en/reference/project-manifest/macros', - '/plugins': '/docs/en/reference/project-manifest/macros', // TODO: update with new plugins doc - '/@plugins': '/docs/en/reference/project-manifest/macros', // TODO: update with new plugins doc + '/plugins': '/docs/en/guides/extend/plugins', // TODO: update with new plugins doc + '/@plugins': '/docs/en/guides/extend/plugins', // TODO: update with new plugins doc '/proxy': '/docs/en/reference/project-manifest/proxy', '/@proxy': '/docs/en/reference/project-manifest/proxy', '/queues': '/docs/en/reference/project-manifest/queues', @@ -30,10 +30,12 @@ const tempRedirects = { '/@shared': '/docs/en/reference/project-manifest/shared', '/static': '/docs/en/reference/project-manifest/static', '/@static': '/docs/en/reference/project-manifest/static', - '/streams': '/docs/en/reference/project-manifest/tables', // TODO: update with new streams doc - '/@streams': '/docs/en/reference/project-manifest/tables', // TODO: update with new streams doc '/tables': '/docs/en/reference/project-manifest/tables', '/@tables': '/docs/en/reference/project-manifest/tables', + '/tables-indexes': '/docs/en/reference/project-manifest/tables-indexes', + '/@tables-indexes': '/docs/en/reference/project-manifest/tables-indexes', + '/tables-streams': '/docs/en/reference/project-manifest/tables-streams', + '/@tables-streams': '/docs/en/reference/project-manifest/tables-streams', '/views': '/docs/en/reference/project-manifest/views', '/@views': '/docs/en/reference/project-manifest/views', '/ws': '/docs/en/reference/project-manifest/ws', @@ -89,7 +91,7 @@ const permanentRedirects = { '/reference/arc/aws': '/docs/en/reference/project-manifest/aws', '/reference/arc/events': '/docs/en/reference/project-manifest/events', '/reference/arc/http': '/docs/en/reference/project-manifest/http', - '/reference/arc/indexes': '/docs/en/reference/project-manifest/indexes', + '/reference/arc/indexes': '/docs/en/reference/project-manifest/tables-indexes', '/reference/arc/proxy': '/docs/en/reference/project-manifest/proxy', '/reference/arc/queues': '/docs/en/reference/project-manifest/queues', '/reference/arc/scheduled': '/docs/en/reference/project-manifest/scheduled', @@ -101,7 +103,7 @@ const permanentRedirects = { '/docs/en/reference/app.arc/aws': '/docs/en/reference/project-manifest/aws', '/docs/en/reference/app.arc/events': '/docs/en/reference/project-manifest/events', '/docs/en/reference/app.arc/http': '/docs/en/reference/project-manifest/http', - '/docs/en/reference/app.arc/indexes': '/docs/en/reference/project-manifest/indexes', + '/docs/en/reference/app.arc/indexes': '/docs/en/reference/project-manifest/tables-indexes', '/docs/en/reference/app.arc/proxy': '/docs/en/reference/project-manifest/proxy', '/docs/en/reference/app.arc/queues': '/docs/en/reference/project-manifest/queues', '/docs/en/reference/app.arc/scheduled': '/docs/en/reference/project-manifest/scheduled', @@ -110,6 +112,8 @@ const permanentRedirects = { '/docs/en/reference/app.arc/tables': '/docs/en/reference/project-manifest/tables', '/docs/en/reference/app.arc/views': '/docs/en/reference/project-manifest/views', '/docs/en/reference/app.arc/ws': '/docs/en/reference/project-manifest/ws', + // rename @indexes => @tables-indexes + '/docs/en/reference/project-manifest/indexes': '/docs/en/reference/project-manifest/tables-indexes', // Reference > Configuration > Function config // round 1: Q1 2021 @@ -207,7 +211,7 @@ const permanentRedirects = { '/reference/domain': currentRoot, '/reference/events': '/docs/en/reference/project-manifest/events', '/reference/http': '/docs/en/reference/project-manifest/http', - '/reference/indexes': '/docs/en/reference/project-manifest/indexes', + '/reference/indexes': '/docs/en/reference/project-manifest/tables-indexes', '/reference/queues': '/docs/en/reference/project-manifest/queues', '/reference/scheduled': '/docs/en/reference/project-manifest/scheduled', '/reference/static': '/docs/en/reference/project-manifest/static', diff --git a/src/views/docs/en/get-started/project-manifest.md b/src/views/docs/en/get-started/project-manifest.md index cc423d0b..b1b26e36 100644 --- a/src/views/docs/en/get-started/project-manifest.md +++ b/src/views/docs/en/get-started/project-manifest.md @@ -73,7 +73,7 @@ These sections deal with Lambda functions and their event sources. Architect con - [`@http`](../reference/project-manifest/http) HTTP routes (API Gateway) - [`@events`](../reference/project-manifest/events) Event pub/sub (SNS) -- [`@queues`](../reference/project-manifest/queues) queues and handlers for them (SQS) +- [`@queues`](../reference/project-manifest/queues) queues and handlers for them (SQS) - [`@scheduled`](../reference/project-manifest/scheduled) Invoke functions specified times (CloudWatch Events) - [`@ws`](../reference/project-manifest/ws) Web Socket functions (API Gateway) @@ -83,7 +83,8 @@ These pragmas represent persistence resources. - [`@static`](../reference/project-manifest/static) Bucket for hosting static assets (S3) - [`@tables`](../reference/project-manifest/tables) Database tables and trigger functions (DynamoDB) -- [`@indexes`](../reference/project-manifest/indexes) Table global secondary indexes (DynamoDB) +- [`@tables-indexes`](../reference/project-manifest/tables-indexes) Table global secondary indexes (DynamoDB) +- [`@tables-streams`](../reference/project-manifest/tables-streams) Table stream handler functions (DynamoDB + Lambda) ## Example @@ -122,12 +123,15 @@ daily-affirmation rate(1 day) @tables likes likeID *String - stream true -@indexes +@tables-streams +likes + +@tables-indexes likes date *String ``` + @@ -141,40 +145,35 @@ likes "static": { "fingerprint": true }, - "ws": [ - "action", - "connect", - "default", - "disconnect" - ], + "ws": ["action", "connect", "default", "disconnect"], "http": [ ["get", "/"], ["get", "/likes"], ["post", "/likes"] ], - "events": [ - "hit-counter" - ], + "events": ["hit-counter"], "scheduled": { - "daily-affirmation": "rate(1 day)" + "daily-affirmation": { + "rate": [1, "day"] + } }, "tables": { "likes": { - "likeID": "*String", - "stream": true + "likeID": "*String" } }, - "indexes": { + "tables-streams": ["likes"], + "tables-indexes": { "likes": { "date": "*String" } } } ``` + -
    yaml
    @@ -198,10 +197,13 @@ events: scheduled: - daily-affirmation: "rate(1 day)" tables: - - likes: {likeID: "*String", stream: true} -indexes: - - likes: {date: "*String"} + - likes: { likeID: "*String" } +tables-streams: + - likes +tables-indexes: + - likes: { date: "*String" } ``` +
    @@ -237,12 +239,14 @@ daily-affirmation=["rate(1 day)"] [tables.likes] likeiD="*String" -stream=true -[[indexes]] -[indexes.likes] +tables-streams=["likes"] + +[["tables-indexes"]] +["tables-indexes".likes] date="*String" ``` + @@ -254,25 +258,25 @@ Running `arc init` in the same directory as the file above generates the followi ```bash . ├── src +│ ├── events +│ │ └── hit-counter/index.js +│ │ │ ├── http │ │ ├── get-index/index.js │ │ ├── get-likes/index.js │ │ └── post-likes/index.js │ │ -│ ├── events -│ │ └── hit-counter/ -│ │ │ ├── scheduled -│ │ └── daily-affirmation/ +│ │ └── daily-affirmation/index.js │ │ -│ ├── tables -│ │ └── likes/ +│ ├── tables-streams +│ │ └── likes/index.js │ │ │ └── ws -│ ├── action/ -│ ├── connect/ -│ ├── default/ -│ └── disconnect/ +│ ├── action/index.js +│ ├── connect/index.js +│ ├── default/index.js +│ └── disconnect/index.js │ └── app.arc ``` diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index 2771e039..0ac3eaae 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -11,7 +11,7 @@ Architect projects work locally and offline. It emulates most app resources defi - `@ws` - `@events` - `@queues` -- `@tables` and `@indexes` +- `@tables` and `@tables-indexes` > At this time `arc sandbox` does not emulate `@scheduled` @@ -49,7 +49,7 @@ arc sandbox [--port|--verbose|--disable-symlinks|--no-hydrate] ### Local Database -Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@indexes` found in the `app.arc` file. When Sandbox is terminated, any data written is cleared from memory. The default endpoint is `http://localhost:5000`. You can set a custom port by using an environment variable, `ARC_TABLES_PORT=5555` +Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@tables-indexes` found in the `app.arc` file. `@tables-streams` is not currently supported by dynalite. When Sandbox is terminated, any data written is cleared from memory. The default endpoint is `http://localhost:5000`. You can set a custom port by using an environment variable, `ARC_TABLES_PORT=5555` ### Connect sandbox to the staging database diff --git a/src/views/docs/en/reference/configuration/local-preferences.md b/src/views/docs/en/reference/configuration/local-preferences.md index 01c67e72..ce43b19b 100644 --- a/src/views/docs/en/reference/configuration/local-preferences.md +++ b/src/views/docs/en/reference/configuration/local-preferences.md @@ -93,7 +93,7 @@ env staging ### `useAWS` - Boolean -Advanced option that uses live AWS infrastructure where deployed, specifically: `@tables` / `@indexes` (DynamoDB), `@events` (EventBridge), and `@queues` (SQS). Notes: +Advanced option that uses live AWS infrastructure where deployed, specifically: `@tables` / `@tables-indexes` (DynamoDB), `@events` (EventBridge), and `@queues` (SQS). Notes: - To use this feature, your local AWS credentials file must have valid keys to use this infrastructure (or calls to AWS will fail) - If you do not specify an environment, `staging` will be set automatically; you can also use `production` diff --git a/src/views/docs/en/reference/project-manifest/scheduled.md b/src/views/docs/en/reference/project-manifest/scheduled.md index a7c4d953..46b02d53 100644 --- a/src/views/docs/en/reference/project-manifest/scheduled.md +++ b/src/views/docs/en/reference/project-manifest/scheduled.md @@ -8,7 +8,7 @@ Define EventBridge schedule expressions with Lambda handler functions. ### Syntax -- name +- Name - Lowercase alphanumeric string - Maximum of 20 characters - Dashes are allowed; underscores are not allowed diff --git a/src/views/docs/en/reference/project-manifest/indexes.md b/src/views/docs/en/reference/project-manifest/tables-indexes.md similarity index 80% rename from src/views/docs/en/reference/project-manifest/indexes.md rename to src/views/docs/en/reference/project-manifest/tables-indexes.md index dee3ee3f..f18103a3 100644 --- a/src/views/docs/en/reference/project-manifest/indexes.md +++ b/src/views/docs/en/reference/project-manifest/tables-indexes.md @@ -1,10 +1,12 @@ --- -title: '@indexes' +title: '@tables-indexes' category: app.arc description: Define DynamoDB table global secondary indexes. --- -Defines [Global Secondary Indexes][gsi] for your project's [DynamoDB][ddb] tables. `@indexes` should only ever be paired with [`@tables`][tables]. +Defines [Global Secondary Indexes][gsi] for your project's [DynamoDB][ddb] tables. `@tables-indexes` should only ever be paired with [`@tables`][tables]. + +> ℹ️ As of Architect v9.4, `@tables-indexes` should be used in place of `@indexes`. `@indexes` will be superseded in a future Arc release. ## Recommended @@ -16,8 +18,8 @@ Defines [Global Secondary Indexes][gsi] for your project's [DynamoDB][ddb] table ## Syntax -- `@indexes` is a feature subset of [`@tables`][tables]; as such, the names of your declared indexes must match those of your [`@tables`][tables] -- Otherwise, the basic syntax for defining `@indexes` primary keys is the same as [`@tables`][tables]: +- `@tables-indexes` is a feature subset of [`@tables`][tables]; as such, the names of your declared indexes must match those of your [`@tables`][tables] +- Otherwise, the basic syntax for defining `@tables-indexes` primary keys is the same as [`@tables`][tables]: - Partition key, defined by a `*`, is required - Sort key, defined by `**`, is optional - Currently only `*String`, `**String`, `*Number` and `**Number` are supported @@ -27,7 +29,6 @@ Defines [Global Secondary Indexes][gsi] for your project's [DynamoDB][ddb] table The following `app.arc` file defines a [DynamoDB][ddb] table with two [Global Secondary Indexes][gsi]: -
    @@ -42,7 +43,7 @@ testapp accounts accountID *String -@indexes +@tables-indexes accounts email *String name byEmail @@ -64,7 +65,7 @@ accounts "tables": [ { "accounts": { "accountID": "*String" } } ], - "indexes": [ + "tables-indexes": [ { "accounts": { "email": "*String", "name": "byEmail" } }, { "accounts": { "created": "*String", "name": "byDate" } } ] @@ -84,7 +85,7 @@ app="testapp" [tables.accounts] accountID="*String" -indexes = [ +tables-indexes = [ { "accounts" = { "email" = "*String", "name" = "byEmail" } }, { "accounts" = { "created" = "*String", "name" = "byDate" } } ] @@ -104,7 +105,7 @@ tables: - accounts: accountID: "*String" -indexes: +tables-indexes: - accounts: - email: "*String" - name: "byEmail" diff --git a/src/views/docs/en/reference/project-manifest/tables-streams.md b/src/views/docs/en/reference/project-manifest/tables-streams.md new file mode 100644 index 00000000..7630f8cd --- /dev/null +++ b/src/views/docs/en/reference/project-manifest/tables-streams.md @@ -0,0 +1,131 @@ +--- +title: '@tables-streams' +category: app.arc +description: Define DynamoDB tables with streaming changes +--- + +Define Lambda functions for streaming changes from DynamoDB tables. Respond to `insert`, `update`, and `destroy` events with a handler function. + +## Recommended Resources + +[AWS DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html) + +## Syntax + +- Name + - Lowercase alphanumeric string + - Must match a `@tables` name + +Table streams can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) and names in your project. This is beneficial when creating more than one stream function for a single table. Optionally provide a `name` and/or `src` for each table stream. + +- `name` - a string as defined in `@tables` +- `src` - path to the function source + +## Example + +This `app.arc` file defines a table with a corresponding stream handler: + + +
    + + +
    arc
    +
    + +```arc +@app +testapp + +@tables +people + pplID *String + +@tables-streams +people +# verbose custom source: +a-named-table-stream + table people + src custom/source + +``` +
    +
    + + +
    json
    +
    + +```json +{ + "app": "testapp", + "tables": [ + { + "people": { + "pplID": "*String" + } + } + ], + "tables-streams": [ + "people", + { + "a-named-table-stream": { + "name": "people", + "src": "custom/source" + } + } + ] +} +``` +
    +
    + + +
    yaml
    +
    + +```yaml +--- +app: testapp + +tables: +- people: + pplID: "*String" + +tables-streams: +- people +# verbose custom source: +- "a-named-table-stream": + name: "people" + src: "custom/source" +``` +
    +
    + + +
    toml
    +
    + +```toml +app="testapp" + +[[tables]] +[tables.people] +pplID="*String" + +tables-streams=["people"] + +# TOML doesn't allow mixed types in an array. +# Theoretically a "table" entry with a custom source would look like: + +[["tables-streams"]] +["tables-streams"."a-named-table-stream"] +name = "people" +src = "custom/source" +``` +
    +
    + +
    +
    + +> ⚠️ Unfortunately, "dynalite" (used under the hood in Architect [Sandbox](../cli/sandbox)) doesn't support streams, so emulation isn't yet supported for local development. diff --git a/src/views/docs/en/reference/project-manifest/tables.md b/src/views/docs/en/reference/project-manifest/tables.md index c443cb65..3c82b9ca 100644 --- a/src/views/docs/en/reference/project-manifest/tables.md +++ b/src/views/docs/en/reference/project-manifest/tables.md @@ -6,14 +6,15 @@ description: Define DynamoDB tables Define [DynamoDB][ddb] tables with optional: -- [streaming DB changes to Lambda functions][stream] - [encryption at rest][encryption] - [time-to-live item expiry][ttl] - [point-in-time recovery][recovery] -You can additionally define [Global Secondary Indexes][gsi] on each table you define using the [`@indexes`][indexes] pragma. +[Global Secondary Indexes][gsi] can be specified on each table you define using the [`@tables-indexes`][tables-indexes] pragma. -## Recommended +Additionally, database changes can be streamed to a function with the [`@tables-streams`][tables-streams] pragma. + +## Recommended Resources [DynamoDB][ddb] is a powerful database, though different from both SQL and NoSQL databases. It is highly recommended to dig into Amazon's resources to familiarize yourself with it: @@ -23,6 +24,7 @@ You can additionally define [Global Secondary Indexes][gsi] on each table you de ## Syntax ### Table name syntax + - Lowercase alphanumeric string - Between 3 and 255 characters - Dashes are allowed @@ -30,17 +32,18 @@ You can additionally define [Global Secondary Indexes][gsi] on each table you de - Must begin with a letter ### Table structure syntax + - Keys and Lambdas are defined by indenting two spaces - The required partition key is denoted by `*` - The optional sort key is denoted by `**` - Currently only `*String`, `**String`, `*Number` and `**Number` are supported -- Streaming data has replaced the `insert`, `update`, and `destroy` events. +- `insert`, `update`, and `destroy` events can be handled with [`@tables-streams`][tables-streams] > Note: `app.arc` creates fully isolated tables for `staging` and `production`. ### Streaming Changes to a Lambda -Define a `stream true` property under a table definition to have Architect create a [Lambda function which will receive events whenever items in the table get inserted, updated or deleted][stream]. Architect will create the Lambda for you locally under `src/streams/`. +Use the [`@tables-streams`][tables-streams] pragma to have Architect create a [Lambda function which will receive events whenever items in the table get inserted, updated or deleted][stream]. Architect will create the Lambda for you locally under `src/tables-streams/`. ### Encrypting Tables @@ -60,7 +63,7 @@ DynamoDB has a feature which lets you [recover your data][recovery] to any point ## Example -This `app.arc` file defines two database tables: +This `app.arc` file defines three database tables:
    @@ -76,7 +79,6 @@ testapp @tables people pplID *String - stream true cats pplID *String @@ -101,8 +103,7 @@ fleeting-thoughts "tables": [ { "people": { - "pplID": "*String", - "stream": true + "pplID": "*String" }, "cats": { "pplID": "*String", @@ -128,16 +129,18 @@ fleeting-thoughts ```toml app="testapp" -[tables] -[[tables.people]] +[[tables]] + +[tables.people] pplID="*String" -stream=true -[[tables.cats]] + +[tables.cats] pplID="*String" catID="**String" encrypt=true PointInTimeRecovery=true -[[tables.fleeting-thoughts]] + +[tables.fleeting-thoughts] pplID="*String" expires="TTL" ``` @@ -155,7 +158,6 @@ app: testapp tables: - people: pplID: "*String" - stream: true - cats: pplID: "*String" catID: "**String" @@ -171,12 +173,13 @@ tables:
    -[ddb]: https://aws.amazon.com/documentation/dynamodb/ +[tables-indexes]: tables-indexes +[tables-streams]: tables-streams [core]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html -[gsi]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html -[indexes]: indexes +[ddb]: https://aws.amazon.com/documentation/dynamodb/ [encryption]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EncryptionAtRest.html +[gsi]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html +[kms]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html +[recovery]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/PointInTimeRecovery.html [stream]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html [ttl]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html -[recovery]: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/PointInTimeRecovery.html -[kms]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index c171b271..b6aab7a7 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -47,7 +47,6 @@ let Reference = [ { '@aws', '@events', '@http', - '@indexes', '@macros', '@proxy', '@queues', @@ -55,6 +54,8 @@ let Reference = [ { '@shared', '@static', '@tables', + '@tables-indexes', + '@tables-streams', '@views', '@ws', ], From 16e9ae9ce9921464b26b4f98a8b98df261a102b5 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 16 Nov 2021 16:52:46 -0700 Subject: [PATCH 269/680] 3.6.19 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64e8b97a..377c3c1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.18", + "version": "3.6.19", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From e9003b8547ba4aee091293fe7a0028f2aa0503c5 Mon Sep 17 00:00:00 2001 From: Ryan Bethel Date: Thu, 18 Nov 2021 09:56:54 -0500 Subject: [PATCH 270/680] clarify asap call --- src/views/docs/en/reference/runtime-helpers/node.js.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index 2e13103b..0a5e23f2 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -628,9 +628,9 @@ exports.handler = asap(params) ```javascript // asap as arc.http.async middleware let arc = require('@architect/functions') -let asap = require('@architect/asap')() +let asap = require('@architect/asap') -exports.handler = arc.http.async(render, asap) +exports.handler = arc.http.async(render, asap()) async function render (req) { // If user is logged in, show them a custom logged in page From 2a9ca07f6bfc3f1f1261b998639d1d820ef2ac01 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 19 Nov 2021 12:26:25 -0700 Subject: [PATCH 271/680] Update detailed-aws-setup.md --- src/views/docs/en/get-started/detailed-aws-setup.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/get-started/detailed-aws-setup.md b/src/views/docs/en/get-started/detailed-aws-setup.md index 468c3e17..38a46cd0 100644 --- a/src/views/docs/en/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/get-started/detailed-aws-setup.md @@ -59,6 +59,9 @@ The [AWS Command Line Interface](https://docs.aws.amazon.com/cli/) is the main i You'll need an Amazon Web Services account and credentials set up on your development machine. If you haven't done it before, here's a useful guide for [Configuring the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html). +Architect, as a deployment tool, requires an IAM user account with `AdministratorAccess`. In turn, Architect will create and attach least-privilege IAM roles to runtime resources. +It is possible to limit Architect credentials to IAM, CloudFormation, etc., but this is effectively granting `AdministratorAccess` since that role would have the ability to create an IAM role with `AdministratorAccess`. + On \*nix systems AWS Credentials are listed in: ```bash @@ -92,7 +95,7 @@ You will also need to set a default profile and region with the environment vari - `AWS_PROFILE` - `AWS_REGION` -To set these variables on Linux, macOS, or UNIX, use export in your `~/.bashrc` (or equivalent shell configuration): +To set these variables on Linux, macOS, or UNIX, use `export` in your shell's configuration (eg. `~/.zshrc` or `~/.bashrc`): ```bash export AWS_PROFILE=work @@ -108,7 +111,6 @@ $env:AWS_REGION='us-west-1' > If you prefer, you can also use: *Control Panel » System » Advanced System Settings » Environment Variables*. - ### Install Architect The following command uses `npm`, the package manager for Node, to install Architect and the AWS SDK globally. This will allow you to use Architect in any directory on your computer. From 126a19f2edb5b2afc6a3207748f35b67ce4c9867 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 19 Nov 2021 12:31:53 -0700 Subject: [PATCH 272/680] eg. -> e.g. --- src/views/docs/en/get-started/detailed-aws-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/get-started/detailed-aws-setup.md b/src/views/docs/en/get-started/detailed-aws-setup.md index 38a46cd0..9551b4f8 100644 --- a/src/views/docs/en/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/get-started/detailed-aws-setup.md @@ -95,7 +95,7 @@ You will also need to set a default profile and region with the environment vari - `AWS_PROFILE` - `AWS_REGION` -To set these variables on Linux, macOS, or UNIX, use `export` in your shell's configuration (eg. `~/.zshrc` or `~/.bashrc`): +To set these variables on Linux, macOS, or UNIX, use `export` in your shell's configuration (e.g. `~/.zshrc` or `~/.bashrc`): ```bash export AWS_PROFILE=work From a91204f2851de566a19d69e3dee5bfc83faaea58 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Sun, 21 Nov 2021 09:31:47 -0800 Subject: [PATCH 273/680] Additional AWS guide edits --- .../docs/en/get-started/detailed-aws-setup.md | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/src/views/docs/en/get-started/detailed-aws-setup.md b/src/views/docs/en/get-started/detailed-aws-setup.md index 9551b4f8..5f151682 100644 --- a/src/views/docs/en/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/get-started/detailed-aws-setup.md @@ -8,59 +8,68 @@ description: Setting up, installing, and working with Architect and AWS. ## AWS deployment requirements -1. [Node](https://nodejs.org) for Architect +1. [Node.js](https://nodejs.org) for Architect 2. [Python](https://www.python.org) for the AWS CLI -3. Any additional [supported runtimes](#runtime-environments) you plan to use +3. Any additional [supported runtimes](#runtime-environments) you plan to use in your application 4. [AWS CLI](#aws-cli) 5. [AWS credentials](#credentials) 6. [Architect CLI](#install-architect) --- -### Runtime Environments +### Runtime environments Architect supports the following runtime versions: -- **Node.js**: `14.x` (default) using `npm` +- **Node.js**: `>= 14.x` using `npm` + - Unless otherwise specified in your project manifest, Node.js is the default runtime for new functions +- **Python**: `3.9`, `3.8`, `3.7`, or `3.6` using `pip3` - **Ruby**: `2.7` using `bundle` -- **Python**: `3.9`, `3.8`, `3.7`, and `3.6` using `pip3` - **Deno**: `1.6.x` ([under development](../reference/runtime-helpers/deno)) -> ⚠️ Working locally with the Architect `sandbox` requires target runtimes to be available in your `$PATH`. +> ⚠️ Working locally with the Architect `sandbox` requires target runtimes to be available in your `$PATH`. -Additionally, standard AWS managed runtimes are supported in live infra, but not while working locally with [Sandbox](../reference/cli/sandbox) (at present): +Additionally, all other standard AWS-managed runtimes are supported in Architect applications (but may not be supported in [Sandbox](../reference/cli/sandbox)), including: - **Go**: `1.x` - **.NET**: `3.1` - **Java**: `11`, and `8` -Architect also supports _any custom runtime_ in live infra using either [Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) or [Lambda container images](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html). +Architect also supports _any custom runtime_ in using either [Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) or [Lambda container images](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html). Change a project's default runtime by specifying [an explicit environment](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) or an alias in `app.arc` with [the `@aws` pragma](../reference/project-manifest/aws). -#### Example +#### Examples ```arc +# version pins the default runtime to Python 3.8 @aws runtime python3.8 ``` -> ℹ️ This setting can be overridden on a function-by-function basis with [`config.arc`](../reference/configuration/function-config). +```arc +# always run the latest supported version of Python +@aws +runtime python +``` + +> ℹ️ This setting can be overridden on a per-function basis with [`config.arc`](../reference/configuration/function-config). --- ### AWS CLI -The [AWS Command Line Interface](https://docs.aws.amazon.com/cli/) is the main interface for interacting with all parts of AWS using your computer's terminal. Architect uses the AWS CLI to package and deploy CloudFormation. Follow this guide to [installing the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) for your preferred environment. +The [AWS Command Line Interface](https://docs.aws.amazon.com/cli/) is the main interface for interacting with all parts of AWS using your computer's terminal. Architect uses the AWS CLI to package and deploy your app via CloudFormation. Follow this guide to [installing the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) for your preferred environment. --- ### Credentials -You'll need an Amazon Web Services account and credentials set up on your development machine. If you haven't done it before, here's a useful guide for [Configuring the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html). +You'll need an Amazon Web Services account and credentials set up on your development machine and / or CI systems. If you yet set it up, here's a useful guide for [Configuring the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html). -Architect, as a deployment tool, requires an IAM user account with `AdministratorAccess`. In turn, Architect will create and attach least-privilege IAM roles to runtime resources. -It is possible to limit Architect credentials to IAM, CloudFormation, etc., but this is effectively granting `AdministratorAccess` since that role would have the ability to create an IAM role with `AdministratorAccess`. +In the context of a deployment tool, Architect requires account credentials with IAM `AdministratorAccess` privileges. In turn, Architect will create and attach least-privilege IAM roles to runtime resources within your application, ensuring strict security boundaries by default. + +> ℹ️ While it is possible to limit Architect's deployment credentials to specific IAM and CloudFormation privileges, such an exercise would only be performative. Credentials capable of creating IAM roles can grant and attach new roles with `AdministratorAccess`. On \*nix systems AWS Credentials are listed in: @@ -90,7 +99,7 @@ aws_access_key_id=xxx aws_secret_access_key=xxx ``` -You will also need to set a default profile and region with the environment variables +While it is recommended to explicitly declare your application's AWS profile and region, you may also want to use a default profile and region on your machine with the following environment variables: - `AWS_PROFILE` - `AWS_REGION` @@ -111,16 +120,25 @@ $env:AWS_REGION='us-west-1' > If you prefer, you can also use: *Control Panel » System » Advanced System Settings » Environment Variables*. + ### Install Architect -The following command uses `npm`, the package manager for Node, to install Architect and the AWS SDK globally. This will allow you to use Architect in any directory on your computer. +The following command uses `npm`, the package manager for Node.js. + +To create an entirely new Architect project: ```bash -npm i -g @architect/architect aws-sdk +npm init @architect ./testapp ``` -Or, if you prefer, you can install Architect locally into a project: +To install Architect locally into an existing project: ```bash npm init @architect ./testapp ``` + +Or you can install Architect globally, enabling you to use Architect from any directory on your computer. When doing so, you should also be sure to install the AWS SDK globally as well. + +```bash +npm i -g @architect/architect aws-sdk +``` From d7aa400fd5f7fb35c0dd00d0fd1aa874367b47d1 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Sun, 21 Nov 2021 11:03:43 -0800 Subject: [PATCH 274/680] 3.6.20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 377c3c1e..54c1ac61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.19", + "version": "3.6.20", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From aa8054eaab13f44f219a742faa948d982b667388 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 19 Nov 2021 22:30:40 -0700 Subject: [PATCH 275/680] add tap-arc, remove tap-spec --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 54c1ac61..491494c4 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,11 @@ "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", - "link-checker": "node ./scripts/link-checker.js | tap-spec", + "link-checker": "node ./scripts/link-checker.js | tap-arc", "lint": "eslint src --fix", "start": "sandbox", - "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-spec", - "test:unit:backend": "tape 'test/backend/**/*.js' | tap-spec", + "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-arc", + "test:unit:backend": "tape 'test/backend/**/*.js' | tap-arc", "test": "npm run spellcheck && npm run lint && npm run test:unit:frontend && npm run test:unit:backend" }, "dependencies": { @@ -34,7 +34,7 @@ "eslint": "^8.1.0", "linkinator": "^2.14.5", "spellchecker-cli": "^4.8.0", - "tap-spec": "^5.0.0", + "tap-arc": "^0.1.0", "tape": "^5.3.1", "tiny-json-http": "^7.3.1" }, From 689b6f634d43de09816fdd26337c72d2515c5aca Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 30 Nov 2021 18:24:05 -0700 Subject: [PATCH 276/680] small formatting changes --- .../reference/configuration/function-config.md | 17 +---------------- .../project-manifest/tables-indexes.md | 2 +- .../docs/en/reference/project-manifest/ws.md | 1 - 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md index bed9bf42..22ae6d2e 100644 --- a/src/views/docs/en/reference/configuration/function-config.md +++ b/src/views/docs/en/reference/configuration/function-config.md @@ -24,7 +24,7 @@ Configure individual Lambda function properties (e.g. `src/http/get-index/config > Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB. -### Example `config.arc` +## Example `config.arc` ```arc @aws @@ -51,8 +51,6 @@ Configure Lambda function `runtime`: See [@aws](../project-manifest/aws) for further reference. -### Example - ```arc @aws runtime ruby @@ -64,8 +62,6 @@ Configure Lambda function `memory` between `128` MB to `10240` MB, in `1` MB inc Memory size also directly correlates with CPU speed; higher memory levels are available in more capable Lambda clusters -### Example - ```arc @aws memory 1024 @@ -77,8 +73,6 @@ Configure Lambda function `timeout` in seconds to a max of `900`. (`15` minutes. The default timeout (if no value supplied) is `5`. (`5` seconds.) -### Example - ```arc @aws timeout 30 @@ -88,8 +82,6 @@ timeout 30 Configure Lambda function concurrency. If not present concurrency is unthrottled. -#### Examples - Limit execution to one invocation at a time ```arc @@ -112,8 +104,6 @@ Configure Lambda function `layers` with max 5 Lambda Layer ARNs. > Warning: Lambda Layers must be in the same region as they are deployed -### Examples - Add one layer: ```arc @@ -142,9 +132,6 @@ Configuring one or more policies will completely remove all of Architect's defau > Note: `architect-default-policies` is an internal Architect framework setting based on the least-privilege permissions specific to your project. It is not a managed / public IAM policy, and will not be found in your AWS console. - -### Examples - Lambda only has a single set of permissions (as defined by the AWS-managed `S3CrudPolicy` policy): ```arc @@ -180,8 +167,6 @@ Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambd > Note: locally, Architect Sandbox executes the function's runtime with your machine's native architecture. -### Example - ```arc @aws architecture arm64 diff --git a/src/views/docs/en/reference/project-manifest/tables-indexes.md b/src/views/docs/en/reference/project-manifest/tables-indexes.md index f18103a3..6a3d4217 100644 --- a/src/views/docs/en/reference/project-manifest/tables-indexes.md +++ b/src/views/docs/en/reference/project-manifest/tables-indexes.md @@ -8,7 +8,7 @@ Defines [Global Secondary Indexes][gsi] for your project's [DynamoDB][ddb] table > ℹ️ As of Architect v9.4, `@tables-indexes` should be used in place of `@indexes`. `@indexes` will be superseded in a future Arc release. -## Recommended +## Recommended Resources [DynamoDB][ddb] is a powerful database, though different from both SQL and NoSQL databases. It is highly recommended to dig into Amazon's resources to familiarize yourself with it: diff --git a/src/views/docs/en/reference/project-manifest/ws.md b/src/views/docs/en/reference/project-manifest/ws.md index 06037797..2737e170 100644 --- a/src/views/docs/en/reference/project-manifest/ws.md +++ b/src/views/docs/en/reference/project-manifest/ws.md @@ -22,7 +22,6 @@ This `app.arc` file defines both HTTP and WebSocket endpoints: myapp @ws - ```
    From 9cf715d0393db4cf03296dfcd3523227224040ec Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 30 Nov 2021 18:29:19 -0700 Subject: [PATCH 277/680] Update aws.md use headers, add layers and policies, and format runtimes in a table --- .../docs/en/reference/project-manifest/aws.md | 106 +++++++++++------- 1 file changed, 66 insertions(+), 40 deletions(-) diff --git a/src/views/docs/en/reference/project-manifest/aws.md b/src/views/docs/en/reference/project-manifest/aws.md index 5c373506..2d31cef0 100644 --- a/src/views/docs/en/reference/project-manifest/aws.md +++ b/src/views/docs/en/reference/project-manifest/aws.md @@ -8,48 +8,76 @@ Define AWS specific configuration for an entire project or [per function](../con ## Syntax -- `region`: [AWS region ID](https://docs.aws.amazon.com/general/latest/gr/rande.html) of the region you'll deploy this project to - - If not specified, defaults to `us-west-2` -- `profile`: name of the profile you prefer to use with this project, as defined in your local AWS profile - - Can also be specified in `AWS_PROFILE` environment variable - - Required to deploy to AWS -- `runtime`: Lambda runtime, as defined by the [`lambda-runtimes`](https://github.com/architect/lambda-runtimes/blob/cad3b158968805a01103e47c08da48132620594e/cjs/index.js) lib: - - Explicit runtime version: - - `nodejs14.x` (default) - - `nodejs12.x` - - `python3.9` - - `python3.8` - - `ruby2.7` - - Explicit but unsupported locally in [Sandbox](../cli/sandbox): - - `dotnetcore3.1` - - `go1.x` - - `java11` - - `java8` - - Simple runtime alias (defaults to the latest version): - - `node` / `nodejs` / `node.js` - - `python` / `py` - - `ruby` / `rb` - - `java` - - `golang` / `go` - - `dotnet` / `.net` -- `bucket`: bucket (in same region) for CloudFormation deployment artifacts - - If not specified, a secure deployment bucket will be auto-created for your app -- `apigateway`: API Gateway API type, can be one of: +### `region` + +[AWS region ID](https://docs.aws.amazon.com/general/latest/gr/rande.html) where the project will be deployed. +- Defaults to `us-west-2` + +### `profile` + +Local AWS profile name to use with this project, as defined in your [local AWS configuration](../../get-started/detailed-aws-setup#credentials). +- Can also be specified in `AWS_PROFILE` environment variable +- Required to deploy to AWS + +### `runtime` + +Lambda runtime, as defined by the [`lambda-runtimes`](https://github.com/architect/lambda-runtimes/blob/cad3b158968805a01103e47c08da48132620594e/cjs/index.js) library. + +> ℹ️ Local [Sandbox](../cli/sandbox) support is currently limited to Node.js, Python, and Ruby. + +| Runtime | Versions | Example | Alias1 | +|---------|--------------|--------------------|---------------------------| +| Node.js | 12.x, 14.x | `nodejs14.x` | `node` `nodejs` `node.js` | +| Python | 3.6 - 3.9 | `python3.9` | `python` `py` | +| Ruby | 2.7 | `ruby2.7` | `ruby` `rb` | +| .NET | 3.1 | `dotnetcore3.1` | `dotnet` `.net` | +| Go | 1.x | `go1.x` | `golang` `go` | +| Java | 8, 8.al2, 11 | `java11` | `java` | + +1. Runtime aliases always default to the latest runtime version; `py` is effectively `python3.9`. + +### `bucket` + +Bucket name (in same region) for CloudFormation deployment artifacts. +- If not specified, a secure deployment bucket will be automatically created + +### `policies` + +Configure custom Lambda function `policies`, enabling granular and specific privileges and access controls. + +The `policies` setting takes one or more IAM policy ARNs or AWS-managed policy names (e.g. `AmazonDynamoDBFullAccess`). + +Configuring one or more policies will completely remove all of Architect's default Lambda privileges. To restore Architect's default privileges, include a policy named `architect-default-policies`. + +> Note: `architect-default-policies` is an internal Architect framework setting based on the least-privilege permissions specific to your project. It is not a managed / public IAM policy, and will not be found in your AWS console. + +### `layers` + +Configure Lambda function `layers` with max 5 Lambda Layer ARNs. Lambda Layers must be in the same region as they are deployed. + +### `apigateway` + +API Gateway API type, can be one of: - `http` (default) - `HTTP` API + Lambda payload format version 2.0 - `httpv2` – aliased of `http` - `httpv1` - `HTTP` API + Lambda payload format version 1.0 - `rest` - `REST` API + original API Gateway payload format -- `architecture`: Lambda [CPU Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) + +### `architecture` + +Lambda [CPU Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) - `x86_64` (default) - 64-bit x86 architecture - `arm64` - (only available in certain AWS regions) 64-bit ARM architecture -Alternatively, if you want a less granular approach, you can declare your preferred region and profile in your `.bashrc` ([more information here](https://docs.aws.amazon.com/cli/latest/userguide/cli-environment.html)). +## Environment Variables + +Alternatively, if you want a less granular approach, you can declare your preferred region and profile in your shell config like `.bashrc` ([more information here](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)). -If you have AWS exports in your `.bashrc` and `@aws` specified in your `app.arc` project, the `@aws` section will win. +If you have AWS exports in your shell config and `@aws` specified in your `app.arc` project, the `@aws` section will win. -## Example +## Examples -For example, to deploy Ruby to the northern California AWS AZ with your AWS `work` profile's credentials, use: +For example, to deploy Ruby to the northern California AWS AZ, with your AWS `work` profile's credentials, and specific policies use:
    @@ -63,6 +91,9 @@ For example, to deploy Ruby to the northern California AWS AZ with your AWS `wor runtime ruby region us-west-1 profile work +policies + S3CrudPolicy + architect-default-policies ```
    @@ -117,17 +148,12 @@ aws:
    - - +layers arn:aws:lambda:us-west-2:800406105498:layer:nsolid-node-10:6 +``` From 70a0dd813ae43d574728cb791395d291e5c3d7cb Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 30 Nov 2021 10:37:21 -0700 Subject: [PATCH 278/680] Update http.md mention any, add head and options method --- .../docs/en/reference/project-manifest/http.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/views/docs/en/reference/project-manifest/http.md b/src/views/docs/en/reference/project-manifest/http.md index 133b5fc5..14ea314f 100644 --- a/src/views/docs/en/reference/project-manifest/http.md +++ b/src/views/docs/en/reference/project-manifest/http.md @@ -11,15 +11,19 @@ Define HTTP routes in API Gateway with Lambda handler functions. Each route is made up of two parts: HTTP verb and a route path. - HTTP Verb + - `delete` - `get` + - `head` + - `options` + - `patch` - `post` - `put` - - `patch` - - `delete` + - `any`1 - Route Path - Dashes and underscores are not allowed - Must begin with a letter + - Advised maximum of 100 characters for paths - URL parameters are defined with a leading colon (`:`) Routes can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `method` and `src` for each route: @@ -27,9 +31,7 @@ Routes can use more verbose configuration to allow for [custom source paths](../ - `method` - HTTP verb - `src` - path to the function source -### Additional bits - -- Advised maximum of 100 characters for paths +1. While not an HTTP verb, functions declared with `any` will be called for any valid HTTP method directed at that route. ## Example @@ -150,6 +152,5 @@ Which utilizes the following project directory structure: └── package.json ``` -> ⚠️ Handlers generated from routes with URL parameters i.e. `/pages/:dateID`, substitute `:` for `000`. -> +> ⚠️ Handlers generated from routes with URL parameters i.e. `/pages/:dateID`, substitute `:` for `000`. > This is a deliberate convention to ensure valid directory names that correspond with your defined parameterized route. From 5803e917d1c1fd19ddb32376cea70fef5846caa3 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 1 Dec 2021 13:09:19 -0700 Subject: [PATCH 279/680] 3.6.21 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 491494c4..e57858c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.20", + "version": "3.6.21", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 9220f0fa9e076176be488b81f6ad2b8eaafa6d25 Mon Sep 17 00:00:00 2001 From: Shalvah Date: Wed, 1 Dec 2021 22:01:13 +0100 Subject: [PATCH 280/680] Correct quickstart instructions (#464) * Correct quickstart instructions * Update all refernces to `npm init` * Switch to PowerShell-specific commands * Correct component syntax --- .../docs/en/get-started/detailed-aws-setup.md | 40 +++++++++++ src/views/docs/en/get-started/quickstart.md | 24 ++++++- .../en/guides/backend/events-and-queues.md | 68 ++++++++++++++++++- .../docs/en/guides/frontend/middleware.md | 20 ++++++ .../en/guides/frontend/single-page-apps.md | 23 +++++++ src/views/docs/en/reference/cli/init.md | 20 ++++++ 6 files changed, 191 insertions(+), 4 deletions(-) diff --git a/src/views/docs/en/get-started/detailed-aws-setup.md b/src/views/docs/en/get-started/detailed-aws-setup.md index 5f151682..93a832ac 100644 --- a/src/views/docs/en/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/get-started/detailed-aws-setup.md @@ -127,15 +127,55 @@ The following command uses `npm`, the package manager for Node.js. To create an entirely new Architect project: + +
    + +
    Bash/cmd.exe
    +
    + ```bash npm init @architect ./testapp ``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" ./testapp +``` +
    +
    +
    +
    To install Architect locally into an existing project: + +
    + +
    Bash/cmd.exe
    +
    + ```bash npm init @architect ./testapp ``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" ./testapp +``` +
    +
    +
    +
    Or you can install Architect globally, enabling you to use Architect from any directory on your computer. When doing so, you should also be sure to install the AWS SDK globally as well. diff --git a/src/views/docs/en/get-started/quickstart.md b/src/views/docs/en/get-started/quickstart.md index cf0d3643..13f752de 100644 --- a/src/views/docs/en/get-started/quickstart.md +++ b/src/views/docs/en/get-started/quickstart.md @@ -8,14 +8,34 @@ description: Get started quickly with Architect Assuming Node.js 14+ is installed, open your terminal and create a new Architect project: + +
    + +
    Bash/cmd.exe
    +
    + ```bash -npm init @architect new-app +npm init @architect your-app +``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" your-app ``` +
    +
    +
    +
    Start the local dev server: ```bash -cd new-app +cd your-app npx arc sandbox ``` > `Cmd / Ctrl + c` exits the sandbox diff --git a/src/views/docs/en/guides/backend/events-and-queues.md b/src/views/docs/en/guides/backend/events-and-queues.md index 1cb90b40..34ed365c 100644 --- a/src/views/docs/en/guides/backend/events-and-queues.md +++ b/src/views/docs/en/guides/backend/events-and-queues.md @@ -34,10 +34,32 @@ In this tutorial, we will create an event topic, POST JSON data to invoke a subs 1. We will start with a fresh project and install dependencies. -``` bash -npm init @architect ./arc-event-app + +
    + +
    Bash/cmd.exe
    +
    + +```bash +npm init @architect arc-event-app cd arc-event-app ``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" arc-event-app +cd arc-event-app +``` +
    +
    +
    +
    + 2. Open up your `app.arc` file and add the `@event` pragma along with a POST route ```arc @@ -137,10 +159,31 @@ Another common background task is `@scheduled` functions. These functions are in The first thing we will need is a fresh Architect project. We can create one directly from the terminal. + +
    + +
    Bash/cmd.exe
    +
    + ```bash npm init @architect ./arc-scheduled-app cd arc-scheduled-app ``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" ./arc-scheduled-app +cd arc-scheduled-app +``` +
    +
    +
    +
    Now we can open up the `app.arc` file and add a scheduled function to the manifest. @@ -231,10 +274,31 @@ The `Events` property on the `Daily` function shows that this is a scheduled eve Let's make an example message queue by starting with a fresh Architect project. + +
    + +
    Bash/cmd.exe
    +
    + ```bash npm init @architect ./arc-queues-app cd arc-queues-app ``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" ./arc-queues-app +cd arc-queues-app +``` +
    +
    +
    +
    Open up the `app.arc` file and modify the manifest to include our `@queues` function as follows: diff --git a/src/views/docs/en/guides/frontend/middleware.md b/src/views/docs/en/guides/frontend/middleware.md index be797ff4..a9cdcc51 100644 --- a/src/views/docs/en/guides/frontend/middleware.md +++ b/src/views/docs/en/guides/frontend/middleware.md @@ -263,9 +263,29 @@ Architect also has a middleware function to wrap Express.js logic, this is good This command will create a new directory, install a local version of Architect, and generate a folder structure. + +
    + +
    Bash/cmd.exe
    +
    + ```bash npm init @architect ./myexpress ``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" ./myexpress +``` +
    +
    +
    +
    2. Take a look inside and you will see one HTTP function, `get-index`. This will be a single Lambda that will be our entire Express app behind an API Gateway endpoint. diff --git a/src/views/docs/en/guides/frontend/single-page-apps.md b/src/views/docs/en/guides/frontend/single-page-apps.md index e6fec0ff..4033d97c 100644 --- a/src/views/docs/en/guides/frontend/single-page-apps.md +++ b/src/views/docs/en/guides/frontend/single-page-apps.md @@ -202,12 +202,35 @@ In this guide, we'll be using the frontend library [React](https://reactjs.org/) Initialize an Architect project, change directories into the project folder, create a `package.json` file, and install NPM packages: + +
    + +
    Bash/cmd.exe
    +
    + ```bash npm init @architect --static ./my-spa cd my-spa npm init -f npm install react react-dom parcel-bundler @architect/sandbox ``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" --static ./my-spa +cd my-spa +npm init -f +npm install react react-dom parcel-bundler @architect/sandbox +``` +
    +
    +
    +
    2. Update the build folder configuration in `app.arc` diff --git a/src/views/docs/en/reference/cli/init.md b/src/views/docs/en/reference/cli/init.md index 3d92f963..3161906e 100644 --- a/src/views/docs/en/reference/cli/init.md +++ b/src/views/docs/en/reference/cli/init.md @@ -30,6 +30,26 @@ arc init ### Create a Node app with Architect installed locally + +
    + +
    Bash/cmd.exe
    +
    + ```bash npm init @architect myapp ``` +
    +
    + + +
    PowerShell
    +
    + +```powershell +npm init "@architect" myapp +``` +
    +
    +
    +
    From 47f01be110e2aba16dcd42366ae3f4261352c49c Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Wed, 1 Dec 2021 16:04:00 -0500 Subject: [PATCH 281/680] 3.6.22 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e57858c8..eec9ebe7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.21", + "version": "3.6.22", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From b49aa37d80324acc20cb96165dabd30c1fa753cc Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 6 Dec 2021 12:00:21 -0700 Subject: [PATCH 282/680] sandbox + Monterey callout (#468) --- src/views/docs/en/reference/cli/sandbox.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index 0ac3eaae..9a9384e2 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -21,6 +21,9 @@ Architect projects work locally and offline. It emulates most app resources defi arc sandbox [--port|--verbose|--disable-symlinks|--no-hydrate] ``` +> 🏗️ "macOS Monterey" [uses port 5000 for AirPlay features](https://developer.apple.com/forums/thread/682332). To avoid port collision, start sandbox with a custom tables port: `ARC_TABLES_PORT=5555 arc sandbox`. +The default port may change in Architect 10. + ### Flags - `-p`, `--port`, `port` Manually specify HTTP port (default `3333`) @@ -40,7 +43,7 @@ arc sandbox [--port|--verbose|--disable-symlinks|--no-hydrate] - `ARC_EVENTS_PORT`- Manually specify event bus port - Defaults to `3334` - `ARC_TABLES_PORT`- Manually specify local DynamoDB port - - Defaults to `3335` + - Defaults to `5000` - `ARC_LOCAL`- If present and used in conjunction with `NODE_ENV=staging|production`, emulates live `staging` or `production` environment - Uses your local `.arc-env` file's `@staging` or `@production` environment variables - Connects Sandbox to live AWS events and DynamoDB infra From 2c5bfec13f290cc0f527b5e78aed0e8fe27c7095 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 6 Dec 2021 12:06:00 -0700 Subject: [PATCH 283/680] 3.6.23 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eec9ebe7..dee5b4e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.22", + "version": "3.6.23", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 90c8dc4f94ed09abe092a6f03e5f9c86f81be704 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 23 Nov 2021 17:17:07 -0700 Subject: [PATCH 284/680] prevent right sidebar observer from erroring when link unavailable --- public/index.js | 3 ++- public/static.json | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/public/index.js b/public/index.js index aac64218..262737d2 100644 --- a/public/index.js +++ b/public/index.js @@ -95,8 +95,9 @@ entries.forEach(entry => { if (entry.isIntersecting) { const id = entry.target.getAttribute('id') + const sectionLink = document.querySelector(`.right-sidebar a[href="#${id}"]`) allSectionLinks.forEach(link => link.classList.remove('active')) - document.querySelector(`.right-sidebar a[href="#${id}"]`).classList.add('active') + if (sectionLink) sectionLink.classList.add('active') } }) }, { diff --git a/public/static.json b/public/static.json index 5035fea6..e24210d4 100644 --- a/public/static.json +++ b/public/static.json @@ -1,6 +1,6 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-5d5fd54a2b.js", + "index.js": "index-baecb620e3.js", "playground.html": "playground-2fe1115dbf.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", @@ -9,4 +9,4 @@ "css/index.css": "css/index-547bdacc3e.css", "css/styles.css": "css/styles-cf4510a1b6.css", "css/syntax.css": "css/syntax-0339098006.css" -} +} \ No newline at end of file From 952426210379056d74912f34c0ecd51ec838fd56 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 23 Nov 2021 17:17:25 -0700 Subject: [PATCH 285/680] upgrade arc/functions and tap-arc --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dee5b4e0..a8aa444e 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@architect/asap": "^4.1.0", - "@architect/functions": "^4.0.0", + "@architect/functions": "^4.1.1", "@architect/inventory": "^2.1.1", "@architect/package": "^7.1.1", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", @@ -34,7 +34,7 @@ "eslint": "^8.1.0", "linkinator": "^2.14.5", "spellchecker-cli": "^4.8.0", - "tap-arc": "^0.1.0", + "tap-arc": "^0.1.1", "tape": "^5.3.1", "tiny-json-http": "^7.3.1" }, From b064da2db5f1194748987c8d9c00c9466229a421 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 23 Nov 2021 17:18:23 -0700 Subject: [PATCH 286/680] update runtime helper docs frontmatter --- src/views/docs/en/reference/runtime-helpers/deno.md | 4 ++-- src/views/docs/en/reference/runtime-helpers/node.js.md | 6 +++--- src/views/docs/en/reference/runtime-helpers/python.md | 4 ++-- src/views/docs/en/reference/runtime-helpers/ruby.md | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/views/docs/en/reference/runtime-helpers/deno.md b/src/views/docs/en/reference/runtime-helpers/deno.md index bea7970e..79b4603a 100644 --- a/src/views/docs/en/reference/runtime-helpers/deno.md +++ b/src/views/docs/en/reference/runtime-helpers/deno.md @@ -1,6 +1,6 @@ --- -title: Deno -category: Runtime +title: Deno runtime helpers +category: Runtime helpers description: Deno runtime support --- diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index 0a5e23f2..6f62a1a0 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -1,7 +1,7 @@ --- -title: Node.js -category: Runtime -description: Node.js runtime helpers +title: Node.js runtime helpers +category: Runtime helpers +description: Node.js runtime support --- Architect runtime helpers are optional, and designed to make it significantly easier to work with AWS CloudFormation provisioned resources and related assets. diff --git a/src/views/docs/en/reference/runtime-helpers/python.md b/src/views/docs/en/reference/runtime-helpers/python.md index a795b4e9..98b79afc 100644 --- a/src/views/docs/en/reference/runtime-helpers/python.md +++ b/src/views/docs/en/reference/runtime-helpers/python.md @@ -1,6 +1,6 @@ --- -title: Python -category: Runtime +title: Python runtime helpers +category: Runtime helpers description: Python runtime support --- diff --git a/src/views/docs/en/reference/runtime-helpers/ruby.md b/src/views/docs/en/reference/runtime-helpers/ruby.md index 23fb1246..93ee05c4 100644 --- a/src/views/docs/en/reference/runtime-helpers/ruby.md +++ b/src/views/docs/en/reference/runtime-helpers/ruby.md @@ -1,6 +1,6 @@ --- -title: Ruby -category: Runtime +title: Ruby runtime helpers +category: Runtime helpers description: Ruby runtime support --- From c804e7297cdf7c3e8eacccdf606b3069ba611703 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 23 Nov 2021 20:05:15 -0700 Subject: [PATCH 287/680] move page toc to component as document outline add outline entry for scroll to top --- public/index.js | 12 ++++++++++ public/static.json | 2 +- src/http/get-docs-000lang-catchall/index.js | 9 +++---- .../modules/components/document-outline.js | 24 +++++++++++++++++++ src/views/modules/document/html.js | 11 ++++----- 5 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 src/views/modules/components/document-outline.js diff --git a/public/index.js b/public/index.js index 262737d2..8f250851 100644 --- a/public/index.js +++ b/public/index.js @@ -72,6 +72,7 @@ codeBlock.appendChild(button) } + // Document percent read progress bar let bar = document.querySelector('.indicator') bar.style.width = getScrollPercent(main) main.onscroll = setReadPercent.bind(null, main) @@ -89,6 +90,17 @@ return Math.floor((currentTop / currentHeight) * 100) } + /* Right sidebar behavior */ + // ↑ Top link fancy scroll enhancement + document.getElementById('top-link').onclick = function (e) { + e.preventDefault() + main + .querySelectorAll('div > h1')[0] + .scrollIntoView({ behavior: 'smooth' }) + history.replaceState(null, null, ' ') + } + + // highlight doc outline item per scroll position window.addEventListener('DOMContentLoaded', () => { const observer = new IntersectionObserver(entries => { const allSectionLinks = document.querySelectorAll('.right-sidebar li a') diff --git a/public/static.json b/public/static.json index e24210d4..5ff30a64 100644 --- a/public/static.json +++ b/public/static.json @@ -1,6 +1,6 @@ { "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-baecb620e3.js", + "index.js": "index-e3a8440e18.js", "playground.html": "playground-2fe1115dbf.html", "playground.js": "playground-67bb53bc87.js", "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 7af6078e..d8caad1d 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -23,7 +23,7 @@ const NotFound = require('@architect/views/modules/components/not-found.js').def const algolia = require('@architect/views/modules/components/algolia.js').default -// reproduces the slugify algorithm used in markdown-it-anchor +// reproduces the slugify algorithm used in markdown-it-external-anchor const slugify = (s) => encodeURIComponent(String(s).trim().toLowerCase().replace(/\s+/g, '-')) const cache = {} // cheap warm cache @@ -87,7 +87,7 @@ async function handler (req) { } let frontmatter = {} - let pageToC = '' + let docOutline = '' const markdown = new Markdown({ linkify: true, html: true, @@ -103,7 +103,7 @@ async function handler (req) { tocFirstLevel: 2, tocLastLevel: 6, tocCallback: function (tocMarkdown, tocArray, tocHtml) { - pageToC = tocHtml + docOutline = tocHtml } }) .use(frontmatterParser, function (str) { @@ -125,13 +125,14 @@ async function handler (req) { description, editURL, lang, - pageToC, + docOutline, sections, scripts: [ '/index.js', '/components/arc-viewer.js', '/components/arc-tab.js' ], + titleSlug: slugify(title), thirdparty: algolia(lang), title, toc diff --git a/src/views/modules/components/document-outline.js b/src/views/modules/components/document-outline.js new file mode 100644 index 00000000..682fef08 --- /dev/null +++ b/src/views/modules/components/document-outline.js @@ -0,0 +1,24 @@ +export default function DocumentOutline (props = {}) { + const { + docOutline = '', + titleSlug = '', + title = 'Top', + } = props + + return ` + + ` +} + + diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index 38685a63..5f55d3b9 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -1,4 +1,5 @@ import Banner from '../components/banner.js' +import DocumentOutline from '../components/document-outline.js' import EditLink from '../components/edit-link.js' import Head from './head.js' import Script from './script.js' @@ -12,8 +13,8 @@ export default function HTML (props = {}) { children = [], editURL = '', lang = 'en', - pageToC = '', scripts = '', + titleSlug = '', state = {}, thirdparty = '', title = '' @@ -62,6 +63,7 @@ ${Symbols} " >

    -

    Table of Contents

    -
    - ${pageToC.replace(/class="mb1"/g, 'class="list-none"')} -
    - + ${DocumentOutline(props)} ${stateTag} From 1cff45366e9d2409019e9952ec7d919f021834f3 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 23 Nov 2021 23:34:00 -0700 Subject: [PATCH 288/680] progress check in --- scripts/dictionary.txt | 3 +- src/views/docs/en/get-started/quickstart.md | 2 + .../custom-source-paths.md | 2 +- .../configuration/local-preferences.md | 2 +- .../en/reference/runtime-helpers/node.js.md | 178 +++++++++++------- 5 files changed, 111 insertions(+), 76 deletions(-) diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt index 121a0e5d..94a3c54b 100644 --- a/scripts/dictionary.txt +++ b/scripts/dictionary.txt @@ -1,14 +1,15 @@ ℹ &rarr ACM +ApiGatewayManagementApi arc-example-cors Cloudflare Dreamhost FQDN +getConnection GoDaddy Graviton2 konsumer LEANX Namecheap -NameCheap ParcelJS diff --git a/src/views/docs/en/get-started/quickstart.md b/src/views/docs/en/get-started/quickstart.md index 13f752de..321dd945 100644 --- a/src/views/docs/en/get-started/quickstart.md +++ b/src/views/docs/en/get-started/quickstart.md @@ -6,6 +6,8 @@ description: Get started quickly with Architect > Architect is a simple tool to build and deliver powerful cloud function-based web apps and APIs +## Create a new project + Assuming Node.js 14+ is installed, open your terminal and create a new Architect project: diff --git a/src/views/docs/en/guides/developer-experience/custom-source-paths.md b/src/views/docs/en/guides/developer-experience/custom-source-paths.md index 6943b39c..37a58897 100644 --- a/src/views/docs/en/guides/developer-experience/custom-source-paths.md +++ b/src/views/docs/en/guides/developer-experience/custom-source-paths.md @@ -5,7 +5,7 @@ category: Developer experience Define resources in a more verbose format to configure custom Lambda source directories. Custom source paths are completely opt-in on a Lambda by Lambda basis; this is trading off default conventions for flexibility at the price of slightly more `app.arc` verbosity. -### Use cases +## Use cases - Migrate existing repos to serverless tech - Use frontend frameworks that have their own folder requirements diff --git a/src/views/docs/en/reference/configuration/local-preferences.md b/src/views/docs/en/reference/configuration/local-preferences.md index ce43b19b..99af5728 100644 --- a/src/views/docs/en/reference/configuration/local-preferences.md +++ b/src/views/docs/en/reference/configuration/local-preferences.md @@ -73,7 +73,7 @@ Architect sandbox supports loading environment variables from a `.env` file. The ### Example `.env` file -```shell +```bash A_TESTING_ENV_VAR=something-for-testing ANOTHER_VAR=only-for-testing ``` diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index 6f62a1a0..7285924d 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -6,19 +6,17 @@ description: Node.js runtime support Architect runtime helpers are optional, and designed to make it significantly easier to work with AWS CloudFormation provisioned resources and related assets. -CloudFormation resources are generated with names more friendly for machines than people. Other frameworks leave resource discovery up to end users, which leads to ad hoc implementations becoming a frequent bug vector. Architect treats runtime discovery as a first class concern. - -> Amazon Resource Names (ARNs) are available at runtime to all Lambda functions defined in the same Architect project manifest. Things such as DynamoDB tables, SNS topics, SQS queues, API Gateway endpoints, and S3 static bucket ARNs are baked into `@architect/functions` so your runtime program logic interacts with resources using readable, people-friendly names defined in your Architect project manifest. - Architect has two primary runtime helpers for Node.js: -- [`@architect/functions`](#%40architect%2Ffunctions) - General purpose runtime helpers for various Architect resources, such as `@http`, `@tables`, etc. +- [`@architect/functions`](#%40architect%2Ffunctions) - General purpose runtime helpers for various Architect resources, such as `@events`, `@http`, `@tables`, etc. - [`@architect/asap`](#%40architect%2Fasap) - Helper designed solely for delivering static assets via `@http` endpoints ---- +
    ## `@architect/functions` +[View package source on GitHub](https://github.com/architect/functions/) + ### Setup Install the Architect runtime helpers for Node.js: @@ -33,31 +31,27 @@ Ensure `arc` is available to your Lambda function code: let arc = require('@architect/functions') ``` - -### API +### Interfaces - [`arc.events`](#arc.events) Publish / subscribe helpers for `@events` functions - [`arc.http`](#arc.http) Middleware and request/response normalization for `@http` functions using callbacks -- [`arc.http.async`](#arc.http.async) Middleware and request/response normalization for `@http` functions using `async/await` -- [`arc.http.express`](#arc.http.express) Express support for `@http` functions -- [`arc.http.session`](#arc.http.session) Sessions for `@http` functions + - [`arc.queues`](#arc.queues) Publish/subscribe helpers for `@queues` functions - [`arc.services`](#arc.services) Retrieves the Architect service map, exposing metadata for all services making up the application - [`arc.static`](#arc.static) Get a `@static` asset path - [`arc.tables`](#arc.tables) Generates a DynamoDB client for `@tables` - [`arc.ws`](#arc.ws) WebSocket helpers for `@ws` functions - ### `arc.events` Publish & subscribe helpers for `@events` functions. - #### `arc.events.subscribe` Subscribe to events with a handler function. The function will be passed an `event` object, and, if not an `async` function, a callback to be called upon completion. - ##### Examples ```javascript @@ -84,14 +78,12 @@ function handler (event, callback) { } ``` - #### `arc.events.publish` Publish an event to an `@events` function. An object containing two properties is required: - **`name`** (string) - name of the `@events` function you'd like to publish to - **`payload`** (object or array) - payload to be published - ##### Examples ```javascript @@ -103,6 +95,7 @@ await arc.events.publish({ payload: { hits: 1 }, }) ``` + ```javascript // continuation passing let arc = require('@architect/functions') @@ -113,13 +106,12 @@ arc.events.publish({ }, (err) => console.log) ``` ---- +
    ### `arc.http` `arc.http` provides middleware and request/response normalization for `@http` functions using Express-style callbacks. - #### Requests `arc.http` (and `arc.http.async`) provide the following: @@ -130,7 +122,6 @@ arc.events.publish({ Handler functions passed to `arc.http[.async]` receive a `request` object containing all of the [API Gateway request properties](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) specific to `HTTP` and `REST` APIs. Additionally, the following properties are added or improved for convenience: - - `body` - **object** - Automatically parsed if present; `{}` if request has no body - `method` (alias of `httpMethod`) - **string** @@ -157,7 +148,6 @@ Handler functions passed to `arc.http[.async]` receive a `request` object contai > Learn more about [API Gateway request payloads here](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) - #### Responses `arc.http` (and `arc.http.async`) honor the standard [API Gateway response payload properties](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) (`statusCode`, `headers`, `body`, etc.), in addition to adding the following convenience properties: @@ -194,8 +184,7 @@ Finally, you may also return a raw JavaScript Error, which will be interpreted a > Learn more about [API Gateway response payloads here](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) - -#### API +#### `arc.http()` Define `arc.http` middleware by passing one or more functions as parameters. A function can exit the middleware queue early by calling back with a [valid HTTP response payload](#responses). @@ -207,7 +196,6 @@ Define `arc.http` middleware by passing one or more functions as parameters. A f - `next` - **function** (if not the final middleware) - Callback to invoke the next `arc.http` middleware function - ##### Examples An example of adding an authorization middleware function for JSON API requests made via XHR. @@ -244,12 +232,10 @@ function handler(req, res) { }) } ``` ---- - -#### `arc.http.async` +
    -#### API +#### `arc.http.async()` Define `arc.http.async` middleware by passing one or more `async` functions as parameters. A function can exit the middleware queue early by returning a [valid HTTP response payload](#responses)). @@ -261,7 +247,6 @@ Define `arc.http.async` middleware by passing one or more `async` functions as p Each middleware function can invoke the following function by returning the `request` object, or by reaching the end of execution. - ##### Examples ```javascript @@ -296,13 +281,12 @@ async function handler(req) { } ``` ---- +
    -#### `arc.http.express` +#### `arc.http.express()` [Express](https://expressjs.com) migration helper. - ##### Examples ```javascript @@ -316,7 +300,7 @@ app.get('/cool', (req, res)=> res.send('very cool')) exports.handler = arc.http.express(app) ``` ---- +
    #### `arc.http.session` @@ -324,7 +308,7 @@ exports.handler = arc.http.express(app) These operations are automatically handled for you when using `arc.http[.async]`; only use `arc.http.session` if you prefer handling session reads and writes yourself. -#### API +##### Methods - `read(request[, callback]) → [Promise]` - Accepts a [request object](#requests) @@ -336,7 +320,6 @@ These operations are automatically handled for you when using `arc.http[.async]` > Please note that session variable encoding and decoding relies on the `ARC_APP_SECRET` [environment variable](../cli/env) being set to something secret and not easily guessable. If you use Architect sessions, please be sure to [set the `ARC_APP_SECRET` environment variable](../cli/env)! - ##### Examples ```javascript @@ -357,18 +340,16 @@ exports.handler = async function handler (req) { } ``` ---- +
    ### `arc.queues` Publish & subscribe helpers for `@queues` functions. - #### `arc.queues.subscribe` Subscribe to queues with a handler function. The function will be passed an `event` object, and, if not an `async` function, a callback to be called upon completion. - ##### Examples ```javascript @@ -395,14 +376,12 @@ function handler (event, callback) { } ``` - #### `arc.queues.publish` Publish an event to an `@queues` function. An object containing two properties is required: - **`name`** (string) - name of the `@queues` function you'd like to publish to - **`payload`** (object or array) - payload to be published - ##### Examples ```javascript @@ -414,6 +393,7 @@ await arc.queues.publish({ payload: { hits: 1 }, }) ``` + ```javascript // continuation passing let arc = require('@architect/functions') @@ -424,22 +404,29 @@ arc.queues.publish({ }, (err) => console.log) ``` ---- +
    + +### `arc.services()` + +CloudFormation resources are generated with names more friendly for machines than people. Other frameworks leave resource discovery up to end users, which leads to ad hoc implementations becoming a frequent bug vector. Architect treats runtime discovery as a first class concern. -### `arc.services` +> Amazon Resource Names (ARNs) are available at runtime to all Lambda functions defined in the same Architect project manifest. Things such as DynamoDB tables, SNS topics, SQS queues, API Gateway endpoints, and S3 static bucket ARNs are baked into `@architect/functions` so your runtime program logic interacts with resources using readable, people-friendly names defined in your Architect project manifest. -Retrieves the Architect service map: an object mapping the plugins and out-of-the-box Architect infrastructure that makes up the application. +`arc.services` retrieves the Architect service map: an object mapping the plugins and out-of-the-box Architect infrastructure that makes up the application. This object is lazily-loaded and cached, and thus the first call may incur a delay as the service map is populated (use of [`arc.events`](#arc.events), [`arc.queues`](#arc.queues) and [`arc.tables`](#arc.tables) transparently uses this method in the background). -`arc.services` returns a service map object, with keys equaling any out-of-the-box Architect infrastructure types or plugins used by the Architect application. An example service map for an application composed of `@static`, `@events` and an `imagebucket` plugin would have the following structure: +`arc.services` returns a service map object, with keys equaling any out-of-the-box Architect infrastructure types or plugins used by the Architect application. + +#### Examples + +An example service map for an application composed of `@static`, `@events` and an `imagebucket` plugin would have the following structure: ```javascript let arc = require('@architect/functions') let services = await arc.services() -console.log(services) -/* logs out: +/* { // a plugin named 'imagebucket' exposing some service discovery variables imagebucket: { @@ -460,15 +447,12 @@ console.log(services) */ ``` ---- +
    -### `arc.static` +### `arc.static()` Returns the path of a given static asset, intended for use with static asset fingerprinting (`@static fingerprint true`). - -#### API - Accepts two parameters: - `asset` - **string** - The root-relative path of the asset you'd like to load @@ -476,8 +460,7 @@ Accepts two parameters: - `stagePath` - **boolean** - `REST` API compatibility option, enables prepending of the API stage - -##### Examples +#### Examples ```javascript let css = arc.static('/index.css') @@ -487,30 +470,36 @@ let js = arc.static('/index.js', { stagePath: true }) // '/staging/_static/index-b2c3d4.js' ``` ---- +
    -### `arc.tables` +### `arc.tables()` -Creates a DynamoDB client for your application's `@tables`. The client is an object, containing a nested object for each table; each table has the following methods: +Creates a DynamoDB client for your application's `@tables`. The client is an object, containing a nested object for each table. +#### Instance Methods + +Each table has the following methods: + +- `delete(key[, callback]) → [Promise]` + - Delete a record + - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#delete-property) - `get(key[, callback]) → [Promise]` - Get a single row by primary key (and secondary index) - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#get-property) +- `put(record[, callback]) → [Promise]` + - Create or replace a record + - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-property) - `query(query[, callback]) → [Promise]` - Query a table by passing a full document query object - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#query-property) - `scan([options][, callback]) → [Promise]` - Scan the entire table; accepts document filter object - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#scan-property) -- `put(record[, callback]) → [Promise]` - - Create or replace a record - - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-property) -- `delete(key[, callback]) → [Promise]` - - Delete a record - - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#delete-property) - `update(record[, callback]) → [Promise]` - Upsert a record; accepts document update object - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#update-property) +- `reflect` + - TODO - `name(tablename)` - Helper function that accepts a table name string, and returns an AWS resource name when you need to go lower level - For example use `data.name('my-table')` to get the human-unfriendly AWS name of the `my-table` `@table` resource @@ -520,10 +509,9 @@ Creates a DynamoDB client for your application's `@tables`. The client is an obj - `_doc(thing[, callback]) → [Promise]` - An instance of [`AWS.DynamoDB.DocumentClient`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html) -> The generated client is facade for AWS.DynamoDB.DocumentClient. The `delete` and `get` methods take a single parameter that is passed on to the `params.Key` attribute in the corresponding DocumentClient method. The `put` method takes a single parameter that is passed on as the `params.Item` attribute in the DocumentClient.put method. The `query`, `scan`, and `update` methods simply pass the `params` argument with the `TableName` parameter prepopulated. [See the official DynamoDB documentation for all available parameters](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html). - +> The generated client is facade for `AWS.DynamoDB.DocumentClient`. The `delete` and `get` methods take a single parameter that is passed on to the `params.Key` attribute in the corresponding `DocumentClient` method. The `put` method takes a single parameter that is passed on as the `params.Item` attribute in the `DocumentClient.put` method. The `query`, `scan`, and `update` methods simply pass the `params` argument with the `TableName` parameter prepopulated. [See the official DynamoDB documentation for all available parameters](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html). -##### Examples +#### Examples Given the following `app.arc` file: @@ -557,15 +545,18 @@ let data = await arc.tables() */ ``` ---- +
    ### `arc.ws` -Send a message via WebSocket ([`@ws`](/docs/en/reference/project-manifest/ws)). An object containing two properties is required: -- **`id`** (string) - API Gateway `connectionId` of the client you'd like to send the message to -- **`payload`** (object or array) - payload to be sent (as JSON) +Interact with WebSocket services. Declare endpoints with the [`@ws`](/docs/en/reference/project-manifest/ws) pragma. -#### Examples +#### Methods + +- `arc.ws.send` + - Send a message via WebSocket. An object containing two properties is required: + - **`id`** (string) - API Gateway `connectionId` of the client you'd like to send the message to + - **`payload`** (object or array) - payload to be sent (as JSON) ```javascript let arc = require('@architect/functions') @@ -576,10 +567,52 @@ await arc.ws.send({ }) ``` ---- +- `arc.ws.close` + - Close a WebSocket connection with the provided id: + - **`id`** (string) - API Gateway `connectionId` of the client you'd like to close + +```javascript +let arc = require('@architect/functions') + +await arc.ws.close({ id: connectionId }) +``` + +- `arc.ws.info` + - A pass-thru to the [ApiGatewayManagementApi#getConnection](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ApiGatewayManagementApi.html#getConnection-property) method. + - Retrieve information about the connection with the provided id: + - **`id`** (string) - API Gateway `connectionId` of the client you'd like get information about + +```javascript +let arc = require('@architect/functions') + +let info = await arc.ws.info({ id: connectionId }) +/* +{ + ConnectedAt: , + Identity: { + SourceIp: , + UserAgent: , + }, + LastActiveAt: , +} +*/ +``` + +- `arc.ws._api` + - Return the internal [`ApiGatewayManagementApi`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ApiGatewayManagementApi.html) instance from `aws-sdk`. + +```javascript +let arc = require('@architect/functions') + +let wsApi = await arc.ws._api() +``` + +
    ## `@architect/asap` +[View package source on GitHub](https://github.com/architect/asap/) + ### Setup Install the Architect static asset proxy (ASAP) for Node.js: @@ -588,7 +621,7 @@ Install the Architect static asset proxy (ASAP) for Node.js: npm install @architect/asap ``` -### API +### Parameters ASAP takes an optional configuration object with the following properties and returns an `async` Lambda handler: @@ -615,8 +648,7 @@ ASAP takes an optional configuration object with the following properties and re - `spa` - **boolean** (defaults to `false`) - Enable single page app mode, all page requests deliver `/index.html` - -##### Examples +### Examples ```javascript // basic usage From dfff2e0abe0e40b64bad479d875d57788c034a50 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 7 Dec 2021 17:50:07 -0700 Subject: [PATCH 289/680] bump deps --- package.json | 16 ++++++++-------- .../docs/en/reference/runtime-helpers/node.js.md | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index a8aa444e..12aa4e95 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "dependencies": { "@architect/asap": "^4.1.0", "@architect/functions": "^4.1.1", - "@architect/inventory": "^2.1.1", - "@architect/package": "^7.1.1", + "@architect/inventory": "^2.2.1", + "@architect/package": "^7.2.0", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "@toycode/markdown-it-class": "^1.2.4", "esm": "^3.2.25", @@ -25,17 +25,17 @@ "markdown-it-external-anchor": "^1.0.0", "markdown-it-front-matter": "^0.2.3", "markdown-it-toc-and-anchor": "^4.2.0", - "slugify": "^1.6.1" + "slugify": "^1.6.3" }, "devDependencies": { - "@architect/architect": "^9.2.0", + "@architect/architect": "^9.4.2", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary", - "eslint": "^8.1.0", - "linkinator": "^2.14.5", - "spellchecker-cli": "^4.8.0", + "eslint": "^8.4.1", + "linkinator": "^2.16.2", + "spellchecker-cli": "^4.8.1", "tap-arc": "^0.1.1", - "tape": "^5.3.1", + "tape": "^5.3.2", "tiny-json-http": "^7.3.1" }, "eslintConfig": { diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index 7285924d..14b54316 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -499,7 +499,7 @@ Each table has the following methods: - Upsert a record; accepts document update object - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#update-property) - `reflect` - - TODO + - - `name(tablename)` - Helper function that accepts a table name string, and returns an AWS resource name when you need to go lower level - For example use `data.name('my-table')` to get the human-unfriendly AWS name of the `my-table` `@table` resource From 35dfc4b369dc2a8a41304a16ffac71317a80ac94 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 7 Dec 2021 21:05:54 -0700 Subject: [PATCH 290/680] update arc/functions tables docs --- .../en/reference/runtime-helpers/node.js.md | 67 ++++++++++++------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index 14b54316..f0eb7583 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -35,9 +35,6 @@ let arc = require('@architect/functions') - [`arc.events`](#arc.events) Publish / subscribe helpers for `@events` functions - [`arc.http`](#arc.http) Middleware and request/response normalization for `@http` functions using callbacks - - [`arc.queues`](#arc.queues) Publish/subscribe helpers for `@queues` functions - [`arc.services`](#arc.services) Retrieves the Architect service map, exposing metadata for all services making up the application - [`arc.static`](#arc.static) Get a `@static` asset path @@ -476,6 +473,39 @@ let js = arc.static('/index.js', { stagePath: true }) Creates a DynamoDB client for your application's `@tables`. The client is an object, containing a nested object for each table. +#### Client Methods + +- `_db(thing[, callback]) → [Promise]` + - An instance of [`AWS.DynamoDB`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) +- `_doc(thing[, callback]) → [Promise]` + - An instance of [`AWS.DynamoDB.DocumentClient`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html) +- `name(tablename)` + - Helper function that accepts a table name string, and returns an AWS resource name when you need to go lower level + - For example use `client.name('my-table')` to get the human-unfriendly AWS name of the `my-table` `@table` resource +- `reflect([callback]) → [Promise]` + - Returns a dictionary of table names with logical ids + +##### Examples + +```arc +@app +testapp + +@tables +widgets + name *String +``` + +```javascript +let arc = require('@architect/functions') +let client = await arc.tables() + +client._db // AWS.DynamoDB +client._doc // AWS.DynamoDB.DocumentClient +client.name('widgets') // 'testapp-staging-widgets' +client.reflect() // { widgets: 'testapp-staging-widgets' } +``` + #### Instance Methods Each table has the following methods: @@ -498,20 +528,10 @@ Each table has the following methods: - `update(record[, callback]) → [Promise]` - Upsert a record; accepts document update object - [Additional documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#update-property) -- `reflect` - - -- `name(tablename)` - - Helper function that accepts a table name string, and returns an AWS resource name when you need to go lower level - - For example use `data.name('my-table')` to get the human-unfriendly AWS name of the `my-table` `@table` resource - - Previously called `data._name`, which is now deprecated -- `_db(thing[, callback]) → [Promise]` - - An instance of [`AWS.DynamoDB`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) -- `_doc(thing[, callback]) → [Promise]` - - An instance of [`AWS.DynamoDB.DocumentClient`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html) > The generated client is facade for `AWS.DynamoDB.DocumentClient`. The `delete` and `get` methods take a single parameter that is passed on to the `params.Key` attribute in the corresponding `DocumentClient` method. The `put` method takes a single parameter that is passed on as the `params.Item` attribute in the `DocumentClient.put` method. The `query`, `scan`, and `update` methods simply pass the `params` argument with the `TableName` parameter prepopulated. [See the official DynamoDB documentation for all available parameters](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html). -#### Examples +##### Examples Given the following `app.arc` file: @@ -525,22 +545,19 @@ notes noteID **String ``` -You'd generate a data access layer like so: +A data access layer will be generated like so: ```javascript let arc = require('@architect/functions') -let data = await arc.tables() +let client = await arc.tables() /* { - data.notes.get, - data.notes.query, - data.notes.scan, - data.notes.put, - data.notes.delete, - data.notes.update, - data.notes.name, - data.notes._db, - data.notes._doc, + client.notes.get, + client.notes.query, + client.notes.scan, + client.notes.put, + client.notes.delete, + client.notes.update, } */ ``` From 7f0dffa1a8ec9fa1e854cd2fce45e3a5dbe3564d Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 9 Dec 2021 10:57:26 -0700 Subject: [PATCH 291/680] Update node.js.md remove examples headers --- .../en/reference/runtime-helpers/node.js.md | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index f0eb7583..b9b46c48 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -49,8 +49,6 @@ Publish & subscribe helpers for `@events` functions. Subscribe to events with a handler function. The function will be passed an `event` object, and, if not an `async` function, a callback to be called upon completion. -##### Examples - ```javascript // async let arc = require('@architect/functions') @@ -81,8 +79,6 @@ Publish an event to an `@events` function. An object containing two properties i - **`name`** (string) - name of the `@events` function you'd like to publish to - **`payload`** (object or array) - payload to be published -##### Examples - ```javascript // async let arc = require('@architect/functions') @@ -193,8 +189,6 @@ Define `arc.http` middleware by passing one or more functions as parameters. A f - `next` - **function** (if not the final middleware) - Callback to invoke the next `arc.http` middleware function -##### Examples - An example of adding an authorization middleware function for JSON API requests made via XHR. ```javascript @@ -244,8 +238,6 @@ Define `arc.http.async` middleware by passing one or more `async` functions as p Each middleware function can invoke the following function by returning the `request` object, or by reaching the end of execution. -##### Examples - ```javascript // single function let arc = require('@architect/functions') @@ -284,8 +276,6 @@ async function handler(req) { [Express](https://expressjs.com) migration helper. -##### Examples - ```javascript let arc = require('@architect/functions') let express = require('express') @@ -317,8 +307,6 @@ These operations are automatically handled for you when using `arc.http[.async]` > Please note that session variable encoding and decoding relies on the `ARC_APP_SECRET` [environment variable](../cli/env) being set to something secret and not easily guessable. If you use Architect sessions, please be sure to [set the `ARC_APP_SECRET` environment variable](../cli/env)! -##### Examples - ```javascript let arc = require('@architect/functions') @@ -347,8 +335,6 @@ Publish & subscribe helpers for `@queues` functions. Subscribe to queues with a handler function. The function will be passed an `event` object, and, if not an `async` function, a callback to be called upon completion. -##### Examples - ```javascript // async let arc = require('@architect/functions') @@ -379,8 +365,6 @@ Publish an event to an `@queues` function. An object containing two properties i - **`name`** (string) - name of the `@queues` function you'd like to publish to - **`payload`** (object or array) - payload to be published -##### Examples - ```javascript // async let arc = require('@architect/functions') @@ -415,8 +399,6 @@ This object is lazily-loaded and cached, and thus the first call may incur a del `arc.services` returns a service map object, with keys equaling any out-of-the-box Architect infrastructure types or plugins used by the Architect application. -#### Examples - An example service map for an application composed of `@static`, `@events` and an `imagebucket` plugin would have the following structure: ```javascript @@ -457,8 +439,6 @@ Accepts two parameters: - `stagePath` - **boolean** - `REST` API compatibility option, enables prepending of the API stage -#### Examples - ```javascript let css = arc.static('/index.css') // '/_static/index-a1b2c3.css' @@ -485,8 +465,6 @@ Creates a DynamoDB client for your application's `@tables`. The client is an obj - `reflect([callback]) → [Promise]` - Returns a dictionary of table names with logical ids -##### Examples - ```arc @app testapp @@ -531,8 +509,6 @@ Each table has the following methods: > The generated client is facade for `AWS.DynamoDB.DocumentClient`. The `delete` and `get` methods take a single parameter that is passed on to the `params.Key` attribute in the corresponding `DocumentClient` method. The `put` method takes a single parameter that is passed on as the `params.Item` attribute in the `DocumentClient.put` method. The `query`, `scan`, and `update` methods simply pass the `params` argument with the `TableName` parameter prepopulated. [See the official DynamoDB documentation for all available parameters](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html). -##### Examples - Given the following `app.arc` file: ```arc @@ -665,8 +641,6 @@ ASAP takes an optional configuration object with the following properties and re - `spa` - **boolean** (defaults to `false`) - Enable single page app mode, all page requests deliver `/index.html` -### Examples - ```javascript // basic usage let asap = require('@architect/asap') From b9c254be5b73f62761b1712a9ec6d2a9f5b5b8de Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 9 Dec 2021 12:09:46 -0700 Subject: [PATCH 292/680] 3.6.24 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 12aa4e95..effd034c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.23", + "version": "3.6.24", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 5289010f55d52a64529c1078ce1741434b67606e Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 9 Dec 2021 18:47:00 -0700 Subject: [PATCH 293/680] improve the arc/functions tables example --- .../en/reference/runtime-helpers/node.js.md | 66 +++++++++++++++---- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index b9b46c48..14401d07 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -513,12 +513,16 @@ Given the following `app.arc` file: ```arc @app -testapp +people-app @tables -notes - personID *String - noteID **String +people + email *String + +@tables-indexes +people + job *String + name peopleByJob ``` A data access layer will be generated like so: @@ -526,16 +530,50 @@ A data access layer will be generated like so: ```javascript let arc = require('@architect/functions') let client = await arc.tables() -/* -{ - client.notes.get, - client.notes.query, - client.notes.scan, - client.notes.put, - client.notes.delete, - client.notes.update, -} -*/ +let people = client.people + +// create Chuck and Jana +let chuck = await people.put({ + email: 'chuck@example.com', + job: 'Web Developer', + age: 35, +}) +let jana = await people.put({ + email: 'jana@example.com', + job: 'Web Developer', + age: 64, +}) + +// increment Jana's age +await people.update({ + Key: { email: jana.email }, + ExpressionAttributeValues: { ':inc': 1 }, + UpdateExpression: 'ADD age :inc' +}) + +// retrieve Jana's updated record +jana = await people.get({ email: jana.email }) + +// query for Web Developers using a secondary index +let developers = await people.query({ + IndexName: 'peopleByJob', + KeyConditionExpression: 'job = :job', + ExpressionAttributeValues: { ':job': 'Web Developer' }, +}) + +// scan the entire table for people over 64 +let retired = await people.scan({ + FilterExpression : 'age >= :sixtyfive', + ExpressionAttributeValues : {':sixtyfive' : 65}, +}) + +// delete Chuck and Jana +await client._doc.transactWrite({ + TransactItems: [ + { Delete: { TableName: 'people', Key: { email: chuck.email } } }, + { Delete: { TableName: 'people', Key: { email: jana.email } } }, + ] +}) ```
    From 5fe8dddc5c65c3e0afc31a3aa212c2822edd2c64 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 10 Dec 2021 10:12:18 -0700 Subject: [PATCH 294/680] 3.6.25 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index effd034c..1d81c43f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.24", + "version": "3.6.25", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 8afe31667a8cfdeab4eb9a8f6278111b3f5b85bc Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 10 Dec 2021 12:17:51 -0700 Subject: [PATCH 295/680] consistency for method headers with parens display parens, but anchor is created without parens --- src/http/get-docs-000lang-catchall/index.js | 18 ++++++++++-------- .../en/reference/runtime-helpers/node.js.md | 18 ++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index d8caad1d..d3f1c4e0 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -2,29 +2,31 @@ require = require('esm')(module) const path = require('path') +const { escape } = require('querystring') const { readFile } = require('fs/promises') + const { http } = require('@architect/functions') -const { redirect: redirectMiddleware } = require('@architect/shared/redirect-map') -const notFoundResponse = require('@architect/shared/not-found-response') const Markdown = require('markdown-it') const markdownClass = require('@toycode/markdown-it-class') const markdownExternalAnchor = require('markdown-it-external-anchor') const markdownToC = require('markdown-it-toc-and-anchor').default const frontmatterParser = require('markdown-it-front-matter') const yaml = require('js-yaml') -const classMapping = require('./markdown-class-mappings') -const hljs = require('./highlight') -const { escapeHtml } = Markdown().utils -const highlight = require('./highlighter') - .bind(null, hljs, escapeHtml) + +const { redirect: redirectMiddleware } = require('@architect/shared/redirect-map') +const notFoundResponse = require('@architect/shared/not-found-response') const toc = require('@architect/views/docs/table-of-contents') const Html = require('@architect/views/modules/document/html.js').default const NotFound = require('@architect/views/modules/components/not-found.js').default const algolia = require('@architect/views/modules/components/algolia.js').default +const classMapping = require('./markdown-class-mappings') +const { escapeHtml } = Markdown().utils +const hljs = require('./highlight') +const highlight = require('./highlighter').bind(null, hljs, escapeHtml) // reproduces the slugify algorithm used in markdown-it-external-anchor -const slugify = (s) => encodeURIComponent(String(s).trim().toLowerCase().replace(/\s+/g, '-')) +const slugify = (s) => escape(String(s).trim().toLowerCase().replace(/\s+/g, '-').replace(/\(\)/g, '')) const cache = {} // cheap warm cache diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index 14401d07..a9c8c4bf 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -45,7 +45,7 @@ let arc = require('@architect/functions') Publish & subscribe helpers for `@events` functions. -#### `arc.events.subscribe` +#### `arc.events.subscribe()` Subscribe to events with a handler function. The function will be passed an `event` object, and, if not an `async` function, a callback to be called upon completion. @@ -73,7 +73,7 @@ function handler (event, callback) { } ``` -#### `arc.events.publish` +#### `arc.events.publish()` Publish an event to an `@events` function. An object containing two properties is required: - **`name`** (string) - name of the `@events` function you'd like to publish to @@ -331,7 +331,7 @@ exports.handler = async function handler (req) { Publish & subscribe helpers for `@queues` functions. -#### `arc.queues.subscribe` +#### `arc.queues.subscribe()` Subscribe to queues with a handler function. The function will be passed an `event` object, and, if not an `async` function, a callback to be called upon completion. @@ -359,7 +359,7 @@ function handler (event, callback) { } ``` -#### `arc.queues.publish` +#### `arc.queues.publish()` Publish an event to an `@queues` function. An object containing two properties is required: - **`name`** (string) - name of the `@queues` function you'd like to publish to @@ -582,9 +582,7 @@ await client._doc.transactWrite({ Interact with WebSocket services. Declare endpoints with the [`@ws`](/docs/en/reference/project-manifest/ws) pragma. -#### Methods - -- `arc.ws.send` +#### `arc.ws.send()` - Send a message via WebSocket. An object containing two properties is required: - **`id`** (string) - API Gateway `connectionId` of the client you'd like to send the message to - **`payload`** (object or array) - payload to be sent (as JSON) @@ -598,7 +596,7 @@ await arc.ws.send({ }) ``` -- `arc.ws.close` +#### `arc.ws.close()` - Close a WebSocket connection with the provided id: - **`id`** (string) - API Gateway `connectionId` of the client you'd like to close @@ -608,7 +606,7 @@ let arc = require('@architect/functions') await arc.ws.close({ id: connectionId }) ``` -- `arc.ws.info` +#### `arc.ws.info()` - A pass-thru to the [ApiGatewayManagementApi#getConnection](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ApiGatewayManagementApi.html#getConnection-property) method. - Retrieve information about the connection with the provided id: - **`id`** (string) - API Gateway `connectionId` of the client you'd like get information about @@ -629,7 +627,7 @@ let info = await arc.ws.info({ id: connectionId }) */ ``` -- `arc.ws._api` +#### `arc.ws._api()` - Return the internal [`ApiGatewayManagementApi`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ApiGatewayManagementApi.html) instance from `aws-sdk`. ```javascript From 6c019241391a5e9d107c06936d55fab488b54da4 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 10 Dec 2021 17:10:24 -0700 Subject: [PATCH 296/680] 3.6.26 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d81c43f..97c0268a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.25", + "version": "3.6.26", "scripts": { "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", From 6f8de2a427652e503bfc896ab0d83217f35b746c Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 14 Dec 2021 10:19:58 -0700 Subject: [PATCH 297/680] add requirements to local development doc (#470) fixes #456 --- package.json | 2 +- .../en/guides/developer-experience/local-development.md | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 97c0268a..225aaf80 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "eslint": "^8.4.1", "linkinator": "^2.16.2", "spellchecker-cli": "^4.8.1", - "tap-arc": "^0.1.1", + "tap-arc": "^0.1.2", "tape": "^5.3.2", "tiny-json-http": "^7.3.1" }, diff --git a/src/views/docs/en/guides/developer-experience/local-development.md b/src/views/docs/en/guides/developer-experience/local-development.md index 2692a4c1..03da01d5 100644 --- a/src/views/docs/en/guides/developer-experience/local-development.md +++ b/src/views/docs/en/guides/developer-experience/local-development.md @@ -6,6 +6,15 @@ description: How to develop locally with Architect sandbox Fast local development creates a tighter feedback loop maximizing developer velocity. +## Requirements + +- **Platforms:** Linux, macOS, Windows +- **Architect runtime:** Node.js 14+ +- **Function runtimes & package managers:** + - Node.js (optional, [supported versions](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)) with [`npm`](https://www.npmjs.com/) 6+ or [`yarn`](https://yarnpkg.com/) 1+ + - Python (optional, [supported versions](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)) and optionally [`pip3`](https://pip.pypa.io/en/stable/) + - Ruby (optional, [supported versions](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)) and optionally [`bundle`](https://bundler.io/) + ## Preview Follow the [quickstart](/docs/en/get-started/quickstart) to get everything wired up. To preview a project running locally in a web browser: From 9ae1ea6d70a6ab364b51ac98628a3c41dc7d688f Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 15 Dec 2021 13:43:03 -0700 Subject: [PATCH 298/680] Populate new docs (#471) * introduction from why-architect * configure-aws from detailed-aws-setup --- .../docs/en/:tutorials/configuring-aws.md | 119 +++++++++++++++++- src/views/docs/en/introduction.md | 22 ++++ 2 files changed, 140 insertions(+), 1 deletion(-) diff --git a/src/views/docs/en/:tutorials/configuring-aws.md b/src/views/docs/en/:tutorials/configuring-aws.md index 01cda9dd..a9b80a45 100644 --- a/src/views/docs/en/:tutorials/configuring-aws.md +++ b/src/views/docs/en/:tutorials/configuring-aws.md @@ -9,5 +9,122 @@ sections: - "Working with multiple profiles" - "Credentials file vs. environment variables" - "Deploy buckets" - - "Default runtime" + - "Runtime Environments" --- + +## Get AWS IAM credentials + +You'll need an Amazon Web Services account and credentials set up on your development machine and / or CI systems. If you yet set it up, here's a useful guide for [Configuring the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html). + +In the context of a deployment tool, Architect requires account credentials with IAM `AdministratorAccess` privileges. In turn, Architect will create and attach least-privilege IAM roles to runtime resources within your application, ensuring strict security boundaries by default. + +> ℹ️ While it is possible to limit Architect's deployment credentials to specific IAM and CloudFormation privileges, such an exercise would only be performative. Credentials capable of creating IAM roles can grant and attach new roles with `AdministratorAccess`. + +On \*nix systems AWS Credentials are listed in: + +```bash +~/.aws/credentials +``` + +Or on Windows systems: + +```bash +C:\Users\USER_NAME\.aws\credentials +``` + +If that file doesn't exist, create it, and add the following: + +```bash +[default] +aws_access_key_id=xxx +aws_secret_access_key=xxx +``` + +> If you prefer, you can also use: *Control Panel » System » Advanced System Settings » Environment Variables*. + +## Minimum viable permissions +... + +## Configure AWS CLI + +The [AWS Command Line Interface](https://docs.aws.amazon.com/cli/) is the main interface for interacting with all parts of AWS using your computer's terminal. Architect uses the AWS CLI to package and deploy your app via CloudFormation. Follow this guide to [installing the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) for your preferred environment. + +## Working with multiple profiles + +It is possible to configure more than one AWS profile. This example credentials file lists 3 profiles: + +```bash +[default] +aws_access_key_id=xxx +aws_secret_access_key=xxx + +[work] +aws_access_key_id=xxx +aws_secret_access_key=xxx + +[personal] +aws_access_key_id=xxx +aws_secret_access_key=xxx +``` + +## Credentials file vs. environment variables + +While it is recommended to explicitly declare your application's AWS profile and region, you may also want to use a default profile and region on your machine with the following environment variables: + +- `AWS_PROFILE` +- `AWS_REGION` + +To set these variables on Linux, macOS, or UNIX, use `export` in your shell's configuration (e.g. `~/.zshrc` or `~/.bashrc`): + +```bash +export AWS_PROFILE=work +export AWS_REGION=us-west-1 +``` + +Or for Windows, add this to your PowerShell `$profile`: + +```powershell +$env:AWS_PROFILE='work' +$env:AWS_REGION='us-west-1' +``` + +## Deploy buckets +... + +## Runtime environments + +Architect supports the following runtime versions: + +- **Node.js**: `>= 14.x` using `npm` + - Unless otherwise specified in your project manifest, Node.js is the default runtime for new functions +- **Python**: `3.9`, `3.8`, `3.7`, or `3.6` using `pip3` +- **Ruby**: `2.7` using `bundle` +- **Deno**: `1.6.x` ([under development](../reference/runtime-helpers/deno)) + +> ⚠️ Working locally with the Architect `sandbox` requires target runtimes to be available in your `$PATH`. + +Additionally, all other standard AWS-managed runtimes are supported in Architect applications (but may not be supported in [Sandbox](../reference/cli/sandbox)), including: + +- **Go**: `1.x` +- **.NET**: `3.1` +- **Java**: `11`, and `8` + +Architect also supports _any custom runtime_ in using either [Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) or [Lambda container images](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html). + +Change a project's default runtime by specifying [an explicit environment](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) or an alias in `app.arc` with [the `@aws` pragma](../reference/project-manifest/aws). + +### Examples + +```arc +# version pins the default runtime to Python 3.8 +@aws +runtime python3.8 +``` + +```arc +# always run the latest supported version of Python +@aws +runtime python +``` + +> ℹ️ This setting can be overridden on a per-function basis with [`config.arc`](../reference/configuration/function-config). diff --git a/src/views/docs/en/introduction.md b/src/views/docs/en/introduction.md index 0e913083..1f8e2816 100644 --- a/src/views/docs/en/introduction.md +++ b/src/views/docs/en/introduction.md @@ -6,3 +6,25 @@ description: Architect introduction + +> Architect provides everything you need to build massively scalable serverless apps with low code, clear and terse config, and zero ceremony + +## The best developer experience + +Going serverless is fraught with complex vendor arcana and market noise. This is where Architect comes in. Architect is an opinionated developer experience (DX) for building database backed web apps with AWS. We remove all the noise and friction to building serverlessly. We prioritize speed with fast local dev, smart configurable defaults and flexible Infrastructure as Code. And then we get out of your way so you can focus on business logic instead of glue code and only pay for services while in use, on-demand, and otherwise _scale to zero_. + +### Work locally + +Developers need to work locally, to debug, test, and preview code before deploying it. Faster iterations means removing latency in feedback cycles. Architect devs iterate even faster with identical staging and production deployment only seconds away. Other systems require you to figure out these environments and more often than not ad hoc implementations introduce bug vectors due to subtle incompatibilities. Architect treats local development, staging and production as first class concerns. + +### Infrastructure as Code + +At its heart Architect is an [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code) (IaC) framework. Architect defines a high level manifest file, in multiple open text formats, and turns formerly complex cloud infrastructure provisioning into a build artifact. You define the cloud infrastructure your application code requires and check that manifest into version control so infra and code are always aligned and deterministic. Architect compiles manifest code into AWS CloudFormation and deploys it. Architect supports a native text file format `app.arc` in addition to popular formats: `package.json`, `arc.json`, `arc.yaml` and `arc.toml`. Teams can choose the dialect that works best for them. + +### Secured to least privilege by default + +Architect apps are compiled into AWS SAM applications for deployment with CloudFormation. All resources defined in the manifest share one IAM Role with least privilege access to only the resources defined in the same stack. You can modify the generated CloudFormation to change this behavior to lock things down even more or to access AWS resources outside the scope of the current stack. + +### Open source and open governance + +Architect is part of the OpenJS Foundation and is Apache 2.0 licensed. Architect as an open source project prioritizes regular release cadence and backwards compatibility at all costs. From fd0da73c5caed48d1ef8661d0ee00854c6c841be Mon Sep 17 00:00:00 2001 From: David Kaufman Date: Fri, 17 Dec 2021 02:53:43 -0500 Subject: [PATCH 299/680] correction to credential setup instructions grammar fix to AWS credentials section of AWS setup instructions --- src/views/docs/en/get-started/detailed-aws-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/get-started/detailed-aws-setup.md b/src/views/docs/en/get-started/detailed-aws-setup.md index 93a832ac..3dc99299 100644 --- a/src/views/docs/en/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/get-started/detailed-aws-setup.md @@ -65,7 +65,7 @@ The [AWS Command Line Interface](https://docs.aws.amazon.com/cli/) is the main i ### Credentials -You'll need an Amazon Web Services account and credentials set up on your development machine and / or CI systems. If you yet set it up, here's a useful guide for [Configuring the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html). +You'll need an Amazon Web Services account and credentials set up on your development machine and / or CI systems. If you haven't yet set it up, here's a useful guide for [Configuring the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html). In the context of a deployment tool, Architect requires account credentials with IAM `AdministratorAccess` privileges. In turn, Architect will create and attach least-privilege IAM roles to runtime resources within your application, ensuring strict security boundaries by default. From 599a252a3b329be7ec0d78d7e5b9c38b0e7fda02 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 16 Dec 2021 18:37:32 -0700 Subject: [PATCH 300/680] move renderer to separate, testable file --- package.json | 3 +- src/http/get-docs-000lang-catchall/index.js | 77 +++---------------- .../get-docs-000lang-catchall/renderer.js | 43 +++++++++++ test/backend/renderer-test.js | 50 ++++++++++++ 4 files changed, 105 insertions(+), 68 deletions(-) create mode 100644 src/http/get-docs-000lang-catchall/renderer.js create mode 100644 test/backend/renderer-test.js diff --git a/package.json b/package.json index 225aaf80..eec224b8 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,10 @@ "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "@toycode/markdown-it-class": "^1.2.4", "esm": "^3.2.25", + "front-matter": "^4.0.2", "highlight.js": "^11.3.1", - "js-yaml": "^4.1.0", "markdown-it": "^12.2.0", "markdown-it-external-anchor": "^1.0.0", - "markdown-it-front-matter": "^0.2.3", "markdown-it-toc-and-anchor": "^4.2.0", "slugify": "^1.6.3" }, diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index d3f1c4e0..a2e4704e 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -1,32 +1,16 @@ // eslint-disable-next-line require = require('esm')(module) -const path = require('path') -const { escape } = require('querystring') const { readFile } = require('fs/promises') - +const path = require('path') const { http } = require('@architect/functions') -const Markdown = require('markdown-it') -const markdownClass = require('@toycode/markdown-it-class') -const markdownExternalAnchor = require('markdown-it-external-anchor') -const markdownToC = require('markdown-it-toc-and-anchor').default -const frontmatterParser = require('markdown-it-front-matter') -const yaml = require('js-yaml') - +const render = require('./renderer') const { redirect: redirectMiddleware } = require('@architect/shared/redirect-map') -const notFoundResponse = require('@architect/shared/not-found-response') -const toc = require('@architect/views/docs/table-of-contents') +const algolia = require('@architect/views/modules/components/algolia.js').default const Html = require('@architect/views/modules/document/html.js').default const NotFound = require('@architect/views/modules/components/not-found.js').default -const algolia = require('@architect/views/modules/components/algolia.js').default - -const classMapping = require('./markdown-class-mappings') -const { escapeHtml } = Markdown().utils -const hljs = require('./highlight') -const highlight = require('./highlighter').bind(null, hljs, escapeHtml) - -// reproduces the slugify algorithm used in markdown-it-external-anchor -const slugify = (s) => escape(String(s).trim().toLowerCase().replace(/\s+/g, '-').replace(/\(\)/g, '')) +const notFoundResponse = require('@architect/shared/not-found-response') +const toc = require('@architect/views/docs/table-of-contents') const cache = {} // cheap warm cache @@ -46,14 +30,9 @@ async function handler (req) { ...parts, docName ) + let active = `/${activePath}` // Add leading slash to match anchor href let editURL = 'https://github.com/architect/arc.codes/edit/main/src/views/docs/' - editURL += path.join( - lang, - ...parts, - doc - ) - // Add leading slash to match anchor href - let active = `/${activePath}` + editURL += path.join(lang, ...parts, doc) let filePath = path.join( __dirname, @@ -66,10 +45,10 @@ async function handler (req) { doc ) let file + try { if (!cache[filePath]) - cache[filePath] = await readFile(filePath, 'utf8') - file = cache[filePath] + file = cache[filePath] = await readFile(filePath, 'utf8') } catch (error) { // TODO: Load category "index" landing if available @@ -88,60 +67,26 @@ async function handler (req) { } } - let frontmatter = {} - let docOutline = '' - const markdown = new Markdown({ - linkify: true, - html: true, - typographer: true, - highlight - }) - .use(markdownClass, classMapping) - .use(markdownExternalAnchor) - .use(markdownToC, { - anchorLink: false, - slugify, - tocClassName: 'pageToC', - tocFirstLevel: 2, - tocLastLevel: 6, - tocCallback: function (tocMarkdown, tocArray, tocHtml) { - docOutline = tocHtml - } - }) - .use(frontmatterParser, function (str) { - frontmatter = yaml.load(str) - }) - const children = markdown.render(file) - const { category, description, sections, title } = frontmatter - - const retval = { + return { statusCode: 200, headers: { 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', 'content-type': 'text/html; charset=utf8' }, body: Html({ + ...render(file), active, - category, - children, - description, editURL, lang, - docOutline, - sections, scripts: [ '/index.js', '/components/arc-viewer.js', '/components/arc-tab.js' ], - titleSlug: slugify(title), thirdparty: algolia(lang), - title, toc }) } - - return retval } exports.handler = http.async(redirectMiddleware, handler) diff --git a/src/http/get-docs-000lang-catchall/renderer.js b/src/http/get-docs-000lang-catchall/renderer.js new file mode 100644 index 00000000..965c19e5 --- /dev/null +++ b/src/http/get-docs-000lang-catchall/renderer.js @@ -0,0 +1,43 @@ +const { escape } = require('querystring') +const frontmatter = require('front-matter') +const Markdown = require('markdown-it') +const markdownClass = require('@toycode/markdown-it-class') +const markdownExternalAnchor = require('markdown-it-external-anchor') +const markdownToC = require('markdown-it-toc-and-anchor').default + +const classMapping = require('./markdown-class-mappings') +const { escapeHtml } = Markdown().utils +const hljs = require('./highlight') +const highlight = require('./highlighter').bind(null, hljs, escapeHtml) + +// reproduces the slugify algorithm used in markdown-it-external-anchor +const slugify = (s) => escape(String(s).trim().toLowerCase().replace(/\s+/g, '-').replace(/\(\)/g, '')) + +module.exports = function (fileContents) { + let docOutline = '' + const markdown = new Markdown({ + linkify: true, + html: true, + typographer: true, + highlight + }) + .use(markdownClass, classMapping) + .use(markdownExternalAnchor) + .use(markdownToC, { + anchorLink: false, + slugify, + tocClassName: 'pageToC', + tocFirstLevel: 2, + tocLastLevel: 6, + tocCallback: (tocMarkdown, tocArray, tocHtml) => { docOutline = tocHtml } + }) + const { attributes, body } = frontmatter(fileContents) + const children = markdown.render(body) + + return { + ...attributes, + children, + docOutline, + titleSlug: slugify(attributes.title), + } +} diff --git a/test/backend/renderer-test.js b/test/backend/renderer-test.js new file mode 100644 index 00000000..53fa57c8 --- /dev/null +++ b/test/backend/renderer-test.js @@ -0,0 +1,50 @@ +const test = require('tape') +const render = require('../../src/http/get-docs-000lang-catchall/renderer') + +const TITLE = 'Test Doc' +const TITLE_SLUG = 'test-doc' +const CATEGORY = 'Testing' +const DESCRIPTION = 'Make sure we get Markdown' +const file = ` +--- +title: ${TITLE} +category: ${CATEGORY} +description: ${DESCRIPTION} +--- + +> Architect is a simple tool to build and deliver powerful cloud function-based web apps and APIs + +## Create a new project + +\`\`\`arc +@app + +@http +get / +\`\`\` + +## Deploy to AWS + +[AWS is great](https://aws.amazon.com/) + +### $ubsection 2.1? + +## Section 3 +`.trim() + +test('custom Markdown renderer', (t) => { + const result = render(file) + + t.equal(result.title, TITLE, 'title attribute is present') + t.equal(result.category, CATEGORY, 'category attribute is present') + t.equal(result.description, DESCRIPTION, 'description attribute is present') + t.equal(result.titleSlug, TITLE_SLUG, 'titleSlug attribute is generated') + t.ok(typeof result.docOutline === 'string', 'docOutline is a string of HTML') + t.ok(typeof result.children === 'string', 'children is a string of HTML') + t.ok(result.children.indexOf('id="create-a-new-project"') > 0, 'Headings are linkified') + t.ok(result.children.indexOf('id="%24ubsection-2.1%3F"') > 0, 'Complex headings are linkified') + t.ok(result.children.indexOf('target="_blank">AWS is great') > 0, 'External link targets = blank') + t.ok(result.children.indexOf('
    Date: Fri, 17 Dec 2021 11:39:36 -0700
    Subject: [PATCH 302/680] 3.6.27
    
    ---
     package.json | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/package.json b/package.json
    index eec224b8..e8a8df39 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.26",
    +  "version": "3.6.27",
       "scripts": {
         "dist": "./scripts/dist.sh",
         "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json",
    
    From ed0a6c9ce035425143e407f8e49b0dcccd539b0b Mon Sep 17 00:00:00 2001
    From: macdonst 
    Date: Tue, 4 Jan 2022 14:35:22 -0500
    Subject: [PATCH 303/680] Add GoogleAnalytics to arc.codes
    
    Signed-off-by: macdonst 
    ---
     src/views/modules/document/ga.js   | 21 +++++++++++++++++++++
     src/views/modules/document/html.js |  2 ++
     2 files changed, 23 insertions(+)
     create mode 100644 src/views/modules/document/ga.js
    
    diff --git a/src/views/modules/document/ga.js b/src/views/modules/document/ga.js
    new file mode 100644
    index 00000000..3c6868bc
    --- /dev/null
    +++ b/src/views/modules/document/ga.js
    @@ -0,0 +1,21 @@
    +export default function GoogleAnalytics () {
    +  let env = process.env.NODE_ENV
    +  let production = 'production'
    +  let productionId = 'UA-74655805-3'
    +  let stagingId = 'G-22723SKNK4'
    +
    +  function snippet (env) {
    +    return `
    +    
    +    
    +        `
    +  }
    +
    +  return snippet(env == production ? productionId : stagingId)
    +
    +}
    diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js
    index 5f55d3b9..dfd6dddc 100644
    --- a/src/views/modules/document/html.js
    +++ b/src/views/modules/document/html.js
    @@ -1,6 +1,7 @@
     import Banner from '../components/banner.js'
     import DocumentOutline from '../components/document-outline.js'
     import EditLink from '../components/edit-link.js'
    +import GoogleAnalytics from './ga.js'
     import Head from './head.js'
     import Script from './script.js'
     import Sidebar from '../components/sidebar.js'
    @@ -82,6 +83,7 @@ ${Symbols}
       
       ${stateTag}
       ${scriptTags}
    +  ${GoogleAnalytics()}
       ${thirdparty}
     
     
    
    From 89337498f54436988576ea478553c8ca4e1274ce Mon Sep 17 00:00:00 2001
    From: macdonst 
    Date: Wed, 5 Jan 2022 13:52:53 -0500
    Subject: [PATCH 304/680] 3.6.28
    
    ---
     package.json | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/package.json b/package.json
    index e8a8df39..597d6a64 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.27",
    +  "version": "3.6.28",
       "scripts": {
         "dist": "./scripts/dist.sh",
         "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json",
    
    From d71f3fb07fd91354602a321f2483085450ab4935 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Fri, 7 Jan 2022 10:15:41 -0700
    Subject: [PATCH 305/680] Ruby: clarify steps for deployment with bundler
     onboard (#479)
    
    * clarify steps for deployment with bundler onboard
    ---
     .github/workflows/woke.yaml                     |  4 +++-
     scripts/dictionary.txt                          |  1 +
     .../dependency-management.md                    | 17 ++++++++++++++++-
     src/views/docs/en/reference/cli/destroy.md      |  2 +-
     .../docs/en/reference/runtime-helpers/ruby.md   | 11 +++++++----
     5 files changed, 28 insertions(+), 7 deletions(-)
    
    diff --git a/.github/workflows/woke.yaml b/.github/workflows/woke.yaml
    index 55615e1d..dc0ee6fd 100644
    --- a/.github/workflows/woke.yaml
    +++ b/.github/workflows/woke.yaml
    @@ -14,8 +14,10 @@ jobs:
           - name: 'Checkout'
             uses: actions/checkout@v2
     
    -      - uses: jitterbit/get-changed-files@v1
    +      - name: 'Changed files'
    +        uses: jitterbit/get-changed-files@v1
             id: files
    +        continue-on-error: true
     
           - name: 'woke'
             uses: get-woke/woke-action@v0
    diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt
    index 94a3c54b..6121ed26 100644
    --- a/scripts/dictionary.txt
    +++ b/scripts/dictionary.txt
    @@ -3,6 +3,7 @@
     ACM
     ApiGatewayManagementApi
     arc-example-cors
    +Bundler
     Cloudflare
     Dreamhost
     FQDN
    diff --git a/src/views/docs/en/guides/developer-experience/dependency-management.md b/src/views/docs/en/guides/developer-experience/dependency-management.md
    index 738dcf08..05dc34f6 100644
    --- a/src/views/docs/en/guides/developer-experience/dependency-management.md
    +++ b/src/views/docs/en/guides/developer-experience/dependency-management.md
    @@ -36,6 +36,8 @@ Recommended additional reading for working with the Node runtime:
     Architect uses `Gemfile` and `Gemfile.lock` with `bundle` to ensure Lambda function dependencies are deterministic. Code must be relative to the root of Lambda function directory.
     
     ```ruby
    +require 'bundler/setup' # initialize Bundler
    +
     require 'architect/functions' # is ok if it is vendored in the Lambda folder
     require '../foo' # this will fail
     require './foo' # this will work
    @@ -47,10 +49,23 @@ Install runtime helpers for Ruby:
     ```bash
     cd path/to/lambda
     bundle init
    -bundle install --path vendor/bundle
    +bundle config set --local path 'vendor/bundle'
     bundle add architect-functions
     ```
     
    +### Deployment Configuration
    +
    +Prior to deploying, it is recommended to configure Bundler to work in a Lambda environment.
    +
    +You'll need to let Bundler know about Lambda's platform architecture by adding an entry to the `Gemfile.lock`.  
    +Additionally, Bundler often tries to write to the filesystem at runtime. Freeze the bundle by setting the `BUNDLE_FROZEN` environment variable to `1`.
    +
    +```bash
    +bundle lock --add-platform x86_64-linux # declare Lambda's platform
    +npx arc env staging BUNDLE_FROZEN 1 # use arc to set an env var
    +npx arc env production BUNDLE_FROZEN 1 # do the same for production
    +```
    +
     ## Python
     
     Architect uses `requirements.txt` with `pip3` to ensure Lambda function dependencies are deterministic. Code must be relative to the root of Lambda function directory.
    diff --git a/src/views/docs/en/reference/cli/destroy.md b/src/views/docs/en/reference/cli/destroy.md
    index 4d933ecb..90dd327b 100644
    --- a/src/views/docs/en/reference/cli/destroy.md
    +++ b/src/views/docs/en/reference/cli/destroy.md
    @@ -18,7 +18,7 @@ arc destroy --app MyAppName [production] [--name NamedEnvironment] [--force]
     
     - `[--app MyAppName]` Required. Specify the app name, located under `@app` in your Architect manifest, to delete the app from AWS.
     - `[--name NamedEnvironment]` If you ran [`arc deploy`][deploy] with the `--name` flag to specify a custom named environment to deploy your application to, use this flag to destroy that same named application environment.
    -- `[production|--production|-p]` Destroy the production stack of your application. By default, without this flag, the staging stack is removed.
    +- `[--production]` Destroy the production stack of your application. By default, without this flag, the staging stack is removed.
     - `[--force|-f]` Force deletion of the application even if it contains DynamoDB tables ([`@tables`][tables]) or S3 bucket containing static assets ([`@static`][static]).
     - `[--no-timeout]` Do not exit the process until all application resources are deleted.
     
    diff --git a/src/views/docs/en/reference/runtime-helpers/ruby.md b/src/views/docs/en/reference/runtime-helpers/ruby.md
    index 93ee05c4..6e2b44d0 100644
    --- a/src/views/docs/en/reference/runtime-helpers/ruby.md
    +++ b/src/views/docs/en/reference/runtime-helpers/ruby.md
    @@ -4,26 +4,29 @@ category: Runtime helpers
     description: Ruby runtime support
     ---
     
    -[Helpers for working with the Architect generated runtime resources.](https://github.com/architect/functions-ruby)
    +[View package source on GitHub](https://github.com/architect/functions-ruby/)
     
     ## Install
     
     ```bash
     cd path/to/lambda
     bundle init
    -bundle install --path vendor/bundle
    +bundle config set --local path 'vendor/bundle'
     bundle add architect-functions
     ```
     
    +See important notes about [deployment configuration for Bundler](../../guides/developer-experience/dependency-management#deployment-configuration).
    +
     ## API
     
     ```ruby
     # example lambda function
    -require 'json'
    +require 'bundler/setup'
     require 'architect/functions'
    +require 'json'
     
     def handler
    -  {body: JSON.generate(Arc.reflect)}
    +  { body: JSON.generate(Arc.reflect) }
     end
     ```
     
    
    From 890da5fbae54646603f884145a1fbbedc291c31e Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Fri, 7 Jan 2022 17:36:29 -0700
    Subject: [PATCH 306/680] add using esm doc (#480)
    
    * add using esm doc
    
    * Update using-esm.md
    
    * Update dictionary.txt
    ---
     scripts/dictionary.txt                        |  4 +
     .../guides/developer-experience/using-esm.md  | 74 +++++++++++++++++++
     src/views/docs/table-of-contents.js           |  1 +
     3 files changed, 79 insertions(+)
     create mode 100644 src/views/docs/en/guides/developer-experience/using-esm.md
    
    diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt
    index 6121ed26..28612718 100644
    --- a/scripts/dictionary.txt
    +++ b/scripts/dictionary.txt
    @@ -4,8 +4,11 @@ ACM
     ApiGatewayManagementApi
     arc-example-cors
     Bundler
    +CJS
     Cloudflare
    +CommonJS
     Dreamhost
    +ESM
     FQDN
     getConnection
     GoDaddy
    @@ -14,3 +17,4 @@ konsumer
     LEANX
     Namecheap
     ParcelJS
    +treeshaking
    diff --git a/src/views/docs/en/guides/developer-experience/using-esm.md b/src/views/docs/en/guides/developer-experience/using-esm.md
    new file mode 100644
    index 00000000..9936e8c6
    --- /dev/null
    +++ b/src/views/docs/en/guides/developer-experience/using-esm.md
    @@ -0,0 +1,74 @@
    +---
    +title: Using ESM (ECMAScript Modules)
    +category: Developer experience
    +description: How to use ECMAScript Modules in functions
    +---
    +
    +As of January 6, 2022 [AWS Lambdas support Node.js 14 ES modules and top-level await](https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/). Architect shipped an update in version `9.5.0` that adheres to Node.js conventions and the implementation from AWS. Lambdas must use the `nodejs14.x` runtime to leverage ESM.
    +
    +## Example project
    +
    +A working Architect project with each method for using ESM and CJS, can be found on GitHub: [`architect-examples/arc-example-esm-cjs`](https://github.com/architect-examples/arc-example-esm-cjs).
    +
    +## CommonJS by default
    +
    +New and existing Architect projects will default to CommonJS. In the future (Architect 10+) `arc init` and `arc create` will generate ESM functions. Architect will always support CJS so long as Node.js does.
    +
    +## ES Modules with `.mjs`
    +
    +The simplest way to start using ESM is to create JavaScript files with a `.mjs` extension. For example, no configuration is needed for the following HTTP GET function to work as an ES module:
    +
    +```js
    +// ./src/http/get-index/index.mjs
    +export const handler = async function (request) {
    +  return { request }
    +}
    +```
    +
    +```
    +.
    +├── src
    +│   └── http
    +│       └── get-index
    +│           └── index.mjs
    +└── app.arc
    +```
    +
    +## ES Modules with `package.json`
    +
    +Alternatively, the `"type"` property of a function's package.json file can be set to `"module"` to declare the function is ESM. That function's handler file can then use a `.js` file extension:
    +
    +```json
    +// ./src/http/get-index/package.json
    +{
    +  "description": "other attributes are allowed",
    +  "type": "module"
    +}
    +```
    +
    +```
    +.
    +├── src
    +│   └── http
    +│       └── get-index
    +│           ├── index.js
    +│           └── package.json
    +└── app.arc
    +```
    +
    +Declaring dependencies in a function's `package.json` will disable Lambda treeshaking for that function. This is true no matter the module type.
    +
    +> ℹ️  Setting `"type": "module"` in the project's root `package.json` will not affect function module types.
    +
    +## Explicitly using CommonJS
    +
    +Users can explicitly use a `.cjs` file extension to declare a JS file is a CommonJS module.
    +
    +```
    +.
    +├── src
    +│   └── http
    +│       └── get-index
    +│           └── index.cjs
    +└── app.arc
    +```
    diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js
    index b6aab7a7..49b35bc4 100644
    --- a/src/views/docs/table-of-contents.js
    +++ b/src/views/docs/table-of-contents.js
    @@ -15,6 +15,7 @@ let Guides = [
           'Custom source paths',
           'Deployment',
           'Logging & monitoring',
    +      'Using ESM',
           'Using TypeScript',
         ],
         'Frontend': [
    
    From f633fed98c893b57d6d05c89b7c69d1d684e71be Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Fri, 7 Jan 2022 17:45:54 -0700
    Subject: [PATCH 307/680] update dependencies
    
    ---
     package.json | 12 ++++++------
     1 file changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/package.json b/package.json
    index 597d6a64..268a7d1d 100644
    --- a/package.json
    +++ b/package.json
    @@ -20,21 +20,21 @@
         "@toycode/markdown-it-class": "^1.2.4",
         "esm": "^3.2.25",
         "front-matter": "^4.0.2",
    -    "highlight.js": "^11.3.1",
    -    "markdown-it": "^12.2.0",
    +    "highlight.js": "^11.4.0",
    +    "markdown-it": "^12.3.1",
         "markdown-it-external-anchor": "^1.0.0",
         "markdown-it-toc-and-anchor": "^4.2.0",
    -    "slugify": "^1.6.3"
    +    "slugify": "^1.6.5"
       },
       "devDependencies": {
    -    "@architect/architect": "^9.4.2",
    +    "@architect/architect": "^9.5.0",
         "@architect/eslint-config": "^2.0.1",
         "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary",
    -    "eslint": "^8.4.1",
    +    "eslint": "^8.6.0",
         "linkinator": "^2.16.2",
         "spellchecker-cli": "^4.8.1",
         "tap-arc": "^0.1.2",
    -    "tape": "^5.3.2",
    +    "tape": "^5.4.0",
         "tiny-json-http": "^7.3.1"
       },
       "eslintConfig": {
    
    From a47cc13df4981d45ee581c838d94d2982b8017bf Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Fri, 7 Jan 2022 18:29:28 -0700
    Subject: [PATCH 308/680] add lockfile
    
    troubleshooting why `npx arc deploy` picks up new arc 9.5 instead of 9.4 from package.json
    ---
     .gitignore        |     1 -
     package-lock.json | 13626 ++++++++++++++++++++++++++++++++++++++++++++
     package.json      |     7 +-
     3 files changed, 13632 insertions(+), 2 deletions(-)
     create mode 100644 package-lock.json
    
    diff --git a/.gitignore b/.gitignore
    index 3663d95b..f8b9cec2 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -2,7 +2,6 @@
     .DS_Store
     **/static.json
     node_modules
    -package-lock.json
     sam.json
     sam.yaml
     scratch
    diff --git a/package-lock.json b/package-lock.json
    new file mode 100644
    index 00000000..074c3fa1
    --- /dev/null
    +++ b/package-lock.json
    @@ -0,0 +1,13626 @@
    +{
    +  "name": "@architect/arc.codes",
    +  "version": "3.6.28",
    +  "lockfileVersion": 2,
    +  "requires": true,
    +  "packages": {
    +    "": {
    +      "name": "@architect/arc.codes",
    +      "version": "3.6.28",
    +      "license": "Apache-2.0",
    +      "dependencies": {
    +        "@architect/asap": "^4.1.0",
    +        "@architect/functions": "^4.1.1",
    +        "@architect/inventory": "^2.2.1",
    +        "@architect/package": "^7.2.0",
    +        "@architect/syntaxes": "github:architect/syntaxes#v1.2.1",
    +        "@toycode/markdown-it-class": "^1.2.4",
    +        "esm": "^3.2.25",
    +        "front-matter": "^4.0.2",
    +        "highlight.js": "^11.4.0",
    +        "markdown-it": "^12.3.1",
    +        "markdown-it-external-anchor": "^1.0.0",
    +        "markdown-it-toc-and-anchor": "^4.2.0",
    +        "slugify": "^1.6.5"
    +      },
    +      "devDependencies": {
    +        "@architect/architect": "^9.4.2",
    +        "@architect/eslint-config": "^2.0.1",
    +        "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary",
    +        "eslint": "^8.6.0",
    +        "linkinator": "^2.16.2",
    +        "spellchecker-cli": "^4.8.1",
    +        "tap-arc": "^0.1.2",
    +        "tape": "^5.4.0",
    +        "tiny-json-http": "^7.3.1"
    +      }
    +    },
    +    "node_modules/@architect/architect": {
    +      "version": "9.4.2",
    +      "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.4.2.tgz",
    +      "integrity": "sha512-2XBsNHULMFCydG9YUqIYzoOZ2eLP4pkT3dnPMTf0B/5Qrby4t+sIbkTseLEkyK6Mhn1r8GWe+M/O4kYHNtIrpw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@architect/create": "3.1.1",
    +        "@architect/deploy": "3.1.0",
    +        "@architect/destroy": "2.0.3",
    +        "@architect/env": "2.0.6",
    +        "@architect/hydrate": "2.1.0",
    +        "@architect/logs": "3.0.3",
    +        "@architect/package": "7.2.0",
    +        "@architect/sandbox": "4.4.2",
    +        "aws-sdk": "2.880.0",
    +        "chalk": "4.1.2",
    +        "update-notifier": "5.1.0"
    +      },
    +      "bin": {
    +        "arc": "src/index.js"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/asap": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-4.1.0.tgz",
    +      "integrity": "sha512-SrPV5lUpjotyj/nIMQWwdTsNe5LwieFHqhrVo8tKKXz7Ht7ila15rH9dyYENOmMI87UVHvKDbsRvx47LK5NMwQ==",
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/@architect/create": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/@architect/create/-/create-3.1.1.tgz",
    +      "integrity": "sha512-Du2YITXVrgpR49GaRqQe/sc8VBQ3B05/eWHlGAOjPUgmTRf4JycAoKxSPnTMYmEjQHJyrABs35cbHhse1vH1tw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "chalk": "~4.1.2",
    +        "lambda-runtimes": "~1.1.0",
    +        "minimist": "~1.2.5"
    +      },
    +      "bin": {
    +        "arc-create": "cli.js"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/deploy": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.1.0.tgz",
    +      "integrity": "sha512-Sg4uZ6gSYrEwz5luOGkAkRm9fIrLoQvXZqaYOj4l6DZXNAt2A0EqoNLw9E6D7e6Y9kIqw42SJoIWNpqtx5sWpQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@architect/create": "~3.1.0",
    +        "@architect/hydrate": "~2.1.0",
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/package": "~7.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "chalk": "~4.1.2",
    +        "fs-extra": "~10.0.0",
    +        "get-folder-size": "2.0.1",
    +        "glob": "~7.2.0",
    +        "mime-types": "~2.1.34",
    +        "ospath": "~1.2.2",
    +        "path-sort": "~0.1.0",
    +        "rimraf": "~3.0.2",
    +        "run-parallel": "~1.2.0",
    +        "run-series": "~1.1.9",
    +        "run-waterfall": "~1.1.7",
    +        "sha": "~3.0.0",
    +        "zip-dir": "~2.0.0",
    +        "zipit": "~2.0.0"
    +      },
    +      "bin": {
    +        "arc-deploy": "src/cli/index.js"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/destroy": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-2.0.3.tgz",
    +      "integrity": "sha512-lIaWPrcI5G/TOcP3AxdAQoRxD0DYdClRAUzrILKRoPbp9klFDlVB7+JPqoL7b/tNCxTRN6EES0mZv4yFK64NQA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "aws-sdk": "2.880.0",
    +        "run-parallel": "~1.2.0",
    +        "run-waterfall": "~1.1.7"
    +      },
    +      "bin": {
    +        "arc-destroy": "src/cli.js"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/env": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/@architect/env/-/env-2.0.6.tgz",
    +      "integrity": "sha512-Wk7bhkVs6hLTq8JFDiSjPmWgf+Je5Hhehj57lLUb8F1eNtlLFHUwv6X2W/zyodIvoqiDl4d0Zb9FOLDY5F3BNA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/parser": "~5.0.2",
    +        "@architect/utils": "~3.0.4",
    +        "aws-sdk": "2.880.0",
    +        "chalk": "~4.1.2",
    +        "cross-env": "~7.0.3",
    +        "dotenv": "~10.0.0",
    +        "run-series": "~1.1.9",
    +        "run-waterfall": "~1.1.7",
    +        "yesno": "~0.3.1"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/eslint-config": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/@architect/eslint-config/-/eslint-config-2.0.1.tgz",
    +      "integrity": "sha512-VezbBc1DEikXXQNPBmIqz2DqKBr0ptrQ+lY7rdGxb2rxdRrmQ5OHVzSoHUxFA4Z7xNmWclTvx3RVYh3mfKKU/g==",
    +      "dev": true,
    +      "dependencies": {
    +        "eslint-plugin-filenames": "^1.3.2",
    +        "eslint-plugin-fp": "^2.3.0",
    +        "eslint-plugin-import": "^2.25.1"
    +      },
    +      "peerDependencies": {
    +        "eslint-plugin-filenames": "^1.3.2",
    +        "eslint-plugin-fp": "^2.3.0",
    +        "eslint-plugin-import": "^2.25.1"
    +      }
    +    },
    +    "node_modules/@architect/functions": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.1.1.tgz",
    +      "integrity": "sha512-x0+B/V9Jo5onksOce6iYdYeLh5F91dOp5fTnGJdkgOFCS+N0YN9zlI2asdPIs1Rb6xxCwoH1nuzs/jnNkupQWA==",
    +      "dependencies": {
    +        "aws-serverless-express": "^3.4.0",
    +        "cookie": "^0.4.1",
    +        "cookie-signature": "^1.1.0",
    +        "csrf": "^3.1.0",
    +        "node-webtokens": "^1.0.4",
    +        "run-parallel": "^1.2.0",
    +        "run-waterfall": "^1.1.7",
    +        "uid-safe": "^2.1.5"
    +      },
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/@architect/hydrate": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.1.0.tgz",
    +      "integrity": "sha512-mchkcEFZIZpkcIDLFndsCh0W1q5dmAOICMsO/rcAPYnRPvRQT8D4Bt+jFyV7AXu9OM3WGx34Llu/naKab/S1qQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "acorn-loose": "~8.2.1",
    +        "chalk": "~4.1.2",
    +        "cpr": "~3.0.1",
    +        "esquery": "~1.4.0",
    +        "glob": "~7.2.0",
    +        "rimraf": "~3.0.2",
    +        "run-series": "~1.1.9",
    +        "symlink-or-copy": "~1.3.1"
    +      },
    +      "bin": {
    +        "arc-hydrate": "cli.js"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/inventory": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-2.2.1.tgz",
    +      "integrity": "sha512-Rwl3os2JFHantTENPFn6KUeIaChmYc1v6B/zGCe5yC82mrJBXNZu8tN6PtawC6dmhQdbfBGAc+MlhgUqKzpVTA==",
    +      "dependencies": {
    +        "@architect/asap": "~4.1.0",
    +        "@architect/parser": "~5.0.2",
    +        "@architect/utils": "~3.0.4",
    +        "lambda-runtimes": "~1.1.0"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/logs": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-3.0.3.tgz",
    +      "integrity": "sha512-21fFpQ8BmAbsCmSlVYD0P6+caVm7LTS/bhAgfoqKkoK26QBKkQIC+QdMvrAlI0mF0zgInnl1FmWxphRhK/jvWg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "aws-sdk": "2.880.0",
    +        "chalk": "~4.1.2",
    +        "run-parallel": "~1.2.0",
    +        "run-waterfall": "~1.1.7",
    +        "strftime": "~0.10.0"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/package": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/@architect/package/-/package-7.2.0.tgz",
    +      "integrity": "sha512-c1Z8pD0tLbTMSWviAZEJ9SARL2ONZUjX8/RmHT0s6F/mEVJNhUwNsfcxsblqLscUl+sv82tqIovkFkC+UG0fSw==",
    +      "dependencies": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "chalk": "~4.1.2"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/parser": {
    +      "version": "5.0.2",
    +      "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-5.0.2.tgz",
    +      "integrity": "sha512-3XTuB/HS3GNDXXUQ2BJt7kVOViTGCR2O4hIUEb1l8FxsSmwzgpiR2CAzUA4ZhySxW+1a+Tg88YL2Yyb2kvLmlw==",
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/sandbox": {
    +      "version": "4.4.2",
    +      "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.4.2.tgz",
    +      "integrity": "sha512-WxCaGBc7X7OJW3I6OuMNnl4zwYlUzK+CSFgvPMx3X/VmLc37Mzm4SVn75jv+qW49iSdLDClzcAOCXT67brtPBw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@architect/asap": "~4.1.0",
    +        "@architect/create": "~3.1.1",
    +        "@architect/hydrate": "~2.1.0",
    +        "@architect/inventory": "~2.2.1",
    +        "@architect/parser": "~5.0.2",
    +        "@architect/utils": "~3.0.4",
    +        "@begin/hashid": "~1.0.0",
    +        "aws-sdk": "2.880.0",
    +        "body-parser": "~1.19.0",
    +        "chalk": "~4.1.2",
    +        "depstatus": "~1.1.1",
    +        "dotenv": "~10.0.0",
    +        "dynalite": "~3.2.1",
    +        "finalhandler": "~1.1.2",
    +        "glob": "~7.2.0",
    +        "http-proxy": "~1.18.1",
    +        "lambda-runtimes": "~1.1.1",
    +        "minimist": "~1.2.5",
    +        "node-watch": "~0.7.2",
    +        "router": "~1.3.6",
    +        "run-parallel": "~1.2.0",
    +        "run-series": "~1.1.9",
    +        "send": "~0.17.1",
    +        "server-destroy": "~1.0.1",
    +        "tree-kill": "~1.2.2",
    +        "update-notifier": "~5.1.0",
    +        "ws": "~8.3.0"
    +      },
    +      "bin": {
    +        "sandbox": "src/cli/cli.js"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@architect/spellcheck-dictionary": {
    +      "version": "0.0.1",
    +      "resolved": "git+ssh://git@github.com/architect/spellcheck-dictionary.git#11cae7e5559dda8ab03a3e3d32931db9a4fd3165",
    +      "integrity": "sha512-AW45aIXaWw5zmky1/irEPMDc1ex9kKA4niKf7hFPm6kXEk9OyFzYLb3QtxlQovYh+qK71KtYEVb9Z8cyuHgRIA==",
    +      "dev": true,
    +      "license": "Apache-2.0"
    +    },
    +    "node_modules/@architect/syntaxes": {
    +      "version": "1.2.1",
    +      "resolved": "git+ssh://git@github.com/architect/syntaxes.git#ca61027ef8295e2bb012a8df9ac9240052f43b66",
    +      "integrity": "sha512-dGGwAfcHpNfuthuv5i5H8e/i+NFqZxA1Kwo8lxdJJ3JX1P3LNr7uyNE+VRqbdXJkC3JNi5Jw0VUmtkBRzB7j1g==",
    +      "license": "Apache-2.0"
    +    },
    +    "node_modules/@architect/utils": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.0.4.tgz",
    +      "integrity": "sha512-Tmzw9p55n2euNMLUyqcNPy82FLCQ0/3jpZqv5xcZ8erq4w3ssb2Ok5Fclm+56YCioyM4xUiwsGU/uC09+BWgTg==",
    +      "dependencies": {
    +        "chalk": "~4.1.2",
    +        "glob": "~7.2.0",
    +        "path-sort": "~0.1.0",
    +        "restore-cursor": "3.1.0",
    +        "run-series": "~1.1.9",
    +        "run-waterfall": "~1.1.7",
    +        "sha": "~3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@babel/code-frame": {
    +      "version": "7.16.0",
    +      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
    +      "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/highlight": "^7.16.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-validator-identifier": {
    +      "version": "7.15.7",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
    +      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/highlight": {
    +      "version": "7.16.0",
    +      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
    +      "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-validator-identifier": "^7.15.7",
    +        "chalk": "^2.0.0",
    +        "js-tokens": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/chalk": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.1",
    +        "escape-string-regexp": "^1.0.5",
    +        "supports-color": "^5.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +      "dev": true
    +    },
    +    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/supports-color": {
    +      "version": "5.5.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@begin/hashid": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@begin/hashid/-/hashid-1.0.0.tgz",
    +      "integrity": "sha512-w+U9klEtRkt7hyW/f+/SvwPgJ4CTMO2ENddisX9dGgLUZKu+iKpb/IhYnQWIt9/Nnm/5DkApmiHGimPs621wwA==",
    +      "dev": true
    +    },
    +    "node_modules/@eslint/eslintrc": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
    +      "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ajv": "^6.12.4",
    +        "debug": "^4.3.2",
    +        "espree": "^9.2.0",
    +        "globals": "^13.9.0",
    +        "ignore": "^4.0.6",
    +        "import-fresh": "^3.2.1",
    +        "js-yaml": "^4.1.0",
    +        "minimatch": "^3.0.4",
    +        "strip-json-comments": "^3.1.1"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/@eslint/eslintrc/node_modules/debug": {
    +      "version": "4.3.3",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    +      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/@eslint/eslintrc/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/@humanwhocodes/config-array": {
    +      "version": "0.9.2",
    +      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
    +      "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@humanwhocodes/object-schema": "^1.2.1",
    +        "debug": "^4.1.1",
    +        "minimatch": "^3.0.4"
    +      },
    +      "engines": {
    +        "node": ">=10.10.0"
    +      }
    +    },
    +    "node_modules/@humanwhocodes/config-array/node_modules/debug": {
    +      "version": "4.3.3",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    +      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/@humanwhocodes/config-array/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/@humanwhocodes/object-schema": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
    +      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
    +      "dev": true
    +    },
    +    "node_modules/@nodelib/fs.scandir": {
    +      "version": "2.1.5",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
    +      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@nodelib/fs.stat": "2.0.5",
    +        "run-parallel": "^1.1.9"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/@nodelib/fs.stat": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
    +      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/@nodelib/fs.walk": {
    +      "version": "1.2.8",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
    +      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@nodelib/fs.scandir": "2.1.5",
    +        "fastq": "^1.6.0"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/@sindresorhus/is": {
    +      "version": "0.14.0",
    +      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
    +      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/@szmarczak/http-timer": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
    +      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
    +      "dev": true,
    +      "dependencies": {
    +        "defer-to-connect": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/@toycode/markdown-it-class": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz",
    +      "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ=="
    +    },
    +    "node_modules/@types/json5": {
    +      "version": "0.0.29",
    +      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
    +      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
    +      "dev": true
    +    },
    +    "node_modules/@types/mdast": {
    +      "version": "3.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
    +      "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/unist": "*"
    +      }
    +    },
    +    "node_modules/@types/minimist": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
    +      "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
    +      "dev": true
    +    },
    +    "node_modules/@types/normalize-package-data": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
    +      "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
    +      "dev": true
    +    },
    +    "node_modules/@types/unist": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
    +      "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==",
    +      "dev": true
    +    },
    +    "node_modules/@vendia/serverless-express": {
    +      "version": "3.4.0",
    +      "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-3.4.0.tgz",
    +      "integrity": "sha512-/UAAbi9qRjUtjRISt5MJ1sfhtrHb26hqQ0nvE5qhMLsAdR5H7ErBwPD8Q/v2OENKm0iWsGwErIZEg7ebUeFDjQ==",
    +      "dependencies": {
    +        "binary-case": "^1.0.0",
    +        "type-is": "^1.6.16"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/abort-controller": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
    +      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
    +      "dev": true,
    +      "dependencies": {
    +        "event-target-shim": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6.5"
    +      }
    +    },
    +    "node_modules/abstract-leveldown": {
    +      "version": "6.2.3",
    +      "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
    +      "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "buffer": "^5.5.0",
    +        "immediate": "^3.2.3",
    +        "level-concat-iterator": "~2.0.0",
    +        "level-supports": "~1.0.0",
    +        "xtend": "~4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/abstract-leveldown/node_modules/buffer": {
    +      "version": "5.7.1",
    +      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    +      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "dependencies": {
    +        "base64-js": "^1.3.1",
    +        "ieee754": "^1.1.13"
    +      }
    +    },
    +    "node_modules/acorn": {
    +      "version": "8.7.0",
    +      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
    +      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
    +      "dev": true,
    +      "bin": {
    +        "acorn": "bin/acorn"
    +      },
    +      "engines": {
    +        "node": ">=0.4.0"
    +      }
    +    },
    +    "node_modules/acorn-jsx": {
    +      "version": "5.3.2",
    +      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
    +      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
    +      "dev": true,
    +      "peerDependencies": {
    +        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
    +      }
    +    },
    +    "node_modules/acorn-loose": {
    +      "version": "8.2.1",
    +      "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.2.1.tgz",
    +      "integrity": "sha512-/sVu5wCtWrX6ChLCMzBTmNkXSoyRKunTf6HjHMswzMmzIyE8vU+HYlgd2kFF/A9Av9j+b9/d/FzxrmcH0lCrBw==",
    +      "dev": true,
    +      "dependencies": {
    +        "acorn": "^8.5.0"
    +      },
    +      "engines": {
    +        "node": ">=0.4.0"
    +      }
    +    },
    +    "node_modules/agent-base": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
    +      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "4"
    +      },
    +      "engines": {
    +        "node": ">= 6.0.0"
    +      }
    +    },
    +    "node_modules/agent-base/node_modules/debug": {
    +      "version": "4.3.2",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    +      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/agent-base/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/ajv": {
    +      "version": "6.12.6",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
    +      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
    +      "dev": true,
    +      "dependencies": {
    +        "fast-deep-equal": "^3.1.1",
    +        "fast-json-stable-stringify": "^2.0.0",
    +        "json-schema-traverse": "^0.4.1",
    +        "uri-js": "^4.2.2"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/epoberezkin"
    +      }
    +    },
    +    "node_modules/ansi-align": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
    +      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^4.1.0"
    +      }
    +    },
    +    "node_modules/ansi-colors": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
    +      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/ansi-regex": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
    +      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/ansi-styles": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
    +      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
    +      "dependencies": {
    +        "color-convert": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/app-root-path": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz",
    +      "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 6.0.0"
    +      }
    +    },
    +    "node_modules/argparse": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    +      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
    +    },
    +    "node_modules/array-back": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
    +      "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/array-flatten": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz",
    +      "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==",
    +      "dev": true
    +    },
    +    "node_modules/array-includes": {
    +      "version": "3.1.4",
    +      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
    +      "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.1",
    +        "get-intrinsic": "^1.1.1",
    +        "is-string": "^1.0.7"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/array-iterate": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz",
    +      "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/array-union": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
    +      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/array.prototype.flat": {
    +      "version": "1.2.5",
    +      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
    +      "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/arrify": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
    +      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/async": {
    +      "version": "2.6.3",
    +      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
    +      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
    +      "dev": true,
    +      "dependencies": {
    +        "lodash": "^4.17.14"
    +      }
    +    },
    +    "node_modules/available-typed-arrays": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
    +      "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/aws-sdk": {
    +      "version": "2.880.0",
    +      "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.880.0.tgz",
    +      "integrity": "sha512-/dBk3ejw22ED2edzGfmJB83KXDA4wLIw5Hb+2YMhly+gOWecvevy0tML2+YN/cmxyTy+wT0E0sM7fm1v7kmHtw==",
    +      "dev": true,
    +      "dependencies": {
    +        "buffer": "4.9.2",
    +        "events": "1.1.1",
    +        "ieee754": "1.1.13",
    +        "jmespath": "0.15.0",
    +        "querystring": "0.2.0",
    +        "sax": "1.2.1",
    +        "url": "0.10.3",
    +        "uuid": "3.3.2",
    +        "xml2js": "0.4.19"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/aws-serverless-express": {
    +      "version": "3.4.0",
    +      "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.4.0.tgz",
    +      "integrity": "sha512-YG9ZjAOI9OpwqDDWzkRc3kKJYJuR7gTMjLa3kAWopO17myoprxskCUyCEee+RKe34tcR4UNrVtgAwW5yDe74bw==",
    +      "dependencies": {
    +        "@vendia/serverless-express": "^3.4.0",
    +        "binary-case": "^1.0.0",
    +        "type-is": "^1.6.16"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/bail": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
    +      "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/balanced-match": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
    +      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    +    },
    +    "node_modules/base64-js": {
    +      "version": "1.5.1",
    +      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
    +      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/big.js": {
    +      "version": "5.2.2",
    +      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
    +      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/binary-case": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz",
    +      "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg=="
    +    },
    +    "node_modules/body-parser": {
    +      "version": "1.19.1",
    +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz",
    +      "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==",
    +      "dev": true,
    +      "dependencies": {
    +        "bytes": "3.1.1",
    +        "content-type": "~1.0.4",
    +        "debug": "2.6.9",
    +        "depd": "~1.1.2",
    +        "http-errors": "1.8.1",
    +        "iconv-lite": "0.4.24",
    +        "on-finished": "~2.3.0",
    +        "qs": "6.9.6",
    +        "raw-body": "2.4.2",
    +        "type-is": "~1.6.18"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/boxen": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
    +      "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-align": "^3.0.0",
    +        "camelcase": "^6.2.0",
    +        "chalk": "^4.1.0",
    +        "cli-boxes": "^2.2.1",
    +        "string-width": "^4.2.2",
    +        "type-fest": "^0.20.2",
    +        "widest-line": "^3.1.0",
    +        "wrap-ansi": "^7.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/brace-expansion": {
    +      "version": "1.1.11",
    +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
    +      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
    +      "dependencies": {
    +        "balanced-match": "^1.0.0",
    +        "concat-map": "0.0.1"
    +      }
    +    },
    +    "node_modules/braces": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
    +      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
    +      "dev": true,
    +      "dependencies": {
    +        "fill-range": "^7.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/buffer": {
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
    +      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
    +      "dev": true,
    +      "dependencies": {
    +        "base64-js": "^1.0.2",
    +        "ieee754": "^1.1.4",
    +        "isarray": "^1.0.0"
    +      }
    +    },
    +    "node_modules/buffer-crc32": {
    +      "version": "0.2.13",
    +      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
    +      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
    +      "dev": true,
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/bytes": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
    +      "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/cacheable-request": {
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
    +      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
    +      "dev": true,
    +      "dependencies": {
    +        "clone-response": "^1.0.2",
    +        "get-stream": "^5.1.0",
    +        "http-cache-semantics": "^4.0.0",
    +        "keyv": "^3.0.0",
    +        "lowercase-keys": "^2.0.0",
    +        "normalize-url": "^4.1.0",
    +        "responselike": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/cacheable-request/node_modules/get-stream": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
    +      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
    +      "dev": true,
    +      "dependencies": {
    +        "pump": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/cacheable-request/node_modules/lowercase-keys": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
    +      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/call-bind": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
    +      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
    +      "dev": true,
    +      "dependencies": {
    +        "function-bind": "^1.1.1",
    +        "get-intrinsic": "^1.0.2"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/callsites": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
    +      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/camelcase": {
    +      "version": "6.2.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
    +      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/camelcase-keys": {
    +      "version": "6.2.2",
    +      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
    +      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "^5.3.1",
    +        "map-obj": "^4.0.0",
    +        "quick-lru": "^4.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/camelcase-keys/node_modules/camelcase": {
    +      "version": "5.3.1",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    +      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/chalk": {
    +      "version": "4.1.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
    +      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
    +      "dependencies": {
    +        "ansi-styles": "^4.1.0",
    +        "supports-color": "^7.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/chalk?sponsor=1"
    +      }
    +    },
    +    "node_modules/character-entities": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
    +      "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/character-entities-legacy": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
    +      "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/character-reference-invalid": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
    +      "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/ci-info": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
    +      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
    +      "dev": true
    +    },
    +    "node_modules/cli-boxes": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
    +      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/clone": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
    +      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
    +      "engines": {
    +        "node": ">=0.8"
    +      }
    +    },
    +    "node_modules/clone-response": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
    +      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
    +      "dev": true,
    +      "dependencies": {
    +        "mimic-response": "^1.0.0"
    +      }
    +    },
    +    "node_modules/color-convert": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
    +      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
    +      "dependencies": {
    +        "color-name": "~1.1.4"
    +      },
    +      "engines": {
    +        "node": ">=7.0.0"
    +      }
    +    },
    +    "node_modules/color-name": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
    +      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
    +    },
    +    "node_modules/command-line-args": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz",
    +      "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-back": "^3.1.0",
    +        "find-replace": "^3.0.0",
    +        "lodash.camelcase": "^4.3.0",
    +        "typical": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/command-line-usage": {
    +      "version": "5.0.5",
    +      "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz",
    +      "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-back": "^2.0.0",
    +        "chalk": "^2.4.1",
    +        "table-layout": "^0.4.3",
    +        "typical": "^2.6.1"
    +      },
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/command-line-usage/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/command-line-usage/node_modules/array-back": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
    +      "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
    +      "dev": true,
    +      "dependencies": {
    +        "typical": "^2.6.1"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/command-line-usage/node_modules/chalk": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.1",
    +        "escape-string-regexp": "^1.0.5",
    +        "supports-color": "^5.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/command-line-usage/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/command-line-usage/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +      "dev": true
    +    },
    +    "node_modules/command-line-usage/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/command-line-usage/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/command-line-usage/node_modules/supports-color": {
    +      "version": "5.5.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/command-line-usage/node_modules/typical": {
    +      "version": "2.6.1",
    +      "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    +      "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    +      "dev": true
    +    },
    +    "node_modules/concat-map": {
    +      "version": "0.0.1",
    +      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
    +      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    +    },
    +    "node_modules/configstore": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
    +      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
    +      "dev": true,
    +      "dependencies": {
    +        "dot-prop": "^5.2.0",
    +        "graceful-fs": "^4.1.2",
    +        "make-dir": "^3.0.0",
    +        "unique-string": "^2.0.0",
    +        "write-file-atomic": "^3.0.0",
    +        "xdg-basedir": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/content-type": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
    +      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/cookie": {
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
    +      "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/cookie-signature": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz",
    +      "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==",
    +      "engines": {
    +        "node": ">=6.6.0"
    +      }
    +    },
    +    "node_modules/core-util-is": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
    +      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
    +      "dev": true
    +    },
    +    "node_modules/cpr": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz",
    +      "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.5",
    +        "minimist": "^1.2.0",
    +        "mkdirp": "~0.5.1",
    +        "rimraf": "^2.5.4"
    +      },
    +      "bin": {
    +        "cpr": "bin/cpr"
    +      }
    +    },
    +    "node_modules/cpr/node_modules/rimraf": {
    +      "version": "2.7.1",
    +      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
    +      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
    +      "dev": true,
    +      "dependencies": {
    +        "glob": "^7.1.3"
    +      },
    +      "bin": {
    +        "rimraf": "bin.js"
    +      }
    +    },
    +    "node_modules/create-eslint-index": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/create-eslint-index/-/create-eslint-index-1.0.0.tgz",
    +      "integrity": "sha1-2VQ3LYbVeS/NZ+nyt5GxqxYkEbs=",
    +      "dev": true,
    +      "dependencies": {
    +        "lodash.get": "^4.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/cross-env": {
    +      "version": "7.0.3",
    +      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
    +      "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
    +      "dev": true,
    +      "dependencies": {
    +        "cross-spawn": "^7.0.1"
    +      },
    +      "bin": {
    +        "cross-env": "src/bin/cross-env.js",
    +        "cross-env-shell": "src/bin/cross-env-shell.js"
    +      },
    +      "engines": {
    +        "node": ">=10.14",
    +        "npm": ">=6",
    +        "yarn": ">=1"
    +      }
    +    },
    +    "node_modules/cross-spawn": {
    +      "version": "7.0.3",
    +      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
    +      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "path-key": "^3.1.0",
    +        "shebang-command": "^2.0.0",
    +        "which": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/crypto-random-string": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
    +      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/csrf": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz",
    +      "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==",
    +      "dependencies": {
    +        "rndm": "1.2.0",
    +        "tsscmp": "1.0.6",
    +        "uid-safe": "2.1.5"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/date-format": {
    +      "version": "0.0.2",
    +      "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.2.tgz",
    +      "integrity": "sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE=",
    +      "dev": true
    +    },
    +    "node_modules/debug": {
    +      "version": "2.6.9",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
    +      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.0.0"
    +      }
    +    },
    +    "node_modules/decamelize": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
    +      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/decamelize-keys": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
    +      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
    +      "dev": true,
    +      "dependencies": {
    +        "decamelize": "^1.1.0",
    +        "map-obj": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/decamelize-keys/node_modules/map-obj": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
    +      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/decompress-response": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
    +      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
    +      "dev": true,
    +      "dependencies": {
    +        "mimic-response": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/deep-equal": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
    +      "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.0",
    +        "es-get-iterator": "^1.1.1",
    +        "get-intrinsic": "^1.0.1",
    +        "is-arguments": "^1.0.4",
    +        "is-date-object": "^1.0.2",
    +        "is-regex": "^1.1.1",
    +        "isarray": "^2.0.5",
    +        "object-is": "^1.1.4",
    +        "object-keys": "^1.1.1",
    +        "object.assign": "^4.1.2",
    +        "regexp.prototype.flags": "^1.3.0",
    +        "side-channel": "^1.0.3",
    +        "which-boxed-primitive": "^1.0.1",
    +        "which-collection": "^1.0.1",
    +        "which-typed-array": "^1.1.2"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/deep-equal/node_modules/isarray": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
    +      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
    +      "dev": true
    +    },
    +    "node_modules/deep-extend": {
    +      "version": "0.6.0",
    +      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
    +      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/deep-is": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
    +      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
    +      "dev": true
    +    },
    +    "node_modules/defer-to-connect": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
    +      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
    +      "dev": true
    +    },
    +    "node_modules/deferred-leveldown": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz",
    +      "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==",
    +      "dev": true,
    +      "dependencies": {
    +        "abstract-leveldown": "~6.2.1",
    +        "inherits": "^2.0.3"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/define-properties": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
    +      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "object-keys": "^1.0.12"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/defined": {
    +      "version": "0.0.0",
    +      "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz",
    +      "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=",
    +      "dev": true
    +    },
    +    "node_modules/depd": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
    +      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/depstatus": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/depstatus/-/depstatus-1.1.1.tgz",
    +      "integrity": "sha512-QT4i2Ql8RS1ttcj7zo4RzYvKz+/eOOIh6N7CXHqfDqC5ZX1hfx5KX6T88gy/j2UWP2x2ytjSoFBl+XW0gVZMug==",
    +      "dev": true,
    +      "dependencies": {
    +        "semver": "^7.3.2"
    +      }
    +    },
    +    "node_modules/destroy": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
    +      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
    +      "dev": true
    +    },
    +    "node_modules/dictionary-en-au": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.3.0.tgz",
    +      "integrity": "sha512-KoEotpXPCyCgZ5DHlexHyzFfNwPnv9VupeCrp6r+JrtEkycPmZYbQiXF+cXz9NJr1gXy0AMEpzZ8UfxF40+8OQ==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/dictionary-en-ca": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.3.0.tgz",
    +      "integrity": "sha512-5p6B2+GLByVz3Gvb42Y5hTdFBNxJhgG7XRVM74J7hcp+DvtAfOrufTZFfkux9t0qWOjORZoDCmDI6uKiX8qeuQ==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/dictionary-en-gb": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.3.0.tgz",
    +      "integrity": "sha512-P/J2VQp/hDsMTfJhmIYPUBxZqezWuDaUzSgb6oW7JLpUV2So9jCXbR5TaUYXwfO50ZXPYEzQqQHPQK3pKcs7Rg==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/dictionary-en-us": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-us/-/dictionary-en-us-2.2.1.tgz",
    +      "integrity": "sha512-Z8mycV0ywTfjbUTi0JZfQHqBZhu4CYFtpf7KluSGpt3xHpFlal2S/hiK50tlPynOtR5K3pG5wCradnz1yxwOHA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/dictionary-en-za": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.0.4.tgz",
    +      "integrity": "sha512-EgI61DvQsrnIFBmmCz7GB9P/wkCnKnZgKRXyYpbkZomnY0I4vDfNZtjaX81lwb9s+eudP9QJ+8sMzK7eoUapEg==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/dictionary-vi": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.1.3.tgz",
    +      "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/dir-glob": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
    +      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
    +      "dev": true,
    +      "dependencies": {
    +        "path-type": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/doctrine": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
    +      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
    +      "dev": true,
    +      "dependencies": {
    +        "esutils": "^2.0.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/dom-serializer": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
    +      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
    +      "dev": true,
    +      "dependencies": {
    +        "domelementtype": "^2.0.1",
    +        "domhandler": "^4.2.0",
    +        "entities": "^2.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
    +      }
    +    },
    +    "node_modules/domelementtype": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
    +      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/fb55"
    +        }
    +      ]
    +    },
    +    "node_modules/domhandler": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
    +      "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
    +      "dev": true,
    +      "dependencies": {
    +        "domelementtype": "^2.2.0"
    +      },
    +      "engines": {
    +        "node": ">= 4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/domhandler?sponsor=1"
    +      }
    +    },
    +    "node_modules/domutils": {
    +      "version": "2.8.0",
    +      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    +      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +      "dev": true,
    +      "dependencies": {
    +        "dom-serializer": "^1.0.1",
    +        "domelementtype": "^2.2.0",
    +        "domhandler": "^4.2.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/domutils?sponsor=1"
    +      }
    +    },
    +    "node_modules/dot-prop": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
    +      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-obj": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/dotenv": {
    +      "version": "10.0.0",
    +      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
    +      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/dotignore": {
    +      "version": "0.1.2",
    +      "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz",
    +      "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==",
    +      "dev": true,
    +      "dependencies": {
    +        "minimatch": "^3.0.4"
    +      },
    +      "bin": {
    +        "ignored": "bin/ignored"
    +      }
    +    },
    +    "node_modules/duplexer3": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
    +      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
    +      "dev": true
    +    },
    +    "node_modules/dynalite": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz",
    +      "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "async": "^2.6.3",
    +        "big.js": "^5.2.2",
    +        "buffer-crc32": "^0.2.13",
    +        "lazy": "^1.0.11",
    +        "levelup": "^4.4.0",
    +        "lock": "^1.1.0",
    +        "memdown": "^5.1.0",
    +        "minimist": "^1.2.5",
    +        "once": "^1.4.0",
    +        "subleveldown": "^5.0.0"
    +      },
    +      "bin": {
    +        "dynalite": "cli.js"
    +      },
    +      "optionalDependencies": {
    +        "leveldown": "^5.2.1"
    +      }
    +    },
    +    "node_modules/ee-first": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
    +      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
    +      "dev": true
    +    },
    +    "node_modules/emoji-regex": {
    +      "version": "8.0.0",
    +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
    +      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
    +      "dev": true
    +    },
    +    "node_modules/encodeurl": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
    +      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/encoding-down": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz",
    +      "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==",
    +      "dev": true,
    +      "dependencies": {
    +        "abstract-leveldown": "^6.2.1",
    +        "inherits": "^2.0.3",
    +        "level-codec": "^9.0.0",
    +        "level-errors": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/end-of-stream": {
    +      "version": "1.4.4",
    +      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
    +      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "once": "^1.4.0"
    +      }
    +    },
    +    "node_modules/enquirer": {
    +      "version": "2.3.6",
    +      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
    +      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-colors": "^4.1.1"
    +      },
    +      "engines": {
    +        "node": ">=8.6"
    +      }
    +    },
    +    "node_modules/entities": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
    +      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
    +      "funding": {
    +        "url": "https://github.com/fb55/entities?sponsor=1"
    +      }
    +    },
    +    "node_modules/errno": {
    +      "version": "0.1.8",
    +      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
    +      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
    +      "dev": true,
    +      "dependencies": {
    +        "prr": "~1.0.1"
    +      },
    +      "bin": {
    +        "errno": "cli.js"
    +      }
    +    },
    +    "node_modules/error-ex": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
    +      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-arrayish": "^0.2.1"
    +      }
    +    },
    +    "node_modules/es-abstract": {
    +      "version": "1.19.1",
    +      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
    +      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "es-to-primitive": "^1.2.1",
    +        "function-bind": "^1.1.1",
    +        "get-intrinsic": "^1.1.1",
    +        "get-symbol-description": "^1.0.0",
    +        "has": "^1.0.3",
    +        "has-symbols": "^1.0.2",
    +        "internal-slot": "^1.0.3",
    +        "is-callable": "^1.2.4",
    +        "is-negative-zero": "^2.0.1",
    +        "is-regex": "^1.1.4",
    +        "is-shared-array-buffer": "^1.0.1",
    +        "is-string": "^1.0.7",
    +        "is-weakref": "^1.0.1",
    +        "object-inspect": "^1.11.0",
    +        "object-keys": "^1.1.1",
    +        "object.assign": "^4.1.2",
    +        "string.prototype.trimend": "^1.0.4",
    +        "string.prototype.trimstart": "^1.0.4",
    +        "unbox-primitive": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/es-get-iterator": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
    +      "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.0",
    +        "has-symbols": "^1.0.1",
    +        "is-arguments": "^1.1.0",
    +        "is-map": "^2.0.2",
    +        "is-set": "^2.0.2",
    +        "is-string": "^1.0.5",
    +        "isarray": "^2.0.5"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/es-get-iterator/node_modules/isarray": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
    +      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
    +      "dev": true
    +    },
    +    "node_modules/es-to-primitive": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
    +      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-callable": "^1.1.4",
    +        "is-date-object": "^1.0.1",
    +        "is-symbol": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/escape-goat": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
    +      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/escape-html": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
    +      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
    +      "dev": true
    +    },
    +    "node_modules/escape-string-regexp": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
    +      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/eslint": {
    +      "version": "8.6.0",
    +      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz",
    +      "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@eslint/eslintrc": "^1.0.5",
    +        "@humanwhocodes/config-array": "^0.9.2",
    +        "ajv": "^6.10.0",
    +        "chalk": "^4.0.0",
    +        "cross-spawn": "^7.0.2",
    +        "debug": "^4.3.2",
    +        "doctrine": "^3.0.0",
    +        "enquirer": "^2.3.5",
    +        "escape-string-regexp": "^4.0.0",
    +        "eslint-scope": "^7.1.0",
    +        "eslint-utils": "^3.0.0",
    +        "eslint-visitor-keys": "^3.1.0",
    +        "espree": "^9.3.0",
    +        "esquery": "^1.4.0",
    +        "esutils": "^2.0.2",
    +        "fast-deep-equal": "^3.1.3",
    +        "file-entry-cache": "^6.0.1",
    +        "functional-red-black-tree": "^1.0.1",
    +        "glob-parent": "^6.0.1",
    +        "globals": "^13.6.0",
    +        "ignore": "^4.0.6",
    +        "import-fresh": "^3.0.0",
    +        "imurmurhash": "^0.1.4",
    +        "is-glob": "^4.0.0",
    +        "js-yaml": "^4.1.0",
    +        "json-stable-stringify-without-jsonify": "^1.0.1",
    +        "levn": "^0.4.1",
    +        "lodash.merge": "^4.6.2",
    +        "minimatch": "^3.0.4",
    +        "natural-compare": "^1.4.0",
    +        "optionator": "^0.9.1",
    +        "progress": "^2.0.0",
    +        "regexpp": "^3.2.0",
    +        "semver": "^7.2.1",
    +        "strip-ansi": "^6.0.1",
    +        "strip-json-comments": "^3.1.0",
    +        "text-table": "^0.2.0",
    +        "v8-compile-cache": "^2.0.3"
    +      },
    +      "bin": {
    +        "eslint": "bin/eslint.js"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      },
    +      "funding": {
    +        "url": "https://opencollective.com/eslint"
    +      }
    +    },
    +    "node_modules/eslint-ast-utils": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz",
    +      "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==",
    +      "dev": true,
    +      "dependencies": {
    +        "lodash.get": "^4.4.2",
    +        "lodash.zip": "^4.2.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/eslint-import-resolver-node": {
    +      "version": "0.3.6",
    +      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
    +      "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "^3.2.7",
    +        "resolve": "^1.20.0"
    +      }
    +    },
    +    "node_modules/eslint-import-resolver-node/node_modules/debug": {
    +      "version": "3.2.7",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    +      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "^2.1.1"
    +      }
    +    },
    +    "node_modules/eslint-import-resolver-node/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/eslint-module-utils": {
    +      "version": "2.7.1",
    +      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
    +      "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "^3.2.7",
    +        "find-up": "^2.1.0",
    +        "pkg-dir": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/eslint-module-utils/node_modules/debug": {
    +      "version": "3.2.7",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    +      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "^2.1.1"
    +      }
    +    },
    +    "node_modules/eslint-module-utils/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/eslint-plugin-filenames": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz",
    +      "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==",
    +      "dev": true,
    +      "dependencies": {
    +        "lodash.camelcase": "4.3.0",
    +        "lodash.kebabcase": "4.1.1",
    +        "lodash.snakecase": "4.1.1",
    +        "lodash.upperfirst": "4.3.1"
    +      },
    +      "peerDependencies": {
    +        "eslint": "*"
    +      }
    +    },
    +    "node_modules/eslint-plugin-fp": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-fp/-/eslint-plugin-fp-2.3.0.tgz",
    +      "integrity": "sha1-N20qEIcQ6YGYC9w4deO5kg2gSJw=",
    +      "dev": true,
    +      "dependencies": {
    +        "create-eslint-index": "^1.0.0",
    +        "eslint-ast-utils": "^1.0.0",
    +        "lodash": "^4.13.1",
    +        "req-all": "^0.1.0"
    +      },
    +      "engines": {
    +        "node": ">=4.0.0"
    +      },
    +      "peerDependencies": {
    +        "eslint": ">=3"
    +      }
    +    },
    +    "node_modules/eslint-plugin-import": {
    +      "version": "2.25.2",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz",
    +      "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-includes": "^3.1.4",
    +        "array.prototype.flat": "^1.2.5",
    +        "debug": "^2.6.9",
    +        "doctrine": "^2.1.0",
    +        "eslint-import-resolver-node": "^0.3.6",
    +        "eslint-module-utils": "^2.7.0",
    +        "has": "^1.0.3",
    +        "is-core-module": "^2.7.0",
    +        "is-glob": "^4.0.3",
    +        "minimatch": "^3.0.4",
    +        "object.values": "^1.1.5",
    +        "resolve": "^1.20.0",
    +        "tsconfig-paths": "^3.11.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      },
    +      "peerDependencies": {
    +        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
    +      }
    +    },
    +    "node_modules/eslint-plugin-import/node_modules/doctrine": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
    +      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
    +      "dev": true,
    +      "dependencies": {
    +        "esutils": "^2.0.2"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/eslint-scope": {
    +      "version": "7.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
    +      "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
    +      "dev": true,
    +      "dependencies": {
    +        "esrecurse": "^4.3.0",
    +        "estraverse": "^5.2.0"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/eslint-utils": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
    +      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
    +      "dev": true,
    +      "dependencies": {
    +        "eslint-visitor-keys": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/mysticatea"
    +      },
    +      "peerDependencies": {
    +        "eslint": ">=5"
    +      }
    +    },
    +    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
    +      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/eslint-visitor-keys": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
    +      "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/debug": {
    +      "version": "4.3.2",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    +      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/eslint/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/esm": {
    +      "version": "3.2.25",
    +      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
    +      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/espree": {
    +      "version": "9.3.0",
    +      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
    +      "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "acorn": "^8.7.0",
    +        "acorn-jsx": "^5.3.1",
    +        "eslint-visitor-keys": "^3.1.0"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/esprima": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
    +      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
    +      "bin": {
    +        "esparse": "bin/esparse.js",
    +        "esvalidate": "bin/esvalidate.js"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/esquery": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
    +      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
    +      "dev": true,
    +      "dependencies": {
    +        "estraverse": "^5.1.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10"
    +      }
    +    },
    +    "node_modules/esrecurse": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
    +      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
    +      "dev": true,
    +      "dependencies": {
    +        "estraverse": "^5.2.0"
    +      },
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/estraverse": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
    +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/esutils": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
    +      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/etag": {
    +      "version": "1.8.1",
    +      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
    +      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/event-target-shim": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
    +      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/eventemitter3": {
    +      "version": "4.0.7",
    +      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
    +      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
    +      "dev": true
    +    },
    +    "node_modules/events": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
    +      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.4.x"
    +      }
    +    },
    +    "node_modules/events-to-array": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz",
    +      "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=",
    +      "dev": true
    +    },
    +    "node_modules/extend": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
    +      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
    +      "dev": true
    +    },
    +    "node_modules/fast-deep-equal": {
    +      "version": "3.1.3",
    +      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
    +      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
    +      "dev": true
    +    },
    +    "node_modules/fast-diff": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
    +      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
    +      "dev": true
    +    },
    +    "node_modules/fast-glob": {
    +      "version": "3.2.7",
    +      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
    +      "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "@nodelib/fs.stat": "^2.0.2",
    +        "@nodelib/fs.walk": "^1.2.3",
    +        "glob-parent": "^5.1.2",
    +        "merge2": "^1.3.0",
    +        "micromatch": "^4.0.4"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/fast-glob/node_modules/glob-parent": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
    +      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-glob": "^4.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/fast-json-stable-stringify": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
    +      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
    +      "dev": true
    +    },
    +    "node_modules/fast-levenshtein": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
    +      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
    +      "dev": true
    +    },
    +    "node_modules/fast-safe-stringify": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
    +      "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
    +      "dev": true
    +    },
    +    "node_modules/fastq": {
    +      "version": "1.13.0",
    +      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
    +      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
    +      "dev": true,
    +      "dependencies": {
    +        "reusify": "^1.0.4"
    +      }
    +    },
    +    "node_modules/fault": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
    +      "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
    +      "dev": true,
    +      "dependencies": {
    +        "format": "^0.2.0"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/file-entry-cache": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
    +      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
    +      "dev": true,
    +      "dependencies": {
    +        "flat-cache": "^3.0.4"
    +      },
    +      "engines": {
    +        "node": "^10.12.0 || >=12.0.0"
    +      }
    +    },
    +    "node_modules/fill-range": {
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
    +      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "to-regex-range": "^5.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/finalhandler": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
    +      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "2.6.9",
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "on-finished": "~2.3.0",
    +        "parseurl": "~1.3.3",
    +        "statuses": "~1.5.0",
    +        "unpipe": "~1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/find-replace": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
    +      "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-back": "^3.0.1"
    +      },
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/find-up": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
    +      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/flat-cache": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
    +      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "flatted": "^3.1.0",
    +        "rimraf": "^3.0.2"
    +      },
    +      "engines": {
    +        "node": "^10.12.0 || >=12.0.0"
    +      }
    +    },
    +    "node_modules/flatted": {
    +      "version": "3.2.2",
    +      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
    +      "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
    +      "dev": true
    +    },
    +    "node_modules/follow-redirects": {
    +      "version": "1.14.6",
    +      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz",
    +      "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "individual",
    +          "url": "https://github.com/sponsors/RubenVerborgh"
    +        }
    +      ],
    +      "engines": {
    +        "node": ">=4.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "debug": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/for-each": {
    +      "version": "0.3.3",
    +      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
    +      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-callable": "^1.1.3"
    +      }
    +    },
    +    "node_modules/foreach": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
    +      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
    +      "dev": true
    +    },
    +    "node_modules/format": {
    +      "version": "0.2.2",
    +      "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
    +      "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.4.x"
    +      }
    +    },
    +    "node_modules/fresh": {
    +      "version": "0.5.2",
    +      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
    +      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/front-matter": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz",
    +      "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==",
    +      "dependencies": {
    +        "js-yaml": "^3.13.1"
    +      }
    +    },
    +    "node_modules/front-matter/node_modules/argparse": {
    +      "version": "1.0.10",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    +      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    +      "dependencies": {
    +        "sprintf-js": "~1.0.2"
    +      }
    +    },
    +    "node_modules/front-matter/node_modules/js-yaml": {
    +      "version": "3.14.1",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    +      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    +      "dependencies": {
    +        "argparse": "^1.0.7",
    +        "esprima": "^4.0.0"
    +      },
    +      "bin": {
    +        "js-yaml": "bin/js-yaml.js"
    +      }
    +    },
    +    "node_modules/fs-extra": {
    +      "version": "10.0.0",
    +      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
    +      "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.2.0",
    +        "jsonfile": "^6.0.1",
    +        "universalify": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/fs.realpath": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
    +      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
    +    },
    +    "node_modules/function-bind": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
    +      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
    +      "dev": true
    +    },
    +    "node_modules/functional-red-black-tree": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
    +      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
    +      "dev": true
    +    },
    +    "node_modules/gar": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz",
    +      "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==",
    +      "dev": true
    +    },
    +    "node_modules/gaxios": {
    +      "version": "4.3.2",
    +      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
    +      "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "abort-controller": "^3.0.0",
    +        "extend": "^3.0.2",
    +        "https-proxy-agent": "^5.0.0",
    +        "is-stream": "^2.0.0",
    +        "node-fetch": "^2.6.1"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/gemoji": {
    +      "version": "4.2.1",
    +      "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-4.2.1.tgz",
    +      "integrity": "sha512-V9lUpRSn+KQGavZx8Pk+6mxG3kaz21ae2kTCXuT36KaRPNgYU8eHtj/RcUCNFVvmwppsYYz3nnNS9lmcP5kTsg==",
    +      "dev": true
    +    },
    +    "node_modules/get-folder-size": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz",
    +      "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==",
    +      "dev": true,
    +      "dependencies": {
    +        "gar": "^1.0.4",
    +        "tiny-each-async": "2.0.3"
    +      },
    +      "bin": {
    +        "get-folder-size": "bin/get-folder-size"
    +      }
    +    },
    +    "node_modules/get-intrinsic": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
    +      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "function-bind": "^1.1.1",
    +        "has": "^1.0.3",
    +        "has-symbols": "^1.0.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/get-package-type": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
    +      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8.0.0"
    +      }
    +    },
    +    "node_modules/get-stream": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
    +      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
    +      "dev": true,
    +      "dependencies": {
    +        "pump": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/get-symbol-description": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
    +      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/glob": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
    +      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
    +      "dependencies": {
    +        "fs.realpath": "^1.0.0",
    +        "inflight": "^1.0.4",
    +        "inherits": "2",
    +        "minimatch": "^3.0.4",
    +        "once": "^1.3.0",
    +        "path-is-absolute": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": "*"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/glob-parent": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
    +      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-glob": "^4.0.3"
    +      },
    +      "engines": {
    +        "node": ">=10.13.0"
    +      }
    +    },
    +    "node_modules/global-dirs": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
    +      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
    +      "dev": true,
    +      "dependencies": {
    +        "ini": "2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/globals": {
    +      "version": "13.12.0",
    +      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
    +      "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-fest": "^0.20.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/globby": {
    +      "version": "11.0.4",
    +      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
    +      "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-union": "^2.1.0",
    +        "dir-glob": "^3.0.1",
    +        "fast-glob": "^3.1.1",
    +        "ignore": "^5.1.4",
    +        "merge2": "^1.3.0",
    +        "slash": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/globby/node_modules/ignore": {
    +      "version": "5.1.9",
    +      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
    +      "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 4"
    +      }
    +    },
    +    "node_modules/got": {
    +      "version": "9.6.0",
    +      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
    +      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sindresorhus/is": "^0.14.0",
    +        "@szmarczak/http-timer": "^1.1.2",
    +        "cacheable-request": "^6.0.0",
    +        "decompress-response": "^3.3.0",
    +        "duplexer3": "^0.1.4",
    +        "get-stream": "^4.1.0",
    +        "lowercase-keys": "^1.0.1",
    +        "mimic-response": "^1.0.1",
    +        "p-cancelable": "^1.0.0",
    +        "to-readable-stream": "^1.0.0",
    +        "url-parse-lax": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8.6"
    +      }
    +    },
    +    "node_modules/graceful-fs": {
    +      "version": "4.2.8",
    +      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
    +      "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
    +    },
    +    "node_modules/hard-rejection": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
    +      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/has": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
    +      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
    +      "dev": true,
    +      "dependencies": {
    +        "function-bind": "^1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/has-bigints": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
    +      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-dynamic-import": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz",
    +      "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-flag": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
    +      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/has-symbols": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
    +      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-tostringtag": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
    +      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-symbols": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-yarn": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
    +      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/highlight.js": {
    +      "version": "11.4.0",
    +      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.4.0.tgz",
    +      "integrity": "sha512-nawlpCBCSASs7EdvZOYOYVkJpGmAOKMYZgZtUqSRqodZE0GRVcFKwo1RcpeOemqh9hyttTdd5wDBwHkuSyUfnA==",
    +      "engines": {
    +        "node": ">=12.0.0"
    +      }
    +    },
    +    "node_modules/hosted-git-info": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
    +      "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
    +      "dev": true,
    +      "dependencies": {
    +        "lru-cache": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/htmlparser2": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
    +      "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
    +      "dev": true,
    +      "funding": [
    +        "https://github.com/fb55/htmlparser2?sponsor=1",
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/fb55"
    +        }
    +      ],
    +      "dependencies": {
    +        "domelementtype": "^2.0.1",
    +        "domhandler": "^4.2.2",
    +        "domutils": "^2.8.0",
    +        "entities": "^3.0.1"
    +      }
    +    },
    +    "node_modules/htmlparser2/node_modules/entities": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
    +      "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.12"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/entities?sponsor=1"
    +      }
    +    },
    +    "node_modules/http-cache-semantics": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
    +      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
    +      "dev": true
    +    },
    +    "node_modules/http-errors": {
    +      "version": "1.8.1",
    +      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
    +      "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
    +      "dev": true,
    +      "dependencies": {
    +        "depd": "~1.1.2",
    +        "inherits": "2.0.4",
    +        "setprototypeof": "1.2.0",
    +        "statuses": ">= 1.5.0 < 2",
    +        "toidentifier": "1.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/http-proxy": {
    +      "version": "1.18.1",
    +      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
    +      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "eventemitter3": "^4.0.0",
    +        "follow-redirects": "^1.0.0",
    +        "requires-port": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8.0.0"
    +      }
    +    },
    +    "node_modules/https-proxy-agent": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
    +      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
    +      "dev": true,
    +      "dependencies": {
    +        "agent-base": "6",
    +        "debug": "4"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/https-proxy-agent/node_modules/debug": {
    +      "version": "4.3.2",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    +      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/https-proxy-agent/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/iconv-lite": {
    +      "version": "0.4.24",
    +      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
    +      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
    +      "dev": true,
    +      "dependencies": {
    +        "safer-buffer": ">= 2.1.2 < 3"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/ieee754": {
    +      "version": "1.1.13",
    +      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
    +      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
    +      "dev": true
    +    },
    +    "node_modules/ignore": {
    +      "version": "4.0.6",
    +      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
    +      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 4"
    +      }
    +    },
    +    "node_modules/immediate": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
    +      "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
    +      "dev": true
    +    },
    +    "node_modules/import-fresh": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
    +      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
    +      "dev": true,
    +      "dependencies": {
    +        "parent-module": "^1.0.0",
    +        "resolve-from": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/import-lazy": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
    +      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/imurmurhash": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
    +      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.19"
    +      }
    +    },
    +    "node_modules/indent-string": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
    +      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/inflight": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
    +      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
    +      "dependencies": {
    +        "once": "^1.3.0",
    +        "wrappy": "1"
    +      }
    +    },
    +    "node_modules/inherits": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
    +      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    +    },
    +    "node_modules/ini": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
    +      "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/insync": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/insync/-/insync-2.1.1.tgz",
    +      "integrity": "sha1-IuJsYRITA8BvUdNaPM9tj8HpFMQ=",
    +      "dev": true
    +    },
    +    "node_modules/internal-slot": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
    +      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
    +      "dev": true,
    +      "dependencies": {
    +        "get-intrinsic": "^1.1.0",
    +        "has": "^1.0.3",
    +        "side-channel": "^1.0.4"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/is-alphabetical": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
    +      "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/is-alphanumerical": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
    +      "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-alphabetical": "^1.0.0",
    +        "is-decimal": "^1.0.0"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/is-arguments": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
    +      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-arrayish": {
    +      "version": "0.2.1",
    +      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
    +      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
    +      "dev": true
    +    },
    +    "node_modules/is-bigint": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
    +      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-bigints": "^1.0.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-boolean-object": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
    +      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-buffer": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
    +      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/is-callable": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
    +      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-ci": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
    +      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
    +      "dev": true,
    +      "dependencies": {
    +        "ci-info": "^2.0.0"
    +      },
    +      "bin": {
    +        "is-ci": "bin.js"
    +      }
    +    },
    +    "node_modules/is-core-module": {
    +      "version": "2.8.0",
    +      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
    +      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "has": "^1.0.3"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-date-object": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
    +      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-decimal": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
    +      "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/is-extglob": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
    +      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/is-fullwidth-code-point": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
    +      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-glob": {
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
    +      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-extglob": "^2.1.1"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/is-hexadecimal": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
    +      "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/is-installed-globally": {
    +      "version": "0.4.0",
    +      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
    +      "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "global-dirs": "^3.0.0",
    +        "is-path-inside": "^3.0.2"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/is-map": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
    +      "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-negative-zero": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
    +      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-npm": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
    +      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/is-number": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
    +      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.12.0"
    +      }
    +    },
    +    "node_modules/is-number-object": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
    +      "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-obj": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
    +      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-path-inside": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
    +      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-plain-obj": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
    +      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-regex": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
    +      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-set": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
    +      "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-shared-array-buffer": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
    +      "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-stream": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
    +      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/is-string": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
    +      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-symbol": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
    +      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-symbols": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-typed-array": {
    +      "version": "1.1.8",
    +      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
    +      "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
    +      "dev": true,
    +      "dependencies": {
    +        "available-typed-arrays": "^1.0.5",
    +        "call-bind": "^1.0.2",
    +        "es-abstract": "^1.18.5",
    +        "foreach": "^2.0.5",
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-typedarray": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
    +      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
    +      "dev": true
    +    },
    +    "node_modules/is-weakmap": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
    +      "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-weakref": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
    +      "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-weakset": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
    +      "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-yarn-global": {
    +      "version": "0.3.0",
    +      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
    +      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
    +      "dev": true
    +    },
    +    "node_modules/isarray": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
    +      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
    +      "dev": true
    +    },
    +    "node_modules/isexe": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
    +      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
    +      "dev": true
    +    },
    +    "node_modules/jmespath": {
    +      "version": "0.15.0",
    +      "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz",
    +      "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6.0"
    +      }
    +    },
    +    "node_modules/js-tokens": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
    +      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
    +      "dev": true
    +    },
    +    "node_modules/js-yaml": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    +      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    +      "dev": true,
    +      "dependencies": {
    +        "argparse": "^2.0.1"
    +      },
    +      "bin": {
    +        "js-yaml": "bin/js-yaml.js"
    +      }
    +    },
    +    "node_modules/json-buffer": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
    +      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
    +      "dev": true
    +    },
    +    "node_modules/json-parse-better-errors": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
    +      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
    +      "dev": true
    +    },
    +    "node_modules/json-parse-even-better-errors": {
    +      "version": "2.3.1",
    +      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
    +      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
    +      "dev": true
    +    },
    +    "node_modules/json-schema-traverse": {
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
    +      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
    +      "dev": true
    +    },
    +    "node_modules/json-stable-stringify-without-jsonify": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
    +      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
    +      "dev": true
    +    },
    +    "node_modules/json5": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
    +      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
    +      "dev": true,
    +      "dependencies": {
    +        "minimist": "^1.2.0"
    +      },
    +      "bin": {
    +        "json5": "lib/cli.js"
    +      }
    +    },
    +    "node_modules/jsonc": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz",
    +      "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==",
    +      "dev": true,
    +      "dependencies": {
    +        "fast-safe-stringify": "^2.0.6",
    +        "graceful-fs": "^4.1.15",
    +        "mkdirp": "^0.5.1",
    +        "parse-json": "^4.0.0",
    +        "strip-bom": "^4.0.0",
    +        "strip-json-comments": "^3.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/jsonexport": {
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/jsonexport/-/jsonexport-3.2.0.tgz",
    +      "integrity": "sha512-GbO9ugb0YTZatPd/hqCGR0FSwbr82H6OzG04yzdrG7XOe4QZ0jhQ+kOsB29zqkzoYJLmLxbbrFiuwbQu891XnQ==",
    +      "dev": true,
    +      "bin": {
    +        "jsonexport": "bin/jsonexport.js"
    +      }
    +    },
    +    "node_modules/jsonfile": {
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
    +      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "universalify": "^2.0.0"
    +      },
    +      "optionalDependencies": {
    +        "graceful-fs": "^4.1.6"
    +      }
    +    },
    +    "node_modules/jszip": {
    +      "version": "3.7.1",
    +      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
    +      "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
    +      "dev": true,
    +      "dependencies": {
    +        "lie": "~3.3.0",
    +        "pako": "~1.0.2",
    +        "readable-stream": "~2.3.6",
    +        "set-immediate-shim": "~1.0.1"
    +      }
    +    },
    +    "node_modules/jszip/node_modules/readable-stream": {
    +      "version": "2.3.7",
    +      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
    +      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
    +      "dev": true,
    +      "dependencies": {
    +        "core-util-is": "~1.0.0",
    +        "inherits": "~2.0.3",
    +        "isarray": "~1.0.0",
    +        "process-nextick-args": "~2.0.0",
    +        "safe-buffer": "~5.1.1",
    +        "string_decoder": "~1.1.1",
    +        "util-deprecate": "~1.0.1"
    +      }
    +    },
    +    "node_modules/jszip/node_modules/safe-buffer": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
    +      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
    +      "dev": true
    +    },
    +    "node_modules/jszip/node_modules/string_decoder": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
    +      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "safe-buffer": "~5.1.0"
    +      }
    +    },
    +    "node_modules/junit-report-builder": {
    +      "version": "1.3.3",
    +      "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-1.3.3.tgz",
    +      "integrity": "sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw==",
    +      "dev": true,
    +      "dependencies": {
    +        "date-format": "0.0.2",
    +        "lodash": "^4.17.15",
    +        "mkdirp": "^0.5.0",
    +        "xmlbuilder": "^10.0.0"
    +      }
    +    },
    +    "node_modules/keyv": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
    +      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
    +      "dev": true,
    +      "dependencies": {
    +        "json-buffer": "3.0.0"
    +      }
    +    },
    +    "node_modules/kind-of": {
    +      "version": "6.0.3",
    +      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
    +      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/lambda-runtimes": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/lambda-runtimes/-/lambda-runtimes-1.1.1.tgz",
    +      "integrity": "sha512-kfsbICjnpI3HzKm+UwgmUemmsBreZhhVnaJtl+dTzilVx7f9reKEtegcSTaBVzjGHJfXv4jsQXu1v9y4KDliHg==",
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/latest-version": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
    +      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
    +      "dev": true,
    +      "dependencies": {
    +        "package-json": "^6.3.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/lazy": {
    +      "version": "1.0.11",
    +      "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz",
    +      "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.2.0"
    +      }
    +    },
    +    "node_modules/level-codec": {
    +      "version": "9.0.2",
    +      "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz",
    +      "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "buffer": "^5.6.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/level-codec/node_modules/buffer": {
    +      "version": "5.7.1",
    +      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    +      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "dependencies": {
    +        "base64-js": "^1.3.1",
    +        "ieee754": "^1.1.13"
    +      }
    +    },
    +    "node_modules/level-concat-iterator": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz",
    +      "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/level-errors": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz",
    +      "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==",
    +      "dev": true,
    +      "dependencies": {
    +        "errno": "~0.1.1"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/level-iterator-stream": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz",
    +      "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "inherits": "^2.0.4",
    +        "readable-stream": "^3.4.0",
    +        "xtend": "^4.0.2"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/level-option-wrap": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz",
    +      "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=",
    +      "dev": true,
    +      "dependencies": {
    +        "defined": "~0.0.0"
    +      }
    +    },
    +    "node_modules/level-supports": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
    +      "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
    +      "dev": true,
    +      "dependencies": {
    +        "xtend": "^4.0.2"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/leveldown": {
    +      "version": "5.6.0",
    +      "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz",
    +      "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==",
    +      "dev": true,
    +      "hasInstallScript": true,
    +      "optional": true,
    +      "dependencies": {
    +        "abstract-leveldown": "~6.2.1",
    +        "napi-macros": "~2.0.0",
    +        "node-gyp-build": "~4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8.6.0"
    +      }
    +    },
    +    "node_modules/levelup": {
    +      "version": "4.4.0",
    +      "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz",
    +      "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "deferred-leveldown": "~5.3.0",
    +        "level-errors": "~2.0.0",
    +        "level-iterator-stream": "~4.0.0",
    +        "level-supports": "~1.0.0",
    +        "xtend": "~4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/levn": {
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
    +      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "prelude-ls": "^1.2.1",
    +        "type-check": "~0.4.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/lie": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
    +      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "immediate": "~3.0.5"
    +      }
    +    },
    +    "node_modules/lie/node_modules/immediate": {
    +      "version": "3.0.6",
    +      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
    +      "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
    +      "dev": true
    +    },
    +    "node_modules/lines-and-columns": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
    +      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
    +      "dev": true
    +    },
    +    "node_modules/linkify-it": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
    +      "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
    +      "dependencies": {
    +        "uc.micro": "^1.0.1"
    +      }
    +    },
    +    "node_modules/linkinator": {
    +      "version": "2.16.2",
    +      "resolved": "https://registry.npmjs.org/linkinator/-/linkinator-2.16.2.tgz",
    +      "integrity": "sha512-5tHSz6gMN0z25+Pk4lZnU0Edr1lJLNuk+MCfQa2NxF4f1rfKS8Lo3JEwxTciVzwVHHdBpydAgmWYOgylNlwyDQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "chalk": "^4.0.0",
    +        "escape-html": "^1.0.3",
    +        "gaxios": "^4.0.0",
    +        "glob": "^7.1.6",
    +        "htmlparser2": "^7.1.2",
    +        "jsonexport": "^3.0.0",
    +        "marked": "^2.0.0",
    +        "meow": "^9.0.0",
    +        "mime": "^3.0.0",
    +        "server-destroy": "^1.0.1",
    +        "update-notifier": "^5.0.0"
    +      },
    +      "bin": {
    +        "linkinator": "build/src/cli.js"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/linkinator/node_modules/mime": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
    +      "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
    +      "dev": true,
    +      "bin": {
    +        "mime": "cli.js"
    +      },
    +      "engines": {
    +        "node": ">=10.0.0"
    +      }
    +    },
    +    "node_modules/locate-path": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
    +      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^2.0.0",
    +        "path-exists": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/lock": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz",
    +      "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=",
    +      "dev": true
    +    },
    +    "node_modules/lodash": {
    +      "version": "4.17.21",
    +      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
    +      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
    +      "dev": true
    +    },
    +    "node_modules/lodash.camelcase": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
    +      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
    +      "dev": true
    +    },
    +    "node_modules/lodash.get": {
    +      "version": "4.4.2",
    +      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
    +      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
    +      "dev": true
    +    },
    +    "node_modules/lodash.includes": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
    +      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=",
    +      "dev": true
    +    },
    +    "node_modules/lodash.kebabcase": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
    +      "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=",
    +      "dev": true
    +    },
    +    "node_modules/lodash.merge": {
    +      "version": "4.6.2",
    +      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
    +      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
    +      "dev": true
    +    },
    +    "node_modules/lodash.padend": {
    +      "version": "4.6.1",
    +      "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
    +      "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
    +      "dev": true
    +    },
    +    "node_modules/lodash.snakecase": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
    +      "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=",
    +      "dev": true
    +    },
    +    "node_modules/lodash.upperfirst": {
    +      "version": "4.3.1",
    +      "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
    +      "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=",
    +      "dev": true
    +    },
    +    "node_modules/lodash.zip": {
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
    +      "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=",
    +      "dev": true
    +    },
    +    "node_modules/longest-streak": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
    +      "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/lowercase-keys": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
    +      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/lru-cache": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
    +      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
    +      "dev": true,
    +      "dependencies": {
    +        "yallist": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/ltgt": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
    +      "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=",
    +      "dev": true
    +    },
    +    "node_modules/make-dir": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
    +      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
    +      "dev": true,
    +      "dependencies": {
    +        "semver": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/make-dir/node_modules/semver": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    +      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/map-obj": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
    +      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/markdown-it": {
    +      "version": "12.3.1",
    +      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.1.tgz",
    +      "integrity": "sha512-xu6ZyQc/W1mWRwBOZT5ePVVn77MhHYkWwiAMgy/oBwUwSD2fS5xND3oIN44RCqVMgpNbhKtzZs9B75mC7FHwTQ==",
    +      "dependencies": {
    +        "argparse": "^2.0.1",
    +        "entities": "~2.1.0",
    +        "linkify-it": "^3.0.1",
    +        "mdurl": "^1.0.1",
    +        "uc.micro": "^1.0.5"
    +      },
    +      "bin": {
    +        "markdown-it": "bin/markdown-it.js"
    +      }
    +    },
    +    "node_modules/markdown-it-external-anchor": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/markdown-it-external-anchor/-/markdown-it-external-anchor-1.0.0.tgz",
    +      "integrity": "sha512-d6Jb+kLciiv7uueM8q46k6szwr+B8QYg5ppiHVvfaS6hTx1KHpKwYDivmPAcNJYx0wUPEmRre9RgEnM5oHcdMw=="
    +    },
    +    "node_modules/markdown-it-toc-and-anchor": {
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz",
    +      "integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==",
    +      "dependencies": {
    +        "clone": "^2.1.0",
    +        "uslug": "^1.0.4"
    +      }
    +    },
    +    "node_modules/marked": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
    +      "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==",
    +      "dev": true,
    +      "bin": {
    +        "marked": "bin/marked"
    +      },
    +      "engines": {
    +        "node": ">= 10"
    +      }
    +    },
    +    "node_modules/mdast-util-from-markdown": {
    +      "version": "0.8.5",
    +      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
    +      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/mdast": "^3.0.0",
    +        "mdast-util-to-string": "^2.0.0",
    +        "micromark": "~2.11.0",
    +        "parse-entities": "^2.0.0",
    +        "unist-util-stringify-position": "^2.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/mdast-util-frontmatter": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz",
    +      "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "micromark-extension-frontmatter": "^0.2.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/mdast-util-to-markdown": {
    +      "version": "0.6.5",
    +      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
    +      "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/unist": "^2.0.0",
    +        "longest-streak": "^2.0.0",
    +        "mdast-util-to-string": "^2.0.0",
    +        "parse-entities": "^2.0.0",
    +        "repeat-string": "^1.0.0",
    +        "zwitch": "^1.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/mdast-util-to-nlcst": {
    +      "version": "3.2.3",
    +      "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz",
    +      "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==",
    +      "dev": true,
    +      "dependencies": {
    +        "nlcst-to-string": "^2.0.0",
    +        "repeat-string": "^1.5.2",
    +        "unist-util-position": "^3.0.0",
    +        "vfile-location": "^2.0.0"
    +      }
    +    },
    +    "node_modules/mdast-util-to-string": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
    +      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
    +      "dev": true,
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/mdurl": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
    +      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
    +    },
    +    "node_modules/media-typer": {
    +      "version": "0.3.0",
    +      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
    +      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/memdown": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz",
    +      "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==",
    +      "dev": true,
    +      "dependencies": {
    +        "abstract-leveldown": "~6.2.1",
    +        "functional-red-black-tree": "~1.0.1",
    +        "immediate": "~3.2.3",
    +        "inherits": "~2.0.1",
    +        "ltgt": "~2.2.0",
    +        "safe-buffer": "~5.2.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/memdown/node_modules/immediate": {
    +      "version": "3.2.3",
    +      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz",
    +      "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=",
    +      "dev": true
    +    },
    +    "node_modules/meow": {
    +      "version": "9.0.0",
    +      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
    +      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/minimist": "^1.2.0",
    +        "camelcase-keys": "^6.2.2",
    +        "decamelize": "^1.2.0",
    +        "decamelize-keys": "^1.1.0",
    +        "hard-rejection": "^2.1.0",
    +        "minimist-options": "4.1.0",
    +        "normalize-package-data": "^3.0.0",
    +        "read-pkg-up": "^7.0.1",
    +        "redent": "^3.0.0",
    +        "trim-newlines": "^3.0.0",
    +        "type-fest": "^0.18.0",
    +        "yargs-parser": "^20.2.3"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/meow/node_modules/type-fest": {
    +      "version": "0.18.1",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
    +      "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/merge2": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
    +      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/methods": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
    +      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/micromark": {
    +      "version": "2.11.4",
    +      "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
    +      "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "GitHub Sponsors",
    +          "url": "https://github.com/sponsors/unifiedjs"
    +        },
    +        {
    +          "type": "OpenCollective",
    +          "url": "https://opencollective.com/unified"
    +        }
    +      ],
    +      "dependencies": {
    +        "debug": "^4.0.0",
    +        "parse-entities": "^2.0.0"
    +      }
    +    },
    +    "node_modules/micromark-extension-frontmatter": {
    +      "version": "0.2.2",
    +      "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz",
    +      "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==",
    +      "dev": true,
    +      "dependencies": {
    +        "fault": "^1.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/micromark/node_modules/debug": {
    +      "version": "4.3.2",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    +      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/micromark/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/micromatch": {
    +      "version": "4.0.4",
    +      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
    +      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "braces": "^3.0.1",
    +        "picomatch": "^2.2.3"
    +      },
    +      "engines": {
    +        "node": ">=8.6"
    +      }
    +    },
    +    "node_modules/mime": {
    +      "version": "1.6.0",
    +      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
    +      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
    +      "dev": true,
    +      "bin": {
    +        "mime": "cli.js"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/mime-db": {
    +      "version": "1.51.0",
    +      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
    +      "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/mime-types": {
    +      "version": "2.1.34",
    +      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
    +      "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
    +      "dependencies": {
    +        "mime-db": "1.51.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/mimic-fn": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
    +      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/mimic-response": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
    +      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/min-indent": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
    +      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/minimatch": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
    +      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
    +      "dependencies": {
    +        "brace-expansion": "^1.1.7"
    +      },
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/minimist": {
    +      "version": "1.2.5",
    +      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
    +      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
    +      "dev": true
    +    },
    +    "node_modules/minimist-options": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
    +      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
    +      "dev": true,
    +      "dependencies": {
    +        "arrify": "^1.0.1",
    +        "is-plain-obj": "^1.1.0",
    +        "kind-of": "^6.0.3"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/minimist-options/node_modules/is-plain-obj": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    +      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/minipass": {
    +      "version": "3.1.5",
    +      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
    +      "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
    +      "dev": true,
    +      "dependencies": {
    +        "yallist": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/mkdirp": {
    +      "version": "0.5.5",
    +      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
    +      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "minimist": "^1.2.5"
    +      },
    +      "bin": {
    +        "mkdirp": "bin/cmd.js"
    +      }
    +    },
    +    "node_modules/ms": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    +      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "dev": true
    +    },
    +    "node_modules/napi-macros": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz",
    +      "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==",
    +      "dev": true,
    +      "optional": true
    +    },
    +    "node_modules/natural-compare": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
    +      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
    +      "dev": true
    +    },
    +    "node_modules/nlcst-is-literal": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/nlcst-is-literal/-/nlcst-is-literal-1.2.2.tgz",
    +      "integrity": "sha512-R+1OJEmRl3ZOp9d8PbiRxGpnvmpi3jU+lzSqCJoLeogdEh0FYDRH1aC223qUbaKffxNTJkEfeDOeQfziw749yA==",
    +      "dev": true,
    +      "dependencies": {
    +        "nlcst-to-string": "^2.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/nlcst-to-string": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz",
    +      "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==",
    +      "dev": true,
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/node-fetch": {
    +      "version": "2.6.6",
    +      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
    +      "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
    +      "dev": true,
    +      "dependencies": {
    +        "whatwg-url": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": "4.x || >=6.0.0"
    +      }
    +    },
    +    "node_modules/node-gyp-build": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz",
    +      "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==",
    +      "dev": true,
    +      "optional": true,
    +      "bin": {
    +        "node-gyp-build": "bin.js",
    +        "node-gyp-build-optional": "optional.js",
    +        "node-gyp-build-test": "build-test.js"
    +      }
    +    },
    +    "node_modules/node-watch": {
    +      "version": "0.7.2",
    +      "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.2.tgz",
    +      "integrity": "sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/node-webtokens": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/node-webtokens/-/node-webtokens-1.0.4.tgz",
    +      "integrity": "sha512-Sla56CeSLWvPbwud2kogqf5edQtKNXZBtXDDpmOzAgNZjwETbK/Am6PXfs54iZPLBm8K8amZ9XWaCQwGqZmKyQ==",
    +      "engines": {
    +        "node": ">=6.6.0"
    +      }
    +    },
    +    "node_modules/normalize-package-data": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
    +      "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
    +      "dev": true,
    +      "dependencies": {
    +        "hosted-git-info": "^4.0.1",
    +        "is-core-module": "^2.5.0",
    +        "semver": "^7.3.4",
    +        "validate-npm-package-license": "^3.0.1"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/normalize-url": {
    +      "version": "4.5.1",
    +      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
    +      "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/nspell": {
    +      "version": "2.1.5",
    +      "resolved": "https://registry.npmjs.org/nspell/-/nspell-2.1.5.tgz",
    +      "integrity": "sha512-PSStyugKMiD9mHmqI/CR5xXrSIGejUXPlo88FBRq5Og1kO5QwQ5Ilu8D8O5I/SHpoS+mibpw6uKA8rd3vXd2Sg==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-buffer": "^2.0.0"
    +      }
    +    },
    +    "node_modules/number-to-words": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/number-to-words/-/number-to-words-1.2.4.tgz",
    +      "integrity": "sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw==",
    +      "dev": true
    +    },
    +    "node_modules/object-inspect": {
    +      "version": "1.12.0",
    +      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
    +      "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/object-is": {
    +      "version": "1.1.5",
    +      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
    +      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/object-keys": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
    +      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/object.assign": {
    +      "version": "4.1.2",
    +      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
    +      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.0",
    +        "define-properties": "^1.1.3",
    +        "has-symbols": "^1.0.1",
    +        "object-keys": "^1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/object.values": {
    +      "version": "1.1.5",
    +      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
    +      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/on-finished": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
    +      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
    +      "dev": true,
    +      "dependencies": {
    +        "ee-first": "1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/once": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
    +      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
    +      "dependencies": {
    +        "wrappy": "1"
    +      }
    +    },
    +    "node_modules/onetime": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
    +      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
    +      "dependencies": {
    +        "mimic-fn": "^2.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/optionator": {
    +      "version": "0.9.1",
    +      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
    +      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
    +      "dev": true,
    +      "dependencies": {
    +        "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"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/ospath": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
    +      "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=",
    +      "dev": true
    +    },
    +    "node_modules/p-cancelable": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
    +      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/p-limit": {
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
    +      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-try": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/p-locate": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
    +      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^1.1.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/p-try": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
    +      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/package-json": {
    +      "version": "6.5.0",
    +      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
    +      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "got": "^9.6.0",
    +        "registry-auth-token": "^4.0.0",
    +        "registry-url": "^5.0.0",
    +        "semver": "^6.2.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/package-json/node_modules/semver": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    +      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/pako": {
    +      "version": "1.0.11",
    +      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
    +      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
    +      "dev": true
    +    },
    +    "node_modules/parent-module": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
    +      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
    +      "dev": true,
    +      "dependencies": {
    +        "callsites": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/parse-entities": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
    +      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "character-entities": "^1.0.0",
    +        "character-entities-legacy": "^1.0.0",
    +        "character-reference-invalid": "^1.0.0",
    +        "is-alphanumerical": "^1.0.0",
    +        "is-decimal": "^1.0.0",
    +        "is-hexadecimal": "^1.0.0"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/parse-json": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
    +      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
    +      "dev": true,
    +      "dependencies": {
    +        "error-ex": "^1.3.1",
    +        "json-parse-better-errors": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/parse-latin": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz",
    +      "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==",
    +      "dev": true,
    +      "dependencies": {
    +        "nlcst-to-string": "^2.0.0",
    +        "unist-util-modify-children": "^2.0.0",
    +        "unist-util-visit-children": "^1.0.0"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/parseurl": {
    +      "version": "1.3.3",
    +      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
    +      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/path-exists": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
    +      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/path-is-absolute": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
    +      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/path-key": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
    +      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/path-parse": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
    +      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
    +      "dev": true
    +    },
    +    "node_modules/path-sort": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/path-sort/-/path-sort-0.1.0.tgz",
    +      "integrity": "sha1-ywF11Oy/paGP5nTMbXIL/hXguAU="
    +    },
    +    "node_modules/path-to-regexp": {
    +      "version": "0.1.7",
    +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
    +      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
    +      "dev": true
    +    },
    +    "node_modules/path-type": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
    +      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/picocolors": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
    +      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
    +      "dev": true
    +    },
    +    "node_modules/picomatch": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
    +      "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8.6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/jonschlinkert"
    +      }
    +    },
    +    "node_modules/pkg-dir": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
    +      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
    +      "dev": true,
    +      "dependencies": {
    +        "find-up": "^2.1.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/prelude-ls": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
    +      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/prepend-http": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
    +      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/process-nextick-args": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
    +      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
    +      "dev": true
    +    },
    +    "node_modules/progress": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
    +      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.4.0"
    +      }
    +    },
    +    "node_modules/prr": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
    +      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
    +      "dev": true
    +    },
    +    "node_modules/pump": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
    +      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
    +      "dev": true,
    +      "dependencies": {
    +        "end-of-stream": "^1.1.0",
    +        "once": "^1.3.1"
    +      }
    +    },
    +    "node_modules/punycode": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
    +      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/pupa": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
    +      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
    +      "dev": true,
    +      "dependencies": {
    +        "escape-goat": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/qs": {
    +      "version": "6.9.6",
    +      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz",
    +      "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/querystring": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
    +      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
    +      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.4.x"
    +      }
    +    },
    +    "node_modules/queue-microtask": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
    +      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/quick-lru": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
    +      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/quotation": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/quotation/-/quotation-1.1.3.tgz",
    +      "integrity": "sha512-45gUgmX/RtQOQV1kwM06boP49OYXcKCPrYwdmAvs5YqkpiobhNKKwo524JM6Ma0ko3oN9tXNcWs9+ABq3Ry7YA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/random-bytes": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
    +      "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=",
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/range-parser": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
    +      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/raw-body": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz",
    +      "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "bytes": "3.1.1",
    +        "http-errors": "1.8.1",
    +        "iconv-lite": "0.4.24",
    +        "unpipe": "1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/rc": {
    +      "version": "1.2.8",
    +      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
    +      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
    +      "dev": true,
    +      "dependencies": {
    +        "deep-extend": "^0.6.0",
    +        "ini": "~1.3.0",
    +        "minimist": "^1.2.0",
    +        "strip-json-comments": "~2.0.1"
    +      },
    +      "bin": {
    +        "rc": "cli.js"
    +      }
    +    },
    +    "node_modules/rc/node_modules/ini": {
    +      "version": "1.3.8",
    +      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
    +      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
    +      "dev": true
    +    },
    +    "node_modules/rc/node_modules/strip-json-comments": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
    +      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/reachdown": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/reachdown/-/reachdown-1.1.0.tgz",
    +      "integrity": "sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/read-pkg": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
    +      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/normalize-package-data": "^2.4.0",
    +        "normalize-package-data": "^2.5.0",
    +        "parse-json": "^5.0.0",
    +        "type-fest": "^0.6.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-pkg-up": {
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
    +      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
    +      "dev": true,
    +      "dependencies": {
    +        "find-up": "^4.1.0",
    +        "read-pkg": "^5.2.0",
    +        "type-fest": "^0.8.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/read-pkg-up/node_modules/find-up": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
    +      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^5.0.0",
    +        "path-exists": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-pkg-up/node_modules/locate-path": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
    +      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-pkg-up/node_modules/p-limit": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    +      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-try": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/read-pkg-up/node_modules/p-locate": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
    +      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^2.2.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-pkg-up/node_modules/p-try": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
    +      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/read-pkg-up/node_modules/path-exists": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
    +      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-pkg-up/node_modules/type-fest": {
    +      "version": "0.8.1",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
    +      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-pkg/node_modules/hosted-git-info": {
    +      "version": "2.8.9",
    +      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
    +      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
    +      "dev": true
    +    },
    +    "node_modules/read-pkg/node_modules/normalize-package-data": {
    +      "version": "2.5.0",
    +      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
    +      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
    +      "dev": true,
    +      "dependencies": {
    +        "hosted-git-info": "^2.1.4",
    +        "resolve": "^1.10.0",
    +        "semver": "2 || 3 || 4 || 5",
    +        "validate-npm-package-license": "^3.0.1"
    +      }
    +    },
    +    "node_modules/read-pkg/node_modules/parse-json": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
    +      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/code-frame": "^7.0.0",
    +        "error-ex": "^1.3.1",
    +        "json-parse-even-better-errors": "^2.3.0",
    +        "lines-and-columns": "^1.1.6"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/read-pkg/node_modules/semver": {
    +      "version": "5.7.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
    +      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver"
    +      }
    +    },
    +    "node_modules/read-pkg/node_modules/type-fest": {
    +      "version": "0.6.0",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
    +      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/readable-stream": {
    +      "version": "3.6.0",
    +      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
    +      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
    +      "dev": true,
    +      "dependencies": {
    +        "inherits": "^2.0.3",
    +        "string_decoder": "^1.1.1",
    +        "util-deprecate": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/redent": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
    +      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
    +      "dev": true,
    +      "dependencies": {
    +        "indent-string": "^4.0.0",
    +        "strip-indent": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/reduce-flatten": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
    +      "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/regexp.prototype.flags": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
    +      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/regexpp": {
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
    +      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/mysticatea"
    +      }
    +    },
    +    "node_modules/registry-auth-token": {
    +      "version": "4.2.1",
    +      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
    +      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
    +      "dev": true,
    +      "dependencies": {
    +        "rc": "^1.2.8"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/registry-url": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
    +      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
    +      "dev": true,
    +      "dependencies": {
    +        "rc": "^1.2.8"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/remark": {
    +      "version": "13.0.0",
    +      "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
    +      "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
    +      "dev": true,
    +      "dependencies": {
    +        "remark-parse": "^9.0.0",
    +        "remark-stringify": "^9.0.0",
    +        "unified": "^9.1.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/remark-frontmatter": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz",
    +      "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==",
    +      "dev": true,
    +      "dependencies": {
    +        "mdast-util-frontmatter": "^0.2.0",
    +        "micromark-extension-frontmatter": "^0.2.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/remark-gemoji-to-emoji": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/remark-gemoji-to-emoji/-/remark-gemoji-to-emoji-1.1.0.tgz",
    +      "integrity": "sha1-Pc0KiBGgyBu2NROsCzbyJYpVMPU=",
    +      "dev": true,
    +      "dependencies": {
    +        "gemoji": "^4.0.0",
    +        "unist-util-visit": "^1.0.0"
    +      }
    +    },
    +    "node_modules/remark-parse": {
    +      "version": "9.0.0",
    +      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
    +      "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
    +      "dev": true,
    +      "dependencies": {
    +        "mdast-util-from-markdown": "^0.8.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/remark-retext": {
    +      "version": "3.1.3",
    +      "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz",
    +      "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==",
    +      "dev": true,
    +      "dependencies": {
    +        "mdast-util-to-nlcst": "^3.2.0"
    +      }
    +    },
    +    "node_modules/remark-stringify": {
    +      "version": "9.0.1",
    +      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
    +      "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
    +      "dev": true,
    +      "dependencies": {
    +        "mdast-util-to-markdown": "^0.6.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/repeat-string": {
    +      "version": "1.6.1",
    +      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
    +      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10"
    +      }
    +    },
    +    "node_modules/replace-ext": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
    +      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.10"
    +      }
    +    },
    +    "node_modules/req-all": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/req-all/-/req-all-0.1.0.tgz",
    +      "integrity": "sha1-EwBR4qzligLqy/ydRIV3pzapJzo=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/requires-port": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
    +      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
    +      "dev": true
    +    },
    +    "node_modules/resolve": {
    +      "version": "1.20.0",
    +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
    +      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-core-module": "^2.2.0",
    +        "path-parse": "^1.0.6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/resolve-from": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
    +      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/responselike": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
    +      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
    +      "dev": true,
    +      "dependencies": {
    +        "lowercase-keys": "^1.0.0"
    +      }
    +    },
    +    "node_modules/restore-cursor": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
    +      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
    +      "dependencies": {
    +        "onetime": "^5.1.0",
    +        "signal-exit": "^3.0.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/resumer": {
    +      "version": "0.0.0",
    +      "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
    +      "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
    +      "dev": true,
    +      "dependencies": {
    +        "through": "~2.3.4"
    +      }
    +    },
    +    "node_modules/retext": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/retext/-/retext-5.0.0.tgz",
    +      "integrity": "sha1-XZAYxKZ31hA8FCNi129Q6x05i/Y=",
    +      "dev": true,
    +      "dependencies": {
    +        "retext-latin": "^2.0.0",
    +        "retext-stringify": "^2.0.0",
    +        "unified": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.11.0"
    +      }
    +    },
    +    "node_modules/retext-indefinite-article": {
    +      "version": "1.1.7",
    +      "resolved": "https://registry.npmjs.org/retext-indefinite-article/-/retext-indefinite-article-1.1.7.tgz",
    +      "integrity": "sha512-pqvEfEHL8uoeonbEjk8+d/hmyA3ozIeNTl4t3uurMcBpoIqN3+nbuMCFQrfDy2wjaKZ40KsLmEi+Zjv7m1ejLQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "format": "^0.2.2",
    +        "nlcst-to-string": "^2.0.0",
    +        "number-to-words": "^1.2.3",
    +        "unist-util-is": "^3.0.0",
    +        "unist-util-visit": "^1.1.0"
    +      }
    +    },
    +    "node_modules/retext-latin": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz",
    +      "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==",
    +      "dev": true,
    +      "dependencies": {
    +        "parse-latin": "^4.0.0",
    +        "unherit": "^1.0.4"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/retext-repeated-words": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/retext-repeated-words/-/retext-repeated-words-1.2.3.tgz",
    +      "integrity": "sha512-s51ybhXsHvpHpM44y9hayqcIDMo9g5QBZoOpPUosX3CfobZbgH7CZHbME8TOEcduR7OqGtNZ8JLKVFwi9QAKqA==",
    +      "dev": true,
    +      "dependencies": {
    +        "nlcst-to-string": "^2.0.0",
    +        "unist-util-is": "^3.0.0",
    +        "unist-util-visit": "^1.1.0"
    +      }
    +    },
    +    "node_modules/retext-spell": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/retext-spell/-/retext-spell-2.4.1.tgz",
    +      "integrity": "sha512-l2C37Sz+JMLgUJHqqNA2bV3Qqh7V6zWT3fCi8MtsZn2PoanDh57Tz2NW/DJpoEIsK9mV7o2EMvQmIMt5cgcgAg==",
    +      "dev": true,
    +      "dependencies": {
    +        "lodash.includes": "^4.2.0",
    +        "nlcst-is-literal": "^1.0.0",
    +        "nlcst-to-string": "^2.0.0",
    +        "nspell": "^2.0.0",
    +        "quotation": "^1.1.0",
    +        "unist-util-visit": "^1.0.0"
    +      }
    +    },
    +    "node_modules/retext-stringify": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz",
    +      "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==",
    +      "dev": true,
    +      "dependencies": {
    +        "nlcst-to-string": "^2.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/retext-syntax-mentions": {
    +      "version": "1.1.6",
    +      "resolved": "https://registry.npmjs.org/retext-syntax-mentions/-/retext-syntax-mentions-1.1.6.tgz",
    +      "integrity": "sha512-e6+Kh3dhzdBn0mHeiiKGUJMMqKTC7O2t+blKZWR1VeP0Kbm6CU4D1p5r+eH24GNCWRnqv3NbDk7RbdALqPLTeQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "nlcst-to-string": "^2.0.0",
    +        "unist-util-position": "^3.0.0",
    +        "unist-util-visit": "^1.1.0"
    +      }
    +    },
    +    "node_modules/retext-syntax-urls": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/retext-syntax-urls/-/retext-syntax-urls-1.0.2.tgz",
    +      "integrity": "sha512-Ud7i50IEP33OK9g5xCBIKh/DjoEdZi6sRJqnWDW3Wxt4B48llgfSbGLgiLeXZvJD923mOf7EAoLt/WjundXmwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "nlcst-to-string": "^2.0.0",
    +        "unist-util-is": "^3.0.0",
    +        "unist-util-modify-children": "^1.1.1",
    +        "unist-util-position": "^3.0.0"
    +      }
    +    },
    +    "node_modules/retext-syntax-urls/node_modules/unist-util-modify-children": {
    +      "version": "1.1.6",
    +      "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz",
    +      "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-iterate": "^1.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/retext/node_modules/is-buffer": {
    +      "version": "1.1.6",
    +      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
    +      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
    +      "dev": true
    +    },
    +    "node_modules/retext/node_modules/is-plain-obj": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    +      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/retext/node_modules/unified": {
    +      "version": "6.2.0",
    +      "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
    +      "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
    +      "dev": true,
    +      "dependencies": {
    +        "bail": "^1.0.0",
    +        "extend": "^3.0.0",
    +        "is-plain-obj": "^1.1.0",
    +        "trough": "^1.0.0",
    +        "vfile": "^2.0.0",
    +        "x-is-string": "^0.1.0"
    +      }
    +    },
    +    "node_modules/retext/node_modules/unist-util-stringify-position": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    +      "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    +      "dev": true
    +    },
    +    "node_modules/retext/node_modules/vfile": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
    +      "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-buffer": "^1.1.4",
    +        "replace-ext": "1.0.0",
    +        "unist-util-stringify-position": "^1.0.0",
    +        "vfile-message": "^1.0.0"
    +      }
    +    },
    +    "node_modules/reusify": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
    +      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
    +      "dev": true,
    +      "engines": {
    +        "iojs": ">=1.0.0",
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/rimraf": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
    +      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
    +      "dev": true,
    +      "dependencies": {
    +        "glob": "^7.1.3"
    +      },
    +      "bin": {
    +        "rimraf": "bin.js"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/rndm": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz",
    +      "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w="
    +    },
    +    "node_modules/router": {
    +      "version": "1.3.6",
    +      "resolved": "https://registry.npmjs.org/router/-/router-1.3.6.tgz",
    +      "integrity": "sha512-gsjhou+LFApzkIP8VDrouG6Z4pqkeF11n3o5orlwPPvPTl0x7c+dbF71itKOhDoFHygmc3N3uqm55Uq/gIDUwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-flatten": "3.0.0",
    +        "debug": "2.6.9",
    +        "methods": "~1.1.2",
    +        "parseurl": "~1.3.3",
    +        "path-to-regexp": "0.1.7",
    +        "setprototypeof": "1.2.0",
    +        "utils-merge": "1.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/run-parallel": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
    +      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "dependencies": {
    +        "queue-microtask": "^1.2.2"
    +      }
    +    },
    +    "node_modules/run-series": {
    +      "version": "1.1.9",
    +      "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz",
    +      "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==",
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/run-waterfall": {
    +      "version": "1.1.7",
    +      "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz",
    +      "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==",
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/safe-buffer": {
    +      "version": "5.2.1",
    +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
    +      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/safer-buffer": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
    +      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
    +      "dev": true
    +    },
    +    "node_modules/sax": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
    +      "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=",
    +      "dev": true
    +    },
    +    "node_modules/semver": {
    +      "version": "7.3.5",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    +      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "lru-cache": "^6.0.0"
    +      },
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/semver-diff": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
    +      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
    +      "dev": true,
    +      "dependencies": {
    +        "semver": "^6.3.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/semver-diff/node_modules/semver": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    +      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/send": {
    +      "version": "0.17.2",
    +      "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
    +      "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "2.6.9",
    +        "depd": "~1.1.2",
    +        "destroy": "~1.0.4",
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "etag": "~1.8.1",
    +        "fresh": "0.5.2",
    +        "http-errors": "1.8.1",
    +        "mime": "1.6.0",
    +        "ms": "2.1.3",
    +        "on-finished": "~2.3.0",
    +        "range-parser": "~1.2.1",
    +        "statuses": "~1.5.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/send/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/server-destroy": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
    +      "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
    +      "dev": true
    +    },
    +    "node_modules/set-immediate-shim": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
    +      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/setprototypeof": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
    +      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
    +      "dev": true
    +    },
    +    "node_modules/sha": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz",
    +      "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==",
    +      "dependencies": {
    +        "graceful-fs": "^4.1.2"
    +      }
    +    },
    +    "node_modules/shebang-command": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
    +      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
    +      "dev": true,
    +      "dependencies": {
    +        "shebang-regex": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/shebang-regex": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
    +      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/side-channel": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
    +      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.0",
    +        "get-intrinsic": "^1.0.2",
    +        "object-inspect": "^1.9.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/signal-exit": {
    +      "version": "3.0.5",
    +      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
    +      "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ=="
    +    },
    +    "node_modules/slash": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
    +      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/slugify": {
    +      "version": "1.6.5",
    +      "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz",
    +      "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==",
    +      "engines": {
    +        "node": ">=8.0.0"
    +      }
    +    },
    +    "node_modules/spdx-correct": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
    +      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
    +      "dev": true,
    +      "dependencies": {
    +        "spdx-expression-parse": "^3.0.0",
    +        "spdx-license-ids": "^3.0.0"
    +      }
    +    },
    +    "node_modules/spdx-exceptions": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
    +      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
    +      "dev": true
    +    },
    +    "node_modules/spdx-expression-parse": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
    +      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "spdx-exceptions": "^2.1.0",
    +        "spdx-license-ids": "^3.0.0"
    +      }
    +    },
    +    "node_modules/spdx-license-ids": {
    +      "version": "3.0.11",
    +      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
    +      "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
    +      "dev": true
    +    },
    +    "node_modules/spellchecker-cli": {
    +      "version": "4.8.1",
    +      "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.8.1.tgz",
    +      "integrity": "sha512-7D4ZznwVTABfmyJEktFQNeO1epdDTy+AGZ3GWm9OerDDyFkzpCFNZ6IW+ZYpxcrmSJ92Xo0ppaJPRGPgH9uC5A==",
    +      "dev": true,
    +      "dependencies": {
    +        "app-root-path": "^3.0.0",
    +        "chalk": "^2.4.2",
    +        "command-line-args": "^5.1.1",
    +        "command-line-usage": "^5.0.4",
    +        "dictionary-en-au": "^2.3.0",
    +        "dictionary-en-ca": "^2.3.0",
    +        "dictionary-en-gb": "^2.3.0",
    +        "dictionary-en-us": "^2.2.1",
    +        "dictionary-en-za": "^2.0.4",
    +        "dictionary-vi": "^2.1.3",
    +        "fs-extra": "^6.0.1",
    +        "globby": "^11.0.0",
    +        "js-yaml": "^3.14.1",
    +        "jsonc": "^2.0.0",
    +        "junit-report-builder": "^1.3.3",
    +        "lodash": "^4.17.21",
    +        "remark": "^13.0.0",
    +        "remark-frontmatter": "^3.0.0",
    +        "remark-gemoji-to-emoji": "^1.1.0",
    +        "remark-retext": "^3.1.3",
    +        "retext": "^5.0.0",
    +        "retext-indefinite-article": "^1.1.7",
    +        "retext-repeated-words": "^1.2.3",
    +        "retext-spell": "^2.4.1",
    +        "retext-syntax-mentions": "^1.1.6",
    +        "retext-syntax-urls": "^1.0.2",
    +        "toml": "^3.0.0",
    +        "unist-util-visit": "^1.4.1",
    +        "vfile": "^3.0.1",
    +        "vfile-reporter": "^6.0.0"
    +      },
    +      "bin": {
    +        "spellchecker": "build/index.js"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/argparse": {
    +      "version": "1.0.10",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    +      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    +      "dev": true,
    +      "dependencies": {
    +        "sprintf-js": "~1.0.2"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/chalk": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.1",
    +        "escape-string-regexp": "^1.0.5",
    +        "supports-color": "^5.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +      "dev": true
    +    },
    +    "node_modules/spellchecker-cli/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/fs-extra": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
    +      "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.2",
    +        "jsonfile": "^4.0.0",
    +        "universalify": "^0.1.0"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/js-yaml": {
    +      "version": "3.14.1",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    +      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    +      "dev": true,
    +      "dependencies": {
    +        "argparse": "^1.0.7",
    +        "esprima": "^4.0.0"
    +      },
    +      "bin": {
    +        "js-yaml": "bin/js-yaml.js"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/jsonfile": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
    +      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
    +      "dev": true,
    +      "optionalDependencies": {
    +        "graceful-fs": "^4.1.6"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/supports-color": {
    +      "version": "5.5.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/spellchecker-cli/node_modules/universalify": {
    +      "version": "0.1.2",
    +      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
    +      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 4.0.0"
    +      }
    +    },
    +    "node_modules/sprintf-js": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
    +      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
    +    },
    +    "node_modules/statuses": {
    +      "version": "1.5.0",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
    +      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/strftime": {
    +      "version": "0.10.0",
    +      "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz",
    +      "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.2.0"
    +      }
    +    },
    +    "node_modules/string_decoder": {
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
    +      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
    +      "dev": true,
    +      "dependencies": {
    +        "safe-buffer": "~5.2.0"
    +      }
    +    },
    +    "node_modules/string-width": {
    +      "version": "4.2.3",
    +      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
    +      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
    +      "dev": true,
    +      "dependencies": {
    +        "emoji-regex": "^8.0.0",
    +        "is-fullwidth-code-point": "^3.0.0",
    +        "strip-ansi": "^6.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/string.prototype.trim": {
    +      "version": "1.2.5",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz",
    +      "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/string.prototype.trimend": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
    +      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/string.prototype.trimstart": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
    +      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/strip-ansi": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
    +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-regex": "^5.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/strip-bom": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
    +      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/strip-indent": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
    +      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "min-indent": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/strip-json-comments": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
    +      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/subleveldown": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-5.0.1.tgz",
    +      "integrity": "sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw==",
    +      "dev": true,
    +      "dependencies": {
    +        "abstract-leveldown": "^6.3.0",
    +        "encoding-down": "^6.2.0",
    +        "inherits": "^2.0.3",
    +        "level-option-wrap": "^1.1.0",
    +        "levelup": "^4.4.0",
    +        "reachdown": "^1.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/subleveldown/node_modules/abstract-leveldown": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz",
    +      "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "buffer": "^5.5.0",
    +        "immediate": "^3.2.3",
    +        "level-concat-iterator": "~2.0.0",
    +        "level-supports": "~1.0.0",
    +        "xtend": "~4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/subleveldown/node_modules/buffer": {
    +      "version": "5.7.1",
    +      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    +      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "dependencies": {
    +        "base64-js": "^1.3.1",
    +        "ieee754": "^1.1.13"
    +      }
    +    },
    +    "node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    +      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/symlink-or-copy": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz",
    +      "integrity": "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==",
    +      "dev": true
    +    },
    +    "node_modules/table-layout": {
    +      "version": "0.4.5",
    +      "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
    +      "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-back": "^2.0.0",
    +        "deep-extend": "~0.6.0",
    +        "lodash.padend": "^4.6.1",
    +        "typical": "^2.6.1",
    +        "wordwrapjs": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/table-layout/node_modules/array-back": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
    +      "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
    +      "dev": true,
    +      "dependencies": {
    +        "typical": "^2.6.1"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/table-layout/node_modules/typical": {
    +      "version": "2.6.1",
    +      "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    +      "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    +      "dev": true
    +    },
    +    "node_modules/tap-arc": {
    +      "version": "0.1.2",
    +      "resolved": "https://registry.npmjs.org/tap-arc/-/tap-arc-0.1.2.tgz",
    +      "integrity": "sha512-o1Wl5LtNXw2W9ROKqYh/f/uoFMzdcej+jrPEbouAu8U6UDm/ux7UBg5tjZlIEOhAbYKWvZD4BSEPfn0LrsAHHA==",
    +      "dev": true,
    +      "dependencies": {
    +        "fast-diff": "^1.2.0",
    +        "json5": "^2.2.0",
    +        "minimist": "~1.2.5",
    +        "picocolors": "^1.0.0",
    +        "strip-ansi": "^6.0.1",
    +        "tap-parser": "^10.1.0",
    +        "through2": "^4.0.2"
    +      },
    +      "bin": {
    +        "tap-arc": "index.js"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/tap-arc/node_modules/json5": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
    +      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
    +      "dev": true,
    +      "dependencies": {
    +        "minimist": "^1.2.5"
    +      },
    +      "bin": {
    +        "json5": "lib/cli.js"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tap-parser": {
    +      "version": "10.1.0",
    +      "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.1.0.tgz",
    +      "integrity": "sha512-FujQeciDaOiOvaIVGS1Rpb0v4R6XkOjvWCWowlz5oKuhPkEJ8U6pxgqt38xuzYhPt8dWEnfHn2jqpZdJEkW7pA==",
    +      "dev": true,
    +      "dependencies": {
    +        "events-to-array": "^1.0.1",
    +        "minipass": "^3.0.0",
    +        "tap-yaml": "^1.0.0"
    +      },
    +      "bin": {
    +        "tap-parser": "bin/cmd.js"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/tap-yaml": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz",
    +      "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "yaml": "^1.5.0"
    +      }
    +    },
    +    "node_modules/tape": {
    +      "version": "5.4.0",
    +      "resolved": "https://registry.npmjs.org/tape/-/tape-5.4.0.tgz",
    +      "integrity": "sha512-8Cq4mql6oZVO7zkMcen+2AZoJyICsHjJqTiWk1kVub6C/EsS4o9zBVWWbvBBLzx10okW3SKCoNN9XfwfTAIR2w==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "deep-equal": "^2.0.5",
    +        "defined": "^1.0.0",
    +        "dotignore": "^0.1.2",
    +        "for-each": "^0.3.3",
    +        "get-package-type": "^0.1.0",
    +        "glob": "^7.2.0",
    +        "has": "^1.0.3",
    +        "has-dynamic-import": "^2.0.1",
    +        "inherits": "^2.0.4",
    +        "is-regex": "^1.1.4",
    +        "minimist": "^1.2.5",
    +        "object-inspect": "^1.12.0",
    +        "object-is": "^1.1.5",
    +        "object.assign": "^4.1.2",
    +        "resolve": "^2.0.0-next.3",
    +        "resumer": "^0.0.0",
    +        "string.prototype.trim": "^1.2.5",
    +        "through": "^2.3.8"
    +      },
    +      "bin": {
    +        "tape": "bin/tape"
    +      }
    +    },
    +    "node_modules/tape/node_modules/defined": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
    +      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
    +      "dev": true
    +    },
    +    "node_modules/tape/node_modules/resolve": {
    +      "version": "2.0.0-next.3",
    +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
    +      "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-core-module": "^2.2.0",
    +        "path-parse": "^1.0.6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/text-table": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
    +      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
    +      "dev": true
    +    },
    +    "node_modules/through": {
    +      "version": "2.3.8",
    +      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
    +      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
    +      "dev": true
    +    },
    +    "node_modules/through2": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
    +      "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
    +      "dev": true,
    +      "dependencies": {
    +        "readable-stream": "3"
    +      }
    +    },
    +    "node_modules/tiny-each-async": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz",
    +      "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=",
    +      "dev": true
    +    },
    +    "node_modules/tiny-json-http": {
    +      "version": "7.3.1",
    +      "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.1.tgz",
    +      "integrity": "sha512-sgt6ABJnNftz8itxjVwyrKZsk+Dy62uXPR/ryeQ8wxC3sB6UCaz+3mrzKbZdu5DoyzEa/bpHMVkqsTCvuPaDNg==",
    +      "dev": true
    +    },
    +    "node_modules/to-readable-stream": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
    +      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/to-regex-range": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
    +      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-number": "^7.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8.0"
    +      }
    +    },
    +    "node_modules/toidentifier": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
    +      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.6"
    +      }
    +    },
    +    "node_modules/toml": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz",
    +      "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==",
    +      "dev": true
    +    },
    +    "node_modules/tr46": {
    +      "version": "0.0.3",
    +      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
    +      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
    +      "dev": true
    +    },
    +    "node_modules/tree-kill": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
    +      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
    +      "dev": true,
    +      "bin": {
    +        "tree-kill": "cli.js"
    +      }
    +    },
    +    "node_modules/trim-newlines": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
    +      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/trough": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
    +      "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/tsconfig-paths": {
    +      "version": "3.11.0",
    +      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz",
    +      "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/json5": "^0.0.29",
    +        "json5": "^1.0.1",
    +        "minimist": "^1.2.0",
    +        "strip-bom": "^3.0.0"
    +      }
    +    },
    +    "node_modules/tsconfig-paths/node_modules/strip-bom": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    +      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tsscmp": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
    +      "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
    +      "engines": {
    +        "node": ">=0.6.x"
    +      }
    +    },
    +    "node_modules/type-check": {
    +      "version": "0.4.0",
    +      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
    +      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
    +      "dev": true,
    +      "dependencies": {
    +        "prelude-ls": "^1.2.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/type-fest": {
    +      "version": "0.20.2",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
    +      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/type-is": {
    +      "version": "1.6.18",
    +      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
    +      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
    +      "dependencies": {
    +        "media-typer": "0.3.0",
    +        "mime-types": "~2.1.24"
    +      },
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/typedarray-to-buffer": {
    +      "version": "3.1.5",
    +      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
    +      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-typedarray": "^1.0.0"
    +      }
    +    },
    +    "node_modules/typical": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
    +      "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/uc.micro": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
    +      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
    +    },
    +    "node_modules/uid-safe": {
    +      "version": "2.1.5",
    +      "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
    +      "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
    +      "dependencies": {
    +        "random-bytes": "~1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/unbox-primitive": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
    +      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
    +      "dev": true,
    +      "dependencies": {
    +        "function-bind": "^1.1.1",
    +        "has-bigints": "^1.0.1",
    +        "has-symbols": "^1.0.2",
    +        "which-boxed-primitive": "^1.0.2"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/unherit": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
    +      "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "inherits": "^2.0.0",
    +        "xtend": "^4.0.0"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    },
    +    "node_modules/unified": {
    +      "version": "9.2.2",
    +      "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
    +      "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "bail": "^1.0.0",
    +        "extend": "^3.0.0",
    +        "is-buffer": "^2.0.0",
    +        "is-plain-obj": "^2.0.0",
    +        "trough": "^1.0.0",
    +        "vfile": "^4.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/unified/node_modules/vfile": {
    +      "version": "4.2.1",
    +      "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
    +      "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/unist": "^2.0.0",
    +        "is-buffer": "^2.0.0",
    +        "unist-util-stringify-position": "^2.0.0",
    +        "vfile-message": "^2.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/unified/node_modules/vfile-message": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
    +      "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/unist": "^2.0.0",
    +        "unist-util-stringify-position": "^2.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/unique-string": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
    +      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
    +      "dev": true,
    +      "dependencies": {
    +        "crypto-random-string": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/unist-util-is": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
    +      "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
    +      "dev": true
    +    },
    +    "node_modules/unist-util-modify-children": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz",
    +      "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-iterate": "^1.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/unist-util-position": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz",
    +      "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/unist-util-stringify-position": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
    +      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/unist": "^2.0.2"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/unist-util-visit": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
    +      "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
    +      "dev": true,
    +      "dependencies": {
    +        "unist-util-visit-parents": "^2.0.0"
    +      }
    +    },
    +    "node_modules/unist-util-visit-children": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz",
    +      "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==",
    +      "dev": true,
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/unist-util-visit-parents": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
    +      "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
    +      "dev": true,
    +      "dependencies": {
    +        "unist-util-is": "^3.0.0"
    +      }
    +    },
    +    "node_modules/universalify": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
    +      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 10.0.0"
    +      }
    +    },
    +    "node_modules/unorm": {
    +      "version": "1.6.0",
    +      "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz",
    +      "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==",
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/unpipe": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
    +      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/update-notifier": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
    +      "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
    +      "dev": true,
    +      "dependencies": {
    +        "boxen": "^5.0.0",
    +        "chalk": "^4.1.0",
    +        "configstore": "^5.0.1",
    +        "has-yarn": "^2.1.0",
    +        "import-lazy": "^2.1.0",
    +        "is-ci": "^2.0.0",
    +        "is-installed-globally": "^0.4.0",
    +        "is-npm": "^5.0.0",
    +        "is-yarn-global": "^0.3.0",
    +        "latest-version": "^5.1.0",
    +        "pupa": "^2.1.1",
    +        "semver": "^7.3.4",
    +        "semver-diff": "^3.1.1",
    +        "xdg-basedir": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/yeoman/update-notifier?sponsor=1"
    +      }
    +    },
    +    "node_modules/uri-js": {
    +      "version": "4.4.1",
    +      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
    +      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
    +      "dev": true,
    +      "dependencies": {
    +        "punycode": "^2.1.0"
    +      }
    +    },
    +    "node_modules/url": {
    +      "version": "0.10.3",
    +      "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
    +      "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=",
    +      "dev": true,
    +      "dependencies": {
    +        "punycode": "1.3.2",
    +        "querystring": "0.2.0"
    +      }
    +    },
    +    "node_modules/url-parse-lax": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
    +      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
    +      "dev": true,
    +      "dependencies": {
    +        "prepend-http": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/url/node_modules/punycode": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
    +      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
    +      "dev": true
    +    },
    +    "node_modules/uslug": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz",
    +      "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=",
    +      "dependencies": {
    +        "unorm": ">= 1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/util-deprecate": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
    +      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
    +      "dev": true
    +    },
    +    "node_modules/utils-merge": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
    +      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/uuid": {
    +      "version": "3.3.2",
    +      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
    +      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
    +      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
    +      "dev": true,
    +      "bin": {
    +        "uuid": "bin/uuid"
    +      }
    +    },
    +    "node_modules/v8-compile-cache": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
    +      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
    +      "dev": true
    +    },
    +    "node_modules/validate-npm-package-license": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
    +      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
    +      "dev": true,
    +      "dependencies": {
    +        "spdx-correct": "^3.0.0",
    +        "spdx-expression-parse": "^3.0.0"
    +      }
    +    },
    +    "node_modules/vfile": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz",
    +      "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-buffer": "^2.0.0",
    +        "replace-ext": "1.0.0",
    +        "unist-util-stringify-position": "^1.0.0",
    +        "vfile-message": "^1.0.0"
    +      }
    +    },
    +    "node_modules/vfile-location": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
    +      "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/vfile-message": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
    +      "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
    +      "dev": true,
    +      "dependencies": {
    +        "unist-util-stringify-position": "^1.1.1"
    +      }
    +    },
    +    "node_modules/vfile-message/node_modules/unist-util-stringify-position": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    +      "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    +      "dev": true
    +    },
    +    "node_modules/vfile-reporter": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz",
    +      "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==",
    +      "dev": true,
    +      "dependencies": {
    +        "repeat-string": "^1.5.0",
    +        "string-width": "^4.0.0",
    +        "supports-color": "^6.0.0",
    +        "unist-util-stringify-position": "^2.0.0",
    +        "vfile-sort": "^2.1.2",
    +        "vfile-statistics": "^1.1.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/vfile-reporter/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/vfile-reporter/node_modules/supports-color": {
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
    +      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/vfile-sort": {
    +      "version": "2.2.2",
    +      "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.2.tgz",
    +      "integrity": "sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/vfile-statistics": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.4.tgz",
    +      "integrity": "sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/unified"
    +      }
    +    },
    +    "node_modules/vfile/node_modules/unist-util-stringify-position": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    +      "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    +      "dev": true
    +    },
    +    "node_modules/webidl-conversions": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
    +      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
    +      "dev": true
    +    },
    +    "node_modules/whatwg-url": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
    +      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
    +      "dev": true,
    +      "dependencies": {
    +        "tr46": "~0.0.3",
    +        "webidl-conversions": "^3.0.0"
    +      }
    +    },
    +    "node_modules/which": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
    +      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
    +      "dev": true,
    +      "dependencies": {
    +        "isexe": "^2.0.0"
    +      },
    +      "bin": {
    +        "node-which": "bin/node-which"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/which-boxed-primitive": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
    +      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-bigint": "^1.0.1",
    +        "is-boolean-object": "^1.1.0",
    +        "is-number-object": "^1.0.4",
    +        "is-string": "^1.0.5",
    +        "is-symbol": "^1.0.3"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/which-collection": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
    +      "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-map": "^2.0.1",
    +        "is-set": "^2.0.1",
    +        "is-weakmap": "^2.0.1",
    +        "is-weakset": "^2.0.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/which-typed-array": {
    +      "version": "1.1.7",
    +      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
    +      "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
    +      "dev": true,
    +      "dependencies": {
    +        "available-typed-arrays": "^1.0.5",
    +        "call-bind": "^1.0.2",
    +        "es-abstract": "^1.18.5",
    +        "foreach": "^2.0.5",
    +        "has-tostringtag": "^1.0.0",
    +        "is-typed-array": "^1.1.7"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/widest-line": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
    +      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/word-wrap": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
    +      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/wordwrapjs": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
    +      "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
    +      "dev": true,
    +      "dependencies": {
    +        "reduce-flatten": "^1.0.1",
    +        "typical": "^2.6.1"
    +      },
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/wordwrapjs/node_modules/typical": {
    +      "version": "2.6.1",
    +      "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    +      "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    +      "dev": true
    +    },
    +    "node_modules/wrap-ansi": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
    +      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^4.0.0",
    +        "string-width": "^4.1.0",
    +        "strip-ansi": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
    +      }
    +    },
    +    "node_modules/wrappy": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
    +      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
    +    },
    +    "node_modules/write-file-atomic": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
    +      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "imurmurhash": "^0.1.4",
    +        "is-typedarray": "^1.0.0",
    +        "signal-exit": "^3.0.2",
    +        "typedarray-to-buffer": "^3.1.5"
    +      }
    +    },
    +    "node_modules/ws": {
    +      "version": "8.3.0",
    +      "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
    +      "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10.0.0"
    +      },
    +      "peerDependencies": {
    +        "bufferutil": "^4.0.1",
    +        "utf-8-validate": "^5.0.2"
    +      },
    +      "peerDependenciesMeta": {
    +        "bufferutil": {
    +          "optional": true
    +        },
    +        "utf-8-validate": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/x-is-string": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
    +      "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
    +      "dev": true
    +    },
    +    "node_modules/xdg-basedir": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
    +      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/xml2js": {
    +      "version": "0.4.19",
    +      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
    +      "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "sax": ">=0.6.0",
    +        "xmlbuilder": "~9.0.1"
    +      }
    +    },
    +    "node_modules/xml2js/node_modules/xmlbuilder": {
    +      "version": "9.0.7",
    +      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
    +      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/xmlbuilder": {
    +      "version": "10.1.1",
    +      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
    +      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/xtend": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
    +      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.4"
    +      }
    +    },
    +    "node_modules/yallist": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
    +      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
    +      "dev": true
    +    },
    +    "node_modules/yaml": {
    +      "version": "1.10.2",
    +      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
    +      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/yargs-parser": {
    +      "version": "20.2.9",
    +      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
    +      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/yazl": {
    +      "version": "2.5.1",
    +      "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
    +      "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
    +      "dev": true,
    +      "dependencies": {
    +        "buffer-crc32": "~0.2.3"
    +      }
    +    },
    +    "node_modules/yesno": {
    +      "version": "0.3.1",
    +      "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.3.1.tgz",
    +      "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==",
    +      "dev": true
    +    },
    +    "node_modules/zip-dir": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz",
    +      "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==",
    +      "dev": true,
    +      "dependencies": {
    +        "async": "^3.2.0",
    +        "jszip": "^3.2.2"
    +      }
    +    },
    +    "node_modules/zip-dir/node_modules/async": {
    +      "version": "3.2.2",
    +      "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
    +      "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==",
    +      "dev": true
    +    },
    +    "node_modules/zipit": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/zipit/-/zipit-2.0.0.tgz",
    +      "integrity": "sha512-e/y9Xf1eYElSSo1s1e1+0QraquqaCmfnCvxd2IlvILtKK+F93kpV+/TIRUDYW7UnYtDMeYijG5kyEA7B+66wgg==",
    +      "dev": true,
    +      "dependencies": {
    +        "insync": "2.1.1",
    +        "yazl": "2.5.1"
    +      },
    +      "engines": {
    +        "node": ">=8.0.0"
    +      }
    +    },
    +    "node_modules/zwitch": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
    +      "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
    +      "dev": true,
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/wooorm"
    +      }
    +    }
    +  },
    +  "dependencies": {
    +    "@architect/architect": {
    +      "version": "9.4.2",
    +      "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.4.2.tgz",
    +      "integrity": "sha512-2XBsNHULMFCydG9YUqIYzoOZ2eLP4pkT3dnPMTf0B/5Qrby4t+sIbkTseLEkyK6Mhn1r8GWe+M/O4kYHNtIrpw==",
    +      "dev": true,
    +      "requires": {
    +        "@architect/create": "3.1.1",
    +        "@architect/deploy": "3.1.0",
    +        "@architect/destroy": "2.0.3",
    +        "@architect/env": "2.0.6",
    +        "@architect/hydrate": "2.1.0",
    +        "@architect/logs": "3.0.3",
    +        "@architect/package": "7.2.0",
    +        "@architect/sandbox": "4.4.2",
    +        "aws-sdk": "2.880.0",
    +        "chalk": "4.1.2",
    +        "update-notifier": "5.1.0"
    +      }
    +    },
    +    "@architect/asap": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-4.1.0.tgz",
    +      "integrity": "sha512-SrPV5lUpjotyj/nIMQWwdTsNe5LwieFHqhrVo8tKKXz7Ht7ila15rH9dyYENOmMI87UVHvKDbsRvx47LK5NMwQ=="
    +    },
    +    "@architect/create": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/@architect/create/-/create-3.1.1.tgz",
    +      "integrity": "sha512-Du2YITXVrgpR49GaRqQe/sc8VBQ3B05/eWHlGAOjPUgmTRf4JycAoKxSPnTMYmEjQHJyrABs35cbHhse1vH1tw==",
    +      "dev": true,
    +      "requires": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "chalk": "~4.1.2",
    +        "lambda-runtimes": "~1.1.0",
    +        "minimist": "~1.2.5"
    +      }
    +    },
    +    "@architect/deploy": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.1.0.tgz",
    +      "integrity": "sha512-Sg4uZ6gSYrEwz5luOGkAkRm9fIrLoQvXZqaYOj4l6DZXNAt2A0EqoNLw9E6D7e6Y9kIqw42SJoIWNpqtx5sWpQ==",
    +      "dev": true,
    +      "requires": {
    +        "@architect/create": "~3.1.0",
    +        "@architect/hydrate": "~2.1.0",
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/package": "~7.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "chalk": "~4.1.2",
    +        "fs-extra": "~10.0.0",
    +        "get-folder-size": "2.0.1",
    +        "glob": "~7.2.0",
    +        "mime-types": "~2.1.34",
    +        "ospath": "~1.2.2",
    +        "path-sort": "~0.1.0",
    +        "rimraf": "~3.0.2",
    +        "run-parallel": "~1.2.0",
    +        "run-series": "~1.1.9",
    +        "run-waterfall": "~1.1.7",
    +        "sha": "~3.0.0",
    +        "zip-dir": "~2.0.0",
    +        "zipit": "~2.0.0"
    +      }
    +    },
    +    "@architect/destroy": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-2.0.3.tgz",
    +      "integrity": "sha512-lIaWPrcI5G/TOcP3AxdAQoRxD0DYdClRAUzrILKRoPbp9klFDlVB7+JPqoL7b/tNCxTRN6EES0mZv4yFK64NQA==",
    +      "dev": true,
    +      "requires": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "aws-sdk": "2.880.0",
    +        "run-parallel": "~1.2.0",
    +        "run-waterfall": "~1.1.7"
    +      }
    +    },
    +    "@architect/env": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/@architect/env/-/env-2.0.6.tgz",
    +      "integrity": "sha512-Wk7bhkVs6hLTq8JFDiSjPmWgf+Je5Hhehj57lLUb8F1eNtlLFHUwv6X2W/zyodIvoqiDl4d0Zb9FOLDY5F3BNA==",
    +      "dev": true,
    +      "requires": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/parser": "~5.0.2",
    +        "@architect/utils": "~3.0.4",
    +        "aws-sdk": "2.880.0",
    +        "chalk": "~4.1.2",
    +        "cross-env": "~7.0.3",
    +        "dotenv": "~10.0.0",
    +        "run-series": "~1.1.9",
    +        "run-waterfall": "~1.1.7",
    +        "yesno": "~0.3.1"
    +      }
    +    },
    +    "@architect/eslint-config": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/@architect/eslint-config/-/eslint-config-2.0.1.tgz",
    +      "integrity": "sha512-VezbBc1DEikXXQNPBmIqz2DqKBr0ptrQ+lY7rdGxb2rxdRrmQ5OHVzSoHUxFA4Z7xNmWclTvx3RVYh3mfKKU/g==",
    +      "dev": true,
    +      "requires": {
    +        "eslint-plugin-filenames": "^1.3.2",
    +        "eslint-plugin-fp": "^2.3.0",
    +        "eslint-plugin-import": "^2.25.1"
    +      }
    +    },
    +    "@architect/functions": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.1.1.tgz",
    +      "integrity": "sha512-x0+B/V9Jo5onksOce6iYdYeLh5F91dOp5fTnGJdkgOFCS+N0YN9zlI2asdPIs1Rb6xxCwoH1nuzs/jnNkupQWA==",
    +      "requires": {
    +        "aws-serverless-express": "^3.4.0",
    +        "cookie": "^0.4.1",
    +        "cookie-signature": "^1.1.0",
    +        "csrf": "^3.1.0",
    +        "node-webtokens": "^1.0.4",
    +        "run-parallel": "^1.2.0",
    +        "run-waterfall": "^1.1.7",
    +        "uid-safe": "^2.1.5"
    +      }
    +    },
    +    "@architect/hydrate": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.1.0.tgz",
    +      "integrity": "sha512-mchkcEFZIZpkcIDLFndsCh0W1q5dmAOICMsO/rcAPYnRPvRQT8D4Bt+jFyV7AXu9OM3WGx34Llu/naKab/S1qQ==",
    +      "dev": true,
    +      "requires": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "acorn-loose": "~8.2.1",
    +        "chalk": "~4.1.2",
    +        "cpr": "~3.0.1",
    +        "esquery": "~1.4.0",
    +        "glob": "~7.2.0",
    +        "rimraf": "~3.0.2",
    +        "run-series": "~1.1.9",
    +        "symlink-or-copy": "~1.3.1"
    +      }
    +    },
    +    "@architect/inventory": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-2.2.1.tgz",
    +      "integrity": "sha512-Rwl3os2JFHantTENPFn6KUeIaChmYc1v6B/zGCe5yC82mrJBXNZu8tN6PtawC6dmhQdbfBGAc+MlhgUqKzpVTA==",
    +      "requires": {
    +        "@architect/asap": "~4.1.0",
    +        "@architect/parser": "~5.0.2",
    +        "@architect/utils": "~3.0.4",
    +        "lambda-runtimes": "~1.1.0"
    +      }
    +    },
    +    "@architect/logs": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-3.0.3.tgz",
    +      "integrity": "sha512-21fFpQ8BmAbsCmSlVYD0P6+caVm7LTS/bhAgfoqKkoK26QBKkQIC+QdMvrAlI0mF0zgInnl1FmWxphRhK/jvWg==",
    +      "dev": true,
    +      "requires": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "aws-sdk": "2.880.0",
    +        "chalk": "~4.1.2",
    +        "run-parallel": "~1.2.0",
    +        "run-waterfall": "~1.1.7",
    +        "strftime": "~0.10.0"
    +      }
    +    },
    +    "@architect/package": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/@architect/package/-/package-7.2.0.tgz",
    +      "integrity": "sha512-c1Z8pD0tLbTMSWviAZEJ9SARL2ONZUjX8/RmHT0s6F/mEVJNhUwNsfcxsblqLscUl+sv82tqIovkFkC+UG0fSw==",
    +      "requires": {
    +        "@architect/inventory": "~2.2.0",
    +        "@architect/utils": "~3.0.4",
    +        "chalk": "~4.1.2"
    +      }
    +    },
    +    "@architect/parser": {
    +      "version": "5.0.2",
    +      "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-5.0.2.tgz",
    +      "integrity": "sha512-3XTuB/HS3GNDXXUQ2BJt7kVOViTGCR2O4hIUEb1l8FxsSmwzgpiR2CAzUA4ZhySxW+1a+Tg88YL2Yyb2kvLmlw=="
    +    },
    +    "@architect/sandbox": {
    +      "version": "4.4.2",
    +      "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.4.2.tgz",
    +      "integrity": "sha512-WxCaGBc7X7OJW3I6OuMNnl4zwYlUzK+CSFgvPMx3X/VmLc37Mzm4SVn75jv+qW49iSdLDClzcAOCXT67brtPBw==",
    +      "dev": true,
    +      "requires": {
    +        "@architect/asap": "~4.1.0",
    +        "@architect/create": "~3.1.1",
    +        "@architect/hydrate": "~2.1.0",
    +        "@architect/inventory": "~2.2.1",
    +        "@architect/parser": "~5.0.2",
    +        "@architect/utils": "~3.0.4",
    +        "@begin/hashid": "~1.0.0",
    +        "aws-sdk": "2.880.0",
    +        "body-parser": "~1.19.0",
    +        "chalk": "~4.1.2",
    +        "depstatus": "~1.1.1",
    +        "dotenv": "~10.0.0",
    +        "dynalite": "~3.2.1",
    +        "finalhandler": "~1.1.2",
    +        "glob": "~7.2.0",
    +        "http-proxy": "~1.18.1",
    +        "lambda-runtimes": "~1.1.1",
    +        "minimist": "~1.2.5",
    +        "node-watch": "~0.7.2",
    +        "router": "~1.3.6",
    +        "run-parallel": "~1.2.0",
    +        "run-series": "~1.1.9",
    +        "send": "~0.17.1",
    +        "server-destroy": "~1.0.1",
    +        "tree-kill": "~1.2.2",
    +        "update-notifier": "~5.1.0",
    +        "ws": "~8.3.0"
    +      }
    +    },
    +    "@architect/spellcheck-dictionary": {
    +      "version": "git+ssh://git@github.com/architect/spellcheck-dictionary.git#11cae7e5559dda8ab03a3e3d32931db9a4fd3165",
    +      "integrity": "sha512-AW45aIXaWw5zmky1/irEPMDc1ex9kKA4niKf7hFPm6kXEk9OyFzYLb3QtxlQovYh+qK71KtYEVb9Z8cyuHgRIA==",
    +      "dev": true,
    +      "from": "@architect/spellcheck-dictionary@github:architect/spellcheck-dictionary"
    +    },
    +    "@architect/syntaxes": {
    +      "version": "git+ssh://git@github.com/architect/syntaxes.git#ca61027ef8295e2bb012a8df9ac9240052f43b66",
    +      "integrity": "sha512-dGGwAfcHpNfuthuv5i5H8e/i+NFqZxA1Kwo8lxdJJ3JX1P3LNr7uyNE+VRqbdXJkC3JNi5Jw0VUmtkBRzB7j1g==",
    +      "from": "@architect/syntaxes@github:architect/syntaxes#v1.2.1"
    +    },
    +    "@architect/utils": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.0.4.tgz",
    +      "integrity": "sha512-Tmzw9p55n2euNMLUyqcNPy82FLCQ0/3jpZqv5xcZ8erq4w3ssb2Ok5Fclm+56YCioyM4xUiwsGU/uC09+BWgTg==",
    +      "requires": {
    +        "chalk": "~4.1.2",
    +        "glob": "~7.2.0",
    +        "path-sort": "~0.1.0",
    +        "restore-cursor": "3.1.0",
    +        "run-series": "~1.1.9",
    +        "run-waterfall": "~1.1.7",
    +        "sha": "~3.0.0"
    +      }
    +    },
    +    "@babel/code-frame": {
    +      "version": "7.16.0",
    +      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
    +      "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
    +      "dev": true,
    +      "requires": {
    +        "@babel/highlight": "^7.16.0"
    +      }
    +    },
    +    "@babel/helper-validator-identifier": {
    +      "version": "7.15.7",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
    +      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
    +      "dev": true
    +    },
    +    "@babel/highlight": {
    +      "version": "7.16.0",
    +      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
    +      "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
    +      "dev": true,
    +      "requires": {
    +        "@babel/helper-validator-identifier": "^7.15.7",
    +        "chalk": "^2.0.0",
    +        "js-tokens": "^4.0.0"
    +      },
    +      "dependencies": {
    +        "ansi-styles": {
    +          "version": "3.2.1",
    +          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +          "dev": true,
    +          "requires": {
    +            "color-convert": "^1.9.0"
    +          }
    +        },
    +        "chalk": {
    +          "version": "2.4.2",
    +          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +          "dev": true,
    +          "requires": {
    +            "ansi-styles": "^3.2.1",
    +            "escape-string-regexp": "^1.0.5",
    +            "supports-color": "^5.3.0"
    +          }
    +        },
    +        "color-convert": {
    +          "version": "1.9.3",
    +          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +          "dev": true,
    +          "requires": {
    +            "color-name": "1.1.3"
    +          }
    +        },
    +        "color-name": {
    +          "version": "1.1.3",
    +          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +          "dev": true
    +        },
    +        "escape-string-regexp": {
    +          "version": "1.0.5",
    +          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    +          "dev": true
    +        },
    +        "has-flag": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +          "dev": true
    +        },
    +        "supports-color": {
    +          "version": "5.5.0",
    +          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +          "dev": true,
    +          "requires": {
    +            "has-flag": "^3.0.0"
    +          }
    +        }
    +      }
    +    },
    +    "@begin/hashid": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@begin/hashid/-/hashid-1.0.0.tgz",
    +      "integrity": "sha512-w+U9klEtRkt7hyW/f+/SvwPgJ4CTMO2ENddisX9dGgLUZKu+iKpb/IhYnQWIt9/Nnm/5DkApmiHGimPs621wwA==",
    +      "dev": true
    +    },
    +    "@eslint/eslintrc": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
    +      "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
    +      "dev": true,
    +      "requires": {
    +        "ajv": "^6.12.4",
    +        "debug": "^4.3.2",
    +        "espree": "^9.2.0",
    +        "globals": "^13.9.0",
    +        "ignore": "^4.0.6",
    +        "import-fresh": "^3.2.1",
    +        "js-yaml": "^4.1.0",
    +        "minimatch": "^3.0.4",
    +        "strip-json-comments": "^3.1.1"
    +      },
    +      "dependencies": {
    +        "debug": {
    +          "version": "4.3.3",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    +          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
    +          "dev": true,
    +          "requires": {
    +            "ms": "2.1.2"
    +          }
    +        },
    +        "ms": {
    +          "version": "2.1.2",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "@humanwhocodes/config-array": {
    +      "version": "0.9.2",
    +      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
    +      "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
    +      "dev": true,
    +      "requires": {
    +        "@humanwhocodes/object-schema": "^1.2.1",
    +        "debug": "^4.1.1",
    +        "minimatch": "^3.0.4"
    +      },
    +      "dependencies": {
    +        "debug": {
    +          "version": "4.3.3",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    +          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
    +          "dev": true,
    +          "requires": {
    +            "ms": "2.1.2"
    +          }
    +        },
    +        "ms": {
    +          "version": "2.1.2",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "@humanwhocodes/object-schema": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
    +      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
    +      "dev": true
    +    },
    +    "@nodelib/fs.scandir": {
    +      "version": "2.1.5",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
    +      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
    +      "dev": true,
    +      "requires": {
    +        "@nodelib/fs.stat": "2.0.5",
    +        "run-parallel": "^1.1.9"
    +      }
    +    },
    +    "@nodelib/fs.stat": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
    +      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
    +      "dev": true
    +    },
    +    "@nodelib/fs.walk": {
    +      "version": "1.2.8",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
    +      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
    +      "dev": true,
    +      "requires": {
    +        "@nodelib/fs.scandir": "2.1.5",
    +        "fastq": "^1.6.0"
    +      }
    +    },
    +    "@sindresorhus/is": {
    +      "version": "0.14.0",
    +      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
    +      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
    +      "dev": true
    +    },
    +    "@szmarczak/http-timer": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
    +      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
    +      "dev": true,
    +      "requires": {
    +        "defer-to-connect": "^1.0.1"
    +      }
    +    },
    +    "@toycode/markdown-it-class": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz",
    +      "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ=="
    +    },
    +    "@types/json5": {
    +      "version": "0.0.29",
    +      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
    +      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
    +      "dev": true
    +    },
    +    "@types/mdast": {
    +      "version": "3.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
    +      "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
    +      "dev": true,
    +      "requires": {
    +        "@types/unist": "*"
    +      }
    +    },
    +    "@types/minimist": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
    +      "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
    +      "dev": true
    +    },
    +    "@types/normalize-package-data": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
    +      "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
    +      "dev": true
    +    },
    +    "@types/unist": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
    +      "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==",
    +      "dev": true
    +    },
    +    "@vendia/serverless-express": {
    +      "version": "3.4.0",
    +      "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-3.4.0.tgz",
    +      "integrity": "sha512-/UAAbi9qRjUtjRISt5MJ1sfhtrHb26hqQ0nvE5qhMLsAdR5H7ErBwPD8Q/v2OENKm0iWsGwErIZEg7ebUeFDjQ==",
    +      "requires": {
    +        "binary-case": "^1.0.0",
    +        "type-is": "^1.6.16"
    +      }
    +    },
    +    "abort-controller": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
    +      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
    +      "dev": true,
    +      "requires": {
    +        "event-target-shim": "^5.0.0"
    +      }
    +    },
    +    "abstract-leveldown": {
    +      "version": "6.2.3",
    +      "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
    +      "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
    +      "dev": true,
    +      "requires": {
    +        "buffer": "^5.5.0",
    +        "immediate": "^3.2.3",
    +        "level-concat-iterator": "~2.0.0",
    +        "level-supports": "~1.0.0",
    +        "xtend": "~4.0.0"
    +      },
    +      "dependencies": {
    +        "buffer": {
    +          "version": "5.7.1",
    +          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    +          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    +          "dev": true,
    +          "requires": {
    +            "base64-js": "^1.3.1",
    +            "ieee754": "^1.1.13"
    +          }
    +        }
    +      }
    +    },
    +    "acorn": {
    +      "version": "8.7.0",
    +      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
    +      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
    +      "dev": true
    +    },
    +    "acorn-jsx": {
    +      "version": "5.3.2",
    +      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
    +      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
    +      "dev": true,
    +      "requires": {}
    +    },
    +    "acorn-loose": {
    +      "version": "8.2.1",
    +      "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.2.1.tgz",
    +      "integrity": "sha512-/sVu5wCtWrX6ChLCMzBTmNkXSoyRKunTf6HjHMswzMmzIyE8vU+HYlgd2kFF/A9Av9j+b9/d/FzxrmcH0lCrBw==",
    +      "dev": true,
    +      "requires": {
    +        "acorn": "^8.5.0"
    +      }
    +    },
    +    "agent-base": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
    +      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
    +      "dev": true,
    +      "requires": {
    +        "debug": "4"
    +      },
    +      "dependencies": {
    +        "debug": {
    +          "version": "4.3.2",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    +          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +          "dev": true,
    +          "requires": {
    +            "ms": "2.1.2"
    +          }
    +        },
    +        "ms": {
    +          "version": "2.1.2",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "ajv": {
    +      "version": "6.12.6",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
    +      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
    +      "dev": true,
    +      "requires": {
    +        "fast-deep-equal": "^3.1.1",
    +        "fast-json-stable-stringify": "^2.0.0",
    +        "json-schema-traverse": "^0.4.1",
    +        "uri-js": "^4.2.2"
    +      }
    +    },
    +    "ansi-align": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
    +      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
    +      "dev": true,
    +      "requires": {
    +        "string-width": "^4.1.0"
    +      }
    +    },
    +    "ansi-colors": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
    +      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
    +      "dev": true
    +    },
    +    "ansi-regex": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
    +      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
    +      "dev": true
    +    },
    +    "ansi-styles": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
    +      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
    +      "requires": {
    +        "color-convert": "^2.0.1"
    +      }
    +    },
    +    "app-root-path": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz",
    +      "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==",
    +      "dev": true
    +    },
    +    "argparse": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    +      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
    +    },
    +    "array-back": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
    +      "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
    +      "dev": true
    +    },
    +    "array-flatten": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz",
    +      "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==",
    +      "dev": true
    +    },
    +    "array-includes": {
    +      "version": "3.1.4",
    +      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
    +      "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.1",
    +        "get-intrinsic": "^1.1.1",
    +        "is-string": "^1.0.7"
    +      }
    +    },
    +    "array-iterate": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz",
    +      "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==",
    +      "dev": true
    +    },
    +    "array-union": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
    +      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
    +      "dev": true
    +    },
    +    "array.prototype.flat": {
    +      "version": "1.2.5",
    +      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
    +      "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.0"
    +      }
    +    },
    +    "arrify": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
    +      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
    +      "dev": true
    +    },
    +    "async": {
    +      "version": "2.6.3",
    +      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
    +      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
    +      "dev": true,
    +      "requires": {
    +        "lodash": "^4.17.14"
    +      }
    +    },
    +    "available-typed-arrays": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
    +      "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
    +      "dev": true
    +    },
    +    "aws-sdk": {
    +      "version": "2.880.0",
    +      "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.880.0.tgz",
    +      "integrity": "sha512-/dBk3ejw22ED2edzGfmJB83KXDA4wLIw5Hb+2YMhly+gOWecvevy0tML2+YN/cmxyTy+wT0E0sM7fm1v7kmHtw==",
    +      "dev": true,
    +      "requires": {
    +        "buffer": "4.9.2",
    +        "events": "1.1.1",
    +        "ieee754": "1.1.13",
    +        "jmespath": "0.15.0",
    +        "querystring": "0.2.0",
    +        "sax": "1.2.1",
    +        "url": "0.10.3",
    +        "uuid": "3.3.2",
    +        "xml2js": "0.4.19"
    +      }
    +    },
    +    "aws-serverless-express": {
    +      "version": "3.4.0",
    +      "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.4.0.tgz",
    +      "integrity": "sha512-YG9ZjAOI9OpwqDDWzkRc3kKJYJuR7gTMjLa3kAWopO17myoprxskCUyCEee+RKe34tcR4UNrVtgAwW5yDe74bw==",
    +      "requires": {
    +        "@vendia/serverless-express": "^3.4.0",
    +        "binary-case": "^1.0.0",
    +        "type-is": "^1.6.16"
    +      }
    +    },
    +    "bail": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
    +      "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
    +      "dev": true
    +    },
    +    "balanced-match": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
    +      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    +    },
    +    "base64-js": {
    +      "version": "1.5.1",
    +      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
    +      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
    +      "dev": true
    +    },
    +    "big.js": {
    +      "version": "5.2.2",
    +      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
    +      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
    +      "dev": true
    +    },
    +    "binary-case": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz",
    +      "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg=="
    +    },
    +    "body-parser": {
    +      "version": "1.19.1",
    +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz",
    +      "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==",
    +      "dev": true,
    +      "requires": {
    +        "bytes": "3.1.1",
    +        "content-type": "~1.0.4",
    +        "debug": "2.6.9",
    +        "depd": "~1.1.2",
    +        "http-errors": "1.8.1",
    +        "iconv-lite": "0.4.24",
    +        "on-finished": "~2.3.0",
    +        "qs": "6.9.6",
    +        "raw-body": "2.4.2",
    +        "type-is": "~1.6.18"
    +      }
    +    },
    +    "boxen": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
    +      "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
    +      "dev": true,
    +      "requires": {
    +        "ansi-align": "^3.0.0",
    +        "camelcase": "^6.2.0",
    +        "chalk": "^4.1.0",
    +        "cli-boxes": "^2.2.1",
    +        "string-width": "^4.2.2",
    +        "type-fest": "^0.20.2",
    +        "widest-line": "^3.1.0",
    +        "wrap-ansi": "^7.0.0"
    +      }
    +    },
    +    "brace-expansion": {
    +      "version": "1.1.11",
    +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
    +      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
    +      "requires": {
    +        "balanced-match": "^1.0.0",
    +        "concat-map": "0.0.1"
    +      }
    +    },
    +    "braces": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
    +      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
    +      "dev": true,
    +      "requires": {
    +        "fill-range": "^7.0.1"
    +      }
    +    },
    +    "buffer": {
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
    +      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
    +      "dev": true,
    +      "requires": {
    +        "base64-js": "^1.0.2",
    +        "ieee754": "^1.1.4",
    +        "isarray": "^1.0.0"
    +      }
    +    },
    +    "buffer-crc32": {
    +      "version": "0.2.13",
    +      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
    +      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
    +      "dev": true
    +    },
    +    "bytes": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
    +      "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==",
    +      "dev": true
    +    },
    +    "cacheable-request": {
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
    +      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
    +      "dev": true,
    +      "requires": {
    +        "clone-response": "^1.0.2",
    +        "get-stream": "^5.1.0",
    +        "http-cache-semantics": "^4.0.0",
    +        "keyv": "^3.0.0",
    +        "lowercase-keys": "^2.0.0",
    +        "normalize-url": "^4.1.0",
    +        "responselike": "^1.0.2"
    +      },
    +      "dependencies": {
    +        "get-stream": {
    +          "version": "5.2.0",
    +          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
    +          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
    +          "dev": true,
    +          "requires": {
    +            "pump": "^3.0.0"
    +          }
    +        },
    +        "lowercase-keys": {
    +          "version": "2.0.0",
    +          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
    +          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "call-bind": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
    +      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
    +      "dev": true,
    +      "requires": {
    +        "function-bind": "^1.1.1",
    +        "get-intrinsic": "^1.0.2"
    +      }
    +    },
    +    "callsites": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
    +      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
    +      "dev": true
    +    },
    +    "camelcase": {
    +      "version": "6.2.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
    +      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
    +      "dev": true
    +    },
    +    "camelcase-keys": {
    +      "version": "6.2.2",
    +      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
    +      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
    +      "dev": true,
    +      "requires": {
    +        "camelcase": "^5.3.1",
    +        "map-obj": "^4.0.0",
    +        "quick-lru": "^4.0.1"
    +      },
    +      "dependencies": {
    +        "camelcase": {
    +          "version": "5.3.1",
    +          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    +          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "chalk": {
    +      "version": "4.1.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
    +      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
    +      "requires": {
    +        "ansi-styles": "^4.1.0",
    +        "supports-color": "^7.1.0"
    +      }
    +    },
    +    "character-entities": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
    +      "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
    +      "dev": true
    +    },
    +    "character-entities-legacy": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
    +      "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
    +      "dev": true
    +    },
    +    "character-reference-invalid": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
    +      "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
    +      "dev": true
    +    },
    +    "ci-info": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
    +      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
    +      "dev": true
    +    },
    +    "cli-boxes": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
    +      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
    +      "dev": true
    +    },
    +    "clone": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
    +      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
    +    },
    +    "clone-response": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
    +      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
    +      "dev": true,
    +      "requires": {
    +        "mimic-response": "^1.0.0"
    +      }
    +    },
    +    "color-convert": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
    +      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
    +      "requires": {
    +        "color-name": "~1.1.4"
    +      }
    +    },
    +    "color-name": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
    +      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
    +    },
    +    "command-line-args": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz",
    +      "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==",
    +      "dev": true,
    +      "requires": {
    +        "array-back": "^3.1.0",
    +        "find-replace": "^3.0.0",
    +        "lodash.camelcase": "^4.3.0",
    +        "typical": "^4.0.0"
    +      }
    +    },
    +    "command-line-usage": {
    +      "version": "5.0.5",
    +      "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz",
    +      "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==",
    +      "dev": true,
    +      "requires": {
    +        "array-back": "^2.0.0",
    +        "chalk": "^2.4.1",
    +        "table-layout": "^0.4.3",
    +        "typical": "^2.6.1"
    +      },
    +      "dependencies": {
    +        "ansi-styles": {
    +          "version": "3.2.1",
    +          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +          "dev": true,
    +          "requires": {
    +            "color-convert": "^1.9.0"
    +          }
    +        },
    +        "array-back": {
    +          "version": "2.0.0",
    +          "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
    +          "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
    +          "dev": true,
    +          "requires": {
    +            "typical": "^2.6.1"
    +          }
    +        },
    +        "chalk": {
    +          "version": "2.4.2",
    +          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +          "dev": true,
    +          "requires": {
    +            "ansi-styles": "^3.2.1",
    +            "escape-string-regexp": "^1.0.5",
    +            "supports-color": "^5.3.0"
    +          }
    +        },
    +        "color-convert": {
    +          "version": "1.9.3",
    +          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +          "dev": true,
    +          "requires": {
    +            "color-name": "1.1.3"
    +          }
    +        },
    +        "color-name": {
    +          "version": "1.1.3",
    +          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +          "dev": true
    +        },
    +        "escape-string-regexp": {
    +          "version": "1.0.5",
    +          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    +          "dev": true
    +        },
    +        "has-flag": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +          "dev": true
    +        },
    +        "supports-color": {
    +          "version": "5.5.0",
    +          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +          "dev": true,
    +          "requires": {
    +            "has-flag": "^3.0.0"
    +          }
    +        },
    +        "typical": {
    +          "version": "2.6.1",
    +          "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    +          "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "concat-map": {
    +      "version": "0.0.1",
    +      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
    +      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    +    },
    +    "configstore": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
    +      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
    +      "dev": true,
    +      "requires": {
    +        "dot-prop": "^5.2.0",
    +        "graceful-fs": "^4.1.2",
    +        "make-dir": "^3.0.0",
    +        "unique-string": "^2.0.0",
    +        "write-file-atomic": "^3.0.0",
    +        "xdg-basedir": "^4.0.0"
    +      }
    +    },
    +    "content-type": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
    +      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
    +      "dev": true
    +    },
    +    "cookie": {
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
    +      "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
    +    },
    +    "cookie-signature": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz",
    +      "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A=="
    +    },
    +    "core-util-is": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
    +      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
    +      "dev": true
    +    },
    +    "cpr": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz",
    +      "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=",
    +      "dev": true,
    +      "requires": {
    +        "graceful-fs": "^4.1.5",
    +        "minimist": "^1.2.0",
    +        "mkdirp": "~0.5.1",
    +        "rimraf": "^2.5.4"
    +      },
    +      "dependencies": {
    +        "rimraf": {
    +          "version": "2.7.1",
    +          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
    +          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
    +          "dev": true,
    +          "requires": {
    +            "glob": "^7.1.3"
    +          }
    +        }
    +      }
    +    },
    +    "create-eslint-index": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/create-eslint-index/-/create-eslint-index-1.0.0.tgz",
    +      "integrity": "sha1-2VQ3LYbVeS/NZ+nyt5GxqxYkEbs=",
    +      "dev": true,
    +      "requires": {
    +        "lodash.get": "^4.3.0"
    +      }
    +    },
    +    "cross-env": {
    +      "version": "7.0.3",
    +      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
    +      "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
    +      "dev": true,
    +      "requires": {
    +        "cross-spawn": "^7.0.1"
    +      }
    +    },
    +    "cross-spawn": {
    +      "version": "7.0.3",
    +      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
    +      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
    +      "dev": true,
    +      "requires": {
    +        "path-key": "^3.1.0",
    +        "shebang-command": "^2.0.0",
    +        "which": "^2.0.1"
    +      }
    +    },
    +    "crypto-random-string": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
    +      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
    +      "dev": true
    +    },
    +    "csrf": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz",
    +      "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==",
    +      "requires": {
    +        "rndm": "1.2.0",
    +        "tsscmp": "1.0.6",
    +        "uid-safe": "2.1.5"
    +      }
    +    },
    +    "date-format": {
    +      "version": "0.0.2",
    +      "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.2.tgz",
    +      "integrity": "sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE=",
    +      "dev": true
    +    },
    +    "debug": {
    +      "version": "2.6.9",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
    +      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
    +      "dev": true,
    +      "requires": {
    +        "ms": "2.0.0"
    +      }
    +    },
    +    "decamelize": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
    +      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
    +      "dev": true
    +    },
    +    "decamelize-keys": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
    +      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
    +      "dev": true,
    +      "requires": {
    +        "decamelize": "^1.1.0",
    +        "map-obj": "^1.0.0"
    +      },
    +      "dependencies": {
    +        "map-obj": {
    +          "version": "1.0.1",
    +          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
    +          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "decompress-response": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
    +      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
    +      "dev": true,
    +      "requires": {
    +        "mimic-response": "^1.0.0"
    +      }
    +    },
    +    "deep-equal": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
    +      "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.0",
    +        "es-get-iterator": "^1.1.1",
    +        "get-intrinsic": "^1.0.1",
    +        "is-arguments": "^1.0.4",
    +        "is-date-object": "^1.0.2",
    +        "is-regex": "^1.1.1",
    +        "isarray": "^2.0.5",
    +        "object-is": "^1.1.4",
    +        "object-keys": "^1.1.1",
    +        "object.assign": "^4.1.2",
    +        "regexp.prototype.flags": "^1.3.0",
    +        "side-channel": "^1.0.3",
    +        "which-boxed-primitive": "^1.0.1",
    +        "which-collection": "^1.0.1",
    +        "which-typed-array": "^1.1.2"
    +      },
    +      "dependencies": {
    +        "isarray": {
    +          "version": "2.0.5",
    +          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
    +          "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "deep-extend": {
    +      "version": "0.6.0",
    +      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
    +      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
    +      "dev": true
    +    },
    +    "deep-is": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
    +      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
    +      "dev": true
    +    },
    +    "defer-to-connect": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
    +      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
    +      "dev": true
    +    },
    +    "deferred-leveldown": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz",
    +      "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==",
    +      "dev": true,
    +      "requires": {
    +        "abstract-leveldown": "~6.2.1",
    +        "inherits": "^2.0.3"
    +      }
    +    },
    +    "define-properties": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
    +      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
    +      "dev": true,
    +      "requires": {
    +        "object-keys": "^1.0.12"
    +      }
    +    },
    +    "defined": {
    +      "version": "0.0.0",
    +      "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz",
    +      "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=",
    +      "dev": true
    +    },
    +    "depd": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
    +      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
    +      "dev": true
    +    },
    +    "depstatus": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/depstatus/-/depstatus-1.1.1.tgz",
    +      "integrity": "sha512-QT4i2Ql8RS1ttcj7zo4RzYvKz+/eOOIh6N7CXHqfDqC5ZX1hfx5KX6T88gy/j2UWP2x2ytjSoFBl+XW0gVZMug==",
    +      "dev": true,
    +      "requires": {
    +        "semver": "^7.3.2"
    +      }
    +    },
    +    "destroy": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
    +      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
    +      "dev": true
    +    },
    +    "dictionary-en-au": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.3.0.tgz",
    +      "integrity": "sha512-KoEotpXPCyCgZ5DHlexHyzFfNwPnv9VupeCrp6r+JrtEkycPmZYbQiXF+cXz9NJr1gXy0AMEpzZ8UfxF40+8OQ==",
    +      "dev": true
    +    },
    +    "dictionary-en-ca": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.3.0.tgz",
    +      "integrity": "sha512-5p6B2+GLByVz3Gvb42Y5hTdFBNxJhgG7XRVM74J7hcp+DvtAfOrufTZFfkux9t0qWOjORZoDCmDI6uKiX8qeuQ==",
    +      "dev": true
    +    },
    +    "dictionary-en-gb": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.3.0.tgz",
    +      "integrity": "sha512-P/J2VQp/hDsMTfJhmIYPUBxZqezWuDaUzSgb6oW7JLpUV2So9jCXbR5TaUYXwfO50ZXPYEzQqQHPQK3pKcs7Rg==",
    +      "dev": true
    +    },
    +    "dictionary-en-us": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-us/-/dictionary-en-us-2.2.1.tgz",
    +      "integrity": "sha512-Z8mycV0ywTfjbUTi0JZfQHqBZhu4CYFtpf7KluSGpt3xHpFlal2S/hiK50tlPynOtR5K3pG5wCradnz1yxwOHA==",
    +      "dev": true
    +    },
    +    "dictionary-en-za": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.0.4.tgz",
    +      "integrity": "sha512-EgI61DvQsrnIFBmmCz7GB9P/wkCnKnZgKRXyYpbkZomnY0I4vDfNZtjaX81lwb9s+eudP9QJ+8sMzK7eoUapEg==",
    +      "dev": true
    +    },
    +    "dictionary-vi": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.1.3.tgz",
    +      "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==",
    +      "dev": true
    +    },
    +    "dir-glob": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
    +      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
    +      "dev": true,
    +      "requires": {
    +        "path-type": "^4.0.0"
    +      }
    +    },
    +    "doctrine": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
    +      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
    +      "dev": true,
    +      "requires": {
    +        "esutils": "^2.0.2"
    +      }
    +    },
    +    "dom-serializer": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
    +      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
    +      "dev": true,
    +      "requires": {
    +        "domelementtype": "^2.0.1",
    +        "domhandler": "^4.2.0",
    +        "entities": "^2.0.0"
    +      }
    +    },
    +    "domelementtype": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
    +      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
    +      "dev": true
    +    },
    +    "domhandler": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
    +      "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
    +      "dev": true,
    +      "requires": {
    +        "domelementtype": "^2.2.0"
    +      }
    +    },
    +    "domutils": {
    +      "version": "2.8.0",
    +      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    +      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +      "dev": true,
    +      "requires": {
    +        "dom-serializer": "^1.0.1",
    +        "domelementtype": "^2.2.0",
    +        "domhandler": "^4.2.0"
    +      }
    +    },
    +    "dot-prop": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
    +      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
    +      "dev": true,
    +      "requires": {
    +        "is-obj": "^2.0.0"
    +      }
    +    },
    +    "dotenv": {
    +      "version": "10.0.0",
    +      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
    +      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
    +      "dev": true
    +    },
    +    "dotignore": {
    +      "version": "0.1.2",
    +      "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz",
    +      "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==",
    +      "dev": true,
    +      "requires": {
    +        "minimatch": "^3.0.4"
    +      }
    +    },
    +    "duplexer3": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
    +      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
    +      "dev": true
    +    },
    +    "dynalite": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz",
    +      "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==",
    +      "dev": true,
    +      "requires": {
    +        "async": "^2.6.3",
    +        "big.js": "^5.2.2",
    +        "buffer-crc32": "^0.2.13",
    +        "lazy": "^1.0.11",
    +        "leveldown": "^5.2.1",
    +        "levelup": "^4.4.0",
    +        "lock": "^1.1.0",
    +        "memdown": "^5.1.0",
    +        "minimist": "^1.2.5",
    +        "once": "^1.4.0",
    +        "subleveldown": "^5.0.0"
    +      }
    +    },
    +    "ee-first": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
    +      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
    +      "dev": true
    +    },
    +    "emoji-regex": {
    +      "version": "8.0.0",
    +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
    +      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
    +      "dev": true
    +    },
    +    "encodeurl": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
    +      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
    +      "dev": true
    +    },
    +    "encoding-down": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz",
    +      "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==",
    +      "dev": true,
    +      "requires": {
    +        "abstract-leveldown": "^6.2.1",
    +        "inherits": "^2.0.3",
    +        "level-codec": "^9.0.0",
    +        "level-errors": "^2.0.0"
    +      }
    +    },
    +    "end-of-stream": {
    +      "version": "1.4.4",
    +      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
    +      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
    +      "dev": true,
    +      "requires": {
    +        "once": "^1.4.0"
    +      }
    +    },
    +    "enquirer": {
    +      "version": "2.3.6",
    +      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
    +      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
    +      "dev": true,
    +      "requires": {
    +        "ansi-colors": "^4.1.1"
    +      }
    +    },
    +    "entities": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
    +      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w=="
    +    },
    +    "errno": {
    +      "version": "0.1.8",
    +      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
    +      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
    +      "dev": true,
    +      "requires": {
    +        "prr": "~1.0.1"
    +      }
    +    },
    +    "error-ex": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
    +      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
    +      "dev": true,
    +      "requires": {
    +        "is-arrayish": "^0.2.1"
    +      }
    +    },
    +    "es-abstract": {
    +      "version": "1.19.1",
    +      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
    +      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "es-to-primitive": "^1.2.1",
    +        "function-bind": "^1.1.1",
    +        "get-intrinsic": "^1.1.1",
    +        "get-symbol-description": "^1.0.0",
    +        "has": "^1.0.3",
    +        "has-symbols": "^1.0.2",
    +        "internal-slot": "^1.0.3",
    +        "is-callable": "^1.2.4",
    +        "is-negative-zero": "^2.0.1",
    +        "is-regex": "^1.1.4",
    +        "is-shared-array-buffer": "^1.0.1",
    +        "is-string": "^1.0.7",
    +        "is-weakref": "^1.0.1",
    +        "object-inspect": "^1.11.0",
    +        "object-keys": "^1.1.1",
    +        "object.assign": "^4.1.2",
    +        "string.prototype.trimend": "^1.0.4",
    +        "string.prototype.trimstart": "^1.0.4",
    +        "unbox-primitive": "^1.0.1"
    +      }
    +    },
    +    "es-get-iterator": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
    +      "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.0",
    +        "has-symbols": "^1.0.1",
    +        "is-arguments": "^1.1.0",
    +        "is-map": "^2.0.2",
    +        "is-set": "^2.0.2",
    +        "is-string": "^1.0.5",
    +        "isarray": "^2.0.5"
    +      },
    +      "dependencies": {
    +        "isarray": {
    +          "version": "2.0.5",
    +          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
    +          "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "es-to-primitive": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
    +      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
    +      "dev": true,
    +      "requires": {
    +        "is-callable": "^1.1.4",
    +        "is-date-object": "^1.0.1",
    +        "is-symbol": "^1.0.2"
    +      }
    +    },
    +    "escape-goat": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
    +      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
    +      "dev": true
    +    },
    +    "escape-html": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
    +      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
    +      "dev": true
    +    },
    +    "escape-string-regexp": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
    +      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
    +      "dev": true
    +    },
    +    "eslint": {
    +      "version": "8.6.0",
    +      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz",
    +      "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==",
    +      "dev": true,
    +      "requires": {
    +        "@eslint/eslintrc": "^1.0.5",
    +        "@humanwhocodes/config-array": "^0.9.2",
    +        "ajv": "^6.10.0",
    +        "chalk": "^4.0.0",
    +        "cross-spawn": "^7.0.2",
    +        "debug": "^4.3.2",
    +        "doctrine": "^3.0.0",
    +        "enquirer": "^2.3.5",
    +        "escape-string-regexp": "^4.0.0",
    +        "eslint-scope": "^7.1.0",
    +        "eslint-utils": "^3.0.0",
    +        "eslint-visitor-keys": "^3.1.0",
    +        "espree": "^9.3.0",
    +        "esquery": "^1.4.0",
    +        "esutils": "^2.0.2",
    +        "fast-deep-equal": "^3.1.3",
    +        "file-entry-cache": "^6.0.1",
    +        "functional-red-black-tree": "^1.0.1",
    +        "glob-parent": "^6.0.1",
    +        "globals": "^13.6.0",
    +        "ignore": "^4.0.6",
    +        "import-fresh": "^3.0.0",
    +        "imurmurhash": "^0.1.4",
    +        "is-glob": "^4.0.0",
    +        "js-yaml": "^4.1.0",
    +        "json-stable-stringify-without-jsonify": "^1.0.1",
    +        "levn": "^0.4.1",
    +        "lodash.merge": "^4.6.2",
    +        "minimatch": "^3.0.4",
    +        "natural-compare": "^1.4.0",
    +        "optionator": "^0.9.1",
    +        "progress": "^2.0.0",
    +        "regexpp": "^3.2.0",
    +        "semver": "^7.2.1",
    +        "strip-ansi": "^6.0.1",
    +        "strip-json-comments": "^3.1.0",
    +        "text-table": "^0.2.0",
    +        "v8-compile-cache": "^2.0.3"
    +      },
    +      "dependencies": {
    +        "debug": {
    +          "version": "4.3.2",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    +          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +          "dev": true,
    +          "requires": {
    +            "ms": "2.1.2"
    +          }
    +        },
    +        "ms": {
    +          "version": "2.1.2",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "eslint-ast-utils": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz",
    +      "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==",
    +      "dev": true,
    +      "requires": {
    +        "lodash.get": "^4.4.2",
    +        "lodash.zip": "^4.2.0"
    +      }
    +    },
    +    "eslint-import-resolver-node": {
    +      "version": "0.3.6",
    +      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
    +      "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
    +      "dev": true,
    +      "requires": {
    +        "debug": "^3.2.7",
    +        "resolve": "^1.20.0"
    +      },
    +      "dependencies": {
    +        "debug": {
    +          "version": "3.2.7",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    +          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    +          "dev": true,
    +          "requires": {
    +            "ms": "^2.1.1"
    +          }
    +        },
    +        "ms": {
    +          "version": "2.1.3",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "eslint-module-utils": {
    +      "version": "2.7.1",
    +      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
    +      "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
    +      "dev": true,
    +      "requires": {
    +        "debug": "^3.2.7",
    +        "find-up": "^2.1.0",
    +        "pkg-dir": "^2.0.0"
    +      },
    +      "dependencies": {
    +        "debug": {
    +          "version": "3.2.7",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    +          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    +          "dev": true,
    +          "requires": {
    +            "ms": "^2.1.1"
    +          }
    +        },
    +        "ms": {
    +          "version": "2.1.3",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "eslint-plugin-filenames": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz",
    +      "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==",
    +      "dev": true,
    +      "requires": {
    +        "lodash.camelcase": "4.3.0",
    +        "lodash.kebabcase": "4.1.1",
    +        "lodash.snakecase": "4.1.1",
    +        "lodash.upperfirst": "4.3.1"
    +      }
    +    },
    +    "eslint-plugin-fp": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-fp/-/eslint-plugin-fp-2.3.0.tgz",
    +      "integrity": "sha1-N20qEIcQ6YGYC9w4deO5kg2gSJw=",
    +      "dev": true,
    +      "requires": {
    +        "create-eslint-index": "^1.0.0",
    +        "eslint-ast-utils": "^1.0.0",
    +        "lodash": "^4.13.1",
    +        "req-all": "^0.1.0"
    +      }
    +    },
    +    "eslint-plugin-import": {
    +      "version": "2.25.2",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz",
    +      "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==",
    +      "dev": true,
    +      "requires": {
    +        "array-includes": "^3.1.4",
    +        "array.prototype.flat": "^1.2.5",
    +        "debug": "^2.6.9",
    +        "doctrine": "^2.1.0",
    +        "eslint-import-resolver-node": "^0.3.6",
    +        "eslint-module-utils": "^2.7.0",
    +        "has": "^1.0.3",
    +        "is-core-module": "^2.7.0",
    +        "is-glob": "^4.0.3",
    +        "minimatch": "^3.0.4",
    +        "object.values": "^1.1.5",
    +        "resolve": "^1.20.0",
    +        "tsconfig-paths": "^3.11.0"
    +      },
    +      "dependencies": {
    +        "doctrine": {
    +          "version": "2.1.0",
    +          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
    +          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
    +          "dev": true,
    +          "requires": {
    +            "esutils": "^2.0.2"
    +          }
    +        }
    +      }
    +    },
    +    "eslint-scope": {
    +      "version": "7.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
    +      "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
    +      "dev": true,
    +      "requires": {
    +        "esrecurse": "^4.3.0",
    +        "estraverse": "^5.2.0"
    +      }
    +    },
    +    "eslint-utils": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
    +      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
    +      "dev": true,
    +      "requires": {
    +        "eslint-visitor-keys": "^2.0.0"
    +      },
    +      "dependencies": {
    +        "eslint-visitor-keys": {
    +          "version": "2.1.0",
    +          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
    +          "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "eslint-visitor-keys": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
    +      "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
    +      "dev": true
    +    },
    +    "esm": {
    +      "version": "3.2.25",
    +      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
    +      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="
    +    },
    +    "espree": {
    +      "version": "9.3.0",
    +      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
    +      "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
    +      "dev": true,
    +      "requires": {
    +        "acorn": "^8.7.0",
    +        "acorn-jsx": "^5.3.1",
    +        "eslint-visitor-keys": "^3.1.0"
    +      }
    +    },
    +    "esprima": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
    +      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
    +    },
    +    "esquery": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
    +      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
    +      "dev": true,
    +      "requires": {
    +        "estraverse": "^5.1.0"
    +      }
    +    },
    +    "esrecurse": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
    +      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
    +      "dev": true,
    +      "requires": {
    +        "estraverse": "^5.2.0"
    +      }
    +    },
    +    "estraverse": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
    +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
    +      "dev": true
    +    },
    +    "esutils": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
    +      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
    +      "dev": true
    +    },
    +    "etag": {
    +      "version": "1.8.1",
    +      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
    +      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
    +      "dev": true
    +    },
    +    "event-target-shim": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
    +      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
    +      "dev": true
    +    },
    +    "eventemitter3": {
    +      "version": "4.0.7",
    +      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
    +      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
    +      "dev": true
    +    },
    +    "events": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
    +      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
    +      "dev": true
    +    },
    +    "events-to-array": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz",
    +      "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=",
    +      "dev": true
    +    },
    +    "extend": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
    +      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
    +      "dev": true
    +    },
    +    "fast-deep-equal": {
    +      "version": "3.1.3",
    +      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
    +      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
    +      "dev": true
    +    },
    +    "fast-diff": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
    +      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
    +      "dev": true
    +    },
    +    "fast-glob": {
    +      "version": "3.2.7",
    +      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
    +      "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
    +      "dev": true,
    +      "requires": {
    +        "@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"
    +      },
    +      "dependencies": {
    +        "glob-parent": {
    +          "version": "5.1.2",
    +          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
    +          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
    +          "dev": true,
    +          "requires": {
    +            "is-glob": "^4.0.1"
    +          }
    +        }
    +      }
    +    },
    +    "fast-json-stable-stringify": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
    +      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
    +      "dev": true
    +    },
    +    "fast-levenshtein": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
    +      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
    +      "dev": true
    +    },
    +    "fast-safe-stringify": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
    +      "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
    +      "dev": true
    +    },
    +    "fastq": {
    +      "version": "1.13.0",
    +      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
    +      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
    +      "dev": true,
    +      "requires": {
    +        "reusify": "^1.0.4"
    +      }
    +    },
    +    "fault": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
    +      "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
    +      "dev": true,
    +      "requires": {
    +        "format": "^0.2.0"
    +      }
    +    },
    +    "file-entry-cache": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
    +      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
    +      "dev": true,
    +      "requires": {
    +        "flat-cache": "^3.0.4"
    +      }
    +    },
    +    "fill-range": {
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
    +      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
    +      "dev": true,
    +      "requires": {
    +        "to-regex-range": "^5.0.1"
    +      }
    +    },
    +    "finalhandler": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
    +      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
    +      "dev": true,
    +      "requires": {
    +        "debug": "2.6.9",
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "on-finished": "~2.3.0",
    +        "parseurl": "~1.3.3",
    +        "statuses": "~1.5.0",
    +        "unpipe": "~1.0.0"
    +      }
    +    },
    +    "find-replace": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
    +      "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
    +      "dev": true,
    +      "requires": {
    +        "array-back": "^3.0.1"
    +      }
    +    },
    +    "find-up": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
    +      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
    +      "dev": true,
    +      "requires": {
    +        "locate-path": "^2.0.0"
    +      }
    +    },
    +    "flat-cache": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
    +      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
    +      "dev": true,
    +      "requires": {
    +        "flatted": "^3.1.0",
    +        "rimraf": "^3.0.2"
    +      }
    +    },
    +    "flatted": {
    +      "version": "3.2.2",
    +      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
    +      "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
    +      "dev": true
    +    },
    +    "follow-redirects": {
    +      "version": "1.14.6",
    +      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz",
    +      "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==",
    +      "dev": true
    +    },
    +    "for-each": {
    +      "version": "0.3.3",
    +      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
    +      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
    +      "dev": true,
    +      "requires": {
    +        "is-callable": "^1.1.3"
    +      }
    +    },
    +    "foreach": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
    +      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
    +      "dev": true
    +    },
    +    "format": {
    +      "version": "0.2.2",
    +      "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
    +      "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=",
    +      "dev": true
    +    },
    +    "fresh": {
    +      "version": "0.5.2",
    +      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
    +      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
    +      "dev": true
    +    },
    +    "front-matter": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz",
    +      "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==",
    +      "requires": {
    +        "js-yaml": "^3.13.1"
    +      },
    +      "dependencies": {
    +        "argparse": {
    +          "version": "1.0.10",
    +          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    +          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    +          "requires": {
    +            "sprintf-js": "~1.0.2"
    +          }
    +        },
    +        "js-yaml": {
    +          "version": "3.14.1",
    +          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    +          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    +          "requires": {
    +            "argparse": "^1.0.7",
    +            "esprima": "^4.0.0"
    +          }
    +        }
    +      }
    +    },
    +    "fs-extra": {
    +      "version": "10.0.0",
    +      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
    +      "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
    +      "dev": true,
    +      "requires": {
    +        "graceful-fs": "^4.2.0",
    +        "jsonfile": "^6.0.1",
    +        "universalify": "^2.0.0"
    +      }
    +    },
    +    "fs.realpath": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
    +      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
    +    },
    +    "function-bind": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
    +      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
    +      "dev": true
    +    },
    +    "functional-red-black-tree": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
    +      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
    +      "dev": true
    +    },
    +    "gar": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz",
    +      "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==",
    +      "dev": true
    +    },
    +    "gaxios": {
    +      "version": "4.3.2",
    +      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
    +      "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
    +      "dev": true,
    +      "requires": {
    +        "abort-controller": "^3.0.0",
    +        "extend": "^3.0.2",
    +        "https-proxy-agent": "^5.0.0",
    +        "is-stream": "^2.0.0",
    +        "node-fetch": "^2.6.1"
    +      }
    +    },
    +    "gemoji": {
    +      "version": "4.2.1",
    +      "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-4.2.1.tgz",
    +      "integrity": "sha512-V9lUpRSn+KQGavZx8Pk+6mxG3kaz21ae2kTCXuT36KaRPNgYU8eHtj/RcUCNFVvmwppsYYz3nnNS9lmcP5kTsg==",
    +      "dev": true
    +    },
    +    "get-folder-size": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz",
    +      "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==",
    +      "dev": true,
    +      "requires": {
    +        "gar": "^1.0.4",
    +        "tiny-each-async": "2.0.3"
    +      }
    +    },
    +    "get-intrinsic": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
    +      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
    +      "dev": true,
    +      "requires": {
    +        "function-bind": "^1.1.1",
    +        "has": "^1.0.3",
    +        "has-symbols": "^1.0.1"
    +      }
    +    },
    +    "get-package-type": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
    +      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
    +      "dev": true
    +    },
    +    "get-stream": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
    +      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
    +      "dev": true,
    +      "requires": {
    +        "pump": "^3.0.0"
    +      }
    +    },
    +    "get-symbol-description": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
    +      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.1"
    +      }
    +    },
    +    "glob": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
    +      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
    +      "requires": {
    +        "fs.realpath": "^1.0.0",
    +        "inflight": "^1.0.4",
    +        "inherits": "2",
    +        "minimatch": "^3.0.4",
    +        "once": "^1.3.0",
    +        "path-is-absolute": "^1.0.0"
    +      }
    +    },
    +    "glob-parent": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
    +      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
    +      "dev": true,
    +      "requires": {
    +        "is-glob": "^4.0.3"
    +      }
    +    },
    +    "global-dirs": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
    +      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
    +      "dev": true,
    +      "requires": {
    +        "ini": "2.0.0"
    +      }
    +    },
    +    "globals": {
    +      "version": "13.12.0",
    +      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
    +      "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
    +      "dev": true,
    +      "requires": {
    +        "type-fest": "^0.20.2"
    +      }
    +    },
    +    "globby": {
    +      "version": "11.0.4",
    +      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
    +      "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
    +      "dev": true,
    +      "requires": {
    +        "array-union": "^2.1.0",
    +        "dir-glob": "^3.0.1",
    +        "fast-glob": "^3.1.1",
    +        "ignore": "^5.1.4",
    +        "merge2": "^1.3.0",
    +        "slash": "^3.0.0"
    +      },
    +      "dependencies": {
    +        "ignore": {
    +          "version": "5.1.9",
    +          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
    +          "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "got": {
    +      "version": "9.6.0",
    +      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
    +      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
    +      "dev": true,
    +      "requires": {
    +        "@sindresorhus/is": "^0.14.0",
    +        "@szmarczak/http-timer": "^1.1.2",
    +        "cacheable-request": "^6.0.0",
    +        "decompress-response": "^3.3.0",
    +        "duplexer3": "^0.1.4",
    +        "get-stream": "^4.1.0",
    +        "lowercase-keys": "^1.0.1",
    +        "mimic-response": "^1.0.1",
    +        "p-cancelable": "^1.0.0",
    +        "to-readable-stream": "^1.0.0",
    +        "url-parse-lax": "^3.0.0"
    +      }
    +    },
    +    "graceful-fs": {
    +      "version": "4.2.8",
    +      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
    +      "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
    +    },
    +    "hard-rejection": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
    +      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
    +      "dev": true
    +    },
    +    "has": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
    +      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
    +      "dev": true,
    +      "requires": {
    +        "function-bind": "^1.1.1"
    +      }
    +    },
    +    "has-bigints": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
    +      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
    +      "dev": true
    +    },
    +    "has-dynamic-import": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz",
    +      "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.1"
    +      }
    +    },
    +    "has-flag": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
    +      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
    +    },
    +    "has-symbols": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
    +      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
    +      "dev": true
    +    },
    +    "has-tostringtag": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
    +      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
    +      "dev": true,
    +      "requires": {
    +        "has-symbols": "^1.0.2"
    +      }
    +    },
    +    "has-yarn": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
    +      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
    +      "dev": true
    +    },
    +    "highlight.js": {
    +      "version": "11.4.0",
    +      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.4.0.tgz",
    +      "integrity": "sha512-nawlpCBCSASs7EdvZOYOYVkJpGmAOKMYZgZtUqSRqodZE0GRVcFKwo1RcpeOemqh9hyttTdd5wDBwHkuSyUfnA=="
    +    },
    +    "hosted-git-info": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
    +      "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
    +      "dev": true,
    +      "requires": {
    +        "lru-cache": "^6.0.0"
    +      }
    +    },
    +    "htmlparser2": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
    +      "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
    +      "dev": true,
    +      "requires": {
    +        "domelementtype": "^2.0.1",
    +        "domhandler": "^4.2.2",
    +        "domutils": "^2.8.0",
    +        "entities": "^3.0.1"
    +      },
    +      "dependencies": {
    +        "entities": {
    +          "version": "3.0.1",
    +          "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
    +          "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "http-cache-semantics": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
    +      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
    +      "dev": true
    +    },
    +    "http-errors": {
    +      "version": "1.8.1",
    +      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
    +      "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
    +      "dev": true,
    +      "requires": {
    +        "depd": "~1.1.2",
    +        "inherits": "2.0.4",
    +        "setprototypeof": "1.2.0",
    +        "statuses": ">= 1.5.0 < 2",
    +        "toidentifier": "1.0.1"
    +      }
    +    },
    +    "http-proxy": {
    +      "version": "1.18.1",
    +      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
    +      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
    +      "dev": true,
    +      "requires": {
    +        "eventemitter3": "^4.0.0",
    +        "follow-redirects": "^1.0.0",
    +        "requires-port": "^1.0.0"
    +      }
    +    },
    +    "https-proxy-agent": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
    +      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
    +      "dev": true,
    +      "requires": {
    +        "agent-base": "6",
    +        "debug": "4"
    +      },
    +      "dependencies": {
    +        "debug": {
    +          "version": "4.3.2",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    +          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +          "dev": true,
    +          "requires": {
    +            "ms": "2.1.2"
    +          }
    +        },
    +        "ms": {
    +          "version": "2.1.2",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "iconv-lite": {
    +      "version": "0.4.24",
    +      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
    +      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
    +      "dev": true,
    +      "requires": {
    +        "safer-buffer": ">= 2.1.2 < 3"
    +      }
    +    },
    +    "ieee754": {
    +      "version": "1.1.13",
    +      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
    +      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
    +      "dev": true
    +    },
    +    "ignore": {
    +      "version": "4.0.6",
    +      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
    +      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
    +      "dev": true
    +    },
    +    "immediate": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
    +      "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
    +      "dev": true
    +    },
    +    "import-fresh": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
    +      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
    +      "dev": true,
    +      "requires": {
    +        "parent-module": "^1.0.0",
    +        "resolve-from": "^4.0.0"
    +      }
    +    },
    +    "import-lazy": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
    +      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
    +      "dev": true
    +    },
    +    "imurmurhash": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
    +      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
    +      "dev": true
    +    },
    +    "indent-string": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
    +      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
    +      "dev": true
    +    },
    +    "inflight": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
    +      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
    +      "requires": {
    +        "once": "^1.3.0",
    +        "wrappy": "1"
    +      }
    +    },
    +    "inherits": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
    +      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    +    },
    +    "ini": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
    +      "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
    +      "dev": true
    +    },
    +    "insync": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/insync/-/insync-2.1.1.tgz",
    +      "integrity": "sha1-IuJsYRITA8BvUdNaPM9tj8HpFMQ=",
    +      "dev": true
    +    },
    +    "internal-slot": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
    +      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
    +      "dev": true,
    +      "requires": {
    +        "get-intrinsic": "^1.1.0",
    +        "has": "^1.0.3",
    +        "side-channel": "^1.0.4"
    +      }
    +    },
    +    "is-alphabetical": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
    +      "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
    +      "dev": true
    +    },
    +    "is-alphanumerical": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
    +      "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
    +      "dev": true,
    +      "requires": {
    +        "is-alphabetical": "^1.0.0",
    +        "is-decimal": "^1.0.0"
    +      }
    +    },
    +    "is-arguments": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
    +      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      }
    +    },
    +    "is-arrayish": {
    +      "version": "0.2.1",
    +      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
    +      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
    +      "dev": true
    +    },
    +    "is-bigint": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
    +      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
    +      "dev": true,
    +      "requires": {
    +        "has-bigints": "^1.0.1"
    +      }
    +    },
    +    "is-boolean-object": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
    +      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      }
    +    },
    +    "is-buffer": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
    +      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
    +      "dev": true
    +    },
    +    "is-callable": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
    +      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
    +      "dev": true
    +    },
    +    "is-ci": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
    +      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
    +      "dev": true,
    +      "requires": {
    +        "ci-info": "^2.0.0"
    +      }
    +    },
    +    "is-core-module": {
    +      "version": "2.8.0",
    +      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
    +      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
    +      "dev": true,
    +      "requires": {
    +        "has": "^1.0.3"
    +      }
    +    },
    +    "is-date-object": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
    +      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
    +      "dev": true,
    +      "requires": {
    +        "has-tostringtag": "^1.0.0"
    +      }
    +    },
    +    "is-decimal": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
    +      "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
    +      "dev": true
    +    },
    +    "is-extglob": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
    +      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
    +      "dev": true
    +    },
    +    "is-fullwidth-code-point": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
    +      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
    +      "dev": true
    +    },
    +    "is-glob": {
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
    +      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
    +      "dev": true,
    +      "requires": {
    +        "is-extglob": "^2.1.1"
    +      }
    +    },
    +    "is-hexadecimal": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
    +      "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
    +      "dev": true
    +    },
    +    "is-installed-globally": {
    +      "version": "0.4.0",
    +      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
    +      "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
    +      "dev": true,
    +      "requires": {
    +        "global-dirs": "^3.0.0",
    +        "is-path-inside": "^3.0.2"
    +      }
    +    },
    +    "is-map": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
    +      "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
    +      "dev": true
    +    },
    +    "is-negative-zero": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
    +      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
    +      "dev": true
    +    },
    +    "is-npm": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
    +      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
    +      "dev": true
    +    },
    +    "is-number": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
    +      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
    +      "dev": true
    +    },
    +    "is-number-object": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
    +      "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
    +      "dev": true,
    +      "requires": {
    +        "has-tostringtag": "^1.0.0"
    +      }
    +    },
    +    "is-obj": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
    +      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
    +      "dev": true
    +    },
    +    "is-path-inside": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
    +      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
    +      "dev": true
    +    },
    +    "is-plain-obj": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
    +      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
    +      "dev": true
    +    },
    +    "is-regex": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
    +      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      }
    +    },
    +    "is-set": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
    +      "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
    +      "dev": true
    +    },
    +    "is-shared-array-buffer": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
    +      "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
    +      "dev": true
    +    },
    +    "is-stream": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
    +      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
    +      "dev": true
    +    },
    +    "is-string": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
    +      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
    +      "dev": true,
    +      "requires": {
    +        "has-tostringtag": "^1.0.0"
    +      }
    +    },
    +    "is-symbol": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
    +      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
    +      "dev": true,
    +      "requires": {
    +        "has-symbols": "^1.0.2"
    +      }
    +    },
    +    "is-typed-array": {
    +      "version": "1.1.8",
    +      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
    +      "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
    +      "dev": true,
    +      "requires": {
    +        "available-typed-arrays": "^1.0.5",
    +        "call-bind": "^1.0.2",
    +        "es-abstract": "^1.18.5",
    +        "foreach": "^2.0.5",
    +        "has-tostringtag": "^1.0.0"
    +      }
    +    },
    +    "is-typedarray": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
    +      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
    +      "dev": true
    +    },
    +    "is-weakmap": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
    +      "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
    +      "dev": true
    +    },
    +    "is-weakref": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
    +      "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.0"
    +      }
    +    },
    +    "is-weakset": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
    +      "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
    +      "dev": true
    +    },
    +    "is-yarn-global": {
    +      "version": "0.3.0",
    +      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
    +      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
    +      "dev": true
    +    },
    +    "isarray": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
    +      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
    +      "dev": true
    +    },
    +    "isexe": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
    +      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
    +      "dev": true
    +    },
    +    "jmespath": {
    +      "version": "0.15.0",
    +      "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz",
    +      "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=",
    +      "dev": true
    +    },
    +    "js-tokens": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
    +      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
    +      "dev": true
    +    },
    +    "js-yaml": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    +      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    +      "dev": true,
    +      "requires": {
    +        "argparse": "^2.0.1"
    +      }
    +    },
    +    "json-buffer": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
    +      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
    +      "dev": true
    +    },
    +    "json-parse-better-errors": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
    +      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
    +      "dev": true
    +    },
    +    "json-parse-even-better-errors": {
    +      "version": "2.3.1",
    +      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
    +      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
    +      "dev": true
    +    },
    +    "json-schema-traverse": {
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
    +      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
    +      "dev": true
    +    },
    +    "json-stable-stringify-without-jsonify": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
    +      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
    +      "dev": true
    +    },
    +    "json5": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
    +      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
    +      "dev": true,
    +      "requires": {
    +        "minimist": "^1.2.0"
    +      }
    +    },
    +    "jsonc": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz",
    +      "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==",
    +      "dev": true,
    +      "requires": {
    +        "fast-safe-stringify": "^2.0.6",
    +        "graceful-fs": "^4.1.15",
    +        "mkdirp": "^0.5.1",
    +        "parse-json": "^4.0.0",
    +        "strip-bom": "^4.0.0",
    +        "strip-json-comments": "^3.0.1"
    +      }
    +    },
    +    "jsonexport": {
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/jsonexport/-/jsonexport-3.2.0.tgz",
    +      "integrity": "sha512-GbO9ugb0YTZatPd/hqCGR0FSwbr82H6OzG04yzdrG7XOe4QZ0jhQ+kOsB29zqkzoYJLmLxbbrFiuwbQu891XnQ==",
    +      "dev": true
    +    },
    +    "jsonfile": {
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
    +      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
    +      "dev": true,
    +      "requires": {
    +        "graceful-fs": "^4.1.6",
    +        "universalify": "^2.0.0"
    +      }
    +    },
    +    "jszip": {
    +      "version": "3.7.1",
    +      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
    +      "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
    +      "dev": true,
    +      "requires": {
    +        "lie": "~3.3.0",
    +        "pako": "~1.0.2",
    +        "readable-stream": "~2.3.6",
    +        "set-immediate-shim": "~1.0.1"
    +      },
    +      "dependencies": {
    +        "readable-stream": {
    +          "version": "2.3.7",
    +          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
    +          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
    +          "dev": true,
    +          "requires": {
    +            "core-util-is": "~1.0.0",
    +            "inherits": "~2.0.3",
    +            "isarray": "~1.0.0",
    +            "process-nextick-args": "~2.0.0",
    +            "safe-buffer": "~5.1.1",
    +            "string_decoder": "~1.1.1",
    +            "util-deprecate": "~1.0.1"
    +          }
    +        },
    +        "safe-buffer": {
    +          "version": "5.1.2",
    +          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
    +          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
    +          "dev": true
    +        },
    +        "string_decoder": {
    +          "version": "1.1.1",
    +          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
    +          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
    +          "dev": true,
    +          "requires": {
    +            "safe-buffer": "~5.1.0"
    +          }
    +        }
    +      }
    +    },
    +    "junit-report-builder": {
    +      "version": "1.3.3",
    +      "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-1.3.3.tgz",
    +      "integrity": "sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw==",
    +      "dev": true,
    +      "requires": {
    +        "date-format": "0.0.2",
    +        "lodash": "^4.17.15",
    +        "mkdirp": "^0.5.0",
    +        "xmlbuilder": "^10.0.0"
    +      }
    +    },
    +    "keyv": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
    +      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
    +      "dev": true,
    +      "requires": {
    +        "json-buffer": "3.0.0"
    +      }
    +    },
    +    "kind-of": {
    +      "version": "6.0.3",
    +      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
    +      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
    +      "dev": true
    +    },
    +    "lambda-runtimes": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/lambda-runtimes/-/lambda-runtimes-1.1.1.tgz",
    +      "integrity": "sha512-kfsbICjnpI3HzKm+UwgmUemmsBreZhhVnaJtl+dTzilVx7f9reKEtegcSTaBVzjGHJfXv4jsQXu1v9y4KDliHg=="
    +    },
    +    "latest-version": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
    +      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
    +      "dev": true,
    +      "requires": {
    +        "package-json": "^6.3.0"
    +      }
    +    },
    +    "lazy": {
    +      "version": "1.0.11",
    +      "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz",
    +      "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=",
    +      "dev": true
    +    },
    +    "level-codec": {
    +      "version": "9.0.2",
    +      "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz",
    +      "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==",
    +      "dev": true,
    +      "requires": {
    +        "buffer": "^5.6.0"
    +      },
    +      "dependencies": {
    +        "buffer": {
    +          "version": "5.7.1",
    +          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    +          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    +          "dev": true,
    +          "requires": {
    +            "base64-js": "^1.3.1",
    +            "ieee754": "^1.1.13"
    +          }
    +        }
    +      }
    +    },
    +    "level-concat-iterator": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz",
    +      "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==",
    +      "dev": true
    +    },
    +    "level-errors": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz",
    +      "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==",
    +      "dev": true,
    +      "requires": {
    +        "errno": "~0.1.1"
    +      }
    +    },
    +    "level-iterator-stream": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz",
    +      "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==",
    +      "dev": true,
    +      "requires": {
    +        "inherits": "^2.0.4",
    +        "readable-stream": "^3.4.0",
    +        "xtend": "^4.0.2"
    +      }
    +    },
    +    "level-option-wrap": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz",
    +      "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=",
    +      "dev": true,
    +      "requires": {
    +        "defined": "~0.0.0"
    +      }
    +    },
    +    "level-supports": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
    +      "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
    +      "dev": true,
    +      "requires": {
    +        "xtend": "^4.0.2"
    +      }
    +    },
    +    "leveldown": {
    +      "version": "5.6.0",
    +      "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz",
    +      "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==",
    +      "dev": true,
    +      "optional": true,
    +      "requires": {
    +        "abstract-leveldown": "~6.2.1",
    +        "napi-macros": "~2.0.0",
    +        "node-gyp-build": "~4.1.0"
    +      }
    +    },
    +    "levelup": {
    +      "version": "4.4.0",
    +      "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz",
    +      "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==",
    +      "dev": true,
    +      "requires": {
    +        "deferred-leveldown": "~5.3.0",
    +        "level-errors": "~2.0.0",
    +        "level-iterator-stream": "~4.0.0",
    +        "level-supports": "~1.0.0",
    +        "xtend": "~4.0.0"
    +      }
    +    },
    +    "levn": {
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
    +      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
    +      "dev": true,
    +      "requires": {
    +        "prelude-ls": "^1.2.1",
    +        "type-check": "~0.4.0"
    +      }
    +    },
    +    "lie": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
    +      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
    +      "dev": true,
    +      "requires": {
    +        "immediate": "~3.0.5"
    +      },
    +      "dependencies": {
    +        "immediate": {
    +          "version": "3.0.6",
    +          "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
    +          "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "lines-and-columns": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
    +      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
    +      "dev": true
    +    },
    +    "linkify-it": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
    +      "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
    +      "requires": {
    +        "uc.micro": "^1.0.1"
    +      }
    +    },
    +    "linkinator": {
    +      "version": "2.16.2",
    +      "resolved": "https://registry.npmjs.org/linkinator/-/linkinator-2.16.2.tgz",
    +      "integrity": "sha512-5tHSz6gMN0z25+Pk4lZnU0Edr1lJLNuk+MCfQa2NxF4f1rfKS8Lo3JEwxTciVzwVHHdBpydAgmWYOgylNlwyDQ==",
    +      "dev": true,
    +      "requires": {
    +        "chalk": "^4.0.0",
    +        "escape-html": "^1.0.3",
    +        "gaxios": "^4.0.0",
    +        "glob": "^7.1.6",
    +        "htmlparser2": "^7.1.2",
    +        "jsonexport": "^3.0.0",
    +        "marked": "^2.0.0",
    +        "meow": "^9.0.0",
    +        "mime": "^3.0.0",
    +        "server-destroy": "^1.0.1",
    +        "update-notifier": "^5.0.0"
    +      },
    +      "dependencies": {
    +        "mime": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
    +          "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "locate-path": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
    +      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
    +      "dev": true,
    +      "requires": {
    +        "p-locate": "^2.0.0",
    +        "path-exists": "^3.0.0"
    +      }
    +    },
    +    "lock": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz",
    +      "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=",
    +      "dev": true
    +    },
    +    "lodash": {
    +      "version": "4.17.21",
    +      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
    +      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
    +      "dev": true
    +    },
    +    "lodash.camelcase": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
    +      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
    +      "dev": true
    +    },
    +    "lodash.get": {
    +      "version": "4.4.2",
    +      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
    +      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
    +      "dev": true
    +    },
    +    "lodash.includes": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
    +      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=",
    +      "dev": true
    +    },
    +    "lodash.kebabcase": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
    +      "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=",
    +      "dev": true
    +    },
    +    "lodash.merge": {
    +      "version": "4.6.2",
    +      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
    +      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
    +      "dev": true
    +    },
    +    "lodash.padend": {
    +      "version": "4.6.1",
    +      "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
    +      "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
    +      "dev": true
    +    },
    +    "lodash.snakecase": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
    +      "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=",
    +      "dev": true
    +    },
    +    "lodash.upperfirst": {
    +      "version": "4.3.1",
    +      "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
    +      "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=",
    +      "dev": true
    +    },
    +    "lodash.zip": {
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
    +      "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=",
    +      "dev": true
    +    },
    +    "longest-streak": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
    +      "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
    +      "dev": true
    +    },
    +    "lowercase-keys": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
    +      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
    +      "dev": true
    +    },
    +    "lru-cache": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
    +      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
    +      "dev": true,
    +      "requires": {
    +        "yallist": "^4.0.0"
    +      }
    +    },
    +    "ltgt": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
    +      "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=",
    +      "dev": true
    +    },
    +    "make-dir": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
    +      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
    +      "dev": true,
    +      "requires": {
    +        "semver": "^6.0.0"
    +      },
    +      "dependencies": {
    +        "semver": {
    +          "version": "6.3.0",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    +          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "map-obj": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
    +      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
    +      "dev": true
    +    },
    +    "markdown-it": {
    +      "version": "12.3.1",
    +      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.1.tgz",
    +      "integrity": "sha512-xu6ZyQc/W1mWRwBOZT5ePVVn77MhHYkWwiAMgy/oBwUwSD2fS5xND3oIN44RCqVMgpNbhKtzZs9B75mC7FHwTQ==",
    +      "requires": {
    +        "argparse": "^2.0.1",
    +        "entities": "~2.1.0",
    +        "linkify-it": "^3.0.1",
    +        "mdurl": "^1.0.1",
    +        "uc.micro": "^1.0.5"
    +      }
    +    },
    +    "markdown-it-external-anchor": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/markdown-it-external-anchor/-/markdown-it-external-anchor-1.0.0.tgz",
    +      "integrity": "sha512-d6Jb+kLciiv7uueM8q46k6szwr+B8QYg5ppiHVvfaS6hTx1KHpKwYDivmPAcNJYx0wUPEmRre9RgEnM5oHcdMw=="
    +    },
    +    "markdown-it-toc-and-anchor": {
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz",
    +      "integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==",
    +      "requires": {
    +        "clone": "^2.1.0",
    +        "uslug": "^1.0.4"
    +      }
    +    },
    +    "marked": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
    +      "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==",
    +      "dev": true
    +    },
    +    "mdast-util-from-markdown": {
    +      "version": "0.8.5",
    +      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
    +      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
    +      "dev": true,
    +      "requires": {
    +        "@types/mdast": "^3.0.0",
    +        "mdast-util-to-string": "^2.0.0",
    +        "micromark": "~2.11.0",
    +        "parse-entities": "^2.0.0",
    +        "unist-util-stringify-position": "^2.0.0"
    +      }
    +    },
    +    "mdast-util-frontmatter": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz",
    +      "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==",
    +      "dev": true,
    +      "requires": {
    +        "micromark-extension-frontmatter": "^0.2.0"
    +      }
    +    },
    +    "mdast-util-to-markdown": {
    +      "version": "0.6.5",
    +      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
    +      "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
    +      "dev": true,
    +      "requires": {
    +        "@types/unist": "^2.0.0",
    +        "longest-streak": "^2.0.0",
    +        "mdast-util-to-string": "^2.0.0",
    +        "parse-entities": "^2.0.0",
    +        "repeat-string": "^1.0.0",
    +        "zwitch": "^1.0.0"
    +      }
    +    },
    +    "mdast-util-to-nlcst": {
    +      "version": "3.2.3",
    +      "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz",
    +      "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==",
    +      "dev": true,
    +      "requires": {
    +        "nlcst-to-string": "^2.0.0",
    +        "repeat-string": "^1.5.2",
    +        "unist-util-position": "^3.0.0",
    +        "vfile-location": "^2.0.0"
    +      }
    +    },
    +    "mdast-util-to-string": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
    +      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
    +      "dev": true
    +    },
    +    "mdurl": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
    +      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
    +    },
    +    "media-typer": {
    +      "version": "0.3.0",
    +      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
    +      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
    +    },
    +    "memdown": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz",
    +      "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==",
    +      "dev": true,
    +      "requires": {
    +        "abstract-leveldown": "~6.2.1",
    +        "functional-red-black-tree": "~1.0.1",
    +        "immediate": "~3.2.3",
    +        "inherits": "~2.0.1",
    +        "ltgt": "~2.2.0",
    +        "safe-buffer": "~5.2.0"
    +      },
    +      "dependencies": {
    +        "immediate": {
    +          "version": "3.2.3",
    +          "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz",
    +          "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "meow": {
    +      "version": "9.0.0",
    +      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
    +      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
    +      "dev": true,
    +      "requires": {
    +        "@types/minimist": "^1.2.0",
    +        "camelcase-keys": "^6.2.2",
    +        "decamelize": "^1.2.0",
    +        "decamelize-keys": "^1.1.0",
    +        "hard-rejection": "^2.1.0",
    +        "minimist-options": "4.1.0",
    +        "normalize-package-data": "^3.0.0",
    +        "read-pkg-up": "^7.0.1",
    +        "redent": "^3.0.0",
    +        "trim-newlines": "^3.0.0",
    +        "type-fest": "^0.18.0",
    +        "yargs-parser": "^20.2.3"
    +      },
    +      "dependencies": {
    +        "type-fest": {
    +          "version": "0.18.1",
    +          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
    +          "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "merge2": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
    +      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
    +      "dev": true
    +    },
    +    "methods": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
    +      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
    +      "dev": true
    +    },
    +    "micromark": {
    +      "version": "2.11.4",
    +      "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
    +      "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
    +      "dev": true,
    +      "requires": {
    +        "debug": "^4.0.0",
    +        "parse-entities": "^2.0.0"
    +      },
    +      "dependencies": {
    +        "debug": {
    +          "version": "4.3.2",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    +          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +          "dev": true,
    +          "requires": {
    +            "ms": "2.1.2"
    +          }
    +        },
    +        "ms": {
    +          "version": "2.1.2",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "micromark-extension-frontmatter": {
    +      "version": "0.2.2",
    +      "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz",
    +      "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==",
    +      "dev": true,
    +      "requires": {
    +        "fault": "^1.0.0"
    +      }
    +    },
    +    "micromatch": {
    +      "version": "4.0.4",
    +      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
    +      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
    +      "dev": true,
    +      "requires": {
    +        "braces": "^3.0.1",
    +        "picomatch": "^2.2.3"
    +      }
    +    },
    +    "mime": {
    +      "version": "1.6.0",
    +      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
    +      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
    +      "dev": true
    +    },
    +    "mime-db": {
    +      "version": "1.51.0",
    +      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
    +      "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
    +    },
    +    "mime-types": {
    +      "version": "2.1.34",
    +      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
    +      "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
    +      "requires": {
    +        "mime-db": "1.51.0"
    +      }
    +    },
    +    "mimic-fn": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
    +      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
    +    },
    +    "mimic-response": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
    +      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
    +      "dev": true
    +    },
    +    "min-indent": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
    +      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
    +      "dev": true
    +    },
    +    "minimatch": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
    +      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
    +      "requires": {
    +        "brace-expansion": "^1.1.7"
    +      }
    +    },
    +    "minimist": {
    +      "version": "1.2.5",
    +      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
    +      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
    +      "dev": true
    +    },
    +    "minimist-options": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
    +      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
    +      "dev": true,
    +      "requires": {
    +        "arrify": "^1.0.1",
    +        "is-plain-obj": "^1.1.0",
    +        "kind-of": "^6.0.3"
    +      },
    +      "dependencies": {
    +        "is-plain-obj": {
    +          "version": "1.1.0",
    +          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    +          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "minipass": {
    +      "version": "3.1.5",
    +      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
    +      "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
    +      "dev": true,
    +      "requires": {
    +        "yallist": "^4.0.0"
    +      }
    +    },
    +    "mkdirp": {
    +      "version": "0.5.5",
    +      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
    +      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
    +      "dev": true,
    +      "requires": {
    +        "minimist": "^1.2.5"
    +      }
    +    },
    +    "ms": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    +      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "dev": true
    +    },
    +    "napi-macros": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz",
    +      "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==",
    +      "dev": true,
    +      "optional": true
    +    },
    +    "natural-compare": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
    +      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
    +      "dev": true
    +    },
    +    "nlcst-is-literal": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/nlcst-is-literal/-/nlcst-is-literal-1.2.2.tgz",
    +      "integrity": "sha512-R+1OJEmRl3ZOp9d8PbiRxGpnvmpi3jU+lzSqCJoLeogdEh0FYDRH1aC223qUbaKffxNTJkEfeDOeQfziw749yA==",
    +      "dev": true,
    +      "requires": {
    +        "nlcst-to-string": "^2.0.0"
    +      }
    +    },
    +    "nlcst-to-string": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz",
    +      "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==",
    +      "dev": true
    +    },
    +    "node-fetch": {
    +      "version": "2.6.6",
    +      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
    +      "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
    +      "dev": true,
    +      "requires": {
    +        "whatwg-url": "^5.0.0"
    +      }
    +    },
    +    "node-gyp-build": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz",
    +      "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==",
    +      "dev": true,
    +      "optional": true
    +    },
    +    "node-watch": {
    +      "version": "0.7.2",
    +      "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.2.tgz",
    +      "integrity": "sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw==",
    +      "dev": true
    +    },
    +    "node-webtokens": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/node-webtokens/-/node-webtokens-1.0.4.tgz",
    +      "integrity": "sha512-Sla56CeSLWvPbwud2kogqf5edQtKNXZBtXDDpmOzAgNZjwETbK/Am6PXfs54iZPLBm8K8amZ9XWaCQwGqZmKyQ=="
    +    },
    +    "normalize-package-data": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
    +      "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
    +      "dev": true,
    +      "requires": {
    +        "hosted-git-info": "^4.0.1",
    +        "is-core-module": "^2.5.0",
    +        "semver": "^7.3.4",
    +        "validate-npm-package-license": "^3.0.1"
    +      }
    +    },
    +    "normalize-url": {
    +      "version": "4.5.1",
    +      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
    +      "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
    +      "dev": true
    +    },
    +    "nspell": {
    +      "version": "2.1.5",
    +      "resolved": "https://registry.npmjs.org/nspell/-/nspell-2.1.5.tgz",
    +      "integrity": "sha512-PSStyugKMiD9mHmqI/CR5xXrSIGejUXPlo88FBRq5Og1kO5QwQ5Ilu8D8O5I/SHpoS+mibpw6uKA8rd3vXd2Sg==",
    +      "dev": true,
    +      "requires": {
    +        "is-buffer": "^2.0.0"
    +      }
    +    },
    +    "number-to-words": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/number-to-words/-/number-to-words-1.2.4.tgz",
    +      "integrity": "sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw==",
    +      "dev": true
    +    },
    +    "object-inspect": {
    +      "version": "1.12.0",
    +      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
    +      "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
    +      "dev": true
    +    },
    +    "object-is": {
    +      "version": "1.1.5",
    +      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
    +      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      }
    +    },
    +    "object-keys": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
    +      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
    +      "dev": true
    +    },
    +    "object.assign": {
    +      "version": "4.1.2",
    +      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
    +      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.0",
    +        "define-properties": "^1.1.3",
    +        "has-symbols": "^1.0.1",
    +        "object-keys": "^1.1.1"
    +      }
    +    },
    +    "object.values": {
    +      "version": "1.1.5",
    +      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
    +      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.1"
    +      }
    +    },
    +    "on-finished": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
    +      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
    +      "dev": true,
    +      "requires": {
    +        "ee-first": "1.1.1"
    +      }
    +    },
    +    "once": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
    +      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
    +      "requires": {
    +        "wrappy": "1"
    +      }
    +    },
    +    "onetime": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
    +      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
    +      "requires": {
    +        "mimic-fn": "^2.1.0"
    +      }
    +    },
    +    "optionator": {
    +      "version": "0.9.1",
    +      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
    +      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
    +      "dev": true,
    +      "requires": {
    +        "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"
    +      }
    +    },
    +    "ospath": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
    +      "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=",
    +      "dev": true
    +    },
    +    "p-cancelable": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
    +      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
    +      "dev": true
    +    },
    +    "p-limit": {
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
    +      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
    +      "dev": true,
    +      "requires": {
    +        "p-try": "^1.0.0"
    +      }
    +    },
    +    "p-locate": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
    +      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
    +      "dev": true,
    +      "requires": {
    +        "p-limit": "^1.1.0"
    +      }
    +    },
    +    "p-try": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
    +      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
    +      "dev": true
    +    },
    +    "package-json": {
    +      "version": "6.5.0",
    +      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
    +      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
    +      "dev": true,
    +      "requires": {
    +        "got": "^9.6.0",
    +        "registry-auth-token": "^4.0.0",
    +        "registry-url": "^5.0.0",
    +        "semver": "^6.2.0"
    +      },
    +      "dependencies": {
    +        "semver": {
    +          "version": "6.3.0",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    +          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "pako": {
    +      "version": "1.0.11",
    +      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
    +      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
    +      "dev": true
    +    },
    +    "parent-module": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
    +      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
    +      "dev": true,
    +      "requires": {
    +        "callsites": "^3.0.0"
    +      }
    +    },
    +    "parse-entities": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
    +      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
    +      "dev": true,
    +      "requires": {
    +        "character-entities": "^1.0.0",
    +        "character-entities-legacy": "^1.0.0",
    +        "character-reference-invalid": "^1.0.0",
    +        "is-alphanumerical": "^1.0.0",
    +        "is-decimal": "^1.0.0",
    +        "is-hexadecimal": "^1.0.0"
    +      }
    +    },
    +    "parse-json": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
    +      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
    +      "dev": true,
    +      "requires": {
    +        "error-ex": "^1.3.1",
    +        "json-parse-better-errors": "^1.0.1"
    +      }
    +    },
    +    "parse-latin": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz",
    +      "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==",
    +      "dev": true,
    +      "requires": {
    +        "nlcst-to-string": "^2.0.0",
    +        "unist-util-modify-children": "^2.0.0",
    +        "unist-util-visit-children": "^1.0.0"
    +      }
    +    },
    +    "parseurl": {
    +      "version": "1.3.3",
    +      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
    +      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
    +      "dev": true
    +    },
    +    "path-exists": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
    +      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
    +      "dev": true
    +    },
    +    "path-is-absolute": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
    +      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
    +    },
    +    "path-key": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
    +      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
    +      "dev": true
    +    },
    +    "path-parse": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
    +      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
    +      "dev": true
    +    },
    +    "path-sort": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/path-sort/-/path-sort-0.1.0.tgz",
    +      "integrity": "sha1-ywF11Oy/paGP5nTMbXIL/hXguAU="
    +    },
    +    "path-to-regexp": {
    +      "version": "0.1.7",
    +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
    +      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
    +      "dev": true
    +    },
    +    "path-type": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
    +      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
    +      "dev": true
    +    },
    +    "picocolors": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
    +      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
    +      "dev": true
    +    },
    +    "picomatch": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
    +      "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
    +      "dev": true
    +    },
    +    "pkg-dir": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
    +      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
    +      "dev": true,
    +      "requires": {
    +        "find-up": "^2.1.0"
    +      }
    +    },
    +    "prelude-ls": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
    +      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
    +      "dev": true
    +    },
    +    "prepend-http": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
    +      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
    +      "dev": true
    +    },
    +    "process-nextick-args": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
    +      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
    +      "dev": true
    +    },
    +    "progress": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
    +      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
    +      "dev": true
    +    },
    +    "prr": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
    +      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
    +      "dev": true
    +    },
    +    "pump": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
    +      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
    +      "dev": true,
    +      "requires": {
    +        "end-of-stream": "^1.1.0",
    +        "once": "^1.3.1"
    +      }
    +    },
    +    "punycode": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
    +      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
    +      "dev": true
    +    },
    +    "pupa": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
    +      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
    +      "dev": true,
    +      "requires": {
    +        "escape-goat": "^2.0.0"
    +      }
    +    },
    +    "qs": {
    +      "version": "6.9.6",
    +      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz",
    +      "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==",
    +      "dev": true
    +    },
    +    "querystring": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
    +      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
    +      "dev": true
    +    },
    +    "queue-microtask": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
    +      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
    +    },
    +    "quick-lru": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
    +      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
    +      "dev": true
    +    },
    +    "quotation": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/quotation/-/quotation-1.1.3.tgz",
    +      "integrity": "sha512-45gUgmX/RtQOQV1kwM06boP49OYXcKCPrYwdmAvs5YqkpiobhNKKwo524JM6Ma0ko3oN9tXNcWs9+ABq3Ry7YA==",
    +      "dev": true
    +    },
    +    "random-bytes": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
    +      "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
    +    },
    +    "range-parser": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
    +      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
    +      "dev": true
    +    },
    +    "raw-body": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz",
    +      "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==",
    +      "dev": true,
    +      "requires": {
    +        "bytes": "3.1.1",
    +        "http-errors": "1.8.1",
    +        "iconv-lite": "0.4.24",
    +        "unpipe": "1.0.0"
    +      }
    +    },
    +    "rc": {
    +      "version": "1.2.8",
    +      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
    +      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
    +      "dev": true,
    +      "requires": {
    +        "deep-extend": "^0.6.0",
    +        "ini": "~1.3.0",
    +        "minimist": "^1.2.0",
    +        "strip-json-comments": "~2.0.1"
    +      },
    +      "dependencies": {
    +        "ini": {
    +          "version": "1.3.8",
    +          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
    +          "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
    +          "dev": true
    +        },
    +        "strip-json-comments": {
    +          "version": "2.0.1",
    +          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
    +          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "reachdown": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/reachdown/-/reachdown-1.1.0.tgz",
    +      "integrity": "sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==",
    +      "dev": true
    +    },
    +    "read-pkg": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
    +      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
    +      "dev": true,
    +      "requires": {
    +        "@types/normalize-package-data": "^2.4.0",
    +        "normalize-package-data": "^2.5.0",
    +        "parse-json": "^5.0.0",
    +        "type-fest": "^0.6.0"
    +      },
    +      "dependencies": {
    +        "hosted-git-info": {
    +          "version": "2.8.9",
    +          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
    +          "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
    +          "dev": true
    +        },
    +        "normalize-package-data": {
    +          "version": "2.5.0",
    +          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
    +          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
    +          "dev": true,
    +          "requires": {
    +            "hosted-git-info": "^2.1.4",
    +            "resolve": "^1.10.0",
    +            "semver": "2 || 3 || 4 || 5",
    +            "validate-npm-package-license": "^3.0.1"
    +          }
    +        },
    +        "parse-json": {
    +          "version": "5.2.0",
    +          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
    +          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
    +          "dev": true,
    +          "requires": {
    +            "@babel/code-frame": "^7.0.0",
    +            "error-ex": "^1.3.1",
    +            "json-parse-even-better-errors": "^2.3.0",
    +            "lines-and-columns": "^1.1.6"
    +          }
    +        },
    +        "semver": {
    +          "version": "5.7.1",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
    +          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
    +          "dev": true
    +        },
    +        "type-fest": {
    +          "version": "0.6.0",
    +          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
    +          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "read-pkg-up": {
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
    +      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
    +      "dev": true,
    +      "requires": {
    +        "find-up": "^4.1.0",
    +        "read-pkg": "^5.2.0",
    +        "type-fest": "^0.8.1"
    +      },
    +      "dependencies": {
    +        "find-up": {
    +          "version": "4.1.0",
    +          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
    +          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
    +          "dev": true,
    +          "requires": {
    +            "locate-path": "^5.0.0",
    +            "path-exists": "^4.0.0"
    +          }
    +        },
    +        "locate-path": {
    +          "version": "5.0.0",
    +          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
    +          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
    +          "dev": true,
    +          "requires": {
    +            "p-locate": "^4.1.0"
    +          }
    +        },
    +        "p-limit": {
    +          "version": "2.3.0",
    +          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    +          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    +          "dev": true,
    +          "requires": {
    +            "p-try": "^2.0.0"
    +          }
    +        },
    +        "p-locate": {
    +          "version": "4.1.0",
    +          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
    +          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
    +          "dev": true,
    +          "requires": {
    +            "p-limit": "^2.2.0"
    +          }
    +        },
    +        "p-try": {
    +          "version": "2.2.0",
    +          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
    +          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
    +          "dev": true
    +        },
    +        "path-exists": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
    +          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
    +          "dev": true
    +        },
    +        "type-fest": {
    +          "version": "0.8.1",
    +          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
    +          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "readable-stream": {
    +      "version": "3.6.0",
    +      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
    +      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
    +      "dev": true,
    +      "requires": {
    +        "inherits": "^2.0.3",
    +        "string_decoder": "^1.1.1",
    +        "util-deprecate": "^1.0.1"
    +      }
    +    },
    +    "redent": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
    +      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
    +      "dev": true,
    +      "requires": {
    +        "indent-string": "^4.0.0",
    +        "strip-indent": "^3.0.0"
    +      }
    +    },
    +    "reduce-flatten": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
    +      "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
    +      "dev": true
    +    },
    +    "regexp.prototype.flags": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
    +      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      }
    +    },
    +    "regexpp": {
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
    +      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
    +      "dev": true
    +    },
    +    "registry-auth-token": {
    +      "version": "4.2.1",
    +      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
    +      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
    +      "dev": true,
    +      "requires": {
    +        "rc": "^1.2.8"
    +      }
    +    },
    +    "registry-url": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
    +      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
    +      "dev": true,
    +      "requires": {
    +        "rc": "^1.2.8"
    +      }
    +    },
    +    "remark": {
    +      "version": "13.0.0",
    +      "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
    +      "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
    +      "dev": true,
    +      "requires": {
    +        "remark-parse": "^9.0.0",
    +        "remark-stringify": "^9.0.0",
    +        "unified": "^9.1.0"
    +      }
    +    },
    +    "remark-frontmatter": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz",
    +      "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==",
    +      "dev": true,
    +      "requires": {
    +        "mdast-util-frontmatter": "^0.2.0",
    +        "micromark-extension-frontmatter": "^0.2.0"
    +      }
    +    },
    +    "remark-gemoji-to-emoji": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/remark-gemoji-to-emoji/-/remark-gemoji-to-emoji-1.1.0.tgz",
    +      "integrity": "sha1-Pc0KiBGgyBu2NROsCzbyJYpVMPU=",
    +      "dev": true,
    +      "requires": {
    +        "gemoji": "^4.0.0",
    +        "unist-util-visit": "^1.0.0"
    +      }
    +    },
    +    "remark-parse": {
    +      "version": "9.0.0",
    +      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
    +      "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
    +      "dev": true,
    +      "requires": {
    +        "mdast-util-from-markdown": "^0.8.0"
    +      }
    +    },
    +    "remark-retext": {
    +      "version": "3.1.3",
    +      "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz",
    +      "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==",
    +      "dev": true,
    +      "requires": {
    +        "mdast-util-to-nlcst": "^3.2.0"
    +      }
    +    },
    +    "remark-stringify": {
    +      "version": "9.0.1",
    +      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
    +      "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
    +      "dev": true,
    +      "requires": {
    +        "mdast-util-to-markdown": "^0.6.0"
    +      }
    +    },
    +    "repeat-string": {
    +      "version": "1.6.1",
    +      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
    +      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
    +      "dev": true
    +    },
    +    "replace-ext": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
    +      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
    +      "dev": true
    +    },
    +    "req-all": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/req-all/-/req-all-0.1.0.tgz",
    +      "integrity": "sha1-EwBR4qzligLqy/ydRIV3pzapJzo=",
    +      "dev": true
    +    },
    +    "requires-port": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
    +      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
    +      "dev": true
    +    },
    +    "resolve": {
    +      "version": "1.20.0",
    +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
    +      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
    +      "dev": true,
    +      "requires": {
    +        "is-core-module": "^2.2.0",
    +        "path-parse": "^1.0.6"
    +      }
    +    },
    +    "resolve-from": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
    +      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
    +      "dev": true
    +    },
    +    "responselike": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
    +      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
    +      "dev": true,
    +      "requires": {
    +        "lowercase-keys": "^1.0.0"
    +      }
    +    },
    +    "restore-cursor": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
    +      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
    +      "requires": {
    +        "onetime": "^5.1.0",
    +        "signal-exit": "^3.0.2"
    +      }
    +    },
    +    "resumer": {
    +      "version": "0.0.0",
    +      "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
    +      "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
    +      "dev": true,
    +      "requires": {
    +        "through": "~2.3.4"
    +      }
    +    },
    +    "retext": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/retext/-/retext-5.0.0.tgz",
    +      "integrity": "sha1-XZAYxKZ31hA8FCNi129Q6x05i/Y=",
    +      "dev": true,
    +      "requires": {
    +        "retext-latin": "^2.0.0",
    +        "retext-stringify": "^2.0.0",
    +        "unified": "^6.0.0"
    +      },
    +      "dependencies": {
    +        "is-buffer": {
    +          "version": "1.1.6",
    +          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
    +          "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
    +          "dev": true
    +        },
    +        "is-plain-obj": {
    +          "version": "1.1.0",
    +          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    +          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
    +          "dev": true
    +        },
    +        "unified": {
    +          "version": "6.2.0",
    +          "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
    +          "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
    +          "dev": true,
    +          "requires": {
    +            "bail": "^1.0.0",
    +            "extend": "^3.0.0",
    +            "is-plain-obj": "^1.1.0",
    +            "trough": "^1.0.0",
    +            "vfile": "^2.0.0",
    +            "x-is-string": "^0.1.0"
    +          }
    +        },
    +        "unist-util-stringify-position": {
    +          "version": "1.1.2",
    +          "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    +          "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    +          "dev": true
    +        },
    +        "vfile": {
    +          "version": "2.3.0",
    +          "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
    +          "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
    +          "dev": true,
    +          "requires": {
    +            "is-buffer": "^1.1.4",
    +            "replace-ext": "1.0.0",
    +            "unist-util-stringify-position": "^1.0.0",
    +            "vfile-message": "^1.0.0"
    +          }
    +        }
    +      }
    +    },
    +    "retext-indefinite-article": {
    +      "version": "1.1.7",
    +      "resolved": "https://registry.npmjs.org/retext-indefinite-article/-/retext-indefinite-article-1.1.7.tgz",
    +      "integrity": "sha512-pqvEfEHL8uoeonbEjk8+d/hmyA3ozIeNTl4t3uurMcBpoIqN3+nbuMCFQrfDy2wjaKZ40KsLmEi+Zjv7m1ejLQ==",
    +      "dev": true,
    +      "requires": {
    +        "format": "^0.2.2",
    +        "nlcst-to-string": "^2.0.0",
    +        "number-to-words": "^1.2.3",
    +        "unist-util-is": "^3.0.0",
    +        "unist-util-visit": "^1.1.0"
    +      }
    +    },
    +    "retext-latin": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz",
    +      "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==",
    +      "dev": true,
    +      "requires": {
    +        "parse-latin": "^4.0.0",
    +        "unherit": "^1.0.4"
    +      }
    +    },
    +    "retext-repeated-words": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/retext-repeated-words/-/retext-repeated-words-1.2.3.tgz",
    +      "integrity": "sha512-s51ybhXsHvpHpM44y9hayqcIDMo9g5QBZoOpPUosX3CfobZbgH7CZHbME8TOEcduR7OqGtNZ8JLKVFwi9QAKqA==",
    +      "dev": true,
    +      "requires": {
    +        "nlcst-to-string": "^2.0.0",
    +        "unist-util-is": "^3.0.0",
    +        "unist-util-visit": "^1.1.0"
    +      }
    +    },
    +    "retext-spell": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/retext-spell/-/retext-spell-2.4.1.tgz",
    +      "integrity": "sha512-l2C37Sz+JMLgUJHqqNA2bV3Qqh7V6zWT3fCi8MtsZn2PoanDh57Tz2NW/DJpoEIsK9mV7o2EMvQmIMt5cgcgAg==",
    +      "dev": true,
    +      "requires": {
    +        "lodash.includes": "^4.2.0",
    +        "nlcst-is-literal": "^1.0.0",
    +        "nlcst-to-string": "^2.0.0",
    +        "nspell": "^2.0.0",
    +        "quotation": "^1.1.0",
    +        "unist-util-visit": "^1.0.0"
    +      }
    +    },
    +    "retext-stringify": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz",
    +      "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==",
    +      "dev": true,
    +      "requires": {
    +        "nlcst-to-string": "^2.0.0"
    +      }
    +    },
    +    "retext-syntax-mentions": {
    +      "version": "1.1.6",
    +      "resolved": "https://registry.npmjs.org/retext-syntax-mentions/-/retext-syntax-mentions-1.1.6.tgz",
    +      "integrity": "sha512-e6+Kh3dhzdBn0mHeiiKGUJMMqKTC7O2t+blKZWR1VeP0Kbm6CU4D1p5r+eH24GNCWRnqv3NbDk7RbdALqPLTeQ==",
    +      "dev": true,
    +      "requires": {
    +        "nlcst-to-string": "^2.0.0",
    +        "unist-util-position": "^3.0.0",
    +        "unist-util-visit": "^1.1.0"
    +      }
    +    },
    +    "retext-syntax-urls": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/retext-syntax-urls/-/retext-syntax-urls-1.0.2.tgz",
    +      "integrity": "sha512-Ud7i50IEP33OK9g5xCBIKh/DjoEdZi6sRJqnWDW3Wxt4B48llgfSbGLgiLeXZvJD923mOf7EAoLt/WjundXmwg==",
    +      "dev": true,
    +      "requires": {
    +        "nlcst-to-string": "^2.0.0",
    +        "unist-util-is": "^3.0.0",
    +        "unist-util-modify-children": "^1.1.1",
    +        "unist-util-position": "^3.0.0"
    +      },
    +      "dependencies": {
    +        "unist-util-modify-children": {
    +          "version": "1.1.6",
    +          "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz",
    +          "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==",
    +          "dev": true,
    +          "requires": {
    +            "array-iterate": "^1.0.0"
    +          }
    +        }
    +      }
    +    },
    +    "reusify": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
    +      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
    +      "dev": true
    +    },
    +    "rimraf": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
    +      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
    +      "dev": true,
    +      "requires": {
    +        "glob": "^7.1.3"
    +      }
    +    },
    +    "rndm": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz",
    +      "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w="
    +    },
    +    "router": {
    +      "version": "1.3.6",
    +      "resolved": "https://registry.npmjs.org/router/-/router-1.3.6.tgz",
    +      "integrity": "sha512-gsjhou+LFApzkIP8VDrouG6Z4pqkeF11n3o5orlwPPvPTl0x7c+dbF71itKOhDoFHygmc3N3uqm55Uq/gIDUwg==",
    +      "dev": true,
    +      "requires": {
    +        "array-flatten": "3.0.0",
    +        "debug": "2.6.9",
    +        "methods": "~1.1.2",
    +        "parseurl": "~1.3.3",
    +        "path-to-regexp": "0.1.7",
    +        "setprototypeof": "1.2.0",
    +        "utils-merge": "1.0.1"
    +      }
    +    },
    +    "run-parallel": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
    +      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
    +      "requires": {
    +        "queue-microtask": "^1.2.2"
    +      }
    +    },
    +    "run-series": {
    +      "version": "1.1.9",
    +      "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz",
    +      "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g=="
    +    },
    +    "run-waterfall": {
    +      "version": "1.1.7",
    +      "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz",
    +      "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ=="
    +    },
    +    "safe-buffer": {
    +      "version": "5.2.1",
    +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
    +      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
    +      "dev": true
    +    },
    +    "safer-buffer": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
    +      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
    +      "dev": true
    +    },
    +    "sax": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
    +      "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=",
    +      "dev": true
    +    },
    +    "semver": {
    +      "version": "7.3.5",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    +      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "dev": true,
    +      "requires": {
    +        "lru-cache": "^6.0.0"
    +      }
    +    },
    +    "semver-diff": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
    +      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
    +      "dev": true,
    +      "requires": {
    +        "semver": "^6.3.0"
    +      },
    +      "dependencies": {
    +        "semver": {
    +          "version": "6.3.0",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    +          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "send": {
    +      "version": "0.17.2",
    +      "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
    +      "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
    +      "dev": true,
    +      "requires": {
    +        "debug": "2.6.9",
    +        "depd": "~1.1.2",
    +        "destroy": "~1.0.4",
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "etag": "~1.8.1",
    +        "fresh": "0.5.2",
    +        "http-errors": "1.8.1",
    +        "mime": "1.6.0",
    +        "ms": "2.1.3",
    +        "on-finished": "~2.3.0",
    +        "range-parser": "~1.2.1",
    +        "statuses": "~1.5.0"
    +      },
    +      "dependencies": {
    +        "ms": {
    +          "version": "2.1.3",
    +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "server-destroy": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
    +      "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
    +      "dev": true
    +    },
    +    "set-immediate-shim": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
    +      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
    +      "dev": true
    +    },
    +    "setprototypeof": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
    +      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
    +      "dev": true
    +    },
    +    "sha": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz",
    +      "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==",
    +      "requires": {
    +        "graceful-fs": "^4.1.2"
    +      }
    +    },
    +    "shebang-command": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
    +      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
    +      "dev": true,
    +      "requires": {
    +        "shebang-regex": "^3.0.0"
    +      }
    +    },
    +    "shebang-regex": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
    +      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
    +      "dev": true
    +    },
    +    "side-channel": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
    +      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.0",
    +        "get-intrinsic": "^1.0.2",
    +        "object-inspect": "^1.9.0"
    +      }
    +    },
    +    "signal-exit": {
    +      "version": "3.0.5",
    +      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
    +      "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ=="
    +    },
    +    "slash": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
    +      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
    +      "dev": true
    +    },
    +    "slugify": {
    +      "version": "1.6.5",
    +      "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz",
    +      "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ=="
    +    },
    +    "spdx-correct": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
    +      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
    +      "dev": true,
    +      "requires": {
    +        "spdx-expression-parse": "^3.0.0",
    +        "spdx-license-ids": "^3.0.0"
    +      }
    +    },
    +    "spdx-exceptions": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
    +      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
    +      "dev": true
    +    },
    +    "spdx-expression-parse": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
    +      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
    +      "dev": true,
    +      "requires": {
    +        "spdx-exceptions": "^2.1.0",
    +        "spdx-license-ids": "^3.0.0"
    +      }
    +    },
    +    "spdx-license-ids": {
    +      "version": "3.0.11",
    +      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
    +      "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
    +      "dev": true
    +    },
    +    "spellchecker-cli": {
    +      "version": "4.8.1",
    +      "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.8.1.tgz",
    +      "integrity": "sha512-7D4ZznwVTABfmyJEktFQNeO1epdDTy+AGZ3GWm9OerDDyFkzpCFNZ6IW+ZYpxcrmSJ92Xo0ppaJPRGPgH9uC5A==",
    +      "dev": true,
    +      "requires": {
    +        "app-root-path": "^3.0.0",
    +        "chalk": "^2.4.2",
    +        "command-line-args": "^5.1.1",
    +        "command-line-usage": "^5.0.4",
    +        "dictionary-en-au": "^2.3.0",
    +        "dictionary-en-ca": "^2.3.0",
    +        "dictionary-en-gb": "^2.3.0",
    +        "dictionary-en-us": "^2.2.1",
    +        "dictionary-en-za": "^2.0.4",
    +        "dictionary-vi": "^2.1.3",
    +        "fs-extra": "^6.0.1",
    +        "globby": "^11.0.0",
    +        "js-yaml": "^3.14.1",
    +        "jsonc": "^2.0.0",
    +        "junit-report-builder": "^1.3.3",
    +        "lodash": "^4.17.21",
    +        "remark": "^13.0.0",
    +        "remark-frontmatter": "^3.0.0",
    +        "remark-gemoji-to-emoji": "^1.1.0",
    +        "remark-retext": "^3.1.3",
    +        "retext": "^5.0.0",
    +        "retext-indefinite-article": "^1.1.7",
    +        "retext-repeated-words": "^1.2.3",
    +        "retext-spell": "^2.4.1",
    +        "retext-syntax-mentions": "^1.1.6",
    +        "retext-syntax-urls": "^1.0.2",
    +        "toml": "^3.0.0",
    +        "unist-util-visit": "^1.4.1",
    +        "vfile": "^3.0.1",
    +        "vfile-reporter": "^6.0.0"
    +      },
    +      "dependencies": {
    +        "ansi-styles": {
    +          "version": "3.2.1",
    +          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +          "dev": true,
    +          "requires": {
    +            "color-convert": "^1.9.0"
    +          }
    +        },
    +        "argparse": {
    +          "version": "1.0.10",
    +          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    +          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    +          "dev": true,
    +          "requires": {
    +            "sprintf-js": "~1.0.2"
    +          }
    +        },
    +        "chalk": {
    +          "version": "2.4.2",
    +          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +          "dev": true,
    +          "requires": {
    +            "ansi-styles": "^3.2.1",
    +            "escape-string-regexp": "^1.0.5",
    +            "supports-color": "^5.3.0"
    +          }
    +        },
    +        "color-convert": {
    +          "version": "1.9.3",
    +          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +          "dev": true,
    +          "requires": {
    +            "color-name": "1.1.3"
    +          }
    +        },
    +        "color-name": {
    +          "version": "1.1.3",
    +          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +          "dev": true
    +        },
    +        "escape-string-regexp": {
    +          "version": "1.0.5",
    +          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    +          "dev": true
    +        },
    +        "fs-extra": {
    +          "version": "6.0.1",
    +          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
    +          "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
    +          "dev": true,
    +          "requires": {
    +            "graceful-fs": "^4.1.2",
    +            "jsonfile": "^4.0.0",
    +            "universalify": "^0.1.0"
    +          }
    +        },
    +        "has-flag": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +          "dev": true
    +        },
    +        "js-yaml": {
    +          "version": "3.14.1",
    +          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    +          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    +          "dev": true,
    +          "requires": {
    +            "argparse": "^1.0.7",
    +            "esprima": "^4.0.0"
    +          }
    +        },
    +        "jsonfile": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
    +          "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
    +          "dev": true,
    +          "requires": {
    +            "graceful-fs": "^4.1.6"
    +          }
    +        },
    +        "supports-color": {
    +          "version": "5.5.0",
    +          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +          "dev": true,
    +          "requires": {
    +            "has-flag": "^3.0.0"
    +          }
    +        },
    +        "universalify": {
    +          "version": "0.1.2",
    +          "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
    +          "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "sprintf-js": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
    +      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
    +    },
    +    "statuses": {
    +      "version": "1.5.0",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
    +      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
    +      "dev": true
    +    },
    +    "strftime": {
    +      "version": "0.10.0",
    +      "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz",
    +      "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=",
    +      "dev": true
    +    },
    +    "string_decoder": {
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
    +      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
    +      "dev": true,
    +      "requires": {
    +        "safe-buffer": "~5.2.0"
    +      }
    +    },
    +    "string-width": {
    +      "version": "4.2.3",
    +      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
    +      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
    +      "dev": true,
    +      "requires": {
    +        "emoji-regex": "^8.0.0",
    +        "is-fullwidth-code-point": "^3.0.0",
    +        "strip-ansi": "^6.0.1"
    +      }
    +    },
    +    "string.prototype.trim": {
    +      "version": "1.2.5",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz",
    +      "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.1"
    +      }
    +    },
    +    "string.prototype.trimend": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
    +      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      }
    +    },
    +    "string.prototype.trimstart": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
    +      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      }
    +    },
    +    "strip-ansi": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
    +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
    +      "dev": true,
    +      "requires": {
    +        "ansi-regex": "^5.0.1"
    +      }
    +    },
    +    "strip-bom": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
    +      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
    +      "dev": true
    +    },
    +    "strip-indent": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
    +      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
    +      "dev": true,
    +      "requires": {
    +        "min-indent": "^1.0.0"
    +      }
    +    },
    +    "strip-json-comments": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
    +      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
    +      "dev": true
    +    },
    +    "subleveldown": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-5.0.1.tgz",
    +      "integrity": "sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw==",
    +      "dev": true,
    +      "requires": {
    +        "abstract-leveldown": "^6.3.0",
    +        "encoding-down": "^6.2.0",
    +        "inherits": "^2.0.3",
    +        "level-option-wrap": "^1.1.0",
    +        "levelup": "^4.4.0",
    +        "reachdown": "^1.1.0"
    +      },
    +      "dependencies": {
    +        "abstract-leveldown": {
    +          "version": "6.3.0",
    +          "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz",
    +          "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==",
    +          "dev": true,
    +          "requires": {
    +            "buffer": "^5.5.0",
    +            "immediate": "^3.2.3",
    +            "level-concat-iterator": "~2.0.0",
    +            "level-supports": "~1.0.0",
    +            "xtend": "~4.0.0"
    +          }
    +        },
    +        "buffer": {
    +          "version": "5.7.1",
    +          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    +          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    +          "dev": true,
    +          "requires": {
    +            "base64-js": "^1.3.1",
    +            "ieee754": "^1.1.13"
    +          }
    +        }
    +      }
    +    },
    +    "supports-color": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    +      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    +      "requires": {
    +        "has-flag": "^4.0.0"
    +      }
    +    },
    +    "symlink-or-copy": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz",
    +      "integrity": "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==",
    +      "dev": true
    +    },
    +    "table-layout": {
    +      "version": "0.4.5",
    +      "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
    +      "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==",
    +      "dev": true,
    +      "requires": {
    +        "array-back": "^2.0.0",
    +        "deep-extend": "~0.6.0",
    +        "lodash.padend": "^4.6.1",
    +        "typical": "^2.6.1",
    +        "wordwrapjs": "^3.0.0"
    +      },
    +      "dependencies": {
    +        "array-back": {
    +          "version": "2.0.0",
    +          "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
    +          "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
    +          "dev": true,
    +          "requires": {
    +            "typical": "^2.6.1"
    +          }
    +        },
    +        "typical": {
    +          "version": "2.6.1",
    +          "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    +          "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "tap-arc": {
    +      "version": "0.1.2",
    +      "resolved": "https://registry.npmjs.org/tap-arc/-/tap-arc-0.1.2.tgz",
    +      "integrity": "sha512-o1Wl5LtNXw2W9ROKqYh/f/uoFMzdcej+jrPEbouAu8U6UDm/ux7UBg5tjZlIEOhAbYKWvZD4BSEPfn0LrsAHHA==",
    +      "dev": true,
    +      "requires": {
    +        "fast-diff": "^1.2.0",
    +        "json5": "^2.2.0",
    +        "minimist": "~1.2.5",
    +        "picocolors": "^1.0.0",
    +        "strip-ansi": "^6.0.1",
    +        "tap-parser": "^10.1.0",
    +        "through2": "^4.0.2"
    +      },
    +      "dependencies": {
    +        "json5": {
    +          "version": "2.2.0",
    +          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
    +          "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
    +          "dev": true,
    +          "requires": {
    +            "minimist": "^1.2.5"
    +          }
    +        }
    +      }
    +    },
    +    "tap-parser": {
    +      "version": "10.1.0",
    +      "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.1.0.tgz",
    +      "integrity": "sha512-FujQeciDaOiOvaIVGS1Rpb0v4R6XkOjvWCWowlz5oKuhPkEJ8U6pxgqt38xuzYhPt8dWEnfHn2jqpZdJEkW7pA==",
    +      "dev": true,
    +      "requires": {
    +        "events-to-array": "^1.0.1",
    +        "minipass": "^3.0.0",
    +        "tap-yaml": "^1.0.0"
    +      }
    +    },
    +    "tap-yaml": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz",
    +      "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==",
    +      "dev": true,
    +      "requires": {
    +        "yaml": "^1.5.0"
    +      }
    +    },
    +    "tape": {
    +      "version": "5.4.0",
    +      "resolved": "https://registry.npmjs.org/tape/-/tape-5.4.0.tgz",
    +      "integrity": "sha512-8Cq4mql6oZVO7zkMcen+2AZoJyICsHjJqTiWk1kVub6C/EsS4o9zBVWWbvBBLzx10okW3SKCoNN9XfwfTAIR2w==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "deep-equal": "^2.0.5",
    +        "defined": "^1.0.0",
    +        "dotignore": "^0.1.2",
    +        "for-each": "^0.3.3",
    +        "get-package-type": "^0.1.0",
    +        "glob": "^7.2.0",
    +        "has": "^1.0.3",
    +        "has-dynamic-import": "^2.0.1",
    +        "inherits": "^2.0.4",
    +        "is-regex": "^1.1.4",
    +        "minimist": "^1.2.5",
    +        "object-inspect": "^1.12.0",
    +        "object-is": "^1.1.5",
    +        "object.assign": "^4.1.2",
    +        "resolve": "^2.0.0-next.3",
    +        "resumer": "^0.0.0",
    +        "string.prototype.trim": "^1.2.5",
    +        "through": "^2.3.8"
    +      },
    +      "dependencies": {
    +        "defined": {
    +          "version": "1.0.0",
    +          "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
    +          "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
    +          "dev": true
    +        },
    +        "resolve": {
    +          "version": "2.0.0-next.3",
    +          "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
    +          "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==",
    +          "dev": true,
    +          "requires": {
    +            "is-core-module": "^2.2.0",
    +            "path-parse": "^1.0.6"
    +          }
    +        }
    +      }
    +    },
    +    "text-table": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
    +      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
    +      "dev": true
    +    },
    +    "through": {
    +      "version": "2.3.8",
    +      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
    +      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
    +      "dev": true
    +    },
    +    "through2": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
    +      "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
    +      "dev": true,
    +      "requires": {
    +        "readable-stream": "3"
    +      }
    +    },
    +    "tiny-each-async": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz",
    +      "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=",
    +      "dev": true
    +    },
    +    "tiny-json-http": {
    +      "version": "7.3.1",
    +      "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.1.tgz",
    +      "integrity": "sha512-sgt6ABJnNftz8itxjVwyrKZsk+Dy62uXPR/ryeQ8wxC3sB6UCaz+3mrzKbZdu5DoyzEa/bpHMVkqsTCvuPaDNg==",
    +      "dev": true
    +    },
    +    "to-readable-stream": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
    +      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
    +      "dev": true
    +    },
    +    "to-regex-range": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
    +      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
    +      "dev": true,
    +      "requires": {
    +        "is-number": "^7.0.0"
    +      }
    +    },
    +    "toidentifier": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
    +      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
    +      "dev": true
    +    },
    +    "toml": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz",
    +      "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==",
    +      "dev": true
    +    },
    +    "tr46": {
    +      "version": "0.0.3",
    +      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
    +      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
    +      "dev": true
    +    },
    +    "tree-kill": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
    +      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
    +      "dev": true
    +    },
    +    "trim-newlines": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
    +      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
    +      "dev": true
    +    },
    +    "trough": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
    +      "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
    +      "dev": true
    +    },
    +    "tsconfig-paths": {
    +      "version": "3.11.0",
    +      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz",
    +      "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==",
    +      "dev": true,
    +      "requires": {
    +        "@types/json5": "^0.0.29",
    +        "json5": "^1.0.1",
    +        "minimist": "^1.2.0",
    +        "strip-bom": "^3.0.0"
    +      },
    +      "dependencies": {
    +        "strip-bom": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    +          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "tsscmp": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
    +      "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="
    +    },
    +    "type-check": {
    +      "version": "0.4.0",
    +      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
    +      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
    +      "dev": true,
    +      "requires": {
    +        "prelude-ls": "^1.2.1"
    +      }
    +    },
    +    "type-fest": {
    +      "version": "0.20.2",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
    +      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
    +      "dev": true
    +    },
    +    "type-is": {
    +      "version": "1.6.18",
    +      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
    +      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
    +      "requires": {
    +        "media-typer": "0.3.0",
    +        "mime-types": "~2.1.24"
    +      }
    +    },
    +    "typedarray-to-buffer": {
    +      "version": "3.1.5",
    +      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
    +      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
    +      "dev": true,
    +      "requires": {
    +        "is-typedarray": "^1.0.0"
    +      }
    +    },
    +    "typical": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
    +      "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
    +      "dev": true
    +    },
    +    "uc.micro": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
    +      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
    +    },
    +    "uid-safe": {
    +      "version": "2.1.5",
    +      "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
    +      "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
    +      "requires": {
    +        "random-bytes": "~1.0.0"
    +      }
    +    },
    +    "unbox-primitive": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
    +      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
    +      "dev": true,
    +      "requires": {
    +        "function-bind": "^1.1.1",
    +        "has-bigints": "^1.0.1",
    +        "has-symbols": "^1.0.2",
    +        "which-boxed-primitive": "^1.0.2"
    +      }
    +    },
    +    "unherit": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
    +      "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
    +      "dev": true,
    +      "requires": {
    +        "inherits": "^2.0.0",
    +        "xtend": "^4.0.0"
    +      }
    +    },
    +    "unified": {
    +      "version": "9.2.2",
    +      "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
    +      "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
    +      "dev": true,
    +      "requires": {
    +        "bail": "^1.0.0",
    +        "extend": "^3.0.0",
    +        "is-buffer": "^2.0.0",
    +        "is-plain-obj": "^2.0.0",
    +        "trough": "^1.0.0",
    +        "vfile": "^4.0.0"
    +      },
    +      "dependencies": {
    +        "vfile": {
    +          "version": "4.2.1",
    +          "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
    +          "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
    +          "dev": true,
    +          "requires": {
    +            "@types/unist": "^2.0.0",
    +            "is-buffer": "^2.0.0",
    +            "unist-util-stringify-position": "^2.0.0",
    +            "vfile-message": "^2.0.0"
    +          }
    +        },
    +        "vfile-message": {
    +          "version": "2.0.4",
    +          "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
    +          "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
    +          "dev": true,
    +          "requires": {
    +            "@types/unist": "^2.0.0",
    +            "unist-util-stringify-position": "^2.0.0"
    +          }
    +        }
    +      }
    +    },
    +    "unique-string": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
    +      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
    +      "dev": true,
    +      "requires": {
    +        "crypto-random-string": "^2.0.0"
    +      }
    +    },
    +    "unist-util-is": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
    +      "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
    +      "dev": true
    +    },
    +    "unist-util-modify-children": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz",
    +      "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==",
    +      "dev": true,
    +      "requires": {
    +        "array-iterate": "^1.0.0"
    +      }
    +    },
    +    "unist-util-position": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz",
    +      "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==",
    +      "dev": true
    +    },
    +    "unist-util-stringify-position": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
    +      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
    +      "dev": true,
    +      "requires": {
    +        "@types/unist": "^2.0.2"
    +      }
    +    },
    +    "unist-util-visit": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
    +      "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
    +      "dev": true,
    +      "requires": {
    +        "unist-util-visit-parents": "^2.0.0"
    +      }
    +    },
    +    "unist-util-visit-children": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz",
    +      "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==",
    +      "dev": true
    +    },
    +    "unist-util-visit-parents": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
    +      "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
    +      "dev": true,
    +      "requires": {
    +        "unist-util-is": "^3.0.0"
    +      }
    +    },
    +    "universalify": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
    +      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
    +      "dev": true
    +    },
    +    "unorm": {
    +      "version": "1.6.0",
    +      "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz",
    +      "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA=="
    +    },
    +    "unpipe": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
    +      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
    +      "dev": true
    +    },
    +    "update-notifier": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
    +      "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
    +      "dev": true,
    +      "requires": {
    +        "boxen": "^5.0.0",
    +        "chalk": "^4.1.0",
    +        "configstore": "^5.0.1",
    +        "has-yarn": "^2.1.0",
    +        "import-lazy": "^2.1.0",
    +        "is-ci": "^2.0.0",
    +        "is-installed-globally": "^0.4.0",
    +        "is-npm": "^5.0.0",
    +        "is-yarn-global": "^0.3.0",
    +        "latest-version": "^5.1.0",
    +        "pupa": "^2.1.1",
    +        "semver": "^7.3.4",
    +        "semver-diff": "^3.1.1",
    +        "xdg-basedir": "^4.0.0"
    +      }
    +    },
    +    "uri-js": {
    +      "version": "4.4.1",
    +      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
    +      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
    +      "dev": true,
    +      "requires": {
    +        "punycode": "^2.1.0"
    +      }
    +    },
    +    "url": {
    +      "version": "0.10.3",
    +      "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
    +      "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=",
    +      "dev": true,
    +      "requires": {
    +        "punycode": "1.3.2",
    +        "querystring": "0.2.0"
    +      },
    +      "dependencies": {
    +        "punycode": {
    +          "version": "1.3.2",
    +          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
    +          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "url-parse-lax": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
    +      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
    +      "dev": true,
    +      "requires": {
    +        "prepend-http": "^2.0.0"
    +      }
    +    },
    +    "uslug": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz",
    +      "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=",
    +      "requires": {
    +        "unorm": ">= 1.0.0"
    +      }
    +    },
    +    "util-deprecate": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
    +      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
    +      "dev": true
    +    },
    +    "utils-merge": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
    +      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
    +      "dev": true
    +    },
    +    "uuid": {
    +      "version": "3.3.2",
    +      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
    +      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
    +      "dev": true
    +    },
    +    "v8-compile-cache": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
    +      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
    +      "dev": true
    +    },
    +    "validate-npm-package-license": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
    +      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
    +      "dev": true,
    +      "requires": {
    +        "spdx-correct": "^3.0.0",
    +        "spdx-expression-parse": "^3.0.0"
    +      }
    +    },
    +    "vfile": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz",
    +      "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==",
    +      "dev": true,
    +      "requires": {
    +        "is-buffer": "^2.0.0",
    +        "replace-ext": "1.0.0",
    +        "unist-util-stringify-position": "^1.0.0",
    +        "vfile-message": "^1.0.0"
    +      },
    +      "dependencies": {
    +        "unist-util-stringify-position": {
    +          "version": "1.1.2",
    +          "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    +          "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "vfile-location": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
    +      "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
    +      "dev": true
    +    },
    +    "vfile-message": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
    +      "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
    +      "dev": true,
    +      "requires": {
    +        "unist-util-stringify-position": "^1.1.1"
    +      },
    +      "dependencies": {
    +        "unist-util-stringify-position": {
    +          "version": "1.1.2",
    +          "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    +          "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "vfile-reporter": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz",
    +      "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==",
    +      "dev": true,
    +      "requires": {
    +        "repeat-string": "^1.5.0",
    +        "string-width": "^4.0.0",
    +        "supports-color": "^6.0.0",
    +        "unist-util-stringify-position": "^2.0.0",
    +        "vfile-sort": "^2.1.2",
    +        "vfile-statistics": "^1.1.0"
    +      },
    +      "dependencies": {
    +        "has-flag": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +          "dev": true
    +        },
    +        "supports-color": {
    +          "version": "6.1.0",
    +          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
    +          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
    +          "dev": true,
    +          "requires": {
    +            "has-flag": "^3.0.0"
    +          }
    +        }
    +      }
    +    },
    +    "vfile-sort": {
    +      "version": "2.2.2",
    +      "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.2.tgz",
    +      "integrity": "sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA==",
    +      "dev": true
    +    },
    +    "vfile-statistics": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.4.tgz",
    +      "integrity": "sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA==",
    +      "dev": true
    +    },
    +    "webidl-conversions": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
    +      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
    +      "dev": true
    +    },
    +    "whatwg-url": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
    +      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
    +      "dev": true,
    +      "requires": {
    +        "tr46": "~0.0.3",
    +        "webidl-conversions": "^3.0.0"
    +      }
    +    },
    +    "which": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
    +      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
    +      "dev": true,
    +      "requires": {
    +        "isexe": "^2.0.0"
    +      }
    +    },
    +    "which-boxed-primitive": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
    +      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
    +      "dev": true,
    +      "requires": {
    +        "is-bigint": "^1.0.1",
    +        "is-boolean-object": "^1.1.0",
    +        "is-number-object": "^1.0.4",
    +        "is-string": "^1.0.5",
    +        "is-symbol": "^1.0.3"
    +      }
    +    },
    +    "which-collection": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
    +      "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
    +      "dev": true,
    +      "requires": {
    +        "is-map": "^2.0.1",
    +        "is-set": "^2.0.1",
    +        "is-weakmap": "^2.0.1",
    +        "is-weakset": "^2.0.1"
    +      }
    +    },
    +    "which-typed-array": {
    +      "version": "1.1.7",
    +      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
    +      "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
    +      "dev": true,
    +      "requires": {
    +        "available-typed-arrays": "^1.0.5",
    +        "call-bind": "^1.0.2",
    +        "es-abstract": "^1.18.5",
    +        "foreach": "^2.0.5",
    +        "has-tostringtag": "^1.0.0",
    +        "is-typed-array": "^1.1.7"
    +      }
    +    },
    +    "widest-line": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
    +      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
    +      "dev": true,
    +      "requires": {
    +        "string-width": "^4.0.0"
    +      }
    +    },
    +    "word-wrap": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
    +      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
    +      "dev": true
    +    },
    +    "wordwrapjs": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
    +      "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
    +      "dev": true,
    +      "requires": {
    +        "reduce-flatten": "^1.0.1",
    +        "typical": "^2.6.1"
    +      },
    +      "dependencies": {
    +        "typical": {
    +          "version": "2.6.1",
    +          "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    +          "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "wrap-ansi": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
    +      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
    +      "dev": true,
    +      "requires": {
    +        "ansi-styles": "^4.0.0",
    +        "string-width": "^4.1.0",
    +        "strip-ansi": "^6.0.0"
    +      }
    +    },
    +    "wrappy": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
    +      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
    +    },
    +    "write-file-atomic": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
    +      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
    +      "dev": true,
    +      "requires": {
    +        "imurmurhash": "^0.1.4",
    +        "is-typedarray": "^1.0.0",
    +        "signal-exit": "^3.0.2",
    +        "typedarray-to-buffer": "^3.1.5"
    +      }
    +    },
    +    "ws": {
    +      "version": "8.3.0",
    +      "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
    +      "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
    +      "dev": true,
    +      "requires": {}
    +    },
    +    "x-is-string": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
    +      "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
    +      "dev": true
    +    },
    +    "xdg-basedir": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
    +      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
    +      "dev": true
    +    },
    +    "xml2js": {
    +      "version": "0.4.19",
    +      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
    +      "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
    +      "dev": true,
    +      "requires": {
    +        "sax": ">=0.6.0",
    +        "xmlbuilder": "~9.0.1"
    +      },
    +      "dependencies": {
    +        "xmlbuilder": {
    +          "version": "9.0.7",
    +          "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
    +          "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "xmlbuilder": {
    +      "version": "10.1.1",
    +      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
    +      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
    +      "dev": true
    +    },
    +    "xtend": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
    +      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
    +      "dev": true
    +    },
    +    "yallist": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
    +      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
    +      "dev": true
    +    },
    +    "yaml": {
    +      "version": "1.10.2",
    +      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
    +      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
    +      "dev": true
    +    },
    +    "yargs-parser": {
    +      "version": "20.2.9",
    +      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
    +      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
    +      "dev": true
    +    },
    +    "yazl": {
    +      "version": "2.5.1",
    +      "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
    +      "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
    +      "dev": true,
    +      "requires": {
    +        "buffer-crc32": "~0.2.3"
    +      }
    +    },
    +    "yesno": {
    +      "version": "0.3.1",
    +      "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.3.1.tgz",
    +      "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==",
    +      "dev": true
    +    },
    +    "zip-dir": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz",
    +      "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==",
    +      "dev": true,
    +      "requires": {
    +        "async": "^3.2.0",
    +        "jszip": "^3.2.2"
    +      },
    +      "dependencies": {
    +        "async": {
    +          "version": "3.2.2",
    +          "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
    +          "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==",
    +          "dev": true
    +        }
    +      }
    +    },
    +    "zipit": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/zipit/-/zipit-2.0.0.tgz",
    +      "integrity": "sha512-e/y9Xf1eYElSSo1s1e1+0QraquqaCmfnCvxd2IlvILtKK+F93kpV+/TIRUDYW7UnYtDMeYijG5kyEA7B+66wgg==",
    +      "dev": true,
    +      "requires": {
    +        "insync": "2.1.1",
    +        "yazl": "2.5.1"
    +      }
    +    },
    +    "zwitch": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
    +      "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
    +      "dev": true
    +    }
    +  }
    +}
    diff --git a/package.json b/package.json
    index 268a7d1d..84b95045 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,11 @@
     {
       "name": "@architect/arc.codes",
       "version": "3.6.28",
    +  "repository": {
    +    "type": "git",
    +    "url": "https://github.com/architect/arc.codes"
    +  },
    +  "license": "Apache-2.0",
       "scripts": {
         "dist": "./scripts/dist.sh",
         "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json",
    @@ -27,7 +32,7 @@
         "slugify": "^1.6.5"
       },
       "devDependencies": {
    -    "@architect/architect": "^9.5.0",
    +    "@architect/architect": "^9.4.2",
         "@architect/eslint-config": "^2.0.1",
         "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary",
         "eslint": "^8.6.0",
    
    From a8c3a0e1eab93f866f16bcb012f517b89a222808 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Fri, 7 Jan 2022 18:39:54 -0700
    Subject: [PATCH 309/680] use npm 6 - same as github actions
    
    ---
     .github/workflows/build.yml |    2 +-
     package-lock.json           | 8422 ++---------------------------------
     package.json                |    2 +-
     3 files changed, 352 insertions(+), 8074 deletions(-)
    
    diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
    index 8dd0efd3..8d3034bb 100644
    --- a/.github/workflows/build.yml
    +++ b/.github/workflows/build.yml
    @@ -15,7 +15,7 @@ jobs:
         runs-on: ${{ matrix.os }}
         strategy:
           matrix:
    -        node-version: [ 14.x, 16.x ]
    +        node-version: [ 14.x ]
             os: [ ubuntu-latest ]
     
         # Go
    diff --git a/package-lock.json b/package-lock.json
    index 074c3fa1..a9b6c42c 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -1,7740 +1,8 @@
     {
       "name": "@architect/arc.codes",
       "version": "3.6.28",
    -  "lockfileVersion": 2,
    +  "lockfileVersion": 1,
       "requires": true,
    -  "packages": {
    -    "": {
    -      "name": "@architect/arc.codes",
    -      "version": "3.6.28",
    -      "license": "Apache-2.0",
    -      "dependencies": {
    -        "@architect/asap": "^4.1.0",
    -        "@architect/functions": "^4.1.1",
    -        "@architect/inventory": "^2.2.1",
    -        "@architect/package": "^7.2.0",
    -        "@architect/syntaxes": "github:architect/syntaxes#v1.2.1",
    -        "@toycode/markdown-it-class": "^1.2.4",
    -        "esm": "^3.2.25",
    -        "front-matter": "^4.0.2",
    -        "highlight.js": "^11.4.0",
    -        "markdown-it": "^12.3.1",
    -        "markdown-it-external-anchor": "^1.0.0",
    -        "markdown-it-toc-and-anchor": "^4.2.0",
    -        "slugify": "^1.6.5"
    -      },
    -      "devDependencies": {
    -        "@architect/architect": "^9.4.2",
    -        "@architect/eslint-config": "^2.0.1",
    -        "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary",
    -        "eslint": "^8.6.0",
    -        "linkinator": "^2.16.2",
    -        "spellchecker-cli": "^4.8.1",
    -        "tap-arc": "^0.1.2",
    -        "tape": "^5.4.0",
    -        "tiny-json-http": "^7.3.1"
    -      }
    -    },
    -    "node_modules/@architect/architect": {
    -      "version": "9.4.2",
    -      "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.4.2.tgz",
    -      "integrity": "sha512-2XBsNHULMFCydG9YUqIYzoOZ2eLP4pkT3dnPMTf0B/5Qrby4t+sIbkTseLEkyK6Mhn1r8GWe+M/O4kYHNtIrpw==",
    -      "dev": true,
    -      "dependencies": {
    -        "@architect/create": "3.1.1",
    -        "@architect/deploy": "3.1.0",
    -        "@architect/destroy": "2.0.3",
    -        "@architect/env": "2.0.6",
    -        "@architect/hydrate": "2.1.0",
    -        "@architect/logs": "3.0.3",
    -        "@architect/package": "7.2.0",
    -        "@architect/sandbox": "4.4.2",
    -        "aws-sdk": "2.880.0",
    -        "chalk": "4.1.2",
    -        "update-notifier": "5.1.0"
    -      },
    -      "bin": {
    -        "arc": "src/index.js"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/asap": {
    -      "version": "4.1.0",
    -      "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-4.1.0.tgz",
    -      "integrity": "sha512-SrPV5lUpjotyj/nIMQWwdTsNe5LwieFHqhrVo8tKKXz7Ht7ila15rH9dyYENOmMI87UVHvKDbsRvx47LK5NMwQ==",
    -      "engines": {
    -        "node": ">=12"
    -      }
    -    },
    -    "node_modules/@architect/create": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/@architect/create/-/create-3.1.1.tgz",
    -      "integrity": "sha512-Du2YITXVrgpR49GaRqQe/sc8VBQ3B05/eWHlGAOjPUgmTRf4JycAoKxSPnTMYmEjQHJyrABs35cbHhse1vH1tw==",
    -      "dev": true,
    -      "dependencies": {
    -        "@architect/inventory": "~2.2.0",
    -        "@architect/utils": "~3.0.4",
    -        "chalk": "~4.1.2",
    -        "lambda-runtimes": "~1.1.0",
    -        "minimist": "~1.2.5"
    -      },
    -      "bin": {
    -        "arc-create": "cli.js"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/deploy": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.1.0.tgz",
    -      "integrity": "sha512-Sg4uZ6gSYrEwz5luOGkAkRm9fIrLoQvXZqaYOj4l6DZXNAt2A0EqoNLw9E6D7e6Y9kIqw42SJoIWNpqtx5sWpQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "@architect/create": "~3.1.0",
    -        "@architect/hydrate": "~2.1.0",
    -        "@architect/inventory": "~2.2.0",
    -        "@architect/package": "~7.2.0",
    -        "@architect/utils": "~3.0.4",
    -        "chalk": "~4.1.2",
    -        "fs-extra": "~10.0.0",
    -        "get-folder-size": "2.0.1",
    -        "glob": "~7.2.0",
    -        "mime-types": "~2.1.34",
    -        "ospath": "~1.2.2",
    -        "path-sort": "~0.1.0",
    -        "rimraf": "~3.0.2",
    -        "run-parallel": "~1.2.0",
    -        "run-series": "~1.1.9",
    -        "run-waterfall": "~1.1.7",
    -        "sha": "~3.0.0",
    -        "zip-dir": "~2.0.0",
    -        "zipit": "~2.0.0"
    -      },
    -      "bin": {
    -        "arc-deploy": "src/cli/index.js"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/destroy": {
    -      "version": "2.0.3",
    -      "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-2.0.3.tgz",
    -      "integrity": "sha512-lIaWPrcI5G/TOcP3AxdAQoRxD0DYdClRAUzrILKRoPbp9klFDlVB7+JPqoL7b/tNCxTRN6EES0mZv4yFK64NQA==",
    -      "dev": true,
    -      "dependencies": {
    -        "@architect/inventory": "~2.2.0",
    -        "@architect/utils": "~3.0.4",
    -        "aws-sdk": "2.880.0",
    -        "run-parallel": "~1.2.0",
    -        "run-waterfall": "~1.1.7"
    -      },
    -      "bin": {
    -        "arc-destroy": "src/cli.js"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/env": {
    -      "version": "2.0.6",
    -      "resolved": "https://registry.npmjs.org/@architect/env/-/env-2.0.6.tgz",
    -      "integrity": "sha512-Wk7bhkVs6hLTq8JFDiSjPmWgf+Je5Hhehj57lLUb8F1eNtlLFHUwv6X2W/zyodIvoqiDl4d0Zb9FOLDY5F3BNA==",
    -      "dev": true,
    -      "dependencies": {
    -        "@architect/inventory": "~2.2.0",
    -        "@architect/parser": "~5.0.2",
    -        "@architect/utils": "~3.0.4",
    -        "aws-sdk": "2.880.0",
    -        "chalk": "~4.1.2",
    -        "cross-env": "~7.0.3",
    -        "dotenv": "~10.0.0",
    -        "run-series": "~1.1.9",
    -        "run-waterfall": "~1.1.7",
    -        "yesno": "~0.3.1"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/eslint-config": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/@architect/eslint-config/-/eslint-config-2.0.1.tgz",
    -      "integrity": "sha512-VezbBc1DEikXXQNPBmIqz2DqKBr0ptrQ+lY7rdGxb2rxdRrmQ5OHVzSoHUxFA4Z7xNmWclTvx3RVYh3mfKKU/g==",
    -      "dev": true,
    -      "dependencies": {
    -        "eslint-plugin-filenames": "^1.3.2",
    -        "eslint-plugin-fp": "^2.3.0",
    -        "eslint-plugin-import": "^2.25.1"
    -      },
    -      "peerDependencies": {
    -        "eslint-plugin-filenames": "^1.3.2",
    -        "eslint-plugin-fp": "^2.3.0",
    -        "eslint-plugin-import": "^2.25.1"
    -      }
    -    },
    -    "node_modules/@architect/functions": {
    -      "version": "4.1.1",
    -      "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.1.1.tgz",
    -      "integrity": "sha512-x0+B/V9Jo5onksOce6iYdYeLh5F91dOp5fTnGJdkgOFCS+N0YN9zlI2asdPIs1Rb6xxCwoH1nuzs/jnNkupQWA==",
    -      "dependencies": {
    -        "aws-serverless-express": "^3.4.0",
    -        "cookie": "^0.4.1",
    -        "cookie-signature": "^1.1.0",
    -        "csrf": "^3.1.0",
    -        "node-webtokens": "^1.0.4",
    -        "run-parallel": "^1.2.0",
    -        "run-waterfall": "^1.1.7",
    -        "uid-safe": "^2.1.5"
    -      },
    -      "engines": {
    -        "node": ">=12"
    -      }
    -    },
    -    "node_modules/@architect/hydrate": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.1.0.tgz",
    -      "integrity": "sha512-mchkcEFZIZpkcIDLFndsCh0W1q5dmAOICMsO/rcAPYnRPvRQT8D4Bt+jFyV7AXu9OM3WGx34Llu/naKab/S1qQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "@architect/inventory": "~2.2.0",
    -        "@architect/utils": "~3.0.4",
    -        "acorn-loose": "~8.2.1",
    -        "chalk": "~4.1.2",
    -        "cpr": "~3.0.1",
    -        "esquery": "~1.4.0",
    -        "glob": "~7.2.0",
    -        "rimraf": "~3.0.2",
    -        "run-series": "~1.1.9",
    -        "symlink-or-copy": "~1.3.1"
    -      },
    -      "bin": {
    -        "arc-hydrate": "cli.js"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/inventory": {
    -      "version": "2.2.1",
    -      "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-2.2.1.tgz",
    -      "integrity": "sha512-Rwl3os2JFHantTENPFn6KUeIaChmYc1v6B/zGCe5yC82mrJBXNZu8tN6PtawC6dmhQdbfBGAc+MlhgUqKzpVTA==",
    -      "dependencies": {
    -        "@architect/asap": "~4.1.0",
    -        "@architect/parser": "~5.0.2",
    -        "@architect/utils": "~3.0.4",
    -        "lambda-runtimes": "~1.1.0"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/logs": {
    -      "version": "3.0.3",
    -      "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-3.0.3.tgz",
    -      "integrity": "sha512-21fFpQ8BmAbsCmSlVYD0P6+caVm7LTS/bhAgfoqKkoK26QBKkQIC+QdMvrAlI0mF0zgInnl1FmWxphRhK/jvWg==",
    -      "dev": true,
    -      "dependencies": {
    -        "@architect/inventory": "~2.2.0",
    -        "@architect/utils": "~3.0.4",
    -        "aws-sdk": "2.880.0",
    -        "chalk": "~4.1.2",
    -        "run-parallel": "~1.2.0",
    -        "run-waterfall": "~1.1.7",
    -        "strftime": "~0.10.0"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/package": {
    -      "version": "7.2.0",
    -      "resolved": "https://registry.npmjs.org/@architect/package/-/package-7.2.0.tgz",
    -      "integrity": "sha512-c1Z8pD0tLbTMSWviAZEJ9SARL2ONZUjX8/RmHT0s6F/mEVJNhUwNsfcxsblqLscUl+sv82tqIovkFkC+UG0fSw==",
    -      "dependencies": {
    -        "@architect/inventory": "~2.2.0",
    -        "@architect/utils": "~3.0.4",
    -        "chalk": "~4.1.2"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/parser": {
    -      "version": "5.0.2",
    -      "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-5.0.2.tgz",
    -      "integrity": "sha512-3XTuB/HS3GNDXXUQ2BJt7kVOViTGCR2O4hIUEb1l8FxsSmwzgpiR2CAzUA4ZhySxW+1a+Tg88YL2Yyb2kvLmlw==",
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/sandbox": {
    -      "version": "4.4.2",
    -      "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.4.2.tgz",
    -      "integrity": "sha512-WxCaGBc7X7OJW3I6OuMNnl4zwYlUzK+CSFgvPMx3X/VmLc37Mzm4SVn75jv+qW49iSdLDClzcAOCXT67brtPBw==",
    -      "dev": true,
    -      "dependencies": {
    -        "@architect/asap": "~4.1.0",
    -        "@architect/create": "~3.1.1",
    -        "@architect/hydrate": "~2.1.0",
    -        "@architect/inventory": "~2.2.1",
    -        "@architect/parser": "~5.0.2",
    -        "@architect/utils": "~3.0.4",
    -        "@begin/hashid": "~1.0.0",
    -        "aws-sdk": "2.880.0",
    -        "body-parser": "~1.19.0",
    -        "chalk": "~4.1.2",
    -        "depstatus": "~1.1.1",
    -        "dotenv": "~10.0.0",
    -        "dynalite": "~3.2.1",
    -        "finalhandler": "~1.1.2",
    -        "glob": "~7.2.0",
    -        "http-proxy": "~1.18.1",
    -        "lambda-runtimes": "~1.1.1",
    -        "minimist": "~1.2.5",
    -        "node-watch": "~0.7.2",
    -        "router": "~1.3.6",
    -        "run-parallel": "~1.2.0",
    -        "run-series": "~1.1.9",
    -        "send": "~0.17.1",
    -        "server-destroy": "~1.0.1",
    -        "tree-kill": "~1.2.2",
    -        "update-notifier": "~5.1.0",
    -        "ws": "~8.3.0"
    -      },
    -      "bin": {
    -        "sandbox": "src/cli/cli.js"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@architect/spellcheck-dictionary": {
    -      "version": "0.0.1",
    -      "resolved": "git+ssh://git@github.com/architect/spellcheck-dictionary.git#11cae7e5559dda8ab03a3e3d32931db9a4fd3165",
    -      "integrity": "sha512-AW45aIXaWw5zmky1/irEPMDc1ex9kKA4niKf7hFPm6kXEk9OyFzYLb3QtxlQovYh+qK71KtYEVb9Z8cyuHgRIA==",
    -      "dev": true,
    -      "license": "Apache-2.0"
    -    },
    -    "node_modules/@architect/syntaxes": {
    -      "version": "1.2.1",
    -      "resolved": "git+ssh://git@github.com/architect/syntaxes.git#ca61027ef8295e2bb012a8df9ac9240052f43b66",
    -      "integrity": "sha512-dGGwAfcHpNfuthuv5i5H8e/i+NFqZxA1Kwo8lxdJJ3JX1P3LNr7uyNE+VRqbdXJkC3JNi5Jw0VUmtkBRzB7j1g==",
    -      "license": "Apache-2.0"
    -    },
    -    "node_modules/@architect/utils": {
    -      "version": "3.0.4",
    -      "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.0.4.tgz",
    -      "integrity": "sha512-Tmzw9p55n2euNMLUyqcNPy82FLCQ0/3jpZqv5xcZ8erq4w3ssb2Ok5Fclm+56YCioyM4xUiwsGU/uC09+BWgTg==",
    -      "dependencies": {
    -        "chalk": "~4.1.2",
    -        "glob": "~7.2.0",
    -        "path-sort": "~0.1.0",
    -        "restore-cursor": "3.1.0",
    -        "run-series": "~1.1.9",
    -        "run-waterfall": "~1.1.7",
    -        "sha": "~3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/@babel/code-frame": {
    -      "version": "7.16.0",
    -      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
    -      "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
    -      "dev": true,
    -      "dependencies": {
    -        "@babel/highlight": "^7.16.0"
    -      },
    -      "engines": {
    -        "node": ">=6.9.0"
    -      }
    -    },
    -    "node_modules/@babel/helper-validator-identifier": {
    -      "version": "7.15.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
    -      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6.9.0"
    -      }
    -    },
    -    "node_modules/@babel/highlight": {
    -      "version": "7.16.0",
    -      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
    -      "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
    -      "dev": true,
    -      "dependencies": {
    -        "@babel/helper-validator-identifier": "^7.15.7",
    -        "chalk": "^2.0.0",
    -        "js-tokens": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6.9.0"
    -      }
    -    },
    -    "node_modules/@babel/highlight/node_modules/ansi-styles": {
    -      "version": "3.2.1",
    -      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    -      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    -      "dev": true,
    -      "dependencies": {
    -        "color-convert": "^1.9.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/@babel/highlight/node_modules/chalk": {
    -      "version": "2.4.2",
    -      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    -      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "ansi-styles": "^3.2.1",
    -        "escape-string-regexp": "^1.0.5",
    -        "supports-color": "^5.3.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/@babel/highlight/node_modules/color-convert": {
    -      "version": "1.9.3",
    -      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    -      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    -      "dev": true,
    -      "dependencies": {
    -        "color-name": "1.1.3"
    -      }
    -    },
    -    "node_modules/@babel/highlight/node_modules/color-name": {
    -      "version": "1.1.3",
    -      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    -      "dev": true
    -    },
    -    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    -      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.8.0"
    -      }
    -    },
    -    "node_modules/@babel/highlight/node_modules/has-flag": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/@babel/highlight/node_modules/supports-color": {
    -      "version": "5.5.0",
    -      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    -      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-flag": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/@begin/hashid": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/@begin/hashid/-/hashid-1.0.0.tgz",
    -      "integrity": "sha512-w+U9klEtRkt7hyW/f+/SvwPgJ4CTMO2ENddisX9dGgLUZKu+iKpb/IhYnQWIt9/Nnm/5DkApmiHGimPs621wwA==",
    -      "dev": true
    -    },
    -    "node_modules/@eslint/eslintrc": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
    -      "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "ajv": "^6.12.4",
    -        "debug": "^4.3.2",
    -        "espree": "^9.2.0",
    -        "globals": "^13.9.0",
    -        "ignore": "^4.0.6",
    -        "import-fresh": "^3.2.1",
    -        "js-yaml": "^4.1.0",
    -        "minimatch": "^3.0.4",
    -        "strip-json-comments": "^3.1.1"
    -      },
    -      "engines": {
    -        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    -      }
    -    },
    -    "node_modules/@eslint/eslintrc/node_modules/debug": {
    -      "version": "4.3.3",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    -      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "2.1.2"
    -      },
    -      "engines": {
    -        "node": ">=6.0"
    -      },
    -      "peerDependenciesMeta": {
    -        "supports-color": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/@eslint/eslintrc/node_modules/ms": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    -      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    -      "dev": true
    -    },
    -    "node_modules/@humanwhocodes/config-array": {
    -      "version": "0.9.2",
    -      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
    -      "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
    -      "dev": true,
    -      "dependencies": {
    -        "@humanwhocodes/object-schema": "^1.2.1",
    -        "debug": "^4.1.1",
    -        "minimatch": "^3.0.4"
    -      },
    -      "engines": {
    -        "node": ">=10.10.0"
    -      }
    -    },
    -    "node_modules/@humanwhocodes/config-array/node_modules/debug": {
    -      "version": "4.3.3",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    -      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "2.1.2"
    -      },
    -      "engines": {
    -        "node": ">=6.0"
    -      },
    -      "peerDependenciesMeta": {
    -        "supports-color": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/@humanwhocodes/config-array/node_modules/ms": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    -      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    -      "dev": true
    -    },
    -    "node_modules/@humanwhocodes/object-schema": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
    -      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
    -      "dev": true
    -    },
    -    "node_modules/@nodelib/fs.scandir": {
    -      "version": "2.1.5",
    -      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
    -      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
    -      "dev": true,
    -      "dependencies": {
    -        "@nodelib/fs.stat": "2.0.5",
    -        "run-parallel": "^1.1.9"
    -      },
    -      "engines": {
    -        "node": ">= 8"
    -      }
    -    },
    -    "node_modules/@nodelib/fs.stat": {
    -      "version": "2.0.5",
    -      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
    -      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 8"
    -      }
    -    },
    -    "node_modules/@nodelib/fs.walk": {
    -      "version": "1.2.8",
    -      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
    -      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
    -      "dev": true,
    -      "dependencies": {
    -        "@nodelib/fs.scandir": "2.1.5",
    -        "fastq": "^1.6.0"
    -      },
    -      "engines": {
    -        "node": ">= 8"
    -      }
    -    },
    -    "node_modules/@sindresorhus/is": {
    -      "version": "0.14.0",
    -      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
    -      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/@szmarczak/http-timer": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
    -      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
    -      "dev": true,
    -      "dependencies": {
    -        "defer-to-connect": "^1.0.1"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/@toycode/markdown-it-class": {
    -      "version": "1.2.4",
    -      "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz",
    -      "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ=="
    -    },
    -    "node_modules/@types/json5": {
    -      "version": "0.0.29",
    -      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
    -      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
    -      "dev": true
    -    },
    -    "node_modules/@types/mdast": {
    -      "version": "3.0.10",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
    -      "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/unist": "*"
    -      }
    -    },
    -    "node_modules/@types/minimist": {
    -      "version": "1.2.2",
    -      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
    -      "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
    -      "dev": true
    -    },
    -    "node_modules/@types/normalize-package-data": {
    -      "version": "2.4.1",
    -      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
    -      "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
    -      "dev": true
    -    },
    -    "node_modules/@types/unist": {
    -      "version": "2.0.6",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
    -      "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==",
    -      "dev": true
    -    },
    -    "node_modules/@vendia/serverless-express": {
    -      "version": "3.4.0",
    -      "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-3.4.0.tgz",
    -      "integrity": "sha512-/UAAbi9qRjUtjRISt5MJ1sfhtrHb26hqQ0nvE5qhMLsAdR5H7ErBwPD8Q/v2OENKm0iWsGwErIZEg7ebUeFDjQ==",
    -      "dependencies": {
    -        "binary-case": "^1.0.0",
    -        "type-is": "^1.6.16"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/abort-controller": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
    -      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
    -      "dev": true,
    -      "dependencies": {
    -        "event-target-shim": "^5.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6.5"
    -      }
    -    },
    -    "node_modules/abstract-leveldown": {
    -      "version": "6.2.3",
    -      "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
    -      "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "buffer": "^5.5.0",
    -        "immediate": "^3.2.3",
    -        "level-concat-iterator": "~2.0.0",
    -        "level-supports": "~1.0.0",
    -        "xtend": "~4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/abstract-leveldown/node_modules/buffer": {
    -      "version": "5.7.1",
    -      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    -      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ],
    -      "dependencies": {
    -        "base64-js": "^1.3.1",
    -        "ieee754": "^1.1.13"
    -      }
    -    },
    -    "node_modules/acorn": {
    -      "version": "8.7.0",
    -      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
    -      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
    -      "dev": true,
    -      "bin": {
    -        "acorn": "bin/acorn"
    -      },
    -      "engines": {
    -        "node": ">=0.4.0"
    -      }
    -    },
    -    "node_modules/acorn-jsx": {
    -      "version": "5.3.2",
    -      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
    -      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
    -      "dev": true,
    -      "peerDependencies": {
    -        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
    -      }
    -    },
    -    "node_modules/acorn-loose": {
    -      "version": "8.2.1",
    -      "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.2.1.tgz",
    -      "integrity": "sha512-/sVu5wCtWrX6ChLCMzBTmNkXSoyRKunTf6HjHMswzMmzIyE8vU+HYlgd2kFF/A9Av9j+b9/d/FzxrmcH0lCrBw==",
    -      "dev": true,
    -      "dependencies": {
    -        "acorn": "^8.5.0"
    -      },
    -      "engines": {
    -        "node": ">=0.4.0"
    -      }
    -    },
    -    "node_modules/agent-base": {
    -      "version": "6.0.2",
    -      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
    -      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "debug": "4"
    -      },
    -      "engines": {
    -        "node": ">= 6.0.0"
    -      }
    -    },
    -    "node_modules/agent-base/node_modules/debug": {
    -      "version": "4.3.2",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    -      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "2.1.2"
    -      },
    -      "engines": {
    -        "node": ">=6.0"
    -      },
    -      "peerDependenciesMeta": {
    -        "supports-color": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/agent-base/node_modules/ms": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    -      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    -      "dev": true
    -    },
    -    "node_modules/ajv": {
    -      "version": "6.12.6",
    -      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
    -      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
    -      "dev": true,
    -      "dependencies": {
    -        "fast-deep-equal": "^3.1.1",
    -        "fast-json-stable-stringify": "^2.0.0",
    -        "json-schema-traverse": "^0.4.1",
    -        "uri-js": "^4.2.2"
    -      },
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/epoberezkin"
    -      }
    -    },
    -    "node_modules/ansi-align": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
    -      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
    -      "dev": true,
    -      "dependencies": {
    -        "string-width": "^4.1.0"
    -      }
    -    },
    -    "node_modules/ansi-colors": {
    -      "version": "4.1.1",
    -      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
    -      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/ansi-regex": {
    -      "version": "5.0.1",
    -      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
    -      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/ansi-styles": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
    -      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
    -      "dependencies": {
    -        "color-convert": "^2.0.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    -      }
    -    },
    -    "node_modules/app-root-path": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz",
    -      "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 6.0.0"
    -      }
    -    },
    -    "node_modules/argparse": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    -      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
    -    },
    -    "node_modules/array-back": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
    -      "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/array-flatten": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz",
    -      "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==",
    -      "dev": true
    -    },
    -    "node_modules/array-includes": {
    -      "version": "3.1.4",
    -      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
    -      "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1",
    -        "get-intrinsic": "^1.1.1",
    -        "is-string": "^1.0.7"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/array-iterate": {
    -      "version": "1.1.4",
    -      "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz",
    -      "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/array-union": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
    -      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/array.prototype.flat": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
    -      "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/arrify": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
    -      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/async": {
    -      "version": "2.6.3",
    -      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
    -      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
    -      "dev": true,
    -      "dependencies": {
    -        "lodash": "^4.17.14"
    -      }
    -    },
    -    "node_modules/available-typed-arrays": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
    -      "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/aws-sdk": {
    -      "version": "2.880.0",
    -      "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.880.0.tgz",
    -      "integrity": "sha512-/dBk3ejw22ED2edzGfmJB83KXDA4wLIw5Hb+2YMhly+gOWecvevy0tML2+YN/cmxyTy+wT0E0sM7fm1v7kmHtw==",
    -      "dev": true,
    -      "dependencies": {
    -        "buffer": "4.9.2",
    -        "events": "1.1.1",
    -        "ieee754": "1.1.13",
    -        "jmespath": "0.15.0",
    -        "querystring": "0.2.0",
    -        "sax": "1.2.1",
    -        "url": "0.10.3",
    -        "uuid": "3.3.2",
    -        "xml2js": "0.4.19"
    -      },
    -      "engines": {
    -        "node": ">= 0.8.0"
    -      }
    -    },
    -    "node_modules/aws-serverless-express": {
    -      "version": "3.4.0",
    -      "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.4.0.tgz",
    -      "integrity": "sha512-YG9ZjAOI9OpwqDDWzkRc3kKJYJuR7gTMjLa3kAWopO17myoprxskCUyCEee+RKe34tcR4UNrVtgAwW5yDe74bw==",
    -      "dependencies": {
    -        "@vendia/serverless-express": "^3.4.0",
    -        "binary-case": "^1.0.0",
    -        "type-is": "^1.6.16"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/bail": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
    -      "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/balanced-match": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
    -      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    -    },
    -    "node_modules/base64-js": {
    -      "version": "1.5.1",
    -      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
    -      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ]
    -    },
    -    "node_modules/big.js": {
    -      "version": "5.2.2",
    -      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
    -      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": "*"
    -      }
    -    },
    -    "node_modules/binary-case": {
    -      "version": "1.1.4",
    -      "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz",
    -      "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg=="
    -    },
    -    "node_modules/body-parser": {
    -      "version": "1.19.1",
    -      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz",
    -      "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==",
    -      "dev": true,
    -      "dependencies": {
    -        "bytes": "3.1.1",
    -        "content-type": "~1.0.4",
    -        "debug": "2.6.9",
    -        "depd": "~1.1.2",
    -        "http-errors": "1.8.1",
    -        "iconv-lite": "0.4.24",
    -        "on-finished": "~2.3.0",
    -        "qs": "6.9.6",
    -        "raw-body": "2.4.2",
    -        "type-is": "~1.6.18"
    -      },
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/boxen": {
    -      "version": "5.1.2",
    -      "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
    -      "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "ansi-align": "^3.0.0",
    -        "camelcase": "^6.2.0",
    -        "chalk": "^4.1.0",
    -        "cli-boxes": "^2.2.1",
    -        "string-width": "^4.2.2",
    -        "type-fest": "^0.20.2",
    -        "widest-line": "^3.1.0",
    -        "wrap-ansi": "^7.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/brace-expansion": {
    -      "version": "1.1.11",
    -      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
    -      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
    -      "dependencies": {
    -        "balanced-match": "^1.0.0",
    -        "concat-map": "0.0.1"
    -      }
    -    },
    -    "node_modules/braces": {
    -      "version": "3.0.2",
    -      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
    -      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
    -      "dev": true,
    -      "dependencies": {
    -        "fill-range": "^7.0.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/buffer": {
    -      "version": "4.9.2",
    -      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
    -      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
    -      "dev": true,
    -      "dependencies": {
    -        "base64-js": "^1.0.2",
    -        "ieee754": "^1.1.4",
    -        "isarray": "^1.0.0"
    -      }
    -    },
    -    "node_modules/buffer-crc32": {
    -      "version": "0.2.13",
    -      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
    -      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
    -      "dev": true,
    -      "engines": {
    -        "node": "*"
    -      }
    -    },
    -    "node_modules/bytes": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
    -      "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/cacheable-request": {
    -      "version": "6.1.0",
    -      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
    -      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
    -      "dev": true,
    -      "dependencies": {
    -        "clone-response": "^1.0.2",
    -        "get-stream": "^5.1.0",
    -        "http-cache-semantics": "^4.0.0",
    -        "keyv": "^3.0.0",
    -        "lowercase-keys": "^2.0.0",
    -        "normalize-url": "^4.1.0",
    -        "responselike": "^1.0.2"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/cacheable-request/node_modules/get-stream": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
    -      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
    -      "dev": true,
    -      "dependencies": {
    -        "pump": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/cacheable-request/node_modules/lowercase-keys": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
    -      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/call-bind": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
    -      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
    -      "dev": true,
    -      "dependencies": {
    -        "function-bind": "^1.1.1",
    -        "get-intrinsic": "^1.0.2"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/callsites": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
    -      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/camelcase": {
    -      "version": "6.2.0",
    -      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
    -      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/camelcase-keys": {
    -      "version": "6.2.2",
    -      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
    -      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
    -      "dev": true,
    -      "dependencies": {
    -        "camelcase": "^5.3.1",
    -        "map-obj": "^4.0.0",
    -        "quick-lru": "^4.0.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/camelcase-keys/node_modules/camelcase": {
    -      "version": "5.3.1",
    -      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    -      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/chalk": {
    -      "version": "4.1.2",
    -      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
    -      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
    -      "dependencies": {
    -        "ansi-styles": "^4.1.0",
    -        "supports-color": "^7.1.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/chalk/chalk?sponsor=1"
    -      }
    -    },
    -    "node_modules/character-entities": {
    -      "version": "1.2.4",
    -      "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
    -      "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/character-entities-legacy": {
    -      "version": "1.1.4",
    -      "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
    -      "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/character-reference-invalid": {
    -      "version": "1.1.4",
    -      "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
    -      "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/ci-info": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
    -      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
    -      "dev": true
    -    },
    -    "node_modules/cli-boxes": {
    -      "version": "2.2.1",
    -      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
    -      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/clone": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
    -      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
    -      "engines": {
    -        "node": ">=0.8"
    -      }
    -    },
    -    "node_modules/clone-response": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
    -      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
    -      "dev": true,
    -      "dependencies": {
    -        "mimic-response": "^1.0.0"
    -      }
    -    },
    -    "node_modules/color-convert": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
    -      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
    -      "dependencies": {
    -        "color-name": "~1.1.4"
    -      },
    -      "engines": {
    -        "node": ">=7.0.0"
    -      }
    -    },
    -    "node_modules/color-name": {
    -      "version": "1.1.4",
    -      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
    -      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
    -    },
    -    "node_modules/command-line-args": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz",
    -      "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-back": "^3.1.0",
    -        "find-replace": "^3.0.0",
    -        "lodash.camelcase": "^4.3.0",
    -        "typical": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4.0.0"
    -      }
    -    },
    -    "node_modules/command-line-usage": {
    -      "version": "5.0.5",
    -      "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz",
    -      "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-back": "^2.0.0",
    -        "chalk": "^2.4.1",
    -        "table-layout": "^0.4.3",
    -        "typical": "^2.6.1"
    -      },
    -      "engines": {
    -        "node": ">=4.0.0"
    -      }
    -    },
    -    "node_modules/command-line-usage/node_modules/ansi-styles": {
    -      "version": "3.2.1",
    -      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    -      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    -      "dev": true,
    -      "dependencies": {
    -        "color-convert": "^1.9.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/command-line-usage/node_modules/array-back": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
    -      "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
    -      "dev": true,
    -      "dependencies": {
    -        "typical": "^2.6.1"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/command-line-usage/node_modules/chalk": {
    -      "version": "2.4.2",
    -      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    -      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "ansi-styles": "^3.2.1",
    -        "escape-string-regexp": "^1.0.5",
    -        "supports-color": "^5.3.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/command-line-usage/node_modules/color-convert": {
    -      "version": "1.9.3",
    -      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    -      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    -      "dev": true,
    -      "dependencies": {
    -        "color-name": "1.1.3"
    -      }
    -    },
    -    "node_modules/command-line-usage/node_modules/color-name": {
    -      "version": "1.1.3",
    -      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    -      "dev": true
    -    },
    -    "node_modules/command-line-usage/node_modules/escape-string-regexp": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    -      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.8.0"
    -      }
    -    },
    -    "node_modules/command-line-usage/node_modules/has-flag": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/command-line-usage/node_modules/supports-color": {
    -      "version": "5.5.0",
    -      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    -      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-flag": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/command-line-usage/node_modules/typical": {
    -      "version": "2.6.1",
    -      "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    -      "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    -      "dev": true
    -    },
    -    "node_modules/concat-map": {
    -      "version": "0.0.1",
    -      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
    -      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    -    },
    -    "node_modules/configstore": {
    -      "version": "5.0.1",
    -      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
    -      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
    -      "dev": true,
    -      "dependencies": {
    -        "dot-prop": "^5.2.0",
    -        "graceful-fs": "^4.1.2",
    -        "make-dir": "^3.0.0",
    -        "unique-string": "^2.0.0",
    -        "write-file-atomic": "^3.0.0",
    -        "xdg-basedir": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/content-type": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
    -      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/cookie": {
    -      "version": "0.4.1",
    -      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
    -      "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/cookie-signature": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz",
    -      "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==",
    -      "engines": {
    -        "node": ">=6.6.0"
    -      }
    -    },
    -    "node_modules/core-util-is": {
    -      "version": "1.0.3",
    -      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
    -      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
    -      "dev": true
    -    },
    -    "node_modules/cpr": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz",
    -      "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=",
    -      "dev": true,
    -      "dependencies": {
    -        "graceful-fs": "^4.1.5",
    -        "minimist": "^1.2.0",
    -        "mkdirp": "~0.5.1",
    -        "rimraf": "^2.5.4"
    -      },
    -      "bin": {
    -        "cpr": "bin/cpr"
    -      }
    -    },
    -    "node_modules/cpr/node_modules/rimraf": {
    -      "version": "2.7.1",
    -      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
    -      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
    -      "dev": true,
    -      "dependencies": {
    -        "glob": "^7.1.3"
    -      },
    -      "bin": {
    -        "rimraf": "bin.js"
    -      }
    -    },
    -    "node_modules/create-eslint-index": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/create-eslint-index/-/create-eslint-index-1.0.0.tgz",
    -      "integrity": "sha1-2VQ3LYbVeS/NZ+nyt5GxqxYkEbs=",
    -      "dev": true,
    -      "dependencies": {
    -        "lodash.get": "^4.3.0"
    -      },
    -      "engines": {
    -        "node": ">=4.0.0"
    -      }
    -    },
    -    "node_modules/cross-env": {
    -      "version": "7.0.3",
    -      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
    -      "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
    -      "dev": true,
    -      "dependencies": {
    -        "cross-spawn": "^7.0.1"
    -      },
    -      "bin": {
    -        "cross-env": "src/bin/cross-env.js",
    -        "cross-env-shell": "src/bin/cross-env-shell.js"
    -      },
    -      "engines": {
    -        "node": ">=10.14",
    -        "npm": ">=6",
    -        "yarn": ">=1"
    -      }
    -    },
    -    "node_modules/cross-spawn": {
    -      "version": "7.0.3",
    -      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
    -      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
    -      "dev": true,
    -      "dependencies": {
    -        "path-key": "^3.1.0",
    -        "shebang-command": "^2.0.0",
    -        "which": "^2.0.1"
    -      },
    -      "engines": {
    -        "node": ">= 8"
    -      }
    -    },
    -    "node_modules/crypto-random-string": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
    -      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/csrf": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz",
    -      "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==",
    -      "dependencies": {
    -        "rndm": "1.2.0",
    -        "tsscmp": "1.0.6",
    -        "uid-safe": "2.1.5"
    -      },
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/date-format": {
    -      "version": "0.0.2",
    -      "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.2.tgz",
    -      "integrity": "sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE=",
    -      "dev": true
    -    },
    -    "node_modules/debug": {
    -      "version": "2.6.9",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
    -      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "2.0.0"
    -      }
    -    },
    -    "node_modules/decamelize": {
    -      "version": "1.2.0",
    -      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
    -      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/decamelize-keys": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
    -      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
    -      "dev": true,
    -      "dependencies": {
    -        "decamelize": "^1.1.0",
    -        "map-obj": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/decamelize-keys/node_modules/map-obj": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
    -      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/decompress-response": {
    -      "version": "3.3.0",
    -      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
    -      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
    -      "dev": true,
    -      "dependencies": {
    -        "mimic-response": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/deep-equal": {
    -      "version": "2.0.5",
    -      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
    -      "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.0",
    -        "es-get-iterator": "^1.1.1",
    -        "get-intrinsic": "^1.0.1",
    -        "is-arguments": "^1.0.4",
    -        "is-date-object": "^1.0.2",
    -        "is-regex": "^1.1.1",
    -        "isarray": "^2.0.5",
    -        "object-is": "^1.1.4",
    -        "object-keys": "^1.1.1",
    -        "object.assign": "^4.1.2",
    -        "regexp.prototype.flags": "^1.3.0",
    -        "side-channel": "^1.0.3",
    -        "which-boxed-primitive": "^1.0.1",
    -        "which-collection": "^1.0.1",
    -        "which-typed-array": "^1.1.2"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/deep-equal/node_modules/isarray": {
    -      "version": "2.0.5",
    -      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
    -      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
    -      "dev": true
    -    },
    -    "node_modules/deep-extend": {
    -      "version": "0.6.0",
    -      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
    -      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4.0.0"
    -      }
    -    },
    -    "node_modules/deep-is": {
    -      "version": "0.1.4",
    -      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
    -      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
    -      "dev": true
    -    },
    -    "node_modules/defer-to-connect": {
    -      "version": "1.1.3",
    -      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
    -      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
    -      "dev": true
    -    },
    -    "node_modules/deferred-leveldown": {
    -      "version": "5.3.0",
    -      "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz",
    -      "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==",
    -      "dev": true,
    -      "dependencies": {
    -        "abstract-leveldown": "~6.2.1",
    -        "inherits": "^2.0.3"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/define-properties": {
    -      "version": "1.1.3",
    -      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
    -      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "object-keys": "^1.0.12"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      }
    -    },
    -    "node_modules/defined": {
    -      "version": "0.0.0",
    -      "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz",
    -      "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=",
    -      "dev": true
    -    },
    -    "node_modules/depd": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
    -      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/depstatus": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/depstatus/-/depstatus-1.1.1.tgz",
    -      "integrity": "sha512-QT4i2Ql8RS1ttcj7zo4RzYvKz+/eOOIh6N7CXHqfDqC5ZX1hfx5KX6T88gy/j2UWP2x2ytjSoFBl+XW0gVZMug==",
    -      "dev": true,
    -      "dependencies": {
    -        "semver": "^7.3.2"
    -      }
    -    },
    -    "node_modules/destroy": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
    -      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
    -      "dev": true
    -    },
    -    "node_modules/dictionary-en-au": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.3.0.tgz",
    -      "integrity": "sha512-KoEotpXPCyCgZ5DHlexHyzFfNwPnv9VupeCrp6r+JrtEkycPmZYbQiXF+cXz9NJr1gXy0AMEpzZ8UfxF40+8OQ==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/dictionary-en-ca": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.3.0.tgz",
    -      "integrity": "sha512-5p6B2+GLByVz3Gvb42Y5hTdFBNxJhgG7XRVM74J7hcp+DvtAfOrufTZFfkux9t0qWOjORZoDCmDI6uKiX8qeuQ==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/dictionary-en-gb": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.3.0.tgz",
    -      "integrity": "sha512-P/J2VQp/hDsMTfJhmIYPUBxZqezWuDaUzSgb6oW7JLpUV2So9jCXbR5TaUYXwfO50ZXPYEzQqQHPQK3pKcs7Rg==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/dictionary-en-us": {
    -      "version": "2.2.1",
    -      "resolved": "https://registry.npmjs.org/dictionary-en-us/-/dictionary-en-us-2.2.1.tgz",
    -      "integrity": "sha512-Z8mycV0ywTfjbUTi0JZfQHqBZhu4CYFtpf7KluSGpt3xHpFlal2S/hiK50tlPynOtR5K3pG5wCradnz1yxwOHA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/dictionary-en-za": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.0.4.tgz",
    -      "integrity": "sha512-EgI61DvQsrnIFBmmCz7GB9P/wkCnKnZgKRXyYpbkZomnY0I4vDfNZtjaX81lwb9s+eudP9QJ+8sMzK7eoUapEg==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/dictionary-vi": {
    -      "version": "2.1.3",
    -      "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.1.3.tgz",
    -      "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/dir-glob": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
    -      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
    -      "dev": true,
    -      "dependencies": {
    -        "path-type": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/doctrine": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
    -      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
    -      "dev": true,
    -      "dependencies": {
    -        "esutils": "^2.0.2"
    -      },
    -      "engines": {
    -        "node": ">=6.0.0"
    -      }
    -    },
    -    "node_modules/dom-serializer": {
    -      "version": "1.3.2",
    -      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
    -      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
    -      "dev": true,
    -      "dependencies": {
    -        "domelementtype": "^2.0.1",
    -        "domhandler": "^4.2.0",
    -        "entities": "^2.0.0"
    -      },
    -      "funding": {
    -        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
    -      }
    -    },
    -    "node_modules/domelementtype": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
    -      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/fb55"
    -        }
    -      ]
    -    },
    -    "node_modules/domhandler": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
    -      "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
    -      "dev": true,
    -      "dependencies": {
    -        "domelementtype": "^2.2.0"
    -      },
    -      "engines": {
    -        "node": ">= 4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/fb55/domhandler?sponsor=1"
    -      }
    -    },
    -    "node_modules/domutils": {
    -      "version": "2.8.0",
    -      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    -      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    -      "dev": true,
    -      "dependencies": {
    -        "dom-serializer": "^1.0.1",
    -        "domelementtype": "^2.2.0",
    -        "domhandler": "^4.2.0"
    -      },
    -      "funding": {
    -        "url": "https://github.com/fb55/domutils?sponsor=1"
    -      }
    -    },
    -    "node_modules/dot-prop": {
    -      "version": "5.3.0",
    -      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
    -      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-obj": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/dotenv": {
    -      "version": "10.0.0",
    -      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
    -      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/dotignore": {
    -      "version": "0.1.2",
    -      "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz",
    -      "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==",
    -      "dev": true,
    -      "dependencies": {
    -        "minimatch": "^3.0.4"
    -      },
    -      "bin": {
    -        "ignored": "bin/ignored"
    -      }
    -    },
    -    "node_modules/duplexer3": {
    -      "version": "0.1.4",
    -      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
    -      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
    -      "dev": true
    -    },
    -    "node_modules/dynalite": {
    -      "version": "3.2.1",
    -      "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz",
    -      "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "async": "^2.6.3",
    -        "big.js": "^5.2.2",
    -        "buffer-crc32": "^0.2.13",
    -        "lazy": "^1.0.11",
    -        "levelup": "^4.4.0",
    -        "lock": "^1.1.0",
    -        "memdown": "^5.1.0",
    -        "minimist": "^1.2.5",
    -        "once": "^1.4.0",
    -        "subleveldown": "^5.0.0"
    -      },
    -      "bin": {
    -        "dynalite": "cli.js"
    -      },
    -      "optionalDependencies": {
    -        "leveldown": "^5.2.1"
    -      }
    -    },
    -    "node_modules/ee-first": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
    -      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
    -      "dev": true
    -    },
    -    "node_modules/emoji-regex": {
    -      "version": "8.0.0",
    -      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
    -      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
    -      "dev": true
    -    },
    -    "node_modules/encodeurl": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
    -      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/encoding-down": {
    -      "version": "6.3.0",
    -      "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz",
    -      "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==",
    -      "dev": true,
    -      "dependencies": {
    -        "abstract-leveldown": "^6.2.1",
    -        "inherits": "^2.0.3",
    -        "level-codec": "^9.0.0",
    -        "level-errors": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/end-of-stream": {
    -      "version": "1.4.4",
    -      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
    -      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "once": "^1.4.0"
    -      }
    -    },
    -    "node_modules/enquirer": {
    -      "version": "2.3.6",
    -      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
    -      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
    -      "dev": true,
    -      "dependencies": {
    -        "ansi-colors": "^4.1.1"
    -      },
    -      "engines": {
    -        "node": ">=8.6"
    -      }
    -    },
    -    "node_modules/entities": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
    -      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
    -      "funding": {
    -        "url": "https://github.com/fb55/entities?sponsor=1"
    -      }
    -    },
    -    "node_modules/errno": {
    -      "version": "0.1.8",
    -      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
    -      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
    -      "dev": true,
    -      "dependencies": {
    -        "prr": "~1.0.1"
    -      },
    -      "bin": {
    -        "errno": "cli.js"
    -      }
    -    },
    -    "node_modules/error-ex": {
    -      "version": "1.3.2",
    -      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
    -      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-arrayish": "^0.2.1"
    -      }
    -    },
    -    "node_modules/es-abstract": {
    -      "version": "1.19.1",
    -      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
    -      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "es-to-primitive": "^1.2.1",
    -        "function-bind": "^1.1.1",
    -        "get-intrinsic": "^1.1.1",
    -        "get-symbol-description": "^1.0.0",
    -        "has": "^1.0.3",
    -        "has-symbols": "^1.0.2",
    -        "internal-slot": "^1.0.3",
    -        "is-callable": "^1.2.4",
    -        "is-negative-zero": "^2.0.1",
    -        "is-regex": "^1.1.4",
    -        "is-shared-array-buffer": "^1.0.1",
    -        "is-string": "^1.0.7",
    -        "is-weakref": "^1.0.1",
    -        "object-inspect": "^1.11.0",
    -        "object-keys": "^1.1.1",
    -        "object.assign": "^4.1.2",
    -        "string.prototype.trimend": "^1.0.4",
    -        "string.prototype.trimstart": "^1.0.4",
    -        "unbox-primitive": "^1.0.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/es-get-iterator": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
    -      "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "get-intrinsic": "^1.1.0",
    -        "has-symbols": "^1.0.1",
    -        "is-arguments": "^1.1.0",
    -        "is-map": "^2.0.2",
    -        "is-set": "^2.0.2",
    -        "is-string": "^1.0.5",
    -        "isarray": "^2.0.5"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/es-get-iterator/node_modules/isarray": {
    -      "version": "2.0.5",
    -      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
    -      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
    -      "dev": true
    -    },
    -    "node_modules/es-to-primitive": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
    -      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-callable": "^1.1.4",
    -        "is-date-object": "^1.0.1",
    -        "is-symbol": "^1.0.2"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/escape-goat": {
    -      "version": "2.1.1",
    -      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
    -      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/escape-html": {
    -      "version": "1.0.3",
    -      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
    -      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
    -      "dev": true
    -    },
    -    "node_modules/escape-string-regexp": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
    -      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/eslint": {
    -      "version": "8.6.0",
    -      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz",
    -      "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==",
    -      "dev": true,
    -      "dependencies": {
    -        "@eslint/eslintrc": "^1.0.5",
    -        "@humanwhocodes/config-array": "^0.9.2",
    -        "ajv": "^6.10.0",
    -        "chalk": "^4.0.0",
    -        "cross-spawn": "^7.0.2",
    -        "debug": "^4.3.2",
    -        "doctrine": "^3.0.0",
    -        "enquirer": "^2.3.5",
    -        "escape-string-regexp": "^4.0.0",
    -        "eslint-scope": "^7.1.0",
    -        "eslint-utils": "^3.0.0",
    -        "eslint-visitor-keys": "^3.1.0",
    -        "espree": "^9.3.0",
    -        "esquery": "^1.4.0",
    -        "esutils": "^2.0.2",
    -        "fast-deep-equal": "^3.1.3",
    -        "file-entry-cache": "^6.0.1",
    -        "functional-red-black-tree": "^1.0.1",
    -        "glob-parent": "^6.0.1",
    -        "globals": "^13.6.0",
    -        "ignore": "^4.0.6",
    -        "import-fresh": "^3.0.0",
    -        "imurmurhash": "^0.1.4",
    -        "is-glob": "^4.0.0",
    -        "js-yaml": "^4.1.0",
    -        "json-stable-stringify-without-jsonify": "^1.0.1",
    -        "levn": "^0.4.1",
    -        "lodash.merge": "^4.6.2",
    -        "minimatch": "^3.0.4",
    -        "natural-compare": "^1.4.0",
    -        "optionator": "^0.9.1",
    -        "progress": "^2.0.0",
    -        "regexpp": "^3.2.0",
    -        "semver": "^7.2.1",
    -        "strip-ansi": "^6.0.1",
    -        "strip-json-comments": "^3.1.0",
    -        "text-table": "^0.2.0",
    -        "v8-compile-cache": "^2.0.3"
    -      },
    -      "bin": {
    -        "eslint": "bin/eslint.js"
    -      },
    -      "engines": {
    -        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    -      },
    -      "funding": {
    -        "url": "https://opencollective.com/eslint"
    -      }
    -    },
    -    "node_modules/eslint-ast-utils": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz",
    -      "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==",
    -      "dev": true,
    -      "dependencies": {
    -        "lodash.get": "^4.4.2",
    -        "lodash.zip": "^4.2.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/eslint-import-resolver-node": {
    -      "version": "0.3.6",
    -      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
    -      "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
    -      "dev": true,
    -      "dependencies": {
    -        "debug": "^3.2.7",
    -        "resolve": "^1.20.0"
    -      }
    -    },
    -    "node_modules/eslint-import-resolver-node/node_modules/debug": {
    -      "version": "3.2.7",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    -      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "^2.1.1"
    -      }
    -    },
    -    "node_modules/eslint-import-resolver-node/node_modules/ms": {
    -      "version": "2.1.3",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    -      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    -      "dev": true
    -    },
    -    "node_modules/eslint-module-utils": {
    -      "version": "2.7.1",
    -      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
    -      "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "debug": "^3.2.7",
    -        "find-up": "^2.1.0",
    -        "pkg-dir": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/eslint-module-utils/node_modules/debug": {
    -      "version": "3.2.7",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    -      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "^2.1.1"
    -      }
    -    },
    -    "node_modules/eslint-module-utils/node_modules/ms": {
    -      "version": "2.1.3",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    -      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    -      "dev": true
    -    },
    -    "node_modules/eslint-plugin-filenames": {
    -      "version": "1.3.2",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz",
    -      "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==",
    -      "dev": true,
    -      "dependencies": {
    -        "lodash.camelcase": "4.3.0",
    -        "lodash.kebabcase": "4.1.1",
    -        "lodash.snakecase": "4.1.1",
    -        "lodash.upperfirst": "4.3.1"
    -      },
    -      "peerDependencies": {
    -        "eslint": "*"
    -      }
    -    },
    -    "node_modules/eslint-plugin-fp": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-fp/-/eslint-plugin-fp-2.3.0.tgz",
    -      "integrity": "sha1-N20qEIcQ6YGYC9w4deO5kg2gSJw=",
    -      "dev": true,
    -      "dependencies": {
    -        "create-eslint-index": "^1.0.0",
    -        "eslint-ast-utils": "^1.0.0",
    -        "lodash": "^4.13.1",
    -        "req-all": "^0.1.0"
    -      },
    -      "engines": {
    -        "node": ">=4.0.0"
    -      },
    -      "peerDependencies": {
    -        "eslint": ">=3"
    -      }
    -    },
    -    "node_modules/eslint-plugin-import": {
    -      "version": "2.25.2",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz",
    -      "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-includes": "^3.1.4",
    -        "array.prototype.flat": "^1.2.5",
    -        "debug": "^2.6.9",
    -        "doctrine": "^2.1.0",
    -        "eslint-import-resolver-node": "^0.3.6",
    -        "eslint-module-utils": "^2.7.0",
    -        "has": "^1.0.3",
    -        "is-core-module": "^2.7.0",
    -        "is-glob": "^4.0.3",
    -        "minimatch": "^3.0.4",
    -        "object.values": "^1.1.5",
    -        "resolve": "^1.20.0",
    -        "tsconfig-paths": "^3.11.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      },
    -      "peerDependencies": {
    -        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
    -      }
    -    },
    -    "node_modules/eslint-plugin-import/node_modules/doctrine": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
    -      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
    -      "dev": true,
    -      "dependencies": {
    -        "esutils": "^2.0.2"
    -      },
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/eslint-scope": {
    -      "version": "7.1.0",
    -      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
    -      "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
    -      "dev": true,
    -      "dependencies": {
    -        "esrecurse": "^4.3.0",
    -        "estraverse": "^5.2.0"
    -      },
    -      "engines": {
    -        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    -      }
    -    },
    -    "node_modules/eslint-utils": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
    -      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
    -      "dev": true,
    -      "dependencies": {
    -        "eslint-visitor-keys": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/mysticatea"
    -      },
    -      "peerDependencies": {
    -        "eslint": ">=5"
    -      }
    -    },
    -    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
    -      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/eslint-visitor-keys": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
    -      "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
    -      "dev": true,
    -      "engines": {
    -        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    -      }
    -    },
    -    "node_modules/eslint/node_modules/debug": {
    -      "version": "4.3.2",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    -      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "2.1.2"
    -      },
    -      "engines": {
    -        "node": ">=6.0"
    -      },
    -      "peerDependenciesMeta": {
    -        "supports-color": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/eslint/node_modules/ms": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    -      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    -      "dev": true
    -    },
    -    "node_modules/esm": {
    -      "version": "3.2.25",
    -      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
    -      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/espree": {
    -      "version": "9.3.0",
    -      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
    -      "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "acorn": "^8.7.0",
    -        "acorn-jsx": "^5.3.1",
    -        "eslint-visitor-keys": "^3.1.0"
    -      },
    -      "engines": {
    -        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    -      }
    -    },
    -    "node_modules/esprima": {
    -      "version": "4.0.1",
    -      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
    -      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
    -      "bin": {
    -        "esparse": "bin/esparse.js",
    -        "esvalidate": "bin/esvalidate.js"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/esquery": {
    -      "version": "1.4.0",
    -      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
    -      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
    -      "dev": true,
    -      "dependencies": {
    -        "estraverse": "^5.1.0"
    -      },
    -      "engines": {
    -        "node": ">=0.10"
    -      }
    -    },
    -    "node_modules/esrecurse": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
    -      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
    -      "dev": true,
    -      "dependencies": {
    -        "estraverse": "^5.2.0"
    -      },
    -      "engines": {
    -        "node": ">=4.0"
    -      }
    -    },
    -    "node_modules/estraverse": {
    -      "version": "5.3.0",
    -      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
    -      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4.0"
    -      }
    -    },
    -    "node_modules/esutils": {
    -      "version": "2.0.3",
    -      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
    -      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/etag": {
    -      "version": "1.8.1",
    -      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
    -      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/event-target-shim": {
    -      "version": "5.0.1",
    -      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
    -      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/eventemitter3": {
    -      "version": "4.0.7",
    -      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
    -      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
    -      "dev": true
    -    },
    -    "node_modules/events": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
    -      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.4.x"
    -      }
    -    },
    -    "node_modules/events-to-array": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz",
    -      "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=",
    -      "dev": true
    -    },
    -    "node_modules/extend": {
    -      "version": "3.0.2",
    -      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
    -      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
    -      "dev": true
    -    },
    -    "node_modules/fast-deep-equal": {
    -      "version": "3.1.3",
    -      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
    -      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
    -      "dev": true
    -    },
    -    "node_modules/fast-diff": {
    -      "version": "1.2.0",
    -      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
    -      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
    -      "dev": true
    -    },
    -    "node_modules/fast-glob": {
    -      "version": "3.2.7",
    -      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
    -      "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "@nodelib/fs.stat": "^2.0.2",
    -        "@nodelib/fs.walk": "^1.2.3",
    -        "glob-parent": "^5.1.2",
    -        "merge2": "^1.3.0",
    -        "micromatch": "^4.0.4"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/fast-glob/node_modules/glob-parent": {
    -      "version": "5.1.2",
    -      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
    -      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-glob": "^4.0.1"
    -      },
    -      "engines": {
    -        "node": ">= 6"
    -      }
    -    },
    -    "node_modules/fast-json-stable-stringify": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
    -      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
    -      "dev": true
    -    },
    -    "node_modules/fast-levenshtein": {
    -      "version": "2.0.6",
    -      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
    -      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
    -      "dev": true
    -    },
    -    "node_modules/fast-safe-stringify": {
    -      "version": "2.1.1",
    -      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
    -      "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
    -      "dev": true
    -    },
    -    "node_modules/fastq": {
    -      "version": "1.13.0",
    -      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
    -      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
    -      "dev": true,
    -      "dependencies": {
    -        "reusify": "^1.0.4"
    -      }
    -    },
    -    "node_modules/fault": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
    -      "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
    -      "dev": true,
    -      "dependencies": {
    -        "format": "^0.2.0"
    -      },
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/file-entry-cache": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
    -      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
    -      "dev": true,
    -      "dependencies": {
    -        "flat-cache": "^3.0.4"
    -      },
    -      "engines": {
    -        "node": "^10.12.0 || >=12.0.0"
    -      }
    -    },
    -    "node_modules/fill-range": {
    -      "version": "7.0.1",
    -      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
    -      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "to-regex-range": "^5.0.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/finalhandler": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
    -      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
    -      "dev": true,
    -      "dependencies": {
    -        "debug": "2.6.9",
    -        "encodeurl": "~1.0.2",
    -        "escape-html": "~1.0.3",
    -        "on-finished": "~2.3.0",
    -        "parseurl": "~1.3.3",
    -        "statuses": "~1.5.0",
    -        "unpipe": "~1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/find-replace": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
    -      "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-back": "^3.0.1"
    -      },
    -      "engines": {
    -        "node": ">=4.0.0"
    -      }
    -    },
    -    "node_modules/find-up": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
    -      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
    -      "dev": true,
    -      "dependencies": {
    -        "locate-path": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/flat-cache": {
    -      "version": "3.0.4",
    -      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
    -      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
    -      "dev": true,
    -      "dependencies": {
    -        "flatted": "^3.1.0",
    -        "rimraf": "^3.0.2"
    -      },
    -      "engines": {
    -        "node": "^10.12.0 || >=12.0.0"
    -      }
    -    },
    -    "node_modules/flatted": {
    -      "version": "3.2.2",
    -      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
    -      "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
    -      "dev": true
    -    },
    -    "node_modules/follow-redirects": {
    -      "version": "1.14.6",
    -      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz",
    -      "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "individual",
    -          "url": "https://github.com/sponsors/RubenVerborgh"
    -        }
    -      ],
    -      "engines": {
    -        "node": ">=4.0"
    -      },
    -      "peerDependenciesMeta": {
    -        "debug": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/for-each": {
    -      "version": "0.3.3",
    -      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
    -      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-callable": "^1.1.3"
    -      }
    -    },
    -    "node_modules/foreach": {
    -      "version": "2.0.5",
    -      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
    -      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
    -      "dev": true
    -    },
    -    "node_modules/format": {
    -      "version": "0.2.2",
    -      "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
    -      "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.4.x"
    -      }
    -    },
    -    "node_modules/fresh": {
    -      "version": "0.5.2",
    -      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
    -      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/front-matter": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz",
    -      "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==",
    -      "dependencies": {
    -        "js-yaml": "^3.13.1"
    -      }
    -    },
    -    "node_modules/front-matter/node_modules/argparse": {
    -      "version": "1.0.10",
    -      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    -      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    -      "dependencies": {
    -        "sprintf-js": "~1.0.2"
    -      }
    -    },
    -    "node_modules/front-matter/node_modules/js-yaml": {
    -      "version": "3.14.1",
    -      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    -      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    -      "dependencies": {
    -        "argparse": "^1.0.7",
    -        "esprima": "^4.0.0"
    -      },
    -      "bin": {
    -        "js-yaml": "bin/js-yaml.js"
    -      }
    -    },
    -    "node_modules/fs-extra": {
    -      "version": "10.0.0",
    -      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
    -      "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "graceful-fs": "^4.2.0",
    -        "jsonfile": "^6.0.1",
    -        "universalify": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=12"
    -      }
    -    },
    -    "node_modules/fs.realpath": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
    -      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
    -    },
    -    "node_modules/function-bind": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
    -      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
    -      "dev": true
    -    },
    -    "node_modules/functional-red-black-tree": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
    -      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
    -      "dev": true
    -    },
    -    "node_modules/gar": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz",
    -      "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==",
    -      "dev": true
    -    },
    -    "node_modules/gaxios": {
    -      "version": "4.3.2",
    -      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
    -      "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "abort-controller": "^3.0.0",
    -        "extend": "^3.0.2",
    -        "https-proxy-agent": "^5.0.0",
    -        "is-stream": "^2.0.0",
    -        "node-fetch": "^2.6.1"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/gemoji": {
    -      "version": "4.2.1",
    -      "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-4.2.1.tgz",
    -      "integrity": "sha512-V9lUpRSn+KQGavZx8Pk+6mxG3kaz21ae2kTCXuT36KaRPNgYU8eHtj/RcUCNFVvmwppsYYz3nnNS9lmcP5kTsg==",
    -      "dev": true
    -    },
    -    "node_modules/get-folder-size": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz",
    -      "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==",
    -      "dev": true,
    -      "dependencies": {
    -        "gar": "^1.0.4",
    -        "tiny-each-async": "2.0.3"
    -      },
    -      "bin": {
    -        "get-folder-size": "bin/get-folder-size"
    -      }
    -    },
    -    "node_modules/get-intrinsic": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
    -      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "function-bind": "^1.1.1",
    -        "has": "^1.0.3",
    -        "has-symbols": "^1.0.1"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/get-package-type": {
    -      "version": "0.1.0",
    -      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
    -      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8.0.0"
    -      }
    -    },
    -    "node_modules/get-stream": {
    -      "version": "4.1.0",
    -      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
    -      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
    -      "dev": true,
    -      "dependencies": {
    -        "pump": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/get-symbol-description": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
    -      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "get-intrinsic": "^1.1.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/glob": {
    -      "version": "7.2.0",
    -      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
    -      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
    -      "dependencies": {
    -        "fs.realpath": "^1.0.0",
    -        "inflight": "^1.0.4",
    -        "inherits": "2",
    -        "minimatch": "^3.0.4",
    -        "once": "^1.3.0",
    -        "path-is-absolute": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": "*"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/isaacs"
    -      }
    -    },
    -    "node_modules/glob-parent": {
    -      "version": "6.0.2",
    -      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
    -      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-glob": "^4.0.3"
    -      },
    -      "engines": {
    -        "node": ">=10.13.0"
    -      }
    -    },
    -    "node_modules/global-dirs": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
    -      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
    -      "dev": true,
    -      "dependencies": {
    -        "ini": "2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/globals": {
    -      "version": "13.12.0",
    -      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
    -      "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
    -      "dev": true,
    -      "dependencies": {
    -        "type-fest": "^0.20.2"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/globby": {
    -      "version": "11.0.4",
    -      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
    -      "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-union": "^2.1.0",
    -        "dir-glob": "^3.0.1",
    -        "fast-glob": "^3.1.1",
    -        "ignore": "^5.1.4",
    -        "merge2": "^1.3.0",
    -        "slash": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/globby/node_modules/ignore": {
    -      "version": "5.1.9",
    -      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
    -      "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 4"
    -      }
    -    },
    -    "node_modules/got": {
    -      "version": "9.6.0",
    -      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
    -      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "@sindresorhus/is": "^0.14.0",
    -        "@szmarczak/http-timer": "^1.1.2",
    -        "cacheable-request": "^6.0.0",
    -        "decompress-response": "^3.3.0",
    -        "duplexer3": "^0.1.4",
    -        "get-stream": "^4.1.0",
    -        "lowercase-keys": "^1.0.1",
    -        "mimic-response": "^1.0.1",
    -        "p-cancelable": "^1.0.0",
    -        "to-readable-stream": "^1.0.0",
    -        "url-parse-lax": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8.6"
    -      }
    -    },
    -    "node_modules/graceful-fs": {
    -      "version": "4.2.8",
    -      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
    -      "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
    -    },
    -    "node_modules/hard-rejection": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
    -      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/has": {
    -      "version": "1.0.3",
    -      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
    -      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
    -      "dev": true,
    -      "dependencies": {
    -        "function-bind": "^1.1.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.4.0"
    -      }
    -    },
    -    "node_modules/has-bigints": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
    -      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
    -      "dev": true,
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/has-dynamic-import": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz",
    -      "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "get-intrinsic": "^1.1.1"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/has-flag": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
    -      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/has-symbols": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
    -      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/has-tostringtag": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
    -      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-symbols": "^1.0.2"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/has-yarn": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
    -      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/highlight.js": {
    -      "version": "11.4.0",
    -      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.4.0.tgz",
    -      "integrity": "sha512-nawlpCBCSASs7EdvZOYOYVkJpGmAOKMYZgZtUqSRqodZE0GRVcFKwo1RcpeOemqh9hyttTdd5wDBwHkuSyUfnA==",
    -      "engines": {
    -        "node": ">=12.0.0"
    -      }
    -    },
    -    "node_modules/hosted-git-info": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
    -      "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
    -      "dev": true,
    -      "dependencies": {
    -        "lru-cache": "^6.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/htmlparser2": {
    -      "version": "7.2.0",
    -      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
    -      "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
    -      "dev": true,
    -      "funding": [
    -        "https://github.com/fb55/htmlparser2?sponsor=1",
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/fb55"
    -        }
    -      ],
    -      "dependencies": {
    -        "domelementtype": "^2.0.1",
    -        "domhandler": "^4.2.2",
    -        "domutils": "^2.8.0",
    -        "entities": "^3.0.1"
    -      }
    -    },
    -    "node_modules/htmlparser2/node_modules/entities": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
    -      "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.12"
    -      },
    -      "funding": {
    -        "url": "https://github.com/fb55/entities?sponsor=1"
    -      }
    -    },
    -    "node_modules/http-cache-semantics": {
    -      "version": "4.1.0",
    -      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
    -      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
    -      "dev": true
    -    },
    -    "node_modules/http-errors": {
    -      "version": "1.8.1",
    -      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
    -      "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
    -      "dev": true,
    -      "dependencies": {
    -        "depd": "~1.1.2",
    -        "inherits": "2.0.4",
    -        "setprototypeof": "1.2.0",
    -        "statuses": ">= 1.5.0 < 2",
    -        "toidentifier": "1.0.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/http-proxy": {
    -      "version": "1.18.1",
    -      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
    -      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "eventemitter3": "^4.0.0",
    -        "follow-redirects": "^1.0.0",
    -        "requires-port": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8.0.0"
    -      }
    -    },
    -    "node_modules/https-proxy-agent": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
    -      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
    -      "dev": true,
    -      "dependencies": {
    -        "agent-base": "6",
    -        "debug": "4"
    -      },
    -      "engines": {
    -        "node": ">= 6"
    -      }
    -    },
    -    "node_modules/https-proxy-agent/node_modules/debug": {
    -      "version": "4.3.2",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    -      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "2.1.2"
    -      },
    -      "engines": {
    -        "node": ">=6.0"
    -      },
    -      "peerDependenciesMeta": {
    -        "supports-color": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/https-proxy-agent/node_modules/ms": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    -      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    -      "dev": true
    -    },
    -    "node_modules/iconv-lite": {
    -      "version": "0.4.24",
    -      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
    -      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
    -      "dev": true,
    -      "dependencies": {
    -        "safer-buffer": ">= 2.1.2 < 3"
    -      },
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/ieee754": {
    -      "version": "1.1.13",
    -      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
    -      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
    -      "dev": true
    -    },
    -    "node_modules/ignore": {
    -      "version": "4.0.6",
    -      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
    -      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 4"
    -      }
    -    },
    -    "node_modules/immediate": {
    -      "version": "3.3.0",
    -      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
    -      "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
    -      "dev": true
    -    },
    -    "node_modules/import-fresh": {
    -      "version": "3.3.0",
    -      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
    -      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
    -      "dev": true,
    -      "dependencies": {
    -        "parent-module": "^1.0.0",
    -        "resolve-from": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/import-lazy": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
    -      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/imurmurhash": {
    -      "version": "0.1.4",
    -      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
    -      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.8.19"
    -      }
    -    },
    -    "node_modules/indent-string": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
    -      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/inflight": {
    -      "version": "1.0.6",
    -      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
    -      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
    -      "dependencies": {
    -        "once": "^1.3.0",
    -        "wrappy": "1"
    -      }
    -    },
    -    "node_modules/inherits": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
    -      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    -    },
    -    "node_modules/ini": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
    -      "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/insync": {
    -      "version": "2.1.1",
    -      "resolved": "https://registry.npmjs.org/insync/-/insync-2.1.1.tgz",
    -      "integrity": "sha1-IuJsYRITA8BvUdNaPM9tj8HpFMQ=",
    -      "dev": true
    -    },
    -    "node_modules/internal-slot": {
    -      "version": "1.0.3",
    -      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
    -      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
    -      "dev": true,
    -      "dependencies": {
    -        "get-intrinsic": "^1.1.0",
    -        "has": "^1.0.3",
    -        "side-channel": "^1.0.4"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      }
    -    },
    -    "node_modules/is-alphabetical": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
    -      "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/is-alphanumerical": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
    -      "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-alphabetical": "^1.0.0",
    -        "is-decimal": "^1.0.0"
    -      },
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/is-arguments": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
    -      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "has-tostringtag": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-arrayish": {
    -      "version": "0.2.1",
    -      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
    -      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
    -      "dev": true
    -    },
    -    "node_modules/is-bigint": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
    -      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-bigints": "^1.0.1"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-boolean-object": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
    -      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "has-tostringtag": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-buffer": {
    -      "version": "2.0.5",
    -      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
    -      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ],
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/is-callable": {
    -      "version": "1.2.4",
    -      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
    -      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-ci": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
    -      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
    -      "dev": true,
    -      "dependencies": {
    -        "ci-info": "^2.0.0"
    -      },
    -      "bin": {
    -        "is-ci": "bin.js"
    -      }
    -    },
    -    "node_modules/is-core-module": {
    -      "version": "2.8.0",
    -      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
    -      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
    -      "dev": true,
    -      "dependencies": {
    -        "has": "^1.0.3"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-date-object": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
    -      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-tostringtag": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-decimal": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
    -      "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/is-extglob": {
    -      "version": "2.1.1",
    -      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
    -      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/is-fullwidth-code-point": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
    -      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/is-glob": {
    -      "version": "4.0.3",
    -      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
    -      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-extglob": "^2.1.1"
    -      },
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/is-hexadecimal": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
    -      "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/is-installed-globally": {
    -      "version": "0.4.0",
    -      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
    -      "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "global-dirs": "^3.0.0",
    -        "is-path-inside": "^3.0.2"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/is-map": {
    -      "version": "2.0.2",
    -      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
    -      "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
    -      "dev": true,
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-negative-zero": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
    -      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-npm": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
    -      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/is-number": {
    -      "version": "7.0.0",
    -      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
    -      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.12.0"
    -      }
    -    },
    -    "node_modules/is-number-object": {
    -      "version": "1.0.6",
    -      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
    -      "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-tostringtag": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-obj": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
    -      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/is-path-inside": {
    -      "version": "3.0.3",
    -      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
    -      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/is-plain-obj": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
    -      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/is-regex": {
    -      "version": "1.1.4",
    -      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
    -      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "has-tostringtag": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-set": {
    -      "version": "2.0.2",
    -      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
    -      "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
    -      "dev": true,
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-shared-array-buffer": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
    -      "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
    -      "dev": true,
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-stream": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
    -      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/is-string": {
    -      "version": "1.0.7",
    -      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
    -      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-tostringtag": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-symbol": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
    -      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-symbols": "^1.0.2"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-typed-array": {
    -      "version": "1.1.8",
    -      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
    -      "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
    -      "dev": true,
    -      "dependencies": {
    -        "available-typed-arrays": "^1.0.5",
    -        "call-bind": "^1.0.2",
    -        "es-abstract": "^1.18.5",
    -        "foreach": "^2.0.5",
    -        "has-tostringtag": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-typedarray": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
    -      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
    -      "dev": true
    -    },
    -    "node_modules/is-weakmap": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
    -      "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
    -      "dev": true,
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-weakref": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
    -      "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.0"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-weakset": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
    -      "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
    -      "dev": true,
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/is-yarn-global": {
    -      "version": "0.3.0",
    -      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
    -      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
    -      "dev": true
    -    },
    -    "node_modules/isarray": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
    -      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
    -      "dev": true
    -    },
    -    "node_modules/isexe": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
    -      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
    -      "dev": true
    -    },
    -    "node_modules/jmespath": {
    -      "version": "0.15.0",
    -      "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz",
    -      "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.6.0"
    -      }
    -    },
    -    "node_modules/js-tokens": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
    -      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
    -      "dev": true
    -    },
    -    "node_modules/js-yaml": {
    -      "version": "4.1.0",
    -      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    -      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    -      "dev": true,
    -      "dependencies": {
    -        "argparse": "^2.0.1"
    -      },
    -      "bin": {
    -        "js-yaml": "bin/js-yaml.js"
    -      }
    -    },
    -    "node_modules/json-buffer": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
    -      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
    -      "dev": true
    -    },
    -    "node_modules/json-parse-better-errors": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
    -      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
    -      "dev": true
    -    },
    -    "node_modules/json-parse-even-better-errors": {
    -      "version": "2.3.1",
    -      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
    -      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
    -      "dev": true
    -    },
    -    "node_modules/json-schema-traverse": {
    -      "version": "0.4.1",
    -      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
    -      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
    -      "dev": true
    -    },
    -    "node_modules/json-stable-stringify-without-jsonify": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
    -      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
    -      "dev": true
    -    },
    -    "node_modules/json5": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
    -      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
    -      "dev": true,
    -      "dependencies": {
    -        "minimist": "^1.2.0"
    -      },
    -      "bin": {
    -        "json5": "lib/cli.js"
    -      }
    -    },
    -    "node_modules/jsonc": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz",
    -      "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==",
    -      "dev": true,
    -      "dependencies": {
    -        "fast-safe-stringify": "^2.0.6",
    -        "graceful-fs": "^4.1.15",
    -        "mkdirp": "^0.5.1",
    -        "parse-json": "^4.0.0",
    -        "strip-bom": "^4.0.0",
    -        "strip-json-comments": "^3.0.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/jsonexport": {
    -      "version": "3.2.0",
    -      "resolved": "https://registry.npmjs.org/jsonexport/-/jsonexport-3.2.0.tgz",
    -      "integrity": "sha512-GbO9ugb0YTZatPd/hqCGR0FSwbr82H6OzG04yzdrG7XOe4QZ0jhQ+kOsB29zqkzoYJLmLxbbrFiuwbQu891XnQ==",
    -      "dev": true,
    -      "bin": {
    -        "jsonexport": "bin/jsonexport.js"
    -      }
    -    },
    -    "node_modules/jsonfile": {
    -      "version": "6.1.0",
    -      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
    -      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "universalify": "^2.0.0"
    -      },
    -      "optionalDependencies": {
    -        "graceful-fs": "^4.1.6"
    -      }
    -    },
    -    "node_modules/jszip": {
    -      "version": "3.7.1",
    -      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
    -      "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
    -      "dev": true,
    -      "dependencies": {
    -        "lie": "~3.3.0",
    -        "pako": "~1.0.2",
    -        "readable-stream": "~2.3.6",
    -        "set-immediate-shim": "~1.0.1"
    -      }
    -    },
    -    "node_modules/jszip/node_modules/readable-stream": {
    -      "version": "2.3.7",
    -      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
    -      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
    -      "dev": true,
    -      "dependencies": {
    -        "core-util-is": "~1.0.0",
    -        "inherits": "~2.0.3",
    -        "isarray": "~1.0.0",
    -        "process-nextick-args": "~2.0.0",
    -        "safe-buffer": "~5.1.1",
    -        "string_decoder": "~1.1.1",
    -        "util-deprecate": "~1.0.1"
    -      }
    -    },
    -    "node_modules/jszip/node_modules/safe-buffer": {
    -      "version": "5.1.2",
    -      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
    -      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
    -      "dev": true
    -    },
    -    "node_modules/jszip/node_modules/string_decoder": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
    -      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
    -      "dev": true,
    -      "dependencies": {
    -        "safe-buffer": "~5.1.0"
    -      }
    -    },
    -    "node_modules/junit-report-builder": {
    -      "version": "1.3.3",
    -      "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-1.3.3.tgz",
    -      "integrity": "sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw==",
    -      "dev": true,
    -      "dependencies": {
    -        "date-format": "0.0.2",
    -        "lodash": "^4.17.15",
    -        "mkdirp": "^0.5.0",
    -        "xmlbuilder": "^10.0.0"
    -      }
    -    },
    -    "node_modules/keyv": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
    -      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
    -      "dev": true,
    -      "dependencies": {
    -        "json-buffer": "3.0.0"
    -      }
    -    },
    -    "node_modules/kind-of": {
    -      "version": "6.0.3",
    -      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
    -      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/lambda-runtimes": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/lambda-runtimes/-/lambda-runtimes-1.1.1.tgz",
    -      "integrity": "sha512-kfsbICjnpI3HzKm+UwgmUemmsBreZhhVnaJtl+dTzilVx7f9reKEtegcSTaBVzjGHJfXv4jsQXu1v9y4KDliHg==",
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/latest-version": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
    -      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
    -      "dev": true,
    -      "dependencies": {
    -        "package-json": "^6.3.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/lazy": {
    -      "version": "1.0.11",
    -      "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz",
    -      "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.2.0"
    -      }
    -    },
    -    "node_modules/level-codec": {
    -      "version": "9.0.2",
    -      "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz",
    -      "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "buffer": "^5.6.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/level-codec/node_modules/buffer": {
    -      "version": "5.7.1",
    -      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    -      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ],
    -      "dependencies": {
    -        "base64-js": "^1.3.1",
    -        "ieee754": "^1.1.13"
    -      }
    -    },
    -    "node_modules/level-concat-iterator": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz",
    -      "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/level-errors": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz",
    -      "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==",
    -      "dev": true,
    -      "dependencies": {
    -        "errno": "~0.1.1"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/level-iterator-stream": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz",
    -      "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "inherits": "^2.0.4",
    -        "readable-stream": "^3.4.0",
    -        "xtend": "^4.0.2"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/level-option-wrap": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz",
    -      "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=",
    -      "dev": true,
    -      "dependencies": {
    -        "defined": "~0.0.0"
    -      }
    -    },
    -    "node_modules/level-supports": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
    -      "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
    -      "dev": true,
    -      "dependencies": {
    -        "xtend": "^4.0.2"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/leveldown": {
    -      "version": "5.6.0",
    -      "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz",
    -      "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==",
    -      "dev": true,
    -      "hasInstallScript": true,
    -      "optional": true,
    -      "dependencies": {
    -        "abstract-leveldown": "~6.2.1",
    -        "napi-macros": "~2.0.0",
    -        "node-gyp-build": "~4.1.0"
    -      },
    -      "engines": {
    -        "node": ">=8.6.0"
    -      }
    -    },
    -    "node_modules/levelup": {
    -      "version": "4.4.0",
    -      "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz",
    -      "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "deferred-leveldown": "~5.3.0",
    -        "level-errors": "~2.0.0",
    -        "level-iterator-stream": "~4.0.0",
    -        "level-supports": "~1.0.0",
    -        "xtend": "~4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/levn": {
    -      "version": "0.4.1",
    -      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
    -      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "prelude-ls": "^1.2.1",
    -        "type-check": "~0.4.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.8.0"
    -      }
    -    },
    -    "node_modules/lie": {
    -      "version": "3.3.0",
    -      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
    -      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "immediate": "~3.0.5"
    -      }
    -    },
    -    "node_modules/lie/node_modules/immediate": {
    -      "version": "3.0.6",
    -      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
    -      "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
    -      "dev": true
    -    },
    -    "node_modules/lines-and-columns": {
    -      "version": "1.2.4",
    -      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
    -      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
    -      "dev": true
    -    },
    -    "node_modules/linkify-it": {
    -      "version": "3.0.3",
    -      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
    -      "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
    -      "dependencies": {
    -        "uc.micro": "^1.0.1"
    -      }
    -    },
    -    "node_modules/linkinator": {
    -      "version": "2.16.2",
    -      "resolved": "https://registry.npmjs.org/linkinator/-/linkinator-2.16.2.tgz",
    -      "integrity": "sha512-5tHSz6gMN0z25+Pk4lZnU0Edr1lJLNuk+MCfQa2NxF4f1rfKS8Lo3JEwxTciVzwVHHdBpydAgmWYOgylNlwyDQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "chalk": "^4.0.0",
    -        "escape-html": "^1.0.3",
    -        "gaxios": "^4.0.0",
    -        "glob": "^7.1.6",
    -        "htmlparser2": "^7.1.2",
    -        "jsonexport": "^3.0.0",
    -        "marked": "^2.0.0",
    -        "meow": "^9.0.0",
    -        "mime": "^3.0.0",
    -        "server-destroy": "^1.0.1",
    -        "update-notifier": "^5.0.0"
    -      },
    -      "bin": {
    -        "linkinator": "build/src/cli.js"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/linkinator/node_modules/mime": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
    -      "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
    -      "dev": true,
    -      "bin": {
    -        "mime": "cli.js"
    -      },
    -      "engines": {
    -        "node": ">=10.0.0"
    -      }
    -    },
    -    "node_modules/locate-path": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
    -      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
    -      "dev": true,
    -      "dependencies": {
    -        "p-locate": "^2.0.0",
    -        "path-exists": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/lock": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz",
    -      "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=",
    -      "dev": true
    -    },
    -    "node_modules/lodash": {
    -      "version": "4.17.21",
    -      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
    -      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
    -      "dev": true
    -    },
    -    "node_modules/lodash.camelcase": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
    -      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
    -      "dev": true
    -    },
    -    "node_modules/lodash.get": {
    -      "version": "4.4.2",
    -      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
    -      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
    -      "dev": true
    -    },
    -    "node_modules/lodash.includes": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
    -      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=",
    -      "dev": true
    -    },
    -    "node_modules/lodash.kebabcase": {
    -      "version": "4.1.1",
    -      "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
    -      "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=",
    -      "dev": true
    -    },
    -    "node_modules/lodash.merge": {
    -      "version": "4.6.2",
    -      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
    -      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
    -      "dev": true
    -    },
    -    "node_modules/lodash.padend": {
    -      "version": "4.6.1",
    -      "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
    -      "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
    -      "dev": true
    -    },
    -    "node_modules/lodash.snakecase": {
    -      "version": "4.1.1",
    -      "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
    -      "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=",
    -      "dev": true
    -    },
    -    "node_modules/lodash.upperfirst": {
    -      "version": "4.3.1",
    -      "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
    -      "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=",
    -      "dev": true
    -    },
    -    "node_modules/lodash.zip": {
    -      "version": "4.2.0",
    -      "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
    -      "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=",
    -      "dev": true
    -    },
    -    "node_modules/longest-streak": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
    -      "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/lowercase-keys": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
    -      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/lru-cache": {
    -      "version": "6.0.0",
    -      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
    -      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
    -      "dev": true,
    -      "dependencies": {
    -        "yallist": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/ltgt": {
    -      "version": "2.2.1",
    -      "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
    -      "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=",
    -      "dev": true
    -    },
    -    "node_modules/make-dir": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
    -      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
    -      "dev": true,
    -      "dependencies": {
    -        "semver": "^6.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/make-dir/node_modules/semver": {
    -      "version": "6.3.0",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    -      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    -      "dev": true,
    -      "bin": {
    -        "semver": "bin/semver.js"
    -      }
    -    },
    -    "node_modules/map-obj": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
    -      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/markdown-it": {
    -      "version": "12.3.1",
    -      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.1.tgz",
    -      "integrity": "sha512-xu6ZyQc/W1mWRwBOZT5ePVVn77MhHYkWwiAMgy/oBwUwSD2fS5xND3oIN44RCqVMgpNbhKtzZs9B75mC7FHwTQ==",
    -      "dependencies": {
    -        "argparse": "^2.0.1",
    -        "entities": "~2.1.0",
    -        "linkify-it": "^3.0.1",
    -        "mdurl": "^1.0.1",
    -        "uc.micro": "^1.0.5"
    -      },
    -      "bin": {
    -        "markdown-it": "bin/markdown-it.js"
    -      }
    -    },
    -    "node_modules/markdown-it-external-anchor": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/markdown-it-external-anchor/-/markdown-it-external-anchor-1.0.0.tgz",
    -      "integrity": "sha512-d6Jb+kLciiv7uueM8q46k6szwr+B8QYg5ppiHVvfaS6hTx1KHpKwYDivmPAcNJYx0wUPEmRre9RgEnM5oHcdMw=="
    -    },
    -    "node_modules/markdown-it-toc-and-anchor": {
    -      "version": "4.2.0",
    -      "resolved": "https://registry.npmjs.org/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz",
    -      "integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==",
    -      "dependencies": {
    -        "clone": "^2.1.0",
    -        "uslug": "^1.0.4"
    -      }
    -    },
    -    "node_modules/marked": {
    -      "version": "2.1.3",
    -      "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
    -      "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==",
    -      "dev": true,
    -      "bin": {
    -        "marked": "bin/marked"
    -      },
    -      "engines": {
    -        "node": ">= 10"
    -      }
    -    },
    -    "node_modules/mdast-util-from-markdown": {
    -      "version": "0.8.5",
    -      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
    -      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/mdast": "^3.0.0",
    -        "mdast-util-to-string": "^2.0.0",
    -        "micromark": "~2.11.0",
    -        "parse-entities": "^2.0.0",
    -        "unist-util-stringify-position": "^2.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/mdast-util-frontmatter": {
    -      "version": "0.2.0",
    -      "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz",
    -      "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "micromark-extension-frontmatter": "^0.2.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/mdast-util-to-markdown": {
    -      "version": "0.6.5",
    -      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
    -      "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/unist": "^2.0.0",
    -        "longest-streak": "^2.0.0",
    -        "mdast-util-to-string": "^2.0.0",
    -        "parse-entities": "^2.0.0",
    -        "repeat-string": "^1.0.0",
    -        "zwitch": "^1.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/mdast-util-to-nlcst": {
    -      "version": "3.2.3",
    -      "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz",
    -      "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==",
    -      "dev": true,
    -      "dependencies": {
    -        "nlcst-to-string": "^2.0.0",
    -        "repeat-string": "^1.5.2",
    -        "unist-util-position": "^3.0.0",
    -        "vfile-location": "^2.0.0"
    -      }
    -    },
    -    "node_modules/mdast-util-to-string": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
    -      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
    -      "dev": true,
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/mdurl": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
    -      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
    -    },
    -    "node_modules/media-typer": {
    -      "version": "0.3.0",
    -      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
    -      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/memdown": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz",
    -      "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==",
    -      "dev": true,
    -      "dependencies": {
    -        "abstract-leveldown": "~6.2.1",
    -        "functional-red-black-tree": "~1.0.1",
    -        "immediate": "~3.2.3",
    -        "inherits": "~2.0.1",
    -        "ltgt": "~2.2.0",
    -        "safe-buffer": "~5.2.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/memdown/node_modules/immediate": {
    -      "version": "3.2.3",
    -      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz",
    -      "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=",
    -      "dev": true
    -    },
    -    "node_modules/meow": {
    -      "version": "9.0.0",
    -      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
    -      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/minimist": "^1.2.0",
    -        "camelcase-keys": "^6.2.2",
    -        "decamelize": "^1.2.0",
    -        "decamelize-keys": "^1.1.0",
    -        "hard-rejection": "^2.1.0",
    -        "minimist-options": "4.1.0",
    -        "normalize-package-data": "^3.0.0",
    -        "read-pkg-up": "^7.0.1",
    -        "redent": "^3.0.0",
    -        "trim-newlines": "^3.0.0",
    -        "type-fest": "^0.18.0",
    -        "yargs-parser": "^20.2.3"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/meow/node_modules/type-fest": {
    -      "version": "0.18.1",
    -      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
    -      "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/merge2": {
    -      "version": "1.4.1",
    -      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
    -      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 8"
    -      }
    -    },
    -    "node_modules/methods": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
    -      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/micromark": {
    -      "version": "2.11.4",
    -      "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
    -      "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "GitHub Sponsors",
    -          "url": "https://github.com/sponsors/unifiedjs"
    -        },
    -        {
    -          "type": "OpenCollective",
    -          "url": "https://opencollective.com/unified"
    -        }
    -      ],
    -      "dependencies": {
    -        "debug": "^4.0.0",
    -        "parse-entities": "^2.0.0"
    -      }
    -    },
    -    "node_modules/micromark-extension-frontmatter": {
    -      "version": "0.2.2",
    -      "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz",
    -      "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==",
    -      "dev": true,
    -      "dependencies": {
    -        "fault": "^1.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/micromark/node_modules/debug": {
    -      "version": "4.3.2",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    -      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "2.1.2"
    -      },
    -      "engines": {
    -        "node": ">=6.0"
    -      },
    -      "peerDependenciesMeta": {
    -        "supports-color": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/micromark/node_modules/ms": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    -      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    -      "dev": true
    -    },
    -    "node_modules/micromatch": {
    -      "version": "4.0.4",
    -      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
    -      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
    -      "dev": true,
    -      "dependencies": {
    -        "braces": "^3.0.1",
    -        "picomatch": "^2.2.3"
    -      },
    -      "engines": {
    -        "node": ">=8.6"
    -      }
    -    },
    -    "node_modules/mime": {
    -      "version": "1.6.0",
    -      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
    -      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
    -      "dev": true,
    -      "bin": {
    -        "mime": "cli.js"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/mime-db": {
    -      "version": "1.51.0",
    -      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
    -      "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/mime-types": {
    -      "version": "2.1.34",
    -      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
    -      "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
    -      "dependencies": {
    -        "mime-db": "1.51.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/mimic-fn": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
    -      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/mimic-response": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
    -      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/min-indent": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
    -      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/minimatch": {
    -      "version": "3.0.4",
    -      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
    -      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
    -      "dependencies": {
    -        "brace-expansion": "^1.1.7"
    -      },
    -      "engines": {
    -        "node": "*"
    -      }
    -    },
    -    "node_modules/minimist": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
    -      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
    -      "dev": true
    -    },
    -    "node_modules/minimist-options": {
    -      "version": "4.1.0",
    -      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
    -      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
    -      "dev": true,
    -      "dependencies": {
    -        "arrify": "^1.0.1",
    -        "is-plain-obj": "^1.1.0",
    -        "kind-of": "^6.0.3"
    -      },
    -      "engines": {
    -        "node": ">= 6"
    -      }
    -    },
    -    "node_modules/minimist-options/node_modules/is-plain-obj": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    -      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/minipass": {
    -      "version": "3.1.5",
    -      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
    -      "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
    -      "dev": true,
    -      "dependencies": {
    -        "yallist": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/mkdirp": {
    -      "version": "0.5.5",
    -      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
    -      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "minimist": "^1.2.5"
    -      },
    -      "bin": {
    -        "mkdirp": "bin/cmd.js"
    -      }
    -    },
    -    "node_modules/ms": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    -      "dev": true
    -    },
    -    "node_modules/napi-macros": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz",
    -      "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==",
    -      "dev": true,
    -      "optional": true
    -    },
    -    "node_modules/natural-compare": {
    -      "version": "1.4.0",
    -      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
    -      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
    -      "dev": true
    -    },
    -    "node_modules/nlcst-is-literal": {
    -      "version": "1.2.2",
    -      "resolved": "https://registry.npmjs.org/nlcst-is-literal/-/nlcst-is-literal-1.2.2.tgz",
    -      "integrity": "sha512-R+1OJEmRl3ZOp9d8PbiRxGpnvmpi3jU+lzSqCJoLeogdEh0FYDRH1aC223qUbaKffxNTJkEfeDOeQfziw749yA==",
    -      "dev": true,
    -      "dependencies": {
    -        "nlcst-to-string": "^2.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/nlcst-to-string": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz",
    -      "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==",
    -      "dev": true,
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/node-fetch": {
    -      "version": "2.6.6",
    -      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
    -      "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
    -      "dev": true,
    -      "dependencies": {
    -        "whatwg-url": "^5.0.0"
    -      },
    -      "engines": {
    -        "node": "4.x || >=6.0.0"
    -      }
    -    },
    -    "node_modules/node-gyp-build": {
    -      "version": "4.1.1",
    -      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz",
    -      "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==",
    -      "dev": true,
    -      "optional": true,
    -      "bin": {
    -        "node-gyp-build": "bin.js",
    -        "node-gyp-build-optional": "optional.js",
    -        "node-gyp-build-test": "build-test.js"
    -      }
    -    },
    -    "node_modules/node-watch": {
    -      "version": "0.7.2",
    -      "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.2.tgz",
    -      "integrity": "sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/node-webtokens": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/node-webtokens/-/node-webtokens-1.0.4.tgz",
    -      "integrity": "sha512-Sla56CeSLWvPbwud2kogqf5edQtKNXZBtXDDpmOzAgNZjwETbK/Am6PXfs54iZPLBm8K8amZ9XWaCQwGqZmKyQ==",
    -      "engines": {
    -        "node": ">=6.6.0"
    -      }
    -    },
    -    "node_modules/normalize-package-data": {
    -      "version": "3.0.3",
    -      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
    -      "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
    -      "dev": true,
    -      "dependencies": {
    -        "hosted-git-info": "^4.0.1",
    -        "is-core-module": "^2.5.0",
    -        "semver": "^7.3.4",
    -        "validate-npm-package-license": "^3.0.1"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/normalize-url": {
    -      "version": "4.5.1",
    -      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
    -      "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/nspell": {
    -      "version": "2.1.5",
    -      "resolved": "https://registry.npmjs.org/nspell/-/nspell-2.1.5.tgz",
    -      "integrity": "sha512-PSStyugKMiD9mHmqI/CR5xXrSIGejUXPlo88FBRq5Og1kO5QwQ5Ilu8D8O5I/SHpoS+mibpw6uKA8rd3vXd2Sg==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-buffer": "^2.0.0"
    -      }
    -    },
    -    "node_modules/number-to-words": {
    -      "version": "1.2.4",
    -      "resolved": "https://registry.npmjs.org/number-to-words/-/number-to-words-1.2.4.tgz",
    -      "integrity": "sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw==",
    -      "dev": true
    -    },
    -    "node_modules/object-inspect": {
    -      "version": "1.12.0",
    -      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
    -      "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
    -      "dev": true,
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/object-is": {
    -      "version": "1.1.5",
    -      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
    -      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/object-keys": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
    -      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.4"
    -      }
    -    },
    -    "node_modules/object.assign": {
    -      "version": "4.1.2",
    -      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
    -      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.0",
    -        "define-properties": "^1.1.3",
    -        "has-symbols": "^1.0.1",
    -        "object-keys": "^1.1.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/object.values": {
    -      "version": "1.1.5",
    -      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
    -      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/on-finished": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
    -      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
    -      "dev": true,
    -      "dependencies": {
    -        "ee-first": "1.1.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/once": {
    -      "version": "1.4.0",
    -      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
    -      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
    -      "dependencies": {
    -        "wrappy": "1"
    -      }
    -    },
    -    "node_modules/onetime": {
    -      "version": "5.1.2",
    -      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
    -      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
    -      "dependencies": {
    -        "mimic-fn": "^2.1.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/optionator": {
    -      "version": "0.9.1",
    -      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
    -      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
    -      "dev": true,
    -      "dependencies": {
    -        "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"
    -      },
    -      "engines": {
    -        "node": ">= 0.8.0"
    -      }
    -    },
    -    "node_modules/ospath": {
    -      "version": "1.2.2",
    -      "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
    -      "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=",
    -      "dev": true
    -    },
    -    "node_modules/p-cancelable": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
    -      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/p-limit": {
    -      "version": "1.3.0",
    -      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
    -      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "p-try": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/p-locate": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
    -      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
    -      "dev": true,
    -      "dependencies": {
    -        "p-limit": "^1.1.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/p-try": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
    -      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/package-json": {
    -      "version": "6.5.0",
    -      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
    -      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "got": "^9.6.0",
    -        "registry-auth-token": "^4.0.0",
    -        "registry-url": "^5.0.0",
    -        "semver": "^6.2.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/package-json/node_modules/semver": {
    -      "version": "6.3.0",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    -      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    -      "dev": true,
    -      "bin": {
    -        "semver": "bin/semver.js"
    -      }
    -    },
    -    "node_modules/pako": {
    -      "version": "1.0.11",
    -      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
    -      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
    -      "dev": true
    -    },
    -    "node_modules/parent-module": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
    -      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
    -      "dev": true,
    -      "dependencies": {
    -        "callsites": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/parse-entities": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
    -      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "character-entities": "^1.0.0",
    -        "character-entities-legacy": "^1.0.0",
    -        "character-reference-invalid": "^1.0.0",
    -        "is-alphanumerical": "^1.0.0",
    -        "is-decimal": "^1.0.0",
    -        "is-hexadecimal": "^1.0.0"
    -      },
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/parse-json": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
    -      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
    -      "dev": true,
    -      "dependencies": {
    -        "error-ex": "^1.3.1",
    -        "json-parse-better-errors": "^1.0.1"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/parse-latin": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz",
    -      "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==",
    -      "dev": true,
    -      "dependencies": {
    -        "nlcst-to-string": "^2.0.0",
    -        "unist-util-modify-children": "^2.0.0",
    -        "unist-util-visit-children": "^1.0.0"
    -      },
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/parseurl": {
    -      "version": "1.3.3",
    -      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
    -      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/path-exists": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
    -      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/path-is-absolute": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
    -      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/path-key": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
    -      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/path-parse": {
    -      "version": "1.0.7",
    -      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
    -      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
    -      "dev": true
    -    },
    -    "node_modules/path-sort": {
    -      "version": "0.1.0",
    -      "resolved": "https://registry.npmjs.org/path-sort/-/path-sort-0.1.0.tgz",
    -      "integrity": "sha1-ywF11Oy/paGP5nTMbXIL/hXguAU="
    -    },
    -    "node_modules/path-to-regexp": {
    -      "version": "0.1.7",
    -      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
    -      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
    -      "dev": true
    -    },
    -    "node_modules/path-type": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
    -      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/picocolors": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
    -      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
    -      "dev": true
    -    },
    -    "node_modules/picomatch": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
    -      "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8.6"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/jonschlinkert"
    -      }
    -    },
    -    "node_modules/pkg-dir": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
    -      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
    -      "dev": true,
    -      "dependencies": {
    -        "find-up": "^2.1.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/prelude-ls": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
    -      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.8.0"
    -      }
    -    },
    -    "node_modules/prepend-http": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
    -      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/process-nextick-args": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
    -      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
    -      "dev": true
    -    },
    -    "node_modules/progress": {
    -      "version": "2.0.3",
    -      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
    -      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.4.0"
    -      }
    -    },
    -    "node_modules/prr": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
    -      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
    -      "dev": true
    -    },
    -    "node_modules/pump": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
    -      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
    -      "dev": true,
    -      "dependencies": {
    -        "end-of-stream": "^1.1.0",
    -        "once": "^1.3.1"
    -      }
    -    },
    -    "node_modules/punycode": {
    -      "version": "2.1.1",
    -      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
    -      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/pupa": {
    -      "version": "2.1.1",
    -      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
    -      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
    -      "dev": true,
    -      "dependencies": {
    -        "escape-goat": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/qs": {
    -      "version": "6.9.6",
    -      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz",
    -      "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.6"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/querystring": {
    -      "version": "0.2.0",
    -      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
    -      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
    -      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.4.x"
    -      }
    -    },
    -    "node_modules/queue-microtask": {
    -      "version": "1.2.3",
    -      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
    -      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ]
    -    },
    -    "node_modules/quick-lru": {
    -      "version": "4.0.1",
    -      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
    -      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/quotation": {
    -      "version": "1.1.3",
    -      "resolved": "https://registry.npmjs.org/quotation/-/quotation-1.1.3.tgz",
    -      "integrity": "sha512-45gUgmX/RtQOQV1kwM06boP49OYXcKCPrYwdmAvs5YqkpiobhNKKwo524JM6Ma0ko3oN9tXNcWs9+ABq3Ry7YA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/random-bytes": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
    -      "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=",
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/range-parser": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
    -      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/raw-body": {
    -      "version": "2.4.2",
    -      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz",
    -      "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "bytes": "3.1.1",
    -        "http-errors": "1.8.1",
    -        "iconv-lite": "0.4.24",
    -        "unpipe": "1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/rc": {
    -      "version": "1.2.8",
    -      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
    -      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
    -      "dev": true,
    -      "dependencies": {
    -        "deep-extend": "^0.6.0",
    -        "ini": "~1.3.0",
    -        "minimist": "^1.2.0",
    -        "strip-json-comments": "~2.0.1"
    -      },
    -      "bin": {
    -        "rc": "cli.js"
    -      }
    -    },
    -    "node_modules/rc/node_modules/ini": {
    -      "version": "1.3.8",
    -      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
    -      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
    -      "dev": true
    -    },
    -    "node_modules/rc/node_modules/strip-json-comments": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
    -      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/reachdown": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/reachdown/-/reachdown-1.1.0.tgz",
    -      "integrity": "sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/read-pkg": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
    -      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/normalize-package-data": "^2.4.0",
    -        "normalize-package-data": "^2.5.0",
    -        "parse-json": "^5.0.0",
    -        "type-fest": "^0.6.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/read-pkg-up": {
    -      "version": "7.0.1",
    -      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
    -      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
    -      "dev": true,
    -      "dependencies": {
    -        "find-up": "^4.1.0",
    -        "read-pkg": "^5.2.0",
    -        "type-fest": "^0.8.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/read-pkg-up/node_modules/find-up": {
    -      "version": "4.1.0",
    -      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
    -      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
    -      "dev": true,
    -      "dependencies": {
    -        "locate-path": "^5.0.0",
    -        "path-exists": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/read-pkg-up/node_modules/locate-path": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
    -      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
    -      "dev": true,
    -      "dependencies": {
    -        "p-locate": "^4.1.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/read-pkg-up/node_modules/p-limit": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    -      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    -      "dev": true,
    -      "dependencies": {
    -        "p-try": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/read-pkg-up/node_modules/p-locate": {
    -      "version": "4.1.0",
    -      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
    -      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
    -      "dev": true,
    -      "dependencies": {
    -        "p-limit": "^2.2.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/read-pkg-up/node_modules/p-try": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
    -      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/read-pkg-up/node_modules/path-exists": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
    -      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/read-pkg-up/node_modules/type-fest": {
    -      "version": "0.8.1",
    -      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
    -      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/read-pkg/node_modules/hosted-git-info": {
    -      "version": "2.8.9",
    -      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
    -      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
    -      "dev": true
    -    },
    -    "node_modules/read-pkg/node_modules/normalize-package-data": {
    -      "version": "2.5.0",
    -      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
    -      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
    -      "dev": true,
    -      "dependencies": {
    -        "hosted-git-info": "^2.1.4",
    -        "resolve": "^1.10.0",
    -        "semver": "2 || 3 || 4 || 5",
    -        "validate-npm-package-license": "^3.0.1"
    -      }
    -    },
    -    "node_modules/read-pkg/node_modules/parse-json": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
    -      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
    -      "dev": true,
    -      "dependencies": {
    -        "@babel/code-frame": "^7.0.0",
    -        "error-ex": "^1.3.1",
    -        "json-parse-even-better-errors": "^2.3.0",
    -        "lines-and-columns": "^1.1.6"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/read-pkg/node_modules/semver": {
    -      "version": "5.7.1",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
    -      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
    -      "dev": true,
    -      "bin": {
    -        "semver": "bin/semver"
    -      }
    -    },
    -    "node_modules/read-pkg/node_modules/type-fest": {
    -      "version": "0.6.0",
    -      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
    -      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/readable-stream": {
    -      "version": "3.6.0",
    -      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
    -      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
    -      "dev": true,
    -      "dependencies": {
    -        "inherits": "^2.0.3",
    -        "string_decoder": "^1.1.1",
    -        "util-deprecate": "^1.0.1"
    -      },
    -      "engines": {
    -        "node": ">= 6"
    -      }
    -    },
    -    "node_modules/redent": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
    -      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
    -      "dev": true,
    -      "dependencies": {
    -        "indent-string": "^4.0.0",
    -        "strip-indent": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/reduce-flatten": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
    -      "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/regexp.prototype.flags": {
    -      "version": "1.3.1",
    -      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
    -      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/regexpp": {
    -      "version": "3.2.0",
    -      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
    -      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/mysticatea"
    -      }
    -    },
    -    "node_modules/registry-auth-token": {
    -      "version": "4.2.1",
    -      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
    -      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
    -      "dev": true,
    -      "dependencies": {
    -        "rc": "^1.2.8"
    -      },
    -      "engines": {
    -        "node": ">=6.0.0"
    -      }
    -    },
    -    "node_modules/registry-url": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
    -      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
    -      "dev": true,
    -      "dependencies": {
    -        "rc": "^1.2.8"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/remark": {
    -      "version": "13.0.0",
    -      "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
    -      "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
    -      "dev": true,
    -      "dependencies": {
    -        "remark-parse": "^9.0.0",
    -        "remark-stringify": "^9.0.0",
    -        "unified": "^9.1.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/remark-frontmatter": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz",
    -      "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==",
    -      "dev": true,
    -      "dependencies": {
    -        "mdast-util-frontmatter": "^0.2.0",
    -        "micromark-extension-frontmatter": "^0.2.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/remark-gemoji-to-emoji": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/remark-gemoji-to-emoji/-/remark-gemoji-to-emoji-1.1.0.tgz",
    -      "integrity": "sha1-Pc0KiBGgyBu2NROsCzbyJYpVMPU=",
    -      "dev": true,
    -      "dependencies": {
    -        "gemoji": "^4.0.0",
    -        "unist-util-visit": "^1.0.0"
    -      }
    -    },
    -    "node_modules/remark-parse": {
    -      "version": "9.0.0",
    -      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
    -      "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
    -      "dev": true,
    -      "dependencies": {
    -        "mdast-util-from-markdown": "^0.8.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/remark-retext": {
    -      "version": "3.1.3",
    -      "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz",
    -      "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==",
    -      "dev": true,
    -      "dependencies": {
    -        "mdast-util-to-nlcst": "^3.2.0"
    -      }
    -    },
    -    "node_modules/remark-stringify": {
    -      "version": "9.0.1",
    -      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
    -      "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
    -      "dev": true,
    -      "dependencies": {
    -        "mdast-util-to-markdown": "^0.6.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/repeat-string": {
    -      "version": "1.6.1",
    -      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
    -      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10"
    -      }
    -    },
    -    "node_modules/replace-ext": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
    -      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.10"
    -      }
    -    },
    -    "node_modules/req-all": {
    -      "version": "0.1.0",
    -      "resolved": "https://registry.npmjs.org/req-all/-/req-all-0.1.0.tgz",
    -      "integrity": "sha1-EwBR4qzligLqy/ydRIV3pzapJzo=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/requires-port": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
    -      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
    -      "dev": true
    -    },
    -    "node_modules/resolve": {
    -      "version": "1.20.0",
    -      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
    -      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-core-module": "^2.2.0",
    -        "path-parse": "^1.0.6"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/resolve-from": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
    -      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/responselike": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
    -      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
    -      "dev": true,
    -      "dependencies": {
    -        "lowercase-keys": "^1.0.0"
    -      }
    -    },
    -    "node_modules/restore-cursor": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
    -      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
    -      "dependencies": {
    -        "onetime": "^5.1.0",
    -        "signal-exit": "^3.0.2"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/resumer": {
    -      "version": "0.0.0",
    -      "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
    -      "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
    -      "dev": true,
    -      "dependencies": {
    -        "through": "~2.3.4"
    -      }
    -    },
    -    "node_modules/retext": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/retext/-/retext-5.0.0.tgz",
    -      "integrity": "sha1-XZAYxKZ31hA8FCNi129Q6x05i/Y=",
    -      "dev": true,
    -      "dependencies": {
    -        "retext-latin": "^2.0.0",
    -        "retext-stringify": "^2.0.0",
    -        "unified": "^6.0.0"
    -      },
    -      "engines": {
    -        "node": ">=0.11.0"
    -      }
    -    },
    -    "node_modules/retext-indefinite-article": {
    -      "version": "1.1.7",
    -      "resolved": "https://registry.npmjs.org/retext-indefinite-article/-/retext-indefinite-article-1.1.7.tgz",
    -      "integrity": "sha512-pqvEfEHL8uoeonbEjk8+d/hmyA3ozIeNTl4t3uurMcBpoIqN3+nbuMCFQrfDy2wjaKZ40KsLmEi+Zjv7m1ejLQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "format": "^0.2.2",
    -        "nlcst-to-string": "^2.0.0",
    -        "number-to-words": "^1.2.3",
    -        "unist-util-is": "^3.0.0",
    -        "unist-util-visit": "^1.1.0"
    -      }
    -    },
    -    "node_modules/retext-latin": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz",
    -      "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==",
    -      "dev": true,
    -      "dependencies": {
    -        "parse-latin": "^4.0.0",
    -        "unherit": "^1.0.4"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/retext-repeated-words": {
    -      "version": "1.2.3",
    -      "resolved": "https://registry.npmjs.org/retext-repeated-words/-/retext-repeated-words-1.2.3.tgz",
    -      "integrity": "sha512-s51ybhXsHvpHpM44y9hayqcIDMo9g5QBZoOpPUosX3CfobZbgH7CZHbME8TOEcduR7OqGtNZ8JLKVFwi9QAKqA==",
    -      "dev": true,
    -      "dependencies": {
    -        "nlcst-to-string": "^2.0.0",
    -        "unist-util-is": "^3.0.0",
    -        "unist-util-visit": "^1.1.0"
    -      }
    -    },
    -    "node_modules/retext-spell": {
    -      "version": "2.4.1",
    -      "resolved": "https://registry.npmjs.org/retext-spell/-/retext-spell-2.4.1.tgz",
    -      "integrity": "sha512-l2C37Sz+JMLgUJHqqNA2bV3Qqh7V6zWT3fCi8MtsZn2PoanDh57Tz2NW/DJpoEIsK9mV7o2EMvQmIMt5cgcgAg==",
    -      "dev": true,
    -      "dependencies": {
    -        "lodash.includes": "^4.2.0",
    -        "nlcst-is-literal": "^1.0.0",
    -        "nlcst-to-string": "^2.0.0",
    -        "nspell": "^2.0.0",
    -        "quotation": "^1.1.0",
    -        "unist-util-visit": "^1.0.0"
    -      }
    -    },
    -    "node_modules/retext-stringify": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz",
    -      "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==",
    -      "dev": true,
    -      "dependencies": {
    -        "nlcst-to-string": "^2.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/retext-syntax-mentions": {
    -      "version": "1.1.6",
    -      "resolved": "https://registry.npmjs.org/retext-syntax-mentions/-/retext-syntax-mentions-1.1.6.tgz",
    -      "integrity": "sha512-e6+Kh3dhzdBn0mHeiiKGUJMMqKTC7O2t+blKZWR1VeP0Kbm6CU4D1p5r+eH24GNCWRnqv3NbDk7RbdALqPLTeQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "nlcst-to-string": "^2.0.0",
    -        "unist-util-position": "^3.0.0",
    -        "unist-util-visit": "^1.1.0"
    -      }
    -    },
    -    "node_modules/retext-syntax-urls": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/retext-syntax-urls/-/retext-syntax-urls-1.0.2.tgz",
    -      "integrity": "sha512-Ud7i50IEP33OK9g5xCBIKh/DjoEdZi6sRJqnWDW3Wxt4B48llgfSbGLgiLeXZvJD923mOf7EAoLt/WjundXmwg==",
    -      "dev": true,
    -      "dependencies": {
    -        "nlcst-to-string": "^2.0.0",
    -        "unist-util-is": "^3.0.0",
    -        "unist-util-modify-children": "^1.1.1",
    -        "unist-util-position": "^3.0.0"
    -      }
    -    },
    -    "node_modules/retext-syntax-urls/node_modules/unist-util-modify-children": {
    -      "version": "1.1.6",
    -      "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz",
    -      "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-iterate": "^1.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/retext/node_modules/is-buffer": {
    -      "version": "1.1.6",
    -      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
    -      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
    -      "dev": true
    -    },
    -    "node_modules/retext/node_modules/is-plain-obj": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    -      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/retext/node_modules/unified": {
    -      "version": "6.2.0",
    -      "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
    -      "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
    -      "dev": true,
    -      "dependencies": {
    -        "bail": "^1.0.0",
    -        "extend": "^3.0.0",
    -        "is-plain-obj": "^1.1.0",
    -        "trough": "^1.0.0",
    -        "vfile": "^2.0.0",
    -        "x-is-string": "^0.1.0"
    -      }
    -    },
    -    "node_modules/retext/node_modules/unist-util-stringify-position": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    -      "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    -      "dev": true
    -    },
    -    "node_modules/retext/node_modules/vfile": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
    -      "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-buffer": "^1.1.4",
    -        "replace-ext": "1.0.0",
    -        "unist-util-stringify-position": "^1.0.0",
    -        "vfile-message": "^1.0.0"
    -      }
    -    },
    -    "node_modules/reusify": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
    -      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
    -      "dev": true,
    -      "engines": {
    -        "iojs": ">=1.0.0",
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/rimraf": {
    -      "version": "3.0.2",
    -      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
    -      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
    -      "dev": true,
    -      "dependencies": {
    -        "glob": "^7.1.3"
    -      },
    -      "bin": {
    -        "rimraf": "bin.js"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/isaacs"
    -      }
    -    },
    -    "node_modules/rndm": {
    -      "version": "1.2.0",
    -      "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz",
    -      "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w="
    -    },
    -    "node_modules/router": {
    -      "version": "1.3.6",
    -      "resolved": "https://registry.npmjs.org/router/-/router-1.3.6.tgz",
    -      "integrity": "sha512-gsjhou+LFApzkIP8VDrouG6Z4pqkeF11n3o5orlwPPvPTl0x7c+dbF71itKOhDoFHygmc3N3uqm55Uq/gIDUwg==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-flatten": "3.0.0",
    -        "debug": "2.6.9",
    -        "methods": "~1.1.2",
    -        "parseurl": "~1.3.3",
    -        "path-to-regexp": "0.1.7",
    -        "setprototypeof": "1.2.0",
    -        "utils-merge": "1.0.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/run-parallel": {
    -      "version": "1.2.0",
    -      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
    -      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ],
    -      "dependencies": {
    -        "queue-microtask": "^1.2.2"
    -      }
    -    },
    -    "node_modules/run-series": {
    -      "version": "1.1.9",
    -      "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz",
    -      "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==",
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ]
    -    },
    -    "node_modules/run-waterfall": {
    -      "version": "1.1.7",
    -      "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz",
    -      "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==",
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ]
    -    },
    -    "node_modules/safe-buffer": {
    -      "version": "5.2.1",
    -      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
    -      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ]
    -    },
    -    "node_modules/safer-buffer": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
    -      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
    -      "dev": true
    -    },
    -    "node_modules/sax": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
    -      "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=",
    -      "dev": true
    -    },
    -    "node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "lru-cache": "^6.0.0"
    -      },
    -      "bin": {
    -        "semver": "bin/semver.js"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/semver-diff": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
    -      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
    -      "dev": true,
    -      "dependencies": {
    -        "semver": "^6.3.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/semver-diff/node_modules/semver": {
    -      "version": "6.3.0",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
    -      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
    -      "dev": true,
    -      "bin": {
    -        "semver": "bin/semver.js"
    -      }
    -    },
    -    "node_modules/send": {
    -      "version": "0.17.2",
    -      "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
    -      "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
    -      "dev": true,
    -      "dependencies": {
    -        "debug": "2.6.9",
    -        "depd": "~1.1.2",
    -        "destroy": "~1.0.4",
    -        "encodeurl": "~1.0.2",
    -        "escape-html": "~1.0.3",
    -        "etag": "~1.8.1",
    -        "fresh": "0.5.2",
    -        "http-errors": "1.8.1",
    -        "mime": "1.6.0",
    -        "ms": "2.1.3",
    -        "on-finished": "~2.3.0",
    -        "range-parser": "~1.2.1",
    -        "statuses": "~1.5.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.8.0"
    -      }
    -    },
    -    "node_modules/send/node_modules/ms": {
    -      "version": "2.1.3",
    -      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    -      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    -      "dev": true
    -    },
    -    "node_modules/server-destroy": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
    -      "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
    -      "dev": true
    -    },
    -    "node_modules/set-immediate-shim": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
    -      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/setprototypeof": {
    -      "version": "1.2.0",
    -      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
    -      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
    -      "dev": true
    -    },
    -    "node_modules/sha": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz",
    -      "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==",
    -      "dependencies": {
    -        "graceful-fs": "^4.1.2"
    -      }
    -    },
    -    "node_modules/shebang-command": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
    -      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
    -      "dev": true,
    -      "dependencies": {
    -        "shebang-regex": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/shebang-regex": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
    -      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/side-channel": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
    -      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.0",
    -        "get-intrinsic": "^1.0.2",
    -        "object-inspect": "^1.9.0"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/signal-exit": {
    -      "version": "3.0.5",
    -      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
    -      "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ=="
    -    },
    -    "node_modules/slash": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
    -      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/slugify": {
    -      "version": "1.6.5",
    -      "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz",
    -      "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==",
    -      "engines": {
    -        "node": ">=8.0.0"
    -      }
    -    },
    -    "node_modules/spdx-correct": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
    -      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
    -      "dev": true,
    -      "dependencies": {
    -        "spdx-expression-parse": "^3.0.0",
    -        "spdx-license-ids": "^3.0.0"
    -      }
    -    },
    -    "node_modules/spdx-exceptions": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
    -      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
    -      "dev": true
    -    },
    -    "node_modules/spdx-expression-parse": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
    -      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "spdx-exceptions": "^2.1.0",
    -        "spdx-license-ids": "^3.0.0"
    -      }
    -    },
    -    "node_modules/spdx-license-ids": {
    -      "version": "3.0.11",
    -      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
    -      "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
    -      "dev": true
    -    },
    -    "node_modules/spellchecker-cli": {
    -      "version": "4.8.1",
    -      "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.8.1.tgz",
    -      "integrity": "sha512-7D4ZznwVTABfmyJEktFQNeO1epdDTy+AGZ3GWm9OerDDyFkzpCFNZ6IW+ZYpxcrmSJ92Xo0ppaJPRGPgH9uC5A==",
    -      "dev": true,
    -      "dependencies": {
    -        "app-root-path": "^3.0.0",
    -        "chalk": "^2.4.2",
    -        "command-line-args": "^5.1.1",
    -        "command-line-usage": "^5.0.4",
    -        "dictionary-en-au": "^2.3.0",
    -        "dictionary-en-ca": "^2.3.0",
    -        "dictionary-en-gb": "^2.3.0",
    -        "dictionary-en-us": "^2.2.1",
    -        "dictionary-en-za": "^2.0.4",
    -        "dictionary-vi": "^2.1.3",
    -        "fs-extra": "^6.0.1",
    -        "globby": "^11.0.0",
    -        "js-yaml": "^3.14.1",
    -        "jsonc": "^2.0.0",
    -        "junit-report-builder": "^1.3.3",
    -        "lodash": "^4.17.21",
    -        "remark": "^13.0.0",
    -        "remark-frontmatter": "^3.0.0",
    -        "remark-gemoji-to-emoji": "^1.1.0",
    -        "remark-retext": "^3.1.3",
    -        "retext": "^5.0.0",
    -        "retext-indefinite-article": "^1.1.7",
    -        "retext-repeated-words": "^1.2.3",
    -        "retext-spell": "^2.4.1",
    -        "retext-syntax-mentions": "^1.1.6",
    -        "retext-syntax-urls": "^1.0.2",
    -        "toml": "^3.0.0",
    -        "unist-util-visit": "^1.4.1",
    -        "vfile": "^3.0.1",
    -        "vfile-reporter": "^6.0.0"
    -      },
    -      "bin": {
    -        "spellchecker": "build/index.js"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/ansi-styles": {
    -      "version": "3.2.1",
    -      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    -      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    -      "dev": true,
    -      "dependencies": {
    -        "color-convert": "^1.9.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/argparse": {
    -      "version": "1.0.10",
    -      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    -      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    -      "dev": true,
    -      "dependencies": {
    -        "sprintf-js": "~1.0.2"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/chalk": {
    -      "version": "2.4.2",
    -      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    -      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "ansi-styles": "^3.2.1",
    -        "escape-string-regexp": "^1.0.5",
    -        "supports-color": "^5.3.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/color-convert": {
    -      "version": "1.9.3",
    -      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    -      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    -      "dev": true,
    -      "dependencies": {
    -        "color-name": "1.1.3"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/color-name": {
    -      "version": "1.1.3",
    -      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    -      "dev": true
    -    },
    -    "node_modules/spellchecker-cli/node_modules/escape-string-regexp": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    -      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.8.0"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/fs-extra": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
    -      "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
    -      "dev": true,
    -      "dependencies": {
    -        "graceful-fs": "^4.1.2",
    -        "jsonfile": "^4.0.0",
    -        "universalify": "^0.1.0"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/has-flag": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/js-yaml": {
    -      "version": "3.14.1",
    -      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    -      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    -      "dev": true,
    -      "dependencies": {
    -        "argparse": "^1.0.7",
    -        "esprima": "^4.0.0"
    -      },
    -      "bin": {
    -        "js-yaml": "bin/js-yaml.js"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/jsonfile": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
    -      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
    -      "dev": true,
    -      "optionalDependencies": {
    -        "graceful-fs": "^4.1.6"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/supports-color": {
    -      "version": "5.5.0",
    -      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    -      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-flag": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/spellchecker-cli/node_modules/universalify": {
    -      "version": "0.1.2",
    -      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
    -      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 4.0.0"
    -      }
    -    },
    -    "node_modules/sprintf-js": {
    -      "version": "1.0.3",
    -      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
    -      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
    -    },
    -    "node_modules/statuses": {
    -      "version": "1.5.0",
    -      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
    -      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/strftime": {
    -      "version": "0.10.0",
    -      "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz",
    -      "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.2.0"
    -      }
    -    },
    -    "node_modules/string_decoder": {
    -      "version": "1.3.0",
    -      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
    -      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
    -      "dev": true,
    -      "dependencies": {
    -        "safe-buffer": "~5.2.0"
    -      }
    -    },
    -    "node_modules/string-width": {
    -      "version": "4.2.3",
    -      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
    -      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
    -      "dev": true,
    -      "dependencies": {
    -        "emoji-regex": "^8.0.0",
    -        "is-fullwidth-code-point": "^3.0.0",
    -        "strip-ansi": "^6.0.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/string.prototype.trim": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz",
    -      "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/string.prototype.trimend": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
    -      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/string.prototype.trimstart": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
    -      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/strip-ansi": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
    -      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
    -      "dev": true,
    -      "dependencies": {
    -        "ansi-regex": "^5.0.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/strip-bom": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
    -      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/strip-indent": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
    -      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "min-indent": "^1.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/strip-json-comments": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
    -      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/subleveldown": {
    -      "version": "5.0.1",
    -      "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-5.0.1.tgz",
    -      "integrity": "sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw==",
    -      "dev": true,
    -      "dependencies": {
    -        "abstract-leveldown": "^6.3.0",
    -        "encoding-down": "^6.2.0",
    -        "inherits": "^2.0.3",
    -        "level-option-wrap": "^1.1.0",
    -        "levelup": "^4.4.0",
    -        "reachdown": "^1.1.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/subleveldown/node_modules/abstract-leveldown": {
    -      "version": "6.3.0",
    -      "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz",
    -      "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "buffer": "^5.5.0",
    -        "immediate": "^3.2.3",
    -        "level-concat-iterator": "~2.0.0",
    -        "level-supports": "~1.0.0",
    -        "xtend": "~4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/subleveldown/node_modules/buffer": {
    -      "version": "5.7.1",
    -      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
    -      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "github",
    -          "url": "https://github.com/sponsors/feross"
    -        },
    -        {
    -          "type": "patreon",
    -          "url": "https://www.patreon.com/feross"
    -        },
    -        {
    -          "type": "consulting",
    -          "url": "https://feross.org/support"
    -        }
    -      ],
    -      "dependencies": {
    -        "base64-js": "^1.3.1",
    -        "ieee754": "^1.1.13"
    -      }
    -    },
    -    "node_modules/supports-color": {
    -      "version": "7.2.0",
    -      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    -      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    -      "dependencies": {
    -        "has-flag": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/symlink-or-copy": {
    -      "version": "1.3.1",
    -      "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz",
    -      "integrity": "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==",
    -      "dev": true
    -    },
    -    "node_modules/table-layout": {
    -      "version": "0.4.5",
    -      "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
    -      "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-back": "^2.0.0",
    -        "deep-extend": "~0.6.0",
    -        "lodash.padend": "^4.6.1",
    -        "typical": "^2.6.1",
    -        "wordwrapjs": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4.0.0"
    -      }
    -    },
    -    "node_modules/table-layout/node_modules/array-back": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
    -      "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
    -      "dev": true,
    -      "dependencies": {
    -        "typical": "^2.6.1"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/table-layout/node_modules/typical": {
    -      "version": "2.6.1",
    -      "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    -      "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    -      "dev": true
    -    },
    -    "node_modules/tap-arc": {
    -      "version": "0.1.2",
    -      "resolved": "https://registry.npmjs.org/tap-arc/-/tap-arc-0.1.2.tgz",
    -      "integrity": "sha512-o1Wl5LtNXw2W9ROKqYh/f/uoFMzdcej+jrPEbouAu8U6UDm/ux7UBg5tjZlIEOhAbYKWvZD4BSEPfn0LrsAHHA==",
    -      "dev": true,
    -      "dependencies": {
    -        "fast-diff": "^1.2.0",
    -        "json5": "^2.2.0",
    -        "minimist": "~1.2.5",
    -        "picocolors": "^1.0.0",
    -        "strip-ansi": "^6.0.1",
    -        "tap-parser": "^10.1.0",
    -        "through2": "^4.0.2"
    -      },
    -      "bin": {
    -        "tap-arc": "index.js"
    -      },
    -      "engines": {
    -        "node": ">=14"
    -      }
    -    },
    -    "node_modules/tap-arc/node_modules/json5": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
    -      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
    -      "dev": true,
    -      "dependencies": {
    -        "minimist": "^1.2.5"
    -      },
    -      "bin": {
    -        "json5": "lib/cli.js"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/tap-parser": {
    -      "version": "10.1.0",
    -      "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.1.0.tgz",
    -      "integrity": "sha512-FujQeciDaOiOvaIVGS1Rpb0v4R6XkOjvWCWowlz5oKuhPkEJ8U6pxgqt38xuzYhPt8dWEnfHn2jqpZdJEkW7pA==",
    -      "dev": true,
    -      "dependencies": {
    -        "events-to-array": "^1.0.1",
    -        "minipass": "^3.0.0",
    -        "tap-yaml": "^1.0.0"
    -      },
    -      "bin": {
    -        "tap-parser": "bin/cmd.js"
    -      },
    -      "engines": {
    -        "node": ">= 8"
    -      }
    -    },
    -    "node_modules/tap-yaml": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz",
    -      "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "yaml": "^1.5.0"
    -      }
    -    },
    -    "node_modules/tape": {
    -      "version": "5.4.0",
    -      "resolved": "https://registry.npmjs.org/tape/-/tape-5.4.0.tgz",
    -      "integrity": "sha512-8Cq4mql6oZVO7zkMcen+2AZoJyICsHjJqTiWk1kVub6C/EsS4o9zBVWWbvBBLzx10okW3SKCoNN9XfwfTAIR2w==",
    -      "dev": true,
    -      "dependencies": {
    -        "call-bind": "^1.0.2",
    -        "deep-equal": "^2.0.5",
    -        "defined": "^1.0.0",
    -        "dotignore": "^0.1.2",
    -        "for-each": "^0.3.3",
    -        "get-package-type": "^0.1.0",
    -        "glob": "^7.2.0",
    -        "has": "^1.0.3",
    -        "has-dynamic-import": "^2.0.1",
    -        "inherits": "^2.0.4",
    -        "is-regex": "^1.1.4",
    -        "minimist": "^1.2.5",
    -        "object-inspect": "^1.12.0",
    -        "object-is": "^1.1.5",
    -        "object.assign": "^4.1.2",
    -        "resolve": "^2.0.0-next.3",
    -        "resumer": "^0.0.0",
    -        "string.prototype.trim": "^1.2.5",
    -        "through": "^2.3.8"
    -      },
    -      "bin": {
    -        "tape": "bin/tape"
    -      }
    -    },
    -    "node_modules/tape/node_modules/defined": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
    -      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
    -      "dev": true
    -    },
    -    "node_modules/tape/node_modules/resolve": {
    -      "version": "2.0.0-next.3",
    -      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
    -      "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-core-module": "^2.2.0",
    -        "path-parse": "^1.0.6"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/text-table": {
    -      "version": "0.2.0",
    -      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
    -      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
    -      "dev": true
    -    },
    -    "node_modules/through": {
    -      "version": "2.3.8",
    -      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
    -      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
    -      "dev": true
    -    },
    -    "node_modules/through2": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
    -      "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
    -      "dev": true,
    -      "dependencies": {
    -        "readable-stream": "3"
    -      }
    -    },
    -    "node_modules/tiny-each-async": {
    -      "version": "2.0.3",
    -      "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz",
    -      "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=",
    -      "dev": true
    -    },
    -    "node_modules/tiny-json-http": {
    -      "version": "7.3.1",
    -      "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.1.tgz",
    -      "integrity": "sha512-sgt6ABJnNftz8itxjVwyrKZsk+Dy62uXPR/ryeQ8wxC3sB6UCaz+3mrzKbZdu5DoyzEa/bpHMVkqsTCvuPaDNg==",
    -      "dev": true
    -    },
    -    "node_modules/to-readable-stream": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
    -      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/to-regex-range": {
    -      "version": "5.0.1",
    -      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
    -      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-number": "^7.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8.0"
    -      }
    -    },
    -    "node_modules/toidentifier": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
    -      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.6"
    -      }
    -    },
    -    "node_modules/toml": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz",
    -      "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==",
    -      "dev": true
    -    },
    -    "node_modules/tr46": {
    -      "version": "0.0.3",
    -      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
    -      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
    -      "dev": true
    -    },
    -    "node_modules/tree-kill": {
    -      "version": "1.2.2",
    -      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
    -      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
    -      "dev": true,
    -      "bin": {
    -        "tree-kill": "cli.js"
    -      }
    -    },
    -    "node_modules/trim-newlines": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
    -      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/trough": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
    -      "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/tsconfig-paths": {
    -      "version": "3.11.0",
    -      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz",
    -      "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/json5": "^0.0.29",
    -        "json5": "^1.0.1",
    -        "minimist": "^1.2.0",
    -        "strip-bom": "^3.0.0"
    -      }
    -    },
    -    "node_modules/tsconfig-paths/node_modules/strip-bom": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    -      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/tsscmp": {
    -      "version": "1.0.6",
    -      "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
    -      "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
    -      "engines": {
    -        "node": ">=0.6.x"
    -      }
    -    },
    -    "node_modules/type-check": {
    -      "version": "0.4.0",
    -      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
    -      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
    -      "dev": true,
    -      "dependencies": {
    -        "prelude-ls": "^1.2.1"
    -      },
    -      "engines": {
    -        "node": ">= 0.8.0"
    -      }
    -    },
    -    "node_modules/type-fest": {
    -      "version": "0.20.2",
    -      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
    -      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
    -    "node_modules/type-is": {
    -      "version": "1.6.18",
    -      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
    -      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
    -      "dependencies": {
    -        "media-typer": "0.3.0",
    -        "mime-types": "~2.1.24"
    -      },
    -      "engines": {
    -        "node": ">= 0.6"
    -      }
    -    },
    -    "node_modules/typedarray-to-buffer": {
    -      "version": "3.1.5",
    -      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
    -      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-typedarray": "^1.0.0"
    -      }
    -    },
    -    "node_modules/typical": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
    -      "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/uc.micro": {
    -      "version": "1.0.6",
    -      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
    -      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
    -    },
    -    "node_modules/uid-safe": {
    -      "version": "2.1.5",
    -      "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
    -      "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
    -      "dependencies": {
    -        "random-bytes": "~1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/unbox-primitive": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
    -      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
    -      "dev": true,
    -      "dependencies": {
    -        "function-bind": "^1.1.1",
    -        "has-bigints": "^1.0.1",
    -        "has-symbols": "^1.0.2",
    -        "which-boxed-primitive": "^1.0.2"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/unherit": {
    -      "version": "1.1.3",
    -      "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
    -      "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "inherits": "^2.0.0",
    -        "xtend": "^4.0.0"
    -      },
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    },
    -    "node_modules/unified": {
    -      "version": "9.2.2",
    -      "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
    -      "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "bail": "^1.0.0",
    -        "extend": "^3.0.0",
    -        "is-buffer": "^2.0.0",
    -        "is-plain-obj": "^2.0.0",
    -        "trough": "^1.0.0",
    -        "vfile": "^4.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/unified/node_modules/vfile": {
    -      "version": "4.2.1",
    -      "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
    -      "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/unist": "^2.0.0",
    -        "is-buffer": "^2.0.0",
    -        "unist-util-stringify-position": "^2.0.0",
    -        "vfile-message": "^2.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/unified/node_modules/vfile-message": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
    -      "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/unist": "^2.0.0",
    -        "unist-util-stringify-position": "^2.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/unique-string": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
    -      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
    -      "dev": true,
    -      "dependencies": {
    -        "crypto-random-string": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/unist-util-is": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
    -      "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
    -      "dev": true
    -    },
    -    "node_modules/unist-util-modify-children": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz",
    -      "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==",
    -      "dev": true,
    -      "dependencies": {
    -        "array-iterate": "^1.0.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/unist-util-position": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz",
    -      "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/unist-util-stringify-position": {
    -      "version": "2.0.3",
    -      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
    -      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
    -      "dev": true,
    -      "dependencies": {
    -        "@types/unist": "^2.0.2"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/unist-util-visit": {
    -      "version": "1.4.1",
    -      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
    -      "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
    -      "dev": true,
    -      "dependencies": {
    -        "unist-util-visit-parents": "^2.0.0"
    -      }
    -    },
    -    "node_modules/unist-util-visit-children": {
    -      "version": "1.1.4",
    -      "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz",
    -      "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==",
    -      "dev": true,
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/unist-util-visit-parents": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
    -      "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
    -      "dev": true,
    -      "dependencies": {
    -        "unist-util-is": "^3.0.0"
    -      }
    -    },
    -    "node_modules/universalify": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
    -      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 10.0.0"
    -      }
    -    },
    -    "node_modules/unorm": {
    -      "version": "1.6.0",
    -      "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz",
    -      "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==",
    -      "engines": {
    -        "node": ">= 0.4.0"
    -      }
    -    },
    -    "node_modules/unpipe": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
    -      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.8"
    -      }
    -    },
    -    "node_modules/update-notifier": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
    -      "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
    -      "dev": true,
    -      "dependencies": {
    -        "boxen": "^5.0.0",
    -        "chalk": "^4.1.0",
    -        "configstore": "^5.0.1",
    -        "has-yarn": "^2.1.0",
    -        "import-lazy": "^2.1.0",
    -        "is-ci": "^2.0.0",
    -        "is-installed-globally": "^0.4.0",
    -        "is-npm": "^5.0.0",
    -        "is-yarn-global": "^0.3.0",
    -        "latest-version": "^5.1.0",
    -        "pupa": "^2.1.1",
    -        "semver": "^7.3.4",
    -        "semver-diff": "^3.1.1",
    -        "xdg-basedir": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/yeoman/update-notifier?sponsor=1"
    -      }
    -    },
    -    "node_modules/uri-js": {
    -      "version": "4.4.1",
    -      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
    -      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
    -      "dev": true,
    -      "dependencies": {
    -        "punycode": "^2.1.0"
    -      }
    -    },
    -    "node_modules/url": {
    -      "version": "0.10.3",
    -      "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
    -      "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=",
    -      "dev": true,
    -      "dependencies": {
    -        "punycode": "1.3.2",
    -        "querystring": "0.2.0"
    -      }
    -    },
    -    "node_modules/url-parse-lax": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
    -      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
    -      "dev": true,
    -      "dependencies": {
    -        "prepend-http": "^2.0.0"
    -      },
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/url/node_modules/punycode": {
    -      "version": "1.3.2",
    -      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
    -      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
    -      "dev": true
    -    },
    -    "node_modules/uslug": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz",
    -      "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=",
    -      "dependencies": {
    -        "unorm": ">= 1.0.0"
    -      },
    -      "engines": {
    -        "node": ">= 0.4.0"
    -      }
    -    },
    -    "node_modules/util-deprecate": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
    -      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
    -      "dev": true
    -    },
    -    "node_modules/utils-merge": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
    -      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 0.4.0"
    -      }
    -    },
    -    "node_modules/uuid": {
    -      "version": "3.3.2",
    -      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
    -      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
    -      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
    -      "dev": true,
    -      "bin": {
    -        "uuid": "bin/uuid"
    -      }
    -    },
    -    "node_modules/v8-compile-cache": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
    -      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
    -      "dev": true
    -    },
    -    "node_modules/validate-npm-package-license": {
    -      "version": "3.0.4",
    -      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
    -      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
    -      "dev": true,
    -      "dependencies": {
    -        "spdx-correct": "^3.0.0",
    -        "spdx-expression-parse": "^3.0.0"
    -      }
    -    },
    -    "node_modules/vfile": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz",
    -      "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-buffer": "^2.0.0",
    -        "replace-ext": "1.0.0",
    -        "unist-util-stringify-position": "^1.0.0",
    -        "vfile-message": "^1.0.0"
    -      }
    -    },
    -    "node_modules/vfile-location": {
    -      "version": "2.0.6",
    -      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
    -      "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/vfile-message": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
    -      "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
    -      "dev": true,
    -      "dependencies": {
    -        "unist-util-stringify-position": "^1.1.1"
    -      }
    -    },
    -    "node_modules/vfile-message/node_modules/unist-util-stringify-position": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    -      "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    -      "dev": true
    -    },
    -    "node_modules/vfile-reporter": {
    -      "version": "6.0.2",
    -      "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz",
    -      "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==",
    -      "dev": true,
    -      "dependencies": {
    -        "repeat-string": "^1.5.0",
    -        "string-width": "^4.0.0",
    -        "supports-color": "^6.0.0",
    -        "unist-util-stringify-position": "^2.0.0",
    -        "vfile-sort": "^2.1.2",
    -        "vfile-statistics": "^1.1.0"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/vfile-reporter/node_modules/has-flag": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4"
    -      }
    -    },
    -    "node_modules/vfile-reporter/node_modules/supports-color": {
    -      "version": "6.1.0",
    -      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
    -      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "has-flag": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/vfile-sort": {
    -      "version": "2.2.2",
    -      "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.2.tgz",
    -      "integrity": "sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/vfile-statistics": {
    -      "version": "1.1.4",
    -      "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.4.tgz",
    -      "integrity": "sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA==",
    -      "dev": true,
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/unified"
    -      }
    -    },
    -    "node_modules/vfile/node_modules/unist-util-stringify-position": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    -      "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    -      "dev": true
    -    },
    -    "node_modules/webidl-conversions": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
    -      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
    -      "dev": true
    -    },
    -    "node_modules/whatwg-url": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
    -      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
    -      "dev": true,
    -      "dependencies": {
    -        "tr46": "~0.0.3",
    -        "webidl-conversions": "^3.0.0"
    -      }
    -    },
    -    "node_modules/which": {
    -      "version": "2.0.2",
    -      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
    -      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
    -      "dev": true,
    -      "dependencies": {
    -        "isexe": "^2.0.0"
    -      },
    -      "bin": {
    -        "node-which": "bin/node-which"
    -      },
    -      "engines": {
    -        "node": ">= 8"
    -      }
    -    },
    -    "node_modules/which-boxed-primitive": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
    -      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-bigint": "^1.0.1",
    -        "is-boolean-object": "^1.1.0",
    -        "is-number-object": "^1.0.4",
    -        "is-string": "^1.0.5",
    -        "is-symbol": "^1.0.3"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/which-collection": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
    -      "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
    -      "dev": true,
    -      "dependencies": {
    -        "is-map": "^2.0.1",
    -        "is-set": "^2.0.1",
    -        "is-weakmap": "^2.0.1",
    -        "is-weakset": "^2.0.1"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/which-typed-array": {
    -      "version": "1.1.7",
    -      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
    -      "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
    -      "dev": true,
    -      "dependencies": {
    -        "available-typed-arrays": "^1.0.5",
    -        "call-bind": "^1.0.2",
    -        "es-abstract": "^1.18.5",
    -        "foreach": "^2.0.5",
    -        "has-tostringtag": "^1.0.0",
    -        "is-typed-array": "^1.1.7"
    -      },
    -      "engines": {
    -        "node": ">= 0.4"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/ljharb"
    -      }
    -    },
    -    "node_modules/widest-line": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
    -      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
    -      "dev": true,
    -      "dependencies": {
    -        "string-width": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/word-wrap": {
    -      "version": "1.2.3",
    -      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
    -      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
    -    "node_modules/wordwrapjs": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
    -      "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
    -      "dev": true,
    -      "dependencies": {
    -        "reduce-flatten": "^1.0.1",
    -        "typical": "^2.6.1"
    -      },
    -      "engines": {
    -        "node": ">=4.0.0"
    -      }
    -    },
    -    "node_modules/wordwrapjs/node_modules/typical": {
    -      "version": "2.6.1",
    -      "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
    -      "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
    -      "dev": true
    -    },
    -    "node_modules/wrap-ansi": {
    -      "version": "7.0.0",
    -      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
    -      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "ansi-styles": "^4.0.0",
    -        "string-width": "^4.1.0",
    -        "strip-ansi": "^6.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
    -      }
    -    },
    -    "node_modules/wrappy": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
    -      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
    -    },
    -    "node_modules/write-file-atomic": {
    -      "version": "3.0.3",
    -      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
    -      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "imurmurhash": "^0.1.4",
    -        "is-typedarray": "^1.0.0",
    -        "signal-exit": "^3.0.2",
    -        "typedarray-to-buffer": "^3.1.5"
    -      }
    -    },
    -    "node_modules/ws": {
    -      "version": "8.3.0",
    -      "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
    -      "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10.0.0"
    -      },
    -      "peerDependencies": {
    -        "bufferutil": "^4.0.1",
    -        "utf-8-validate": "^5.0.2"
    -      },
    -      "peerDependenciesMeta": {
    -        "bufferutil": {
    -          "optional": true
    -        },
    -        "utf-8-validate": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/x-is-string": {
    -      "version": "0.1.0",
    -      "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
    -      "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
    -      "dev": true
    -    },
    -    "node_modules/xdg-basedir": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
    -      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/xml2js": {
    -      "version": "0.4.19",
    -      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
    -      "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
    -      "dev": true,
    -      "dependencies": {
    -        "sax": ">=0.6.0",
    -        "xmlbuilder": "~9.0.1"
    -      }
    -    },
    -    "node_modules/xml2js/node_modules/xmlbuilder": {
    -      "version": "9.0.7",
    -      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
    -      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4.0"
    -      }
    -    },
    -    "node_modules/xmlbuilder": {
    -      "version": "10.1.1",
    -      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
    -      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=4.0"
    -      }
    -    },
    -    "node_modules/xtend": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
    -      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=0.4"
    -      }
    -    },
    -    "node_modules/yallist": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
    -      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
    -      "dev": true
    -    },
    -    "node_modules/yaml": {
    -      "version": "1.10.2",
    -      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
    -      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 6"
    -      }
    -    },
    -    "node_modules/yargs-parser": {
    -      "version": "20.2.9",
    -      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
    -      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/yazl": {
    -      "version": "2.5.1",
    -      "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
    -      "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
    -      "dev": true,
    -      "dependencies": {
    -        "buffer-crc32": "~0.2.3"
    -      }
    -    },
    -    "node_modules/yesno": {
    -      "version": "0.3.1",
    -      "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.3.1.tgz",
    -      "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==",
    -      "dev": true
    -    },
    -    "node_modules/zip-dir": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz",
    -      "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==",
    -      "dev": true,
    -      "dependencies": {
    -        "async": "^3.2.0",
    -        "jszip": "^3.2.2"
    -      }
    -    },
    -    "node_modules/zip-dir/node_modules/async": {
    -      "version": "3.2.2",
    -      "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
    -      "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==",
    -      "dev": true
    -    },
    -    "node_modules/zipit": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/zipit/-/zipit-2.0.0.tgz",
    -      "integrity": "sha512-e/y9Xf1eYElSSo1s1e1+0QraquqaCmfnCvxd2IlvILtKK+F93kpV+/TIRUDYW7UnYtDMeYijG5kyEA7B+66wgg==",
    -      "dev": true,
    -      "dependencies": {
    -        "insync": "2.1.1",
    -        "yazl": "2.5.1"
    -      },
    -      "engines": {
    -        "node": ">=8.0.0"
    -      }
    -    },
    -    "node_modules/zwitch": {
    -      "version": "1.0.5",
    -      "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
    -      "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
    -      "dev": true,
    -      "funding": {
    -        "type": "github",
    -        "url": "https://github.com/sponsors/wooorm"
    -      }
    -    }
    -  },
       "dependencies": {
         "@architect/architect": {
           "version": "9.4.2",
    @@ -7952,15 +220,13 @@
           }
         },
         "@architect/spellcheck-dictionary": {
    -      "version": "git+ssh://git@github.com/architect/spellcheck-dictionary.git#11cae7e5559dda8ab03a3e3d32931db9a4fd3165",
    -      "integrity": "sha512-AW45aIXaWw5zmky1/irEPMDc1ex9kKA4niKf7hFPm6kXEk9OyFzYLb3QtxlQovYh+qK71KtYEVb9Z8cyuHgRIA==",
    -      "dev": true,
    -      "from": "@architect/spellcheck-dictionary@github:architect/spellcheck-dictionary"
    +      "version": "github:architect/spellcheck-dictionary#2ef31b2b23fec8674789df057180310138d07c90",
    +      "from": "github:architect/spellcheck-dictionary",
    +      "dev": true
         },
         "@architect/syntaxes": {
    -      "version": "git+ssh://git@github.com/architect/syntaxes.git#ca61027ef8295e2bb012a8df9ac9240052f43b66",
    -      "integrity": "sha512-dGGwAfcHpNfuthuv5i5H8e/i+NFqZxA1Kwo8lxdJJ3JX1P3LNr7uyNE+VRqbdXJkC3JNi5Jw0VUmtkBRzB7j1g==",
    -      "from": "@architect/syntaxes@github:architect/syntaxes#v1.2.1"
    +      "version": "github:architect/syntaxes#ca61027ef8295e2bb012a8df9ac9240052f43b66",
    +      "from": "github:architect/syntaxes#v1.2.1"
         },
         "@architect/utils": {
           "version": "3.0.4",
    @@ -7977,27 +243,27 @@
           }
         },
         "@babel/code-frame": {
    -      "version": "7.16.0",
    -      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
    -      "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
    +      "version": "7.16.7",
    +      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
    +      "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
           "dev": true,
           "requires": {
    -        "@babel/highlight": "^7.16.0"
    +        "@babel/highlight": "^7.16.7"
           }
         },
         "@babel/helper-validator-identifier": {
    -      "version": "7.15.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
    -      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
    +      "version": "7.16.7",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
    +      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
           "dev": true
         },
         "@babel/highlight": {
    -      "version": "7.16.0",
    -      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
    -      "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
    +      "version": "7.16.7",
    +      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz",
    +      "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-validator-identifier": "^7.15.7",
    +        "@babel/helper-validator-identifier": "^7.16.7",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           },
    @@ -8083,6 +349,12 @@
             "strip-json-comments": "^3.1.1"
           },
           "dependencies": {
    +        "argparse": {
    +          "version": "2.0.1",
    +          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    +          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
    +          "dev": true
    +        },
             "debug": {
               "version": "4.3.3",
               "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    @@ -8092,11 +364,26 @@
                 "ms": "2.1.2"
               }
             },
    +        "js-yaml": {
    +          "version": "4.1.0",
    +          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    +          "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    +          "dev": true,
    +          "requires": {
    +            "argparse": "^2.0.1"
    +          }
    +        },
             "ms": {
               "version": "2.1.2",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
               "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
               "dev": true
    +        },
    +        "strip-json-comments": {
    +          "version": "3.1.1",
    +          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
    +          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
    +          "dev": true
             }
           }
         },
    @@ -8253,6 +540,12 @@
                 "base64-js": "^1.3.1",
                 "ieee754": "^1.1.13"
               }
    +        },
    +        "immediate": {
    +          "version": "3.3.0",
    +          "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
    +          "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
    +          "dev": true
             }
           }
         },
    @@ -8266,8 +559,7 @@
           "version": "5.3.2",
           "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
           "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
    -      "dev": true,
    -      "requires": {}
    +      "dev": true
         },
         "acorn-loose": {
           "version": "8.2.1",
    @@ -8288,9 +580,9 @@
           },
           "dependencies": {
             "debug": {
    -          "version": "4.3.2",
    -          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    -          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +          "version": "4.3.3",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    +          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
               "dev": true,
               "requires": {
                 "ms": "2.1.2"
    @@ -8352,9 +644,12 @@
           "dev": true
         },
         "argparse": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    -      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
    +      "version": "1.0.10",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    +      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    +      "requires": {
    +        "sprintf-js": "~1.0.2"
    +      }
         },
         "array-back": {
           "version": "3.1.0",
    @@ -8411,13 +706,10 @@
           "dev": true
         },
         "async": {
    -      "version": "2.6.3",
    -      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
    -      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
    -      "dev": true,
    -      "requires": {
    -        "lodash": "^4.17.14"
    -      }
    +      "version": "3.2.2",
    +      "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
    +      "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==",
    +      "dev": true
         },
         "available-typed-arrays": {
           "version": "1.0.5",
    @@ -8604,9 +896,9 @@
           "dev": true
         },
         "camelcase": {
    -      "version": "6.2.0",
    -      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
    -      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
           "dev": true
         },
         "camelcase-keys": {
    @@ -9089,9 +1381,9 @@
           }
         },
         "doctrine": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
    -      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
    +      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2"
    @@ -9181,6 +1473,17 @@
             "minimist": "^1.2.5",
             "once": "^1.4.0",
             "subleveldown": "^5.0.0"
    +      },
    +      "dependencies": {
    +        "async": {
    +          "version": "2.6.3",
    +          "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
    +          "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
    +          "dev": true,
    +          "requires": {
    +            "lodash": "^4.17.14"
    +          }
    +        }
           }
         },
         "ee-first": {
    @@ -9381,20 +1684,50 @@
             "v8-compile-cache": "^2.0.3"
           },
           "dependencies": {
    +        "argparse": {
    +          "version": "2.0.1",
    +          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    +          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
    +          "dev": true
    +        },
             "debug": {
    -          "version": "4.3.2",
    -          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    -          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +          "version": "4.3.3",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    +          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
               "dev": true,
               "requires": {
                 "ms": "2.1.2"
               }
             },
    +        "doctrine": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
    +          "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
    +          "dev": true,
    +          "requires": {
    +            "esutils": "^2.0.2"
    +          }
    +        },
    +        "js-yaml": {
    +          "version": "4.1.0",
    +          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    +          "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    +          "dev": true,
    +          "requires": {
    +            "argparse": "^2.0.1"
    +          }
    +        },
             "ms": {
               "version": "2.1.2",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
               "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
               "dev": true
    +        },
    +        "strip-json-comments": {
    +          "version": "3.1.1",
    +          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
    +          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
    +          "dev": true
             }
           }
         },
    @@ -9436,14 +1769,13 @@
           }
         },
         "eslint-module-utils": {
    -      "version": "2.7.1",
    -      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
    -      "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
    +      "version": "2.7.2",
    +      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz",
    +      "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==",
           "dev": true,
           "requires": {
             "debug": "^3.2.7",
    -        "find-up": "^2.1.0",
    -        "pkg-dir": "^2.0.0"
    +        "find-up": "^2.1.0"
           },
           "dependencies": {
             "debug": {
    @@ -9488,9 +1820,9 @@
           }
         },
         "eslint-plugin-import": {
    -      "version": "2.25.2",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz",
    -      "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==",
    +      "version": "2.25.4",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz",
    +      "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==",
           "dev": true,
           "requires": {
             "array-includes": "^3.1.4",
    @@ -9498,25 +1830,14 @@
             "debug": "^2.6.9",
             "doctrine": "^2.1.0",
             "eslint-import-resolver-node": "^0.3.6",
    -        "eslint-module-utils": "^2.7.0",
    +        "eslint-module-utils": "^2.7.2",
             "has": "^1.0.3",
    -        "is-core-module": "^2.7.0",
    +        "is-core-module": "^2.8.0",
             "is-glob": "^4.0.3",
             "minimatch": "^3.0.4",
             "object.values": "^1.1.5",
             "resolve": "^1.20.0",
    -        "tsconfig-paths": "^3.11.0"
    -      },
    -      "dependencies": {
    -        "doctrine": {
    -          "version": "2.1.0",
    -          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
    -          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
    -          "dev": true,
    -          "requires": {
    -            "esutils": "^2.0.2"
    -          }
    -        }
    +        "tsconfig-paths": "^3.12.0"
           }
         },
         "eslint-scope": {
    @@ -9652,9 +1973,9 @@
           "dev": true
         },
         "fast-glob": {
    -      "version": "3.2.7",
    -      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
    -      "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
    +      "version": "3.2.9",
    +      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz",
    +      "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==",
           "dev": true,
           "requires": {
             "@nodelib/fs.stat": "^2.0.2",
    @@ -9773,9 +2094,9 @@
           }
         },
         "flatted": {
    -      "version": "3.2.2",
    -      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
    -      "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
    +      "version": "3.2.4",
    +      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
    +      "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
           "dev": true
         },
         "follow-redirects": {
    @@ -9817,25 +2138,6 @@
           "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==",
           "requires": {
             "js-yaml": "^3.13.1"
    -      },
    -      "dependencies": {
    -        "argparse": {
    -          "version": "1.0.10",
    -          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    -          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    -          "requires": {
    -            "sprintf-js": "~1.0.2"
    -          }
    -        },
    -        "js-yaml": {
    -          "version": "3.14.1",
    -          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    -          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    -          "requires": {
    -            "argparse": "^1.0.7",
    -            "esprima": "^4.0.0"
    -          }
    -        }
           }
         },
         "fs-extra": {
    @@ -9992,9 +2294,9 @@
           },
           "dependencies": {
             "ignore": {
    -          "version": "5.1.9",
    -          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
    -          "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
    +          "version": "5.2.0",
    +          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
    +          "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
               "dev": true
             }
           }
    @@ -10019,9 +2321,9 @@
           }
         },
         "graceful-fs": {
    -      "version": "4.2.8",
    -      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
    -      "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
    +      "version": "4.2.9",
    +      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
    +      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
         },
         "hard-rejection": {
           "version": "2.1.0",
    @@ -10086,9 +2388,9 @@
           "integrity": "sha512-nawlpCBCSASs7EdvZOYOYVkJpGmAOKMYZgZtUqSRqodZE0GRVcFKwo1RcpeOemqh9hyttTdd5wDBwHkuSyUfnA=="
         },
         "hosted-git-info": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
    -      "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
    +      "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
    @@ -10155,9 +2457,9 @@
           },
           "dependencies": {
             "debug": {
    -          "version": "4.3.2",
    -          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    -          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +          "version": "4.3.3",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    +          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
               "dev": true,
               "requires": {
                 "ms": "2.1.2"
    @@ -10193,9 +2495,9 @@
           "dev": true
         },
         "immediate": {
    -      "version": "3.3.0",
    -      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
    -      "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
    +      "version": "3.0.6",
    +      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
    +      "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
           "dev": true
         },
         "import-fresh": {
    @@ -10336,9 +2638,9 @@
           }
         },
         "is-core-module": {
    -      "version": "2.8.0",
    -      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
    -      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
    +      "version": "2.8.1",
    +      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
    +      "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
           "dev": true,
           "requires": {
             "has": "^1.0.3"
    @@ -10403,9 +2705,9 @@
           "dev": true
         },
         "is-negative-zero": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
    -      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
    +      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
           "dev": true
         },
         "is-npm": {
    @@ -10442,9 +2744,9 @@
           "dev": true
         },
         "is-plain-obj": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
    -      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    +      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
           "dev": true
         },
         "is-regex": {
    @@ -10519,19 +2821,23 @@
           "dev": true
         },
         "is-weakref": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
    -      "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
    +      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
           "dev": true,
           "requires": {
    -        "call-bind": "^1.0.0"
    +        "call-bind": "^1.0.2"
           }
         },
         "is-weakset": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
    -      "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
    -      "dev": true
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
    +      "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.1"
    +      }
         },
         "is-yarn-global": {
           "version": "0.3.0",
    @@ -10564,12 +2870,12 @@
           "dev": true
         },
         "js-yaml": {
    -      "version": "4.1.0",
    -      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    -      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    -      "dev": true,
    +      "version": "3.14.1",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    +      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
           "requires": {
    -        "argparse": "^2.0.1"
    +        "argparse": "^1.0.7",
    +        "esprima": "^4.0.0"
           }
         },
         "json-buffer": {
    @@ -10623,6 +2929,30 @@
             "parse-json": "^4.0.0",
             "strip-bom": "^4.0.0",
             "strip-json-comments": "^3.0.1"
    +      },
    +      "dependencies": {
    +        "parse-json": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
    +          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
    +          "dev": true,
    +          "requires": {
    +            "error-ex": "^1.3.1",
    +            "json-parse-better-errors": "^1.0.1"
    +          }
    +        },
    +        "strip-bom": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
    +          "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
    +          "dev": true
    +        },
    +        "strip-json-comments": {
    +          "version": "3.1.1",
    +          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
    +          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
    +          "dev": true
    +        }
           }
         },
         "jsonexport": {
    @@ -10651,38 +2981,6 @@
             "pako": "~1.0.2",
             "readable-stream": "~2.3.6",
             "set-immediate-shim": "~1.0.1"
    -      },
    -      "dependencies": {
    -        "readable-stream": {
    -          "version": "2.3.7",
    -          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
    -          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
    -          "dev": true,
    -          "requires": {
    -            "core-util-is": "~1.0.0",
    -            "inherits": "~2.0.3",
    -            "isarray": "~1.0.0",
    -            "process-nextick-args": "~2.0.0",
    -            "safe-buffer": "~5.1.1",
    -            "string_decoder": "~1.1.1",
    -            "util-deprecate": "~1.0.1"
    -          }
    -        },
    -        "safe-buffer": {
    -          "version": "5.1.2",
    -          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
    -          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
    -          "dev": true
    -        },
    -        "string_decoder": {
    -          "version": "1.1.1",
    -          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
    -          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
    -          "dev": true,
    -          "requires": {
    -            "safe-buffer": "~5.1.0"
    -          }
    -        }
           }
         },
         "junit-report-builder": {
    @@ -10695,6 +2993,14 @@
             "lodash": "^4.17.15",
             "mkdirp": "^0.5.0",
             "xmlbuilder": "^10.0.0"
    +      },
    +      "dependencies": {
    +        "xmlbuilder": {
    +          "version": "10.1.1",
    +          "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
    +          "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
    +          "dev": true
    +        }
           }
         },
         "keyv": {
    @@ -10777,6 +3083,19 @@
             "inherits": "^2.0.4",
             "readable-stream": "^3.4.0",
             "xtend": "^4.0.2"
    +      },
    +      "dependencies": {
    +        "readable-stream": {
    +          "version": "3.6.0",
    +          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
    +          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
    +          "dev": true,
    +          "requires": {
    +            "inherits": "^2.0.3",
    +            "string_decoder": "^1.1.1",
    +            "util-deprecate": "^1.0.1"
    +          }
    +        }
           }
         },
         "level-option-wrap": {
    @@ -10839,14 +3158,6 @@
           "dev": true,
           "requires": {
             "immediate": "~3.0.5"
    -      },
    -      "dependencies": {
    -        "immediate": {
    -          "version": "3.0.6",
    -          "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
    -          "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
    -          "dev": true
    -        }
           }
         },
         "lines-and-columns": {
    @@ -11026,6 +3337,13 @@
             "linkify-it": "^3.0.1",
             "mdurl": "^1.0.1",
             "uc.micro": "^1.0.5"
    +      },
    +      "dependencies": {
    +        "argparse": {
    +          "version": "2.0.1",
    +          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    +          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
    +        }
           }
         },
         "markdown-it-external-anchor": {
    @@ -11131,6 +3449,12 @@
               "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz",
               "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=",
               "dev": true
    +        },
    +        "safe-buffer": {
    +          "version": "5.2.1",
    +          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
    +          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
    +          "dev": true
             }
           }
         },
    @@ -11185,9 +3509,9 @@
           },
           "dependencies": {
             "debug": {
    -          "version": "4.3.2",
    -          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
    -          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
    +          "version": "4.3.3",
    +          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
    +          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
               "dev": true,
               "requires": {
                 "ms": "2.1.2"
    @@ -11279,20 +3603,12 @@
             "arrify": "^1.0.1",
             "is-plain-obj": "^1.1.0",
             "kind-of": "^6.0.3"
    -      },
    -      "dependencies": {
    -        "is-plain-obj": {
    -          "version": "1.1.0",
    -          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    -          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
    -          "dev": true
    -        }
           }
         },
         "minipass": {
    -      "version": "3.1.5",
    -      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
    -      "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
    +      "version": "3.1.6",
    +      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
    +      "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
           "dev": true,
           "requires": {
             "yallist": "^4.0.0"
    @@ -11571,13 +3887,15 @@
           }
         },
         "parse-json": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
    -      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
    +      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
           "dev": true,
           "requires": {
    +        "@babel/code-frame": "^7.0.0",
             "error-ex": "^1.3.1",
    -        "json-parse-better-errors": "^1.0.1"
    +        "json-parse-even-better-errors": "^2.3.0",
    +        "lines-and-columns": "^1.1.6"
           }
         },
         "parse-latin": {
    @@ -11644,20 +3962,11 @@
           "dev": true
         },
         "picomatch": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
    -      "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
    +      "version": "2.3.1",
    +      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
    +      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
           "dev": true
         },
    -    "pkg-dir": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
    -      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
    -      "dev": true,
    -      "requires": {
    -        "find-up": "^2.1.0"
    -      }
    -    },
         "prelude-ls": {
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
    @@ -11699,9 +4008,9 @@
           }
         },
         "punycode": {
    -      "version": "2.1.1",
    -      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
    -      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
    +      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
           "dev": true
         },
         "pupa": {
    @@ -11782,12 +4091,6 @@
               "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
               "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
               "dev": true
    -        },
    -        "strip-json-comments": {
    -          "version": "2.0.1",
    -          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
    -          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
    -          "dev": true
             }
           }
         },
    @@ -11827,18 +4130,6 @@
                 "validate-npm-package-license": "^3.0.1"
               }
             },
    -        "parse-json": {
    -          "version": "5.2.0",
    -          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
    -          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
    -          "dev": true,
    -          "requires": {
    -            "@babel/code-frame": "^7.0.0",
    -            "error-ex": "^1.3.1",
    -            "json-parse-even-better-errors": "^2.3.0",
    -            "lines-and-columns": "^1.1.6"
    -          }
    -        },
             "semver": {
               "version": "5.7.1",
               "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
    @@ -11922,14 +4213,18 @@
           }
         },
         "readable-stream": {
    -      "version": "3.6.0",
    -      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
    -      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
    +      "version": "2.3.7",
    +      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
    +      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
           "dev": true,
           "requires": {
    -        "inherits": "^2.0.3",
    -        "string_decoder": "^1.1.1",
    -        "util-deprecate": "^1.0.1"
    +        "core-util-is": "~1.0.0",
    +        "inherits": "~2.0.3",
    +        "isarray": "~1.0.0",
    +        "process-nextick-args": "~2.0.0",
    +        "safe-buffer": "~5.1.1",
    +        "string_decoder": "~1.1.1",
    +        "util-deprecate": "~1.0.1"
           }
         },
         "redent": {
    @@ -12065,13 +4360,14 @@
           "dev": true
         },
         "resolve": {
    -      "version": "1.20.0",
    -      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
    -      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
    +      "version": "1.21.0",
    +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
    +      "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
           "dev": true,
           "requires": {
    -        "is-core-module": "^2.2.0",
    -        "path-parse": "^1.0.6"
    +        "is-core-module": "^2.8.0",
    +        "path-parse": "^1.0.7",
    +        "supports-preserve-symlinks-flag": "^1.0.0"
           }
         },
         "resolve-from": {
    @@ -12124,12 +4420,6 @@
               "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
               "dev": true
             },
    -        "is-plain-obj": {
    -          "version": "1.1.0",
    -          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    -          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
    -          "dev": true
    -        },
             "unified": {
               "version": "6.2.0",
               "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
    @@ -12161,6 +4451,15 @@
                 "unist-util-stringify-position": "^1.0.0",
                 "vfile-message": "^1.0.0"
               }
    +        },
    +        "vfile-message": {
    +          "version": "1.1.1",
    +          "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
    +          "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
    +          "dev": true,
    +          "requires": {
    +            "unist-util-stringify-position": "^1.1.1"
    +          }
             }
           }
         },
    @@ -12309,9 +4608,9 @@
           "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ=="
         },
         "safe-buffer": {
    -      "version": "5.2.1",
    -      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
    -      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
    +      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
           "dev": true
         },
         "safer-buffer": {
    @@ -12434,9 +4733,9 @@
           }
         },
         "signal-exit": {
    -      "version": "3.0.5",
    -      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
    -      "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ=="
    +      "version": "3.0.6",
    +      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
    +      "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
         },
         "slash": {
           "version": "3.0.0",
    @@ -12528,15 +4827,6 @@
                 "color-convert": "^1.9.0"
               }
             },
    -        "argparse": {
    -          "version": "1.0.10",
    -          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    -          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    -          "dev": true,
    -          "requires": {
    -            "sprintf-js": "~1.0.2"
    -          }
    -        },
             "chalk": {
               "version": "2.4.2",
               "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    @@ -12586,16 +4876,6 @@
               "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
               "dev": true
             },
    -        "js-yaml": {
    -          "version": "3.14.1",
    -          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    -          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    -          "dev": true,
    -          "requires": {
    -            "argparse": "^1.0.7",
    -            "esprima": "^4.0.0"
    -          }
    -        },
             "jsonfile": {
               "version": "4.0.0",
               "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
    @@ -12634,20 +4914,11 @@
           "dev": true
         },
         "strftime": {
    -      "version": "0.10.0",
    -      "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz",
    -      "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=",
    +      "version": "0.10.1",
    +      "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.1.tgz",
    +      "integrity": "sha512-nVvH6JG8KlXFPC0f8lojLgEsPA18lRpLZ+RrJh/NkQV2tqOgZfbas8gcU8SFgnnqR3rWzZPYu6N2A3xzs/8rQg==",
           "dev": true
         },
    -    "string_decoder": {
    -      "version": "1.3.0",
    -      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
    -      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
    -      "dev": true,
    -      "requires": {
    -        "safe-buffer": "~5.2.0"
    -      }
    -    },
         "string-width": {
           "version": "4.2.3",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
    @@ -12690,6 +4961,15 @@
             "define-properties": "^1.1.3"
           }
         },
    +    "string_decoder": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
    +      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
    +      "dev": true,
    +      "requires": {
    +        "safe-buffer": "~5.1.0"
    +      }
    +    },
         "strip-ansi": {
           "version": "6.0.1",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
    @@ -12700,9 +4980,9 @@
           }
         },
         "strip-bom": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
    -      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    +      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
           "dev": true
         },
         "strip-indent": {
    @@ -12715,9 +4995,9 @@
           }
         },
         "strip-json-comments": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
    -      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
    +      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
           "dev": true
         },
         "subleveldown": {
    @@ -12756,6 +5036,12 @@
                 "base64-js": "^1.3.1",
                 "ieee754": "^1.1.13"
               }
    +        },
    +        "immediate": {
    +          "version": "3.3.0",
    +          "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
    +          "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
    +          "dev": true
             }
           }
         },
    @@ -12767,6 +5053,12 @@
             "has-flag": "^4.0.0"
           }
         },
    +    "supports-preserve-symlinks-flag": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
    +      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
    +      "dev": true
    +    },
         "symlink-or-copy": {
           "version": "1.3.1",
           "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz",
    @@ -12913,6 +5205,19 @@
           "dev": true,
           "requires": {
             "readable-stream": "3"
    +      },
    +      "dependencies": {
    +        "readable-stream": {
    +          "version": "3.6.0",
    +          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
    +          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
    +          "dev": true,
    +          "requires": {
    +            "inherits": "^2.0.3",
    +            "string_decoder": "^1.1.1",
    +            "util-deprecate": "^1.0.1"
    +          }
    +        }
           }
         },
         "tiny-each-async": {
    @@ -12979,23 +5284,15 @@
           "dev": true
         },
         "tsconfig-paths": {
    -      "version": "3.11.0",
    -      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz",
    -      "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==",
    +      "version": "3.12.0",
    +      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
    +      "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==",
           "dev": true,
           "requires": {
             "@types/json5": "^0.0.29",
             "json5": "^1.0.1",
             "minimist": "^1.2.0",
             "strip-bom": "^3.0.0"
    -      },
    -      "dependencies": {
    -        "strip-bom": {
    -          "version": "3.0.0",
    -          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    -          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
    -          "dev": true
    -        }
           }
         },
         "tsscmp": {
    @@ -13091,6 +5388,12 @@
             "vfile": "^4.0.0"
           },
           "dependencies": {
    +        "is-plain-obj": {
    +          "version": "2.1.0",
    +          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
    +          "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
    +          "dev": true
    +        },
             "vfile": {
               "version": "4.2.1",
               "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
    @@ -13102,16 +5405,6 @@
                 "unist-util-stringify-position": "^2.0.0",
                 "vfile-message": "^2.0.0"
               }
    -        },
    -        "vfile-message": {
    -          "version": "2.0.4",
    -          "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
    -          "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
    -          "dev": true,
    -          "requires": {
    -            "@types/unist": "^2.0.0",
    -            "unist-util-stringify-position": "^2.0.0"
    -          }
             }
           }
         },
    @@ -13224,6 +5517,14 @@
           "dev": true,
           "requires": {
             "punycode": "^2.1.0"
    +      },
    +      "dependencies": {
    +        "punycode": {
    +          "version": "2.1.1",
    +          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
    +          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
    +          "dev": true
    +        }
           }
         },
         "url": {
    @@ -13234,14 +5535,6 @@
           "requires": {
             "punycode": "1.3.2",
             "querystring": "0.2.0"
    -      },
    -      "dependencies": {
    -        "punycode": {
    -          "version": "1.3.2",
    -          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
    -          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
    -          "dev": true
    -        }
           }
         },
         "url-parse-lax": {
    @@ -13312,6 +5605,15 @@
               "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
               "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
               "dev": true
    +        },
    +        "vfile-message": {
    +          "version": "1.1.1",
    +          "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
    +          "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
    +          "dev": true,
    +          "requires": {
    +            "unist-util-stringify-position": "^1.1.1"
    +          }
             }
           }
         },
    @@ -13322,20 +5624,13 @@
           "dev": true
         },
         "vfile-message": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
    -      "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
    +      "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
           "dev": true,
           "requires": {
    -        "unist-util-stringify-position": "^1.1.1"
    -      },
    -      "dependencies": {
    -        "unist-util-stringify-position": {
    -          "version": "1.1.2",
    -          "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
    -          "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
    -          "dev": true
    -        }
    +        "@types/unist": "^2.0.0",
    +        "unist-util-stringify-position": "^2.0.0"
           }
         },
         "vfile-reporter": {
    @@ -13510,8 +5805,7 @@
           "version": "8.3.0",
           "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
           "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
    -      "dev": true,
    -      "requires": {}
    +      "dev": true
         },
         "x-is-string": {
           "version": "0.1.0",
    @@ -13533,20 +5827,12 @@
           "requires": {
             "sax": ">=0.6.0",
             "xmlbuilder": "~9.0.1"
    -      },
    -      "dependencies": {
    -        "xmlbuilder": {
    -          "version": "9.0.7",
    -          "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
    -          "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
    -          "dev": true
    -        }
           }
         },
         "xmlbuilder": {
    -      "version": "10.1.1",
    -      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
    -      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
    +      "version": "9.0.7",
    +      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
    +      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
           "dev": true
         },
         "xtend": {
    @@ -13596,14 +5882,6 @@
           "requires": {
             "async": "^3.2.0",
             "jszip": "^3.2.2"
    -      },
    -      "dependencies": {
    -        "async": {
    -          "version": "3.2.2",
    -          "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
    -          "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==",
    -          "dev": true
    -        }
           }
         },
         "zipit": {
    diff --git a/package.json b/package.json
    index 84b95045..f3b5bdf4 100644
    --- a/package.json
    +++ b/package.json
    @@ -32,7 +32,7 @@
         "slugify": "^1.6.5"
       },
       "devDependencies": {
    -    "@architect/architect": "^9.4.2",
    +    "@architect/architect": "9.4.2",
         "@architect/eslint-config": "^2.0.1",
         "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary",
         "eslint": "^8.6.0",
    
    From dfd63d54efbfe67f4245e9f6283cd34af435e871 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Fri, 7 Jan 2022 18:44:05 -0700
    Subject: [PATCH 310/680] 3.6.29
    
    ---
     package-lock.json | 2 +-
     package.json      | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index a9b6c42c..1beda88c 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.28",
    +  "version": "3.6.29",
       "lockfileVersion": 1,
       "requires": true,
       "dependencies": {
    diff --git a/package.json b/package.json
    index f3b5bdf4..534d5272 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.28",
    +  "version": "3.6.29",
       "repository": {
         "type": "git",
         "url": "https://github.com/architect/arc.codes"
    
    From eb5e329d95669db0238b9c2e43d1a63e4fa8cc0a Mon Sep 17 00:00:00 2001
    From: Ryan Block 
    Date: Sun, 9 Jan 2022 10:17:23 -0800
    Subject: [PATCH 311/680] Update Architect
    
    ---
     package-lock.json | 44 ++++++++++++++++++++++----------------------
     package.json      |  2 +-
     2 files changed, 23 insertions(+), 23 deletions(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index 1beda88c..1615045f 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -5,19 +5,19 @@
       "requires": true,
       "dependencies": {
         "@architect/architect": {
    -      "version": "9.4.2",
    -      "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.4.2.tgz",
    -      "integrity": "sha512-2XBsNHULMFCydG9YUqIYzoOZ2eLP4pkT3dnPMTf0B/5Qrby4t+sIbkTseLEkyK6Mhn1r8GWe+M/O4kYHNtIrpw==",
    +      "version": "9.5.1",
    +      "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.5.1.tgz",
    +      "integrity": "sha512-dy7mYhOqwAl4h++HNrInxgEWXCSluMb4SkVo0td9R4eCbUVR3stljTEOzQ2Co2Nzt4PVbpwEpurz0zX1n7GfAw==",
           "dev": true,
           "requires": {
             "@architect/create": "3.1.1",
    -        "@architect/deploy": "3.1.0",
    +        "@architect/deploy": "3.1.1",
             "@architect/destroy": "2.0.3",
             "@architect/env": "2.0.6",
    -        "@architect/hydrate": "2.1.0",
    +        "@architect/hydrate": "2.2.1",
             "@architect/logs": "3.0.3",
             "@architect/package": "7.2.0",
    -        "@architect/sandbox": "4.4.2",
    +        "@architect/sandbox": "4.5.1",
             "aws-sdk": "2.880.0",
             "chalk": "4.1.2",
             "update-notifier": "5.1.0"
    @@ -42,13 +42,13 @@
           }
         },
         "@architect/deploy": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.1.0.tgz",
    -      "integrity": "sha512-Sg4uZ6gSYrEwz5luOGkAkRm9fIrLoQvXZqaYOj4l6DZXNAt2A0EqoNLw9E6D7e6Y9kIqw42SJoIWNpqtx5sWpQ==",
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.1.1.tgz",
    +      "integrity": "sha512-ztQArJh/BGVYyPK3DQOnXwS1RqS0YFLEEzv7vwGmx522OckiiG0FUkSr52OPJI86d6Pi16q74mbZGmBMokS6uQ==",
           "dev": true,
           "requires": {
             "@architect/create": "~3.1.0",
    -        "@architect/hydrate": "~2.1.0",
    +        "@architect/hydrate": "~2.2.0",
             "@architect/inventory": "~2.2.0",
             "@architect/package": "~7.2.0",
             "@architect/utils": "~3.0.4",
    @@ -126,14 +126,14 @@
           }
         },
         "@architect/hydrate": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.1.0.tgz",
    -      "integrity": "sha512-mchkcEFZIZpkcIDLFndsCh0W1q5dmAOICMsO/rcAPYnRPvRQT8D4Bt+jFyV7AXu9OM3WGx34Llu/naKab/S1qQ==",
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.2.1.tgz",
    +      "integrity": "sha512-bvxFPv4bHdZ0S+pjHojNiNwaxsaeb8oJJM2USpnev5wYv6yG/PZiOL1J+HNFEnDje90Cj4sg4sESbROA6Tugig==",
           "dev": true,
           "requires": {
             "@architect/inventory": "~2.2.0",
             "@architect/utils": "~3.0.4",
    -        "acorn-loose": "~8.2.1",
    +        "acorn-loose": "~8.3.0",
             "chalk": "~4.1.2",
             "cpr": "~3.0.1",
             "esquery": "~1.4.0",
    @@ -185,14 +185,14 @@
           "integrity": "sha512-3XTuB/HS3GNDXXUQ2BJt7kVOViTGCR2O4hIUEb1l8FxsSmwzgpiR2CAzUA4ZhySxW+1a+Tg88YL2Yyb2kvLmlw=="
         },
         "@architect/sandbox": {
    -      "version": "4.4.2",
    -      "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.4.2.tgz",
    -      "integrity": "sha512-WxCaGBc7X7OJW3I6OuMNnl4zwYlUzK+CSFgvPMx3X/VmLc37Mzm4SVn75jv+qW49iSdLDClzcAOCXT67brtPBw==",
    +      "version": "4.5.1",
    +      "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.5.1.tgz",
    +      "integrity": "sha512-1r6Br9Not/m5YxvqtbiwO5Dsk0+ZmCthV1gdbo+k8SgieGx1EkjrGezRlJ2FyMII2cfymSUZsVEi0qMqEJgyzw==",
           "dev": true,
           "requires": {
             "@architect/asap": "~4.1.0",
             "@architect/create": "~3.1.1",
    -        "@architect/hydrate": "~2.1.0",
    +        "@architect/hydrate": "~2.2.0",
             "@architect/inventory": "~2.2.1",
             "@architect/parser": "~5.0.2",
             "@architect/utils": "~3.0.4",
    @@ -220,7 +220,7 @@
           }
         },
         "@architect/spellcheck-dictionary": {
    -      "version": "github:architect/spellcheck-dictionary#2ef31b2b23fec8674789df057180310138d07c90",
    +      "version": "github:architect/spellcheck-dictionary#11cae7e5559dda8ab03a3e3d32931db9a4fd3165",
           "from": "github:architect/spellcheck-dictionary",
           "dev": true
         },
    @@ -562,9 +562,9 @@
           "dev": true
         },
         "acorn-loose": {
    -      "version": "8.2.1",
    -      "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.2.1.tgz",
    -      "integrity": "sha512-/sVu5wCtWrX6ChLCMzBTmNkXSoyRKunTf6HjHMswzMmzIyE8vU+HYlgd2kFF/A9Av9j+b9/d/FzxrmcH0lCrBw==",
    +      "version": "8.3.0",
    +      "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.3.0.tgz",
    +      "integrity": "sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==",
           "dev": true,
           "requires": {
             "acorn": "^8.5.0"
    diff --git a/package.json b/package.json
    index 534d5272..d39485cc 100644
    --- a/package.json
    +++ b/package.json
    @@ -32,7 +32,7 @@
         "slugify": "^1.6.5"
       },
       "devDependencies": {
    -    "@architect/architect": "9.4.2",
    +    "@architect/architect": "^9.5.1",
         "@architect/eslint-config": "^2.0.1",
         "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary",
         "eslint": "^8.6.0",
    
    From c63552a18a18d39b293332a45ec3a6d28f51d843 Mon Sep 17 00:00:00 2001
    From: Ryan Block 
    Date: Sun, 9 Jan 2022 10:17:26 -0800
    Subject: [PATCH 312/680] 3.6.30
    
    ---
     package-lock.json | 2 +-
     package.json      | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index 1615045f..22518084 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.29",
    +  "version": "3.6.30",
       "lockfileVersion": 1,
       "requires": true,
       "dependencies": {
    diff --git a/package.json b/package.json
    index d39485cc..b5b457f3 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.29",
    +  "version": "3.6.30",
       "repository": {
         "type": "git",
         "url": "https://github.com/architect/arc.codes"
    
    From e4371c1491862debc986ad6ea0ea5dc2b1c8ac18 Mon Sep 17 00:00:00 2001
    From: Brian LeRoux 
    Date: Mon, 10 Jan 2022 11:40:23 -0800
    Subject: [PATCH 313/680] recommend named function for better stack traces
    
    also less chars I guess
    ---
     src/views/docs/en/guides/developer-experience/using-esm.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/src/views/docs/en/guides/developer-experience/using-esm.md b/src/views/docs/en/guides/developer-experience/using-esm.md
    index 9936e8c6..594dc9d0 100644
    --- a/src/views/docs/en/guides/developer-experience/using-esm.md
    +++ b/src/views/docs/en/guides/developer-experience/using-esm.md
    @@ -20,7 +20,7 @@ The simplest way to start using ESM is to create JavaScript files with a `.mjs`
     
     ```js
     // ./src/http/get-index/index.mjs
    -export const handler = async function (request) {
    +export async function handler (request) {
       return { request }
     }
     ```
    
    From 02cf8e28bb2e60ba4046b17783757df62f8777a8 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Mon, 10 Jan 2022 22:17:56 -0700
    Subject: [PATCH 314/680] Bump markdown-it from 12.3.1 to 12.3.2 (#481)
    
    Bumps [markdown-it](https://github.com/markdown-it/markdown-it) from 12.3.1 to 12.3.2.
    - [Release notes](https://github.com/markdown-it/markdown-it/releases)
    - [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/markdown-it/markdown-it/compare/12.3.1...12.3.2)
    
    ---
    updated-dependencies:
    - dependency-name: markdown-it
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     package-lock.json | 6 +++---
     package.json      | 2 +-
     2 files changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index 22518084..c50c5334 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -3328,9 +3328,9 @@
           "dev": true
         },
         "markdown-it": {
    -      "version": "12.3.1",
    -      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.1.tgz",
    -      "integrity": "sha512-xu6ZyQc/W1mWRwBOZT5ePVVn77MhHYkWwiAMgy/oBwUwSD2fS5xND3oIN44RCqVMgpNbhKtzZs9B75mC7FHwTQ==",
    +      "version": "12.3.2",
    +      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
    +      "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
           "requires": {
             "argparse": "^2.0.1",
             "entities": "~2.1.0",
    diff --git a/package.json b/package.json
    index b5b457f3..c635aee1 100644
    --- a/package.json
    +++ b/package.json
    @@ -26,7 +26,7 @@
         "esm": "^3.2.25",
         "front-matter": "^4.0.2",
         "highlight.js": "^11.4.0",
    -    "markdown-it": "^12.3.1",
    +    "markdown-it": "^12.3.2",
         "markdown-it-external-anchor": "^1.0.0",
         "markdown-it-toc-and-anchor": "^4.2.0",
         "slugify": "^1.6.5"
    
    From 5e65e1fa47e87729ce8d42a496f418f321b7243a Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Mon, 10 Jan 2022 22:15:12 -0700
    Subject: [PATCH 315/680] use npx when calling arc sandbox
    
    ---
     readme.md                                                   | 2 +-
     .../en/guides/developer-experience/local-development.md     | 4 ++--
     .../docs/en/guides/developer-experience/using-typescript.md | 2 +-
     src/views/docs/en/guides/extend/plugins.md                  | 2 +-
     src/views/docs/en/reference/cli/sandbox.md                  | 6 +++---
     .../docs/en/reference/configuration/local-preferences.md    | 6 +++---
     6 files changed, 11 insertions(+), 11 deletions(-)
    
    diff --git a/readme.md b/readme.md
    index 514c8195..bb9dea25 100644
    --- a/readme.md
    +++ b/readme.md
    @@ -10,7 +10,7 @@
     
     > ℹ️ We're actively improving Architect documentation, this repository, and this readme
     
    -This docs site is its own Architect project 🎉 so it can be run locally with `arc sandbox`
    +This docs site is its own Architect project 🎉 so it can be run locally with `npx arc sandbox`
     
     ## Table of Contents & Sidebar
     
    diff --git a/src/views/docs/en/guides/developer-experience/local-development.md b/src/views/docs/en/guides/developer-experience/local-development.md
    index 03da01d5..428233d6 100644
    --- a/src/views/docs/en/guides/developer-experience/local-development.md
    +++ b/src/views/docs/en/guides/developer-experience/local-development.md
    @@ -21,9 +21,9 @@ Follow the [quickstart](/docs/en/get-started/quickstart) to get everything wired
     
     ```bash
     cd myproject
    -arc sandbox
    +npx arc sandbox
     ```
    ->  `arc sandbox` kicks up a local web server with all the resources defined in your `app.arc` file
    +>  `npx arc sandbox` kicks up a local web server with all the resources defined in your `app.arc` file
     ## Testing
     
     Checkout [a complete example project for working locally](https://github.com/architect-examples/arc-example-working-locally).
    diff --git a/src/views/docs/en/guides/developer-experience/using-typescript.md b/src/views/docs/en/guides/developer-experience/using-typescript.md
    index 67a18436..09b8c3a8 100644
    --- a/src/views/docs/en/guides/developer-experience/using-typescript.md
    +++ b/src/views/docs/en/guides/developer-experience/using-typescript.md
    @@ -8,7 +8,7 @@ Architect and TypeScript work great together. Types are available in the [@types
     
     ```json
     "scripts": {
    -  "start": "arc sandbox",
    +  "start": "npx arc sandbox",
       "prestart": "npm run build",
       "deploy": "arc deploy",
       "predeploy": "npm run build",
    diff --git a/src/views/docs/en/guides/extend/plugins.md b/src/views/docs/en/guides/extend/plugins.md
    index 52149929..57e7c98a 100644
    --- a/src/views/docs/en/guides/extend/plugins.md
    +++ b/src/views/docs/en/guides/extend/plugins.md
    @@ -349,7 +349,7 @@ module.exports = {
     
     > `invokeFunction({ src, payload }, callback)`
     
    -This method should be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`arc sandbox`][sandbox] local development runtime context. For example, if your plugin manages Lambdas related to some AWS service, it may be nice to provide a local development experience for consumers of your plugin. To provide a great local experience, consumers of your plugin will want to exercise your plugin-generated Lambdas when running locally. Using the combination of the [`sandbox.start`](#sandbox.start) and `invokeFunction` methods, plugin authors can implement a local development experience for plugin consumers.
    +This method should be leveraged inside a plugin's [`sandbox.start`](#sandbox.start) method in order to easily invoke project Lambdas locally within an [`npx arc sandbox`][sandbox] local development runtime context. For example, if your plugin manages Lambdas related to some AWS service, it may be nice to provide a local development experience for consumers of your plugin. To provide a great local experience, consumers of your plugin will want to exercise your plugin-generated Lambdas when running locally. Using the combination of the [`sandbox.start`](#sandbox.start) and `invokeFunction` methods, plugin authors can implement a local development experience for plugin consumers.
     
     #### Arguments
     
    diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md
    index 9a9384e2..40a32683 100644
    --- a/src/views/docs/en/reference/cli/sandbox.md
    +++ b/src/views/docs/en/reference/cli/sandbox.md
    @@ -13,7 +13,7 @@ Architect projects work locally and offline. It emulates most app resources defi
     - `@queues`
     - `@tables` and `@tables-indexes`
     
    -> At this time `arc sandbox` does not emulate `@scheduled`
    +> At this time Sandbox does not emulate `@scheduled`
     
     ## Usage
     
    @@ -21,7 +21,7 @@ Architect projects work locally and offline. It emulates most app resources defi
     arc sandbox [--port|--verbose|--disable-symlinks|--no-hydrate]
     ```
     
    -> 🏗️ "macOS Monterey" [uses port 5000 for AirPlay features](https://developer.apple.com/forums/thread/682332). To avoid port collision, start sandbox with a custom tables port: `ARC_TABLES_PORT=5555 arc sandbox`.  
    +> 🏗️ "macOS Monterey" [uses port 5000 for AirPlay features](https://developer.apple.com/forums/thread/682332). To avoid port collision, start sandbox with a custom tables port: `ARC_TABLES_PORT=5555 npx arc sandbox`.  
     The default port may change in Architect 10.
     
     ### Flags
    @@ -57,7 +57,7 @@ Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dyn
     ### Connect sandbox to the staging database
     
     ```bash
    -NODE_ENV=staging ARC_LOCAL=1 arc sandbox
    +NODE_ENV=staging ARC_LOCAL=1 npx arc sandbox
     ```
     
     ### File watching
    diff --git a/src/views/docs/en/reference/configuration/local-preferences.md b/src/views/docs/en/reference/configuration/local-preferences.md
    index 99af5728..d77a3a2a 100644
    --- a/src/views/docs/en/reference/configuration/local-preferences.md
    +++ b/src/views/docs/en/reference/configuration/local-preferences.md
    @@ -44,7 +44,7 @@ In the above example, new `@http` functions will use your `path/to/template/http
     
     ## `@env`
     
    -Configure environment variables for `testing` with `arc sandbox` and deployed `staging` and `production` environments.
    +Configure environment variables for `testing` with Sandbox and deployed `staging` and `production` environments.
     
     Sync environment variables to your project by using the [`arc env` CLI command](../cli/env). If the preferences file does not exist Architect will generate `preferences.arc` file.
     
    @@ -80,7 +80,7 @@ ANOTHER_VAR=only-for-testing
     
     ## `@sandbox`
     
    -Define [`arc sandbox`](../cli/sandbox) preferences. If you are not using a `.env` file then any environment variables set using the [`arc env` CLI](../cli/env) will be stored in the preferences file. In this scenario it is best _not_ to revision the preferences file in source control.
    +Define [Sandbox](../cli/sandbox) preferences. If you are not using a `.env` file then any environment variables set using the [`arc env` CLI](../cli/env) will be stored in the preferences file. In this scenario it is best _not_ to revision the preferences file in source control.
     
     ### `env` - String
     
    @@ -113,7 +113,7 @@ no-hydrate true
     
     ## `@sandbox-startup`
     
    -Hook up CLI commands into [`arc sandbox`](../cli/sandbox) startup. Helpful for repetitive tasks like seeding a database or starting up additional services for local development. Each command should be a separate unindented line under the `@sandbox-startup` pragma.
    +Hook up CLI commands into [Sandbox](../cli/sandbox) startup. Helpful for repetitive tasks like seeding a database or starting up additional services for local development. Each command should be a separate unindented line under the `@sandbox-startup` pragma.
     
     ### Example
     
    
    From 83fa4c6a7f79ff88a571f893c737ef34fd812580 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Mon, 10 Jan 2022 22:15:22 -0700
    Subject: [PATCH 316/680] Update function-config.md
    
    ---
     .../configuration/function-config.md          | 33 ++++++++++++++-----
     1 file changed, 24 insertions(+), 9 deletions(-)
    
    diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md
    index 22ae6d2e..5569479e 100644
    --- a/src/views/docs/en/reference/configuration/function-config.md
    +++ b/src/views/docs/en/reference/configuration/function-config.md
    @@ -12,7 +12,15 @@ sections:
       - 'architecture'
     ---
     
    -Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`) with [the `@aws` pragma](../project-manifest/aws) and the following properties:
    +Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`).
    +
    +Use the `@arc` pragma to let a function opt out of Architect features:
    +
    +- `env` - boolean, `true` (default) or `false` to load local environment variables.
    +- `shared` - boolean, `true` (default) or `false` to skip hydrating project code from `@shared`.
    +- `views` - boolean, `true` (default) or `false` to skip hydrating project code from `@views`.
    +
    +Configure the deployed function with [the `@aws` pragma](../project-manifest/aws) and the following properties:
     
     - [`runtime`](#runtime) - string, Lambda runtime or alias: `nodejs14.x` (default), `python3.7`, `dotnetcore3.1`, `node`, `py`, `.net`, etc.
     - [`memory`](#memory) - number, between `128`MB and `3008`MB in 64 MB increments.
    @@ -27,6 +35,11 @@ Configure individual Lambda function properties (e.g. `src/http/get-index/config
     ## Example `config.arc`
     
     ```arc
    +@arc
    +env false
    +shared false
    +views false
    +
     @aws
     runtime ruby
     memory 256
    @@ -37,10 +50,12 @@ policies {ARN}
     architecture arm64
     ```
     
    +## `@aws`
    +
     Read more about the [Lambda limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) and [resource model](https://docs.aws.amazon.com/lambda/latest/dg/resource-model.html).
     
     
    -## `runtime`
    +### `runtime`
     
     Configure Lambda function `runtime`:
     
    @@ -56,7 +71,7 @@ See [@aws](../project-manifest/aws) for further reference.
     runtime ruby
     ```
     
    -## `memory`
    +### `memory`
     
     Configure Lambda function `memory` between `128` MB to `10240` MB, in `1` MB increments.
     
    @@ -67,7 +82,7 @@ Memory size also directly correlates with CPU speed; higher memory levels are av
     memory 1024
     ```
     
    -## `timeout`
    +### `timeout`
     
     Configure Lambda function `timeout` in seconds to a max of `900`. (`15` minutes.)
     
    @@ -78,7 +93,7 @@ The default timeout (if no value supplied) is `5`. (`5` seconds.)
     timeout 30
     ```
     
    -## `concurrency`
    +### `concurrency`
     
     Configure Lambda function concurrency. If not present concurrency is unthrottled.
     
    @@ -98,7 +113,7 @@ Disable invocation by setting concurrency to zero
     concurrency 0
     ```
     
    -## `layers`
    +### `layers`
     
     Configure Lambda function `layers` with max 5 Lambda Layer ARNs.
     
    @@ -122,7 +137,7 @@ layers
     
     > Tip: find [awesome layers](https://github.com/mthenw/awesome-layers)
     
    -## `policies`
    +### `policies`
     
     Configure custom Lambda function `policies`, enabling granular and specific privileges and access controls.
     
    @@ -156,12 +171,12 @@ policies S3CrudPolicy architect-default-policies
     
     ---
     
    -### Additional resources
    +#### Additional resources
     
     - [AWS IAM policy ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)
     - [Community-maintained list of AWS-managed policies](https://github.com/z0ph/MAMIP/tree/master/policies)
     
    -## `architecture`
    +### `architecture`
     
     Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) to be one of `x86_64` or `arm64`. This setting defaults to `x86_64` if not specified. `arm64` only available in supported AWS regions.
     
    
    From 835708bedefd5b832c19f051e614bdc91c8565b9 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Mon, 10 Jan 2022 23:04:10 -0700
    Subject: [PATCH 317/680] backlink to new function config section
    
    ---
     src/views/docs/en/reference/cli/env.md        |  4 +++
     .../configuration/function-config.md          | 31 ++++++++++++-------
     .../docs/en/reference/project-manifest/aws.md |  2 +-
     .../en/reference/project-manifest/shared.md   |  8 +++--
     .../en/reference/project-manifest/views.md    |  4 +++
     5 files changed, 34 insertions(+), 15 deletions(-)
    
    diff --git a/src/views/docs/en/reference/cli/env.md b/src/views/docs/en/reference/cli/env.md
    index f655165a..02936ad4 100644
    --- a/src/views/docs/en/reference/cli/env.md
    +++ b/src/views/docs/en/reference/cli/env.md
    @@ -45,3 +45,7 @@ arc env remove staging FOO
     - `NODE_ENV`
     - `ARC_APP_NAME`
     - `SESSION_TABLE_NAME`
    +
    +## Specific function opt-out
    +
    +A function can be [configured with a `config.arc`](../configuration/function-config#%40arc) to not load local environment variables.
    diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md
    index 5569479e..593c1b38 100644
    --- a/src/views/docs/en/reference/configuration/function-config.md
    +++ b/src/views/docs/en/reference/configuration/function-config.md
    @@ -14,12 +14,26 @@ sections:
     
     Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`).
     
    -Use the `@arc` pragma to let a function opt out of Architect features:
    +## `@arc`
    +
    +Use the `@arc` pragma to disable Architect functions for a specific function:
     
     - `env` - boolean, `true` (default) or `false` to load local environment variables.
     - `shared` - boolean, `true` (default) or `false` to skip hydrating project code from `@shared`.
     - `views` - boolean, `true` (default) or `false` to skip hydrating project code from `@views`.
     
    +### Example `config.arc`
    +
    +```arc
    +# src/function/dir/config.arc
    +@arc
    +env false
    +shared false
    +views false
    +```
    +
    +## `@aws`
    +
     Configure the deployed function with [the `@aws` pragma](../project-manifest/aws) and the following properties:
     
     - [`runtime`](#runtime) - string, Lambda runtime or alias: `nodejs14.x` (default), `python3.7`, `dotnetcore3.1`, `node`, `py`, `.net`, etc.
    @@ -32,14 +46,12 @@ Configure the deployed function with [the `@aws` pragma](../project-manifest/aws
     
     > Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB.
     
    -## Example `config.arc`
    +Read more about the [Lambda limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) and [resource model](https://docs.aws.amazon.com/lambda/latest/dg/resource-model.html).
     
    -```arc
    -@arc
    -env false
    -shared false
    -views false
    +### Example `config.arc`
     
    +```arc
    +# src/function/dir/config.arc
     @aws
     runtime ruby
     memory 256
    @@ -50,11 +62,6 @@ policies {ARN}
     architecture arm64
     ```
     
    -## `@aws`
    -
    -Read more about the [Lambda limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) and [resource model](https://docs.aws.amazon.com/lambda/latest/dg/resource-model.html).
    -
    -
     ### `runtime`
     
     Configure Lambda function `runtime`:
    diff --git a/src/views/docs/en/reference/project-manifest/aws.md b/src/views/docs/en/reference/project-manifest/aws.md
    index 2d31cef0..57a7cc3b 100644
    --- a/src/views/docs/en/reference/project-manifest/aws.md
    +++ b/src/views/docs/en/reference/project-manifest/aws.md
    @@ -4,7 +4,7 @@ category: app.arc
     description: Define AWS specific configuration.
     ---
     
    -Define AWS specific configuration for an entire project or [per function](../configuration/function-config).
    +Define AWS specific configuration for an entire project or [per function](../configuration/function-config#%40aws).
     
     ## Syntax
     
    diff --git a/src/views/docs/en/reference/project-manifest/shared.md b/src/views/docs/en/reference/project-manifest/shared.md
    index 97b3bd13..1764c452 100644
    --- a/src/views/docs/en/reference/project-manifest/shared.md
    +++ b/src/views/docs/en/reference/project-manifest/shared.md
    @@ -6,14 +6,14 @@ description: Configure src/shared code
     
     Configure the location of shared code.
     
    -### Syntax
    +## Syntax
     
     - Lowercase alphanumeric string
     - Maximum of 20 characters
     - Dashes are allowed; underscores are not allowed
     - Must begin with a letter
     
    -### Example
    +## Example
     
     The following configuration examples define a different folder than the default `src/shared` directory.
     
    @@ -77,3 +77,7 @@ shared:
     
     
     
    +
    +## Specific function opt-out
    +
    +A function can be [configured with a `config.arc`](../configuration/function-config#%40arc) to not have `@shared` code automatically hydrated.
    diff --git a/src/views/docs/en/reference/project-manifest/views.md b/src/views/docs/en/reference/project-manifest/views.md
    index cda43be8..367c628d 100644
    --- a/src/views/docs/en/reference/project-manifest/views.md
    +++ b/src/views/docs/en/reference/project-manifest/views.md
    @@ -109,3 +109,7 @@ views:
     
     
     
    +
    +## Specific function opt-out
    +
    +A function can be [configured with a `config.arc`](../configuration/function-config#%40arc) to not have `@views` code automatically hydrated.
    
    From f0796b9df92dfc88bd4eaf8694e5bfe55b0e4e6c Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Wed, 12 Jan 2022 08:40:27 -0700
    Subject: [PATCH 318/680] fix function config wording
    
    ---
     .../docs/en/guides/developer-experience/using-typescript.md   | 2 +-
     src/views/docs/en/reference/configuration/function-config.md  | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/src/views/docs/en/guides/developer-experience/using-typescript.md b/src/views/docs/en/guides/developer-experience/using-typescript.md
    index 09b8c3a8..67a18436 100644
    --- a/src/views/docs/en/guides/developer-experience/using-typescript.md
    +++ b/src/views/docs/en/guides/developer-experience/using-typescript.md
    @@ -8,7 +8,7 @@ Architect and TypeScript work great together. Types are available in the [@types
     
     ```json
     "scripts": {
    -  "start": "npx arc sandbox",
    +  "start": "arc sandbox",
       "prestart": "npm run build",
       "deploy": "arc deploy",
       "predeploy": "npm run build",
    diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md
    index 593c1b38..edb931a3 100644
    --- a/src/views/docs/en/reference/configuration/function-config.md
    +++ b/src/views/docs/en/reference/configuration/function-config.md
    @@ -16,9 +16,9 @@ Configure individual Lambda function properties (e.g. `src/http/get-index/config
     
     ## `@arc`
     
    -Use the `@arc` pragma to disable Architect functions for a specific function:
    +Use the `@arc` pragma to disable Architect features for a specific function:
     
    -- `env` - boolean, `true` (default) or `false` to load local environment variables.
    +- `env` - boolean, `true` (default) or `false` to skip loading local environment variables.
     - `shared` - boolean, `true` (default) or `false` to skip hydrating project code from `@shared`.
     - `views` - boolean, `true` (default) or `false` to skip hydrating project code from `@views`.
     
    
    From b6f592f47bae24646f434db42d4770c5828eed50 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Wed, 12 Jan 2022 09:09:16 -0700
    Subject: [PATCH 319/680] 3.6.31
    
    ---
     package-lock.json | 2 +-
     package.json      | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index c50c5334..2df29f47 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.30",
    +  "version": "3.6.31",
       "lockfileVersion": 1,
       "requires": true,
       "dependencies": {
    diff --git a/package.json b/package.json
    index c635aee1..2f64813a 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.30",
    +  "version": "3.6.31",
       "repository": {
         "type": "git",
         "url": "https://github.com/architect/arc.codes"
    
    From e99032b15c846eccdfc15f6add390fa77b908888 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Wed, 19 Jan 2022 19:51:54 -0700
    Subject: [PATCH 320/680] document catchall routes
    
    fixes #487
    ---
     package-lock.json                                    | 2 +-
     src/views/docs/en/reference/project-manifest/http.md | 6 ++++++
     2 files changed, 7 insertions(+), 1 deletion(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index 2df29f47..ac558766 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -220,7 +220,7 @@
           }
         },
         "@architect/spellcheck-dictionary": {
    -      "version": "github:architect/spellcheck-dictionary#11cae7e5559dda8ab03a3e3d32931db9a4fd3165",
    +      "version": "github:architect/spellcheck-dictionary#2ef31b2b23fec8674789df057180310138d07c90",
           "from": "github:architect/spellcheck-dictionary",
           "dev": true
         },
    diff --git a/src/views/docs/en/reference/project-manifest/http.md b/src/views/docs/en/reference/project-manifest/http.md
    index 14ea314f..ad84298c 100644
    --- a/src/views/docs/en/reference/project-manifest/http.md
    +++ b/src/views/docs/en/reference/project-manifest/http.md
    @@ -25,6 +25,7 @@ Each route is made up of two parts: HTTP verb and a route path.
       - Must begin with a letter
       - Advised maximum of 100 characters for paths
       - URL parameters are defined with a leading colon (`:`)
    +  - A trailing asterisk (`*`) denotes a "catchall"
     
     Routes can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a  `method` and `src` for each route:
     
    @@ -54,6 +55,7 @@ get /pages
     get /pages/:dateID
     get /contact
     post /contact
    +get /widgets/* # catch all unmatched routes
     # verbose custom source:
     /weather
       method get
    @@ -75,6 +77,7 @@ post /contact
         ["get", "/pages/:dateID"],
         ["get", "/contact"],
         ["post", "/contact"],
    +    ["get", "/widgets/*"],
         {
           "/weather": {
             "method": "get",
    @@ -100,6 +103,7 @@ http:
     - get: "/pages/:dateID"
     - get: "/contact"
     - post: "/contact"
    +- get: "/widgets/*"
     # verbose custom source:
     - "/weather":
         method: get
    @@ -120,6 +124,7 @@ http=[
       ["get", "/pages/:dateID"],
       ["get", "/contact"],
       ["post", "/contact"]
    +  ["get", "/widgets/*"],
     ]
     
     # TOML doesn't allow mixed types in an array.
    @@ -147,6 +152,7 @@ Which utilizes the following project directory structure:
     │       ├── get-pages/
     │       ├── get-pages-000dateID/
     │       ├── get-contact/
    +│       ├── get-widgets-catchall/
     │       └── post-contact/
     ├── app.arc
     └── package.json
    
    From 6383d02d005ed9a29251c7c51e550d44e514abee Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Mon, 17 Jan 2022 08:01:55 +0000
    Subject: [PATCH 321/680] Bump tape from 5.4.0 to 5.4.1
    
    Bumps [tape](https://github.com/substack/tape) from 5.4.0 to 5.4.1.
    - [Release notes](https://github.com/substack/tape/releases)
    - [Commits](https://github.com/substack/tape/compare/v5.4.0...v5.4.1)
    
    ---
    updated-dependencies:
    - dependency-name: tape
      dependency-type: direct:development
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     package-lock.json | 26 ++++++++++++++++++++------
     package.json      |  2 +-
     2 files changed, 21 insertions(+), 7 deletions(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index ac558766..96112efd 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -688,6 +688,18 @@
           "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
           "dev": true
         },
    +    "array.prototype.every": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.3.tgz",
    +      "integrity": "sha512-vWnriJI//SOMOWtXbU/VXhJ/InfnNHPF6BLKn5WfY8xXy+NWql0fUy20GO3sdqBhCAO+qw8S/E5nJiZX+QFdCA==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.0",
    +        "is-string": "^1.0.7"
    +      }
    +    },
         "array.prototype.flat": {
           "version": "1.2.5",
           "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
    @@ -4244,9 +4256,9 @@
           "dev": true
         },
         "regexp.prototype.flags": {
    -      "version": "1.3.1",
    -      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
    -      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz",
    +      "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==",
           "dev": true,
           "requires": {
             "call-bind": "^1.0.2",
    @@ -5142,11 +5154,12 @@
           }
         },
         "tape": {
    -      "version": "5.4.0",
    -      "resolved": "https://registry.npmjs.org/tape/-/tape-5.4.0.tgz",
    -      "integrity": "sha512-8Cq4mql6oZVO7zkMcen+2AZoJyICsHjJqTiWk1kVub6C/EsS4o9zBVWWbvBBLzx10okW3SKCoNN9XfwfTAIR2w==",
    +      "version": "5.4.1",
    +      "resolved": "https://registry.npmjs.org/tape/-/tape-5.4.1.tgz",
    +      "integrity": "sha512-7bGaJ3WnQ/CX3xOWzlR+9lNptEWoD+11gyREP8k+SYrDu2a20EifKpTmZndXn25ZRxesYHSuNtE7Fb+THcjfGA==",
           "dev": true,
           "requires": {
    +        "array.prototype.every": "^1.1.3",
             "call-bind": "^1.0.2",
             "deep-equal": "^2.0.5",
             "defined": "^1.0.0",
    @@ -5161,6 +5174,7 @@
             "minimist": "^1.2.5",
             "object-inspect": "^1.12.0",
             "object-is": "^1.1.5",
    +        "object-keys": "^1.1.1",
             "object.assign": "^4.1.2",
             "resolve": "^2.0.0-next.3",
             "resumer": "^0.0.0",
    diff --git a/package.json b/package.json
    index 2f64813a..5d5cc52f 100644
    --- a/package.json
    +++ b/package.json
    @@ -39,7 +39,7 @@
         "linkinator": "^2.16.2",
         "spellchecker-cli": "^4.8.1",
         "tap-arc": "^0.1.2",
    -    "tape": "^5.4.0",
    +    "tape": "^5.4.1",
         "tiny-json-http": "^7.3.1"
       },
       "eslintConfig": {
    
    From a2a2a1aaf564fb730c199df8be39a9da5a6b30c9 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Wed, 19 Jan 2022 20:03:45 -0700
    Subject: [PATCH 322/680] bump arc and eslint
    
    vulnerability found in sub dependency
    ---
     package-lock.json | 86 +++++++++++++++++++----------------------------
     package.json      |  4 +--
     2 files changed, 36 insertions(+), 54 deletions(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index 96112efd..09fae91f 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -5,19 +5,19 @@
       "requires": true,
       "dependencies": {
         "@architect/architect": {
    -      "version": "9.5.1",
    -      "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.5.1.tgz",
    -      "integrity": "sha512-dy7mYhOqwAl4h++HNrInxgEWXCSluMb4SkVo0td9R4eCbUVR3stljTEOzQ2Co2Nzt4PVbpwEpurz0zX1n7GfAw==",
    +      "version": "9.5.4",
    +      "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.5.4.tgz",
    +      "integrity": "sha512-fjuUsMiZgf+19ijeu4cU6/hlZg3PrXjNl//4V1+gAogJisUelxMRsZrbvZqNX2EfphdSNemCYuYtxVmCqQmiLQ==",
           "dev": true,
           "requires": {
             "@architect/create": "3.1.1",
             "@architect/deploy": "3.1.1",
             "@architect/destroy": "2.0.3",
             "@architect/env": "2.0.6",
    -        "@architect/hydrate": "2.2.1",
    +        "@architect/hydrate": "2.2.3",
             "@architect/logs": "3.0.3",
             "@architect/package": "7.2.0",
    -        "@architect/sandbox": "4.5.1",
    +        "@architect/sandbox": "4.5.2",
             "aws-sdk": "2.880.0",
             "chalk": "4.1.2",
             "update-notifier": "5.1.0"
    @@ -126,9 +126,9 @@
           }
         },
         "@architect/hydrate": {
    -      "version": "2.2.1",
    -      "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.2.1.tgz",
    -      "integrity": "sha512-bvxFPv4bHdZ0S+pjHojNiNwaxsaeb8oJJM2USpnev5wYv6yG/PZiOL1J+HNFEnDje90Cj4sg4sESbROA6Tugig==",
    +      "version": "2.2.3",
    +      "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.2.3.tgz",
    +      "integrity": "sha512-l1lFwKBcZFDKgnNgQ4oEYXQ/gLnSGZogc1fMHnqPi7ZnEkSJ6wvWPpp+Dao+8ZZbNpTa4nyHKhsDz547+gdsqg==",
           "dev": true,
           "requires": {
             "@architect/inventory": "~2.2.0",
    @@ -185,9 +185,9 @@
           "integrity": "sha512-3XTuB/HS3GNDXXUQ2BJt7kVOViTGCR2O4hIUEb1l8FxsSmwzgpiR2CAzUA4ZhySxW+1a+Tg88YL2Yyb2kvLmlw=="
         },
         "@architect/sandbox": {
    -      "version": "4.5.1",
    -      "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.5.1.tgz",
    -      "integrity": "sha512-1r6Br9Not/m5YxvqtbiwO5Dsk0+ZmCthV1gdbo+k8SgieGx1EkjrGezRlJ2FyMII2cfymSUZsVEi0qMqEJgyzw==",
    +      "version": "4.5.2",
    +      "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.5.2.tgz",
    +      "integrity": "sha512-Mw1qud5fZU4CuWIdekG7MTgqvksWVn8A5dzE4ddWg+Y9ysExcHW6b849q1ydpUs0qR/ViPCPUvjQ2KagnUuoGw==",
           "dev": true,
           "requires": {
             "@architect/asap": "~4.1.0",
    @@ -364,6 +364,12 @@
                 "ms": "2.1.2"
               }
             },
    +        "ignore": {
    +          "version": "4.0.6",
    +          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
    +          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
    +          "dev": true
    +        },
             "js-yaml": {
               "version": "4.1.0",
               "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    @@ -617,12 +623,6 @@
             "string-width": "^4.1.0"
           }
         },
    -    "ansi-colors": {
    -      "version": "4.1.1",
    -      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
    -      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
    -      "dev": true
    -    },
         "ansi-regex": {
           "version": "5.0.1",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
    @@ -718,9 +718,9 @@
           "dev": true
         },
         "async": {
    -      "version": "3.2.2",
    -      "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
    -      "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==",
    +      "version": "3.2.3",
    +      "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
    +      "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==",
           "dev": true
         },
         "available-typed-arrays": {
    @@ -1537,15 +1537,6 @@
             "once": "^1.4.0"
           }
         },
    -    "enquirer": {
    -      "version": "2.3.6",
    -      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
    -      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
    -      "dev": true,
    -      "requires": {
    -        "ansi-colors": "^4.1.1"
    -      }
    -    },
         "entities": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
    @@ -1651,9 +1642,9 @@
           "dev": true
         },
         "eslint": {
    -      "version": "8.6.0",
    -      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz",
    -      "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==",
    +      "version": "8.7.0",
    +      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz",
    +      "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==",
           "dev": true,
           "requires": {
             "@eslint/eslintrc": "^1.0.5",
    @@ -1663,11 +1654,10 @@
             "cross-spawn": "^7.0.2",
             "debug": "^4.3.2",
             "doctrine": "^3.0.0",
    -        "enquirer": "^2.3.5",
             "escape-string-regexp": "^4.0.0",
             "eslint-scope": "^7.1.0",
             "eslint-utils": "^3.0.0",
    -        "eslint-visitor-keys": "^3.1.0",
    +        "eslint-visitor-keys": "^3.2.0",
             "espree": "^9.3.0",
             "esquery": "^1.4.0",
             "esutils": "^2.0.2",
    @@ -1676,7 +1666,7 @@
             "functional-red-black-tree": "^1.0.1",
             "glob-parent": "^6.0.1",
             "globals": "^13.6.0",
    -        "ignore": "^4.0.6",
    +        "ignore": "^5.2.0",
             "import-fresh": "^3.0.0",
             "imurmurhash": "^0.1.4",
             "is-glob": "^4.0.0",
    @@ -1687,9 +1677,7 @@
             "minimatch": "^3.0.4",
             "natural-compare": "^1.4.0",
             "optionator": "^0.9.1",
    -        "progress": "^2.0.0",
             "regexpp": "^3.2.0",
    -        "semver": "^7.2.1",
             "strip-ansi": "^6.0.1",
             "strip-json-comments": "^3.1.0",
             "text-table": "^0.2.0",
    @@ -1880,9 +1868,9 @@
           }
         },
         "eslint-visitor-keys": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
    -      "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
    +      "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==",
           "dev": true
         },
         "esm": {
    @@ -2112,9 +2100,9 @@
           "dev": true
         },
         "follow-redirects": {
    -      "version": "1.14.6",
    -      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz",
    -      "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==",
    +      "version": "1.14.7",
    +      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
    +      "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
           "dev": true
         },
         "for-each": {
    @@ -2501,9 +2489,9 @@
           "dev": true
         },
         "ignore": {
    -      "version": "4.0.6",
    -      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
    -      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
    +      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
           "dev": true
         },
         "immediate": {
    @@ -3997,12 +3985,6 @@
           "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
           "dev": true
         },
    -    "progress": {
    -      "version": "2.0.3",
    -      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
    -      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
    -      "dev": true
    -    },
         "prr": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
    diff --git a/package.json b/package.json
    index 5d5cc52f..6a1e9354 100644
    --- a/package.json
    +++ b/package.json
    @@ -32,10 +32,10 @@
         "slugify": "^1.6.5"
       },
       "devDependencies": {
    -    "@architect/architect": "^9.5.1",
    +    "@architect/architect": "^9.5.4",
         "@architect/eslint-config": "^2.0.1",
         "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary",
    -    "eslint": "^8.6.0",
    +    "eslint": "^8.7.0",
         "linkinator": "^2.16.2",
         "spellchecker-cli": "^4.8.1",
         "tap-arc": "^0.1.2",
    
    From e25fc7a0e843e8c7cb5ea09d6107ceb67449f0ca Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Wed, 19 Jan 2022 20:13:46 -0700
    Subject: [PATCH 323/680] update linkinator and link checker script
    
    0 vulnerabilities
    ---
     package-lock.json                             | 249 +++++++++---------
     package.json                                  |   4 +-
     scripts/{link-checker.js => link-checker.mjs} |  11 +-
     3 files changed, 127 insertions(+), 137 deletions(-)
     rename scripts/{link-checker.js => link-checker.mjs} (83%)
    
    diff --git a/package-lock.json b/package-lock.json
    index 09fae91f..e49833dd 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -258,9 +258,9 @@
           "dev": true
         },
         "@babel/highlight": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz",
    -      "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==",
    +      "version": "7.16.10",
    +      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
    +      "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
           "dev": true,
           "requires": {
             "@babel/helper-validator-identifier": "^7.16.7",
    @@ -914,20 +914,21 @@
           "dev": true
         },
         "camelcase-keys": {
    -      "version": "6.2.2",
    -      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
    -      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.1.tgz",
    +      "integrity": "sha512-P331lEls98pW8JLyodNWfzuz91BEDVA4VpW2/SwXnyv2K495tq1N777xzDbFgnEigfA7UIY0xa6PwR/H9jijjA==",
           "dev": true,
           "requires": {
    -        "camelcase": "^5.3.1",
    -        "map-obj": "^4.0.0",
    -        "quick-lru": "^4.0.1"
    +        "camelcase": "^6.2.0",
    +        "map-obj": "^4.1.0",
    +        "quick-lru": "^5.1.1",
    +        "type-fest": "^1.2.1"
           },
           "dependencies": {
    -        "camelcase": {
    -          "version": "5.3.1",
    -          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    -          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
    +        "type-fest": {
    +          "version": "1.4.0",
    +          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
    +          "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
               "dev": true
             }
           }
    @@ -1220,9 +1221,9 @@
           }
         },
         "decamelize": {
    -      "version": "1.2.0",
    -      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
    -      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
    +      "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
           "dev": true
         },
         "decamelize-keys": {
    @@ -1235,6 +1236,12 @@
             "map-obj": "^1.0.0"
           },
           "dependencies": {
    +        "decamelize": {
    +          "version": "1.2.0",
    +          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
    +          "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
    +          "dev": true
    +        },
             "map-obj": {
               "version": "1.0.1",
               "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
    @@ -2523,9 +2530,9 @@
           "dev": true
         },
         "indent-string": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
    -      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
    +      "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
           "dev": true
         },
         "inflight": {
    @@ -3175,24 +3182,30 @@
           }
         },
         "linkinator": {
    -      "version": "2.16.2",
    -      "resolved": "https://registry.npmjs.org/linkinator/-/linkinator-2.16.2.tgz",
    -      "integrity": "sha512-5tHSz6gMN0z25+Pk4lZnU0Edr1lJLNuk+MCfQa2NxF4f1rfKS8Lo3JEwxTciVzwVHHdBpydAgmWYOgylNlwyDQ==",
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/linkinator/-/linkinator-3.0.3.tgz",
    +      "integrity": "sha512-JpZFe1VIdaVy2wMCf8HDAB61tIjD69hOY1lPHCfM0OTPEhu9z9oPe449veZIympH9PUJUXe6yoif7DXHs8H5xw==",
           "dev": true,
           "requires": {
    -        "chalk": "^4.0.0",
    +        "chalk": "^5.0.0",
             "escape-html": "^1.0.3",
    -        "gaxios": "^4.0.0",
    -        "glob": "^7.1.6",
    -        "htmlparser2": "^7.1.2",
    -        "jsonexport": "^3.0.0",
    -        "marked": "^2.0.0",
    -        "meow": "^9.0.0",
    +        "gaxios": "^4.3.2",
    +        "glob": "^7.2.0",
    +        "htmlparser2": "^7.2.0",
    +        "jsonexport": "^3.2.0",
    +        "marked": "^4.0.3",
    +        "meow": "^10.1.1",
             "mime": "^3.0.0",
             "server-destroy": "^1.0.1",
    -        "update-notifier": "^5.0.0"
    +        "update-notifier": "^5.1.0"
           },
           "dependencies": {
    +        "chalk": {
    +          "version": "5.0.0",
    +          "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.0.tgz",
    +          "integrity": "sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==",
    +          "dev": true
    +        },
             "mime": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
    @@ -3361,9 +3374,9 @@
           }
         },
         "marked": {
    -      "version": "2.1.3",
    -      "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
    -      "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==",
    +      "version": "4.0.10",
    +      "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz",
    +      "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==",
           "dev": true
         },
         "mdast-util-from-markdown": {
    @@ -3459,29 +3472,29 @@
           }
         },
         "meow": {
    -      "version": "9.0.0",
    -      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
    -      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
    +      "version": "10.1.2",
    +      "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.2.tgz",
    +      "integrity": "sha512-zbuAlN+V/sXlbGchNS9WTWjUzeamwMt/BApKCJi7B0QyZstZaMx0n4Unll/fg0njGtMdC9UP5SAscvOCLYdM+Q==",
           "dev": true,
           "requires": {
    -        "@types/minimist": "^1.2.0",
    -        "camelcase-keys": "^6.2.2",
    -        "decamelize": "^1.2.0",
    +        "@types/minimist": "^1.2.2",
    +        "camelcase-keys": "^7.0.0",
    +        "decamelize": "^5.0.0",
             "decamelize-keys": "^1.1.0",
             "hard-rejection": "^2.1.0",
             "minimist-options": "4.1.0",
    -        "normalize-package-data": "^3.0.0",
    -        "read-pkg-up": "^7.0.1",
    -        "redent": "^3.0.0",
    -        "trim-newlines": "^3.0.0",
    -        "type-fest": "^0.18.0",
    -        "yargs-parser": "^20.2.3"
    +        "normalize-package-data": "^3.0.2",
    +        "read-pkg-up": "^8.0.0",
    +        "redent": "^4.0.0",
    +        "trim-newlines": "^4.0.2",
    +        "type-fest": "^1.2.2",
    +        "yargs-parser": "^20.2.9"
           },
           "dependencies": {
             "type-fest": {
    -          "version": "0.18.1",
    -          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
    -          "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
    +          "version": "1.4.0",
    +          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
    +          "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
               "dev": true
             }
           }
    @@ -3658,9 +3671,9 @@
           "dev": true
         },
         "node-fetch": {
    -      "version": "2.6.6",
    -      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
    -      "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
    +      "version": "2.6.7",
    +      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
    +      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
           "dev": true,
           "requires": {
             "whatwg-url": "^5.0.0"
    @@ -4034,9 +4047,9 @@
           "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
         },
         "quick-lru": {
    -      "version": "4.0.1",
    -      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
    -      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
    +      "version": "5.1.1",
    +      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
    +      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
           "dev": true
         },
         "quotation": {
    @@ -4095,103 +4108,73 @@
           "dev": true
         },
         "read-pkg": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
    -      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
    +      "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
           "dev": true,
           "requires": {
             "@types/normalize-package-data": "^2.4.0",
    -        "normalize-package-data": "^2.5.0",
    -        "parse-json": "^5.0.0",
    -        "type-fest": "^0.6.0"
    +        "normalize-package-data": "^3.0.2",
    +        "parse-json": "^5.2.0",
    +        "type-fest": "^1.0.1"
           },
           "dependencies": {
    -        "hosted-git-info": {
    -          "version": "2.8.9",
    -          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
    -          "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
    -          "dev": true
    -        },
    -        "normalize-package-data": {
    -          "version": "2.5.0",
    -          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
    -          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
    -          "dev": true,
    -          "requires": {
    -            "hosted-git-info": "^2.1.4",
    -            "resolve": "^1.10.0",
    -            "semver": "2 || 3 || 4 || 5",
    -            "validate-npm-package-license": "^3.0.1"
    -          }
    -        },
    -        "semver": {
    -          "version": "5.7.1",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
    -          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
    -          "dev": true
    -        },
             "type-fest": {
    -          "version": "0.6.0",
    -          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
    -          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
    +          "version": "1.4.0",
    +          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
    +          "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
               "dev": true
             }
           }
         },
         "read-pkg-up": {
    -      "version": "7.0.1",
    -      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
    -      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
    +      "version": "8.0.0",
    +      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
    +      "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
           "dev": true,
           "requires": {
    -        "find-up": "^4.1.0",
    -        "read-pkg": "^5.2.0",
    -        "type-fest": "^0.8.1"
    +        "find-up": "^5.0.0",
    +        "read-pkg": "^6.0.0",
    +        "type-fest": "^1.0.1"
           },
           "dependencies": {
             "find-up": {
    -          "version": "4.1.0",
    -          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
    -          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
    +          "version": "5.0.0",
    +          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
    +          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
               "dev": true,
               "requires": {
    -            "locate-path": "^5.0.0",
    +            "locate-path": "^6.0.0",
                 "path-exists": "^4.0.0"
               }
             },
             "locate-path": {
    -          "version": "5.0.0",
    -          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
    -          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
    +          "version": "6.0.0",
    +          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
    +          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
               "dev": true,
               "requires": {
    -            "p-locate": "^4.1.0"
    +            "p-locate": "^5.0.0"
               }
             },
             "p-limit": {
    -          "version": "2.3.0",
    -          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    -          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    +          "version": "3.1.0",
    +          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
    +          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
               "dev": true,
               "requires": {
    -            "p-try": "^2.0.0"
    +            "yocto-queue": "^0.1.0"
               }
             },
             "p-locate": {
    -          "version": "4.1.0",
    -          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
    -          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
    +          "version": "5.0.0",
    +          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
    +          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
               "dev": true,
               "requires": {
    -            "p-limit": "^2.2.0"
    +            "p-limit": "^3.0.2"
               }
             },
    -        "p-try": {
    -          "version": "2.2.0",
    -          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
    -          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
    -          "dev": true
    -        },
             "path-exists": {
               "version": "4.0.0",
               "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
    @@ -4199,9 +4182,9 @@
               "dev": true
             },
             "type-fest": {
    -          "version": "0.8.1",
    -          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
    -          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
    +          "version": "1.4.0",
    +          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
    +          "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
               "dev": true
             }
           }
    @@ -4222,13 +4205,13 @@
           }
         },
         "redent": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
    -      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
    +      "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
           "dev": true,
           "requires": {
    -        "indent-string": "^4.0.0",
    -        "strip-indent": "^3.0.0"
    +        "indent-string": "^5.0.0",
    +        "strip-indent": "^4.0.0"
           }
         },
         "reduce-flatten": {
    @@ -4980,12 +4963,12 @@
           "dev": true
         },
         "strip-indent": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
    -      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
    +      "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
           "dev": true,
           "requires": {
    -        "min-indent": "^1.0.0"
    +        "min-indent": "^1.0.1"
           }
         },
         "strip-json-comments": {
    @@ -5268,9 +5251,9 @@
           "dev": true
         },
         "trim-newlines": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
    -      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz",
    +      "integrity": "sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==",
           "dev": true
         },
         "trough": {
    @@ -5870,6 +5853,12 @@
           "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==",
           "dev": true
         },
    +    "yocto-queue": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
    +      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
    +      "dev": true
    +    },
         "zip-dir": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz",
    diff --git a/package.json b/package.json
    index 6a1e9354..9bfc86c3 100644
    --- a/package.json
    +++ b/package.json
    @@ -9,7 +9,7 @@
       "scripts": {
         "dist": "./scripts/dist.sh",
         "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json",
    -    "link-checker": "node ./scripts/link-checker.js | tap-arc",
    +    "link-checker": "node ./scripts/link-checker.mjs | tap-arc",
         "lint": "eslint src --fix",
         "start": "sandbox",
         "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-arc",
    @@ -36,7 +36,7 @@
         "@architect/eslint-config": "^2.0.1",
         "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary",
         "eslint": "^8.7.0",
    -    "linkinator": "^2.16.2",
    +    "linkinator": "^3.0.3",
         "spellchecker-cli": "^4.8.1",
         "tap-arc": "^0.1.2",
         "tape": "^5.4.1",
    diff --git a/scripts/link-checker.js b/scripts/link-checker.mjs
    similarity index 83%
    rename from scripts/link-checker.js
    rename to scripts/link-checker.mjs
    index be6510ac..09970af0 100644
    --- a/scripts/link-checker.js
    +++ b/scripts/link-checker.mjs
    @@ -1,7 +1,8 @@
    -let link = require('linkinator')
    -let test = require('tape')
    -let sandbox = require('@architect/sandbox')
    -let { currentRoot } = require('../src/shared/redirect-map')
    +import { LinkChecker } from 'linkinator'
    +import test from 'tape'
    +import sandbox from '@architect/sandbox'
    +
    +import { currentRoot }  from '../src/shared/redirect-map.js'
     
     const host = 'http://localhost:3333'
     const root = `${host}${currentRoot}`
    @@ -10,7 +11,7 @@ test('find broken links', async (t) => {
       await sandbox.start({ quiet: true })
       t.pass(`sandbox started at ${host}`)
     
    -  const checker = new link.LinkChecker()
    +  const checker = new LinkChecker()
     
       checker.on('link', result => {
         if (result.state === 'BROKEN')
    
    From aa0707b2686067a0549e1c6740bbf32995371ba5 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Wed, 19 Jan 2022 20:19:00 -0700
    Subject: [PATCH 324/680] 3.6.32
    
    ---
     package-lock.json | 2 +-
     package.json      | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/package-lock.json b/package-lock.json
    index e49833dd..d81f7b19 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.31",
    +  "version": "3.6.32",
       "lockfileVersion": 1,
       "requires": true,
       "dependencies": {
    diff --git a/package.json b/package.json
    index 9bfc86c3..c22f2b03 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@architect/arc.codes",
    -  "version": "3.6.31",
    +  "version": "3.6.32",
       "repository": {
         "type": "git",
         "url": "https://github.com/architect/arc.codes"
    
    From 37d8077597d3dec967a421ce09bdb8ddacf2bf72 Mon Sep 17 00:00:00 2001
    From: Taylor Beseda 
    Date: Thu, 27 Jan 2022 14:19:15 -0700
    Subject: [PATCH 325/680] update and link to CLI > hydrate / package (#489)
    
    * update and link to CLI > hydrate
    
    * minor updates to other docs and fix style issue for narrow documents
    
    * remove CLI > package doc
    ---
     .gitignore                                    |  5 +-
     package-lock.json                             | 40 +++++------
     .../guides/extend/eject-to-cloudformation.md  |  2 +-
     src/views/docs/en/reference/cli/env.md        |  2 +
     src/views/docs/en/reference/cli/hydrate.md    | 71 +++++--------------
     src/views/docs/en/reference/cli/package.md    | 13 ----
     src/views/docs/en/reference/cli/sandbox.md    |  2 +-
     src/views/docs/table-of-contents.js           |  1 +
     src/views/modules/document/html.js            |  1 +
     src/views/package.json                        |  5 --
     10 files changed, 41 insertions(+), 101 deletions(-)
     delete mode 100644 src/views/docs/en/reference/cli/package.md
     delete mode 100644 src/views/package.json
    
    diff --git a/.gitignore b/.gitignore
    index f8b9cec2..e7f417f3 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -1,8 +1,7 @@
    -.arc-env
     .DS_Store
    -**/static.json
     node_modules
    +scratch
     sam.json
     sam.yaml
    -scratch
    +**/static.json
     src/http/get-docs-000lang-catchall/highlight/
    diff --git a/package-lock.json b/package-lock.json
    index d81f7b19..3d6bb132 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -1980,9 +1980,9 @@
           "dev": true
         },
         "fast-glob": {
    -      "version": "3.2.9",
    -      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz",
    -      "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==",
    +      "version": "3.2.11",
    +      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
    +      "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
           "dev": true,
           "requires": {
             "@nodelib/fs.stat": "^2.0.2",
    @@ -2287,25 +2287,17 @@
           }
         },
         "globby": {
    -      "version": "11.0.4",
    -      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
    -      "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
    +      "version": "11.1.0",
    +      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
    +      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
           "dev": true,
           "requires": {
             "array-union": "^2.1.0",
             "dir-glob": "^3.0.1",
    -        "fast-glob": "^3.1.1",
    -        "ignore": "^5.1.4",
    -        "merge2": "^1.3.0",
    +        "fast-glob": "^3.2.9",
    +        "ignore": "^5.2.0",
    +        "merge2": "^1.4.1",
             "slash": "^3.0.0"
    -      },
    -      "dependencies": {
    -        "ignore": {
    -          "version": "5.2.0",
    -          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
    -          "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
    -          "dev": true
    -        }
           }
         },
         "got": {
    @@ -3687,9 +3679,9 @@
           "optional": true
         },
         "node-watch": {
    -      "version": "0.7.2",
    -      "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.2.tgz",
    -      "integrity": "sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw==",
    +      "version": "0.7.3",
    +      "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz",
    +      "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==",
           "dev": true
         },
         "node-webtokens": {
    @@ -4337,12 +4329,12 @@
           "dev": true
         },
         "resolve": {
    -      "version": "1.21.0",
    -      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
    -      "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
    +      "version": "1.22.0",
    +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
    +      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
           "dev": true,
           "requires": {
    -        "is-core-module": "^2.8.0",
    +        "is-core-module": "^2.8.1",
             "path-parse": "^1.0.7",
             "supports-preserve-symlinks-flag": "^1.0.0"
           }
    diff --git a/src/views/docs/en/guides/extend/eject-to-cloudformation.md b/src/views/docs/en/guides/extend/eject-to-cloudformation.md
    index 9e9dbbd4..60b8ae41 100644
    --- a/src/views/docs/en/guides/extend/eject-to-cloudformation.md
    +++ b/src/views/docs/en/guides/extend/eject-to-cloudformation.md
    @@ -11,6 +11,6 @@ sections:
     
     Need to install @architect/architect
     
    -And then in the project directory run arc package
    +And then in the project directory run `arc deploy --dry-run`
     
     That will generate sam.json (which is CloudFormation) and print out AWS CLI instructions for deploying
    diff --git a/src/views/docs/en/reference/cli/env.md b/src/views/docs/en/reference/cli/env.md
    index 02936ad4..f775109c 100644
    --- a/src/views/docs/en/reference/cli/env.md
    +++ b/src/views/docs/en/reference/cli/env.md
    @@ -6,6 +6,8 @@ description: Read and write environment variables for Lambda functions.
     
     Read and write environment variables. This allows apps to centrally store sensitive configuration data, such as API keys, outside of the codebase in revision control.
     
    +> `arc env` will **not** upload variables from a project's local [`preferences.arc`](../configuration/local-preferences#%40env); however, it will download variables from AWS and overwrite local preferences.
    +
     ## Usage
     
     ```bash
    diff --git a/src/views/docs/en/reference/cli/hydrate.md b/src/views/docs/en/reference/cli/hydrate.md
    index ba6dc670..9bf20449 100644
    --- a/src/views/docs/en/reference/cli/hydrate.md
    +++ b/src/views/docs/en/reference/cli/hydrate.md
    @@ -1,77 +1,40 @@
     ---
     title: hydrate
     category: CLI
    -description: Quickly install and update dependencies for all functions in the src directory.
    +description: Install and update dependencies for all functions in a project.
     ---
     
    -## Overview
    +Ensure that all functions managed by Architect have their dependencies installed. Functions containing all its required dependencies are considered to be "hydrated" - thus the name!
     
    -[`@architect/hydrate`](Architect env) ensures that all functions managed by architect have their dependencies installed. Functions containing all its required dependencies are considered to be 'hydrated' - thus the name!
    +Importantly, `arc hydrate` will also copy shared code from `src/shared` into all functions and `src/views` into `@http` GET functions.
     
    +When developing locally with Sandbox, it is not necessary to manually run `hydrate` since Sandbox handles this automatically. However, it can be helpful to ensure hydration happens prior to a process like `npm test`.
     
     ## Usage
     
    -> Note: the process running `hydrate` must be the same as the root of the project it's hydrating. So if the project you're trying to `hydrate` is located locally at `/projects/myapp` and you're running `hydrate` from `/scripts/hydrate`, you'll need to ensure you `process.chdir('/projects/myapp')` prior to execution
    -
    -
    -### `hydrate(options)`
    -
    -`options` object can include the following properties:
    -
    -- `basepath`: What path hydrate should consider as the root for searching for functions to hydrate. Useful if you want to hydrate a subset of functions. Defaults to `src` in the current working directory.
    -- `install`: If truthy, will invoke [`hydrate.install()`][install].
    -- `update`: If truthy, will invoke [`hydrate.update()`][update].
    -
    -By default, invokes [`hydrate.shared()`][shared].
    +```bash
    +arc hydrate [install|--s|--shared|-u|--update|-v|--verbose]
    +```
     
    +## Flags
     
    -### `hydrate.install(options, callback)`
    +- `install` - Optional. default command
    +- `-s`, `--shared`, `shared` - Hydrates and copies shared files only
    +- `-u`, `--update`, `update` - Updates each function's dependencies
    +- `-v`, `--verbose`, `verbose` - Prints additional output to the console
     
    -Installs dependencies for all Functions found in the specified `basepath`. Invokes [`hydrate.shared()`][shared].
    +## Notes
     
    -Note that for the default value of `basepath='src'`, this means `install` will also hydrate shared folders like `src/shared` and `src/views`.
    +> ⚠️  This operation can take time to complete depending on how many Lambdas you have and how many modules they require.
     
    -To ensure local development behavior is as close to `staging` and `production` as possible, `hydrate.install()` (and other hydrate functions) uses:
    +Hydrate uses the following commands under the hood, depending on project's or function's runtime:
     
    -- **node.js**: `npm ci` if `package-lock.json` is present and `npm i` if not
    +- **node.js**: `npm ci`
     - **python**: `pip3 install`
     - **ruby**: `bundle install`
     
    -
    -### `hydrate.update(options, callback)`
    -
    -Updates dependencies in all Functions found in the specified `basepath`. Invokes [`hydrate.shared()`][shared]. Note that this will only functionally differ from [`hydrate.install()`][install] if you use a lock-file like `package-lock.json` or `Gemfile.lock`.
    -
    -Note that for the default value of `basepath='src'`, this means `update` will also update dependencies in shared folders like `src/shared` and `src/views`.
    -
    -`update` is functionally almost identical to [`install`][install], except it will update dependencies to newer versions _if they exist_. This is done via:
    +`arc hydrate --update` is almost functionally identical to `arc hydrate`, except it will update dependencies to newer versions _if they exist_. This is done via:
     
     - **node.js**: `npm update`
     - **python**: `pip3 install -U --upgrade-strategy eager`
     - **ruby**: `bundle update`
    -
    -
    -### `hydrate.shared(options, callback)`
    -
    -Copies shared code (from `src/shared` and `src/views`) into all Functions.
    -
    -
    -[shared]: #hydratesharedoptions-callback
    -[install]: #hydrateinstalloptions-callback
    -[update]: #hydrateupdateoptions-callback
    -[npm]: https://www.npmjs.com/package/@architect/hydrate
    -
    -### `arc hydrate`
    -
    -- `arc hydrate` runs `npm i`
    -- `arc hydrate update` runs `npm update`
    -
    -> ⚠️  Note: this operation can take time to complete depending on how many Lambdas you have and how many modules they require.
    -
    -## Flags
    -
    -`[-s, --shared, shared]` - hydrates and copies shared files only
    -`[-u, --update, update]` - updates each function's dependencies
    -`[-v, --verbose, verbose]` - prints additional output to the console
    -
    -
    diff --git a/src/views/docs/en/reference/cli/package.md b/src/views/docs/en/reference/cli/package.md
    deleted file mode 100644
    index 7b347b13..00000000
    --- a/src/views/docs/en/reference/cli/package.md
    +++ /dev/null
    @@ -1,13 +0,0 @@
    ----
    -title: arc package
    -category: CLI
    -description: Generate AWS SAM template based on the current app.arc
    ----
    -
    -Transform `app.arc` into `sam.json`. [AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) can be deployed with the AWS CLI.
    -
    -## Usage
    -
    -```bash
    -arc package
    -```
    diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md
    index 40a32683..0cada1d0 100644
    --- a/src/views/docs/en/reference/cli/sandbox.md
    +++ b/src/views/docs/en/reference/cli/sandbox.md
    @@ -45,7 +45,7 @@ The default port may change in Architect 10.
     - `ARC_TABLES_PORT`- Manually specify local DynamoDB port
       - Defaults to `5000`
     - `ARC_LOCAL`- If present and used in conjunction with `NODE_ENV=staging|production`, emulates live `staging` or `production` environment
    -  - Uses your local `.arc-env` file's `@staging` or `@production` environment variables
    +  - Uses your local `preferences.arc` file's `@staging` or `@production` environment variables
       - Connects Sandbox to live AWS events and DynamoDB infra
       - Requires valid AWS credentials with the same profile name as defined in your project manifest
     
    diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js
    index 49b35bc4..f7bb3a44 100644
    --- a/src/views/docs/table-of-contents.js
    +++ b/src/views/docs/table-of-contents.js
    @@ -68,6 +68,7 @@ let Reference = [ {
         'deploy',
         'destroy',
         'env',
    +    'hydrate',
         'init',
         'logs',
         'sandbox',
    diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js
    index dfd6dddc..c6563405 100644
    --- a/src/views/modules/document/html.js
    +++ b/src/views/modules/document/html.js
    @@ -59,6 +59,7 @@ ${Symbols}
         >
           
    Date: Wed, 26 Jan 2022 18:00:51 -0700 Subject: [PATCH 326/680] remove TOML references and .ini highlighting --- scripts/dist.sh | 2 +- scripts/highlight/index.js | 1 - src/views/docs/en/about/contribute.md | 2 +- .../docs/en/get-started/project-manifest.md | 46 ------------------- .../docs/en/get-started/why-architect.md | 2 +- .../custom-source-paths.md | 42 ----------------- src/views/docs/en/introduction.md | 2 +- .../docs/en/reference/project-manifest/app.md | 10 ---- .../docs/en/reference/project-manifest/aws.md | 14 ------ .../en/reference/project-manifest/events.md | 21 --------- .../en/reference/project-manifest/http.md | 25 ---------- .../en/reference/project-manifest/macros.md | 15 ------ .../en/reference/project-manifest/proxy.md | 20 -------- .../en/reference/project-manifest/queues.md | 15 ------ .../reference/project-manifest/scheduled.md | 22 --------- .../en/reference/project-manifest/shared.md | 13 ------ .../en/reference/project-manifest/static.md | 19 -------- .../project-manifest/tables-indexes.md | 19 -------- .../project-manifest/tables-streams.md | 24 ---------- .../en/reference/project-manifest/tables.md | 25 ---------- .../en/reference/project-manifest/views.md | 23 ---------- .../docs/en/reference/project-manifest/ws.md | 13 ------ 22 files changed, 4 insertions(+), 371 deletions(-) diff --git a/scripts/dist.sh b/scripts/dist.sh index 7014baf6..9d16082a 100755 --- a/scripts/dist.sh +++ b/scripts/dist.sh @@ -2,7 +2,7 @@ echo "Copying Architect Highlight.js files & grammars from node_modules to get-docs-000lang-catchall/highlight/..." mkdir src/http/get-docs-000lang-catchall/highlight &> /dev/null mkdir src/http/get-docs-000lang-catchall/highlight/languages &> /dev/null -for lang in bash javascript json powershell python ruby yaml ini +for lang in bash javascript json powershell python ruby yaml do cp node_modules/highlight.js/lib/languages/$lang.js src/http/get-docs-000lang-catchall/highlight/languages/ done diff --git a/scripts/highlight/index.js b/scripts/highlight/index.js index b3be1607..2f5ca70f 100644 --- a/scripts/highlight/index.js +++ b/scripts/highlight/index.js @@ -13,7 +13,6 @@ hljs.registerLanguage('python', require('./languages/python')) hljs.registerLanguage('arc', require('./languages/arc')) hljs.registerLanguage('json', require('./languages/json')) hljs.registerLanguage('yaml', require('./languages/yaml')) -hljs.registerLanguage('toml', require('./languages/ini')) hljs.HighlightJS = hljs hljs.default = hljs diff --git a/src/views/docs/en/about/contribute.md b/src/views/docs/en/about/contribute.md index db8d9788..5c332a62 100644 --- a/src/views/docs/en/about/contribute.md +++ b/src/views/docs/en/about/contribute.md @@ -18,7 +18,7 @@ The Architect project distribution code is bundled in [`architect/architect`](ht The Architect project is composed of multiple core code repositories on GitHub: -- [`architect/parser`](https://github.com/architect/parser) - parser/lexer for arcfile formats (`.arc`, `app.arc`, `arc.json`, `arc.yaml`, `arc.yml` and `arc.toml`) +- [`architect/parser`](https://github.com/architect/parser) - parser/lexer for arcfile formats (`.arc`, `app.arc`, `arc.json`, `arc.yaml`, and `arc.yml`) - [`architect/package`](https://github.com/architect/package) - a pure function that consumes `architect/parser` output and returns a CloudFormation document - [`architect/deploy`](https://github.com/architect/deploy) - a wrapper for the AWS CLI `package` and `deploy` commands - [`architect/sandbox`](https://github.com/architect/sandbox) - the local sandbox (mocks API Gateway, SNS, SQS, DynamoDB, and Lambda) diff --git a/src/views/docs/en/get-started/project-manifest.md b/src/views/docs/en/get-started/project-manifest.md index b1b26e36..80c44a84 100644 --- a/src/views/docs/en/get-started/project-manifest.md +++ b/src/views/docs/en/get-started/project-manifest.md @@ -38,9 +38,6 @@ Architect supports the following manifest files: - `arc.yml` - `package.json` - `arc.json` -- `arc.toml` - -> The maintainers are considering `arc.xml`; if this is something you want let us know! ## More on `app.arc` @@ -207,49 +204,6 @@ tables-indexes:
    - -
    toml
    -
    - -```toml -app="hello" - -[static] -fingerprint=true - -ws=[ - "action", - "connect", - "default", - "disconnect" -] - -http=[ - ["get", "/"], - ["get", "/likes"], - ["post", "/likes"], -] - -events=["hit-counter"] - -[scheduled] -daily-affirmation=["rate(1 day)"] - -[[tables]] - -[tables.likes] -likeiD="*String" - -tables-streams=["likes"] - -[["tables-indexes"]] -["tables-indexes".likes] -date="*String" -``` - -
    -
    - diff --git a/src/views/docs/en/get-started/why-architect.md b/src/views/docs/en/get-started/why-architect.md index 428699c9..52a98923 100644 --- a/src/views/docs/en/get-started/why-architect.md +++ b/src/views/docs/en/get-started/why-architect.md @@ -16,7 +16,7 @@ Developers need to work locally, to debug, test, and preview code before deployi ### Infrastructure as Code -At its heart Architect is an [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code) (IaC) framework. Architect defines a high level manifest file, in multiple open text formats, and turns formerly complex cloud infrastructure provisioning into a build artifact. You define the cloud infrastructure your application code requires and check that manifest into version control so infra and code are always aligned and deterministic. Architect compiles manifest code into AWS CloudFormation and deploys it. Architect supports a native text file format `app.arc` in addition to popular formats: `package.json`, `arc.json`, `arc.yaml` and `arc.toml`. Teams can choose the dialect that works best for them. +At its heart Architect is an [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code) (IaC) framework. Architect defines a high level manifest file, in multiple open text formats, and turns formerly complex cloud infrastructure provisioning into a build artifact. You define the cloud infrastructure your application code requires and check that manifest into version control so infra and code are always aligned and deterministic. Architect compiles manifest code into AWS CloudFormation and deploys it. Architect supports a native text file format `app.arc` in addition to popular formats: `package.json`, `arc.json`, and `arc.yaml`. Teams can choose the dialect that works best for them. ### Secured to least privilege by default diff --git a/src/views/docs/en/guides/developer-experience/custom-source-paths.md b/src/views/docs/en/guides/developer-experience/custom-source-paths.md index 37a58897..5319e8db 100644 --- a/src/views/docs/en/guides/developer-experience/custom-source-paths.md +++ b/src/views/docs/en/guides/developer-experience/custom-source-paths.md @@ -130,47 +130,5 @@ scheduled: - -
    toml
    -
    - -```toml -app = "my-arc-app" - -# TOML doesn't allow mixed types in an array -# "simple" entries are expanded - -# simple -[[http]] -[http."/foo"] -method = "get" -# verbose -[[http]] -[http."/bar"] -method = "get" -src = "whatever/http/dir/you/want" - -# simple -[[events]] -[events."an-event"] -# verbose -[[events]] -[events."another-event"] -src = "whatever/events/dir/you/want" - -# simple -[[scheduled]] -[scheduled."a-schedule"] -rate = ["1", "day"] -[[scheduled]] -# verbose -[scheduled."another-schedule"] -rate = ["1", "day"] -src = "whatever/scheduled/dir/you/want" - -``` -
    -
    - diff --git a/src/views/docs/en/introduction.md b/src/views/docs/en/introduction.md index 1f8e2816..5b07672b 100644 --- a/src/views/docs/en/introduction.md +++ b/src/views/docs/en/introduction.md @@ -19,7 +19,7 @@ Developers need to work locally, to debug, test, and preview code before deployi ### Infrastructure as Code -At its heart Architect is an [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code) (IaC) framework. Architect defines a high level manifest file, in multiple open text formats, and turns formerly complex cloud infrastructure provisioning into a build artifact. You define the cloud infrastructure your application code requires and check that manifest into version control so infra and code are always aligned and deterministic. Architect compiles manifest code into AWS CloudFormation and deploys it. Architect supports a native text file format `app.arc` in addition to popular formats: `package.json`, `arc.json`, `arc.yaml` and `arc.toml`. Teams can choose the dialect that works best for them. +At its heart Architect is an [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code) (IaC) framework. Architect defines a high level manifest file, in multiple open text formats, and turns formerly complex cloud infrastructure provisioning into a build artifact. You define the cloud infrastructure your application code requires and check that manifest into version control so infra and code are always aligned and deterministic. Architect compiles manifest code into AWS CloudFormation and deploys it. Architect supports a native text file format `app.arc` in addition to popular formats: `package.json`, `arc.json`, and `arc.yaml`. Teams can choose the dialect that works best for them. ### Secured to least privilege by default diff --git a/src/views/docs/en/reference/project-manifest/app.md b/src/views/docs/en/reference/project-manifest/app.md index d6f9b41d..dda26b53 100644 --- a/src/views/docs/en/reference/project-manifest/app.md +++ b/src/views/docs/en/reference/project-manifest/app.md @@ -42,16 +42,6 @@ foobaz - -
    toml
    -
    - -```toml -app="foobaz" -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/aws.md b/src/views/docs/en/reference/project-manifest/aws.md index 57a7cc3b..d1ee6cff 100644 --- a/src/views/docs/en/reference/project-manifest/aws.md +++ b/src/views/docs/en/reference/project-manifest/aws.md @@ -116,20 +116,6 @@ policies
    - -
    toml
    -
    - -```toml -[aws] -runtime="ruby" -region="us-west-1" -profile="work" -``` - -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/events.md b/src/views/docs/en/reference/project-manifest/events.md index 1a63b635..1128cbf1 100644 --- a/src/views/docs/en/reference/project-manifest/events.md +++ b/src/views/docs/en/reference/project-manifest/events.md @@ -79,27 +79,6 @@ events:
    - -
    toml
    -
    - -```toml -app="myapp" -events=[ - "hit-counter", - "likes" -] - -# TOML doesn't allow mixed types in an array. -# Theoretically a "table" entry with a custom source would look like: - -[[events]] -[events."custom-webhook"] -src = "custom/source" -``` -
    -
    - diff --git a/src/views/docs/en/reference/project-manifest/http.md b/src/views/docs/en/reference/project-manifest/http.md index ad84298c..35c69428 100644 --- a/src/views/docs/en/reference/project-manifest/http.md +++ b/src/views/docs/en/reference/project-manifest/http.md @@ -112,31 +112,6 @@ http: - -
    toml
    -
    - -```toml -app="myapp" -http=[ - ["get", "/"], - ["get", "/pages"], - ["get", "/pages/:dateID"], - ["get", "/contact"], - ["post", "/contact"] - ["get", "/widgets/*"], -] - -# TOML doesn't allow mixed types in an array. -# Theoretically a "table" entry with a custom source would look like: -[[http]] -[http."/weather"] -method = "get" -src = "custom/source" -``` -
    -
    - diff --git a/src/views/docs/en/reference/project-manifest/macros.md b/src/views/docs/en/reference/project-manifest/macros.md index 55fc9f22..3d9f43d7 100644 --- a/src/views/docs/en/reference/project-manifest/macros.md +++ b/src/views/docs/en/reference/project-manifest/macros.md @@ -42,21 +42,6 @@ my-custom-macro - -
    toml
    -
    - -```toml -app="testapp" - -macros=[ - "my-custom-macro" -] - -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/proxy.md b/src/views/docs/en/reference/project-manifest/proxy.md index 2e540034..9644f5ef 100644 --- a/src/views/docs/en/reference/project-manifest/proxy.md +++ b/src/views/docs/en/reference/project-manifest/proxy.md @@ -59,26 +59,6 @@ production https://example.biz
    - -
    toml
    -
    - -```toml -app="myapp" - -http=[ - ["get", "/v2/*"], - ["post", "/v2/*"] -] - -[proxy] -testing="http://localhost:4000" -staging="https://qa.example.biz" -production="https://example.biz" -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/queues.md b/src/views/docs/en/reference/project-manifest/queues.md index 97a35b39..2d674961 100644 --- a/src/views/docs/en/reference/project-manifest/queues.md +++ b/src/views/docs/en/reference/project-manifest/queues.md @@ -51,21 +51,6 @@ publish-log
    - -
    toml
    -
    - -```toml -app="myapp" - -queues=[ - "convert-image" - "publish-log" -] -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/scheduled.md b/src/views/docs/en/reference/project-manifest/scheduled.md index 46b02d53..96a33624 100644 --- a/src/views/docs/en/reference/project-manifest/scheduled.md +++ b/src/views/docs/en/reference/project-manifest/scheduled.md @@ -87,28 +87,6 @@ scheduled:
    - -
    toml
    -
    - -```toml -app="myapp" - -[scheduled] -daily-update-buddy="rate(1 day)" -friyay-only="cron(0 15 ? * FRI *)" - -# TOML doesn't allow mixed types in an array. -# Theoretically a "table" entry with a custom source would look like: - -[scheduled."annual-review"] -rate = ["1", "year"] -src = "custom/source" -``` - -
    -
    - diff --git a/src/views/docs/en/reference/project-manifest/shared.md b/src/views/docs/en/reference/project-manifest/shared.md index 1764c452..8123a631 100644 --- a/src/views/docs/en/reference/project-manifest/shared.md +++ b/src/views/docs/en/reference/project-manifest/shared.md @@ -49,19 +49,6 @@ src path/to/code - -
    toml
    -
    - -```toml -app="myapp" - -[shared] -src="path/to/code" -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/static.md b/src/views/docs/en/reference/project-manifest/static.md index 61e908e1..c7c9b25d 100644 --- a/src/views/docs/en/reference/project-manifest/static.md +++ b/src/views/docs/en/reference/project-manifest/static.md @@ -58,25 +58,6 @@ ignore
    - -
    toml
    -
    - -```toml -app="testapp" - -[static] -fingerprint=true -ignore=[ - ".tar.gz", - "tmp", - "user" -] - -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/tables-indexes.md b/src/views/docs/en/reference/project-manifest/tables-indexes.md index 6a3d4217..ba287db7 100644 --- a/src/views/docs/en/reference/project-manifest/tables-indexes.md +++ b/src/views/docs/en/reference/project-manifest/tables-indexes.md @@ -74,25 +74,6 @@ accounts
    - -
    toml
    -
    - -```toml -app="testapp" - -[[tables]] -[tables.accounts] -accountID="*String" - -tables-indexes = [ -{ "accounts" = { "email" = "*String", "name" = "byEmail" } }, -{ "accounts" = { "created" = "*String", "name" = "byDate" } } -] -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/tables-streams.md b/src/views/docs/en/reference/project-manifest/tables-streams.md index 7630f8cd..8ec20db7 100644 --- a/src/views/docs/en/reference/project-manifest/tables-streams.md +++ b/src/views/docs/en/reference/project-manifest/tables-streams.md @@ -101,30 +101,6 @@ tables-streams:
    - -
    toml
    -
    - -```toml -app="testapp" - -[[tables]] -[tables.people] -pplID="*String" - -tables-streams=["people"] - -# TOML doesn't allow mixed types in an array. -# Theoretically a "table" entry with a custom source would look like: - -[["tables-streams"]] -["tables-streams"."a-named-table-stream"] -name = "people" -src = "custom/source" -``` -
    -
    - diff --git a/src/views/docs/en/reference/project-manifest/tables.md b/src/views/docs/en/reference/project-manifest/tables.md index 3c82b9ca..56e004f0 100644 --- a/src/views/docs/en/reference/project-manifest/tables.md +++ b/src/views/docs/en/reference/project-manifest/tables.md @@ -122,31 +122,6 @@ fleeting-thoughts - -
    toml
    -
    - -```toml -app="testapp" - -[[tables]] - -[tables.people] -pplID="*String" - -[tables.cats] -pplID="*String" -catID="**String" -encrypt=true -PointInTimeRecovery=true - -[tables.fleeting-thoughts] -pplID="*String" -expires="TTL" -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/views.md b/src/views/docs/en/reference/project-manifest/views.md index 367c628d..d99f254b 100644 --- a/src/views/docs/en/reference/project-manifest/views.md +++ b/src/views/docs/en/reference/project-manifest/views.md @@ -63,29 +63,6 @@ get /raccoons
    - -
    toml
    -
    - -```toml -app="myapp" - -http=[ - [ "get", "/" ], - [ "get", "/kittens" ], - [ "get", "/dogs" ], - [ "get", "/raccoons" ] -] - -views=[ - [ "get", "/kittens" ], - [ "get", "/raccoons" ] -] - -``` -
    -
    -
    yaml
    diff --git a/src/views/docs/en/reference/project-manifest/ws.md b/src/views/docs/en/reference/project-manifest/ws.md index 2737e170..a2321737 100644 --- a/src/views/docs/en/reference/project-manifest/ws.md +++ b/src/views/docs/en/reference/project-manifest/ws.md @@ -47,19 +47,6 @@ myapp
    - -
    toml
    -
    - -```toml -app="testapp" - -"ws" -``` - -
    -
    -
    yaml
    From 33bb570ab8d7931047ae9600a9744bd4f762c6de Mon Sep 17 00:00:00 2001 From: macdonst Date: Thu, 27 Jan 2022 16:28:00 -0500 Subject: [PATCH 327/680] 3.6.33 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d6bb132..bd7e059f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.32", + "version": "3.6.33", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c22f2b03..9c81de3d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.32", + "version": "3.6.33", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 43ac4d5f026f62ee39f100ad735f7b510c0452f8 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Thu, 27 Jan 2022 14:35:01 -0800 Subject: [PATCH 328/680] First cut of the Arc 10 upgrade guide --- package-lock.json | 2 +- src/views/docs/en/about/upgrade-guide.md | 98 +++++++++++++++++++++--- 2 files changed, 88 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd7e059f..715efbce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -220,7 +220,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "github:architect/spellcheck-dictionary#2ef31b2b23fec8674789df057180310138d07c90", + "version": "github:architect/spellcheck-dictionary#f7e5a6fee8aceb6ab68b1bcdc79e852c01ed93fd", "from": "github:architect/spellcheck-dictionary", "dev": true }, diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index c811c3b3..f2601bb8 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -4,6 +4,7 @@ category: About description: This document covers upgrading from previous versions of Architect sections: - Overview of Architect versions + - Architect 9 → 10 - Architect 8 → 9 - Architect 7 → 8 - Architect 6 → 7 @@ -18,9 +19,14 @@ This document covers upgrading from previous versions of Architect. As a general philosophy, Architect's core maintainers endeavor to minimize the frequency and impact of breaking changes wherever possible; in many cases, major releases may have no impact on existing applications. +### Architect 10 (name TBA) + +Architect 10 (name TBA) is a major feature release, introducing the Architect plugins API, and cleaning up internal legacy code, module APIs, and other bits from earlier on in Architect's history. While few of these changes should impact existing projects, users should still [see below for potential impacts to upgrading](#architect-9-→-10). + + ### Architect 9 (La Chupacabra) -Architect 9 (La Chupacabra) is primarily a maintenance release, dropping support for Node.js 10.x (now end-of-life) and Node.js 12.x, and removing support for Architect 5 (and lower). +Architect 9 (La Chupacabra) is primarily a maintenance release, dropping support for Node.js 10.x (now end-of-life) and Node.js 12.x, and removing support for Architect 5 (and lower). [See below for potential impacts to upgrading](#architect-8-→-9). @@ -63,6 +69,7 @@ Architect 4 (Yeti) introduced generic, dependency-free HTTP functions, enhanced ### Topics +- [Architect 9 → 10](#architect-9-→-10) - [Architect 8 → 9](#architect-8-→-9) - [Architect 7 → 8](#architect-7-→-8) - [Architect 6 → 7](#architect-6-→-7) @@ -73,6 +80,75 @@ Architect 4 (Yeti) introduced generic, dependency-free HTTP functions, enhanced --- +## Architect 9 → 10 + +Architect 10 (name TBA) is a major feature release, introducing the Architect plugins API, and cleaning up internal legacy code, module APIs, and other bits from earlier on in Architect's history. + +Most of Architect 10's breaking changes were internal; most users should not encounter breaking changes when upgrading Architect to v10 and Functions to v5. + + +## Removed + +- Removed the `package` command, which was no longer able to represent the final state of Architect projects. Its (improved) replacement is now: `deploy --eject` +- [Removed `toml` support](https://github.com/architect/architect/discussions/1294) (e.g. `arc.toml`) +- Removed support for legacy `.arc-env` env files (initially deprecated in late 2020) + - Remedy: if you are still using a `.arc-env` file, please move your [local env vars to `prefs.arc`](https://arc.codes/docs/en/reference/configuration/local-preferences#%40env) or [`.env`](https://arc.codes/docs/en/reference/configuration/local-preferences#.env-file-support) + + +## Breaking changes + +- The beta plugins API has been largely refactored; wherever possible, hooks from the beta API have been ported to the final shipping plugin API. However, many things changed, so if you authored plugins against the beta API, please refer to the [new plugin documentation](https://arc.codes/docs/en/reference/plugins/api) to ensure compatibility +- Due to ongoing issues with unpredictable behavior with certain external libraries, Architect no longer makes use of or deploys apps with `NODE_ENV` environment variable. + - Remedy: if your code relies on Architect automatically populating `NODE_ENV`, you should add it to your userland environment variables, like so: `npx arc env --add --env testing NODE_ENV testing` (and again for `staging` + `production`) +- All support for bare CLI flags has been removed from Architect commands + - All functionality has been retained, but now proper flags must be used + - Example: `npx arc deploy production` should now be `npx arc deploy --production` +- Sandbox's new automatic port selection should frequently actually improve and un-break common uses of Sandbox in testing. However, if your tests or tools rely on Sandbox's default ports (e.g. `3334` for `@events`), you will need to make some minor changes: + - Remedy: Lambda invocations in Sandbox are now passed an environment variable called `ARC_SANDBOX`, which contains a JSON serialized `ports` property; use this property to obtain the currently configured port for a given service + - Should you need to have consistent, non-automatically-selecting ports for Sandbox's internal services, use Sandbox's standard means for explicitly defining port configuration; **do not merely rely on Sandbox's default ports**, as they should be expected to change at any time +- Breaking change: legacy `@tables` / `@tables-streams` folders (`src/tables/...` and `src/streams/...`) are now deprecated in favor of `src/tables-streams/...` + - Remedy: existing stream functions can be simply have their folders renamed to `src/tables-streams/{name}` (or use a custom `src` property on them if you'd prefer to keep your existing folder structure) +- Breaking change: `@indexes` is now fully deprecated + - Remedy: simply change the `@indexes` pragma name to `@tables-indexes`; no other changes are required + + +## Internal breaking changes + +The following internal changes should not have any impact on Architect users should Architect v10 be paired with Functions v5, but just in case anyone used these somewhat more obscure internal features, environment variables, etc., we'll enumerate the changes here: + +- All Architect modules' CLI APIs have been revamped, and now accept an object containing Inventory +- `@architect/env`'s module API has been significantly revamped; if you use `env` as a module, please refer to its documentation +- The following internal Architect environment variables are no longer used: `ARC_CLOUDFORMATION`, `ARC_HTTP`, `ARC_SANDBOX_PATH_TO_STATIC` +- Inventory structure changes: + - `inv._project.src` now represents the default source tree folder (e.g. `$cwd/src`), while `_project.cwd` (new) refers to the current working directory of the project + - `inv._project.env` is now an object populated by three properties: `local`, `plugins`, and `aws`, each reflecting the env vars found for each context's three environments (`testing`, `staging`, `production`) + - `lambda.handlerFunction` has been renamed to `lambda.handlerMethod` +- Architect now prioritizes the AWS region passed via Inventory params over the `AWS_REGION` env var; in practice this should have no practical effect for most users +- Per Deno's guidelines, Architect now prioritizes `mod.ts|js` handlers in Deno Lambdas over the other supported files; in practice this should have no practical effect unless your handler has both an `index.ts|js` file and a `mod.ts|js` file in its root +- Deprecated `ARC_SANDBOX_ENABLE_CORS` env var option from Sandbox + - Remedy: this option predates Architect's support of `options`, which landed in version 8; handling options requests with an `options` (or `any`) handler is the preferred approach to handling CORS +- Internal change: stopped optimistically populating default `arc-sessions` + `data` tables in Sandbox + - This was a very obscure and quirky holdover behavior from early Architect that differed Sandbox from live AWS behavior + - Remedy: realistically no one ever actually used this feature in production, because to do so would have necessitated defining an `arc-sessions` or `data` table in your project manifest; that said, if you experimented with these default DynamoDB tables and want to use them in production, simply add them to your `@tables` pragma + + +## Important non-breaking change + +In a future major release, Architect will deprecate all non-namespaced environment variables. For now, Architect prefers the namespaced versions of the same env var, but will support both; some examples: + +- `ARC_HTTP_PORT` is preferred to `PORT` in Sandbox +- `ARC_SESSION_TABLE_NAME` is preferred to `SESSION_TABLE_NAME` in Sandbox + +If you key on or use non-namespaced Architect env vars, we suggest changing them over to their namespaced equivalents as soon as is convenient. + + +### Compatibility with `@architect/functions` + +Due to internal breaking changes, `@architect/functions` v4 and below is incompatible with Architect 10. +- Remedy: upgrade `@architect/functions` to v5 or above; all existing functionality has been retained, [see more here](#architect-functions) + +--- + ## Architect 8 → 9 Architect 9 (La Chupacabra) is a maintenance release, primarily aimed at removing support for Node.js 10.x (now end-of-life) and Node.js 12.x. With this release, after two years since the release of Architect 6, Architect 5 is no longer supported. @@ -680,36 +756,36 @@ iam.attachRolePolicy({ ### Overview -`@architect/functions` runtime helper library will continue to be actively maintained, and is forwards compatible with Architect 6 → 7 upgrades, and most Architect 5 → 6 upgrades. +`@architect/functions` runtime helper library is actively maintained. Version 5 is required for Architect 10+. Users on Architect 6 - 9 should continue to use Functions v4 (which will work in perpetuity, but not be separately maintained). The Architect Functions module is now also available as a dependency for [Ruby](https://github.com/architect/arc-functions-ruby) and [Python](https://github.com/architect/arc-functions-python) functions. ### Changes +- `arc.http.express` was deprecated in February 2022, and is now the standalone `@architect/express` module +- `arc.http.proxy` (previously `arc.proxy`) was deprecated in July 2021, and is now the standalone `@architect/asap` module + - Its methods are functionally the same - `arc.http.middleware` was deprecated in August 2019, and is now `arc.http.async` - These methods are functionally the same - `arc.http.helpers.static` was deprecated in June 2019, and is now `arc.static` - These methods are functionally the same - Due to some under-the-hood changes, if you use `arc.http.helpers.static` or `arc.static`, you will need to upgrade to `@architect/functions` version `^3.3.4` (or greater) in Architect 6 -- `arc.proxy` was deprecated in May 2020, and is now `arc.http.proxy` - - These methods are functionally the same -In all three cases, these are functionally the same. The old aliases will remain for a while to come, but we suggest moving any deprecated calls over to their new equivalents by mid-2020. +### Does `@architect/functions` work in Architect 10+? -### Does `@architect/functions` work in Architect 7? +Yes! Version 5 is required to work correctly in Architect 10+. -Yes! It is supported by and forwards compatible in Architect 7, including use with HTTP API Lambda v2.0 payloads. +### Does `@architect/functions` work in Architect 6 - 9? -### Does `@architect/functions` work in Architect 6? +Absolutely, version 4.x is supported by Arc 6 - 9, including use with HTTP API Lambda v2.0 payloads (introduced in Arc 7). However, version 5+ is incompatible with Arc 6 - 9. -Yes! It is supported by and forwards compatible in Architect 6. Additionally, it has been expanded to include [`@tables` support for working with data](/docs/en/reference/project-manifest/tables). ### Will `@architect/functions` continue working in Architect 5? -Yes! `@architect/functions` is fully backward compatible with Architect 5. You can safely update this dependency, and expect related bugs to be patched. **However, it is worth noting that the new `tables()` method is an Architect 6-only feature.** +Version 4.x remains largely compatible with Architect 5; version 5+ is no longer backward compatible with Architect 5 (support for which officially ended in July of 2021). --- @@ -720,7 +796,7 @@ As of the release of Architect 6, the **Architect Data module (`@architect/data` ### Overview -`@architect/data` will no longer be maintained, and upgrading to Architect 6 will likely be a breaking change. +`@architect/data` will no longer be maintained, and upgrading to Architect 6 will likely be a breaking change for `@architect/data` usage. ### Does `@architect/data` work in Architect 6? From 760e34cda2ea723a8c2cf60b2faa9ee72d77f1ca Mon Sep 17 00:00:00 2001 From: macdonst Date: Fri, 28 Jan 2022 16:44:37 -0500 Subject: [PATCH 329/680] Minor a11y fix in upgrade guide Signed-off-by: macdonst --- src/views/docs/en/about/upgrade-guide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index f2601bb8..c16db048 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -19,6 +19,8 @@ This document covers upgrading from previous versions of Architect. As a general philosophy, Architect's core maintainers endeavor to minimize the frequency and impact of breaking changes wherever possible; in many cases, major releases may have no impact on existing applications. +## Releases + ### Architect 10 (name TBA) Architect 10 (name TBA) is a major feature release, introducing the Architect plugins API, and cleaning up internal legacy code, module APIs, and other bits from earlier on in Architect's history. While few of these changes should impact existing projects, users should still [see below for potential impacts to upgrading](#architect-9-→-10). From 8f2816cdd4567fa8386b46e4ace87fc3dfe5584b Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 9 Feb 2022 21:02:33 -0700 Subject: [PATCH 330/680] update CLI docs --- src/views/docs/en/reference/cli/deploy.md | 22 ++++++++-------- src/views/docs/en/reference/cli/destroy.md | 8 +++--- src/views/docs/en/reference/cli/env.md | 12 ++++++--- src/views/docs/en/reference/cli/hydrate.md | 9 +++---- src/views/docs/en/reference/cli/init.md | 8 +++--- src/views/docs/en/reference/cli/logs.md | 16 ++++++++---- src/views/docs/en/reference/cli/sandbox.md | 30 +++++----------------- 7 files changed, 50 insertions(+), 55 deletions(-) diff --git a/src/views/docs/en/reference/cli/deploy.md b/src/views/docs/en/reference/cli/deploy.md index 513e028a..b85646ec 100644 --- a/src/views/docs/en/reference/cli/deploy.md +++ b/src/views/docs/en/reference/cli/deploy.md @@ -13,20 +13,20 @@ Deploys code to AWS. ## Usage ```bash -arc deploy [production|static|direct] +arc deploy [--production|--static|--direct] ``` ## Flags +- `[--production, -p]` Deploys a CloudFormation stack to a production stack. +- `[--static, -s]` Deploys only the files in the static folder. +- `[--direct, -d path/to/function]` Overwrite staging Lambda with local source. A faster way to deploy and test small changes to individual functions without redeploying an entire stack. +- `[--name, -n]` Deploy a custom named staging stack. +- `[--tags, -t]` Adds resource tags to the CloudFormation stack. +- `[--prune]` Remove assets not present in the local static folder. - `[--no-hydrate]` Do not automatically run `npm`, `bundle` or `pip` -- `[dirty, --dirty, -d]` Overwrite staging Lambda with local source. A faster way to deploy and test small changes to individual functions without redeploying an entire stack. - `[--dry-run]` Creates a CloudFormation template but does not deploy it. A dry-run allows you to check the CloudFormation and SAM output before deploying the actual stack. -- `[production, --production, -p]` Deploys a CloudFormation stack to a production stack. -- `[prune, --prune]` Remove assets not present in the local static folder. -- `[static, --static, -s]` Deploys only the files in the static folder. -- `[verbose, --verbose, -v]` Displays the full deploy status messages. -- `[tags, --tags, -t]` Adds resource tags to the CloudFormation stack. -- `[name, --name, -n]` Deploy a custom named staging stack. +- `[--verbose, -v]` Displays the full deploy status messages. ## Examples @@ -41,19 +41,19 @@ arc deploy ### Deploy a production stack ```bash -arc deploy production +arc deploy --production ``` ### Deploy static assets to S3 ```bash -arc deploy static +arc deploy --static ``` ### Deploy code directly to the staging Lambda ```bash -arc deploy dirty src/http/get-index +arc deploy --direct src/http/get-index ``` ### Run deploy without deploying diff --git a/src/views/docs/en/reference/cli/destroy.md b/src/views/docs/en/reference/cli/destroy.md index 90dd327b..652c04f3 100644 --- a/src/views/docs/en/reference/cli/destroy.md +++ b/src/views/docs/en/reference/cli/destroy.md @@ -11,7 +11,7 @@ Large applications may take several minutes to delete and by default this comman ## Usage ```bash -arc destroy --app MyAppName [production] [--name NamedEnvironment] [--force] +arc destroy <--app MyAppName> [--production] [--name NamedEnvironment] [--force] ``` ## Flags @@ -19,7 +19,7 @@ arc destroy --app MyAppName [production] [--name NamedEnvironment] [--force] - `[--app MyAppName]` Required. Specify the app name, located under `@app` in your Architect manifest, to delete the app from AWS. - `[--name NamedEnvironment]` If you ran [`arc deploy`][deploy] with the `--name` flag to specify a custom named environment to deploy your application to, use this flag to destroy that same named application environment. - `[--production]` Destroy the production stack of your application. By default, without this flag, the staging stack is removed. -- `[--force|-f]` Force deletion of the application even if it contains DynamoDB tables ([`@tables`][tables]) or S3 bucket containing static assets ([`@static`][static]). +- `[--force, -f]` Force deletion of the application even if it contains DynamoDB tables ([`@tables`][tables]) or S3 bucket containing static assets ([`@static`][static]). - `[--no-timeout]` Do not exit the process until all application resources are deleted. ## Examples @@ -33,7 +33,7 @@ arc destroy --app my-app ### Destroy the production stack ```bash -arc destroy production --app my-app +arc destroy --app my-app --production ``` ### Destroy staging stack with S3 bucket and/or Dynamo tables @@ -45,7 +45,7 @@ arc destroy --app my-app --force ### Destroy custom named stack ```bash -arc destroy --app my-app --force --name Dev +arc destroy --app my-app --name Dev --force ``` [deploy]: deploy diff --git a/src/views/docs/en/reference/cli/env.md b/src/views/docs/en/reference/cli/env.md index f775109c..30386d45 100644 --- a/src/views/docs/en/reference/cli/env.md +++ b/src/views/docs/en/reference/cli/env.md @@ -11,9 +11,15 @@ Read and write environment variables. This allows apps to centrally store sensit ## Usage ```bash -arc env [testing|staging|production] {VARIABLE_NAME} {VARIABLE_VALUE} +arc env [-e environment] [--add|--remove] VARIABLE_NAME VARIABLE_VALUE ``` +## Flags + +- `[-e [testing|staging|production]]` Displays all environment variables for the specified environment +- `<--add, -a> -e NAME value` Assigns a value to the specified variable name in the specified environment +- `<--remove, -r> -e NAME` Removes the specified variable from the specified environment + ## Security It is imperative that the `ARC_APP_SECRET` environment variable be set to @@ -31,7 +37,7 @@ arc env ### Save an environment variable to the staging environment ```bash -arc env staging FOO myvalue +arc env -e staging --add FOO myvalue ``` > Protip: values that contain special characters like email addresses should be wrapped in double quotes @@ -39,7 +45,7 @@ arc env staging FOO myvalue ### Remove an environment variable ```bash -arc env remove staging FOO +arc env -e staging --remove FOO ``` ## Reserved names diff --git a/src/views/docs/en/reference/cli/hydrate.md b/src/views/docs/en/reference/cli/hydrate.md index 9bf20449..83823765 100644 --- a/src/views/docs/en/reference/cli/hydrate.md +++ b/src/views/docs/en/reference/cli/hydrate.md @@ -13,15 +13,14 @@ When developing locally with Sandbox, it is not necessary to manually run `hydra ## Usage ```bash -arc hydrate [install|--s|--shared|-u|--update|-v|--verbose] +arc hydrate [--shared|--update] ``` ## Flags -- `install` - Optional. default command -- `-s`, `--shared`, `shared` - Hydrates and copies shared files only -- `-u`, `--update`, `update` - Updates each function's dependencies -- `-v`, `--verbose`, `verbose` - Prints additional output to the console +- `[--shared, -s]` Hydrates and copies shared files only +- `[--update, -u]` Updates each function's dependencies +- `[--verbose, -v]` Prints additional output to the console ## Notes diff --git a/src/views/docs/en/reference/cli/init.md b/src/views/docs/en/reference/cli/init.md index 3161906e..195056ec 100644 --- a/src/views/docs/en/reference/cli/init.md +++ b/src/views/docs/en/reference/cli/init.md @@ -9,14 +9,14 @@ Bootstrap new Architect project code. Running `arc init` in an empty directory c ## Usage ```bash -arc init [-s|--static|static|-r|--runtime|runtime|-v|--verbose|verbose] +arc init [--static|--runtime] ``` ## Flags -- `[-s, --static, static]` create a new project with `@static` folder set to `public` -- `[-r, --runtime, runtime ]` create a new project with a specified runtime, options are node, deno, python, or ruby -- `[-v, --verbose, verbose]` even more output +- `[--static, -s]` Create a new project with `@static` folder set to `public` +- `[--runtime, -r]` Create a new project with a specified runtime, options are node, deno, python, or ruby +- `[--verbose, -v]` Even more output ## Examples diff --git a/src/views/docs/en/reference/cli/logs.md b/src/views/docs/en/reference/cli/logs.md index b0d03224..6d44cdb8 100644 --- a/src/views/docs/en/reference/cli/logs.md +++ b/src/views/docs/en/reference/cli/logs.md @@ -1,17 +1,23 @@ --- title: arc logs category: CLI -description: Read or clears Lambda function logs. +description: Read or destroy Lambda function logs. --- -Read or clear Lambda function logs. +Anytime your remotely-deployed functions log to stdout, those get stored in CloudWatch. Retrieve these logs with `arc logs` for debugging or monitoring. You must provide a path argument to one of your functions (i.e. `arc logs src/http/get-index`). Unless --production is specified, this command will retrieve logs from the staging Stack. ## Usage ```bash -arc logs [-n|--nuke|nuke] [production] path/to/code +arc logs [--destroy] [--production] path/to/code ``` +## Flags + +- `[--production, -p]` Specify the production environment +- `[--destroy, -d]` Delete logs for the specified functions +- `[--verbose, -v]` Even more output + ## Examples ### Read logs @@ -20,8 +26,8 @@ arc logs [-n|--nuke|nuke] [production] path/to/code arc logs src/http/get-index ``` -### Nuke logs +### Destroy logs ```bash -arc logs nuke src/http/get-index +arc logs --destroy src/http/get-index ``` diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index 0cada1d0..deb04fa9 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -4,7 +4,7 @@ category: CLI description: Local development sandbox. --- -Architect projects work locally and offline. It emulates most app resources defined in `app.arc`: +Architect projects work locally and offline. Sandbox emulates most app resources defined in `app.arc`: - `@http` - `@static` @@ -18,18 +18,15 @@ Architect projects work locally and offline. It emulates most app resources defi ## Usage ```bash -arc sandbox [--port|--verbose|--disable-symlinks|--no-hydrate] +arc sandbox [--port|--disable-symlinks|--no-hydrate|--verbose] ``` -> 🏗️ "macOS Monterey" [uses port 5000 for AirPlay features](https://developer.apple.com/forums/thread/682332). To avoid port collision, start sandbox with a custom tables port: `ARC_TABLES_PORT=5555 npx arc sandbox`. -The default port may change in Architect 10. - ### Flags -- `-p`, `--port`, `port` Manually specify HTTP port (default `3333`) -- `-v`, `--verbose`, `verbose` Enable verbose logging -- `--disable-symlinks` Disable symlinking `src/shared` and copy instead -- `--no-hydrate` Disables hydration +- `[--port, -p]` Manually specify HTTP port (default `3333`) +- `[--verbose, -v]` Enable verbose logging +- `[--disable-symlinks]` Disable symlinking `src/shared` and copy instead +- `[--no-hydrate]` Disables hydration ### Environment variables @@ -40,10 +37,6 @@ The default port may change in Architect 10. - `ARC_QUIET` - If present, disable (most) logging - `PORT` - Manually specify HTTP port - Defaults to `3333` -- `ARC_EVENTS_PORT`- Manually specify event bus port - - Defaults to `3334` -- `ARC_TABLES_PORT`- Manually specify local DynamoDB port - - Defaults to `5000` - `ARC_LOCAL`- If present and used in conjunction with `NODE_ENV=staging|production`, emulates live `staging` or `production` environment - Uses your local `preferences.arc` file's `@staging` or `@production` environment variables - Connects Sandbox to live AWS events and DynamoDB infra @@ -52,19 +45,10 @@ The default port may change in Architect 10. ### Local Database -Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@tables-indexes` found in the `app.arc` file. `@tables-streams` is not currently supported by dynalite. When Sandbox is terminated, any data written is cleared from memory. The default endpoint is `http://localhost:5000`. You can set a custom port by using an environment variable, `ARC_TABLES_PORT=5555` +Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@tables-indexes` found in the `app.arc` file. `@tables-streams` is not currently supported by dynalite. When Sandbox is terminated, any data written is cleared from memory. You can set a custom port by using an environment variable, `ARC_TABLES_PORT=5555` ### Connect sandbox to the staging database ```bash NODE_ENV=staging ARC_LOCAL=1 npx arc sandbox ``` - -### File watching - -The sandbox restarts when the following files or directories are modified: - -- `app.arc` -- `@views` source folder -- `@shared` source folder -- `@static` source folder if fingerprinting is enabled From d087dc3f3beaeffee470bb2bd785a53eba8c4fa7 Mon Sep 17 00:00:00 2001 From: macdonst Date: Thu, 10 Feb 2022 14:50:23 -0500 Subject: [PATCH 331/680] Community Call Signed-off-by: macdonst --- src/views/docs/en/about/community.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/views/docs/en/about/community.md b/src/views/docs/en/about/community.md index 968b4bc1..71fad68e 100644 --- a/src/views/docs/en/about/community.md +++ b/src/views/docs/en/about/community.md @@ -26,3 +26,6 @@ The `app.arc` manifest takes inspiration from UNIX 'run command' files (like `.v The code was developed building [Begin](https://begin.com) and granted to [JS Foundation](https://js.foundation/) in July of 2017 under the `Apache-2.0` license. +## Community Call + +Join us for our monthly community calls on [Discord](https://discord.gg/y5A2eTsCRX) held on the fourth Wednesday of each month at 10:15 am Pacific Time / 1:15 pm Eastern Time / 18:15 UTC. Meeting agendas will be posted in the announcements channel of the Architect Discord. We will use this time to demo upcoming new features and triage [outstanding issues](https://github.com/architect/architect/issues). Please join us and have your voice heard in the project's direction. From 98afea9437fb388eec015328eec19074e25a416d Mon Sep 17 00:00:00 2001 From: macdonst Date: Thu, 10 Feb 2022 15:08:13 -0500 Subject: [PATCH 332/680] 3.6.34 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd7e059f..efbaee03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.33", + "version": "3.6.34", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9c81de3d..b95d64a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.33", + "version": "3.6.34", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 396310a85f013f9be21c3e0db6740f5bf54bf6f9 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Thu, 10 Feb 2022 16:19:16 -0800 Subject: [PATCH 333/680] Upgrade to Arc 10 RCs --- package-lock.json | 616 ++++++++++++++---------------- package.json | 14 +- src/http/get-api-package/index.js | 3 +- 3 files changed, 306 insertions(+), 327 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84055865..f76fa04d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,95 +5,110 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-9.5.4.tgz", - "integrity": "sha512-fjuUsMiZgf+19ijeu4cU6/hlZg3PrXjNl//4V1+gAogJisUelxMRsZrbvZqNX2EfphdSNemCYuYtxVmCqQmiLQ==", - "dev": true, - "requires": { - "@architect/create": "3.1.1", - "@architect/deploy": "3.1.1", - "@architect/destroy": "2.0.3", - "@architect/env": "2.0.6", - "@architect/hydrate": "2.2.3", - "@architect/logs": "3.0.3", - "@architect/package": "7.2.0", - "@architect/sandbox": "4.5.2", - "aws-sdk": "2.880.0", + "version": "10.0.0-RC.7", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.0-RC.7.tgz", + "integrity": "sha512-vBFeB5QfLhKZAR0ijlUinzf9so3cwIpjgY2Q2KywLI0LF++6vr6NgvSxrW3V8l7YGZTEmWRr3EUJyeUj44Sddw==", + "dev": true, + "requires": { + "@architect/create": "3.2.0-RC.3", + "@architect/deploy": "4.0.0-RC.6", + "@architect/destroy": "3.0.0-RC.0", + "@architect/env": "3.0.0-RC.1", + "@architect/hydrate": "3.0.0-RC.5", + "@architect/inventory": "3.0.0-RC.10", + "@architect/logs": "4.0.0-RC.1", + "@architect/sandbox": "5.0.0-RC.11", + "aws-sdk": "2.1001.0", "chalk": "4.1.2", "update-notifier": "5.1.0" } }, "@architect/asap": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-4.1.0.tgz", - "integrity": "sha512-SrPV5lUpjotyj/nIMQWwdTsNe5LwieFHqhrVo8tKKXz7Ht7ila15rH9dyYENOmMI87UVHvKDbsRvx47LK5NMwQ==" + "version": "5.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-5.0.0-RC.0.tgz", + "integrity": "sha512-JQM3LfYWzJC5PpLltMKVoczrKhSsd2HBG1Yc7Jhee/AVurBFPtyplve7UheImQyYVvytZbRI4OngptZey/3C2Q==" }, "@architect/create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@architect/create/-/create-3.1.1.tgz", - "integrity": "sha512-Du2YITXVrgpR49GaRqQe/sc8VBQ3B05/eWHlGAOjPUgmTRf4JycAoKxSPnTMYmEjQHJyrABs35cbHhse1vH1tw==", + "version": "3.2.0-RC.3", + "resolved": "https://registry.npmjs.org/@architect/create/-/create-3.2.0-RC.3.tgz", + "integrity": "sha512-EPq7GRRuJsRm71uKdohbOhN56OrlrTO6QICBtBLZ9q8HvIYKRRqy1+I/9HyNpT4z4tW1ajvEIahMSLUXowt1ZA==", "dev": true, "requires": { - "@architect/inventory": "~2.2.0", + "@architect/inventory": "~3.0.0-RC.5", "@architect/utils": "~3.0.4", - "chalk": "~4.1.2", - "lambda-runtimes": "~1.1.0", + "chalk": "4.1.2", + "lambda-runtimes": "~1.1.1", "minimist": "~1.2.5" } }, "@architect/deploy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-3.1.1.tgz", - "integrity": "sha512-ztQArJh/BGVYyPK3DQOnXwS1RqS0YFLEEzv7vwGmx522OckiiG0FUkSr52OPJI86d6Pi16q74mbZGmBMokS6uQ==", + "version": "4.0.0-RC.6", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.0-RC.6.tgz", + "integrity": "sha512-ZVoI1JemPgZ8LNL9q6h027LNxDWRcg/bzW+LbFMSa3WTigT4JEPpnYjQhD+UpTIeN7xxyGDZmM2g5GzlifW4dg==", "dev": true, "requires": { - "@architect/create": "~3.1.0", - "@architect/hydrate": "~2.2.0", - "@architect/inventory": "~2.2.0", - "@architect/package": "~7.2.0", - "@architect/utils": "~3.0.4", - "chalk": "~4.1.2", + "@architect/create": "~3.2.0-RC.3", + "@architect/hydrate": "~3.0.0-RC.5", + "@architect/inventory": "~3.0.0-RC.8", + "@architect/package": "~8.0.0-RC.1", + "@architect/utils": "~3.1.0-RC.0", + "chalk": "4.1.2", "fs-extra": "~10.0.0", "get-folder-size": "2.0.1", "glob": "~7.2.0", "mime-types": "~2.1.34", - "ospath": "~1.2.2", + "minimist": "~1.2.5", "path-sort": "~0.1.0", - "rimraf": "~3.0.2", "run-parallel": "~1.2.0", "run-series": "~1.1.9", "run-waterfall": "~1.1.7", - "sha": "~3.0.0", "zip-dir": "~2.0.0", "zipit": "~2.0.0" + }, + "dependencies": { + "@architect/utils": { + "version": "3.1.0-RC.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0-RC.0.tgz", + "integrity": "sha512-Z5e89NVXukFze/+fhDN9YrGTeTbgT4Vyn5utlaUbdbT0bNY6zSOPIsl5Npiv+y6K1uu+WJii0gMDhOwsb+BCXQ==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/destroy": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-2.0.3.tgz", - "integrity": "sha512-lIaWPrcI5G/TOcP3AxdAQoRxD0DYdClRAUzrILKRoPbp9klFDlVB7+JPqoL7b/tNCxTRN6EES0mZv4yFK64NQA==", + "version": "3.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-3.0.0-RC.0.tgz", + "integrity": "sha512-dVrV6t2jSE7GPeX6WI9YdK0JCH/39oaiG6LzrnWtsv5LkQ0HflnBx8uUURuYFuN4jHewMK/6gWr6jsEsa69Rig==", "dev": true, "requires": { - "@architect/inventory": "~2.2.0", + "@architect/inventory": "~3.0.0-RC.5", "@architect/utils": "~3.0.4", - "aws-sdk": "2.880.0", + "aws-sdk": "2.1001.0", + "minimist": "~1.2.5", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7" } }, "@architect/env": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@architect/env/-/env-2.0.6.tgz", - "integrity": "sha512-Wk7bhkVs6hLTq8JFDiSjPmWgf+Je5Hhehj57lLUb8F1eNtlLFHUwv6X2W/zyodIvoqiDl4d0Zb9FOLDY5F3BNA==", + "version": "3.0.0-RC.1", + "resolved": "https://registry.npmjs.org/@architect/env/-/env-3.0.0-RC.1.tgz", + "integrity": "sha512-C0mIg78BBGKJMN2PP3Le3kxNyvGbwCJNhZDu/K4TXSbkOwJ/x2XpYSB+rGUL6GSDwVHtjq5d5plL1QcvxhSMpw==", "dev": true, "requires": { - "@architect/inventory": "~2.2.0", + "@architect/inventory": "~3.0.0-RC.5", "@architect/parser": "~5.0.2", "@architect/utils": "~3.0.4", - "aws-sdk": "2.880.0", - "chalk": "~4.1.2", - "cross-env": "~7.0.3", - "dotenv": "~10.0.0", + "aws-sdk": "2.1001.0", + "chalk": "4.1.2", + "dotenv": "~14.3.2", "run-series": "~1.1.9", "run-waterfall": "~1.1.7", "yesno": "~0.3.1" @@ -111,12 +126,11 @@ } }, "@architect/functions": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.1.1.tgz", - "integrity": "sha512-x0+B/V9Jo5onksOce6iYdYeLh5F91dOp5fTnGJdkgOFCS+N0YN9zlI2asdPIs1Rb6xxCwoH1nuzs/jnNkupQWA==", + "version": "5.0.0-RC.2", + "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.0-RC.2.tgz", + "integrity": "sha512-OGrBEsHMvMNHT+suiweRy4ce8y5r3LdzVhzx+Z7wC6Io9XLaZjc1tgm1TsVPJY3nrC0vuxulE3GDDyo+efDLEQ==", "requires": { - "aws-serverless-express": "^3.4.0", - "cookie": "^0.4.1", + "cookie": "^0.4.2", "cookie-signature": "^1.1.0", "csrf": "^3.1.0", "node-webtokens": "^1.0.4", @@ -126,97 +140,133 @@ } }, "@architect/hydrate": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-2.2.3.tgz", - "integrity": "sha512-l1lFwKBcZFDKgnNgQ4oEYXQ/gLnSGZogc1fMHnqPi7ZnEkSJ6wvWPpp+Dao+8ZZbNpTa4nyHKhsDz547+gdsqg==", + "version": "3.0.0-RC.5", + "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-3.0.0-RC.5.tgz", + "integrity": "sha512-cg3D2u1hBq7UBLRMYrVTK5YQWMM8bdg1HkK5sQpj18FrhH6yBuWKoLVZUXUYwf29sTjxbaDJoGnQcBXvgX/F9A==", "dev": true, "requires": { - "@architect/inventory": "~2.2.0", + "@architect/inventory": "~3.0.0-RC.8", "@architect/utils": "~3.0.4", "acorn-loose": "~8.3.0", - "chalk": "~4.1.2", + "chalk": "4.1.2", "cpr": "~3.0.1", "esquery": "~1.4.0", "glob": "~7.2.0", - "rimraf": "~3.0.2", + "minimist": "~1.2.5", "run-series": "~1.1.9", "symlink-or-copy": "~1.3.1" } }, "@architect/inventory": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-2.2.1.tgz", - "integrity": "sha512-Rwl3os2JFHantTENPFn6KUeIaChmYc1v6B/zGCe5yC82mrJBXNZu8tN6PtawC6dmhQdbfBGAc+MlhgUqKzpVTA==", - "requires": { - "@architect/asap": "~4.1.0", - "@architect/parser": "~5.0.2", - "@architect/utils": "~3.0.4", - "lambda-runtimes": "~1.1.0" + "version": "3.0.0-RC.10", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0-RC.10.tgz", + "integrity": "sha512-8NZugwR1yPB7j5rCHUsHsQv8iXuLXVbJpZqAm6lG6/p7H0ddOYElB9GgwRilSsyAriiBgmScD0P9FfxaONX+uw==", + "requires": { + "@architect/asap": "~5.0.0-RC.0", + "@architect/parser": "~6.0.0-RC.0", + "@architect/utils": "~3.1.0-RC.0", + "lambda-runtimes": "~1.1.1" + }, + "dependencies": { + "@architect/parser": { + "version": "6.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-6.0.0-RC.0.tgz", + "integrity": "sha512-SFksHa9ncCEfh4ixJFiwNWigZvpzXiEndAfOul2vk7Z5V6K9plGjnXkdA3cplzeyH2sficgEPPBkcoFTExC7ew==" + }, + "@architect/utils": { + "version": "3.1.0-RC.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0-RC.0.tgz", + "integrity": "sha512-Z5e89NVXukFze/+fhDN9YrGTeTbgT4Vyn5utlaUbdbT0bNY6zSOPIsl5Npiv+y6K1uu+WJii0gMDhOwsb+BCXQ==", + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/logs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-3.0.3.tgz", - "integrity": "sha512-21fFpQ8BmAbsCmSlVYD0P6+caVm7LTS/bhAgfoqKkoK26QBKkQIC+QdMvrAlI0mF0zgInnl1FmWxphRhK/jvWg==", + "version": "4.0.0-RC.1", + "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-4.0.0-RC.1.tgz", + "integrity": "sha512-xGTcD3KAj50UDk5TQUmhsi7oeUAPDW/jpa821vfSfShEsyTFAHn4vJ5P25XSQl9WuyIAT/DSphVxMps01bUv9Q==", "dev": true, "requires": { - "@architect/inventory": "~2.2.0", + "@architect/inventory": "~3.0.0-RC.5", "@architect/utils": "~3.0.4", - "aws-sdk": "2.880.0", - "chalk": "~4.1.2", + "aws-sdk": "2.1001.0", + "chalk": "4.1.2", + "minimist": "~1.2.5", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7", - "strftime": "~0.10.0" + "strftime": "~0.10.1" } }, "@architect/package": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@architect/package/-/package-7.2.0.tgz", - "integrity": "sha512-c1Z8pD0tLbTMSWviAZEJ9SARL2ONZUjX8/RmHT0s6F/mEVJNhUwNsfcxsblqLscUl+sv82tqIovkFkC+UG0fSw==", + "version": "8.0.0-RC.2", + "resolved": "https://registry.npmjs.org/@architect/package/-/package-8.0.0-RC.2.tgz", + "integrity": "sha512-bfVCwRPlzqQfSMuSpaZO06nmu/xznougSQmoiH0NJDyQ+3ukSjy+0qyRQYEihgkoYDZFM2RX8uCtDElYFXfEJA==", "requires": { - "@architect/inventory": "~2.2.0", - "@architect/utils": "~3.0.4", - "chalk": "~4.1.2" + "@architect/inventory": "~3.0.0-RC.5", + "@architect/utils": "~3.0.4" } }, "@architect/parser": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-5.0.2.tgz", - "integrity": "sha512-3XTuB/HS3GNDXXUQ2BJt7kVOViTGCR2O4hIUEb1l8FxsSmwzgpiR2CAzUA4ZhySxW+1a+Tg88YL2Yyb2kvLmlw==" + "integrity": "sha512-3XTuB/HS3GNDXXUQ2BJt7kVOViTGCR2O4hIUEb1l8FxsSmwzgpiR2CAzUA4ZhySxW+1a+Tg88YL2Yyb2kvLmlw==", + "dev": true }, "@architect/sandbox": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-4.5.2.tgz", - "integrity": "sha512-Mw1qud5fZU4CuWIdekG7MTgqvksWVn8A5dzE4ddWg+Y9ysExcHW6b849q1ydpUs0qR/ViPCPUvjQ2KagnUuoGw==", + "version": "5.0.0-RC.11", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.0.0-RC.11.tgz", + "integrity": "sha512-1EafR5zqo9ZvRCPnYs+rol6BYrNnRofsndQx4XuoC0pIuqSNaJB1Z3DZlYE3T87gr/zM6cfetRInjC5gUJ54Gw==", "dev": true, "requires": { - "@architect/asap": "~4.1.0", - "@architect/create": "~3.1.1", - "@architect/hydrate": "~2.2.0", - "@architect/inventory": "~2.2.1", - "@architect/parser": "~5.0.2", - "@architect/utils": "~3.0.4", + "@architect/asap": "~5.0.0-RC.0", + "@architect/create": "~3.2.0-RC.3", + "@architect/hydrate": "~3.0.0-RC.5", + "@architect/inventory": "~3.0.0-RC.8", + "@architect/utils": "~3.1.0-RC.0", "@begin/hashid": "~1.0.0", - "aws-sdk": "2.880.0", - "body-parser": "~1.19.0", - "chalk": "~4.1.2", + "aws-sdk": "2.1001.0", + "chalk": "4.1.2", + "chokidar": "~3.5.3", "depstatus": "~1.1.1", - "dotenv": "~10.0.0", "dynalite": "~3.2.1", "finalhandler": "~1.1.2", "glob": "~7.2.0", "http-proxy": "~1.18.1", "lambda-runtimes": "~1.1.1", "minimist": "~1.2.5", - "node-watch": "~0.7.2", "router": "~1.3.6", "run-parallel": "~1.2.0", "run-series": "~1.1.9", - "send": "~0.17.1", + "send": "~0.17.2", "server-destroy": "~1.0.1", "tree-kill": "~1.2.2", "update-notifier": "~5.1.0", - "ws": "~8.3.0" + "ws": "~8.4.2" + }, + "dependencies": { + "@architect/utils": { + "version": "3.1.0-RC.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0-RC.0.tgz", + "integrity": "sha512-Z5e89NVXukFze/+fhDN9YrGTeTbgT4Vyn5utlaUbdbT0bNY6zSOPIsl5Npiv+y6K1uu+WJii0gMDhOwsb+BCXQ==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/spellcheck-dictionary": { @@ -394,9 +444,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -506,15 +556,6 @@ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", "dev": true }, - "@vendia/serverless-express": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-3.4.0.tgz", - "integrity": "sha512-/UAAbi9qRjUtjRISt5MJ1sfhtrHb26hqQ0nvE5qhMLsAdR5H7ErBwPD8Q/v2OENKm0iWsGwErIZEg7ebUeFDjQ==", - "requires": { - "binary-case": "^1.0.0", - "type-is": "^1.6.16" - } - }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -637,6 +678,16 @@ "color-convert": "^2.0.1" } }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "app-root-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", @@ -730,9 +781,9 @@ "dev": true }, "aws-sdk": { - "version": "2.880.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.880.0.tgz", - "integrity": "sha512-/dBk3ejw22ED2edzGfmJB83KXDA4wLIw5Hb+2YMhly+gOWecvevy0tML2+YN/cmxyTy+wT0E0sM7fm1v7kmHtw==", + "version": "2.1001.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1001.0.tgz", + "integrity": "sha512-DpmslPU8myCaaRUwMzB/SqAMtD2zQckxYwq3CguIv8BI+JHxDLeTdPCLfA5jffQ8k6dcvISOuiqdpwCZucU0BA==", "dev": true, "requires": { "buffer": "4.9.2", @@ -746,16 +797,6 @@ "xml2js": "0.4.19" } }, - "aws-serverless-express": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.4.0.tgz", - "integrity": "sha512-YG9ZjAOI9OpwqDDWzkRc3kKJYJuR7gTMjLa3kAWopO17myoprxskCUyCEee+RKe34tcR4UNrVtgAwW5yDe74bw==", - "requires": { - "@vendia/serverless-express": "^3.4.0", - "binary-case": "^1.0.0", - "type-is": "^1.6.16" - } - }, "bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", @@ -779,28 +820,11 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "binary-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz", - "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg==" - }, - "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", - "dev": true, - "requires": { - "bytes": "3.1.1", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" - } + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true }, "boxen": { "version": "5.1.2", @@ -853,12 +877,6 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, - "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", - "dev": true - }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -960,6 +978,22 @@ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "dev": true }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -1115,16 +1149,10 @@ "xdg-basedir": "^4.0.0" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.1.0", @@ -1147,17 +1175,6 @@ "minimist": "^1.2.0", "mkdirp": "~0.5.1", "rimraf": "^2.5.4" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } } }, "create-eslint-index": { @@ -1169,15 +1186,6 @@ "lodash.get": "^4.3.0" } }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1455,9 +1463,9 @@ } }, "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "version": "14.3.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", + "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", "dev": true }, "dotignore": { @@ -1476,22 +1484,22 @@ "dev": true }, "dynalite": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz", - "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.2.tgz", + "integrity": "sha512-sx9ZjTgMs/D4gHnba4rnBkw29648dHwHmywJet132KAbiq1ZyWx9W1fMd/eP9cPwTKDXyCBuTYOChE0qMDjaXQ==", "dev": true, "requires": { "async": "^2.6.3", "big.js": "^5.2.2", "buffer-crc32": "^0.2.13", "lazy": "^1.0.11", - "leveldown": "^5.2.1", + "leveldown": "^5.6.0", "levelup": "^4.4.0", "lock": "^1.1.0", "memdown": "^5.1.0", "minimist": "^1.2.5", "once": "^1.4.0", - "subleveldown": "^5.0.0" + "subleveldown": "^5.0.1" }, "dependencies": { "async": { @@ -1649,9 +1657,9 @@ "dev": true }, "eslint": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", - "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.5", @@ -1715,6 +1723,15 @@ "esutils": "^2.0.2" } }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1990,17 +2007,6 @@ "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } } }, "fast-json-stable-stringify": { @@ -2098,18 +2104,29 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "dev": true }, "for-each": { @@ -2163,6 +2180,13 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2260,12 +2284,12 @@ } }, "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" } }, "global-dirs": { @@ -2278,9 +2302,9 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -2472,15 +2496,6 @@ } } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", @@ -2605,6 +2620,15 @@ "has-bigints": "^1.0.1" } }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -2980,6 +3004,23 @@ "pako": "~1.0.2", "readable-stream": "~2.3.6", "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } } }, "junit-report-builder": { @@ -3082,19 +3123,6 @@ "inherits": "^2.0.4", "readable-stream": "^3.4.0", "xtend": "^4.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "level-option-wrap": { @@ -3430,11 +3458,6 @@ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, "memdown": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", @@ -3558,12 +3581,14 @@ "mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true }, "mime-types": { "version": "2.1.34", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, "requires": { "mime-db": "1.51.0" } @@ -3678,12 +3703,6 @@ "dev": true, "optional": true }, - "node-watch": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", - "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==", - "dev": true - }, "node-webtokens": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/node-webtokens/-/node-webtokens-1.0.4.tgz", @@ -3701,6 +3720,12 @@ "validate-npm-package-license": "^3.0.1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "normalize-url": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", @@ -3806,12 +3831,6 @@ "word-wrap": "^1.2.3" } }, - "ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=", - "dev": true - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -4021,12 +4040,6 @@ "escape-goat": "^2.0.0" } }, - "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", - "dev": true - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -4061,18 +4074,6 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, - "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", - "dev": true, - "requires": { - "bytes": "3.1.1", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -4182,18 +4183,23 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "picomatch": "^2.2.1" } }, "redent": { @@ -4530,9 +4536,9 @@ "dev": true }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -4582,12 +4588,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", @@ -5111,9 +5111,9 @@ } }, "tape": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.4.1.tgz", - "integrity": "sha512-7bGaJ3WnQ/CX3xOWzlR+9lNptEWoD+11gyREP8k+SYrDu2a20EifKpTmZndXn25ZRxesYHSuNtE7Fb+THcjfGA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.5.0.tgz", + "integrity": "sha512-hmsc9J+07tM+evk2Rkv7pkbj70Uoy9k0w1yhnN8Sza8kmjhtUTVNltsjywQjC+4grB+EBMKXiJPTkftX8IrbSA==", "dev": true, "requires": { "array.prototype.every": "^1.1.3", @@ -5176,19 +5176,6 @@ "dev": true, "requires": { "readable-stream": "3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "tiny-each-async": { @@ -5286,15 +5273,6 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -5773,9 +5751,9 @@ } }, "ws": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", - "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "dev": true }, "x-is-string": { diff --git a/package.json b/package.json index b95d64a2..b47ca5e5 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,10 @@ "test": "npm run spellcheck && npm run lint && npm run test:unit:frontend && npm run test:unit:backend" }, "dependencies": { - "@architect/asap": "^4.1.0", - "@architect/functions": "^4.1.1", - "@architect/inventory": "^2.2.1", - "@architect/package": "^7.2.0", + "@architect/asap": "^5.0.0-RC.0", + "@architect/functions": "^5.0.0-RC.2", + "@architect/inventory": "^3.0.0-RC.10", + "@architect/package": "^8.0.0-RC.2", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "@toycode/markdown-it-class": "^1.2.4", "esm": "^3.2.25", @@ -32,14 +32,14 @@ "slugify": "^1.6.5" }, "devDependencies": { - "@architect/architect": "^9.5.4", + "@architect/architect": "^10.0.0-RC.7", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary", - "eslint": "^8.7.0", + "eslint": "^8.8.0", "linkinator": "^3.0.3", "spellchecker-cli": "^4.8.1", "tap-arc": "^0.1.2", - "tape": "^5.4.1", + "tape": "^5.5.0", "tiny-json-http": "^7.3.1" }, "eslintConfig": { diff --git a/src/http/get-api-package/index.js b/src/http/get-api-package/index.js index 9b5c3354..5a89a232 100644 --- a/src/http/get-api-package/index.js +++ b/src/http/get-api-package/index.js @@ -8,7 +8,8 @@ exports.handler = async function http (req) { try { let rawArc = Buffer.from(req.queryStringParameters.arc, 'base64').toString() - body = JSON.stringify(pkg(await inventory({ rawArc }))) + let inv = await inventory({ rawArc, deployStage: 'staging' }) + body = JSON.stringify(pkg(inv)) } catch (e) { statusCode = 500 From 37305dc1bec7fc25fea74f0ef71a2ed88d5120a5 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 11 Feb 2022 12:44:34 -0800 Subject: [PATCH 334/680] Tighten up type sizes a bit Remove unused scale sizes Bring max width down on multicol view to improve readability --- .gitignore | 1 + prefs.arc | 3 ++ public/css/index.css | 2 +- public/css/styles.css | 51 +++++++++---------------- public/css/syntax.css | 1 + public/static.json | 12 ------ src/views/modules/components/sidebar.js | 11 +++--- src/views/modules/document/html.js | 3 +- 8 files changed, 32 insertions(+), 52 deletions(-) delete mode 100644 public/static.json diff --git a/.gitignore b/.gitignore index e7f417f3..05a46442 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ node_modules scratch sam.json sam.yaml +public/static.json **/static.json src/http/get-docs-000lang-catchall/highlight/ diff --git a/prefs.arc b/prefs.arc index f4eb0c44..e80790a1 100644 --- a/prefs.arc +++ b/prefs.arc @@ -1,3 +1,6 @@ # Just here to ensure grammar dist files are vendored at startup! @sandbox-startup ./scripts/dist.sh + +@sandbox +livereload true diff --git a/public/css/index.css b/public/css/index.css index 4e3d520a..494326b3 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -14,7 +14,7 @@ html { height: 4px; } .max-width-content { - max-width: 60rem; + max-width: 50rem; } .two-column { /* Height: Header | Content */ diff --git a/public/css/styles.css b/public/css/styles.css index bca51cad..20845c52 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -84,7 +84,7 @@ input {font-family: inherit;} /* TYPEFACE */ -html {font-size: 18px;} +html {font-size: 17px;} body { font-weight: normal; line-height: 1.5; @@ -187,9 +187,8 @@ body { .bg-a2.active{background-color:var(--a2);} .bg-d0:disabled{background-color:var(--d0);} .bg-d1:disabled{background-color:var(--d1);} - - - /* GRADIENT */.bg-image0{background-image:linear-gradient(0.4turn, var(--p1), var(--p0));} +/* GRADIENT */ +.bg-image0{background-image:linear-gradient(0.4turn, var(--p1), var(--p0));} /* BORDER */ @@ -249,11 +248,11 @@ body { .border-a1.active{border-color:var(--a1);}/* #8E8E8E */ .border-d0:disabled{border-color:var(--d0);}/* #797979 */ .border-d1:disabled{border-color:var(--d1);}/* #636363 */ - .border-current { border-color: currentColor; } + /* RADIUS */ .radius-none{border-radius:0;} .radius-100{border-radius:100%;} @@ -278,12 +277,10 @@ body { .stroke-current{stroke:currentColor;} - /* CONTAINER */ .container{max-width:100%;} - /* FAMILY */ .font-sans{font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";} .font-serif{font-family: Georgia, Cambria, "Times New Roman", Times, serif;} @@ -291,17 +288,13 @@ body { /* SIZES */ -.text5{font-size:4.209rem;}/* 75.757px */ -.text4{font-size:3.157rem;}/* 56.832px */ -.text3{font-size:2.369rem;}/* 42.635px */ -.text2{font-size:1.777rem;}/* 31.984px */ -.text1{font-size:1.333rem;}/* 23.994px */ -.text0{font-size:1rem;}/* 18px */ -.text-1{font-size:0.75rem;}/* 13.503px */ -.text-2{font-size:0.563rem;}/* 10.13px */ -.text-3{font-size:0.422rem;}/* 7.599px */ -.text-4{font-size:0.317rem;}/* 5.701px */ -.text-5{font-size:0.238rem;}/* 4.277px */ +.text3{font-size:1.424rem;}/* 24.21px */ +.text2{font-size:1.266rem;}/* 21.52px */ +.text1{font-size:1.125rem;}/* 19.13px */ +.text0{font-size:1rem;}/* 17.00px */ +.text-1{font-size:0.889rem;}/* 15.11px */ +.text-2{font-size:0.79rem;}/* 13.43px */ +.text-3{font-size:0.702rem;}/* 11.94px */ /* Style */ @@ -768,7 +761,6 @@ body { .container-lg{max-width:48em;} - /* FAMILY */ .font-sans-lg{font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";} .font-serif-lg{font-family: Georgia, Cambria, "Times New Roman", Times, serif;} @@ -776,17 +768,13 @@ body { /* SIZES */ -.text5-lg{font-size:4.209rem;}/* 75.757px */ -.text4-lg{font-size:3.157rem;}/* 56.832px */ -.text3-lg{font-size:2.369rem;}/* 42.635px */ -.text2-lg{font-size:1.777rem;}/* 31.984px */ -.text1-lg{font-size:1.333rem;}/* 23.994px */ -.text0-lg{font-size:1rem;}/* 18px */ -.text-1-lg{font-size:0.75rem;}/* 13.503px */ -.text-2-lg{font-size:0.563rem;}/* 10.13px */ -.text-3-lg{font-size:0.422rem;}/* 7.599px */ -.text-4-lg{font-size:0.317rem;}/* 5.701px */ -.text-5-lg{font-size:0.238rem;}/* 4.277px */ +.text3-lg{font-size:1.424rem;}/* 24.21px */ +.text2-lg{font-size:1.266rem;}/* 21.52px */ +.text1-lg{font-size:1.125rem;}/* 19.13px */ +.text0-lg{font-size:1rem;}/* 17.00px */ +.text-1-lg{font-size:0.889rem;}/* 15.11px */ +.text-2-lg{font-size:0.79rem;}/* 13.43px */ +.text-3-lg{font-size:0.702rem;}/* 11.94px */ /* Style */ @@ -869,7 +857,6 @@ body { .ellipsis-lg{text-overflow:ellipsis;} - /* ----- LAYOUT ----- */ @@ -1039,7 +1026,6 @@ body { .z-1-lg{z-index:-1;} - /* MARGIN */ .m-none-lg{margin:0;} .mt-none-lg{margin-top:0;} @@ -1242,4 +1228,3 @@ body { } - diff --git a/public/css/syntax.css b/public/css/syntax.css index 36e09bd7..513454a0 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -35,6 +35,7 @@ /* all code font family */ .docs pre code, .docs :not(pre) > code { font-family: Menlo, Monaco, Consolas, monospace; + font-size: 0.85rem; } .docs pre code { color: #ABB2BF; diff --git a/public/static.json b/public/static.json deleted file mode 100644 index 5ff30a64..00000000 --- a/public/static.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "arc.codes.png": "arc.codes-dffa3a9996.png", - "index.js": "index-e3a8440e18.js", - "playground.html": "playground-2fe1115dbf.html", - "playground.js": "playground-67bb53bc87.js", - "components/arc-tab.js": "components/arc-tab-efbcb40f74.js", - "components/arc-viewer.js": "components/arc-viewer-3de6ce2a83.js", - "css/docsearch.css": "css/docsearch-27dbba82ed.css", - "css/index.css": "css/index-547bdacc3e.css", - "css/styles.css": "css/styles-cf4510a1b6.css", - "css/syntax.css": "css/syntax-0339098006.css" -} \ No newline at end of file diff --git a/src/views/modules/components/sidebar.js b/src/views/modules/components/sidebar.js index 76954949..9a522619 100644 --- a/src/views/modules/components/sidebar.js +++ b/src/views/modules/components/sidebar.js @@ -7,7 +7,7 @@ const map = { return `
      @@ -18,11 +18,12 @@ const map = { item: function Item (state = {}) { let { child = '', children = [], depth, path, active } = state let isHeading = children.length + let mb = isHeading ? 'mb1' : 'mb-4' let ml = depth > 1 ? 'ml-5' : '' return `
    • @@ -65,7 +66,7 @@ function Heading3 (state = {}) { > ${name} -
      +
      ` } @@ -74,7 +75,7 @@ function Heading4 (state = {}) { return `

      - ${name} + ${name} diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index c6563405..a69baafa 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -53,7 +53,8 @@ ${Symbols} id="main" class=" h-full - p3 + p3-lg + p1 overflow-auto " > From 7b7a3201367d413efc1895cc3822b7501aeede75 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 11 Feb 2022 13:07:17 -0800 Subject: [PATCH 335/680] Sidebar margin + type improvements --- public/css/index.css | 4 ++-- src/views/modules/components/sidebar.js | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/css/index.css b/public/css/index.css index 494326b3..4688d1e2 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -23,8 +23,8 @@ html { grid-template-columns: 17.666rem 1fr; } .icon { - width: 1.25rem; - height: 1.25rem; + width: 1.1rem; + height: 1.1rem; } .discord-icon { width: 1.3rem; diff --git a/src/views/modules/components/sidebar.js b/src/views/modules/components/sidebar.js index 9a522619..3ec7164f 100644 --- a/src/views/modules/components/sidebar.js +++ b/src/views/modules/components/sidebar.js @@ -19,7 +19,7 @@ const map = { let { child = '', children = [], depth, path, active } = state let isHeading = children.length let mb = isHeading ? 'mb1' : 'mb-4' - let ml = depth > 1 ? 'ml-5' : '' + let ml = path.length > 3 ? 'ml-1' : '' return `
    • ${text} +${text} ` } @@ -77,7 +77,7 @@ function Heading4 (state = {}) { class=" mb-2 text0 - font-semibold + font-medium " > ${name} @@ -106,7 +106,7 @@ function Group (state = {}) { ${name} - + @@ -115,7 +115,7 @@ function Group (state = {}) { -
      ${children}
      +
      ${children}
      ` } From 91f21e29f63117b7363b54dbd2efbdad09492794 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 11 Feb 2022 13:38:44 -0800 Subject: [PATCH 336/680] A few more margin tweaks --- public/css/index.css | 2 +- src/views/modules/components/sidebar.js | 2 +- src/views/modules/document/html.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/css/index.css b/public/css/index.css index 4688d1e2..5695fbb2 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -113,7 +113,7 @@ main { .right-sidebar { display: block; font-size: .9rem; - min-width:16rem; + min-width: 16rem; } @media only screen and (max-width:80rem) { diff --git a/src/views/modules/components/sidebar.js b/src/views/modules/components/sidebar.js index 3ec7164f..32a06d81 100644 --- a/src/views/modules/components/sidebar.js +++ b/src/views/modules/components/sidebar.js @@ -136,7 +136,7 @@ export default function Sidebar (props = {}) { fixed left-sidebar static-lg - pt3 + pt2 pr2 pb3 pl2 diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index a69baafa..37221c27 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -53,7 +53,7 @@ ${Symbols} id="main" class=" h-full - p3-lg + p2-lg p1 overflow-auto " From dc880a5d1fe63befd04f74510bbb18489718d9dd Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 11 Feb 2022 15:22:20 -0800 Subject: [PATCH 337/680] Add plugins overview, plugind doc stubs Bump heading sizes a bit --- package-lock.json | 4 +- package.json | 2 +- .../markdown-class-mappings.js | 6 +- src/views/docs/en/about/upgrade-guide.md | 2 +- src/views/docs/en/guides/plugins/deploy.md | 0 src/views/docs/en/guides/plugins/inventory.md | 0 src/views/docs/en/guides/plugins/overview.md | 101 ++++++++++++++++++ .../plugins/porting-macros-to-plugins.md | 0 src/views/docs/en/guides/plugins/sandbox.md | 0 src/views/docs/en/guides/plugins/set.md | 0 src/views/docs/table-of-contents.js | 11 +- src/views/modules/document/html.js | 2 +- 12 files changed, 118 insertions(+), 10 deletions(-) create mode 100644 src/views/docs/en/guides/plugins/deploy.md create mode 100644 src/views/docs/en/guides/plugins/inventory.md create mode 100644 src/views/docs/en/guides/plugins/overview.md create mode 100644 src/views/docs/en/guides/plugins/porting-macros-to-plugins.md create mode 100644 src/views/docs/en/guides/plugins/sandbox.md create mode 100644 src/views/docs/en/guides/plugins/set.md diff --git a/package-lock.json b/package-lock.json index f76fa04d..951d9d61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -270,8 +270,8 @@ } }, "@architect/spellcheck-dictionary": { - "version": "github:architect/spellcheck-dictionary#f7e5a6fee8aceb6ab68b1bcdc79e852c01ed93fd", - "from": "github:architect/spellcheck-dictionary", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#b248170fef491887c8a03a606358c4effe9af9b9", + "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, "@architect/syntaxes": { diff --git a/package.json b/package.json index b47ca5e5..a4f74555 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "devDependencies": { "@architect/architect": "^10.0.0-RC.7", "@architect/eslint-config": "^2.0.1", - "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary", + "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", "eslint": "^8.8.0", "linkinator": "^3.0.3", "spellchecker-cli": "^4.8.1", diff --git a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js index 7a7ad308..6eef6cbb 100644 --- a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js +++ b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js @@ -2,19 +2,19 @@ module.exports = { h1: [ 'mb2', 'font-semibold', - 'text2' + 'text3' ], h2: [ 'mt3', 'mb-1', 'font-semibold', - 'text1' + 'text2' ], h3: [ 'mt3', 'mb-1', 'font-semibold', - 'text0' + 'text1' ], h4: [ 'mt3', diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index c16db048..0eef717b 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -100,7 +100,7 @@ Most of Architect 10's breaking changes were internal; most users should not enc ## Breaking changes - The beta plugins API has been largely refactored; wherever possible, hooks from the beta API have been ported to the final shipping plugin API. However, many things changed, so if you authored plugins against the beta API, please refer to the [new plugin documentation](https://arc.codes/docs/en/reference/plugins/api) to ensure compatibility -- Due to ongoing issues with unpredictable behavior with certain external libraries, Architect no longer makes use of or deploys apps with `NODE_ENV` environment variable. +- Due to ongoing issues with unpredictable behavior with certain external libraries, Architect no longer makes use of the `NODE_ENV` environment variable, nor is it automatically added to deployed apps. - Remedy: if your code relies on Architect automatically populating `NODE_ENV`, you should add it to your userland environment variables, like so: `npx arc env --add --env testing NODE_ENV testing` (and again for `staging` + `production`) - All support for bare CLI flags has been removed from Architect commands - All functionality has been retained, but now proper flags must be used diff --git a/src/views/docs/en/guides/plugins/deploy.md b/src/views/docs/en/guides/plugins/deploy.md new file mode 100644 index 00000000..e69de29b diff --git a/src/views/docs/en/guides/plugins/inventory.md b/src/views/docs/en/guides/plugins/inventory.md new file mode 100644 index 00000000..e69de29b diff --git a/src/views/docs/en/guides/plugins/overview.md b/src/views/docs/en/guides/plugins/overview.md new file mode 100644 index 00000000..dea09e26 --- /dev/null +++ b/src/views/docs/en/guides/plugins/overview.md @@ -0,0 +1,101 @@ +--- +title: Plugins overview +category: Plugins +description: Overview of Architect's plugin API +--- + +Architect's plugin API exposes [workflow lifecycle hooks](#workflow-hooks) (such filesystem events in the [Sandbox](/docs/en/reference/cli/sandbox)) and interfaces for [generating cloud resources](#resource-setters) (such as custom Lambdas, or environment variables). + +This document assumes some existing knowledge of how Architect works, including the [project manifest](/docs/en/get-started/project-manifest), deterministic deployment to AWS via CloudFormation, etc. + + +## Finding & installing plugins + +[Architect maintains a list of officially supported and community developed plugins](https://github.com/architect/plugins); npm is also a great place to [find plugins](https://www.npmjs.com/search?q=arc-plugin-) (and [legacy macros](#macros)). + +To install a plugin, add a `@plugins` pragma to your project manifest. For example, if you wanted to `npm install` and use both `@architect/plugin-typescript` and `arc-macro-cors`, this is what you'd add to your manifest: + +```arc +@plugins +architect/plugin-typescript # note: leading @ must be removed from namespaced packages +arc-macro-cors +``` + +You can also use unpublished local plugins like so: + +```arc +@plugins +my-private-plugin # loads from `src/plugins/my-private-plugin[.js|/index.js]` +another-private-plugin # loads from `foo/index.js` + src foo +``` + + +## Authoring plugins + +Architect provides an end-to-end suite of workflows, conventions, and optimized defaults for building excellent serverless web apps and APIs with AWS. Architect plugins enable developers to extend (or override) this functionality in a variety of ways with interfaces into both workflows and resource creation. + + +- The Inventory object +- [Hooks for workflow lifecycles](#workflow-hooks) +- [Cloud resource generation](#resource-setters) + + +### Workflow hooks + +Workflow hooks enable developers to extend Architect workflows + +- `deploy` + - `start` - run arbitrary pre-deploy operations + customize CloudFormation (formerly `@macros`) + - `services` - hook into Architect's service discovery to create references to custom resources, or populate config data + - `target` - bypass CloudFormation deployment to AWS, and ship the project to an AWS intermediary + - `end` - run arbitrary post-deploy operations +- `sandbox` + - `start` - run arbitrary operations during Sandbox startup + - `watcher` - act on project filesystem events (e.g. `src/http/get-foo/auth.js` → `updated`) + - `end` - run arbitrary operations during Sandbox shutdown + + +### Resource setters + +Resource setters are small, synchronous methods that enable the rapid programmatic creation of various Architect resources, ranging from HTTP routes, to environment variables, to custom runtimes. + +Any Lambdas or resources defined by setters is treated by Architect as a first-class primitive, as though it was built into Architect itself. + +- Pragmas + - `events` - register async events + - `http` - register HTTP routes + - `queues` - register async event queues + - `scheduled` - register scheduled events + - `tables-streams` - register DynamoDB event streams + - `ws` - register WebSocket routes +- Resources + - `env` - register environment variables + - `customLambdas` - register bare Lambdas without a pre-associated event source + - `runtimes` - register custom runtimes + + +## Publishing plugins + +Should you opt to publish your plugin for others to use – and we hope you will! – they should be published to `npm` with the following naming convention: `arc-plugin-{your unique plugin name}`. + +Official plugins by Architect maintainers are published under the `@architect` org as `@architect/plugin-{plugin name}`. + + +## Macros + +Long-time Architect users may be familiar with macros (`@macros` – extensions that enable customization of CloudFormation at deploy time). Macros are forward-compatible with plugins, but are no longer the preferred way of customizing CloudFormation. + +**Existing macros will continue to work indefinitely; you do not need to update them to the new plugins API.** However, the macros API is no longer receiving updates, whereas the [`deploy.start` plugin API](./deploy) has new features that you may find helpful. + +[Learn more about porting existing macros to plugins](./porting-macros-to-plugins). + +If you have [existing macros](#macros), they can live side by side in their respective pragma (so long as plugins and macros do not have any conflicting names): + +```arc +@plugins +my-private-plugin + +@macros +my-private-macro +``` diff --git a/src/views/docs/en/guides/plugins/porting-macros-to-plugins.md b/src/views/docs/en/guides/plugins/porting-macros-to-plugins.md new file mode 100644 index 00000000..e69de29b diff --git a/src/views/docs/en/guides/plugins/sandbox.md b/src/views/docs/en/guides/plugins/sandbox.md new file mode 100644 index 00000000..e69de29b diff --git a/src/views/docs/en/guides/plugins/set.md b/src/views/docs/en/guides/plugins/set.md new file mode 100644 index 00000000..e69de29b diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index f7bb3a44..ecffbade 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -32,7 +32,14 @@ let Guides = [ 'Namecheap', 'One', ] - } + }, + ], + 'Plugins': [ + 'Overview', + 'deploy', + 'sandbox', + 'set', + 'Inventory', ], 'Extend': [ 'Custom CloudFormation', @@ -90,7 +97,7 @@ let About = [ ] module.exports = { - 'Get Started': GetStarted, + 'Get started': GetStarted, Guides, Reference, About, diff --git a/src/views/modules/document/html.js b/src/views/modules/document/html.js index 37221c27..71b3dd7d 100644 --- a/src/views/modules/document/html.js +++ b/src/views/modules/document/html.js @@ -70,7 +70,7 @@ ${Symbols} class=" mb1 font-semibold - text2 + text3 " > ${title} From 930eca3bf2232b0dc70678d0ec754922c8a11b14 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 11 Feb 2022 15:39:11 -0800 Subject: [PATCH 338/680] Add spellcheck plugin --- app.arc | 3 +++ src/plugins/spellcheck.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/plugins/spellcheck.js diff --git a/app.arc b/app.arc index 7dcb1bb3..455d8ca3 100644 --- a/app.arc +++ b/app.arc @@ -13,3 +13,6 @@ fingerprint true get /docs/:lang/* get /api/package any /* + +@plugins +spellcheck diff --git a/src/plugins/spellcheck.js b/src/plugins/spellcheck.js new file mode 100644 index 00000000..0f4ad0fa --- /dev/null +++ b/src/plugins/spellcheck.js @@ -0,0 +1,28 @@ +let { spawn } = require('child_process') +let pkg = require('../../package.json') +let cmd = pkg.scripts.spellcheck.split(' ') + +module.exports = { + sandbox: { + watcher: async ({ filename }) => { + if (!filename.endsWith('.md')) return + return new Promise((res) => { + console.log('Checking spelling...') + let spell = spawn(cmd[0], cmd.slice(1)) + let found = false + let log = data => { + if (!found) console.log('\nFound spelling or grammar error(s):') + found = true + console.log(data.toString()) + } + spell.stdout.on('data', log) + spell.stderr.on('data', log) + spell.on('close', code => { + if (!code) console.log('No spelling or grammar errors found!') + // Always resolve, errors should have been printed already + res() + }) + }) + } + } +} From 7089a034cc9ec342be0660c808ccb9941779fed0 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 14 Feb 2022 11:15:23 -0800 Subject: [PATCH 339/680] Add `plugins.deploy` doc Strip tags from title + description Tighten up tables Increase code block contrast --- public/css/syntax.css | 4 +- .../markdown-class-mappings.js | 16 +-- src/views/docs/en/guides/plugins/deploy.md | 112 ++++++++++++++++++ src/views/modules/document/head.js | 6 +- 4 files changed, 126 insertions(+), 12 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 513454a0..0d915eb7 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -51,13 +51,13 @@ word-break: break-word; /* fallback when hljs encounters unknown syntax */ color: var(--g2); - background-color: var(--g9); + background-color: var(--g10); } :root[data-theme="dark"] .docs pre { /* fallback when hljs encounters unknown syntax */ color: var(--g8); - background-color: var(--g1); + background-color: var(--g0); } .docs div[slot='content'] pre { diff --git a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js index 6eef6cbb..efb0f524 100644 --- a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js +++ b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js @@ -61,20 +61,20 @@ module.exports = { 'border1' ], th: [ - 'pt0', - 'pr1', - 'pl1', - 'pb0', + 'pt-3', + 'pr-3', + 'pl-3', + 'pb-3', 'border-solid', 'border1', 'border-g3', 'bg-g1' ], td: [ - 'pt0', - 'pr1', - 'pl1', - 'pb0', + 'pt-3', + 'pr-3', + 'pl-3', + 'pb-3', 'border-solid', 'border-g1', 'border1', diff --git a/src/views/docs/en/guides/plugins/deploy.md b/src/views/docs/en/guides/plugins/deploy.md index e69de29b..d67b6122 100644 --- a/src/views/docs/en/guides/plugins/deploy.md +++ b/src/views/docs/en/guides/plugins/deploy.md @@ -0,0 +1,112 @@ +--- +title: 'deploy plugins' +category: Plugins +description: 'deploy lifecycle hook plugins' +--- + +`deploy` lifecycle hook plugins expose functionality to extend the capabilities of Architect deployments. + + +## Plugin parameters + +All Deploy methods accept async or synchronous functions, and receive a single argument, which is an object containing the following properties: + +| Property | Type | Description | +|-------------------|---------|---------------------------------------------------| +| `arc` | object | Raw Architect project object | +| `cloudformation` | object | CloudFormation deployment | +| `dryRun` | boolean | `true` if `--dry-run` or `--eject` flags are used | +| `inventory` | object | Inventory object | +| `stage` | string | `testing`, `staging` or `production` | + + +## `deploy.start` + +Run arbitrary pre-deploy operations + customize CloudFormation. (This API is a descendant of `@macros` extensions, with added functionality, and within the broader plugins context.) + +Example: + +```js +// Do something only for staging deployments +module.exports = { deploy: { + start: async ({ arc, cloudformation, dryRun, inventory, stage }) => { + if (stage !== 'staging') return + + let config = await getSomeConfig() + cloudformation.Resources.whatever = config + // The returned mutated CloudFormation document will be passed to any other `deploy.start` plugins in sequence + return cloudformation + } +} } +``` + + +## `deploy.services` + +Hook into Architect's [service discovery](/docs/en/reference/runtime-helpers/node.js#arc.services) to create references to custom resources, or populate config data. Note: each returned service object can only store up to 4KB of data (as a string). + +Examples: + +```js +// Create some identifiers associated with custom S3 bucket credentials +module.exports = { deploy: { + services: async ({ arc, cloudformation, dryRun, inventory, stage }) => { + // If the user isn't using this plugin, you can just return + if (!arc['myS3Bucket']) return + + const { inv } = inventory + // Stage will equal 'testing' when run by Sandbox, otherwise will be `staging` or `production` in a `deploy` context + const isLocal = stage === 'testing' + const bucketName = `${inv.app}-newS3Bucket` + // Here we'll return both a string literal (`bucketName`) and resource identifiers to be populated by CloudFormation + return { + bucketName, + accessKey: isLocal ? 'local' : { Ref: 'MyS3BucketCreds' }, + secretKey: isLocal ? 'local' : { 'Fn::GetAtt': [ 'MyS3BucketCreds', 'SecretKey' ] } + } + } +} } +``` + +```js +// Make up fo 4KB of configuration data available for your Lambdas to fetch via arc.services() +module.exports = { deploy: { + services: async ({ arc, cloudformation, dryRun, inventory, stage }) => { + let config = await getSomeConfig() + return { config: JSON.stringify(config) } + } +} } +``` + + +## `deploy.target` + +Bypass CloudFormation deployment to AWS, and ship the project to an AWS intermediary or provider of your choosing. This endpoint enables Architect to be used to develop and deliver applications without relying solely on AWS CloudFormation. + +Example: + +```js +module.exports = { deploy: { + target: async ({ arc, cloudformation, dryRun, inventory, stage }) => { + if (dryRun) return + + deployToAnotherService({ inventory, stage }) + } +} } +``` + + +## `deploy.end` + +Run arbitrary post-deploy operations. + +Example: + +```js +const { rm } = require('fs/promises') +module.exports = { deploy: { + end: async ({ arc, cloudformation, dryRun, inventory, stage }) => { + await rm(someBuildArtifact) + } +} } +``` diff --git a/src/views/modules/document/head.js b/src/views/modules/document/head.js index bbda944b..1f2682b7 100644 --- a/src/views/modules/document/head.js +++ b/src/views/modules/document/head.js @@ -1,3 +1,5 @@ +let stripCode = str => str.replace(/\<\/?code\>/g, '') + export default function Head (props = {}) { let { category, description, lang = 'en', title } = props let descriptionContent = description || 'Architect documentation' @@ -13,8 +15,8 @@ export default function Head (props = {}) { - -${fullTitle} + +${stripCode(fullTitle)} From 78db0b6aca3dd2dd71cacfe63fa1aeeca6ecb7a8 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 14 Feb 2022 14:27:13 -0800 Subject: [PATCH 340/680] Add `plugins.sandbox` doc Fix header size --- public/css/syntax.css | 2 + src/views/docs/en/guides/plugins/deploy.md | 2 +- src/views/docs/en/guides/plugins/overview.md | 23 ++-- src/views/docs/en/guides/plugins/sandbox.md | 105 +++++++++++++++++++ 4 files changed, 119 insertions(+), 13 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 0d915eb7..adc21364 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -35,6 +35,8 @@ /* all code font family */ .docs pre code, .docs :not(pre) > code { font-family: Menlo, Monaco, Consolas, monospace; +} +.docs pre code, .docs :not(h1, h2, h3, h4, h5, h6) > code { font-size: 0.85rem; } .docs pre code { diff --git a/src/views/docs/en/guides/plugins/deploy.md b/src/views/docs/en/guides/plugins/deploy.md index d67b6122..4ad1667d 100644 --- a/src/views/docs/en/guides/plugins/deploy.md +++ b/src/views/docs/en/guides/plugins/deploy.md @@ -16,7 +16,7 @@ All Deploy methods accept async or synchronous functions, and receive a single a | `arc` | object | Raw Architect project object | | `cloudformation` | object | CloudFormation deployment | | `dryRun` | boolean | `true` if `--dry-run` or `--eject` flags are used | -| `inventory` | object | Inventory object | +| `inventory` | object | [Inventory](./inventory) object | | `stage` | string | `testing`, `staging` or `production` | diff --git a/src/views/docs/en/guides/plugins/overview.md b/src/views/docs/en/guides/plugins/overview.md index dea09e26..9fab157f 100644 --- a/src/views/docs/en/guides/plugins/overview.md +++ b/src/views/docs/en/guides/plugins/overview.md @@ -35,25 +35,24 @@ another-private-plugin # loads from `foo/index.js` Architect provides an end-to-end suite of workflows, conventions, and optimized defaults for building excellent serverless web apps and APIs with AWS. Architect plugins enable developers to extend (or override) this functionality in a variety of ways with interfaces into both workflows and resource creation. +To create a fresh plugin, you can run `npx arc create --plugin my-plugin-name` -- The Inventory object -- [Hooks for workflow lifecycles](#workflow-hooks) -- [Cloud resource generation](#resource-setters) +Learn more about [hooks for workflow lifecycles](#workflow-hooks) and [cloud resource generation](#resource-setters) below. ### Workflow hooks Workflow hooks enable developers to extend Architect workflows -- `deploy` - - `start` - run arbitrary pre-deploy operations + customize CloudFormation (formerly `@macros`) - - `services` - hook into Architect's service discovery to create references to custom resources, or populate config data - - `target` - bypass CloudFormation deployment to AWS, and ship the project to an AWS intermediary - - `end` - run arbitrary post-deploy operations -- `sandbox` - - `start` - run arbitrary operations during Sandbox startup - - `watcher` - act on project filesystem events (e.g. `src/http/get-foo/auth.js` → `updated`) - - `end` - run arbitrary operations during Sandbox shutdown +- [`deploy`](./deploy) + - [`start`](./deploy#deploy.start) - run arbitrary pre-deploy operations + customize CloudFormation (formerly `@macros`) + - [`services`](./deploy#deploy.services) - hook into Architect's service discovery to create references to custom resources, or populate config data + - [`target`](./deploy#deploy.target) - bypass CloudFormation deployment to AWS, and ship the project to an AWS intermediary + - [`end`](./deploy#deploy.end) - run arbitrary post-deploy operations +- [`sandbox`](./sandbox) + - [`start`](./sandbox#sandbox.start) - run arbitrary operations during Sandbox startup + - [`watcher`](./sandbox#sandbox.watcher) - act on project filesystem events (e.g. `src/http/get-foo/auth.js` → `updated`) + - [`end`](./sandbox#sandbox.end) - run arbitrary operations during Sandbox shutdown ### Resource setters diff --git a/src/views/docs/en/guides/plugins/sandbox.md b/src/views/docs/en/guides/plugins/sandbox.md index e69de29b..cb58818d 100644 --- a/src/views/docs/en/guides/plugins/sandbox.md +++ b/src/views/docs/en/guides/plugins/sandbox.md @@ -0,0 +1,105 @@ +--- +title: 'sandbox plugins' +category: Plugins +description: 'sandbox lifecycle hook plugins' +--- + +`sandbox` lifecycle hook plugins expose functionality to extend the capabilities of Sandbox, Architect's local development environment. + + +## `sandbox.start` + +Run arbitrary operations during Sandbox startup. At the time of `sandbox.start` execution, all core Sandbox services are guaranteed to be running. + +> This method is similar to [`@sandbox-startup` scripts](/docs/en/reference/configuration/local-preferences#%40sandbox-startup), but authored in JS, and controlled entirely via plugin. If in doubt, we suggest using `sandbox.start` over [`@sandbox-startup` scripts. + +`sandbox.start` plugins are either async or synchronous functions, and receive a single argument, which is an object containing the following properties: + +| Property | Type | Description | +|-------------|-----------------|------------------------------------ | +| `arc` | object | Raw Architect project object | +| `inventory` | object | [Inventory](./inventory) object | +| `invoke` | async function | [Invoke a Lambda](#invoke-function) | + +Example: + +```js +let { readFile } = require('fs/promises') +// Invoke a scheduled event whenever its business logic changes +module.exports = { sandbox: { + start: async ({ arc, inventory, invoke }) => { + await loadDatabaseMock() + await seedLocalDatabase() + console.log('Seeded database!') + } +} } +``` + + +## `sandbox.watcher` + +Run arbitrary operations on filesystem events within your project. By default, the watcher ignores changes to `vendor`, `node_modules`, `.git`, and other such files. + +`sandbox.watcher` plugins are either async or synchronous functions, and receive a single argument, which is an object containing the following properties: + +| Property | Type | Description | +|-------------|-----------------|-----------------------------------------------------| +| `filename` | string | Absolute path of the project file that was changed | +| `event` | string | One of `add`, `update`, or `remove` | +| `inventory` | object | [Inventory](./inventory) object | +| `invoke` | async function | [Invoke a Lambda](#invoke-function) | + + +## `sandbox.end` + +Run arbitrary operations on Sandbox shutdown. `sandbox.end` plugins are executed just prior to all core Sandbox services being shut down. + +`sandbox.end` plugins are either async or synchronous functions, and receive a single argument, which is an object containing the following properties: + +| Property | Type | Description | +|-------------|-----------------|-------------------------------------| +| `arc` | object | Raw Architect project object | +| `inventory` | object | [Inventory](./inventory) object | +| `invoke` | async function | [Invoke a Lambda](#invoke-function) | + + +## Invoke function + +Sandbox plugins are provided an async `invoke` function capable of arbitrarily executing any Lambda in the project (including Lambdas created by plugins with [`set` methods](./set)). Invocations must include the following properties: + +| Property | Type | Description | +|-----------|---------|-------------------------------------------------------------| +| `pragma` | string | The pragma of the Lambda, without `@` (e.g. `http`) | +| `name` | string | Inventory name of the Lambda being invoked (e.g. `get /foo` | +| `payload` | object | Payload to invoke with; an empty object (`{}`) is allowed | + +Examples: + +Assuming an `app.arc` file with the following: + +```arc +@app +my-app + +@scheduled +my-scheduled-event rate(1 day) +``` + +Your `my-scheduled-event` Lambda could be invoked locally on demand like so: + +```js +let { readFile } = require('fs/promises') +// Invoke a scheduled event whenever its business logic changes +module.exports = { sandbox: { + watcher: async ({ filename, event, inventory, invoke }) => { + if (filename.includes('src/scheduled/my-scheduled-event')) { + let rawPayload = await readFile('test/fixtures/event-payload.json') + invoke({ + pragma: 'scheduled', + name: 'my-scheduled-event', + payload: JSON.parse(rawPayload), + }) + } + } +} } +``` From 61627ed825bc13154a27761d33e07b2504b45a07 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 14 Feb 2022 14:50:51 -0800 Subject: [PATCH 341/680] Update dictionary, tidy up words --- package-lock.json | 2 +- scripts/spellcheckerrc.json | 2 +- src/views/docs/en/about/contribute.md | 9 +++++---- src/views/docs/en/about/upgrade-guide.md | 6 +++--- src/views/docs/en/guides/backend/persist-data.md | 2 +- src/views/docs/en/guides/frontend/sessions.md | 2 +- src/views/docs/en/guides/frontend/single-page-apps.md | 2 +- src/views/docs/en/reference/project-manifest/shared.md | 2 +- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 951d9d61..1dc222fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -270,7 +270,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#b248170fef491887c8a03a606358c4effe9af9b9", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#fd456df1d50c277fe5ed730d7bcb6a5f763e6a9a", "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, diff --git a/scripts/spellcheckerrc.json b/scripts/spellcheckerrc.json index fcc9edf9..8c92fe42 100644 --- a/scripts/spellcheckerrc.json +++ b/scripts/spellcheckerrc.json @@ -4,7 +4,7 @@ "noSuggestions": true, "dictionaries": [ "./scripts/dictionary.txt", - "./node_modules/@architect/spellcheck-dictionary/dictionary.txt" + "./node_modules/@architect/spellcheck-dictionary/index.js" ], "plugins": [ "spell", diff --git a/src/views/docs/en/about/contribute.md b/src/views/docs/en/about/contribute.md index 5c332a62..ac18b72b 100644 --- a/src/views/docs/en/about/contribute.md +++ b/src/views/docs/en/about/contribute.md @@ -12,24 +12,25 @@ By participating in and contributing to the Architect community — including, b Lack of familiarity with this Code of Conduct is not an excuse for not adhering to it. + ## Project Code Structure The Architect project distribution code is bundled in [`architect/architect`](https://github.com/architect/architect) which also serves as the [primary project issue tracker](https://github.com/architect/architect/issues). The Architect project is composed of multiple core code repositories on GitHub: -- [`architect/parser`](https://github.com/architect/parser) - parser/lexer for arcfile formats (`.arc`, `app.arc`, `arc.json`, `arc.yaml`, and `arc.yml`) +- [`architect/parser`](https://github.com/architect/parser) - parser/lexer for Architect project manifest formats (`app.arc`, `.arc`, `arc.json`, `arc.yaml`, and `arc.yml`) - [`architect/package`](https://github.com/architect/package) - a pure function that consumes `architect/parser` output and returns a CloudFormation document - [`architect/deploy`](https://github.com/architect/deploy) - a wrapper for the AWS CLI `package` and `deploy` commands - [`architect/sandbox`](https://github.com/architect/sandbox) - the local sandbox (mocks API Gateway, SNS, SQS, DynamoDB, and Lambda) -- [`architect/env`](https://github.com/architect/env) - read/write arcfile project environment variables with SSM -- [`architect/hydrate`](https://github.com/architect/hydrate) - ensures function deps are synced (including src/shared and src/views) +- [`architect/env`](https://github.com/architect/env) - read/write project environment variables with SSM +- [`architect/hydrate`](https://github.com/architect/hydrate) - ensures function deps are synced (including `src/shared` and `src/views`) - [`architect/logs`](https://github.com/architect/logs) - read/write function CloudWatch logs - [`architect/create`](https://github.com/architect/create) - code generation Projects built with Architect are encouraged to use the following runtime helper libraries: -- [`architect/functions`](https://github.com/architect/functions) - runtime helpers for NodeJS +- [`architect/functions`](https://github.com/architect/functions) - runtime helpers for Node.JS - [`architect/functions-python`](https://github.com/architect/functions-python) - runtime helpers for Python - [`architect/functions-ruby`](https://github.com/architect/functions-ruby) - runtime helpers for Ruby diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index 0eef717b..6f5cd3b6 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -724,7 +724,7 @@ exports.handler = arc.http(log, route) 1. Open up IAM in the AWS Console 2. Select **Roles** → **arc-role** 3. Click **Attach Policies** -4. Select **AWSLambdaSQSQueueExecutionRole** +4. Select **`AWSLambdaSQSQueueExecutionRole`** 5. Click **Attach Policy** Now existing functions can publish to SQS queues. @@ -737,9 +737,9 @@ If the command line is more your style you can upgrade with the following: aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole --role-name arc-role ``` -**With NodeJS** +**With Node.js** -If you prefer to script this upgrade you can use the NodeJS `aws-sdk`: +If you prefer to script this upgrade you can use the Node.js `aws-sdk`: ```javascript let aws = require('aws-sdk') diff --git a/src/views/docs/en/guides/backend/persist-data.md b/src/views/docs/en/guides/backend/persist-data.md index 9d257e2c..3a6b5b49 100644 --- a/src/views/docs/en/guides/backend/persist-data.md +++ b/src/views/docs/en/guides/backend/persist-data.md @@ -694,7 +694,7 @@ module.exports = async function getNotes(email) { } ``` -Now that we've got the form, let's implement the POST handler. We'll use the [hashids](https://hashids.org/) library to help create keys for our notes. +Now that we've got the form, let's implement the POST handler. We'll use the [`hashids`](https://hashids.org/) library to help create keys for our notes. ```bash cd src/http/post-notes diff --git a/src/views/docs/en/guides/frontend/sessions.md b/src/views/docs/en/guides/frontend/sessions.md index c507c313..89147a6a 100644 --- a/src/views/docs/en/guides/frontend/sessions.md +++ b/src/views/docs/en/guides/frontend/sessions.md @@ -30,7 +30,7 @@ In this tutorial, we will go over several ways to store session state within you All `@http` defined routes are session capable via `@architect/functions`. -- Requests are tagged to a session via a stateless, signed, encrypted, httpOnly cookie `_idx` +- Requests are tagged to a session via a stateless, signed, encrypted, `httpOnly` cookie `_idx` - Session data expires after a week of inactivity This allows you to write fully stateful applications despite Lambda functions being completely stateless. diff --git a/src/views/docs/en/guides/frontend/single-page-apps.md b/src/views/docs/en/guides/frontend/single-page-apps.md index 4033d97c..b398feb8 100644 --- a/src/views/docs/en/guides/frontend/single-page-apps.md +++ b/src/views/docs/en/guides/frontend/single-page-apps.md @@ -131,7 +131,7 @@ Architect supports the following transform plugins: - `@architect/proxy-plugin-css-urls` adds `/staging` or `/production` to CSS `@imports` statements - `@architect/proxy-plugin-mjs-urls` adds `/staging` or `/production` to JS module `import` statements -- **esmodules** +- **ES modules** - `@architect/proxy-plugin-bare-imports` map bare imports to fully qualified URLs - **syntax transpilers** diff --git a/src/views/docs/en/reference/project-manifest/shared.md b/src/views/docs/en/reference/project-manifest/shared.md index 8123a631..9bc26975 100644 --- a/src/views/docs/en/reference/project-manifest/shared.md +++ b/src/views/docs/en/reference/project-manifest/shared.md @@ -1,7 +1,7 @@ --- title: '@shared' category: app.arc -description: Configure src/shared code +description: Configure src/shared code --- Configure the location of shared code. From 2333d5ca086c06bf34634c5470b2588fb58956d3 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 14 Feb 2022 16:03:38 -0800 Subject: [PATCH 342/680] Add markdown ->
      styling Vendor unmaintained `markdown-it-class` to fix
      bug --- package-lock.json | 5 --- package.json | 1 - .../markdown-class-mappings.js | 7 ++++ .../markdown-class.js | 32 +++++++++++++++++++ .../get-docs-000lang-catchall/renderer.js | 2 +- src/views/docs/en/guides/plugins/deploy.md | 2 +- .../en/reference/runtime-helpers/node.js.md | 24 +++++++------- 7 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 src/http/get-docs-000lang-catchall/markdown-class.js diff --git a/package-lock.json b/package-lock.json index 1dc222fc..b8115794 100644 --- a/package-lock.json +++ b/package-lock.json @@ -518,11 +518,6 @@ "defer-to-connect": "^1.0.1" } }, - "@toycode/markdown-it-class": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz", - "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ==" - }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", diff --git a/package.json b/package.json index a4f74555..d0e52c11 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ "@architect/inventory": "^3.0.0-RC.10", "@architect/package": "^8.0.0-RC.2", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", - "@toycode/markdown-it-class": "^1.2.4", "esm": "^3.2.25", "front-matter": "^4.0.2", "highlight.js": "^11.4.0", diff --git a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js index efb0f524..247b026e 100644 --- a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js +++ b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js @@ -48,6 +48,13 @@ module.exports = { 'text-p1', 'text-h1' ], + hr: [ + 'mt3', + 'mb3', + 'border-solid', + 'border0', + 'border-b1', + ], strong: [ 'font-semibold', 'text-g9' diff --git a/src/http/get-docs-000lang-catchall/markdown-class.js b/src/http/get-docs-000lang-catchall/markdown-class.js new file mode 100644 index 00000000..156c6f1a --- /dev/null +++ b/src/http/get-docs-000lang-catchall/markdown-class.js @@ -0,0 +1,32 @@ +// Copyright 2018 Hiroshi Okada + +let mapping = {} + +const splitWithSpace = s => (s ? s.split(' ') : []) + +const toArray = a => (Array.isArray(a) ? a : [ a ]) + +function parseTokens (tokens) { + tokens.forEach(token => { + if (mapping[token.tag] && /(_open$|image)/.test(token.type) || token.type === 'hr') { + const orig = splitWithSpace(token.attrGet('class')) + const addition = toArray(mapping[token.tag]) + token.attrSet('class', [ ...orig, ...addition ].join(' ')) + } + if (token.children) { + parseTokens(token.children) + } + }) +} + + +function parseState (state) { + parseTokens(state.tokens) +} + +function markdownitTagToClass (md, _mapping) { + mapping = _mapping || {} + md.core.ruler.push('markdownit-tag-to-class', parseState) +} + +module.exports = markdownitTagToClass diff --git a/src/http/get-docs-000lang-catchall/renderer.js b/src/http/get-docs-000lang-catchall/renderer.js index 965c19e5..ea73c605 100644 --- a/src/http/get-docs-000lang-catchall/renderer.js +++ b/src/http/get-docs-000lang-catchall/renderer.js @@ -1,7 +1,7 @@ const { escape } = require('querystring') const frontmatter = require('front-matter') const Markdown = require('markdown-it') -const markdownClass = require('@toycode/markdown-it-class') +const markdownClass = require('./markdown-class') const markdownExternalAnchor = require('markdown-it-external-anchor') const markdownToC = require('markdown-it-toc-and-anchor').default diff --git a/src/views/docs/en/guides/plugins/deploy.md b/src/views/docs/en/guides/plugins/deploy.md index 4ad1667d..8d64d7ae 100644 --- a/src/views/docs/en/guides/plugins/deploy.md +++ b/src/views/docs/en/guides/plugins/deploy.md @@ -9,7 +9,7 @@ description: 'deploy lifecycle hook plugins' ## Plugin parameters -All Deploy methods accept async or synchronous functions, and receive a single argument, which is an object containing the following properties: +All `deploy` methods accept async or synchronous functions, and receive a single argument, which is an object containing the following properties: | Property | Type | Description | |-------------------|---------|---------------------------------------------------| diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index a9c8c4bf..fef59cfa 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -11,7 +11,7 @@ Architect has two primary runtime helpers for Node.js: - [`@architect/functions`](#%40architect%2Ffunctions) - General purpose runtime helpers for various Architect resources, such as `@events`, `@http`, `@tables`, etc. - [`@architect/asap`](#%40architect%2Fasap) - Helper designed solely for delivering static assets via `@http` endpoints -
      +--- ## `@architect/functions` @@ -99,7 +99,7 @@ arc.events.publish({ }, (err) => console.log) ``` -
      +--- ### `arc.http` @@ -224,7 +224,7 @@ function handler(req, res) { } ``` -
      +--- #### `arc.http.async()` @@ -270,7 +270,7 @@ async function handler(req) { } ``` -
      +--- #### `arc.http.express()` @@ -287,7 +287,7 @@ app.get('/cool', (req, res)=> res.send('very cool')) exports.handler = arc.http.express(app) ``` -
      +--- #### `arc.http.session` @@ -325,7 +325,7 @@ exports.handler = async function handler (req) { } ``` -
      +--- ### `arc.queues` @@ -385,7 +385,7 @@ arc.queues.publish({ }, (err) => console.log) ``` -
      +--- ### `arc.services()` @@ -397,7 +397,7 @@ CloudFormation resources are generated with names more friendly for machines tha This object is lazily-loaded and cached, and thus the first call may incur a delay as the service map is populated (use of [`arc.events`](#arc.events), [`arc.queues`](#arc.queues) and [`arc.tables`](#arc.tables) transparently uses this method in the background). -`arc.services` returns a service map object, with keys equaling any out-of-the-box Architect infrastructure types or plugins used by the Architect application. +`arc.services` returns a service map object, with keys equaling any out-of-the-box Architect infrastructure types or plugins used by the Architect application. An example service map for an application composed of `@static`, `@events` and an `imagebucket` plugin would have the following structure: @@ -426,7 +426,7 @@ let services = await arc.services() */ ``` -
      +--- ### `arc.static()` @@ -447,7 +447,7 @@ let js = arc.static('/index.js', { stagePath: true }) // '/staging/_static/index-b2c3d4.js' ``` -
      +--- ### `arc.tables()` @@ -576,7 +576,7 @@ await client._doc.transactWrite({ }) ``` -
      +--- ### `arc.ws` @@ -636,7 +636,7 @@ let arc = require('@architect/functions') let wsApi = await arc.ws._api() ``` -
      +--- ## `@architect/asap` From 7a320db9349e86fb81b451b14f9ce6a8ab6e63a9 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 14 Feb 2022 19:51:44 -0800 Subject: [PATCH 343/680] Add `plugins.set` doc --- package-lock.json | 2 +- src/views/docs/en/guides/plugins/set.md | 444 ++++++++++++++++++++++++ 2 files changed, 445 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index b8115794..5247f7c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -270,7 +270,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#fd456df1d50c277fe5ed730d7bcb6a5f763e6a9a", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#d5e4b991c3e7838a0a5728a98a38060b7d8627e9", "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, diff --git a/src/views/docs/en/guides/plugins/set.md b/src/views/docs/en/guides/plugins/set.md index e69de29b..79b218cc 100644 --- a/src/views/docs/en/guides/plugins/set.md +++ b/src/views/docs/en/guides/plugins/set.md @@ -0,0 +1,444 @@ +--- +title: 'set plugins' +category: Plugins +description: 'set cloud resource generator plugins' +--- + +`set` plugins generate various kinds of resources for Architect projects. Resource setters are small, synchronous methods that can create many common kinds of resources, from HTTP routes, to environment variables, to custom runtimes. + +Any Lambdas or resources defined by a `set` plugin is treated by Architect as a first-class primitive. For example: if you build a plugin that creates a route with `set.http`, Architect would treat that route as though the user had actually added it to their [project manifest](/docs/en/get-started/project-manifest)'s [`@http` pragma](/docs/en/reference/project-manifest/http). + + +### Caveats + +Unlike [workflow lifecycle plugins](./overview#workflow-hooks), which execute only when needed, all `set` plugins must execute every time Architect (or any of its modules) run. Thus, they are expected to be synchronous and fast. + +Because of this, we advise against such things as filesystem reads and writes from within `set` plugins. Definitely do not start services, or run large, CPU intensive operations from within `set` plugins. + +Additionally, it is worth noting that `set` plugins are among the very first things to run in any Architect execution. Because they are run before the rest of the project been enumerated, they are not passed a complete [Inventory](./inventory) object. If your plugin requires knowledge of your project, please access the `arc` property. + + +## Plugin parameters + +All `set` methods are synchronous functions, and receive a single argument, which is an object containing the following properties: + +| Property | Type | Description | +|-------------|---------|---------------------------------------------------| +| `arc` | object | Raw Architect project object | +| `inventory` | object | Partial [Inventory](./inventory) object | + + +## Valid returns + +All `set` methods can return a single resource object, or an array of resource objects. + +There is no limit to the number of resources a `set` plugin can return, however AWS does have limits on the number of resources in a CloudFormation deployment (and a hard cap on the size of a given CloudFormation document). + +Generated resources that require a `src` property accept an absolute or relative file path. Additionally, file paths will be automatically platform normalized (so you do not have to use `path.join()` for other platforms if you're publicly publishing your plugin). + +By default, Lambdas created by the `set` API are assumed to run the latest version of Node.js ([unless configured otherwise](#lambda.config)) + +--- + +# Pragmas + +## `set.events` + +Register async events (as in the `@events` pragma). Return a single object or an array of objects with the following properties: + +| Property | Type | Description | +|-----------|---------|-------------------------------------------------| +| `name` | string | Event name (follows [`@events` syntax][events]) | +| `src` | string | Absolute or relative file path to the handler | + +Example: + +```js +// Return a single async event +module.exports = { set: { + events: ({ arc, inventory }) => { + return { + name: 'an-async-event', + src: __dirname + '/handler' // Points to a handler dir inside the plugin + } + } +} } +``` + + +## `set.http` + +Register HTTP routes (as in the `@http` pragma). Return a single object or an array of objects with the following properties: + +| Property | Type | Description | +|-----------|---------|-------------------------------------------------| +| `method` | string | HTTP method (follows [`@http` syntax][http]) | +| `path` | string | HTTP path (follows [`@http` syntax][http]) | +| `src` | string | Absolute or relative file path to the handler | + +Example: + +```js +// Return multiple HTTP routes +module.exports = { set: { + http: ({ arc, inventory }) => { + let src = __dirname + '/handler' // Multiple Lambdas can use the same handler + return [ + { method: 'get', path: '/foo', src }, + { method: 'put', name: '/bar', src } + ] + } +} } +``` + + +## `set.queues` + +Register async event queues (as in the `@queues` pragma). Return a single object or an array of objects with the following properties: + +| Property | Type | Description | +|-----------|---------|-------------------------------------------------| +| `name` | string | Event name (follows [`@queues` syntax][queues]) | +| `src` | string | Absolute or relative file path to the handler | + +Example: + +```js +// Return a single async event queue +module.exports = { set: { + queues: ({ arc, inventory }) => { + return { + name: 'a-queue', + src: __dirname + '/handler' // Points to a handler dir inside the plugin + } + } +} } +``` + + +## `set.scheduled` + +Register scheduled event (as in the `@scheduled` pragma). Return a single object or an array of objects with the following properties: + +| Property | Type | Description | +|-----------|---------|---------------------------------------------------------------------| +| `name` | string | Event name (follows [`@scheduled` syntax][scheduled]) | +| `rate` | string | [Rate expression][sched-expr], cannot be used with `cron` property | +| `cron` | string | [Cron expression][sched-expr], cannot be used with `rate` property | +| `src` | string | Absolute or relative file path to the handler | + +> Note: unlike in `@scheduled` pragma use, `rate` + `cron` properties should not be returned in parenthesis. + +Example: + +```js +// Return two scheduled events: one using rate syntax, and one using cron syntax +module.exports = { set: { + scheduled: ({ arc, inventory }) => { + let src = __dirname + '/handler' + return [ + { + name: 'scheduled-using-rate', + rate: '1 day', + src, + }, + { + name: 'scheduled-using-cron', + cron: '15 10 * * ? *', + src, + } + ] + } +} } +``` + + +## `set['tables-streams']` + +Register DynamoDB event streams (as in the `@tables-streams` pragma). Return a single object or an array of objects with the following properties: + +| Property | Type | Description | +|-----------|---------|-----------------------------------------------------------------| +| `name` | string | Event name (follows [`@tables-streams` syntax][tables-streams]) | +| `table` | string | Logical DynamoDB table name (as in your project manifest) | +| `src` | string | Absolute or relative file path to the handler | + +Example: + +```js +// Return a single table stream +module.exports = { set: { + 'tables-streams': ({ arc, inventory }) => { + return { + name: 'a-table-stream-event', + table: 'my-logical-table-name', + src: __dirname + '/handler' // Points to a handler dir inside the plugin + } + } +} } +``` + + +## `set.ws` + +Register WebSocket routes (as in the `@ws` pragma). Return a single object or an array of objects with the following properties: + +| Property | Type | Description | +|-----------|---------|-----------------------------------------------| +| `name` | string | Route name (follows [`@ws` syntax][ws]) | +| `src` | string | Absolute or relative file path to the handler | + +> Note: WebSockets is required to have three default routes (`$connect`, `$disconnect`, `$default`), which Architect populates with the addition of the `@ws` pragma. If the consumer of your plugin does not specify `@ws` in their manifest, using `set.ws` will infer it for them; you should not attempt to return any of the default routes in your `set.ws` plugin. + +Example: + +```js +// Return a single WebSocket route +module.exports = { set: { + ws: ({ arc, inventory }) => { + return { + name: 'refresh', + src: __dirname + '/handler' // Points to a handler dir inside the plugin + } + } +} } +``` + + +--- + +# Resources + + +## `set.env` + +Register environment variables for all Lambdas. To create an environment variable for all Lambdas, return an object with names and values. To create an environment variable specific to Architect's built in `testing`, `staging`, and `production` environments, return an object containing one or more of those properties, each containing an object with names and value. + +> Note: if an object or array is passed as a value, the `set.env` API will automatically JSON-serialize it into your environment variable. + +Examples: + +```js +// Return an environment variable for all Lambdas +module.exports = { set: { + env: ({ arc, inventory }) => { + return { + API_SECRET: process.env.API_SECRET // Handy for exporting secrets in CI/CD + } + } +} } +``` + +```js +// Return a different environment variables for different stages +module.exports = { set: { + env: ({ arc, inventory }) => { + return { + testing: { + API_SECRET: 'dummy-key' + }, + staging: { + API_SECRET: process.env.API_SECRET + }, + production: { + API_SECRET: process.env.API_SECRET + }, + } + } +} } +``` + + +## `set.customLambdas` + +Register bare Lambdas without a pre-associated event source. `set.customLambdas` pairs nicely with [`deploy.start`](./deploy#deploy-start), where you can customize a custom Lambda's event source in CloudFormation. Return a single object or an array of objects with the following properties: + +| Property | Type | Description | +|-----------|---------|-------------------------------------------------| +| `name` | string | Bare Lambda name | +| `src` | string | Absolute or relative file path to the handler | + +Example: + +```js +// Return a single async event +module.exports = { set: { + customLambdas: ({ arc, inventory }) => { + return { + name: 'a-custom-lambda', + src: __dirname + '/handler' // Points to a handler dir inside the plugin + } + } +} } +``` + + +## `set.runtimes` + +Register custom runtimes for Lambdas. Return a single object or an array of objects. Each runtime type has its own set of requirements; `transpiled` is currently supported, [`compiled` + `interpeted` are coming soon](https://github.com/architect/architect/issues/1295). + +### `transpiled` + +A transpiled runtime assumes a source tree is authored per Architect's typical project structure, with some form of transpilation step that results in build artifacts in a dist directory composed in an interpreted language (such as JavaScript). + +For example, using [Architect TypeScript](https://github.com/architect/plugin-typescript), the `get /foo` handler is authored in `src/http/get-foo/index.ts`, and automatically transpiled to (and run / deployed from) `build/http/get-foo/index.js`. + +| Property | Type | Required | Description | +|---------------|---------|-----------|-----------------------------------------------| +| `name` | string | Yes | Custom runtime name | +| `type` | string | Yes | Must be `transpiled` | +| `baseRuntime` | string | Yes | Lambda [runtime identifier or alias][runtime] | +| `build` | string | No | Relative build dir path; defaults to `build` | + +> Note: Architect's built in [shared code affordances](/docs/en/guides/developer-experience/sharing-code) are permanently disabled for transpiled output. + +Example: + +```js +// Enable a custom build directory with a custom runtime pragma (`@typescript`) +module.exports = { set: { + runtime: ({ arc, inventory }) => { + let { arc } = inventory.inv._project + let build = '.build' + if (arc.typescript) { + arc.typescript.forEach(s => { + if (Array.isArray(s) && s[0] === 'build' && typeof s[1] === 'string') { + build = s[1] + } + }) + } + return { + name: 'typescript', + type: 'transpiled', + baseRuntime: 'nodejs14.x', + build, + } + } +} } +``` + +--- + +## Advanced usage + +### `lambda.config` + +Lambdas created by `set` plugins are treated like any other Lambda in the system, which means they are subject to project defaults. This may be convenient: if the project using your Node.js handler created by a `set` plugin is also by default Node.js, you don't have to do anything. + +However, if you are publishing your project publicly, you cannot assume all consumers of your plugin are running the same runtime as you. In this case, and other cases where greater customization and specificity is required, you should include a `config` property in your `set` Lambdas. + +Any of the `set` APIs that create Lambdas (`events`, `http`, `customLambdas`, etc.) accept an optional `config` object with named properties (and values) that are the same as those found in [function config](/docs/en/reference/configuration/function-config). + +These include: `runtime`, `memory`, `timeout`, `concurrency`, `architecture`, and more, and are subject to the same limitations as any other Lambda (e.g. if specifying `layers`, only 5 may be specified, and they must be in the same region as the app is deployed). + +Example: + +```js +// Returning this event Lambda assumes user project defaults > Architect defaults +// If the project specifies `@aws runtime python3.9`, and your handler is JS, it will not run +module.exports = { set: { + events: ({ arc, inventory }) => { + return { + name: 'an-async-event', + src: __dirname + '/handler' + } + } +} } +``` + +```js +// Returning a `config` property provides control over the configuration of the returned Lambda +module.exports = { set: { + events: ({ arc, inventory }) => { + return { + name: 'an-async-event', + src: __dirname + '/handler', + config: { + runtime: 'nodejs14.x', + memory: 3008, // in MB + timeout: 10, // in seconds + } + } + } +} } +``` + + +### Where `set` Lambdas can live + +Like those created by modifying a project manifest, Lambdas (and their handlers) specified by `set` plugins can live in the user's project. We'll call those [userland Lambdas](#userland-lambdas). + +However, `set` plugins can also point to prepackaged functions and live inside a published plugin that do not allow for customization, because they're intended to do a specific job on behalf of the plugin consumer. We'll call those [pluginland Lambdas](#pluginland-lambdas). + +Let's take a look at some examples of how this might work. + + +#### Userland Lambdas + +Say you're writing a plugin called `local-s3`, which attaches Lambdas to specific S3 events. Your users need to be able to define and maintain the logic executed by S3 event Lambdas provisioned by your plugin. You may ask your user to update their project to define some handlers in a new custom pragma (`@local-s3`): + +```arc +@plugins +local-s3 + +@local-s3 +create +update +delete +``` + +Since these Lambdas live in userland, `set.customLambdas` method might look something like this: + +```js +module.exports = { set: { + customLambdas: ({ arc, inventory }) => { + let localS3 = arc['local-s3'] + if (!localS3 || !Array.isArray(localS3)) return + + // Create an abritrary number of plugins from the Arc manifest + let lambdas = localS3.map((item) => { + let name = item[0] + return { + name, + src: `src/local-s3/${name}` + } + }) + return lambdas + } +} } +``` + +This approach puts the Lambdas squarely in the realm of your plugin consumers, and empowers them to make customize the resources you're managing with the plugin. + + +#### Pluginland Lambdas + +Now let's say you're writing a plugin called `autobundle` to accomplish a specific task: automatically bundling JS from your project's [views directory](/docs/en/guides/developer-experience/sharing-code) at `get /_bundle/:entry`. Your users expect to consume this plugin like any other dependency, having it dropped right in and fully maintained by the plugin author. + +Assuming you published your project as `arc-plugin-autobundle`, you might want your `set` plugin to look something like this: + +```js +// node_modules/arc-plugin-autobundle/index.js +module.exports = { set: { + http: ({ arc, inventory }) => { + return { + method: 'get', + path: 'get /_bundle/:entry', + // Assuming a handler at `node_modules/arc-plugin-autobundle/handler/index.js` + src: __dirname + '/handler' + } + } +} } +``` + +Returning the Lambda above, Architect will look for your `autobundle` Lambda handler at `node_modules/arc-plugin-autobundle/handler/index.js`. Should your handler have its own dependencies, you must declare them in your plugin's `package.json` file. + + +[events]: /docs/en/reference/project-manifest/events#syntax +[http]: /docs/en/reference/project-manifest/http#syntax +[queues]: /docs/en/reference/project-manifest/queues#syntax +[scheduled]: /docs/en/reference/project-manifest/scheduled#syntax +[tables-streams]: /docs/en/reference/project-manifest/tables-streams#syntax +[ws]: /docs/en/reference/project-manifest/ws#syntax +[sched-expr]: https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html +[runtime]: /docs/en/reference/configuration/function-config#runtime From be6787157671e177271e0c454bc31a3ea1ff4822 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 14 Feb 2022 19:53:58 -0800 Subject: [PATCH 344/680] Update inaccurate pragma syntax / validation notes --- src/views/docs/en/:tutorials/configuring-aws.md | 2 +- .../docs/en/get-started/detailed-aws-setup.md | 2 +- .../docs/en/guides/backend/event-functions.md | 10 +++++----- .../docs/en/guides/backend/queue-functions.md | 8 +++----- .../docs/en/guides/backend/scheduled-functions.md | 7 ++++--- src/views/docs/en/guides/backend/tables.md | 10 ++++++---- .../docs/en/guides/frontend/http-functions.md | 2 +- .../docs/en/reference/project-manifest/app.md | 6 +++--- .../docs/en/reference/project-manifest/events.md | 14 +++++++------- .../docs/en/reference/project-manifest/http.md | 11 ++++++----- .../docs/en/reference/project-manifest/queues.md | 7 ++++--- .../en/reference/project-manifest/scheduled.md | 13 +++++-------- .../docs/en/reference/project-manifest/shared.md | 5 +---- .../docs/en/reference/project-manifest/tables.md | 6 +++--- 14 files changed, 50 insertions(+), 53 deletions(-) diff --git a/src/views/docs/en/:tutorials/configuring-aws.md b/src/views/docs/en/:tutorials/configuring-aws.md index a9b80a45..a3613a0f 100644 --- a/src/views/docs/en/:tutorials/configuring-aws.md +++ b/src/views/docs/en/:tutorials/configuring-aws.md @@ -101,7 +101,7 @@ Architect supports the following runtime versions: - **Ruby**: `2.7` using `bundle` - **Deno**: `1.6.x` ([under development](../reference/runtime-helpers/deno)) -> ⚠️ Working locally with the Architect `sandbox` requires target runtimes to be available in your `$PATH`. +> ⚠️ Working locally with the Sandbox requires target runtimes to be available in your `$PATH`. Additionally, all other standard AWS-managed runtimes are supported in Architect applications (but may not be supported in [Sandbox](../reference/cli/sandbox)), including: diff --git a/src/views/docs/en/get-started/detailed-aws-setup.md b/src/views/docs/en/get-started/detailed-aws-setup.md index 3dc99299..f296fcd0 100644 --- a/src/views/docs/en/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/get-started/detailed-aws-setup.md @@ -27,7 +27,7 @@ Architect supports the following runtime versions: - **Ruby**: `2.7` using `bundle` - **Deno**: `1.6.x` ([under development](../reference/runtime-helpers/deno)) -> ⚠️ Working locally with the Architect `sandbox` requires target runtimes to be available in your `$PATH`. +> ⚠️ Working locally with the Sandbox requires target runtimes to be available in your `$PATH`. Additionally, all other standard AWS-managed runtimes are supported in Architect applications (but may not be supported in [Sandbox](../reference/cli/sandbox)), including: diff --git a/src/views/docs/en/guides/backend/event-functions.md b/src/views/docs/en/guides/backend/event-functions.md index 0826a339..b15eef9a 100644 --- a/src/views/docs/en/guides/backend/event-functions.md +++ b/src/views/docs/en/guides/backend/event-functions.md @@ -36,13 +36,14 @@ account-signup account-check-email ``` -### `@events` Syntax +### `@events` syntax -- Lowercase alphanumeric string -- Maximum of 50 characters -- Dashes are allowed; underscores are not allowed +- Lower + upper case alphanumeric string +- Maximum of 240 characters +- Dashes, periods, and underscores are allowed - Must begin with a letter + ### Provisioning new event functions To provision a new event function, in the root of your project, open your app's Architect project manifest file (usually `app.arc`): @@ -172,4 +173,3 @@ function count(payload, callback) { exports.handler = arc.events.subscribe(count) ``` - diff --git a/src/views/docs/en/guides/backend/queue-functions.md b/src/views/docs/en/guides/backend/queue-functions.md index f0f0fd8b..9ddbf12a 100644 --- a/src/views/docs/en/guides/backend/queue-functions.md +++ b/src/views/docs/en/guides/backend/queue-functions.md @@ -48,9 +48,9 @@ Which generates the corresponding code: ### Syntax -- Lowercase alphanumeric string -- Maximum of 50 characters -- Dashes are allowed; underscores are not allowed +- Lower + upper case alphanumeric string +- Maximum of 240 characters +- Dashes, periods, and underscores are allowed - Must begin with a letter --- @@ -132,5 +132,3 @@ def handler(request, context): arc.queues.publish(name='account-signup', payload={'ok':True}) return {'statusCode': 201} ``` - - diff --git a/src/views/docs/en/guides/backend/scheduled-functions.md b/src/views/docs/en/guides/backend/scheduled-functions.md index a5baa5e2..028cb42c 100644 --- a/src/views/docs/en/guides/backend/scheduled-functions.md +++ b/src/views/docs/en/guides/backend/scheduled-functions.md @@ -23,9 +23,10 @@ Scheduled functions are functions that are invoked at specified times and can be To get started with scheduled functions we must first add the `@scheduled` pragma to our `app.arc` manifest file. There is a specific syntax for setting the frequency for triggering our scheduled functions. ### Syntax -- Lowercase alphanumeric string -- Maximum of 20 characters -- Dashes are allowed; underscores are not allowed + +- Lower + upper case alphanumeric string +- Maximum of 240 characters +- Dashes, periods, and underscores are allowed - Must begin with a letter - Followed by a valid `rate` or `cron` expression ([more info here](https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html)) diff --git a/src/views/docs/en/guides/backend/tables.md b/src/views/docs/en/guides/backend/tables.md index 42c2b58c..92a6d699 100644 --- a/src/views/docs/en/guides/backend/tables.md +++ b/src/views/docs/en/guides/backend/tables.md @@ -9,7 +9,7 @@ sections: ## Overview -How we store information is one of the pillars of app development. Durable persistence of structured data is the foundation for all powerful web apps. Data needs to be instantaneous, consistent, secure, and able to scale easily to meet demand. `@tables` defines DynamoDB database tables and trigger functions for them to read and write data with single digit millisecond latency. +How we store information is one of the pillars of app development. Durable persistence of structured data is the foundation for all powerful web apps. Data needs to be instantaneous, consistent, secure, and able to scale easily to meet demand. `@tables` defines DynamoDB database tables and trigger functions for them to read and write data with single digit millisecond latency. Architect `@tables` defines DynamoDB tables and `@indexes` define global secondary indexes to facilitate more advanced access patterns. @@ -61,14 +61,15 @@ accounts `@tables` defines DynamoDB database tables and trigger functions for them. + #### Table name syntax -- Lowercase alphanumeric string +- Lower + upper case alphanumeric string - Between 3 and 255 characters -- Dashes are allowed -- Underscores are not allowed +- Dashes, periods, and underscores are allowed - Must begin with a letter + #### Table structure syntax - Keys and Lambdas are defined by indenting two spaces @@ -79,6 +80,7 @@ accounts > **Protip:** table names can be anything but choose a consistent naming scheme within your app namespace; one useful scheme is plural nouns like: `accounts` or `email-invites` + ### Indexes Indexes give you access to alternate query patterns, and can speed up queries. Architect provides fast access to items in a table by specifying primary key values. Indexing comes into the picture if you want to fetch the data of attributes other than the primary key. diff --git a/src/views/docs/en/guides/frontend/http-functions.md b/src/views/docs/en/guides/frontend/http-functions.md index 64b5c1d5..3dcec46c 100644 --- a/src/views/docs/en/guides/frontend/http-functions.md +++ b/src/views/docs/en/guides/frontend/http-functions.md @@ -95,7 +95,7 @@ Each HTTP Function maps to a logical HTTP route. For example: - `get /about` is serviced by `src/http/get-about` - `post /form` is serviced by `src/http/post-form` -All HTTP Functions begin with `/`, and can include letters, numbers, and slashes, underscores, dashes, and periods, up to 35 characters. +All HTTP Functions begin with `/`, and can include letters, numbers, and slashes, underscores, dashes, and periods, with an advised (but not enforced) maximum of 100 characters. Importantly and uniquely, you can also use URL parameters to build dynamic paths – more on that below. diff --git a/src/views/docs/en/reference/project-manifest/app.md b/src/views/docs/en/reference/project-manifest/app.md index dda26b53..3f83ddac 100644 --- a/src/views/docs/en/reference/project-manifest/app.md +++ b/src/views/docs/en/reference/project-manifest/app.md @@ -8,9 +8,9 @@ description: Define the application namespace ## Syntax -- Lowercase alphanumeric string -- Maximum of 10 characters -- Dashes allowed; underscores not allowed +- Lower + upper case alphanumeric string +- Maximum of 100 characters +- Dashes and underscores are allowed - Must begin with a letter ## Example diff --git a/src/views/docs/en/reference/project-manifest/events.md b/src/views/docs/en/reference/project-manifest/events.md index 1128cbf1..54297b7c 100644 --- a/src/views/docs/en/reference/project-manifest/events.md +++ b/src/views/docs/en/reference/project-manifest/events.md @@ -3,17 +3,17 @@ title: '@events' category: app.arc --- - Define SNS topics with Lambda handler functions. +Define SNS topics with Lambda handler functions. ## Syntax -- Name - - Lowercase alphanumeric string - - Maximum of 50 characters - - Dashes are allowed; underscores are not allowed - - Must begin with a letter +- Lower + upper case alphanumeric string +- Maximum of 240 characters +- Dashes, periods, and underscores are allowed +- Must begin with a letter + +Events can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `src` for each event. -Events can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `src` for each event. ## Example diff --git a/src/views/docs/en/reference/project-manifest/http.md b/src/views/docs/en/reference/project-manifest/http.md index 35c69428..a6941d26 100644 --- a/src/views/docs/en/reference/project-manifest/http.md +++ b/src/views/docs/en/reference/project-manifest/http.md @@ -21,13 +21,14 @@ Each route is made up of two parts: HTTP verb and a route path. - `any`1 - Route Path - - Dashes and underscores are not allowed - - Must begin with a letter + - Lower + upper case alphanumeric string - Advised maximum of 100 characters for paths + - Dashes, periods, and underscores are allowed + - Must begin with a letter - URL parameters are defined with a leading colon (`:`) - - A trailing asterisk (`*`) denotes a "catchall" + - A trailing asterisk (`*`) denotes a "catchall" (and can only be used as the final character) -Routes can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `method` and `src` for each route: +Routes can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `method` and `src` for each route: - `method` - HTTP verb - `src` - path to the function source @@ -133,5 +134,5 @@ Which utilizes the following project directory structure: └── package.json ``` -> ⚠️ Handlers generated from routes with URL parameters i.e. `/pages/:dateID`, substitute `:` for `000`. +> ⚠️ Handlers generated from routes with URL parameters i.e. `/pages/:dateID`, substitute `:` for `000`. > This is a deliberate convention to ensure valid directory names that correspond with your defined parameterized route. diff --git a/src/views/docs/en/reference/project-manifest/queues.md b/src/views/docs/en/reference/project-manifest/queues.md index 2d674961..953e37fa 100644 --- a/src/views/docs/en/reference/project-manifest/queues.md +++ b/src/views/docs/en/reference/project-manifest/queues.md @@ -8,11 +8,12 @@ Define SQS topics with Lambda handler functions. ### Syntax -- Lowercase alphanumeric string -- Maximum of 50 characters -- Dashes are allowed; underscores are not allowed +- Lower + upper case alphanumeric string +- Maximum of 240 characters +- Dashes, periods, and underscores are allowed - Must begin with a letter + ### Example This `app.arc` file defines two `@queues`: diff --git a/src/views/docs/en/reference/project-manifest/scheduled.md b/src/views/docs/en/reference/project-manifest/scheduled.md index 96a33624..17e7cb37 100644 --- a/src/views/docs/en/reference/project-manifest/scheduled.md +++ b/src/views/docs/en/reference/project-manifest/scheduled.md @@ -8,14 +8,11 @@ Define EventBridge schedule expressions with Lambda handler functions. ### Syntax -- Name - - Lowercase alphanumeric string - - Maximum of 20 characters - - Dashes are allowed; underscores are not allowed - - Must begin with a letter - -- Interval - - A valid `rate` or `cron` expression ([more info here](https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html)) +- Lower + upper case alphanumeric string +- Maximum of 240 characters +- Dashes, periods, and underscores are allowed +- Must begin with a letter +- Followed by a valid `rate` or `cron` expression ([more info here](https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html)) Scheduled functions can use more verbose configuration to allow for [custom source paths](../../guides/developer-experience/custom-source-paths) in your project. Provide a `rate` or `cron` and `src` for each event. diff --git a/src/views/docs/en/reference/project-manifest/shared.md b/src/views/docs/en/reference/project-manifest/shared.md index 9bc26975..55346119 100644 --- a/src/views/docs/en/reference/project-manifest/shared.md +++ b/src/views/docs/en/reference/project-manifest/shared.md @@ -8,10 +8,7 @@ Configure the location of shared code. ## Syntax -- Lowercase alphanumeric string -- Maximum of 20 characters -- Dashes are allowed; underscores are not allowed -- Must begin with a letter +- File path of the folder containing shared code ## Example diff --git a/src/views/docs/en/reference/project-manifest/tables.md b/src/views/docs/en/reference/project-manifest/tables.md index 56e004f0..a2329aa6 100644 --- a/src/views/docs/en/reference/project-manifest/tables.md +++ b/src/views/docs/en/reference/project-manifest/tables.md @@ -25,12 +25,12 @@ Additionally, database changes can be streamed to a function with the [`@tables- ### Table name syntax -- Lowercase alphanumeric string +- Lower + upper case alphanumeric string - Between 3 and 255 characters -- Dashes are allowed -- Underscores are not allowed +- Dashes, periods, and underscores are allowed - Must begin with a letter + ### Table structure syntax - Keys and Lambdas are defined by indenting two spaces From 7d87a0ecd65f7ec48ac727fd6aaf609303f4ac35 Mon Sep 17 00:00:00 2001 From: macdonst Date: Mon, 14 Feb 2022 23:48:22 -0500 Subject: [PATCH 345/680] Duplicate CSS to reduce flash Signed-off-by: macdonst --- public/css/styles.css | 54 +++++++++++++++++++++++++++++++++++++++++++ public/static.json | 2 +- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/public/css/styles.css b/public/css/styles.css index bca51cad..9f557611 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -55,6 +55,60 @@ --bkg-color: #121212;/* #121212 */ } +@media (prefers-color-scheme: dark) { + :root { + --p0:#6EE8B5;/* #6EE8B5 */ + --p1:#46A9CB;/* #46A9CB */ + --p2:#E4FFDD;/* #E4FFDD */ + --p3:#ED59B3;/* #ED59B3 */ + --g0:#222222;/* #222222 */ + --g1:#383838;/* #383838 */ + --g2:#4D4D4D;/* #4D4D4D */ + --g3:#636363;/* #636363 */ + --g4:#797979;/* #797979 */ + --g5:#8E8E8E;/* #8E8E8E */ + --g6:#A4A4A4;/* #A4A4A4 */ + --g7:#BABABA;/* #BABABA */ + --g8:#CFCFCF;/* #CFCFCF */ + --g9:#E5E5E5;/* #E5E5E5 */ + --g10:#FBFBFB;/* #FBFBFB */ + --g11:#000; /* #FFF*/ + --h6:#CFCFCF;/* #CFCFCF */ + --a0:#A4A4A4;/* #A4A4A4 */ + --a1:#8E8E8E;/* #8E8E8E */ + --a2:#2E82A2;/* #2E82A2 */ + --d0:#797979;/* #797979 */ + --d1:#636363;/* #636363 */ + --text-color: #EEE;/* #EEE */ + --bkg-color: #121212;/* #121212 */ + } + :root[data-theme="light"] { + --p0:#2CDD93;/* clover green */ + --p1:#2B7D9A;/* blue green */ + --p2:#BBFFAA;/* key lime */ + --p3:#E21893;/* Barbie Pink light */ + --g0:#FBFBFB;/* #FBFBFB */ + --g1:#E5E5E5;/* #E5E5E5 */ + --g2:#CFCFCF;/* #CFCFCF */ + --g3:#BABABA;/* #BABABA */ + --g4:#A4A4A4;/* #A4A4A4 */ + --g5:#8E8E8E;/* #8E8E8E */ + --g6:#797979;/* #797979 */ + --g7:#636363;/* #636363 */ + --g8:#4D4D4D;/* #4D4D4D */ + --g9:#383838;/* #383838 */ + --g10:#222222;/* #222222 */ + --g11:#FFF; /* #FFF*/ + --h6:#CFCFCF;/* #CFCFCF */ + --a0:#A4A4A4;/* #A4A4A4 */ + --a1:#8E8E8E;/* #8E8E8E */ + --a2:#1D5266;/* #8E8E8E */ + --d0:#797979;/* #797979 */ + --d1:#636363;/* #636363 */ + --text-color: #222;/* #222 */ + --bkg-color: #FFF;/* #FFF */ + } +} [data-theme='light'] .moon-icon, [data-theme='dark'] .sun-icon { diff --git a/public/static.json b/public/static.json index 5ff30a64..9b60f98e 100644 --- a/public/static.json +++ b/public/static.json @@ -7,6 +7,6 @@ "components/arc-viewer.js": "components/arc-viewer-3de6ce2a83.js", "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-547bdacc3e.css", - "css/styles.css": "css/styles-cf4510a1b6.css", + "css/styles.css": "css/styles-9dffa15249.css", "css/syntax.css": "css/syntax-0339098006.css" } \ No newline at end of file From b53f29e485c05668e84ef4eda53cad34bf0d65ec Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 09:02:43 -0800 Subject: [PATCH 346/680] Temporary spellcheck fix --- package-lock.json | 134 ++++++++++++++++++------------------ scripts/dictionary.txt | 6 ++ scripts/spellcheckerrc.json | 2 +- 3 files changed, 74 insertions(+), 68 deletions(-) diff --git a/package-lock.json b/package-lock.json index efbaee03..87fc93d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,9 +111,9 @@ } }, "@architect/functions": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.1.1.tgz", - "integrity": "sha512-x0+B/V9Jo5onksOce6iYdYeLh5F91dOp5fTnGJdkgOFCS+N0YN9zlI2asdPIs1Rb6xxCwoH1nuzs/jnNkupQWA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-4.1.2.tgz", + "integrity": "sha512-lw0lg3zbZ7UG3jBACzzztqOCQ9F/XBkr7Fp5LvId70Hz1saKD338RVQ33evY1KnJVxH4Z3uM13e9bsMpIpbcHQ==", "requires": { "aws-serverless-express": "^3.4.0", "cookie": "^0.4.1", @@ -220,7 +220,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "github:architect/spellcheck-dictionary#2ef31b2b23fec8674789df057180310138d07c90", + "version": "github:architect/spellcheck-dictionary#d5e4b991c3e7838a0a5728a98a38060b7d8627e9", "from": "github:architect/spellcheck-dictionary", "dev": true }, @@ -333,14 +333,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.1.0.tgz", + "integrity": "sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -394,9 +394,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -914,12 +914,12 @@ "dev": true }, "camelcase-keys": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.1.tgz", - "integrity": "sha512-P331lEls98pW8JLyodNWfzuz91BEDVA4VpW2/SwXnyv2K495tq1N777xzDbFgnEigfA7UIY0xa6PwR/H9jijjA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, "requires": { - "camelcase": "^6.2.0", + "camelcase": "^6.3.0", "map-obj": "^4.1.0", "quick-lru": "^5.1.1", "type-fest": "^1.2.1" @@ -1000,9 +1000,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "command-line-args": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", - "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, "requires": { "array-back": "^3.1.0", @@ -1122,9 +1122,9 @@ "dev": true }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.1.0", @@ -1476,22 +1476,22 @@ "dev": true }, "dynalite": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.1.tgz", - "integrity": "sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-3.2.2.tgz", + "integrity": "sha512-sx9ZjTgMs/D4gHnba4rnBkw29648dHwHmywJet132KAbiq1ZyWx9W1fMd/eP9cPwTKDXyCBuTYOChE0qMDjaXQ==", "dev": true, "requires": { "async": "^2.6.3", "big.js": "^5.2.2", "buffer-crc32": "^0.2.13", "lazy": "^1.0.11", - "leveldown": "^5.2.1", + "leveldown": "^5.6.0", "levelup": "^4.4.0", "lock": "^1.1.0", "memdown": "^5.1.0", "minimist": "^1.2.5", "once": "^1.4.0", - "subleveldown": "^5.0.0" + "subleveldown": "^5.0.1" }, "dependencies": { "async": { @@ -1649,12 +1649,12 @@ "dev": true }, "eslint": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", - "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.9.0.tgz", + "integrity": "sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.1.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -1662,10 +1662,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1776,9 +1776,9 @@ } }, "eslint-module-utils": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", - "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "dev": true, "requires": { "debug": "^3.2.7", @@ -1848,9 +1848,9 @@ } }, "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -1875,9 +1875,9 @@ } }, "eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, "esm": { @@ -1886,14 +1886,14 @@ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" }, "espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "requires": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { @@ -2101,15 +2101,15 @@ } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "dev": true }, "for-each": { @@ -2278,9 +2278,9 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -3366,9 +3366,9 @@ } }, "marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", + "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", "dev": true }, "mdast-util-from-markdown": { @@ -3586,9 +3586,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.1.tgz", + "integrity": "sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==", "requires": { "brace-expansion": "^1.1.7" } @@ -4702,9 +4702,9 @@ } }, "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "slash": { "version": "3.0.0", @@ -5111,9 +5111,9 @@ } }, "tape": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.4.1.tgz", - "integrity": "sha512-7bGaJ3WnQ/CX3xOWzlR+9lNptEWoD+11gyREP8k+SYrDu2a20EifKpTmZndXn25ZRxesYHSuNtE7Fb+THcjfGA==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.5.2.tgz", + "integrity": "sha512-N9Ss672dFE3QlppiXGh2ieux8Ophau/HSAQguW5cXQworKxV0QvnZCYI35W1OYySTJk0OC9OPuS+0xNO6lhiTQ==", "dev": true, "requires": { "array.prototype.every": "^1.1.3", diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt index 28612718..0d971a6b 100644 --- a/scripts/dictionary.txt +++ b/scripts/dictionary.txt @@ -3,18 +3,24 @@ ACM ApiGatewayManagementApi arc-example-cors +arcfile +AWSLambdaSQSQueueExecutionRole Bundler CJS Cloudflare CommonJS Dreamhost ESM +esmodules FQDN getConnection GoDaddy Graviton2 +hashids +httpOnly konsumer LEANX Namecheap +NodeJS ParcelJS treeshaking diff --git a/scripts/spellcheckerrc.json b/scripts/spellcheckerrc.json index fcc9edf9..8c92fe42 100644 --- a/scripts/spellcheckerrc.json +++ b/scripts/spellcheckerrc.json @@ -4,7 +4,7 @@ "noSuggestions": true, "dictionaries": [ "./scripts/dictionary.txt", - "./node_modules/@architect/spellcheck-dictionary/dictionary.txt" + "./node_modules/@architect/spellcheck-dictionary/index.js" ], "plugins": [ "spell", From 482631482af6a753ff88b7f6582f7f200e784e10 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 09:12:36 -0800 Subject: [PATCH 347/680] Fix strobing on pre tags --- public/css/syntax.css | 7 ++++--- public/static.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/public/css/syntax.css b/public/css/syntax.css index 36e09bd7..86624814 100644 --- a/public/css/syntax.css +++ b/public/css/syntax.css @@ -48,13 +48,14 @@ border-radius: 0.3rem; white-space: pre; word-break: break-word; - /* fallback when hljs encounters unknown syntax */ +} + +/* fallback for when hljs encounters unknown syntax */ +:root[data-theme="light"] .docs pre { color: var(--g2); background-color: var(--g9); } - :root[data-theme="dark"] .docs pre { - /* fallback when hljs encounters unknown syntax */ color: var(--g8); background-color: var(--g1); } diff --git a/public/static.json b/public/static.json index 9b60f98e..3ebd0689 100644 --- a/public/static.json +++ b/public/static.json @@ -8,5 +8,5 @@ "css/docsearch.css": "css/docsearch-27dbba82ed.css", "css/index.css": "css/index-547bdacc3e.css", "css/styles.css": "css/styles-9dffa15249.css", - "css/syntax.css": "css/syntax-0339098006.css" + "css/syntax.css": "css/syntax-a06dbb0cd2.css" } \ No newline at end of file From f6f51f90edcf3a6b3e4167816e0230e59ae739ff Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 09:16:07 -0800 Subject: [PATCH 348/680] 3.6.35 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87fc93d0..afbf6368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.34", + "version": "3.6.35", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b95d64a2..2d3871a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.34", + "version": "3.6.35", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From d8e9eb81cd1c38ee66ada3dbc82548921a972b31 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 09:29:51 -0800 Subject: [PATCH 349/680] Fix code sample --- src/views/docs/en/guides/plugins/set.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/plugins/set.md b/src/views/docs/en/guides/plugins/set.md index 79b218cc..6515d741 100644 --- a/src/views/docs/en/guides/plugins/set.md +++ b/src/views/docs/en/guides/plugins/set.md @@ -235,7 +235,7 @@ module.exports = { set: { env: ({ arc, inventory }) => { return { testing: { - API_SECRET: 'dummy-key' + API_SECRET: 'sample-key' }, staging: { API_SECRET: process.env.API_SECRET From bece9ad5cb7b04ab5a55175dbf3d8cbe33358819 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 15 Feb 2022 11:48:54 -0700 Subject: [PATCH 350/680] add "Local preferences" section to cli > sandbox --- src/views/docs/en/reference/cli/sandbox.md | 54 +++++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index deb04fa9..90357020 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -28,26 +28,68 @@ arc sandbox [--port|--disable-symlinks|--no-hydrate|--verbose] - `[--disable-symlinks]` Disable symlinking `src/shared` and copy instead - `[--no-hydrate]` Disables hydration +### Local preferences + +Sandbox will take into account [local preferences](../configuration/local-preferences) set in `preferences.arc` + +#### `@sandbox` + +The following can be set as a part of the `@sandbox` pragma. + +- `env`* - Override the local environment setting to use `staging` or `production` so that Sandbox uses that stage's env vars as set in `@env` in `preferences.arc` or in the project's `.env` file. + - Can be one of `testing`, `staging`, `production` + - Defaults to `testing` +- `useAws`* - Use live AWS infrastructure from Sandbox. Specifically, `@tables`, `@tables-indexes`, `@events`, and `@queues`. Uses the `staging` environment by default, but `env` can be set to `production`. + - Defaults to `false` +- `no-hydrate` - Disable [function hydration](./hydrate) on Sandbox start. + - Defaults to `false` + +```arc +@sandbox +env production +useAws true +no-hydrate true +``` + +\* These advanced options should be used with care since they will allow local development code to interact with live AWS resources. + +#### `@sandbox-startup` + +Additionally, Sandbox can run shell commands on startup by setting `@sandbox-startup` in `preferences.arc`. + +```arc +@sandbox-startup +node scripts/seed_db.js +echo 'hello' +``` + ### Environment variables -- `NODE_ENV` default `testing` +- `NODE_ENV` - `testing|staging|production` + - Defaults to `testing` - `ARC_API_TYPE` - Set the API Gateway API type - Can be one of `http` (aliased to `httpv2`), `httpv1`, `rest` - Defaults to `http` -- `ARC_QUIET` - If present, disable (most) logging - `PORT` - Manually specify HTTP port - Defaults to `3333` - `ARC_LOCAL`- If present and used in conjunction with `NODE_ENV=staging|production`, emulates live `staging` or `production` environment - Uses your local `preferences.arc` file's `@staging` or `@production` environment variables - - Connects Sandbox to live AWS events and DynamoDB infra - - Requires valid AWS credentials with the same profile name as defined in your project manifest + - Connects Sandbox to live AWS events and DynamoDB infrastructure + - Requires valid AWS credentials with the same profile name as defined in your [project manifest](../project-manifest/aws#profile) +- `ARC_QUIET` - If present, disable (most) logging ### Local Database -Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@tables-indexes` found in the `app.arc` file. `@tables-streams` is not currently supported by dynalite. When Sandbox is terminated, any data written is cleared from memory. You can set a custom port by using an environment variable, `ARC_TABLES_PORT=5555` +Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@tables-indexes` found in the `app.arc` file. `@tables-streams` is not currently supported by dynalite. + +When Sandbox is terminated, any data written is cleared from memory. + +You can set a custom port by using an environment variable: `ARC_TABLES_PORT=5555`. + +#### Live database example -### Connect sandbox to the staging database +Connect Sandbox to the DynamoDB staging database on AWS: ```bash NODE_ENV=staging ARC_LOCAL=1 npx arc sandbox From 85ce03e1f5bc141f3c7ec10836aa360073433295 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 11:03:14 -0800 Subject: [PATCH 351/680] Update TypeScript guide --- package-lock.json | 2 +- .../developer-experience/using-typescript.md | 53 +++++++++++++++---- src/views/docs/table-of-contents.js | 10 ++-- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb9aa557..944670ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -270,7 +270,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#d5e4b991c3e7838a0a5728a98a38060b7d8627e9", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#6098404551d24bb572d7a891ac97e72e0dc71c2d", "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, diff --git a/src/views/docs/en/guides/developer-experience/using-typescript.md b/src/views/docs/en/guides/developer-experience/using-typescript.md index 67a18436..3913d5a0 100644 --- a/src/views/docs/en/guides/developer-experience/using-typescript.md +++ b/src/views/docs/en/guides/developer-experience/using-typescript.md @@ -1,17 +1,52 @@ --- title: Using TypeScript category: Developer experience -description: How to use Architect with TypeScript +description: How to use TypeScript with Architect --- -Architect and TypeScript work great together. Types are available in the [@types/architect\_\_functions](https://www.npmjs.com/package/@types/architect__functions) package. Write functions in TypeScript and just be sure to build your functions with TypeScript (`tsc`) before running or deploying. For example, your `package.json` might have the following scripts to build the TypeScript code before deploying and running in the [sandbox for local development](/docs/en/guides/developer-experience/local-development): +Architect and TypeScript work great together. Architect maintains a first-party TypeScript integration via [`@architect/plugin-typescript`](https://github.com/architect/plugin-typescript). -```json -"scripts": { - "start": "arc sandbox", - "prestart": "npm run build", - "deploy": "arc deploy", - "predeploy": "npm run build", - "build": "tsc" +Architect's TypeScript integration takes care of transpiling, source maps, source vs. build paths, and integration with Sandbox. All you have to do is author your functions (and, optionally, run `tsc` within your tests). + + +## Getting started + +In your Architect project run: + +```sh +npm i @architect/plugin-typescript --save-dev +``` + +Add the following to your Architect project manifest (usually `app.arc`): + +```arc +@aws +runtime typescript # sets TS as the the default runtime for your entire project + +@plugins +architect/plugin-typescript +``` + +## Usage + +Author (or port) Lambdas in the `src` tree with `index.ts` handlers. For example: + +```js +// src/http/get-index/index.ts +export async function handler (request: any, context: any): Promise { + return request } ``` + +The above function will be automatically transpiled by Architect to `./.build/http/get-index.js`. The destination build directory is configurable, as is `tsconfig.json`, and esbuild plugins; [see the plugin documentation for more options](https://github.com/architect/plugin-typescript).) + +When working locally, Sandbox automatically detects changes to your TypeScript handlers and re-transpiles them (and adds environment-specific sourcemaps) for you. + +You can use TypeScript in as many or few Lambdas as you like, relying on project or Lambda-level [`runtime` function config](/docs/en/reference/configuration/function-config). + + +## `@architect/functions` + +We recommend using the [`@architect/functions`](http://localhost:3333/docs/en/reference/runtime-helpers/node.js) runtime helper to smooth over some rough edges in working with various aspects of AWS (as well as to add built-in session support, and other niceties). + +If you do, TypeScript types are available in the [@types/architect__functions](https://www.npmjs.com/package/@types/architect__functions) package. diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index ecffbade..34e3707b 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -39,12 +39,12 @@ let Guides = [ 'deploy', 'sandbox', 'set', - 'Inventory', + // 'Inventory', ], - 'Extend': [ - 'Custom CloudFormation', - 'Plugins', - ] + // 'Extend': [ + // 'Custom CloudFormation', + // 'Plugins', + // ] }, 'Examples', ] From 946d1869676d46599bd1ca0a1c4f2f91bc0f8a3f Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 15 Feb 2022 12:06:04 -0700 Subject: [PATCH 352/680] use generic "local preferences" instead of specific file name --- src/views/docs/en/reference/cli/sandbox.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index 90357020..d685fbfd 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -30,15 +30,14 @@ arc sandbox [--port|--disable-symlinks|--no-hydrate|--verbose] ### Local preferences -Sandbox will take into account [local preferences](../configuration/local-preferences) set in `preferences.arc` +Sandbox will take into account Architect [local preferences](../configuration/local-preferences). #### `@sandbox` -The following can be set as a part of the `@sandbox` pragma. +The following can be set as a part of the [`@sandbox`](../configuration/local-preferences#sandbox) pragma. -- `env`* - Override the local environment setting to use `staging` or `production` so that Sandbox uses that stage's env vars as set in `@env` in `preferences.arc` or in the project's `.env` file. - - Can be one of `testing`, `staging`, `production` - - Defaults to `testing` +- `env`* - Override the local environment setting to use `staging` or `production` so that Sandbox uses that stage's environment variables as set in local preferences `@env` or in the project's `.env` file. + - Can be one of `testing` (default), `staging`, or `production` - `useAws`* - Use live AWS infrastructure from Sandbox. Specifically, `@tables`, `@tables-indexes`, `@events`, and `@queues`. Uses the `staging` environment by default, but `env` can be set to `production`. - Defaults to `false` - `no-hydrate` - Disable [function hydration](./hydrate) on Sandbox start. @@ -55,7 +54,7 @@ no-hydrate true #### `@sandbox-startup` -Additionally, Sandbox can run shell commands on startup by setting `@sandbox-startup` in `preferences.arc`. +Additionally, Sandbox can run shell commands on startup by setting [`@sandbox-startup`](../configuration/local-preferences#sandbox-startup) in [local preferences](../configuration/local-preferences). ```arc @sandbox-startup @@ -73,7 +72,7 @@ echo 'hello' - `PORT` - Manually specify HTTP port - Defaults to `3333` - `ARC_LOCAL`- If present and used in conjunction with `NODE_ENV=staging|production`, emulates live `staging` or `production` environment - - Uses your local `preferences.arc` file's `@staging` or `@production` environment variables + - Uses your local preferences `@staging` or `@production` environment variables - Connects Sandbox to live AWS events and DynamoDB infrastructure - Requires valid AWS credentials with the same profile name as defined in your [project manifest](../project-manifest/aws#profile) - `ARC_QUIET` - If present, disable (most) logging From dbb145b62bc4cb96baecf413ba5a18b332a0c510 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 11:17:58 -0800 Subject: [PATCH 353/680] Add robots.txt --- src/http/any-catchall/index.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/http/any-catchall/index.js b/src/http/any-catchall/index.js index 4bddfd7a..17188649 100644 --- a/src/http/any-catchall/index.js +++ b/src/http/any-catchall/index.js @@ -17,6 +17,16 @@ const staticProxy = asap({ spa: false }) +function robots (req) { + if (req.path === '/robots.txt') { + let headers = { 'content-type': 'text/plain; charset=utf8' } + let allow = 'User-agent: *\nDisallow: ' + let disallow = 'User-agent: *\nDisallow: /' + if (process.env.ARC_ENV === 'production') return { headers, body: allow } + return { headers, body: disallow } + } +} + async function notFound (req) { const term = req.path @@ -32,4 +42,4 @@ async function notFound (req) { } } -exports.handler = http.async(redirectMiddleware, staticProxy, notFound) +exports.handler = http.async(redirectMiddleware, robots, staticProxy, notFound) From bc99800f8ee70995bcf8561f2787df2b3e654b02 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 12:57:46 -0800 Subject: [PATCH 354/680] Update manifest pragma front matter --- src/views/docs/en/reference/project-manifest/app.md | 2 +- src/views/docs/en/reference/project-manifest/aws.md | 2 +- src/views/docs/en/reference/project-manifest/events.md | 2 +- src/views/docs/en/reference/project-manifest/http.md | 2 +- src/views/docs/en/reference/project-manifest/macros.md | 4 +++- src/views/docs/en/reference/project-manifest/proxy.md | 2 +- src/views/docs/en/reference/project-manifest/queues.md | 2 +- src/views/docs/en/reference/project-manifest/scheduled.md | 2 +- src/views/docs/en/reference/project-manifest/shared.md | 2 +- src/views/docs/en/reference/project-manifest/static.md | 4 +--- .../docs/en/reference/project-manifest/tables-indexes.md | 2 +- .../docs/en/reference/project-manifest/tables-streams.md | 2 +- src/views/docs/en/reference/project-manifest/tables.md | 4 ++-- src/views/docs/en/reference/project-manifest/views.md | 2 +- src/views/docs/en/reference/project-manifest/ws.md | 2 +- 15 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/views/docs/en/reference/project-manifest/app.md b/src/views/docs/en/reference/project-manifest/app.md index 3f83ddac..a2cd80d2 100644 --- a/src/views/docs/en/reference/project-manifest/app.md +++ b/src/views/docs/en/reference/project-manifest/app.md @@ -1,5 +1,5 @@ --- -title: '@app' +title: '@app' category: app.arc description: Define the application namespace --- diff --git a/src/views/docs/en/reference/project-manifest/aws.md b/src/views/docs/en/reference/project-manifest/aws.md index d1ee6cff..293abfa8 100644 --- a/src/views/docs/en/reference/project-manifest/aws.md +++ b/src/views/docs/en/reference/project-manifest/aws.md @@ -1,5 +1,5 @@ --- -title: '@aws' +title: '@aws' category: app.arc description: Define AWS specific configuration. --- diff --git a/src/views/docs/en/reference/project-manifest/events.md b/src/views/docs/en/reference/project-manifest/events.md index 54297b7c..ac6aa539 100644 --- a/src/views/docs/en/reference/project-manifest/events.md +++ b/src/views/docs/en/reference/project-manifest/events.md @@ -1,5 +1,5 @@ --- -title: '@events' +title: '@events' category: app.arc --- diff --git a/src/views/docs/en/reference/project-manifest/http.md b/src/views/docs/en/reference/project-manifest/http.md index a6941d26..e9fc6d4a 100644 --- a/src/views/docs/en/reference/project-manifest/http.md +++ b/src/views/docs/en/reference/project-manifest/http.md @@ -1,5 +1,5 @@ --- -title: '@http' +title: '@http' category: app.arc description: Define HTTP routes --- diff --git a/src/views/docs/en/reference/project-manifest/macros.md b/src/views/docs/en/reference/project-manifest/macros.md index 3d9f43d7..dd05e5d6 100644 --- a/src/views/docs/en/reference/project-manifest/macros.md +++ b/src/views/docs/en/reference/project-manifest/macros.md @@ -1,9 +1,11 @@ --- -title: '@macro' +title: '@macros' category: app.arc description: Extend Architect app functionality --- +> Notice: `@macros` is no longer the preferred way to extend CloudFormation in Architect, and have been superseded by [`@plugins` `deploy.start`](/docs/en/guides/plugins/deploy#deploy.start). Existing `@macros` extensions will continue to be supported, but are no longer actively improved. + Extend the functionality of your Architect app with standard CloudFormation. The `@macro` primitive allows developers to add any resources or modify existing ones extending Architect into the entire AWS ecosystem supported by CloudFormation. Macros also allow you to look for custom directives and add pre-deploy steps. You can find some examples in our [GitHub](https://github.com/architect/?q=macro-&type=source). ## Getting started diff --git a/src/views/docs/en/reference/project-manifest/proxy.md b/src/views/docs/en/reference/project-manifest/proxy.md index 9644f5ef..6f131610 100644 --- a/src/views/docs/en/reference/project-manifest/proxy.md +++ b/src/views/docs/en/reference/project-manifest/proxy.md @@ -1,5 +1,5 @@ --- -title: '@proxy' +title: '@proxy' category: app.arc description: Define a forwarding URL --- diff --git a/src/views/docs/en/reference/project-manifest/queues.md b/src/views/docs/en/reference/project-manifest/queues.md index 953e37fa..08094d02 100644 --- a/src/views/docs/en/reference/project-manifest/queues.md +++ b/src/views/docs/en/reference/project-manifest/queues.md @@ -1,5 +1,5 @@ --- -title: '@queues' +title: '@queues' category: app.arc description: Define SQS topics --- diff --git a/src/views/docs/en/reference/project-manifest/scheduled.md b/src/views/docs/en/reference/project-manifest/scheduled.md index 17e7cb37..1cdf8832 100644 --- a/src/views/docs/en/reference/project-manifest/scheduled.md +++ b/src/views/docs/en/reference/project-manifest/scheduled.md @@ -1,5 +1,5 @@ --- -title: '@scheduled' +title: '@scheduled' category: app.arc description: Define EventBridge schedule expressions --- diff --git a/src/views/docs/en/reference/project-manifest/shared.md b/src/views/docs/en/reference/project-manifest/shared.md index 55346119..7fd6386b 100644 --- a/src/views/docs/en/reference/project-manifest/shared.md +++ b/src/views/docs/en/reference/project-manifest/shared.md @@ -1,5 +1,5 @@ --- -title: '@shared' +title: '@shared' category: app.arc description: Configure src/shared code --- diff --git a/src/views/docs/en/reference/project-manifest/static.md b/src/views/docs/en/reference/project-manifest/static.md index c7c9b25d..0b775ca5 100644 --- a/src/views/docs/en/reference/project-manifest/static.md +++ b/src/views/docs/en/reference/project-manifest/static.md @@ -1,5 +1,5 @@ --- -title: '@static' +title: '@static' category: app.arc description: Define S3 bucket --- @@ -91,5 +91,3 @@ Static assets will also be uploaded during an `arc deploy` along with your funct `arc deploy static --delete` deletes static assets from the S3 bucket that are not present in the configured static asset folder. `arc deploy static --prune` is an alias to delete. - - diff --git a/src/views/docs/en/reference/project-manifest/tables-indexes.md b/src/views/docs/en/reference/project-manifest/tables-indexes.md index ba287db7..b7dce7ab 100644 --- a/src/views/docs/en/reference/project-manifest/tables-indexes.md +++ b/src/views/docs/en/reference/project-manifest/tables-indexes.md @@ -1,5 +1,5 @@ --- -title: '@tables-indexes' +title: '@tables-indexes' category: app.arc description: Define DynamoDB table global secondary indexes. --- diff --git a/src/views/docs/en/reference/project-manifest/tables-streams.md b/src/views/docs/en/reference/project-manifest/tables-streams.md index 8ec20db7..e9ed05a9 100644 --- a/src/views/docs/en/reference/project-manifest/tables-streams.md +++ b/src/views/docs/en/reference/project-manifest/tables-streams.md @@ -1,5 +1,5 @@ --- -title: '@tables-streams' +title: '@tables-streams' category: app.arc description: Define DynamoDB tables with streaming changes --- diff --git a/src/views/docs/en/reference/project-manifest/tables.md b/src/views/docs/en/reference/project-manifest/tables.md index a2329aa6..5f5c1d1b 100644 --- a/src/views/docs/en/reference/project-manifest/tables.md +++ b/src/views/docs/en/reference/project-manifest/tables.md @@ -1,7 +1,7 @@ --- -title: '@tables' +title: '@tables' category: app.arc -description: Define DynamoDB tables +description: Define DynamoDB database tables --- Define [DynamoDB][ddb] tables with optional: diff --git a/src/views/docs/en/reference/project-manifest/views.md b/src/views/docs/en/reference/project-manifest/views.md index d99f254b..c7ddea09 100644 --- a/src/views/docs/en/reference/project-manifest/views.md +++ b/src/views/docs/en/reference/project-manifest/views.md @@ -1,5 +1,5 @@ --- -title: '@views' +title: '@views' category: app.arc description: Share view code across `@http` functions --- diff --git a/src/views/docs/en/reference/project-manifest/ws.md b/src/views/docs/en/reference/project-manifest/ws.md index a2321737..0fb1e60a 100644 --- a/src/views/docs/en/reference/project-manifest/ws.md +++ b/src/views/docs/en/reference/project-manifest/ws.md @@ -1,5 +1,5 @@ --- -title: '@ws' +title: '@ws' category: app.arc description: Define WebSocket endpoints --- From b4c73e45195f54cd87a5eeff5b5cd14774ac7cf3 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 13:15:13 -0800 Subject: [PATCH 355/680] Add `@plugins` pragma reference doc --- package-lock.json | 2 +- src/views/docs/en/guides/plugins/overview.md | 22 ++--- .../en/reference/project-manifest/macros.md | 2 +- .../en/reference/project-manifest/plugins.md | 96 +++++++++++++++++++ src/views/docs/table-of-contents.js | 2 +- 5 files changed, 110 insertions(+), 14 deletions(-) create mode 100644 src/views/docs/en/reference/project-manifest/plugins.md diff --git a/package-lock.json b/package-lock.json index 944670ed..426de010 100644 --- a/package-lock.json +++ b/package-lock.json @@ -270,7 +270,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#6098404551d24bb572d7a891ac97e72e0dc71c2d", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#447ac052eaf2efa61fe6516b96584b5a3b1c8f3f", "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, diff --git a/src/views/docs/en/guides/plugins/overview.md b/src/views/docs/en/guides/plugins/overview.md index 9fab157f..d9472003 100644 --- a/src/views/docs/en/guides/plugins/overview.md +++ b/src/views/docs/en/guides/plugins/overview.md @@ -61,17 +61,17 @@ Resource setters are small, synchronous methods that enable the rapid programmat Any Lambdas or resources defined by setters is treated by Architect as a first-class primitive, as though it was built into Architect itself. -- Pragmas - - `events` - register async events - - `http` - register HTTP routes - - `queues` - register async event queues - - `scheduled` - register scheduled events - - `tables-streams` - register DynamoDB event streams - - `ws` - register WebSocket routes -- Resources - - `env` - register environment variables - - `customLambdas` - register bare Lambdas without a pre-associated event source - - `runtimes` - register custom runtimes +- [Pragmas](/docs/en/guides/plugins/set#pragmas) + - [`events`](/docs/en/guides/plugins/set#set.events) - register async events + - [`http`](/docs/en/guides/plugins/set#set.http) - register HTTP routes + - [`queues`](/docs/en/guides/plugins/set#set.queues) - register async event queues + - [`scheduled`](/docs/en/guides/plugins/set#set.scheduled) - register scheduled events + - [`tables-streams`](/docs/en/guides/plugins/set#set%5B'tables-streams'%5D) - register DynamoDB event streams + - [`ws`](/docs/en/guides/plugins/set#set.ws) - register WebSocket routes +- [Resources](/docs/en/guides/plugins/set#resources) + - [`env`](/docs/en/guides/plugins/set#set.env) - register environment variables + - [`customLambdas`](/docs/en/guides/plugins/set#set.customLambdas) - register bare Lambdas without a pre-associated event source + - [`runtimes`](/docs/en/guides/plugins/set#set.runtimes) - register custom runtimes ## Publishing plugins diff --git a/src/views/docs/en/reference/project-manifest/macros.md b/src/views/docs/en/reference/project-manifest/macros.md index dd05e5d6..b90835a8 100644 --- a/src/views/docs/en/reference/project-manifest/macros.md +++ b/src/views/docs/en/reference/project-manifest/macros.md @@ -1,7 +1,7 @@ --- title: '@macros' category: app.arc -description: Extend Architect app functionality +description: Customize Architect-generated CloudFormation --- > Notice: `@macros` is no longer the preferred way to extend CloudFormation in Architect, and have been superseded by [`@plugins` `deploy.start`](/docs/en/guides/plugins/deploy#deploy.start). Existing `@macros` extensions will continue to be supported, but are no longer actively improved. diff --git a/src/views/docs/en/reference/project-manifest/plugins.md b/src/views/docs/en/reference/project-manifest/plugins.md new file mode 100644 index 00000000..881bdc41 --- /dev/null +++ b/src/views/docs/en/reference/project-manifest/plugins.md @@ -0,0 +1,96 @@ +--- +title: '@plugins' +category: app.arc +description: Extend Architect app functionality and programmatically generate resources +--- + +Extend the functionality of your Architect app with `@plugins`. + +Architect’s plugin API exposes [workflow lifecycle hooks](#workflow-hooks) (such filesystem events in the [Sandbox](/docs/en/reference/cli/sandbox)) and interfaces for [generating cloud resources](#resource-setters) (such as custom Lambdas, or environment variables). + +Plugins can also be used to [customize your AWS deployment via CloudFormation](/docs/en/guides/developer-experience/customizing-cloudformation), enabling access to cloud resources outside of Architect's built-ins. + + +## Getting started + +Create an inert plugin at `src/plugins/my-plugin.js` by running `npx arc init --plugin my-plugin`. Then add the `@plugins` pragma to your project manifest: + + +
      + + +
      arc
      +
      + +```arc +@app +testapp + +@plugins +my-plugin +``` +
      +
      + + +
      json
      +
      + +```json +{ + "app": "testapp", + "plugins": [ + "my-plugin" + ] +} +``` +
      +
      + + +
      yaml
      +
      + +```yaml +--- +app: testapp + +plugins: +- my-plugin +``` +
      +
      + +
      +
      + + +## Plugin locations + +Plugins can be private to your project, or [installed as a dependency from npm](https://www.npmjs.com/search?q=arc-plugin-). Architect will automatically attempt to find each named plugin in the following four locations: + +- `src/plugins/{plugin name}.js` +- `src/plugins/{plugin name}/index.js` +- `node_modules/{plugin name}/` +- `node_modules/@{plugin name}/` + + +## Plugin namespace + +`@plugins` can be used alongside [`@macros`](./macros) in the same project, however they share the same namespace. Consequently, a plugin and macro cannot share the same name. For example, the following project would error upon startup: + +```arc +@app +testapp + +@plugins +s3-events + +@macros +s3-events +``` + + +## Authoring plugins + +Learn more about authoring (and using) plugins [in the Architect plugins guide](/docs/en/guides/plugins/overview). diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 34e3707b..2f8e48a7 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -55,7 +55,7 @@ let Reference = [ { '@aws', '@events', '@http', - '@macros', + '@plugins', '@proxy', '@queues', '@scheduled', From 341917cfa54e30ad8973ba164e2916733dbb4754 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 13:58:32 -0800 Subject: [PATCH 356/680] Update CloudFormation customization doc Add eject from Arc doc --- src/shared/redirect-map.js | 2 + .../docs/en/about/ejecting-from-architect.md | 33 ++++++++++++++++ .../customizing-cloudformation.md | 35 +++++++++++++++++ .../en/guides/extend/custom-cloudformation.md | 39 ------------------- .../guides/extend/eject-to-cloudformation.md | 16 -------- src/views/docs/table-of-contents.js | 6 +-- 6 files changed, 72 insertions(+), 59 deletions(-) create mode 100644 src/views/docs/en/about/ejecting-from-architect.md create mode 100644 src/views/docs/en/guides/developer-experience/customizing-cloudformation.md delete mode 100644 src/views/docs/en/guides/extend/custom-cloudformation.md delete mode 100644 src/views/docs/en/guides/extend/eject-to-cloudformation.md diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index 0bc18320..86f0944e 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -46,6 +46,8 @@ const tempRedirects = { const permanentRedirects = { '/examples': '/docs/en/guides/examples', + '/docs/en/guides/extend/custom-cloudformation': '/docs/en/guides/developer-experience/customizing-cloudformation', + // Intro // round 1: Q1 2021 '/intro/philosophy': '/docs/en/get-started/why-architect', diff --git a/src/views/docs/en/about/ejecting-from-architect.md b/src/views/docs/en/about/ejecting-from-architect.md new file mode 100644 index 00000000..34693e80 --- /dev/null +++ b/src/views/docs/en/about/ejecting-from-architect.md @@ -0,0 +1,33 @@ +--- +title: Ejecting from Architect +category: Extend +description: Ejecting from Architect +--- + +Architect makes it very easy to cease using it in favor of any another tool or framework, such as AWS SAM. + + +## Ejecting to CloudFormation + +In your project directory, run: + +```sh +npx arc deploy --eject +``` + +This will generate your application's `sam.json` + `sam.yaml` documents, as well as print out the necessary AWS CLI instructions to deploy your application without Architect. + + +## Considerations + +It is worth noting that by ejecting from Architect to "raw" AWS or another framework, you may lose access some or all of the following: + +- Expansive, fast, and customizable local development environment +- Baked-in security + performance defaults +- Automated dependency management +- Workflows for managing environment variables, logs, etc. +- Single-command deployments +- Built in testing, staging, production environments +- Human-centered service discovery for machine-generated AWS resources + +Either way, we at Architect hope we'll see you again in the future! diff --git a/src/views/docs/en/guides/developer-experience/customizing-cloudformation.md b/src/views/docs/en/guides/developer-experience/customizing-cloudformation.md new file mode 100644 index 00000000..633a45bd --- /dev/null +++ b/src/views/docs/en/guides/developer-experience/customizing-cloudformation.md @@ -0,0 +1,35 @@ +--- +title: Customizing CloudFormation +category: Developer experience +description: How to use Architect Plugins to define or modify AWS resources with CloudFormation +--- + +One of Architect's chief responsibilities is to generate a standard CloudFormation document for deployment to AWS. This infrastructure-as-code document is available to Architect plugins to mutate however you see fit. + + +## `deploy.start` plugins + +[`deploy.start` plugins](/docs/en/guides/plugins/deploy#deploy.start) allow you to process and mutate Architect-generated CloudFormation prior to deployment. This enables deep customization of any Architect default behavior, as well as allowing apps to extend into the entire AWS ecosystem of services. + +Architect [`@plugins`](/docs/en/guides/plugins/overview) are implemented as a Node.js CJS module with the following function signature: + +```javascript +// Do something only for staging deployments +module.exports = { deploy: { + start: async ({ arc, cloudformation, dryRun, inventory, stage }) => { + if (stage !== 'staging') return + + let config = await getSomeConfig() + cloudformation.Resources.whatever = config + // The returned mutated CloudFormation document will be passed to any other `deploy.start` plugins in sequence + return cloudformation + } +} } +``` + +## Additional resources + +- [Learn more about authoring `deploy.start` plugins](/docs/en/guides/plugins/deploy#deploy.start) +- [Port existing `@macros` extensions to `deploy.start` plugins](/docs/en/guides/plugins/porting-macros-to-plugins) + +> Tip: preview generated CloudFormation without deploying by running `arc deploy --dry-run` and viewing `sam.json` diff --git a/src/views/docs/en/guides/extend/custom-cloudformation.md b/src/views/docs/en/guides/extend/custom-cloudformation.md deleted file mode 100644 index fe40413a..00000000 --- a/src/views/docs/en/guides/extend/custom-cloudformation.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Custom CloudFormation -category: Extend -description: How to use Architect Macros to define or modify resources with CloudFormation ---- - -Architect generates a standard CloudFormation document for deployment with the AWS CLI. `@macros` allow you to process the Architect generated CloudFormation before deployment. This enables customization of any Architect default behavior as well as allowing apps extend into the entire AWS ecosystem of services. - -Architect `@macros` are implemented as a standard Node module with the following function signature: - -```javascript - /** - * Starter macro template - * - * @param {object} arc - Parsed `app.arc` value - * @param {object} sam - Generated CloudFormation template - * @param {string} stage - Deployment target runtime environment 'staging' or 'production' - * @returns {object} Modified CloudFormation template - */ -module.exports = async function mymacro (arc, sam, stage='staging') { - // modify sam cloudformation here - console.log({ arc, sam, stage }) - return sam -} -``` - -> Tip: preview generated CloudFormation without deploying by running `arc deploy --dry-run` and viewing `sam.json` - -Architect finds `@macros` in `src/macros` or project root `node_modules`. An app opts into using `@macros` by adding them to `app.arc`: - -```arc -@app -myapp - -@macros -mymacro -``` - -> In the example above running `arc deploy` will look for `src/macros/mymacro` and then `./node_modules/mymacro` diff --git a/src/views/docs/en/guides/extend/eject-to-cloudformation.md b/src/views/docs/en/guides/extend/eject-to-cloudformation.md deleted file mode 100644 index 60b8ae41..00000000 --- a/src/views/docs/en/guides/extend/eject-to-cloudformation.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Ejecting to CloudFormation -category: Extend -description: Ejecting to CloudFormation -sections: - - Overview - - Tutorial example ---- - -## Overview - -Need to install @architect/architect - -And then in the project directory run `arc deploy --dry-run` - -That will generate sam.json (which is CloudFormation) and print out AWS CLI instructions for deploying diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 2f8e48a7..e6ca9373 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -17,6 +17,7 @@ let Guides = [ 'Logging & monitoring', 'Using ESM', 'Using TypeScript', + 'Customizing CloudFormation' ], 'Frontend': [ 'Static assets', @@ -41,10 +42,6 @@ let Guides = [ 'set', // 'Inventory', ], - // 'Extend': [ - // 'Custom CloudFormation', - // 'Plugins', - // ] }, 'Examples', ] @@ -94,6 +91,7 @@ let About = [ 'Contribute', 'Upgrade guide', 'Playground', + 'Ejecting from Architect' ] module.exports = { From 8891a79f4075586ee994af0ca3a357c9d8eff849 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 13:59:33 -0800 Subject: [PATCH 357/680] Make spellcheck plugin slightly nicer --- src/plugins/spellcheck.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/spellcheck.js b/src/plugins/spellcheck.js index 0f4ad0fa..4d9b22bc 100644 --- a/src/plugins/spellcheck.js +++ b/src/plugins/spellcheck.js @@ -1,24 +1,34 @@ +let { updater } = require('@architect/utils') let { spawn } = require('child_process') let pkg = require('../../package.json') let cmd = pkg.scripts.spellcheck.split(' ') +let update = updater('Spelling') module.exports = { sandbox: { watcher: async ({ filename }) => { if (!filename.endsWith('.md')) return return new Promise((res) => { - console.log('Checking spelling...') + update.start('Checking spelling') + let start = Date.now() + let done = () => update.done(`Checked spelling in ${(Date.now() - start) / 1000} seconds`) let spell = spawn(cmd[0], cmd.slice(1)) let found = false let log = data => { - if (!found) console.log('\nFound spelling or grammar error(s):') + if (!found) { + done() + update.warn(`Found spelling or grammar error(s):`) + } found = true console.log(data.toString()) } spell.stdout.on('data', log) spell.stderr.on('data', log) spell.on('close', code => { - if (!code) console.log('No spelling or grammar errors found!') + if (!code) { + done() + update.done('No spelling or grammar errors found!') + } // Always resolve, errors should have been printed already res() }) From e5d62992c3b9caeed611220a5a77cc51b202a6a7 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 14:38:30 -0800 Subject: [PATCH 358/680] Add how-to guide for porting macros to plugins --- .../plugins/porting-macros-to-plugins.md | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/views/docs/en/guides/plugins/porting-macros-to-plugins.md b/src/views/docs/en/guides/plugins/porting-macros-to-plugins.md index e69de29b..fd7774d7 100644 --- a/src/views/docs/en/guides/plugins/porting-macros-to-plugins.md +++ b/src/views/docs/en/guides/plugins/porting-macros-to-plugins.md @@ -0,0 +1,78 @@ +--- +title: 'Porting @macros to @plugins' +category: Plugins +description: 'How-to port existing @macros to @plugins' +--- + +With the introduction of Architect 10, [`@macros`](/docs/en/reference/project-manifest/macros) were superseded by [`@plugins`](/docs/en/reference/project-manifest/plugins). It is important to note that [`@macros` will not cease to work, and will not be deprecated](http://localhost:3333/docs/en/guides/plugins/deploy#deploy.start). You do not need to port any macros you may have written for Architect. + +However, there are a number of reasons that you may want to port your existing macro to a plugin: + +- The `@macros` interface is also no longer actively maintained, whereas `@plugins` have numerous improvements and will continue to receive future upgrades +- The `@plugins` API surface is significantly more expansive and can do significantly more than `@macros` +- `@macros` and `@plugins` share the same logical namespace, so you may need to ensure there is not a name conflict + + +## How-to port your macro + +### Before + +In this example, we'll assume your project uses a private macro located at `src/macros/extend-arc/index.js`, and a project manifest that looks like so: + +```arc +@app +my-app + +@macros +extend-arc +``` + +The `@macros` API calls for a single function (async or sync) to be exported, and accepts the following arguments: + +```js +// src/macros/extend-arc/index.js +module.exports = async function macro (arc, cloudformation, stage) { + // modify cloudformation.Resources here + return cloudformation +} +``` + + +### After + +The [`deploy.start` plugin API](/docs/en/guides/plugins/deploy#deploy.start), which is the direct successor to the `@macros` interface, is pretty close. To port the above macro, follow these steps: + +1. Move your macro to `src/plugins/extend-arc/index.js` +2. Update your project manifest from `@macros` to `@plugins`: + +```arc +@app +my-app + +@plugins +extend-arc +``` + +3. Update your function to the new semantics: +```js +// src/plugins/extend-arc/index.js +module.exports = { + deploy: { + start: async function ({ arc, cloudformation, dryRun, inventory, stage }) { + // modify cloudformation.Resources here + return cloudformation + } + } +} +``` + +As you may notice, once inside the function, mutations to the `cloudformation` document are passed back in the very same way. (Similarly, returning early does not mutate `cloudformation`.) + +The most important change to note is that your macro, which accepted positional arguments (that you may or may not have named as above) must now be exported as `deploy.start`, and has accepts a single object with named properties. + +Otherwise, they are functionally identical. That's it! + + +### Help + +If you have any questions or issues with your port to plugins, please don't hesitate to [chat with us in Discord](https://discord.gg/y5A2eTsCRX), we'd love to hear from you. From 48fad42cab58ae09647a45e923dd2302afb54c9a Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 14:41:23 -0800 Subject: [PATCH 359/680] Only check links in one CI instance --- .github/workflows/link-checker.yaml | 2 +- src/views/docs/en/guides/plugins/set.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/link-checker.yaml b/.github/workflows/link-checker.yaml index 7cb61c99..2dca2bfc 100644 --- a/.github/workflows/link-checker.yaml +++ b/.github/workflows/link-checker.yaml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - node-version: [ 14.x, 16.x ] + node-version: [ 14.x ] os: [ ubuntu-latest ] # Go diff --git a/src/views/docs/en/guides/plugins/set.md b/src/views/docs/en/guides/plugins/set.md index 6515d741..ce21bbe7 100644 --- a/src/views/docs/en/guides/plugins/set.md +++ b/src/views/docs/en/guides/plugins/set.md @@ -9,7 +9,7 @@ description: 'set cloud resource generator plugins' Any Lambdas or resources defined by a `set` plugin is treated by Architect as a first-class primitive. For example: if you build a plugin that creates a route with `set.http`, Architect would treat that route as though the user had actually added it to their [project manifest](/docs/en/get-started/project-manifest)'s [`@http` pragma](/docs/en/reference/project-manifest/http). -### Caveats +## Caveats Unlike [workflow lifecycle plugins](./overview#workflow-hooks), which execute only when needed, all `set` plugins must execute every time Architect (or any of its modules) run. Thus, they are expected to be synchronous and fast. From 3102cd60644e0b2795471cf860b666614fba41c0 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 14:46:57 -0800 Subject: [PATCH 360/680] Add canonical link to head --- src/http/get-docs-000lang-catchall/index.js | 13 +++++++------ src/views/modules/document/head.js | 5 ++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 1f694ee7..1fb69002 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -2,7 +2,7 @@ require = require('esm')(module) const { readFile } = require('fs/promises') -const path = require('path') +const { join } = require('path') const { http } = require('@architect/functions') const render = require('./renderer') const { redirect: redirectMiddleware } = require('@architect/shared/redirect-map') @@ -15,7 +15,7 @@ const toc = require('@architect/views/docs/table-of-contents') const cache = {} // cheap warm cache async function handler (req) { - let { pathParameters } = req + let { path, pathParameters } = req let { lang, proxy } = pathParameters let parts = proxy.split('/') let docName = parts.pop() @@ -24,7 +24,7 @@ async function handler (req) { return { statusCode: 303, headers: { location: '/playground' } } let doc = `${docName}.md` - let activePath = path.join( + let activePath = join( 'docs', lang, ...parts, @@ -32,9 +32,9 @@ async function handler (req) { ) let active = `/${activePath}` // Add leading slash to match anchor href let editURL = 'https://github.com/architect/arc.codes/edit/main/src/views/docs/' - editURL += path.join(lang, ...parts, doc) + editURL += join(lang, ...parts, doc) - let filePath = path.join( + let filePath = join( __dirname, 'node_modules', '@architect', @@ -79,13 +79,14 @@ async function handler (req) { active, editURL, lang, + path, scripts: [ '/index.js', '/components/arc-viewer.js', '/components/arc-tab.js' ], thirdparty: algolia(lang), - toc + toc, }) } } diff --git a/src/views/modules/document/head.js b/src/views/modules/document/head.js index 1f2682b7..f0fbb349 100644 --- a/src/views/modules/document/head.js +++ b/src/views/modules/document/head.js @@ -1,7 +1,7 @@ let stripCode = str => str.replace(/\<\/?code\>/g, '') export default function Head (props = {}) { - let { category, description, lang = 'en', title } = props + let { category, description, lang = 'en', path, title } = props let descriptionContent = description || 'Architect documentation' let fullTitle = '' if (category && title) @@ -52,6 +52,9 @@ export default function Head (props = {}) { + + + From de00dca34f3168e1ebd78d3c876c92acb5561b45 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Tue, 15 Feb 2022 15:42:42 -0800 Subject: [PATCH 361/680] Minor upgrade guide tweaks --- src/views/docs/en/about/upgrade-guide.md | 17 +++++++++-------- src/views/docs/en/upgrade-guide.md | 4 ---- 2 files changed, 9 insertions(+), 12 deletions(-) delete mode 100644 src/views/docs/en/upgrade-guide.md diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index 6f5cd3b6..d19f6920 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -69,7 +69,7 @@ Architect 4 (Yeti) introduced generic, dependency-free HTTP functions, enhanced --- -### Topics +## Upgrade guides - [Architect 9 → 10](#architect-9-→-10) - [Architect 8 → 9](#architect-8-→-9) @@ -86,18 +86,19 @@ Architect 4 (Yeti) introduced generic, dependency-free HTTP functions, enhanced Architect 10 (name TBA) is a major feature release, introducing the Architect plugins API, and cleaning up internal legacy code, module APIs, and other bits from earlier on in Architect's history. -Most of Architect 10's breaking changes were internal; most users should not encounter breaking changes when upgrading Architect to v10 and Functions to v5. +Most of Architect 10's breaking changes were internal; most users should not encounter breaking changes when upgrading Architect to v10, and Functions + ASAP to v5. -## Removed +### Removed -- Removed the `package` command, which was no longer able to represent the final state of Architect projects. Its (improved) replacement is now: `deploy --eject` -- [Removed `toml` support](https://github.com/architect/architect/discussions/1294) (e.g. `arc.toml`) +- Removed the `package` command, which was no longer able to represent the final state of Architect projects + - Remedy: its (improved) replacement is now: `deploy --eject` - Removed support for legacy `.arc-env` env files (initially deprecated in late 2020) - Remedy: if you are still using a `.arc-env` file, please move your [local env vars to `prefs.arc`](https://arc.codes/docs/en/reference/configuration/local-preferences#%40env) or [`.env`](https://arc.codes/docs/en/reference/configuration/local-preferences#.env-file-support) +- [Removed `toml` support](https://github.com/architect/architect/discussions/1294) (e.g. `arc.toml`) -## Breaking changes +### Breaking changes - The beta plugins API has been largely refactored; wherever possible, hooks from the beta API have been ported to the final shipping plugin API. However, many things changed, so if you authored plugins against the beta API, please refer to the [new plugin documentation](https://arc.codes/docs/en/reference/plugins/api) to ensure compatibility - Due to ongoing issues with unpredictable behavior with certain external libraries, Architect no longer makes use of the `NODE_ENV` environment variable, nor is it automatically added to deployed apps. @@ -114,7 +115,7 @@ Most of Architect 10's breaking changes were internal; most users should not enc - Remedy: simply change the `@indexes` pragma name to `@tables-indexes`; no other changes are required -## Internal breaking changes +### Internal breaking changes The following internal changes should not have any impact on Architect users should Architect v10 be paired with Functions v5, but just in case anyone used these somewhat more obscure internal features, environment variables, etc., we'll enumerate the changes here: @@ -134,7 +135,7 @@ The following internal changes should not have any impact on Architect users sho - Remedy: realistically no one ever actually used this feature in production, because to do so would have necessitated defining an `arc-sessions` or `data` table in your project manifest; that said, if you experimented with these default DynamoDB tables and want to use them in production, simply add them to your `@tables` pragma -## Important non-breaking change +### Important non-breaking change In a future major release, Architect will deprecate all non-namespaced environment variables. For now, Architect prefers the namespaced versions of the same env var, but will support both; some examples: diff --git a/src/views/docs/en/upgrade-guide.md b/src/views/docs/en/upgrade-guide.md deleted file mode 100644 index 0c84a803..00000000 --- a/src/views/docs/en/upgrade-guide.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Upgrade guide -category: Architect ---- From 714cffc7a362e9a26c2d8cfb11646b284a90c902 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 16 Feb 2022 19:06:43 -0800 Subject: [PATCH 362/680] Improve coldstart performance with latest `@architect/functions` Swap out `front-matter` for `tiny-frontmatter` Add `@architect/plugin-node-prune` plugin --- app.arc | 1 + package-lock.json | 322 ++++++++++++------ package.json | 19 +- .../get-docs-000lang-catchall/renderer.js | 2 +- 4 files changed, 228 insertions(+), 116 deletions(-) diff --git a/app.arc b/app.arc index 455d8ca3..e82588b2 100644 --- a/app.arc +++ b/app.arc @@ -16,3 +16,4 @@ any /* @plugins spellcheck +architect/plugin-node-prune diff --git a/package-lock.json b/package-lock.json index 426de010..3c713bb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,53 +5,70 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.0.0-RC.7", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.0-RC.7.tgz", - "integrity": "sha512-vBFeB5QfLhKZAR0ijlUinzf9so3cwIpjgY2Q2KywLI0LF++6vr6NgvSxrW3V8l7YGZTEmWRr3EUJyeUj44Sddw==", - "dev": true, - "requires": { - "@architect/create": "3.2.0-RC.3", - "@architect/deploy": "4.0.0-RC.6", - "@architect/destroy": "3.0.0-RC.0", - "@architect/env": "3.0.0-RC.1", - "@architect/hydrate": "3.0.0-RC.5", - "@architect/inventory": "3.0.0-RC.10", - "@architect/logs": "4.0.0-RC.1", - "@architect/sandbox": "5.0.0-RC.11", + "version": "10.0.0-RC.8", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.0-RC.8.tgz", + "integrity": "sha512-GG05Y8/7DjV0TT0U5jD1MOjZs/BC1iwCftrpkXonYuTv2JN+Eap8VS1QZx+Y9xmuxnXbDKpnkxtBMJ2wL1cKTQ==", + "dev": true, + "requires": { + "@architect/create": "4.0.0", + "@architect/deploy": "4.0.1", + "@architect/destroy": "3.0.0", + "@architect/env": "3.0.0", + "@architect/hydrate": "3.0.0", + "@architect/inventory": "3.0.0", + "@architect/logs": "4.0.0", + "@architect/sandbox": "5.0.0", "aws-sdk": "2.1001.0", "chalk": "4.1.2", "update-notifier": "5.1.0" } }, "@architect/asap": { - "version": "5.0.0-RC.0", - "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-5.0.0-RC.0.tgz", - "integrity": "sha512-JQM3LfYWzJC5PpLltMKVoczrKhSsd2HBG1Yc7Jhee/AVurBFPtyplve7UheImQyYVvytZbRI4OngptZey/3C2Q==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-5.0.0.tgz", + "integrity": "sha512-ffGDhn+XZ5KhAZiftz3xCAfo0MzrwCrOJPevrJaBx87Wlh0B6XcGJJrA5XAjwP3qHFz/GZsMBQDNeQdP5KU5FQ==" }, "@architect/create": { - "version": "3.2.0-RC.3", - "resolved": "https://registry.npmjs.org/@architect/create/-/create-3.2.0-RC.3.tgz", - "integrity": "sha512-EPq7GRRuJsRm71uKdohbOhN56OrlrTO6QICBtBLZ9q8HvIYKRRqy1+I/9HyNpT4z4tW1ajvEIahMSLUXowt1ZA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@architect/create/-/create-4.0.0.tgz", + "integrity": "sha512-ZA2phjLlPG32vtkXhOVbd3piEY2P7WLsfiUE9PYLC+/4wS0vNNkG5gEEQN4EKz1tDT4dNA6rr3pytCLedfpLGA==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0-RC.5", - "@architect/utils": "~3.0.4", + "@architect/inventory": "~3.0.0", + "@architect/utils": "~3.1.0", "chalk": "4.1.2", "lambda-runtimes": "~1.1.1", "minimist": "~1.2.5" + }, + "dependencies": { + "@architect/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/deploy": { - "version": "4.0.0-RC.6", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.0-RC.6.tgz", - "integrity": "sha512-ZVoI1JemPgZ8LNL9q6h027LNxDWRcg/bzW+LbFMSa3WTigT4JEPpnYjQhD+UpTIeN7xxyGDZmM2g5GzlifW4dg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.1.tgz", + "integrity": "sha512-XV/ux7xGUMhHAgVoTvIPjdOLBQJpXBvU8bi8/A8D+fVsvFCAeax3/Wg4KQ4WBQURV3EnUdzTw2khkJfvCG6YYw==", "dev": true, "requires": { - "@architect/create": "~3.2.0-RC.3", - "@architect/hydrate": "~3.0.0-RC.5", - "@architect/inventory": "~3.0.0-RC.8", - "@architect/package": "~8.0.0-RC.1", - "@architect/utils": "~3.1.0-RC.0", + "@architect/create": "~4.0.0", + "@architect/hydrate": "~3.0.0", + "@architect/inventory": "~3.0.0", + "@architect/package": "~8.0.0", + "@architect/utils": "~3.1.0", "chalk": "4.1.2", "fs-extra": "~10.0.0", "get-folder-size": "2.0.1", @@ -67,9 +84,9 @@ }, "dependencies": { "@architect/utils": { - "version": "3.1.0-RC.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0-RC.0.tgz", - "integrity": "sha512-Z5e89NVXukFze/+fhDN9YrGTeTbgT4Vyn5utlaUbdbT0bNY6zSOPIsl5Npiv+y6K1uu+WJii0gMDhOwsb+BCXQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", "dev": true, "requires": { "chalk": "4.1.2", @@ -84,34 +101,68 @@ } }, "@architect/destroy": { - "version": "3.0.0-RC.0", - "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-3.0.0-RC.0.tgz", - "integrity": "sha512-dVrV6t2jSE7GPeX6WI9YdK0JCH/39oaiG6LzrnWtsv5LkQ0HflnBx8uUURuYFuN4jHewMK/6gWr6jsEsa69Rig==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-3.0.0.tgz", + "integrity": "sha512-jaQgCwBNU1IrE4uL0ACQlnXQ0fV4hlez7bdcd8TZywAL8ZZrsr7dTv8QW8XvTzXu3OEt46T3+BxH99Zmj8VZpw==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0-RC.5", - "@architect/utils": "~3.0.4", + "@architect/inventory": "~3.0.0", + "@architect/utils": "~3.1.0", "aws-sdk": "2.1001.0", "minimist": "~1.2.5", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7" + }, + "dependencies": { + "@architect/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/env": { - "version": "3.0.0-RC.1", - "resolved": "https://registry.npmjs.org/@architect/env/-/env-3.0.0-RC.1.tgz", - "integrity": "sha512-C0mIg78BBGKJMN2PP3Le3kxNyvGbwCJNhZDu/K4TXSbkOwJ/x2XpYSB+rGUL6GSDwVHtjq5d5plL1QcvxhSMpw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/env/-/env-3.0.0.tgz", + "integrity": "sha512-1IBwjFyk2Nz0T2nYHx+CQ1WLNqqej6VoScXysVy3r6HqVOB7Q4FWr/GPdAIwwqxxrAt4J4bLdvdfGOkbWldtHA==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0-RC.5", - "@architect/parser": "~5.0.2", - "@architect/utils": "~3.0.4", + "@architect/inventory": "~3.0.0", + "@architect/parser": "~6.0.0", + "@architect/utils": "~3.1.0", "aws-sdk": "2.1001.0", "chalk": "4.1.2", - "dotenv": "~14.3.2", + "dotenv": "~16.0.0", "run-series": "~1.1.9", "run-waterfall": "~1.1.7", "yesno": "~0.3.1" + }, + "dependencies": { + "@architect/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/eslint-config": { @@ -126,9 +177,9 @@ } }, "@architect/functions": { - "version": "5.0.0-RC.2", - "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.0-RC.2.tgz", - "integrity": "sha512-OGrBEsHMvMNHT+suiweRy4ce8y5r3LdzVhzx+Z7wC6Io9XLaZjc1tgm1TsVPJY3nrC0vuxulE3GDDyo+efDLEQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.1.tgz", + "integrity": "sha512-99nkrSttCwZC4Su+pIgvUBz9NGA0sYZQxT0ZcsTUqo96l1cJa6rp8V3ur4IcsP15h8hR5s4YTeIbiL9M7rzkzQ==", "requires": { "cookie": "^0.4.2", "cookie-signature": "^1.1.0", @@ -140,13 +191,13 @@ } }, "@architect/hydrate": { - "version": "3.0.0-RC.5", - "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-3.0.0-RC.5.tgz", - "integrity": "sha512-cg3D2u1hBq7UBLRMYrVTK5YQWMM8bdg1HkK5sQpj18FrhH6yBuWKoLVZUXUYwf29sTjxbaDJoGnQcBXvgX/F9A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-3.0.0.tgz", + "integrity": "sha512-2vmbEAFwgI0MLd0ZqUrqrOUWtgKvQOxqZAWwc80SN9Pl5R99aI+0suPJ98DAcwucEchded8Zde0NIbbcy3zc3w==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0-RC.8", - "@architect/utils": "~3.0.4", + "@architect/inventory": "~3.0.0", + "@architect/utils": "~3.1.0", "acorn-loose": "~8.3.0", "chalk": "4.1.2", "cpr": "~3.0.1", @@ -155,28 +206,45 @@ "minimist": "~1.2.5", "run-series": "~1.1.9", "symlink-or-copy": "~1.3.1" + }, + "dependencies": { + "@architect/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/inventory": { - "version": "3.0.0-RC.10", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0-RC.10.tgz", - "integrity": "sha512-8NZugwR1yPB7j5rCHUsHsQv8iXuLXVbJpZqAm6lG6/p7H0ddOYElB9GgwRilSsyAriiBgmScD0P9FfxaONX+uw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", + "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", "requires": { - "@architect/asap": "~5.0.0-RC.0", - "@architect/parser": "~6.0.0-RC.0", - "@architect/utils": "~3.1.0-RC.0", + "@architect/asap": "~5.0.0", + "@architect/parser": "~6.0.0", + "@architect/utils": "~3.1.0", "lambda-runtimes": "~1.1.1" }, "dependencies": { "@architect/parser": { - "version": "6.0.0-RC.0", - "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-6.0.0-RC.0.tgz", - "integrity": "sha512-SFksHa9ncCEfh4ixJFiwNWigZvpzXiEndAfOul2vk7Z5V6K9plGjnXkdA3cplzeyH2sficgEPPBkcoFTExC7ew==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-6.0.0.tgz", + "integrity": "sha512-KqpMvxt8LHd+OMR4jGaDxhgNlcLf38F3h0Kub3aR6DQShsyMG1KGa8A9Bs95LvIV3LzGV6dXly5Oamvi2APmgg==" }, "@architect/utils": { - "version": "3.1.0-RC.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0-RC.0.tgz", - "integrity": "sha512-Z5e89NVXukFze/+fhDN9YrGTeTbgT4Vyn5utlaUbdbT0bNY6zSOPIsl5Npiv+y6K1uu+WJii0gMDhOwsb+BCXQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", "requires": { "chalk": "4.1.2", "glob": "~7.2.0", @@ -190,53 +258,94 @@ } }, "@architect/logs": { - "version": "4.0.0-RC.1", - "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-4.0.0-RC.1.tgz", - "integrity": "sha512-xGTcD3KAj50UDk5TQUmhsi7oeUAPDW/jpa821vfSfShEsyTFAHn4vJ5P25XSQl9WuyIAT/DSphVxMps01bUv9Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-4.0.0.tgz", + "integrity": "sha512-+Wmwm2Dk69JvhPt+CAZxrK3VPtqxice6iJBl5h1VrkT1zXc/S9Yt4THhqpRkcK1EU+jl8bsgcQYhmCfLcTJM5g==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0-RC.5", - "@architect/utils": "~3.0.4", + "@architect/inventory": "~3.0.0", + "@architect/utils": "~3.1.0", "aws-sdk": "2.1001.0", "chalk": "4.1.2", "minimist": "~1.2.5", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7", "strftime": "~0.10.1" + }, + "dependencies": { + "@architect/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/package": { - "version": "8.0.0-RC.2", - "resolved": "https://registry.npmjs.org/@architect/package/-/package-8.0.0-RC.2.tgz", - "integrity": "sha512-bfVCwRPlzqQfSMuSpaZO06nmu/xznougSQmoiH0NJDyQ+3ukSjy+0qyRQYEihgkoYDZFM2RX8uCtDElYFXfEJA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@architect/package/-/package-8.0.0.tgz", + "integrity": "sha512-YQvNgF56zZPm0fqDQux8nnvkJfBPkW2ZFp1Ect4KzfxLpGLywqglpxmh8//sYVqFa/UZ5hkWGMZGgWBPBZ8zYQ==", "requires": { - "@architect/inventory": "~3.0.0-RC.5", - "@architect/utils": "~3.0.4" + "@architect/inventory": "~3.0.0", + "@architect/utils": "~3.1.0" + }, + "dependencies": { + "@architect/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", + "requires": { + "chalk": "4.1.2", + "glob": "~7.2.0", + "path-sort": "~0.1.0", + "restore-cursor": "3.1.0", + "run-series": "~1.1.9", + "run-waterfall": "~1.1.7", + "sha": "~3.0.0" + } + } } }, "@architect/parser": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-5.0.2.tgz", - "integrity": "sha512-3XTuB/HS3GNDXXUQ2BJt7kVOViTGCR2O4hIUEb1l8FxsSmwzgpiR2CAzUA4ZhySxW+1a+Tg88YL2Yyb2kvLmlw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-6.0.0.tgz", + "integrity": "sha512-KqpMvxt8LHd+OMR4jGaDxhgNlcLf38F3h0Kub3aR6DQShsyMG1KGa8A9Bs95LvIV3LzGV6dXly5Oamvi2APmgg==", "dev": true }, + "@architect/plugin-node-prune": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@architect/plugin-node-prune/-/plugin-node-prune-2.0.1.tgz", + "integrity": "sha512-qS/qKKfBWtboiP84u1RjMZLHr0NK//ILK6E7/ywgYdBKjSCRxmEgPk6d2mbMrQeDdEGIm3fAbhM5pEyU4jChFA==", + "requires": { + "@architect/utils": "~3.0.4" + } + }, "@architect/sandbox": { - "version": "5.0.0-RC.11", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.0.0-RC.11.tgz", - "integrity": "sha512-1EafR5zqo9ZvRCPnYs+rol6BYrNnRofsndQx4XuoC0pIuqSNaJB1Z3DZlYE3T87gr/zM6cfetRInjC5gUJ54Gw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.0.0.tgz", + "integrity": "sha512-0SetdWcc59gcS2gsdcyPh6pwiqAB08YpaVnd/raa2HCXB+wGHvVH6YvYrbgsYnENfwlcVeXpVAPrmmEykwTUgg==", "dev": true, "requires": { - "@architect/asap": "~5.0.0-RC.0", - "@architect/create": "~3.2.0-RC.3", - "@architect/hydrate": "~3.0.0-RC.5", - "@architect/inventory": "~3.0.0-RC.8", - "@architect/utils": "~3.1.0-RC.0", + "@architect/asap": "~5.0.0", + "@architect/create": "~4.0.0", + "@architect/hydrate": "~3.0.0", + "@architect/inventory": "~3.0.0", + "@architect/utils": "~3.1.0", "@begin/hashid": "~1.0.0", "aws-sdk": "2.1001.0", "chalk": "4.1.2", "chokidar": "~3.5.3", "depstatus": "~1.1.1", - "dynalite": "~3.2.1", + "dynalite": "~3.2.2", "finalhandler": "~1.1.2", "glob": "~7.2.0", "http-proxy": "~1.18.1", @@ -249,13 +358,13 @@ "server-destroy": "~1.0.1", "tree-kill": "~1.2.2", "update-notifier": "~5.1.0", - "ws": "~8.4.2" + "ws": "~8.5.0" }, "dependencies": { "@architect/utils": { - "version": "3.1.0-RC.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0-RC.0.tgz", - "integrity": "sha512-Z5e89NVXukFze/+fhDN9YrGTeTbgT4Vyn5utlaUbdbT0bNY6zSOPIsl5Npiv+y6K1uu+WJii0gMDhOwsb+BCXQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", "dev": true, "requires": { "chalk": "4.1.2", @@ -693,6 +802,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -1458,9 +1568,9 @@ } }, "dotenv": { - "version": "14.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", - "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", "dev": true }, "dotignore": { @@ -1911,7 +2021,8 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "esquery": { "version": "1.4.0", @@ -2151,14 +2262,6 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "front-matter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", - "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", - "requires": { - "js-yaml": "^3.13.1" - } - }, "fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -2891,6 +2994,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4869,7 +4973,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "statuses": { "version": "1.5.0", @@ -5179,6 +5284,11 @@ "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=", "dev": true }, + "tiny-frontmatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tiny-frontmatter/-/tiny-frontmatter-1.0.0.tgz", + "integrity": "sha1-9jqhUhbmlobUZjtSJsHnR/dgs+I=" + }, "tiny-json-http": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.1.tgz", @@ -5746,9 +5856,9 @@ } }, "ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "dev": true }, "x-is-string": { diff --git a/package.json b/package.json index 03277d63..7f628e97 100644 --- a/package.json +++ b/package.json @@ -17,28 +17,29 @@ "test": "npm run spellcheck && npm run lint && npm run test:unit:frontend && npm run test:unit:backend" }, "dependencies": { - "@architect/asap": "^5.0.0-RC.0", - "@architect/functions": "^5.0.0-RC.2", - "@architect/inventory": "^3.0.0-RC.10", - "@architect/package": "^8.0.0-RC.2", + "@architect/asap": "^5.0.0", + "@architect/functions": "^5.0.1", + "@architect/inventory": "^3.0.0", + "@architect/package": "^8.0.0", + "@architect/plugin-node-prune": "^2.0.1", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "esm": "^3.2.25", - "front-matter": "^4.0.2", "highlight.js": "^11.4.0", "markdown-it": "^12.3.2", "markdown-it-external-anchor": "^1.0.0", "markdown-it-toc-and-anchor": "^4.2.0", - "slugify": "^1.6.5" + "slugify": "^1.6.5", + "tiny-frontmatter": "^1.0.0" }, "devDependencies": { - "@architect/architect": "^10.0.0-RC.7", + "@architect/architect": "^10.0.0-RC.8", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", - "eslint": "^8.8.0", + "eslint": "^8.9.0", "linkinator": "^3.0.3", "spellchecker-cli": "^4.8.1", "tap-arc": "^0.1.2", - "tape": "^5.5.0", + "tape": "^5.5.2", "tiny-json-http": "^7.3.1" }, "eslintConfig": { diff --git a/src/http/get-docs-000lang-catchall/renderer.js b/src/http/get-docs-000lang-catchall/renderer.js index ea73c605..260bd19f 100644 --- a/src/http/get-docs-000lang-catchall/renderer.js +++ b/src/http/get-docs-000lang-catchall/renderer.js @@ -1,5 +1,5 @@ const { escape } = require('querystring') -const frontmatter = require('front-matter') +const frontmatter = require('tiny-frontmatter') const Markdown = require('markdown-it') const markdownClass = require('./markdown-class') const markdownExternalAnchor = require('markdown-it-external-anchor') From af242f977f3a4b94637ca7535b35d2ccfedc92f2 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 16 Feb 2022 19:25:49 -0800 Subject: [PATCH 363/680] Cache entire render of view, not just the markdown read --- src/http/get-docs-000lang-catchall/index.js | 56 +++++++++++---------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js index 1fb69002..4ebdac11 100644 --- a/src/http/get-docs-000lang-catchall/index.js +++ b/src/http/get-docs-000lang-catchall/index.js @@ -44,12 +44,38 @@ async function handler (req) { ...parts, doc ) - let file try { - if (!cache[filePath]) - cache[filePath] = await readFile(filePath, 'utf8') - file = cache[filePath] + let body, file + if (cache[filePath]) { + body = cache[filePath] + } + else { + file = await readFile(filePath, 'utf8') + body = cache[filePath] = Html({ + ...render(file), + active, + editURL, + lang, + path, + scripts: [ + '/index.js', + '/components/arc-viewer.js', + '/components/arc-tab.js' + ], + thirdparty: algolia(lang), + toc, + }) + } + + return { + statusCode: 200, + headers: { + 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', + 'content-type': 'text/html; charset=utf8' + }, + body + } } catch (error) { // TODO: Load category "index" landing if available @@ -67,28 +93,6 @@ async function handler (req) { }) } } - - return { - statusCode: 200, - headers: { - 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', - 'content-type': 'text/html; charset=utf8' - }, - body: Html({ - ...render(file), - active, - editURL, - lang, - path, - scripts: [ - '/index.js', - '/components/arc-viewer.js', - '/components/arc-tab.js' - ], - thirdparty: algolia(lang), - toc, - }) - } } exports.handler = http.async(redirectMiddleware, handler) From 9b0399a143fa0e28a10ca751aa87dbedab14a3c8 Mon Sep 17 00:00:00 2001 From: macdonst Date: Wed, 16 Feb 2022 22:59:27 -0500 Subject: [PATCH 364/680] Use forked markdown toc and anchor Signed-off-by: macdonst --- package-lock.json | 21 +++------------------ package.json | 2 +- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c713bb9..9032a118 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3484,12 +3484,10 @@ "integrity": "sha512-d6Jb+kLciiv7uueM8q46k6szwr+B8QYg5ppiHVvfaS6hTx1KHpKwYDivmPAcNJYx0wUPEmRre9RgEnM5oHcdMw==" }, "markdown-it-toc-and-anchor": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz", - "integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==", + "version": "github:macdonst/markdown-it-toc-and-anchor#d4a6b9b21d2d560f4b7b91bdaec9fa23df41edf8", + "from": "github:macdonst/markdown-it-toc-and-anchor", "requires": { - "clone": "^2.1.0", - "uslug": "^1.0.4" + "clone": "^2.1.0" } }, "marked": { @@ -5531,11 +5529,6 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -5600,14 +5593,6 @@ "prepend-http": "^2.0.0" } }, - "uslug": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", - "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=", - "requires": { - "unorm": ">= 1.0.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 7f628e97..6f0a8b40 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "highlight.js": "^11.4.0", "markdown-it": "^12.3.2", "markdown-it-external-anchor": "^1.0.0", - "markdown-it-toc-and-anchor": "^4.2.0", + "markdown-it-toc-and-anchor": "github:macdonst/markdown-it-toc-and-anchor", "slugify": "^1.6.5", "tiny-frontmatter": "^1.0.0" }, From 270f96ad39fb8d9ca09829365d7d422d24748d0f Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 15 Feb 2022 20:50:31 -0700 Subject: [PATCH 365/680] update CLI sandbox doc with more local prefs reference also adjust list and nested list styles --- public/css/index.css | 7 + .../markdown-class-mappings.js | 3 + src/views/docs/en/reference/cli/sandbox.md | 126 ++++++++++++++---- 3 files changed, 113 insertions(+), 23 deletions(-) diff --git a/public/css/index.css b/public/css/index.css index 5695fbb2..915b6232 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -92,6 +92,13 @@ label.sidebar-group-title + ul { } } +li > ul.mb1 { + margin-bottom: 0; +} +li > ol.mb1 { + margin-bottom: 0; +} + details > summary { list-style: none; } diff --git a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js index 247b026e..d5c0d7f4 100644 --- a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js +++ b/src/http/get-docs-000lang-catchall/markdown-class-mappings.js @@ -25,6 +25,9 @@ module.exports = { p: [ 'mb-1' ], + ol: [ + 'mb1' + ], ul: [ 'mb1' ], diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index d685fbfd..7b291cee 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -28,17 +28,43 @@ arc sandbox [--port|--disable-symlinks|--no-hydrate|--verbose] - `[--disable-symlinks]` Disable symlinking `src/shared` and copy instead - `[--no-hydrate]` Disables hydration -### Local preferences +### CLI variables -Sandbox will take into account Architect [local preferences](../configuration/local-preferences). +The following variables can be set on the command line when running `arc sandbox`. Other variables will be ignored by Sandbox. -#### `@sandbox` +- `NODE_ENV` - `testing|staging|production` + - Defaults to `testing` +- `ARC_API_TYPE` - Set the API Gateway API type + - Can be one of `http` (aliased to `httpv2`), `httpv1`, `rest` + - Defaults to `http` +- `PORT` - Manually specify HTTP port + - Defaults to `3333` +- `ARC_LOCAL`- If present and used in conjunction with `NODE_ENV=staging|production`, emulates live `staging` or `production` environment + - Uses your [local preferences `@env`](../configuration/local-preferences#%40env) environment variables for the appropriate stage + - Connects Sandbox to live AWS events and DynamoDB infrastructure + - Requires valid AWS credentials with the same profile name as defined in your [project manifest](../project-manifest/aws#profile) +- `ARC_QUIET` - If present, disable (most) logging + +#### Example -The following can be set as a part of the [`@sandbox`](../configuration/local-preferences#sandbox) pragma. +Run Sandbox in quiet mode on a different port: + +```bash +ARC_QUIET=1 PORT=8888 npx arc sandbox +``` -- `env`* - Override the local environment setting to use `staging` or `production` so that Sandbox uses that stage's environment variables as set in local preferences `@env` or in the project's `.env` file. +## Local preferences + +Several Architect [local preferences](../configuration/local-preferences) can be leveraged to change how Sandbox works while developing locally. + +### `@sandbox` + +The following can be set as a part of the [`@sandbox`](../configuration/local-preferences#%40sandbox) pragma. + +- `env`* - Override the local environment setting to use `staging` or `production` so that Sandbox uses that stage's environment variables as set in [local preferences `@env`](../configuration/local-preferences#%40env) or in the project's `.env` file. - Can be one of `testing` (default), `staging`, or `production` -- `useAws`* - Use live AWS infrastructure from Sandbox. Specifically, `@tables`, `@tables-indexes`, `@events`, and `@queues`. Uses the `staging` environment by default, but `env` can be set to `production`. +- `useAws`* - Use live AWS infrastructure from Sandbox. Specifically, `@tables`, `@tables-indexes`, `@events`, and `@queues`. + - Uses the `staging` environment by default, but `env` can be set to `production`. - Defaults to `false` - `no-hydrate` - Disable [function hydration](./hydrate) on Sandbox start. - Defaults to `false` @@ -52,9 +78,9 @@ no-hydrate true \* These advanced options should be used with care since they will allow local development code to interact with live AWS resources. -#### `@sandbox-startup` +### `@sandbox-startup` -Additionally, Sandbox can run shell commands on startup by setting [`@sandbox-startup`](../configuration/local-preferences#sandbox-startup) in [local preferences](../configuration/local-preferences). +Additionally, Sandbox can run shell commands on startup by setting [`@sandbox-startup`](../configuration/local-preferences#%40sandbox-startup) in [local preferences](../configuration/local-preferences). ```arc @sandbox-startup @@ -62,23 +88,77 @@ node scripts/seed_db.js echo 'hello' ``` -### Environment variables +### `@create` -- `NODE_ENV` - `testing|staging|production` - - Defaults to `testing` -- `ARC_API_TYPE` - Set the API Gateway API type - - Can be one of `http` (aliased to `httpv2`), `httpv1`, `rest` - - Defaults to `http` -- `PORT` - Manually specify HTTP port - - Defaults to `3333` -- `ARC_LOCAL`- If present and used in conjunction with `NODE_ENV=staging|production`, emulates live `staging` or `production` environment - - Uses your local preferences `@staging` or `@production` environment variables - - Connects Sandbox to live AWS events and DynamoDB infrastructure - - Requires valid AWS credentials with the same profile name as defined in your [project manifest](../project-manifest/aws#profile) -- `ARC_QUIET` - If present, disable (most) logging +Upon starting, Sandbox can automatically scaffold resources (via [`arc init`](./init)) found in the [application's manifest](../../get-started/project-manifest) that do not yet exist. Options are set with [`@create` in local preferences](../configuration/local-preferences#%40create). + +- `autocreate` - Set to `true` to enable automatic creation of boilerplate Lambda handlers and static assets if they do not exist. +- `templates` - Specify templates for automatic resource scaffolding. + - ` path/to/template.ext` + - Does not enable `autocreate` + +```arc +@create +autocreate true +templates + http path/to/template/http.js + events path/to/template/events.py +``` + +### `@env` + +Architect Sandbox will load variables for Sandbox's current environment (`testing`, `staging`, or `production`) from a [local preferences file with `@env`](../configuration/local-preferences#%40env). If a project contains a `.env` file, Architect will load those variables _instead_. + +Variables from local preference files and `.env` will **not** be merged. Further details, including the variable load-strategy are [outlined below](#environment-variables). + +## Environment variables + +Sandbox automatically loads environment variables for availability at runtime (`process.env.MY_VAR` in Node.js). Environment variables can be set in a few locations. It's important to understand how each source is prioritized when developing locally. + +### Load strategy + +Sandbox will prioritize... + +1. a project's `.env` file (if it exists), +2. then project-level Architect preferences, +3. and finally global Architect preferences. + +Variables across these sources are **not** merged. +Using a [local preferences file with `@env`](../configuration/local-preferences#%40env) offers the most flexibility since variables can be specified per environment: `testing`, `staging`, and `production`. + +### Example scenario + +If `.env` is found, Sandbox will not load any variables from any Arc preferences. Given the following case with 3 environment variable sources: + +```bash +# ./.env +URL="https://arc.codes" +``` + +```arc +# ./prefs.arc +@env +testing + URL www.architect.fake +``` + +```arc +# ~/.preferences.arc +@env +testing + URL ftp://arc.ftp + ADMIN_PASS zero cool +``` + +The following is true in a Node.js function run with Sandbox: + +```js +process.env.URL === 'https://arc.codes' // true +process.env.ADMIN_PASS // undefined +``` -### Local Database +## Local Database Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@tables-indexes` found in the `app.arc` file. `@tables-streams` is not currently supported by dynalite. @@ -86,7 +166,7 @@ When Sandbox is terminated, any data written is cleared from memory. You can set a custom port by using an environment variable: `ARC_TABLES_PORT=5555`. -#### Live database example +### Live database example Connect Sandbox to the DynamoDB staging database on AWS: From 02eda9bcd01f6d4a1eabecc229df216f3581e3bd Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 15 Feb 2022 21:03:30 -0700 Subject: [PATCH 366/680] update deploy, env, and init with local prefs info --- src/views/docs/en/reference/cli/deploy.md | 17 +++++++++++++++++ src/views/docs/en/reference/cli/env.md | 2 +- src/views/docs/en/reference/cli/init.md | 14 ++++++++++++++ src/views/docs/en/reference/cli/sandbox.md | 8 ++++---- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/views/docs/en/reference/cli/deploy.md b/src/views/docs/en/reference/cli/deploy.md index b85646ec..c26ac91a 100644 --- a/src/views/docs/en/reference/cli/deploy.md +++ b/src/views/docs/en/reference/cli/deploy.md @@ -28,6 +28,23 @@ arc deploy [--production|--static|--direct] - `[--dry-run]` Creates a CloudFormation template but does not deploy it. A dry-run allows you to check the CloudFormation and SAM output before deploying the actual stack. - `[--verbose, -v]` Displays the full deploy status messages. +## Local preferences: `@create` + +When deploying, Architect can automatically scaffold resources (via [`arc init`](./init)) found in the [application's manifest](../../get-started/project-manifest) that do not yet exist. Options are set with [`@create` in local preferences](../configuration/local-preferences#%40create). + +- `autocreate` - Set to `true` to enable automatic creation of boilerplate Lambda handlers and static assets if they do not exist. +- `templates` - Specify templates for automatic resource scaffolding. + - ` path/to/template.ext` + - Does not enable `autocreate` + +```arc +@create +autocreate true +templates + http path/to/template/http.js + events path/to/template/events.py +``` + ## Examples ### Deploy a staging stack diff --git a/src/views/docs/en/reference/cli/env.md b/src/views/docs/en/reference/cli/env.md index 30386d45..1fa8ce1c 100644 --- a/src/views/docs/en/reference/cli/env.md +++ b/src/views/docs/en/reference/cli/env.md @@ -6,7 +6,7 @@ description: Read and write environment variables for Lambda functions. Read and write environment variables. This allows apps to centrally store sensitive configuration data, such as API keys, outside of the codebase in revision control. -> `arc env` will **not** upload variables from a project's local [`preferences.arc`](../configuration/local-preferences#%40env); however, it will download variables from AWS and overwrite local preferences. +> `arc env` will **not** upload variables from a project's [local preferences file](../configuration/local-preferences#%40env); however, it will download variables from AWS and overwrite local preference entries. ## Usage diff --git a/src/views/docs/en/reference/cli/init.md b/src/views/docs/en/reference/cli/init.md index 195056ec..cdbe9b3c 100644 --- a/src/views/docs/en/reference/cli/init.md +++ b/src/views/docs/en/reference/cli/init.md @@ -18,6 +18,20 @@ arc init [--static|--runtime] - `[--runtime, -r]` Create a new project with a specified runtime, options are node, deno, python, or ruby - `[--verbose, -v]` Even more output +## Local preferences: `@create` + +`arc init` can use specified templates when scaffolding new resources. Options are set with [`@create` in local preferences](../configuration/local-preferences#%40create). + +- `templates` - Specify templates for automatic resource scaffolding. + - ` path/to/template.ext` + +```arc +@create +templates + http path/to/template/http.js + events path/to/template/events.py +``` + ## Examples ### Create a new app diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index 7b291cee..79515591 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -21,14 +21,14 @@ Architect projects work locally and offline. Sandbox emulates most app resources arc sandbox [--port|--disable-symlinks|--no-hydrate|--verbose] ``` -### Flags +## Flags - `[--port, -p]` Manually specify HTTP port (default `3333`) - `[--verbose, -v]` Enable verbose logging - `[--disable-symlinks]` Disable symlinking `src/shared` and copy instead - `[--no-hydrate]` Disables hydration -### CLI variables +## CLI variables The following variables can be set on the command line when running `arc sandbox`. Other variables will be ignored by Sandbox. @@ -45,7 +45,7 @@ The following variables can be set on the command line when running `arc sandbox - Requires valid AWS credentials with the same profile name as defined in your [project manifest](../project-manifest/aws#profile) - `ARC_QUIET` - If present, disable (most) logging -#### Example +### Example Run Sandbox in quiet mode on a different port: @@ -158,7 +158,7 @@ process.env.URL === 'https://arc.codes' // true process.env.ADMIN_PASS // undefined ``` -## Local Database +## Local database Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@tables-indexes` found in the `app.arc` file. `@tables-streams` is not currently supported by dynalite. From 804704026eb95839e66233ce2afeba0f69521917 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 18 Feb 2022 13:32:44 -0800 Subject: [PATCH 367/680] =?UTF-8?q?"serverless"=20=E2=86=92=20"Functional?= =?UTF-8?q?=20Web=20App"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 2 +- readme.md | 2 +- src/views/docs/en/about/contribute.md | 4 ++- src/views/docs/en/get-started/quickstart.md | 2 +- .../docs/en/get-started/why-architect.md | 6 ++-- .../en/guides/backend/events-and-queues.md | 2 +- .../custom-source-paths.md | 3 +- .../dependency-management.md | 4 +-- .../logging-and-monitoring.md | 5 +++- .../docs/en/guides/frontend/middleware.md | 3 +- .../docs/en/guides/frontend/web-sockets.md | 2 +- .../en/guides/frontend/websocket-functions.md | 6 +++- src/views/docs/en/guides/plugins/overview.md | 2 +- src/views/docs/en/introduction.md | 30 ------------------- src/views/modules/document/head.js | 8 ++--- 15 files changed, 32 insertions(+), 49 deletions(-) delete mode 100644 src/views/docs/en/introduction.md diff --git a/package-lock.json b/package-lock.json index 9032a118..962d9b60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -379,7 +379,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#447ac052eaf2efa61fe6516b96584b5a3b1c8f3f", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#c838fc6fc325da86b01eb262ed1039093e87f8e9", "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, diff --git a/readme.md b/readme.md index bb9dea25..5bb5d082 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ ## [`https://arc.codes`](https://arc.codes) -> Docs site for the Architect serverless framework! +> Docs site for the OpenJS Architect framework! [![GitHub CI status](https://github.com/architect/arc.codes/workflows/Node%20CI/badge.svg)](https://github.com/architect/arc.codes/actions?query=workflow%3A%22Node+CI%22) diff --git a/src/views/docs/en/about/contribute.md b/src/views/docs/en/about/contribute.md index ac18b72b..e967972e 100644 --- a/src/views/docs/en/about/contribute.md +++ b/src/views/docs/en/about/contribute.md @@ -6,6 +6,7 @@ description: How to contribute to Architect. Architect is an open source project and you can totally help out! Contributing doesn't just mean landing code. It can be reporting bugs, helping us triage bugs, suggesting new features, writing docs, sharing examples and plain kicking it in our community chat. These are all helpful contributions! + ## Agreement to the Architect Code of Conduct By participating in and contributing to the Architect community — including, but not limited to its open source projects, any related online venues such as GitHub, Discord, and in-person events, etc. — you agree to the Architect Code of Conduct. @@ -42,8 +43,9 @@ Architect project documentation is in the following repos: - architect/arc.codes - the primary documentation website (version 6) - architect/v5.arc.codes - version 5 docs site + ## Helping out -We are always happy to accept a pull request to any of the repositories above. If you have a larger problem to solve or idea for a new feature please file an issue for community discussion. If you're having a time sensitive problem and need to talk things through you can almost always find someone in our community chat. It's also a great place to socialize new ideas and to solicit help on how to model specific serverless patterns. +We are always happy to accept a pull request to any of the repositories above. If you have a larger problem to solve or idea for a new feature please file an issue for community discussion. If you're having a time sensitive problem and need to talk things through you can almost always find someone in our community chat. It's also a great place to socialize new ideas and to solicit help on how to model specific [Functional Web App (FWA)](https://fwa.dev) patterns. Please help us by making it easy for us to help you! If you are experiencing a bug, please, have a reduced test case and steps to reproduce prepared. In our process, the first step to resolution is to create a failing test case so we can be sure there are no future regressions. By having a reduced case, even just an example project, and steps to reproduce you will save us all time getting to the fix! diff --git a/src/views/docs/en/get-started/quickstart.md b/src/views/docs/en/get-started/quickstart.md index 321dd945..193695a5 100644 --- a/src/views/docs/en/get-started/quickstart.md +++ b/src/views/docs/en/get-started/quickstart.md @@ -4,7 +4,7 @@ category: Get started description: Get started quickly with Architect --- -> Architect is a simple tool to build and deliver powerful cloud function-based web apps and APIs +> Architect is a simple framework for building and delivering powerful [Functional Web Apps](https://fwa.dev) on AWS ## Create a new project diff --git a/src/views/docs/en/get-started/why-architect.md b/src/views/docs/en/get-started/why-architect.md index 52a98923..36107e16 100644 --- a/src/views/docs/en/get-started/why-architect.md +++ b/src/views/docs/en/get-started/why-architect.md @@ -4,11 +4,13 @@ category: Get started description: Why is Architect important to you? --- -> Architect provides everything you need to build massively scalable serverless apps with low code, clear and terse config, and zero ceremony +> Architect provides everything you need to build massively scalable [Functional Web Apps (FWAs)](https://fwa.dev) with low code, clear and terse config, and zero ceremony + ## The best developer experience -Going serverless is fraught with complex vendor arcana and market noise. This is where Architect comes in. Architect is an opinionated developer experience (DX) for building database backed web apps with AWS. We remove all the noise and friction to building serverlessly. We prioritize speed with fast local dev, smart configurable defaults and flexible Infrastructure as Code. And then we get out of your way so you can focus on business logic instead of glue code and only pay for services while in use, on-demand, and otherwise _scale to zero_. +Building a functional web app can be fraught with complex vendor arcana and market noise. This is where Architect comes in. Architect is an opinionated developer experience (DX) for building database backed web apps with AWS. We remove all the noise and friction to building FWAs. We prioritize speed with fast local dev, smart configurable defaults and flexible Infrastructure as Code. And then we get out of your way so you can focus on business logic instead of glue code and only pay for services while in use, on-demand, and otherwise _scale to zero_. + ### Work locally diff --git a/src/views/docs/en/guides/backend/events-and-queues.md b/src/views/docs/en/guides/backend/events-and-queues.md index 34ed365c..5781a553 100644 --- a/src/views/docs/en/guides/backend/events-and-queues.md +++ b/src/views/docs/en/guides/backend/events-and-queues.md @@ -11,7 +11,7 @@ sections: ## Overview -Background tasks are a common workload and perfect for serverless environments. They reinforce event-driven architecture and allow you to perform asynchronous work across a distributed system. These functions are well suited for processes that don't require an immediate response, or are too resource intensive for a single function. +Background tasks are a common workload and perfect for [Functional Web Apps](https://fwa.dev). They reinforce event-driven architecture and allow you to perform asynchronous work across a distributed system. These functions are well suited for processes that don't require an immediate response, or are too resource intensive for a single function. Architect has three main primitives of background functions: - [@events](/docs/en/reference/arc-pragmas/@events) - A pub/sub service that uses SNS. diff --git a/src/views/docs/en/guides/developer-experience/custom-source-paths.md b/src/views/docs/en/guides/developer-experience/custom-source-paths.md index 5319e8db..ebe0f84b 100644 --- a/src/views/docs/en/guides/developer-experience/custom-source-paths.md +++ b/src/views/docs/en/guides/developer-experience/custom-source-paths.md @@ -7,10 +7,11 @@ Define resources in a more verbose format to configure custom Lambda source dire ## Use cases -- Migrate existing repos to serverless tech +- Migrate existing repos to the [Functional Web App pattern](https://fwa.dev) - Use frontend frameworks that have their own folder requirements - Better enable local code transpilation by pointing to generated `./dist` directories + ## Example diff --git a/src/views/docs/en/guides/developer-experience/dependency-management.md b/src/views/docs/en/guides/developer-experience/dependency-management.md index 05dc34f6..fee51560 100644 --- a/src/views/docs/en/guides/developer-experience/dependency-management.md +++ b/src/views/docs/en/guides/developer-experience/dependency-management.md @@ -4,7 +4,7 @@ category: Developer experience description: Architect dependency structure and hydration --- -All serverless applications have project level dependencies and function level dependencies. Project level dependencies are defined at the root of the project. Lambda functions within a project are deployed individually and subsequently need to package their own dependencies. Different deployment frameworks handle this in different ways depending on the runtime; Architect projects encourage single responsibility functions with the minimum number of dependencies. This intentional isolation leads to easier debugging, faster coldstart and least privilege security. +All [Functional Web Apps](https://fwa.dev) have project level dependencies and function level dependencies. Project level dependencies are defined at the root of the project. Lambda functions within a project are deployed individually and subsequently need to package their own dependencies. Different deployment frameworks handle this in different ways depending on the runtime; Architect projects encourage single responsibility functions with the minimum number of dependencies. This intentional isolation leads to easier debugging, faster coldstart and least privilege security. ## Node @@ -57,7 +57,7 @@ bundle add architect-functions Prior to deploying, it is recommended to configure Bundler to work in a Lambda environment. -You'll need to let Bundler know about Lambda's platform architecture by adding an entry to the `Gemfile.lock`. +You'll need to let Bundler know about Lambda's platform architecture by adding an entry to the `Gemfile.lock`. Additionally, Bundler often tries to write to the filesystem at runtime. Freeze the bundle by setting the `BUNDLE_FROZEN` environment variable to `1`. ```bash diff --git a/src/views/docs/en/guides/developer-experience/logging-and-monitoring.md b/src/views/docs/en/guides/developer-experience/logging-and-monitoring.md index 9cf26942..4b284981 100644 --- a/src/views/docs/en/guides/developer-experience/logging-and-monitoring.md +++ b/src/views/docs/en/guides/developer-experience/logging-and-monitoring.md @@ -6,6 +6,7 @@ description: How to use log output in your Architect project Architect logs to [AWS CloudWatch](https://aws.amazon.com/cloudwatch/). + ## Supported runtimes - **Node** `console.log` or any logging library that writes to stdout or stderr @@ -13,12 +14,14 @@ Architect logs to [AWS CloudWatch](https://aws.amazon.com/cloudwatch/). - **Ruby** `puts` or any logging library that writes to stdout or stderr - **Python** `print` or any logging library that writes to stdout or stderr + ### See also -- CloudWatch captures many metrics from serverless primitives especially [API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html) +- CloudWatch captures many metrics from [Functional Web App](https://fwa.dev) primitives, especially [API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html) - [X-Ray](https://aws.amazon.com/xray/) offers deeper service call introspection capabilities - There are many third party tools to further extend your app with structured logs + ## Example Given the following `app.arc` file: diff --git a/src/views/docs/en/guides/frontend/middleware.md b/src/views/docs/en/guides/frontend/middleware.md index a9cdcc51..bc51c49b 100644 --- a/src/views/docs/en/guides/frontend/middleware.md +++ b/src/views/docs/en/guides/frontend/middleware.md @@ -255,7 +255,8 @@ arc sandbox ## arc.http.express -Architect also has a middleware function to wrap Express.js logic, this is good for migrating paths from existing Express applications into a serverless environment. It should be noted that bundling an entire web server in a Lambda function will result in poor performance if the entire function payload with dependencies exceeds 5MB. But, if you are already comfortable with understanding Express routing for backend APIs, then this helper can get your app up and running. +Architect also has a middleware function to wrap Express.js logic, this is good for migrating paths from existing Express applications into the [Functional Web App pattern](https://fwa.dev). It should be noted that bundling an entire web server in a Lambda function will result in poor performance if the entire function payload with dependencies exceeds 5MB. But, if you are already comfortable with understanding Express routing for backend APIs, then this helper can get your app up and running. + ### Example diff --git a/src/views/docs/en/guides/frontend/web-sockets.md b/src/views/docs/en/guides/frontend/web-sockets.md index 1eac16d9..ca3221af 100644 --- a/src/views/docs/en/guides/frontend/web-sockets.md +++ b/src/views/docs/en/guides/frontend/web-sockets.md @@ -1,7 +1,7 @@ --- title: Adding WebSockets to your app category: Frontend -description: Add real-time connections between clients with serverless functions. +description: Add real-time connections between clients with cloud functions. sections: - Overview - Connecting to your WebSocket diff --git a/src/views/docs/en/guides/frontend/websocket-functions.md b/src/views/docs/en/guides/frontend/websocket-functions.md index 74ac48a5..fabb0cb1 100644 --- a/src/views/docs/en/guides/frontend/websocket-functions.md +++ b/src/views/docs/en/guides/frontend/websocket-functions.md @@ -18,7 +18,8 @@ We accomplish this by using [API Gateway](https://docs.aws.amazon.com/apigateway Architect provides endpoints pre-configured with Lambda handler functions deployed and ready to iterate, complete with local development and isolated staging and production environments. -### When and why would someone want to use a serverless WebSocket? + +### When and why would someone want to use a cloud function WebSocket? - Your app needs real time push of data; this includes (but is not limited to) web browsers. (Many things speak the `wss` protocol!) - You desire a stateless runtime execution model for your app layer; your app receives WebSocket events, processes them, possibly communicates back to socket clients by posting through an HTTP API, and then terminates execution @@ -32,6 +33,7 @@ Architect provides endpoints pre-configured with Lambda handler functions deploy [Event Payload](#event-payload) [Examples](#examples) + ## Getting started ### Provision @@ -122,6 +124,7 @@ WebSocket functions are always invoked with an `event` payload that contains use - `event.requestContext.apiId` the currently executing WebSocket `apiId` - `event.body` the message payload + ### Publish event payload (JSON) to a WebSocket client Node @@ -230,6 +233,7 @@ msg.addEventListener('keyup', function(e) { }) ``` + ### Send Events from Lambda Send a JSON payload to any `connectionId` from runtime function code. diff --git a/src/views/docs/en/guides/plugins/overview.md b/src/views/docs/en/guides/plugins/overview.md index d9472003..24543271 100644 --- a/src/views/docs/en/guides/plugins/overview.md +++ b/src/views/docs/en/guides/plugins/overview.md @@ -33,7 +33,7 @@ another-private-plugin # loads from `foo/index.js` ## Authoring plugins -Architect provides an end-to-end suite of workflows, conventions, and optimized defaults for building excellent serverless web apps and APIs with AWS. Architect plugins enable developers to extend (or override) this functionality in a variety of ways with interfaces into both workflows and resource creation. +Architect provides an end-to-end suite of workflows, conventions, and optimized defaults for building excellent [Functional Web Apps](https://fwa.dev) with AWS. Architect plugins enable developers to extend (or override) this functionality in a variety of ways with interfaces into both workflows and resource creation. To create a fresh plugin, you can run `npx arc create --plugin my-plugin-name` diff --git a/src/views/docs/en/introduction.md b/src/views/docs/en/introduction.md deleted file mode 100644 index 5b07672b..00000000 --- a/src/views/docs/en/introduction.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Introduction -category: Architect -description: Architect introduction ---- - - - - -> Architect provides everything you need to build massively scalable serverless apps with low code, clear and terse config, and zero ceremony - -## The best developer experience - -Going serverless is fraught with complex vendor arcana and market noise. This is where Architect comes in. Architect is an opinionated developer experience (DX) for building database backed web apps with AWS. We remove all the noise and friction to building serverlessly. We prioritize speed with fast local dev, smart configurable defaults and flexible Infrastructure as Code. And then we get out of your way so you can focus on business logic instead of glue code and only pay for services while in use, on-demand, and otherwise _scale to zero_. - -### Work locally - -Developers need to work locally, to debug, test, and preview code before deploying it. Faster iterations means removing latency in feedback cycles. Architect devs iterate even faster with identical staging and production deployment only seconds away. Other systems require you to figure out these environments and more often than not ad hoc implementations introduce bug vectors due to subtle incompatibilities. Architect treats local development, staging and production as first class concerns. - -### Infrastructure as Code - -At its heart Architect is an [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code) (IaC) framework. Architect defines a high level manifest file, in multiple open text formats, and turns formerly complex cloud infrastructure provisioning into a build artifact. You define the cloud infrastructure your application code requires and check that manifest into version control so infra and code are always aligned and deterministic. Architect compiles manifest code into AWS CloudFormation and deploys it. Architect supports a native text file format `app.arc` in addition to popular formats: `package.json`, `arc.json`, and `arc.yaml`. Teams can choose the dialect that works best for them. - -### Secured to least privilege by default - -Architect apps are compiled into AWS SAM applications for deployment with CloudFormation. All resources defined in the manifest share one IAM Role with least privilege access to only the resources defined in the same stack. You can modify the generated CloudFormation to change this behavior to lock things down even more or to access AWS resources outside the scope of the current stack. - -### Open source and open governance - -Architect is part of the OpenJS Foundation and is Apache 2.0 licensed. Architect as an open source project prioritizes regular release cadence and backwards compatibility at all costs. diff --git a/src/views/modules/document/head.js b/src/views/modules/document/head.js index f0fbb349..d0ad3e17 100644 --- a/src/views/modules/document/head.js +++ b/src/views/modules/document/head.js @@ -19,25 +19,25 @@ export default function Head (props = {}) { ${stripCode(fullTitle)} - + - + - + - + From a9bf74ee45835aca92e4b23cbf0da7492cba336b Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 18 Feb 2022 15:44:30 -0800 Subject: [PATCH 368/680] Add Inventory reference for plugins --- package-lock.json | 2 +- src/views/docs/en/get-started/quickstart.md | 2 +- src/views/docs/en/guides/plugins/deploy.md | 4 +- src/views/docs/en/guides/plugins/inventory.md | 131 ++++++++++++++++++ src/views/docs/table-of-contents.js | 2 +- 5 files changed, 137 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 962d9b60..23cabd7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -379,7 +379,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#c838fc6fc325da86b01eb262ed1039093e87f8e9", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#1b60fdeff5a0025370820b0e297cdc0be08099f9", "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, diff --git a/src/views/docs/en/get-started/quickstart.md b/src/views/docs/en/get-started/quickstart.md index 193695a5..ed6cd093 100644 --- a/src/views/docs/en/get-started/quickstart.md +++ b/src/views/docs/en/get-started/quickstart.md @@ -4,7 +4,7 @@ category: Get started description: Get started quickly with Architect --- -> Architect is a simple framework for building and delivering powerful [Functional Web Apps](https://fwa.dev) on AWS +> Architect is a simple framework for building and delivering powerful [Functional Web Apps (FWAs)](https://fwa.dev) on AWS ## Create a new project diff --git a/src/views/docs/en/guides/plugins/deploy.md b/src/views/docs/en/guides/plugins/deploy.md index 8d64d7ae..5d9c4e57 100644 --- a/src/views/docs/en/guides/plugins/deploy.md +++ b/src/views/docs/en/guides/plugins/deploy.md @@ -79,10 +79,12 @@ module.exports = { deploy: { ``` -## `deploy.target` +## `deploy.target` (in beta) Bypass CloudFormation deployment to AWS, and ship the project to an AWS intermediary or provider of your choosing. This endpoint enables Architect to be used to develop and deliver applications without relying solely on AWS CloudFormation. +> Note: this interface should be considered in beta and subject to change; specifically in relation to how Architect otherwise enacts post-deployment operations (such as static asset publishing). + Example: ```js diff --git a/src/views/docs/en/guides/plugins/inventory.md b/src/views/docs/en/guides/plugins/inventory.md index e69de29b..fceeac05 100644 --- a/src/views/docs/en/guides/plugins/inventory.md +++ b/src/views/docs/en/guides/plugins/inventory.md @@ -0,0 +1,131 @@ +--- +title: Architect Inventory +category: Plugins +description: Information about the Architect Inventory format +--- + +All Architect plugins receive an `inventory` object that enumerates all the resources in a project. So what is the Architect Inventory format, anyway? + + +## How Architect Inventory works + +Every time Architect initiates a command, your project manifest is parsed and interpreted into the internal Architect Inventory format that serves as the single source of truth for your project's state. Whenever your project resources or configuration changes in any way, it is reflected in the Inventory. + +For example, let's say your project manifest looks like this: + +```arc +@http +get /foo +``` + +Inventory responsible for enumerating the HTTP pragma's `get /foo` route, and its current configuration (e.g. Node.js version, memory, timeout, etc.) based on Architect's defaults, any project-level defaults you may have set, and any per-Lambda configuration via `config.arc`. + +Inventory is also responsible for lower-level project configuration. For example: the above project does not define a handler at the root of your API; Inventory automatically creates a configuration to ensure something exists to handle requests to your root (so your users don't get a `5xx` error when visiting the root of your site). + +In the same vein, Inventory would also set up default project options for static assets in anticipation of their use by your HTTP route(s). + + +## The Inventory format + +The Inventory format represents every possible setting, option, and configuration in Architect. Since it isn't practical to document all that here. We'll cover the basics to help you navigate it. + +The basics: + +- Plugins are passed both `arc` (the raw manifest in the parsed Architect format) and `inventory` (the Architect Inventory format, probably what you'll most often be using) + - The `arc` format is still helpful to have for inspecting custom pragmas. For example, if you wanted your users to configure your plugin with a custom `@my-plugin-config` pragma, that would only appear in `arc`, and not in `inventory` +- The `arc` + `inventory` objects passed to plugins are frozen copies; only Architect is responsible for changing or updating current `inventory` +- `inventory` contains two objects: + - [`inv`](#inv): the current project Inventory + - [`get`](#get): a convenient set of resource getter methods +- With limited exceptions, `inventory` values of `null` represent the lack of a userland configuration; anything non-`null` almost always represents something that was user-configured (or inferred by configuration) + + +## `inv` + +The `inv` object contains a property for each Architect [pragma](/docs/en/get-started/project-manifest#more-on-app.arc), and a handful of meta properties and resource collections. Here is a basic example `inv` object: + +```js +inventory.inv = { + _arc: { /* Architect metadata: current version, pragmas, stage, etc. */ }, + _project: { /* Project metadata: cwd, preferences, env vars, etc. */ }, + ...pragmas, /* Properties for each pragma: aws, http, tables, etc. */, + lambdaSrcDirs: [ /* Array of the source directory of each project Lambda */ ], + lambdasBySrcDir: { /* Object containing each Lambda, named by its source directory */ }, +} +``` + +Each pragma's Lambdas may contain different properties and configurations; for example, `@scheduled` Lambdas have a `rate` or `cron` property, while `@http` Lambdas have a `method` and `path` property. + +Here's an example of what the above `get /foo` Lambda object might look like: + +```js +inventory.inv.http = [ + { + name: 'get /foo', + method: 'get', + path: '/foo', + // Lambda configuration + config: { + timeout: 10, + memory: 3008, + runtime: 'nodejs14.x', + architecture: 'arm64', + handler: 'index.handler', + state: 'n/a', + concurrency: 'unthrottled', + layers: [], + policies: [], + shared: true, + env: true, + }, + // Other Architect config + paths and files + src: '/your/project/path/src', + handlerFile: '/your/project/path/src/http/get-foo/index.js', + handlerMethod: 'handler', + handlerModuleSystem: 'esm', + configFile: '/your/project/path/src/http/get-foo/config.arc', + pragma: 'http' + } +] +``` + +We encourage you to explore the Inventory format on your own; a quick way to inspect your project's Inventory would be to just log it out from a plugin like so: + +```js +module.exports = { sandbox: { start: function ({ inventory }) { + console.dir(inventory.inv, { depth: null }) +} } } +``` + +> Note: remember, [`set` plugins](./set) run before the rest of the Inventory, and thus [receive incomplete Inventory objects](./set#caveats). + + +## `get` + +The `get` object contains a variety of helpful methods for querying the inventory. For example, say a project had the following manifest: + +```arc +@http +get /foo +post /bar +get /fiz +put /buz + +@static +fingerprint true +``` + +Now say you wanted to get the Inventory Lambda object of `@http get /foo`. You could use `find()` on the `http` array to search for the `name` property of `get /foo` (e.g. `inventory.inv.http.find(({ name }) => name === 'get /foo')`). Or you can use `inventory.get`: + +```js +console.log(get.http('get /foo')) // Your `get /foo` Lambda +console.log(get.http('get /bar')) // null +``` + +`get` also works on settings pragmas, like `@static` or `@aws`: + +```js +console.log(get.static('fingerprint')) // true +console.log(get.static('prune')) // null +console.log(get.aws('region')) // 'us-west-2' +``` diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index e6ca9373..1d59c2de 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -40,7 +40,7 @@ let Guides = [ 'deploy', 'sandbox', 'set', - // 'Inventory', + 'Inventory', ], }, 'Examples', From a9dac6bf27edddc9b2a291ca41256d5fe9e2d23e Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 18 Feb 2022 15:50:21 -0800 Subject: [PATCH 369/680] Fix head metadata --- src/views/modules/document/head.js | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/views/modules/document/head.js b/src/views/modules/document/head.js index d0ad3e17..09d70258 100644 --- a/src/views/modules/document/head.js +++ b/src/views/modules/document/head.js @@ -16,31 +16,28 @@ export default function Head (props = {}) { -${stripCode(fullTitle)} - - - +${stripCode(fullTitle)} - - + + - - + + - - - + + + - - + + From 34b4c968cf190b5b9b54d2e0e9516dbc451c22a4 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 21 Feb 2022 10:49:40 -0800 Subject: [PATCH 370/680] A wild Taniwha surfaces! --- package-lock.json | 178 ++++------------------- package.json | 6 +- src/views/docs/en/about/upgrade-guide.md | 6 +- src/views/modules/document/head.js | 10 +- 4 files changed, 40 insertions(+), 160 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23cabd7a..eeaf7174 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,17 +5,16 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.0.0-RC.8", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.0-RC.8.tgz", - "integrity": "sha512-GG05Y8/7DjV0TT0U5jD1MOjZs/BC1iwCftrpkXonYuTv2JN+Eap8VS1QZx+Y9xmuxnXbDKpnkxtBMJ2wL1cKTQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.0.tgz", + "integrity": "sha512-5syymYmhbyUv65l4TYuTPlQPKzMtjcC8phsoZSryR4HXKEjI+a13Nsp5fbaZSM5A65bboasJXgo6o5TRRQWqqg==", "dev": true, "requires": { "@architect/create": "4.0.0", - "@architect/deploy": "4.0.1", + "@architect/deploy": "4.0.3", "@architect/destroy": "3.0.0", "@architect/env": "3.0.0", - "@architect/hydrate": "3.0.0", - "@architect/inventory": "3.0.0", + "@architect/hydrate": "3.0.1", "@architect/logs": "4.0.0", "@architect/sandbox": "5.0.0", "aws-sdk": "2.1001.0", @@ -39,29 +38,12 @@ "chalk": "4.1.2", "lambda-runtimes": "~1.1.1", "minimist": "~1.2.5" - }, - "dependencies": { - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "dev": true, - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/deploy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.1.tgz", - "integrity": "sha512-XV/ux7xGUMhHAgVoTvIPjdOLBQJpXBvU8bi8/A8D+fVsvFCAeax3/Wg4KQ4WBQURV3EnUdzTw2khkJfvCG6YYw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.3.tgz", + "integrity": "sha512-TcXmmkrTZ4Tmk2LVOlHU40T9UzUMpr0Atzul4Vz/DRwbYKIl0ChA6t+GW23VBLpETCNI4+RNNF4IBkmHCXxSGw==", "dev": true, "requires": { "@architect/create": "~4.0.0", @@ -81,23 +63,6 @@ "run-waterfall": "~1.1.7", "zip-dir": "~2.0.0", "zipit": "~2.0.0" - }, - "dependencies": { - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "dev": true, - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/destroy": { @@ -112,23 +77,6 @@ "minimist": "~1.2.5", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7" - }, - "dependencies": { - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "dev": true, - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/env": { @@ -146,23 +94,6 @@ "run-series": "~1.1.9", "run-waterfall": "~1.1.7", "yesno": "~0.3.1" - }, - "dependencies": { - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "dev": true, - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/eslint-config": { @@ -177,12 +108,12 @@ } }, "@architect/functions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.1.tgz", - "integrity": "sha512-99nkrSttCwZC4Su+pIgvUBz9NGA0sYZQxT0ZcsTUqo96l1cJa6rp8V3ur4IcsP15h8hR5s4YTeIbiL9M7rzkzQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.2.tgz", + "integrity": "sha512-bph1tyJpKTdKuyX32imWKy2hbHOzKGs9aHS6UhZYNirj9cuX/O0RWgHks/PKaJ/Hx4qewFaCmF2UL08knWpSeA==", "requires": { "cookie": "^0.4.2", - "cookie-signature": "^1.1.0", + "cookie-signature": "^1.2.0", "csrf": "^3.1.0", "node-webtokens": "^1.0.4", "run-parallel": "^1.2.0", @@ -191,9 +122,9 @@ } }, "@architect/hydrate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-3.0.0.tgz", - "integrity": "sha512-2vmbEAFwgI0MLd0ZqUrqrOUWtgKvQOxqZAWwc80SN9Pl5R99aI+0suPJ98DAcwucEchded8Zde0NIbbcy3zc3w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-3.0.1.tgz", + "integrity": "sha512-XLF9j9ynYbXyIVtXrICdGabKszUTpt/i/w9gVmUDaqRFbGv6so6lH/HUxuucWrrM/+iTl4UNZGgcCJG9uQyRiQ==", "dev": true, "requires": { "@architect/inventory": "~3.0.0", @@ -206,23 +137,6 @@ "minimist": "~1.2.5", "run-series": "~1.1.9", "symlink-or-copy": "~1.3.1" - }, - "dependencies": { - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "dev": true, - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/inventory": { @@ -271,23 +185,6 @@ "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7", "strftime": "~0.10.1" - }, - "dependencies": { - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "dev": true, - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/package": { @@ -322,11 +219,11 @@ "dev": true }, "@architect/plugin-node-prune": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@architect/plugin-node-prune/-/plugin-node-prune-2.0.1.tgz", - "integrity": "sha512-qS/qKKfBWtboiP84u1RjMZLHr0NK//ILK6E7/ywgYdBKjSCRxmEgPk6d2mbMrQeDdEGIm3fAbhM5pEyU4jChFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@architect/plugin-node-prune/-/plugin-node-prune-2.0.2.tgz", + "integrity": "sha512-H0U4oAxF9NdMWYYvEB6XSGKrfU7qFzrgykWculu+19lvZHatZxUv3EYHFXiNswCd1yf/1IpOVoXGSKvVb5Xveg==", "requires": { - "@architect/utils": "~3.0.4" + "@architect/utils": "~3.1.0" } }, "@architect/sandbox": { @@ -359,23 +256,6 @@ "tree-kill": "~1.2.2", "update-notifier": "~5.1.0", "ws": "~8.5.0" - }, - "dependencies": { - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "dev": true, - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/spellcheck-dictionary": { @@ -388,11 +268,11 @@ "from": "github:architect/syntaxes#v1.2.1" }, "@architect/utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.0.4.tgz", - "integrity": "sha512-Tmzw9p55n2euNMLUyqcNPy82FLCQ0/3jpZqv5xcZ8erq4w3ssb2Ok5Fclm+56YCioyM4xUiwsGU/uC09+BWgTg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", "requires": { - "chalk": "~4.1.2", + "chalk": "4.1.2", "glob": "~7.2.0", "path-sort": "~0.1.0", "restore-cursor": "3.1.0", @@ -1260,9 +1140,9 @@ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz", - "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.0.tgz", + "integrity": "sha512-R0BOPfLGTitaKhgKROKZQN6iyq2iDQcH1DOF8nJoaWapguX5bC2w+Q/I9NmmM5lfcvEarnLZr+cCvmEYYSXvYA==" }, "core-util-is": { "version": "1.0.3", @@ -2230,9 +2110,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, "for-each": { diff --git a/package.json b/package.json index 6f0a8b40..fc7b31af 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,10 @@ }, "dependencies": { "@architect/asap": "^5.0.0", - "@architect/functions": "^5.0.1", + "@architect/functions": "^5.0.2", "@architect/inventory": "^3.0.0", "@architect/package": "^8.0.0", - "@architect/plugin-node-prune": "^2.0.1", + "@architect/plugin-node-prune": "^2.0.2", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "esm": "^3.2.25", "highlight.js": "^11.4.0", @@ -32,7 +32,7 @@ "tiny-frontmatter": "^1.0.0" }, "devDependencies": { - "@architect/architect": "^10.0.0-RC.8", + "@architect/architect": "^10.0.0", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", "eslint": "^8.9.0", diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index d19f6920..8a3b3913 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -21,9 +21,9 @@ As a general philosophy, Architect's core maintainers endeavor to minimize the f ## Releases -### Architect 10 (name TBA) +### Architect 10 (Taniwha) -Architect 10 (name TBA) is a major feature release, introducing the Architect plugins API, and cleaning up internal legacy code, module APIs, and other bits from earlier on in Architect's history. While few of these changes should impact existing projects, users should still [see below for potential impacts to upgrading](#architect-9-→-10). +Architect 10 (Taniwha) is a major feature release, introducing the Architect plugins API, and cleaning up internal legacy code, module APIs, and other bits from earlier on in Architect's history. While few of these changes should impact existing projects, users should still [see below for potential impacts to upgrading](#architect-9-→-10). ### Architect 9 (La Chupacabra) @@ -84,7 +84,7 @@ Architect 4 (Yeti) introduced generic, dependency-free HTTP functions, enhanced ## Architect 9 → 10 -Architect 10 (name TBA) is a major feature release, introducing the Architect plugins API, and cleaning up internal legacy code, module APIs, and other bits from earlier on in Architect's history. +Architect 10 (Taniwha) is a major feature release, introducing the Architect plugins API, and cleaning up internal legacy code, module APIs, and other bits from earlier on in Architect's history. Most of Architect 10's breaking changes were internal; most users should not encounter breaking changes when upgrading Architect to v10, and Functions + ASAP to v5. diff --git a/src/views/modules/document/head.js b/src/views/modules/document/head.js index 09d70258..02b8babd 100644 --- a/src/views/modules/document/head.js +++ b/src/views/modules/document/head.js @@ -12,14 +12,14 @@ export default function Head (props = {}) { return ` - + ${stripCode(fullTitle)} - + @@ -32,7 +32,7 @@ export default function Head (props = {}) { - + @@ -40,7 +40,7 @@ export default function Head (props = {}) { - + @@ -52,7 +52,7 @@ export default function Head (props = {}) { - + From d0e0c797847499923ae9f1078721cfd733901a53 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Mon, 21 Feb 2022 10:49:48 -0800 Subject: [PATCH 371/680] 3.7.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index eeaf7174..f6d7ceb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.35", + "version": "3.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fc7b31af..38d8673b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.6.35", + "version": "3.7.0", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 6b6e3d492b01be7491cf9dbe935862c8702a5fd9 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 22 Feb 2022 15:33:36 -0700 Subject: [PATCH 372/680] add livereload to sandbox docs --- src/views/docs/en/reference/cli/sandbox.md | 3 +++ .../en/reference/configuration/local-preferences.md | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index 79515591..9ea5fd56 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -61,6 +61,8 @@ Several Architect [local preferences](../configuration/local-preferences) can be The following can be set as a part of the [`@sandbox`](../configuration/local-preferences#%40sandbox) pragma. +- `livereload` - Enable automatic reload for `@http` `get` and `any` functions. When a filesystem change is detected in the handler, `@shared`, or `@views` code, the function will be reloaded in open browser sessions. + - Defaults to `false` - `env`* - Override the local environment setting to use `staging` or `production` so that Sandbox uses that stage's environment variables as set in [local preferences `@env`](../configuration/local-preferences#%40env) or in the project's `.env` file. - Can be one of `testing` (default), `staging`, or `production` - `useAws`* - Use live AWS infrastructure from Sandbox. Specifically, `@tables`, `@tables-indexes`, `@events`, and `@queues`. @@ -71,6 +73,7 @@ The following can be set as a part of the [`@sandbox`](../configuration/local-pr ```arc @sandbox +livereload true env production useAws true no-hydrate true diff --git a/src/views/docs/en/reference/configuration/local-preferences.md b/src/views/docs/en/reference/configuration/local-preferences.md index d77a3a2a..ff1f115f 100644 --- a/src/views/docs/en/reference/configuration/local-preferences.md +++ b/src/views/docs/en/reference/configuration/local-preferences.md @@ -82,6 +82,17 @@ ANOTHER_VAR=only-for-testing Define [Sandbox](../cli/sandbox) preferences. If you are not using a `.env` file then any environment variables set using the [`arc env` CLI](../cli/env) will be stored in the preferences file. In this scenario it is best _not_ to revision the preferences file in source control. +### `livereload` - Boolean + +Enable automatic reload for HTML views when `@http` Lambda (`get` or `any`), `@shared`, or `@views` code changes. `livereload` is helpful when developing view layouts and styling. + +```arc +@sandbox +livereload true +``` + +Note: `livereload` will execute your `@http` handler with each change so long as it is a `get` or `any` path. Traditionally, these routes don't create data, but be mindful of how a reload might interact with your app's data layer before enabling. + ### `env` - String Advanced option: set the `ARC_ENV` + `NODE_ENV` stage to `staging` or `production` and use the env vars for that stage (see the `@env` pragma above); if not specified, defaults to `testing`. This setting may introduce unexpected side effects, so only use it if you have a specific technical reason. From 1e47ac23cf0bc98fa71f906f332d52533a7f2f6c Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 22 Feb 2022 15:50:43 -0700 Subject: [PATCH 373/680] Update sandbox.md --- src/views/docs/en/reference/cli/sandbox.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index 9ea5fd56..bd845132 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -61,7 +61,7 @@ Several Architect [local preferences](../configuration/local-preferences) can be The following can be set as a part of the [`@sandbox`](../configuration/local-preferences#%40sandbox) pragma. -- `livereload` - Enable automatic reload for `@http` `get` and `any` functions. When a filesystem change is detected in the handler, `@shared`, or `@views` code, the function will be reloaded in open browser sessions. +- `livereload` - Enable live automatic reload for `@http` `get` and `any` functions that deliver HTML. When a filesystem change is detected in the handler or in [shared or views code](../../guides/developer-experience/sharing-code), open browser sessions will automatically refresh. - Defaults to `false` - `env`* - Override the local environment setting to use `staging` or `production` so that Sandbox uses that stage's environment variables as set in [local preferences `@env`](../configuration/local-preferences#%40env) or in the project's `.env` file. - Can be one of `testing` (default), `staging`, or `production` From 0faf2ea393802d6f9c333cf32f918b798a3cc7bd Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 22 Feb 2022 17:57:13 -0700 Subject: [PATCH 374/680] URL shortcut for plugins in redirects --- src/shared/redirect-map.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index 86f0944e..75ff2def 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -18,8 +18,8 @@ const tempRedirects = { '/@indexes': '/docs/en/reference/project-manifest/tables-indexes', '/macros': '/docs/en/reference/project-manifest/macros', '/@macros': '/docs/en/reference/project-manifest/macros', - '/plugins': '/docs/en/guides/extend/plugins', // TODO: update with new plugins doc - '/@plugins': '/docs/en/guides/extend/plugins', // TODO: update with new plugins doc + '/plugins': '/docs/en/reference/project-manifest/plugins', + '/@plugins': '/docs/en/reference/project-manifest/plugins', '/proxy': '/docs/en/reference/project-manifest/proxy', '/@proxy': '/docs/en/reference/project-manifest/proxy', '/queues': '/docs/en/reference/project-manifest/queues', From 65b6aa15e245bb12475e404322f20c6f80edaf32 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 23 Feb 2022 13:06:41 -0700 Subject: [PATCH 375/680] update Architect --- package-lock.json | 22 +++++++++++----------- package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index f6d7ceb3..4bddc891 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.0.tgz", - "integrity": "sha512-5syymYmhbyUv65l4TYuTPlQPKzMtjcC8phsoZSryR4HXKEjI+a13Nsp5fbaZSM5A65bboasJXgo6o5TRRQWqqg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.1.tgz", + "integrity": "sha512-zX//s0GY9ikrSAWkp40d1+A7pd6JL7+7QaEQqNfK4xhmTf1Iq0FwpGuwZOd+8O35IICX3k0NTgz705o5c+BsqA==", "dev": true, "requires": { "@architect/create": "4.0.0", @@ -16,7 +16,7 @@ "@architect/env": "3.0.0", "@architect/hydrate": "3.0.1", "@architect/logs": "4.0.0", - "@architect/sandbox": "5.0.0", + "@architect/sandbox": "5.0.2", "aws-sdk": "2.1001.0", "chalk": "4.1.2", "update-notifier": "5.1.0" @@ -227,14 +227,14 @@ } }, "@architect/sandbox": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.0.0.tgz", - "integrity": "sha512-0SetdWcc59gcS2gsdcyPh6pwiqAB08YpaVnd/raa2HCXB+wGHvVH6YvYrbgsYnENfwlcVeXpVAPrmmEykwTUgg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.0.2.tgz", + "integrity": "sha512-aixNKmf7z7kYKAJiWhE+wgYitBeckk0ZRtbL31WPqjhaBSYy8LSCqFX3pmVYQqIEjki2UNaE6nsweo0ojxIBug==", "dev": true, "requires": { "@architect/asap": "~5.0.0", "@architect/create": "~4.0.0", - "@architect/hydrate": "~3.0.0", + "@architect/hydrate": "~3.0.1", "@architect/inventory": "~3.0.0", "@architect/utils": "~3.1.0", "@begin/hashid": "~1.0.0", @@ -2143,9 +2143,9 @@ "dev": true }, "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", "dev": true, "requires": { "graceful-fs": "^4.2.0", diff --git a/package.json b/package.json index 38d8673b..daf54599 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "tiny-frontmatter": "^1.0.0" }, "devDependencies": { - "@architect/architect": "^10.0.0", + "@architect/architect": "^10.0.1", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", "eslint": "^8.9.0", From 1eb348a743baf70fae86ffdc1ad6660ec8a8de8f Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 23 Feb 2022 13:07:52 -0700 Subject: [PATCH 376/680] 3.7.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4bddc891..704e76a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.0", + "version": "3.7.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index daf54599..f4d134c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.0", + "version": "3.7.1", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 9ca38e098e74132824cdd93f9aeedc1bb313ed7a Mon Sep 17 00:00:00 2001 From: macdonst Date: Fri, 4 Mar 2022 14:19:20 -0500 Subject: [PATCH 377/680] Remove references to arc.http.express Signed-off-by: macdonst --- scripts/dictionary.txt | 2 + src/views/docs/en/about/upgrade-guide.md | 2 +- .../docs/en/guides/frontend/middleware.md | 63 ------------------- .../en/reference/runtime-helpers/node.js.md | 17 ----- 4 files changed, 3 insertions(+), 81 deletions(-) diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt index 28612718..d81aa228 100644 --- a/scripts/dictionary.txt +++ b/scripts/dictionary.txt @@ -10,7 +10,9 @@ CommonJS Dreamhost ESM FQDN +FWAs getConnection +getter GoDaddy Graviton2 konsumer diff --git a/src/views/docs/en/about/upgrade-guide.md b/src/views/docs/en/about/upgrade-guide.md index 8a3b3913..7ba389ff 100644 --- a/src/views/docs/en/about/upgrade-guide.md +++ b/src/views/docs/en/about/upgrade-guide.md @@ -766,7 +766,7 @@ The Architect Functions module is now also available as a dependency for [Ruby]( ### Changes -- `arc.http.express` was deprecated in February 2022, and is now the standalone `@architect/express` module +- `arc.http.express` was removed in February 2022, and we recommend using `@vendia/serverless-express` or `serverless-http` as replacement modules - `arc.http.proxy` (previously `arc.proxy`) was deprecated in July 2021, and is now the standalone `@architect/asap` module - Its methods are functionally the same - `arc.http.middleware` was deprecated in August 2019, and is now `arc.http.async` diff --git a/src/views/docs/en/guides/frontend/middleware.md b/src/views/docs/en/guides/frontend/middleware.md index bc51c49b..63243411 100644 --- a/src/views/docs/en/guides/frontend/middleware.md +++ b/src/views/docs/en/guides/frontend/middleware.md @@ -6,7 +6,6 @@ sections: - Overview - arc.http.async - arc.http - - arc.http.express - Example --- @@ -26,7 +25,6 @@ Both middleware helpers conveniently attach user sessions to the incoming `reque - [Overview](#overview) - [arc.http.async](#arc.http.async) - [arc.http](#arc.http) - - [arc.http.express](#arc.http.express) - [Example](#example) ## `arc.http.async` @@ -251,64 +249,3 @@ arc sandbox - optionally the `Error` instance property of `code`, `status` or `statusCode` can be one of `403`, `404` or `500` to change the HTTP status code - `next` (optional) is a function to continue middleware execution ---- - -## arc.http.express - -Architect also has a middleware function to wrap Express.js logic, this is good for migrating paths from existing Express applications into the [Functional Web App pattern](https://fwa.dev). It should be noted that bundling an entire web server in a Lambda function will result in poor performance if the entire function payload with dependencies exceeds 5MB. But, if you are already comfortable with understanding Express routing for backend APIs, then this helper can get your app up and running. - - -### Example - -1. Let's make a new Architect project directly from the command line! - -This command will create a new directory, install a local version of Architect, and generate a folder structure. - - -
      - -
      Bash/cmd.exe
      -
      - -```bash -npm init @architect ./myexpress -``` -
      -
      - - -
      PowerShell
      -
      - -```powershell -npm init "@architect" ./myexpress -``` -
      -
      -
      -
      - -2. Take a look inside and you will see one HTTP function, `get-index`. This will be a single Lambda that will be our entire Express app behind an API Gateway endpoint. - -3. Let's add our dependencies to `get-index` so we can require `@architect/functions`. - -```bash -cd myexpress/src/http/get-index -npm init -y -npm i express @architect/functions -``` - -4. Replace the contents of `src/http/get-index/index.js` with the following: - -```javascript -let arc = require('@architect/functions') -let express = require('express') -let app = express() -app.get('/', (req, res) => res.send('Hello World!')) -app.get('/cool', (req, res)=> res.send('very cool')) -exports.handler = arc.http.express(app) -``` - -5. Start Sandbox, the local dev server with `npm start` and check out the results by navigating to `http://localhost:3333` - -Each time a visitor reaches the root of your app, it will take the request and it behave the same way as a full express server. diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index fef59cfa..ec757be7 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -272,23 +272,6 @@ async function handler(req) { --- -#### `arc.http.express()` - -[Express](https://expressjs.com) migration helper. - -```javascript -let arc = require('@architect/functions') -let express = require('express') - -let app = express() -app.get('/', (req, res) => res.send('Hello World!')) -app.get('/cool', (req, res)=> res.send('very cool')) - -exports.handler = arc.http.express(app) -``` - ---- - #### `arc.http.session` `arc.http.session` provides methods for reading the current session in an `@http` request, and writing it back to a cookie. From 72316bf7a25cd8372a5949edbf329a4d48598ca8 Mon Sep 17 00:00:00 2001 From: macdonst Date: Fri, 4 Mar 2022 14:25:40 -0500 Subject: [PATCH 378/680] 3.7.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 704e76a9..5b2e74f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.1", + "version": "3.7.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f4d134c0..e21ccb21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.1", + "version": "3.7.2", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 252b48f6ec83c0f1c27e8edf1a84eef5b3198d1b Mon Sep 17 00:00:00 2001 From: Austin Crim Date: Wed, 2 Mar 2022 09:23:48 -0600 Subject: [PATCH 379/680] fix broken link in `Using TypeScript` docs --- .../docs/en/guides/developer-experience/using-typescript.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/guides/developer-experience/using-typescript.md b/src/views/docs/en/guides/developer-experience/using-typescript.md index 3913d5a0..dcad2089 100644 --- a/src/views/docs/en/guides/developer-experience/using-typescript.md +++ b/src/views/docs/en/guides/developer-experience/using-typescript.md @@ -47,6 +47,6 @@ You can use TypeScript in as many or few Lambdas as you like, relying on project ## `@architect/functions` -We recommend using the [`@architect/functions`](http://localhost:3333/docs/en/reference/runtime-helpers/node.js) runtime helper to smooth over some rough edges in working with various aspects of AWS (as well as to add built-in session support, and other niceties). +We recommend using the [`@architect/functions`](/docs/en/reference/runtime-helpers/node.js) runtime helper to smooth over some rough edges in working with various aspects of AWS (as well as to add built-in session support, and other niceties). If you do, TypeScript types are available in the [@types/architect__functions](https://www.npmjs.com/package/@types/architect__functions) package. From d40afe0401d4414b498ff4d0beaff61658a9ef72 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 8 Mar 2022 06:55:32 -0700 Subject: [PATCH 380/680] update deps to latest --- package-lock.json | 100 +++++++++++++++++++--------------------------- package.json | 10 ++--- 2 files changed, 47 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5b2e74f7..28a82dde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,32 +5,32 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.1.tgz", - "integrity": "sha512-zX//s0GY9ikrSAWkp40d1+A7pd6JL7+7QaEQqNfK4xhmTf1Iq0FwpGuwZOd+8O35IICX3k0NTgz705o5c+BsqA==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.5.tgz", + "integrity": "sha512-i2i1/znCyd0/KSMorFejuaZ8lC/ZGciqZ0Xv4d+L+hjIHcUJViDvA9dKuaSPZ05s3OhsJ0SJcTLfHV2ZLDRNng==", "dev": true, "requires": { - "@architect/create": "4.0.0", - "@architect/deploy": "4.0.3", - "@architect/destroy": "3.0.0", + "@architect/create": "4.0.2", + "@architect/deploy": "4.0.4", + "@architect/destroy": "3.0.1", "@architect/env": "3.0.0", "@architect/hydrate": "3.0.1", "@architect/logs": "4.0.0", - "@architect/sandbox": "5.0.2", + "@architect/sandbox": "5.1.1", "aws-sdk": "2.1001.0", "chalk": "4.1.2", "update-notifier": "5.1.0" } }, "@architect/asap": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-5.0.0.tgz", - "integrity": "sha512-ffGDhn+XZ5KhAZiftz3xCAfo0MzrwCrOJPevrJaBx87Wlh0B6XcGJJrA5XAjwP3qHFz/GZsMBQDNeQdP5KU5FQ==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@architect/asap/-/asap-5.0.1.tgz", + "integrity": "sha512-/QI/ffbOCRNZZKwOvRj9iLcO/Wj4Zll/UBy/NCobc2nExzCTmtLpSTNcpIU0wM7vQdFhbjhHm5G7LMtFc8BkkQ==" }, "@architect/create": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@architect/create/-/create-4.0.0.tgz", - "integrity": "sha512-ZA2phjLlPG32vtkXhOVbd3piEY2P7WLsfiUE9PYLC+/4wS0vNNkG5gEEQN4EKz1tDT4dNA6rr3pytCLedfpLGA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@architect/create/-/create-4.0.2.tgz", + "integrity": "sha512-7iSPKKOvAe6DtmtujtSEWHBtbt4HxLXykPEl9dX3i9CwPBN5KTSNCN7W014LjDefGHkqWHuPnJFoM6yd8c01Xg==", "dev": true, "requires": { "@architect/inventory": "~3.0.0", @@ -41,18 +41,18 @@ } }, "@architect/deploy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.3.tgz", - "integrity": "sha512-TcXmmkrTZ4Tmk2LVOlHU40T9UzUMpr0Atzul4Vz/DRwbYKIl0ChA6t+GW23VBLpETCNI4+RNNF4IBkmHCXxSGw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.4.tgz", + "integrity": "sha512-mZwPEdVtzM4m1auIK4qFEhWxCK/nsbf78ezq0NsArHapwBEQPId9SWRPIMSHXgZplTFgyPH0vUiJcWYJFuhMpQ==", "dev": true, "requires": { - "@architect/create": "~4.0.0", - "@architect/hydrate": "~3.0.0", + "@architect/create": "~4.0.2", + "@architect/hydrate": "~3.0.1", "@architect/inventory": "~3.0.0", - "@architect/package": "~8.0.0", + "@architect/package": "~8.0.2", "@architect/utils": "~3.1.0", "chalk": "4.1.2", - "fs-extra": "~10.0.0", + "fs-extra": "~10.0.1", "get-folder-size": "2.0.1", "glob": "~7.2.0", "mime-types": "~2.1.34", @@ -66,9 +66,9 @@ } }, "@architect/destroy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-3.0.0.tgz", - "integrity": "sha512-jaQgCwBNU1IrE4uL0ACQlnXQ0fV4hlez7bdcd8TZywAL8ZZrsr7dTv8QW8XvTzXu3OEt46T3+BxH99Zmj8VZpw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-3.0.1.tgz", + "integrity": "sha512-4vSweeCtfLwqW2u78wnXD/lT9WbwCqBobJLEbBlCjk8Tb7d9Y7hEsQLlaYTGISQ+o737kJRFHOJ+bG9A+mF2jA==", "dev": true, "requires": { "@architect/inventory": "~3.0.0", @@ -108,9 +108,9 @@ } }, "@architect/functions": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.2.tgz", - "integrity": "sha512-bph1tyJpKTdKuyX32imWKy2hbHOzKGs9aHS6UhZYNirj9cuX/O0RWgHks/PKaJ/Hx4qewFaCmF2UL08knWpSeA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.4.tgz", + "integrity": "sha512-G7CUeOwrwiRRjsws44XI8fyeYFv4nqfrD5kzZWfaoba3FvIZjSM4vVB2eTTXThYI5u4PRJL/RxotwGW3bwj6GA==", "requires": { "cookie": "^0.4.2", "cookie-signature": "^1.2.0", @@ -188,28 +188,12 @@ } }, "@architect/package": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@architect/package/-/package-8.0.0.tgz", - "integrity": "sha512-YQvNgF56zZPm0fqDQux8nnvkJfBPkW2ZFp1Ect4KzfxLpGLywqglpxmh8//sYVqFa/UZ5hkWGMZGgWBPBZ8zYQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@architect/package/-/package-8.0.3.tgz", + "integrity": "sha512-GiIWfrmPetOIt4C/BEs4K4e6X87fNlFM7phekPcvbLucc12dd4pVJadkkc25tdfkIuFBgu3SQWU+UI6EE+Pzzg==", "requires": { "@architect/inventory": "~3.0.0", "@architect/utils": "~3.1.0" - }, - "dependencies": { - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/parser": { @@ -227,9 +211,9 @@ } }, "@architect/sandbox": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.0.2.tgz", - "integrity": "sha512-aixNKmf7z7kYKAJiWhE+wgYitBeckk0ZRtbL31WPqjhaBSYy8LSCqFX3pmVYQqIEjki2UNaE6nsweo0ojxIBug==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.1.1.tgz", + "integrity": "sha512-41Y5J4LL/VD2BKn8GxJpFVYBznyaIqHddDl90gv/1o3NGS9EgJBggv89EasyRpAwQcOscsCRhFtYEYjEFnSJTQ==", "dev": true, "requires": { "@architect/asap": "~5.0.0", @@ -372,9 +356,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.1.0.tgz", - "integrity": "sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", + "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -433,9 +417,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", - "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1642,12 +1626,12 @@ "dev": true }, "eslint": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.9.0.tgz", - "integrity": "sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", + "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.1.0", + "@eslint/eslintrc": "^1.2.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", diff --git a/package.json b/package.json index e21ccb21..ca111237 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,10 @@ "test": "npm run spellcheck && npm run lint && npm run test:unit:frontend && npm run test:unit:backend" }, "dependencies": { - "@architect/asap": "^5.0.0", - "@architect/functions": "^5.0.2", + "@architect/asap": "^5.0.1", + "@architect/functions": "^5.0.4", "@architect/inventory": "^3.0.0", - "@architect/package": "^8.0.0", + "@architect/package": "^8.0.3", "@architect/plugin-node-prune": "^2.0.2", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "esm": "^3.2.25", @@ -32,10 +32,10 @@ "tiny-frontmatter": "^1.0.0" }, "devDependencies": { - "@architect/architect": "^10.0.1", + "@architect/architect": "^10.0.5", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", - "eslint": "^8.9.0", + "eslint": "^8.10.0", "linkinator": "^3.0.3", "spellchecker-cli": "^4.8.1", "tap-arc": "^0.1.2", From 96b356ceb4e6050edf0ea78fce2a5d87cc631931 Mon Sep 17 00:00:00 2001 From: kj Date: Sat, 5 Mar 2022 14:13:59 -0800 Subject: [PATCH 381/680] Updates to latest logo. --- public/arc.codes.png | Bin 121375 -> 102913 bytes public/css/index.css | 2 +- public/playground.html | 2 +- src/views/modules/components/logo.js | 6 +----- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/public/arc.codes.png b/public/arc.codes.png index 48ab966414c1419a7a269ce3164eb3a7eee868b0..81b193b8a4aea57ebf881a33356f27498995af17 100644 GIT binary patch literal 102913 zcmeFZcRbeZ|2}>tl_*q3Mph-684X)DSsB@6lRYysDyvkIBzu(15-K5S7m^jCtcr|e z7g@jKrTf0$@6UJqet-V{xnGa_?t$yNUgJEU=kYwA$MZO^b2?fon<<$oNhH!{HC07j z5^3Xc5{Z0>f((D5WpUBKFI7(ZMm|QG8WJ|{u7Xy!?$&mK{;nQ)okWt7_4lx{aklf} zu(oq>a+Bs7ud3nVaI%%=GTg7ZPt!xe&e2IV(92FQP)pw?(Ah@ZmP=NKQp#TfCvdg% zvEuM|b#e2S@R#OVJ+B0QCjKnM#j*MpA7^PUBTXF+1$Qqyj{SoB1^02uP;y9l+1g9! zDk}f=Vf-e|<>=$%At5Am^5jXulcIv|UJgRS;^N{$`$U99LK_H^?%&c-xu)K5Ad)P(zWw;_w}-|Q}VNO^VzvN62!PjsJU7>*lF0g zIrunAa|w&=Kk&c2Wawl|ydomDZ{L4jAx`GvOU#CWn-eZC@}HNC{_~nN*Fg~>;s3m3 z{C|9j7;Xt2Cx1H^BSj}yJ2!8f^}nw7pO=mQ>*arLboFHgcNcdrJ%qO%9%1!*|ICNP z>T8N9e9ILY}VP!*%yfl}Gm%FX6jh*f4W8rjvUiEgj_c>|h zWp~&C6D`ek*xud=a}>aVCFJDbX6MBrEGWEBQ0#wx=%k|^G3fu-#}oSN=7fmF_xIgN z3H@*PFSYuH|5~m1+@HSz1pp^P|KJIJ`3I5g+yFyfz?*U{4NVeh&1omh%>OncBoa@Y zZ(J|m*`wQE%N|I+&TaP4Lzvlc=PibVb=Q>DoNsM9_|aMReaNHg@oU#i2mF-IvD668 zQ9U%clfb3xwYTHN=0NGYV$dNRs;)MpY`%B9^8tOgGPgg4U3oErvJ&S+VS{TswRiK}G zH@!K7%oaaq-OP!L`LF91UA#))W^g5l+Ca! z$jn84=HXj0rLvXKg@Qei(gWZ9*u|unUpWhXIM82cyPbVQ~a z%+Id)`J{w8myurJ!Da`RrhsDQ`$Ms|33h6``UbX}a5aUj(~KENU+VGp+0eg#zTn7* z&Ip;wll;MJ$?Y8~7Vp2^gT%4XL)F-uM55Y8{J(~joVuMv;vlIh9@h6y{oWny(>81M zdNSojYST^1oXkvvohMuiKX0?nvN>da+a&+zJ!d|>uRIU>Yzjr5)D1>@ylOI87jc?~ z-DC!q?Ye}PtVrcmR1snM3P3x;&jH!<@k6# zBO@by{h3K2*`<_@Ab3=1c}3~=5^3`wV|=`yc6}O5*wAFqq9v9 zTtBX4Y-$w$mU`^ANd()v)%S<)q9yAe>!}VJZpn#Z6tcMIcvMMAX-ItdYJ9x+V3LF1 zk53ie-`=H3_)g9LDdf&EDBfOR3^ea6*y)u{1(%2h)bqRblY*O0;kM5hFpZ}H~~6yt(m-Qm=u!&N7F_G|BRU0^XTxMa_8f!s5r3DzR)1=>hgb0;^{i(PJ&z+>e=C==H^Qyg~itr z6NStx#S+vb(pxofaX$7lQi{~ohcS6^=#GN{r?h=52x0s~<7e;2>vqY)Ia3XJw2rDosjA^0?NbhFBv;ptC+xRP?w|Pn zp`^HGxl-(d6eh*Ox6L5<_snopmcrk+K#%!W-L;j^@D8hV;LM|dX?YsXB`+^8!K&}2 zAKj|PE{MLPs9s$aVH4!?(cM3~tJs6SmoQrRKh0gAQvT@CqjU`8Xh(5g9?xIXAitG@ z)56!+x6Hob_iS;fxq$(FAl1d2t{)#PE&N(}ck=PJz(1PDQ;Klf{I)_vnjI28ouzhJ zQM7W2g68WtGy9C>=SH&q2{IBHr{bO@4Vn3`@w<2L-ax~Ki8?+tJstGxNAT$Fat1oO zzr*nct}7^1J=22Oe1xktDL8J`lA3&RdhG_k@gC`!KPn7!tQtg31?>o_pEb(riZibrnq!kMh5#| z;gPhPR$lZMW_A<1%&FE}npsho*PV}v*|3>;rolZ#^smc`sB(nc^Cf9eGl|#&J@6*G zkcqSGo3`)E%*^EY`%Us3;e$?X1qQ#mPxe;&j$$tO(gFsPXk-^XJUu;!{^&wCE!~FJ z$o;4npG8vW9ifx+T;XVk@>!}G>@n1__Cs!G|WzR z`~K<;t$BTMb!f%*ka3E!uT0CXwAO^K%#Luw6J?A&NRHYBiQFv#|+N zHYhqdITc$}zdzjKhQ){}=NA&9kzNIuu$hUC@^1o(37L4hfjA!?I=RBRxccYv!nk{L zw$fiW&Psopw)7()xC7VQ%yJ-{O`cA|XK3Qh&RG9XJjBK1j!j1&ePbQJNBc)xVWNcU zjr_d4hs(c59p0rf{S`EuzikV@oN%S~D{>A2AWaI<`hX@j|GqV`EUSU~MwyJ$He>8# z`LEFqcc3uh>OL^k{p*`J0n-PY{<`Vklem(|X#4Ha)hl_7KVERdiaY4u!}`~iW_Qxc z9|#z){uMYoGH|v=YzsiDI&iiiFOTA{a|F^-a60pwJ-n-(A!A@*kQMcW-L*=RZG?IR5a7| zhX4#e$3C7!AS5OxM*Ud}Px=SuL_{4wD_>;Z@Am0o6JK&dYHI4UXU~v!V`YBl-MJ$; zlRCI_&z^6LHFGaD4|XHCSEn!vCvQzq&xzc`H1&*1D4gxej;X0BEs5cqpFe+&*Or-& zv0Su1x_Vey^=GV1L{&i~60g5cx7&n5QyWrL>`@Scqfj)sloSOQD$8MjO9sP={4PLhq@iBLG z9s7-#3u(V&UWH#DR1GFOFArEQ?-mjgnxTF35YLozB=L?>3DWpyn$WrD7>?1A5kM1A ztqmW-?-{{AI}|pZq%OltLJ0AxJ4T<;re*Z98yC*~H=LZ`Fn$t6;caJ|kOC$3zV0tic$)dv| zXza=9wNzA8qW35{s;OBI?F*Rtda(DDcl|YiVTm%Zq~D{(<6tVeacfDWaD-dy6%B58 zWQ5+OA1AY-$Xfv=T4@sIUbVZ^Bu~l=T-B3rbjmz`{(P)We@o60n~<%;5sVgx?B8Ao zg=kXXNJ|Ii#O+i$@I6RPTYTW^mYvF{#+)sWEbxZiW7&87$q}LItLNg2AAUZMS8PAq z;`uLKmZQ*ov%Iw6UN!b$_mOMiY+IjnI%EVRdVGgl24-5d-L=Mfv~zR|4T~-Cco+}E z+a~mZTBOkFgQ3%fmP@<`4<4MMRXw|Q1NA0mv7rP*3-M%yu5x!-=XU;nR>#jFpa;k^ zLf+qEcS!!cazwE9(>yNBYSL5vtA{0UEs@3Y^-mz;R#(-{qxao=m-ood*UBz`k^MQ` z`t8y5JAx&87o0t($hBuru4c*sMl+A6y-VG_<{|R~5fKqA2i=P9+@Y>6oGiiu1vDgD z1Ue0IUS1z7yF7w%(?N*6qzT^J!K}l4QpM zP?+8*@5mcTy+gvT?rIYsv)a+4&E+*qW6pOfZt3M}H55^>9pgXqvs#8s@DJQ)6JK8*0W0_`@~BFv{^7$ zYiJql3-)p(QPA~6Vv=24ZhGKIz2&l3W4bgVaJ@Qre9hv3P^<2SZRZp$5#cIjyZq6#h;tF4r|t@rnMY? z#gBiFfUqbOzsUqzaVkWS7<4=d3|Z8%B55hyE=M9v$&Me4AI%kiHRK;LQpBI z7tvb?ij4}x(A+$DVXVAnWqBbhN={lMT}pi0>tn}`37S3Jw`~vRne-%Uo?4#51|VGC z?Pn^Iv`KnbgM{zMOl!vS43@=4>0MO=pn9G!aUsu_V05o8?Wj66Kh+e|l8-VAF|}=v z*328@Qh8-j3uJXrE)kzYBr#2JE3*>ommAnm-JM?1H#97FY|hTh%ezY)6Bygdxz8~* zGdV&L7I1zvB*{^%0lB<^^L;FLr;*;3R_QnP8|e3aak`O4`lj)4`)y2lH-nIc6p*F7 zH$-wK^9gL&Amrz=tY9W9P%5N ze!c5{^=)mf_|i-(fcO)F*gbgEG+iAm#wqbn9mpZb9z1gt`8)JiRc{2_l>>Xy{Xd7T zSt|%Sh#XKstYi#wLq4CSe}4ofqoENuNxqzoq*flfP~O(omQ?lmR*G9C=2qmSjNEgd z@t!4Qh_|2S%RhP5o1g4XsF-%rU0$eJS?FC^>iyP`(s8%98Z-%nx?-fD&{m#AQr)={ zu=%3vP*YaJE$YE<-+m3ZIt;!|8acl6At+dVU7g#*{z&`jx;K*JkEVxi#70`Ii4sA~ zU1)!*$R+GO_%=B?`GUn7Qr4q|A62M~s{12Zn9YbasHF6A3Dm9Ix1$=f;Ph!di4^C| zT`Z#T;QD^&V~E!w`eD!7-H9402gcq>j`Q>IP*m?`K+y`yEhHe|dLY&-P0XnU%ako} z-Kod=yapyF$-}0|U;DwWGNweRAP@2 zBF~AFR{jeJ+4ci2Mnm*YMCsiBJPK(1fGEMPZBO%UH~#WEcI8{>@;9QG?zyslWk!1i zMb#|;n)llb+0domvll&%?zB}UIck6~;a3((KbNkW*Czo+2YdX#L~dqj3F3#g2?n8D zir4~MJc)qGiegPbt-<2{$g{o3cojPYj@H-KR{W?Ot*fgGnS0J|zpzaO%&QyR5;+7* zKlH@Z*V>ET%>@R9Jptd+UR6+$L~fUsPQ8|0o_rQTCF-+`S3;)ZGloO-@7DvQBTKf61+@{n^J->wfZq2Y?xWS)Ng0Zz+{LBc5dOPC2n^nqx0x&=uxQ@st&_Mu!EYq*fZlD2; zxG(HZ4jzEFObyhtj8$S_Fn&S_>ifGcLfc98uV5D`ymjjqfR9*{L!6u6gUIFU<@$}h z-#bG~T?|yvyQLw%vN)|kQa78M`{_k zUEUK2`ph!l(!2b#90j-A*CT64nE@c*Wr&vt_6^A`AB5}w_5vW?avePQ>yqS;?b3nZ zaUTo8T|NcFB1v80Mnk+}bB!=YzX(7_0nf5h%=%Svsv@fbqdnbqU#ugSm z0DS2a@ALSBKMlP&x2^ZobVCzgbl0C8!TxomHh#~B3Y=co*tl~%bY+3V(7oqTXN?@5 zW(~Rgo2x)JnVBYqEJLvu<&S4?W6Uf-DNwq3gw7gAJc70IJR60d0q)8s}Cnf#l?7gjAxIG5#go1O~Ku`@TL@S*V|GV2wpkF|KFr6Qw2D zrk(5!KKQ+=3eh}`x|jT)^KTcnR?KtwE@l+NAix&7IBDuuv3oRdYp5Eom3Fd6{M6jU z;^JbH>4*c${Ts>`DXY(H$3j7ov5s}3j<5LprwY+N5-G2^cX9Aw)}CF2OCnF`G;NDJ z-VbU)Rh=C|EI$-KkOw2!Me?s5N%4&#nR@CZQcv0bZ+bTRY1gWU*y9mPJ z*4(IW5^1)D?(-*8_v-sZLgquTq)>!kwg+PbT3gA6=~|9;-Di;vIraL|4h0%cy~pzn z?lMR?mcLsPp-{y*o& zvNfp=1S-sezC>-@#_coI#5qGNGRo3B_sY9b`ecjRo(MKwnw4406@z2Ph+tG*4aO`( zV%Z^muGY7Fq`qj7Kkk`uZ2%3|3~KH-++>_LTY|3;0;pjKSZx+1(40!v)KI6y(Z0^ zU3mkC$toS_-$uAt2%XKT3_Jo=n)uB5oo(Pdui1i%lwueV)gK@|_2<{GUm+=MU$<^utkl#S1sZ8Fid*ogbmGckkZ(!a}O* z&!WiA(-5l{0hL50PHhLxHEYi)E>kiqtkL)RdL6e-6V-ECypDr{Cpn~dV)$?`w+7_G zDB9YI+SLz?dRXEv269ivsnQPNFm5f5@R{rTte$ns^CNI3%O z&h6U*e0)^Z0~1)X;($8#r6CoJhtybi6%;k8ne(zJULG@v+JEwCg`Nb;Czhsig^qzC zGTp-;>wrbXR<$d(8v$@-_mT9_<@r`^S?RH;wPHc2eSpj!n4Z8`NZ@)=H0;aJ;H0Zx zliiFvDJ;kA0^SbVmSxBqN2tG83>fZR7&)oAzO$iA9ick{-)sq3oP3?~ZlM*f%y+5A z=H@#BUw-q4^4U7uNk)2enUH|fC(hj}`%25LnS3=X-r3n%I)gQH%>(ydnd48w?sb69 zOhWtlHQu{|($z_piNl;+UiB>KLdW~};TE3$C`}-QMem83%17!!IWxD)8oy2un6k=@ z4vSt@&q@AX=!76lMW0}Zp5(zpa1jN>!N&)#3fhM*KqI&ywcS#}jnRDjpe#;8({e)){`q|Cj}5-XeM6N*pm#!@fUHa9mvmOe?0Io(*zHF>`{xM5`qcv4Lf-sFL#t3l{l^iflj9rbCR zub3cx?szBt>yrvwz%D}TxvY?X=T7<|Pivfa1B4X;2#c7hE48-9#>SZS2}bk4;T&WG zLXvLUMp{m+mW(ZgqE8BW=OlhbU!87i=ysmRqX3UhtHLzmnM8a)u#y*Ejv#fz)31d0|zPcMjs;9;JtVdi^PBGPv4)kTq>O zI8-)+2IG?aG>kSgSwvJ+yvBx)juP5WYlXK%yOLbm%#ZG%`Kf^-(^HD7s&CNjF)AnB zXJlZwmXXm|sgy&$Zrx-}3pzaajsedUxnBKZK<)hI0g^CI+qHUHMEUdisi)ur&?sYl zsdQw~;$mZCD>BtrOdk786AhpAz*Uv zxY6o4<#t%fQRwV|bsekSzB`-i=g*%jOXH!&N8Dt!BJAr|L8ricmGlTEa>UV+cVE%5eo_68acw#;Au$RxBBjW4& z`1IP5BbJuEjg5^>O_zP+Xwb=_qNcX*CVPLqOF;hOxpR=GHjWZ4nE~hbd2xw}jPZ^_ zLdAfJedkcOkVrbt*V#$>OyA-+X6ej*iIp`mGP)~BHqy}5^}A~Pu??OewQ=~g15{nz zsvVN_l21Jw1g-88Yo}>N@%R z9~xz7BOZ6lmZz0aqMvM-9cs2gAIzszk*gWmKwS0!3vtU~4%=zT^fmtu9-a)0EME5Y z@iAgt)4<6Pv$VJfX``W1bsq88=F_rvQ$%DW>d7*q#<#Kf)hsyKzhsmS!IHV@q$vx?HgXV(|SgxzxLy0`cKo~MOYpahf= zXApZVBOzCMWmguxQ4F>dZ9rZT=k_9T@4;xrn?DY0XJT5Ksux0VhTp-uz<}>22IdUd z;!a7)6yKOB&1A8Su}x&0P$XDH?Kh1w3_uH!^!!YYfjRI`xNYI*0&{t{F+!f5Jp*Yo zDJ7+F@$-WR5AZ3tqWbK}MhO#1!_^ckU* zZMk?I0?uVlg=pog*RHWi`CoR#Gli*NPe}noec9Vv6KNw~Vk89`ib7b(=x*4|*+azj zNL_2!%7>{R<)N!OIgTZI3a1|Ly3dCZnkQ87Ty6Gtfx2>Jhjx0o&E)IXZ#8#0;otyj zAxWviwL|9A!@Rs`AH;i@`aSpF5OA{7r%wYi?CtFnRwCrH2>O8~Asw1afn9 zY4dSH-M;7Kjn&JQ0BNe~C5jndnjiLuChN(2yHOL;<}E2hjKkeV@*n|c3j!@idCL*uI|zUyj$(G3j^VcHM6 zecIl7n0P8u9iD3LAyy;urJ$BaCB0)c05CcI1keG4KBGX5Ff`VFHaY#C!0%nGqQLaZT`v(M6Pdg+Zba!)i z*A}~nE(59<#s9uDIf{ubsFrNZvsf*IXA??F2qdiL=jVUCICTV9%F*G`N<9Q9^w_g+ zpH9C1m8!?6wBzGj7edpYaXmvO!)m^wwK_Y*oi?0Z!zrh9Reg8VTI8&cXh4+WY2Cm} zF0vf7@BVE5!H%wnGeKRghF3~Ts!p2P4`~psmYvLL2?@S~Z<$snhBy-`GmZ$cH^6{& znc%w0msM~MP-W@7L28iPu_LWfb|uv}=HzZ}?w*>^3}31~RiuTG5SfZm97sErpK5OA z<{mupp2w@%j%@8(HI>z~;-9cV0-v~8?|uk@TE(a6sd4|w2%qL@#o02 z+GkIi%Y;x;XDfnvXvsTz1BDVoXCg8sg=JW;y+EBS&g}82Bs{sioE)in6lAaxqA2}} zG;m%~5@(E#jz%TYviF~p66tV`gZd!v%;aQqbF)=9S>NUoqwiy54Y=z=r>4n*iGlMO z-r5{}K9S~{rAWnp46uvaTr-Nh{F$6vv0cjoNbk}|=+PpZ#`Q5=vA zSv=%^&~%Sx^3CGn#>#b1sy1!j{Q4rxYg~qsiVDI;L*=@=yAVM_yO8v6gFM?UzXL5F z8X4ItF#WYQe)?PEw*TC!<{9EvxwyED4Ec|bOWKGipty7 z@g%6PX64mWhN(Y8XtScTVrSkj0I1(5CT81BmdS-A13}fc`?J6!&EKb!!@@|}9qu3Q zW|ftB8-ylQRY{%}bl*rrlUQr}UpKdwxH;;cK}uvP@Rd`n?n3X;6fe6&+O%u;Zrs_H ziyq$I+s+j%Zmer-OPJAW7D@V!2mUXFA)asI&V>sX-oMvJ7(2EXC8ee9zznbxZ4;zT zpzJFsJ$IAUsp5L<^|ZC!-(DAPn~P9ZR#u4IbTlC2B)ItA1oi)l;va}&e@6HE4JsG5 zKdmH_%ZXOZUR@iLk@8v5v9S)_WO-NAb3hCfcdp;G{kXmTv1-fF{{E~kk?|v1T8|Om z!*qYofX+$qxJNOCYqE5BSY=Lu{*e-1eiXc6R-JbGOjA=6xMTJf3k!?3<@4*W#*@LvN?u=R;+s6Q`U*o4vQbCqUzqT)H5jRsVRo15S$gPfX+i;IZ~ zb2Ejub|bTe6?88Q6z|??PSC)a!x#R3s?60fqB0!4_`-TJ^YB?zH+jj(zULJmEqWZ~ zO)#s@Kh4u(>def{+F1*dWU!yZkkHGb4doNGV3XguWQHElV*<0(qcw7qd3%;y{ z!>|WgU~bMo!E8(cV1k5oM2u|vmHGkjU(D#c`ud>B6$|LWzhmu0lG4*H06`a54^0h? zk@nlp*4DZ|Lk0NxzkmNe(pLETcgET3mX;QD%5gx=EL{;;Sc|p*LyU7#zLRS9qv-6=JxH` z6XhFY=x-XC^P{x1lxyeCZQHhqiiotdww9HahRa)_&B=Vg#nH*B^Oj}`YNNhm`2|-6 zLK13ii()9q$qsvYO(9*3bO1FeXaSJVpFcmROlaq@AQV(4M@4NIUek|O(w8q^zzWsH z);X$cYE}bBh!$VZqonKCjdXQ&CwndR^><+`wyITx8t^j+nLa2QtQstcfrTSiJL49z zKaN|st}Pu_R*p0iEFQ_(v}qH6uRUZ0a3L$Jr;XGfIcO=;A&4NaqnhQ$_~G$(?z|zw z=RDw5fzR}jY8H1(r1gS4m1@ zV!N=O6h=uP(RxGEE!5lhk;;=!+<`+6egMQ$6>OCYAC(ij+36_A;dh*!p7!?fVTBG} z6S6cRT@d-g+7ne+EW7Nx$~S;&v*z@azOKDuVq&tg8IIxb_D~idIR1nrDq8may9>R= zbTHD!cG|}`&~gQDhq<%pCp~JQ=9_BU=#Lc`VWOaCZ`-;R3ESZ5i)`kvUi0vcrlqDL zR12TgPr(j32ag_bAN?KW&M$`xy8Q0DaGL1qwn&Cr7#jY98>R#WQ&|~d1%OWP<2z{( zbD+X31St)<2*=f{bX&LJ>2cGjCp=wTisU$&5J@=7%L$)Jb#*Y_tQJld78w9HAsl>& z3y|Y!cw|mU-JYVZFk4=3A-;%92}gy|6#)A z%O1;%^RSxcpO8nvARr(Bd*S<1yCVr^cg-NZ;UQri)|szAH?yV$_W)}VCvz4r^ii1g zynTJq6SV7&xKe7@fHDsU$R*v@BkJluQ1}4{p#+_lL#}Iwx(8IMs&A?hBo(rFJtHYK zA)yV;Riqu=cNwyT{U>`1Od{70xF(+{20+WWe7O6|@IYbv)xCOFgj~?q4hLQ!pTgL z#Id}*91;?;OW7Le5BY>i%<*zvF+VK@jCKI^UvrZ-TN$HHUcY|*dv8r|S68y{mNO6# zJg_=YGUDP_eG?7qLU_@0gMz-s|H=gsVA;T7^;a)mH57K;O8Yhqx?2TuYu zHTCArnp#@N+V=Ay$JoFHC$`OC2<1BRgA7KS$knM-*9z6*xzX;<2>I;$#Z;c_Z-pt7oW3QEnv(ns9CX_P zPa$u|&xB22SoUbA`*?bCCO@k|1QaZC&mv8OtQb!R?@Ul1z=nncZlC79cZw#^6>jzY z^sDslU3_r@jw$r!Plz#|0#XPNUrfT0iA;`;D_By#VKLjN?uepb;&^w}FO;x~QHceh zC&ZZmT|xf-8rSzdef#!;@6JF(sGN^+t|C`$T^-J?GoK)yA>o`35v%l0rn+6M5G$%N z8JYAIc3t(HDL@?NrW2!rrV8q=+|EMrVLcu?%!3r>7TU`7Q!Ry&AX2NIqJ2mZNL8_{ z;-!`~A#Z8;-`3YZ_qluvv=A{1#i>M)j3h>+UP{BY@~m=3(z^LG^+GlJ{pYCF)YLE% z2-7{&G%rRd*2-sc@bE*(mHsz#e=M9Kifod{>jK{w#aINWqlvR;0>WU;8joA5f8 zy%!xAW##pwf(DoZ7*2xwo~$u6?0}~52%N2mrI{l^eXru>?X+H{Uow7XPUvPSK+@l^ zVZ66Smf&fLAb_?|d7${fP0WlID}2?5EWf;yJ*T*pmG#uj(9!z~NwX$uYPElMk{BVm z5Jnp|>8|$nYX(Ut-|3K3UWtzv<{)p{N>m`v8pCu{R9^S=r2A6M>Y15IIlN;{aPPlz z`SJwBYLseg%Et=M7e?G&eDw5i#NP@Z9IrlOT?tJumAK+y4Mf(XFt2%wDFn4>gCj3{ zZ&yC|!8p)JxFZ<{U*9OG51YV!z{eUB9nBFawP_n50#X1DXlb*PlT4_A{JeQP8d45| zTR=`1XjdxG7EEN9^54hL@6vKp4Ze@3hdW5jJ7Lg3F=DND_;#(%hS>=NILJmIR zTYO7{(0bT4Vs4K22_P(ABoO;u92(iS8n(MYW-Tu%vFiRzAJWs8DUXzn+^)FujQ~5p zXyA;ax%p>p=XLAXU%Awz)y6^#Y3c{A1kd=}+_Pk-pS*Yx?i+EQC!r2SY$IX!B$dBK^Fme8z|LXJdYN$*d+MZD^A_APv0e>z(5Kxd7qm>Gc~7P(rN=novYg z`W_a`MlWgY`b`|noU|0kkpt++;URI92y!LgliG^CS>;T zNhOsu6mufKp?h0XBg^)Qfr1>8f$zza->j1Fn1EOy*|eco0&IR;Nk!6Effp1!oiOU4 z*?i^@-RzSw6lP)H@Hmt{)YEqKaj*O`81i!-xK`Y~%RKCAL*oXz<=W zvFu{nOrZn#8XbX)jxP|rdyBsPoS5L)an#HVUKFdAy(W1Dv05vjlql2j7`xx+GS8VE zz78E5-ar4qK(E>H^S8b=!XYr-NVGs6DCj1Y=r_ZoaK~luGE*Y+`x&FKmLk=X&1`wjr2j z(GG3`7yBH?O(NZoT*DbA$3Y7qgtT)WNgu8R<8mEQj5`ST-r=h#jjqV>YD~kVm=-@h zHsBQy7$^btRee=GM*Xa+0u2xD1UQ6Jed^F?M!|#$PT{@H0hTofb5g*<#pv=iR+t@Z z;DPJI6XWqI8l%z=9js=4kR^o8`i3%BoJN`iKqRznE-DDM22f54Xr8ZMhq*nKs>n4D z?>XY-8qr{&lJ=_j1bP=E^f+@O$MhmJ)KIh;U^jgfyl`Mt@a@-cg#DzayL$;WOHmc{ z?fpl3UiaVi( zwPY(%Wp61yYNUAmkN(@Tx9irGwek`2C4ewAx+fpJle4tUC=`u_t(jJ3NlA$figmRCEmErL>d9CigrQJW)EHj7Fy7~3v~nDMPF}|y99~zRkw8H# zyEw7-{-GS*3UmZCB|_85LM&PqA2nnRLPJnhX)=~EdIjG0DyCVpq2OJh4a?F-4 z)V7bRt3AK%2-Dtr&bIFAUKsD&r&Np}s~Q#=LG#??D)Wh8kRtV7I1STX;omv>iv@!}rP?4A)MzIgF)jv4MK=e#0 z#sOwx;9anqotPLKhOr*yOCceOZaIM9BRp=mO>!n#3d!;kA?avqYrD$O{oKJQXto_p zkRhbtYOQT=@ULzd?lPol!jPFBc?2r~s_hXmsagKZGSVGZ8RJV{MibpiYgB!Y5p*Owc`&v7rQ(m~g> zl1?0#;o#r9x3ki>FgBLPT}5TT#BOQnV5CQ6(xR9q@99BJ8XB4tQ7L)%(bYx0Uu<%p@|)UPQr>%b@(|p;+YZ=Y)Pn645o5D_=Q0w-)`uq_{!2n`YHs%Q_TI@n`51_< z`ym!}$QKCj9BJ9oycTcn+tpt~ANQuug-NUN-(0y6vQad3*kn)~h8L0Yrqe)- zNW2{r_^pPzx^=hw=85TNgWnpc+v2ZYRs8*80e)Jdf^mEi1$~l{k+Eej9$7kcS!$S0 z;OGy^XV93j!zb_My|c?VgOLr+f#YS$vuytiOUP%DSZGc1pr>qNXYSj4fLAf z?h)SD3~|bGbaLj!vy}xCg-q_LK7ULR_oR_Za{vAW-*tI$t9>wZb#LzE?fdaVi*w!U z(|L6ZYvprv=aJ*<2fVn03(ik5+<;^PaCuo@9Ld0Mlqp=lfu8au5Pb5x)=O(^YXtW5 z%5`B64uvi+USJZv>s8MD4tq{urO|qv+i_VppV)$c>@DVHylV&i0&vAJK;9?LA+ zE`a9(ai7qJA0|&O;<^YNo9;6w7a!d%Q9gVdb?U@~NA?y--grpGoxHeQ84^~URt0hz zIvc9Fj%RM`N*;!(Gd=@_^|k>GmBYXK|xKn32Ll|f`UT!7WRSu{==LR z&rCF2C*Ha51t|n|r79F@lXG2X6&P3vegkLs@Czqi_#syN&H5X)$Mk#9d_w+ujT`00 zj(feiVnz%wj~Z46T1+7eCZ)W5zX28tA!V;9du0@Onb4 z0cE)Bc65hG65*pX>ay_0rVZhJ`|vr~W~ji&y&h25JZovuX8dSusDSUY}! zR3T_e-JS~R=@I+!O5HeVJ*MrWPM|fnJJ`YnD;k{?C9!M~AME&wWz&?{Ei1c%I{K!b z7H*fK89W3Dih0mXr4Um}?O6U7o(IX;F?!WzgzkNA1fvb8loZAoaR zNJXal;VY3Yo>NnUUx5y^w6t;(&+6-Ad=z(I+#z{v7uWJe0UjPzH1@Tc{q1TB=@=Qo z?$Uh|3$VZS!0_uUwj!Ox@)=ayZQqyEbIP}YCBrSR z>E$Id%9UWCt6O^f=@~GVQo-zvSfO(LF`Ezsmjy@3NZ&n0MDz4=sYfYO1Aoutn-n!J zV6&!#-*-oQ`&X3|v4;Wzyr=A=3Sc4Ps{R-Y2MP+!bISVZC|2P;$Ov6l6T@QIEhzY| zxjD}9{42y9nhjVrU;QpFL|wL!;Yq9qc47OCYxZ7~Y=AY-$qq|{A`JCdst`)=y-HloQq z6Q%>(%=-1#az+Z6uepVVGC^HCxMaQxTIlME0PR4kytbIwA#VJ)v)A#^od?ikGYG9E z>ziTh_39eCl-G`-ezU9m-aVhEXVwuSTKvqfb1y$*W5{3aAhZTr+ip)aRNlLH5Beh& z*jaVpeULcCT3%$a`5#r|_{xJPm8!6M!0pY4#uxFFxJ^LvZl6iS(q+t;FOtnif$e+6etSf`3Q?XS zNbS1G4(a;M%tAoJZ5j3S^k6AKv$HW*^#G& zLX)GZqocUCEm_P-WVHkH3VX(J(lI0#j00)~U4xG&qG8*Jj@}Nn_p74t{NGYvM~W zVCZC)m92rEhW=rh;4?-oi=OSY1vi?SbXtzcqKc^hsE}_bS`Srxt0u$%w3)ECjw3m{ z(^e!YxyO*}AjgIC=OsM)NLewhM<3*vGU1C!(5XpDSs=ErtQ;A;apTUNAJ{jlwC6|} zo*L5x-{$)}<{#1N#sOxWuP=k|1(1|nfMyPdv0!4^9b;o)33A$x_xamKxsq$2Jb`Ct zEifoxqVIH_B|XL#>L?*t?{{oE4sHa^LLO}k)a(d*eA91cMhF~~0OQuiU`>98s>(`u zisD{$D1$L>AdV>P5kzW)Up}orc^SPZ2r1P>a--De01wB^6`49xY}*#USML_>MI%UV zps6uToa-1E82FAAKq*Qzd_IX2hnbs3Q+i&_Ke9XrJlBFT^}VBZ29SRK3@`sM3@ zKw>>CsmrZ-TO#DQu(E1Myo6foqqzS9iWg-1o1rvPs4W3(=m#r_DV;?HtNUToHFEi? zdKu_USgE`2XqxKqGL25dt5FGXyQomo%uj2GNTiX^$z@B{l-)NfFEoXj@1-7Z(`v9a@%{b`f>birLb^_lL z02@Nv<51kzU}Hw{Gpfhf=@fv%f*Wlql=KM0SJK-^w~2U`3^_*US-N4TEE<0^6a5P9 z0tH{tSjMVBE0B4Vi?#pTfIxh$YN+oT`tyGoS(>qGpj&Lcn8${Eif{OUf&7f4IHZ(B3@!rQVB6+ywk~-HSr!MXvqvaDc}r(n=E7|U|j+q%Qnb#zF57Oj~l6M=;|{tKt|-LtDt|=*qCw9 zo$XtOQ5~8}Gv7N~pFTyeh8k`iJZxLaC#2(E;(I+dBtX9^ylV>*o*$f&ht75#V&Nx$wn)Ee0&+6+Ww#aQA? zTgb@{1Ni0T<;~1KK{lM8nkqQ?6k~~)Sc7FC_%J z5>#2>4LVJOCmhNUffACEhL8H_Nj;vBd776*{XApYUMG3=U$t_>p6 zd6QuB`+Lc(un5o}+%JT$4%X-!CC7-TGk4t7T;WQyi^7}6+ z!^6W_WkcZ3^nz8R$c5)a&Jo6JmI;aoc^2YGfpP_96B!ZnMfjov>j%&d4gB@v_Q)kv zGjPNJ#*GiZ`ReZ{gOT7B6^-|eNmfVoToY1VTr4!oW!85h=4d;8X6dT-h7GY-r|EN` zqRB4JY#Y9cG`5MN0$u)AxL}b+#3dz7jg3q0OnV|v!6YvVQz%t*DXE+b+fTEdWqgL9Lw10X$b;;A`2~MPahxf#7`wQ8-}M-dA~qe z-7U?!u4xxK2sh@<<#ufi#+C%=$$ewLpu|rTthwjWJkG#=Ki3Pbvd?2<-OxQHJlVY< z3KJ#8*n|v*6U{YPVMNskV;*WRgdW7LW$dm11A>&OzHAbwDh8tHR&E1{vhGRN4Pu*N%*Dzh) zCIyA(#%1GO4VHdning%iG;0sEuK$jDOD(&j5{>|9-?5mayx zU@4!Pp+1hx44;ES?)BsmEDjHkyO^DZ;p0r$umlK%@K#Y(Rn{#4%1V5fS!87C7%5W_ z6XSFz3EN7V!E^x84Ih2(UQpeYjH(e;PQEm6t_}}iLT=Bf0#qdkqae1=9=xiV#hxAb zaB7x+^A!&FIU|>1odazSc@JJFE-t=(+tn_l4Q(CZky<4-Y0yTj!r?9OPpE#VQ((M; zRHY7e(R|fS_kD7DYVcbUDbL8!k!N_ti14>`SMG0)P8Jmt(u*P@-+aYwL*S&aQ{fZ{ObO9`s=mmlBMY&aPjCclm zGtrr`0sSc03u;!DgMb0s+acE(m)a8I+VnsN8apSd1!PG(pdlme=Q8{n&dtCoB%bm8 z*1}w5AJDx7)^%-Wpc)1TKOMUbaH^dI^N_qax6__^fIj|l^L~04;R1bLe0M~0V&dz{XkN8lSD=XAb$iMt z%SZA5Fm)ziIj-;8e~U;NLX%91QW_MQGBhZXkfc;nQY1r$REQFx5?YE3(TFHRBq~XY z3JnM$L!=^vP>H_Z!&>|Qy~jTGUVE+TeTMtKhVwel^VUXh{m zVNlF91M;5d56_C-d-jwP1OfB%p;R#&5YQM#b$xuyXUu?R;yzDgq)nFt-K@MwNzXMO z)?Ul{NolS`e7Jyi*pk)dBY4|VF|r%uDuU#qUcYt&74T)SM2duLcOVp{-b$hpuY%Hb z&Xs^03eNs<@O}3j2!jMdBQrf~u+*6RDMYb8LOu zN-0{P>CN*^J`Tk}n6E6{LOc)#ZZs$_zivBGTvk!BZtYqWMcb}jYZna6ptMfd)jo+9 zfLY)r>2JeElPic_X-c!5v;FkQMAP&G9Ufm=F>&cOhyS<$hi!%>$uzMuum!ZZdVH&U zN=gdVhslyz3G9K{=If_=dp7|H*VX<8GtGOG;)kXTN!K zF)Jf`Vj7+p6$zUM&KKE)9V^xM&bio_oS5jw406qtBkOuv1AkEZ(JQ=HxkK^vwpN>| zodB^;7#U%1y5!CAVX&0rR;gDBQS^ECGy{p^y7%wTvfgjqnmTnVOaV_|5dnnvYqn>Z zKoZ5G<<6-k5sH}!_fXUgToS`GGju$I*=KZ}tU&s&5fd%>-oRe3-j_#jo0-UR> z;c&0b&%ZPdlKr?wKu#cGc!x@X6tH)#C7A-m?-d6zpbmDfaNqZ|$2dSjS67wOO;n5h z$F9n~d2>7T_yp=-VGjygDV3-Zj3?Q}BU%!{;`EN#imc91HpJvDIz)r$d|`2T>!hYR zH;ak{XCK+1wqL(A60JDm-viv$s$MU-&uQ5}^ZV3EZ**}#Ba zAwx!t_{ZC#^2zvh$GY$DGu|g9BV$Z`B;JZ4rX~hS0<7Mn-&nHSCM0u=C*NI8RTqgo zdUTaEe){=q-9AgTMNV79QlD(Z73}e&M;WNb*7fW}J#_Nn&rFZ4wCQxS@jVfiP=^dr zGB#nu@_1(&BtaYHO*2NZC%=40ESJ50?L#w9dbRCE_X6m#Kt7p=rx`SKJE^CyPXV(d zJ$=-BmAMc3eUO#%((v88j}Mf}y+Q?bFKk(X>t~kXgCFY8e*F4ztsVSFS&6B8KN@EJ z>U4fa&DWuL_o3(K7H*A*==sYVvS%@K(~JEL?~89%Q`aZ#3k3HR$Fi?ftIRdeue>fY z{OYy&XqUhr8nRMSW2Eb}3I=Z}xe`J;d3<8`UZ&k2D=+M5nlVOdp7uc5umXlto-cAH z{_=?RVm)xr3#;M}p>O?()tXgz?nmp!NMo_FXm2o}G&OJshgWKRR(h?Eq9QaHb_J1% zB4XN!LbnmcPY>=VP{M7xuxHPn)}zxX;Gc9bJZ<#!^Mx16h8uOQdy}{1+=a1tt@tJ&NMbV5*j7mSBs7hHH-6t6`s^E{Cd$A;0m|ES{dgF?$PR}pT^Fbh zHU0qii&5o$pQ+P+65z z*WFrP(*F~xEDaUvE?m0w{o6P9s`%rAaR+<6ILByc$Hl#3sH?v&Xx>KNl=IRj=}xl8l#}cIP?>hvM?-~T7_4A;cSP=)IAUb zReXP;>sm9b^DtSd))PI1&KMB(Q07TgE&6hsS8lm9l5qz09h)$bX0ElRg`M{toc7N| zT|)IpcJ{Y#-#!P2&-(v61WBo9RaF{^M?hhUBD4?P%FA=*&nk_4HcU%v!n${|ck`Jl zk|t)NvR$lx?j9F~A&M}Kef#!pWP6B^|3-EXoVDgk8*roP;JQzPERQ88Yt-+Fc{AW( zI3-_Up|bbqHBm96!#@zXjXu1bq~S3hom0_4BZssCqz%bu&w3dfi@jHAsHv&ZcFMF# zwn@`5=`gf|35^u}p1&|A4sfJ$ZlRb8nNs$uuI@3C;CmW;DU4)h;-ArJv$>X@8L0As zC9EG{I7Uwoz-~G?K(ea1BYjy}^wQR4bc_0*6i}%Ct?)uNpQHUhm!7WbyJ>URJ|ni( zeFNKboIl^Px>$C=#I`YHXzm>yLU~t~g%!&}tRwJaiY8<5>ojQd>|z(vMo}HQRs|_A zpO(Ee*NsV*)#lA#Cy!l!;l}vC8ld_}lBeg*!Bk;w@M>jmzRC^x%g99MS22=t5Ivmyjy;tk@qgamEB0sNWqP)>2TDtt@_ku& zg8iZhwb@)riYV?opt+@`=Pv~=*Qh(Qp&&tSb%xvRh=7)lkm@NOsa#0)n7g#7YG{P4 zlTI68xOu*fO@3yuQSRNt{h#*)cNHe~VDjtz{A9vom;P4+!ZmJX{LARbg>9$g(_yws z#NP3mb(_G(QLDtucfK>@=!ApoB&?yaB&Y7m2KQXLR3k=9G%4b_^F=BL0{9T$P0xh} zzU~_Wgt?pV!mc~yD34!7F{2%JfGE%teo=1uotG%*QZ!{Sb-wITuJY`H-;Vh@KfZm_ z*3e*NqRfbMo^jz&srMfB%WqFZQ_v;mddO(4)oQm;rXA~{I1F>0)t+G%tb0n%QC=C- zn)gCP5g4i~jRiy!#JS!L{nKv%BJVU&v+0I_+1)m_)+U(ukR-RC`m*favqmU{Z?Ih9 z&Y=xijL~%X!V=HUT`orRpSZq+YSih3c{9a+_y!75u93EqXg%Oj7QDJF6 zvl<$h$tEU%0*`38!4&3YC6Lz3*i%EgWcCU;0%e|=Y7=-%%g83h6 z>fqZqyiUagQ3^vixdl*~fo)GU2FcYuNZyA`npGeYnOyw1uUqcVW_z2+BS-FJiuYt$ zf}${KUj{>u9RR&EB}`_E*dYI%l>X<`itgT>G1#l7Y}{PE2@~e4?VBxmPxp}Tp(l)l zPr4IiXKTsN3G49o;+yS1Vae2YoVfnWwwW@b9dy!Adb>Df^Uk4At9Y+I+HJsu=(=xn zH+FpmfA8@qvwrg@ZPq1Izyl4O ze&;Fop2-<2t=^4>elMu6Xlhs}g!7s;B>rJO>`$;10`mX{{zS3cnZcp%OP18u)Sz0G z>a=bCUm|JZoK8Ikq$Jk{DJm&-?>l;z3G`{1^q52XH~vhbgF=yAdTL4n|9N?Mm=Bfq zE2A3xL-#S>8WJ*%ZbqZyL_`lJQleu!k3M->S7-jQ`pAXz=Lh+I&d)cU>x7)i@xjNF zmIp@w!QU%lysq3CzKt=&>~SqFpgj7^4+u~$0Og@|((BSNxIA*C9}NGHV>Meri!RsS ziTYc4{advw#$UMY0gy@!8mxTR1;MwMS1C6K;Of43v9;vAM~@yg{Lso4dhQg>vdOh$ zcI4%mbo;5>#cI8&os8%6gAbz~LH%B%z?^jb%9Up#O8hi z$BtI!smCp(N%Zn&2u9ixn1_d_IT?$M(&>#9+Jo7$DH z-dz`H6`Og(_T&n`mo+s7MRVSAHKP)j{unMgbxV+%1l#G?E9Q}NPc@De`>+}*5d{ly z)`+(3#Fq7kw;CxknT$WD9$q3o{!(4r$OV^IZOL0R>uzks{qCL_Pq+6NICH4vSR`7r zRxG~R!L$7wHPOZ1f~dG8IA3qr$?SCV~aLFjAK6IAKP2VDr+Am=6*okZQqu({!u{yPsY1PSpQ; zlQ^rs-xai9BVhjY>8#DLkmK3@EhAJ^@+cQPLNo6dX6*o{@eTr$t>*%f@7vqOrZNMR z9T0K-Yroi-!WGxQ@T%Y)@{!5RanKz(a`2D4GgUj77&tyczP9iNut(XDKMzsdn1Bn| z^%~wAf^iqx6O2Hr1tLUiNzq#b2;@C%UB9KA5&_ z*?T6ZR(@HK?_nnBg+FuFA2;rxNvQddclZGYE5Ed0G5vXtmKUKB5Hjr8$2jA3ahjl~ zH#_xO+*f2hr!QZ=yuELivh|6{G*6EkdDHq`E-6X~R70weKd}cg-pD9VKg^rB;Az9% z%7t+YUAlnRM7(=lTd;h^iqt>W0sNA&rDfOP!K1GVWa?GHC2NZ4Xv)Tg&D^xEu58OX ziHd}^S*dJcVvTH2pk|wY+wq&ow@svMWrE}dX3FAzWw9~Lf7qnm&KlK59A}y|+nk{L zm$%wtsgF|tt)|O*q#{L<&ox6Ck;r@vp z^|EKijvvox=a`8V4Oy`4x1^8bw;hnqcp4}JJh)=4#`pegKB#4hbIt|HT$Bl}Ee$-W zq$9dpQgVE)U@GLKk;s#=BJTeYOwf4Rq)8ZVg5(S@90mI!wXtKHfvq6_+@fa1uO3Bp z>4XRe^bfpC5vtrL!)uHvPPAO zHJl=7^iAZ}lrWnqdE{WUYc&W0v)RMnnIauLxe1zA*;@ERR=PqB4_U*|vSV^}PEp>+7c(1UaHgkhMN)7%-qupJ{{4KX|;kh`8o}i3P~c=LtFT_X;yC z-L2*s!;-_rq)|;^heMQ98Zgs%iOH_v*eS-YZ=Bojr5wwL`5M6_qR6eStDT^Ns;97D zSY`4R8_Zcijx33X6cg+{#A^i)AIfJOJqSyl=|kciHjV%|7z8^~mM5-#8kA>y{+;>Y z6a6W|WUW_a%@|*Sks|LzJw-Vmm`BFvVZ|D>KZ$$qky8nc?ABM?HFEpnU6!Jmy}IR# z`$M^5Nr{R1I5R;c(TQ&XPQ~p|R)ABZ@+v~_u|m$B5e325l^S}m+}`AtHe6SqhIvxP z0t00ISG8c}Z}AZw@{}f(I8RfQ@f@1k-*vX4O!XCYVKI7+GuWd~!sZope$h|#{H14T zZiRo6I7-rMzMlrXmw%!%Y0~CD23j^!cEerHJb&V#sjM96Ehs;QglG`FmST{q;e^aK zvu&U57uHyLugqBbX1UzU$!xvAjs}M30v%-+haf^!`DH@))weg@8t(ZL`8jrjLf@$TR>gCxXR=yjJ4U(eW1T6DJt%r`RWLk zVXQ^c1C#hLA#$kt5#y5y36l-P1INrWK3SvQRWf|nF8wbz zNHHGcoE}Pu#=4@pU%IrYNY9Hu&eZ1*oyvc&rJ7^5-}%f2zhpf|88ke=zja!@P90?= zcm7P{6s{9Hv>Tbhml7^K(ZXB0AXH8^Xe@_Cs3*cX7|0+DY(zFKaFBuY2$pwh{ORd! z*@Zd2R}H&6nD|Z${B5QF|#V6@Lv}1z3vioICD|UPe%4!^~LX z^kyqkUR+qVp1xp~zRzY@w;nxC$jJ8YJ$aDC0_iSYa8Mi(JiaPdCPs`jIEbC~Vaq6; z*cETqj63RBvDhN%pS+>+%jZ%=Ds|Z-FPbO{$6^fX-R%k)^QSOIZr!?t z$65|y1rfa9qVaAU(tD}gUNPNzFkdknL>C@70?^<&-Pj_5=2*~|VcqM-GnGt3 z+S^*zKGeSGv|&Rli3CfXEEv)W@$qcZ8#iwrf8KuH_r>bD2YwB_RXQ#(Fg7-RXV;9A zk(bwMMu%40mRYQI^IbY!bLvcs8FR||X?)xwRh=7?5czE6?6tAmr4)mAsyn`F{JHhT zimJCRN7g#MSX=VGWk-*X_dfls(tds9Q|(44yUMgQ$LNa`NaqyJ_r$&*sqLW#`Le-! z%YIT~4Of=X?VqB&EqURmsl5^It0|k^QS2oWUH7XMO_)A==ziX_^U@QZ!k8P_GR@Hl zS21MpsVA2nu}FG?Xe#m&}1pv-ZoI zX_eZs&H_vi$AYU?(7W|P{axoiE*&4c%Bt-&+jjg8OOHAJ9J?I~AYcdC=0p6n8o-`HoGyt^UHCN$lUCj2O_DU98Jp?2kxXJF1>p<>ap1Hh;{`I{2F}z z1~o0Dg(33IW0E!vIxL%NdwOqhs?64FD;E`f7@aGlr@XC;tC2^YlD>!45yKKq826#u zc}Q#h{QPWE=FRpAYZpXpA@$&*R}ewpub zE-kV1`;K0|*GVj%B|I})*O+G(&2yTP&~w#IH_Wnd8qAp^>U~{`SF>cvl3z|dsV~eu zDqeh>anK>v$J?6*aQeX!?xAb@gG)Qj-4KFxLl+84qaiHFuj@B%)bun`e;-AYTMUez zWSVg9qJzLe%DZtRY5BQ?i({tuGg6-o!=L-(&OIR5DUDl`7=0^a(5~QMvm}eCj#`qt zLqf=kbyC6#;Y5~SP7_f2K+sRQJ2wpwSlWDH*lbbY=T|Wu8vOy}+j>*6 zgPQqS!&EvQ*o$Yby-#S)&z_GC;-5gOBU4u+$qC1BZ()+dHVS|P!5&sP1~0Y*Yk+C~ zI-!f`BM}~iH9uost695xo!Jb{88aLlo`8IEkNseuVnjhuxz&`Z_Bt7$GI-ViBfH42 z|8$j^^5Sb8Ij#O%tGb$AhdfGE+=#@CMIuRI%?1OZx!W}dKwg!vpc#o; zlcDInA+Id^e1*<^1w^yvXG`$EIL@$?;H#c$+gDy*Ela}9b*ugB!HbPfS|`KmDd;FR zWsmlhg+cmC;n3KApBX48SCF+x6_{o9s#P*FY*&$s8#T#rH=Kd+{N+>5<5;+yn|*pe%!b&C7Y(uNvvPBU_VhG^6l-FVh1UzZD7Cx2U?b1ulVY4`Asvq^Orbv=$E1T4D^aK2-$NiBmDHOuJO3QvjJ4Ss(9 zp9>U%CLcQmwIA@)J?Zde){ellS}E4T3coon@}_A*`OeA=`_mP)wl+pGE=|0B{fe{B z&SxJj(Mnv!(P)RFm3{h1h!lGhde15^8)Z$c$)})JXWqG&+*I}2xE@f(=jHfcX@15D z2&W;uRj-{pY%axZ(i@Y4S8JQkqQqiD@bsNLfmNfGKVB9yz@PAVGRtDa#K4h6X9EL= zfJamHI4^9TWf@TqI!FP?U#wU5TG4_yI%VcBL6g}( zo1bC%w#nuQf4k@xX3JW;KQ6P+yOUGkd@28+qwE-5(!D6&DI zTcqm(f3|d~gmFEWMa%WLcProm3 zLK>t*jV8itNkzNN7{oOVj?-`ZC=a*NG(6bLb?;19HU(`SUsBkHS?t4FK+u5|p z*S{%kQR)4CjoIl640oI@<#*-cT}0{&R3HFnADWVY@!*cYSguAG8i@xTUCkP#pb9As z*5ws}?EmxSR1>p}HNL(IGDDX43JF-0s`z`x>5A<;cCb2QdR|&`z#>ViM~@{P#>9@L z9hukqeDkr5WfcFgP981GXY(+9Pk1CLYtPv5c9iB&H36n(cHx>9YsV68-Tkt@o5iV&GE=5zA3l8Gkt-~0QC`5TS~$R#1T{uqX$GU1Z3P?x@Pka7S1lSm z_;<);*}XZPw+&l4`Lqq4;6qgHG8=feVVOx(%HkaJ#-6D$I zB{s;)iZoI2q5$3b4GxQ$9PlV0f*3{I4J{4U`fpu7!{i;>kkKp!yVDhLk;?BEd|m_1 zmBQekD)C|lT54J1-Z$yM-JW6UVtP~T<~Hpqa<|D*FM4*B#IWI%O>+FFNN6QsV|C*t z%*vpqM$Fn>a(K+}F=OoJ^=sNPb&M!_?A1>fx+;cKmX7j#P)9XsaBU4F=jQ?Kn_`^5 zM^V`lTyuYWsj0H9jR&T`-uGg!^i?%XRUq$73bYvTySD-!?HpzIX2n6db4xLPNGr^3Yep zO5y7BK1_d&ipZV8y6D_vdPqY501z8gGwubp)89XhFeVap>(WK=fqFR~CNG)n=g*(- z+X~Jvu=`Q1deI^E+>htbI#539Ojq$f$yX4KFB@+o1G&-9H|lGe`Cezer#?Wpj#6iwz_0qs}jk)l+zKJD=rObF@O^ zmoMnedheHvL5*?mePAPPV%duVvDj!@Fj*5~KT4IP8`5w0SSB8c@j?8>m+dSK?!^&w zjej!HH@)s&ybZK7-hRfi&;AzA1#VzFtFz{0z_Tjo_yKntYz{5un-G^yeN&8gMdB>O zU;2XwPoAgZ(ofj);?IA?-~{!eXL0Sjcf;Ox%fsnmGa?f)WA#YZ#+A#LCBvqp48Zh+ zO}I_fq}F1;R`R3wLseCoh)h4*Q)K1#Y*`1XsTosa!uyT0F3v<=zY7|HN4mr3a;qSQ zO=RugV13mIFxB)hZSKEdZ_U+)l>Ggb&^Hv?#pXxEI24DXHMiO|AY zgQ$6hLPw*VR~PU)e2n*+WJI9po)s2D511@0$j?7AVZF7bEiFo7%Ei$e^5lE2d~z}5 z#HsM@=Vl!~!I5``gJv1U=@PiaI+&!|Zo~t5(+PEFLd@N}X8n>;%Y`G7U0@_5W!5OH zC3@`jJW8rqP4S#@Bb7VG&LiJQO-(2lj=(Cowj16f2TRUrdoOG3=9U<}_C)L|Y5`WV z+_BT;9>QTD7-d#FTV!Z%n5~|-zXufH?!M){adf9Qk(LA+gyVm#V@G2V6z*YjPf2!% z!&F0j+;AA~+F8x~dk{CN&lrfV8}?Nu~rdiLtE?BFoNT_dq_D(%=I z>9o6O`0DQs_LuTSv6fvWx0rBLtKFXtNMic*+cfqJ-<;+SyUe6QP&xbS$eN$7Kpv(? zE#fbnD9nYgz$)-a7@+yj=H|Lny`)q}jaoY9dyG@pF8gY4(qRB1blq`GyJ>)mnF zeGh%>?>@irfTxETI!Qs-RLBhBQ|6%2*>nQKt6izx=MJmDyJy=bZO-Rwq4RJ}vogw@ z_&8o!aC_U;N02FAzoI@#tV14pA7-*MUTBD{IttJF?!9|oI0{LlM2?+R`|;zM)02V$ zf%YCbqNS=N6^Uijhm02%AuG#buS3^#IHD=MnP=_)xWiK>)w!nSe_G;UjkY{rOFtwu zv|9UodE>Wl>(;F4)$h>0eIwyWk2dct6{KKpq4sjL_wwZpu(+FI;{BENDp-|$1JxhV?`Qsa!2U*CGIapk%gxDg$jpTPmZAF>HVqdGzCMqZ#*QGUZc^slbp)8-`GaCFYmb15J> zkk3#T49x5G*`ivZCjk$bj!SMVVohuxE6XQTstKnvp6BTJe!Qxt<}v`) z)|p~~dDTP^Q&|7h4#BO1kwn7cXPUI(R8ubifxK;9P~BH2#Q8JP6Kb$tPNZWFr_I~l z%Jlpx!kLM4^EA6Sc0O)WXRjJb}7#Mk@!~LfauGvs?P8xpUq>i<<)A#>vwL*(L%j1JN1}$1^4&)NG z68Lb-=NiDTb97fNwqs(W}-P47$DV3yU`1-Yh) zVwHuu;Wq581$$q-ef8>d%>n0kS$Ed{f>REjGWTVIzttfYM=575kqoWxFjcaRqK&p2o|IbIL^y1%5AS$_UP770860 zT9@b8p047|6)08zo@vVC@JBC2+TUL#-Dyv_yzI=!D?Czd$Kw}D!VU?Uqt&Cw9;jxL z-DgajMlDuG$JDK9=z}nrit)^ehHsd9&b!`PW69HN^O=}Y@ePq5i-CIk?_Ye&u=A5Y z1LF&xRh;cXvSJ=FGUtA5@Wf0k^Ty-n2B#)0q(h(`jgo8_mS%_1w0(K8=>PDF2{ie@m3j1(Fh;*|#IbOq7yo!aK#&Fy z*Nfjv48GpODwvRS@En^x1q!c!*5xWIF& z$$R`vmcpu*o|)|nm9 zo|ChdwKj3h8}m&kCOiUvB0D2bmHqv?z6Pm2^vOLC->?7mQ#F8P0>RN&OZdy_BK1x?8uyiSoWv3mL^$;0fR-B^MQy6*Rw_C^)Xx?6LSx|waQ^OVF~B z5F$1;&f;Q_RVnPNKn;w)g`R!k3ER`oUn)*GVr*nNeR}VG5@OFcewv6IP^C5}DZQh3 zarXagh8Brnc{2CsIj$9P0)g@;5D(Jv9}2%NMMg%F?RIK)dVNDaq4*Kwg^1NOtym#` z$Bk*oX0JQN#VB3tpI!M%7-Rs=lHrfro)(V_R!J8hc&ZGUa)6{quJq+0t!K8%WgBfO$qJ% zC3oK-c9(3M=@+^Y;ebFoWcy>CP-#0bX@=WPA|!gWFts?*{tij(M5JDkwxW*o*mZ$d zul}MgIJRE(RZYz(6s#Jbi~z$4R$l5}6Jm{M<2XS%BCWtaq?alhrDNj`afqe`{0()$ z!RASY3V-1rJ$pp?J$+0k{4RR_e8J;I7Z?p#L_agKBVbIzY`aqXHv%y4-z)Btcj#Ko zio@dBb9XTir7|E%8nD5yk9S+VSjX{_<=HBiXOtBFyeWpf+0D{N_w1R49E6(S=+BM28a^rHhMg?P z*6CZZ!^~roKGfCCBLnjOrmtUn6koRTsRQ{kOMm@caPdkx0d}aW!|4kACcX;N zjhQorgWg$1LM}<_A`Grpu+Uu7(ErlgtEx$t?hFm(cJ@Z6u$$rlL0!`*kH%n5w&}z! z7~7Ew2DNYB=KOfR5p3gt)0-AN3-43T5Ww^q8_vJ7W`hMjuq-@77J-e;10>dAYZGog zd*)BS3(S9S;nh4(D3#M!)+xLoPAoZ;W!I&7w{Qx><}FV~B8E8iDIsC7iV8E1S^n)OTD7WFK`gK5+y*;H$}xZc!Gr6G{mu|2 zu|c6W9R9?NRI#i6Rf*tx)pxX|#YGOTqQX2jX%oj`cl%W}9aRqNQ#fs#Z9I4H@UPr> z21w&9caeI>4ko#eNw;+7+0;kf%5Gd=*GE?#^*Fom5Ulx0lL#M2t*QyT~+ zZeT3)9O;efQDSk5#BCDBhW;A$rcf`wdgbCI>M(Df>{m}V7HdoxI{mg1ZqYy^**Y2M z5zh#HC#O_NMVWUYfuGEQpT2$n{%~2ork=8Y5^Wm2wE2ssB*G5h2Yq?wjvYG=A9jrR zWI3U-jP+E=XrXn+0sg-fuq^7|-eRR<0{;_39&_fS566X*nW(o6>!Z5 z%wqp>e7f1xsS539vrwv$rp6qKdhd{WiL6~Z(Py?I?#;*yIjnE;j)ZEeB>p{cRy))# ztp`J|A>b$5g}-H&tgUaJrYBm%XdFIo3lH4y&XI9gINgu+%86~}4XG_Qp!3=Ay`jk4 zN+%$oo%&5$(g4>N4pBf<8mP5%cAQBth!Hid$*Z5Y@ap5KFQXpEEQ#oY!zRzo9RU1C zX^$@f+H~#YJqEhOgRcRbT8)37#TA)CaEh(%{z)5BcsV~&Icy|A9Z z&xU!5H8)XY!NprH5frQ3E+)r%7p1}iVVGmsZstuW`1+dscFNLo_@5^Q4XEkq|p>(blT%}!8 zVbNd%Aar^PTRs;S7b~IpAxa#qjMn-)WL2ZV1;`C6$_s1$>%;`Vy1t~n%_AG7+VOCFprR)zv<#nmR7^T_IoXt z>y9zKxrR&zH@shFvf;Quu!|6HxGAg;W>qt)?T71az2W&wmo|T#Gs82z737M>_s4Gv z>}ikn_L97WPNBT5j&)0dIM*~s&`u49yNhJ7tsS;lJ=v?Fp{=xbG}C?eMT_;? zq3?90Y4bS967fER@94op32)y)dVu$&3xjl7``5StfwiDeE>`c@Zic~)nVB$6UD-{s z-^c1cp=?m>UxcwqTA1w4K(7!o(MF2Uf|MfzNRLEJXZ>zbU;ztBo=iG9jgIHovM&#G z2!{`a57Qk_SMW4`knbpH1O^R-{_ocJ!<{lV$FUDKtY06cWp6#tRZMUSq>7()V)%BI zkt4sNim@24DL7c*AF{7pYs78Cf!=JQw6L~4M1R&RN6gIj_l9->QgSkPnxV)Ef`wuT z2doi}i&l!gmK`wQIWe4Ucw0xj%h8Vpsz%h++uUEN3dnj_No;b65;e88LzSiTIA828 zumNi8Qs*vPTn~{9sgxh<^$N}#x=XANrVoL0)^sz&2nq3tuJ6bBV)jbmZ#h=AFJ=X3 z*as<}@es}#5yH+RohXZ>au4B6dU-i>ylR{CSHr^g$9Z{>2L@9z^TDI8eJe@eJ(q`o zj500a+p$&D`2ZxWCu`d+3g^$AL(eVb_GkCs?z$NyAq{l`zWE!quj4;uUs!mfQ+7-Ecw0`|W)fb)q;{x=9n>T{_|C={%Vyg=hD?Gpc=#jm)c6WnL@C8C9 zztv@|Q`)(H{rhj-%3m4K1~s$Nsp|sv9T6WB7|pDmD{X+@$WblQ>*GMa7A;~CQEq!x znu+QpKJ^oAJrEN!5lkW_MXS=xeSzt4RYth0t4RwhQI&IlZc=R!+H;y*%oSDd{chvV5Pw1*?a4*YzV-=TH+g$m?!q zSrfPz{Z%I(KmPWU$B@9_V2K_>hFQ=fp%f@^3pp}*@(>&l1Rj9KoGCs%w<`4SFB~vd zsqJF^xZ|C3FtM;Cck+>zz;g3s^op)u$kd#Jnu{amy!b9;!aA(;RI&=bRwU0^LZVT% zh}`Rx{}L9%aD9CnAL$r~DSm8R_YAAOz`L*m3Rj954QI}_{R5#zeyz1^taUQDg2wV2 z)69tzm(cd>+2g*V&S6v0TC%WfRQZ-cYMLnN?>q0BODf^Lt=GNQEUz;kWB0*X5?woK ze(6>Myk4A99MFo}f$7ar42v+#D9T)L7b8YSNNJ7}oC#ETF0_=``_oPMHPuBl$Qz8L zkp9CVlXW9e1DB>bipnN#{w>DwAA=TBv$B}CK@8wetTo@N0WwFQkylL$8LA~M@gT#? zS#SJNk|JoOnDO3t_8|*)QU8T{C{@f%O}X2x*EdIXy2TlvLY8z?FC-RAd@_2@`3&Un zFX;(}Y(o;~fvW1@Czn>-9%}TN`bY3-;^}G3j?V|^(8vl7VzP`4@N6GxQRb~c8C@IH zDcsNW88f1sIvz)@DIh8&t+X(sYeeCG0|yRQyIoZ!IOj3USOt!N(_!y@=~TD_rjBxj zWzHaof14JjIC}8-C!IGG7${E0&;1dIL8Z2=>6>ZWTF}lcxqGOO#X)F{>}-9#r)pU_p_TI za}2GCp|=_HigV#BA3y~dV6*Zi+PYZTkWiPr8KEJpZU2Oys>+%W^2Gej4mMJ5Z0 zskn;HwzP#17_D6B>g9C}?ghYmrCHa%WRMT9v-+z`4t;#V)r^dI}bF>~c%_Fv%HPrX=(se}fdHrlb({%_*28 zoWwc>YES9rK%v-<4jRBuR)}M3zF*n8^#(_n;j9^;c!~rYb}vTw<(#n0 zv#p?k22$eva&F>ewXLzmLUS8@+1SoTNj9hsQCeL3f!)K zzS)<0z30B*cnu%{`j6-oY?d0E!!)c;S780sMOu2%>M1>mtrl18y5Go?GMOxN)#o1@ zya1~mFv(wCHPfx=ANrMkll;dzTNT*wb|AW;C^z+q$fImK3L3}uE;@6~Y%O!qN;&W4 zK$5gs#0e9WwzGW1Z*EgC2prS`6h@J$oF&niK{~mapU;DhDgQSZ&70&Q^Ji!eT7(kC z-cmmCG;?PxpO6%|Dd_2HEipFME!7og=hWyJn{Eq;{JU2w3=kT9qhir%@DfgfRb z2sys0s>(#)<8fp0DMT6Mt|t&dt8X2tS0~Jo4F>e< z*YNVCa#omdmgNoD1dk{7I-4I@CV8^r9kJ5q{lghPJq4PGO`M6umHreE*I+GCCfrV4 zxQcv!fW%L4#$Ky*3QZyu$Hm1_lSMh@@4cLrB|W}y{t$>8Ow_35i*-~65)2mQjqjZ6 z;tyn&xAIvB318L-wJfZwzEHqq_E!+!Ke{M&On1<3C=91%VF5tzG6BKxC(e_m_BxrC z6T1|&<{|VE=x&uxE~4hop8deq2=Sv`^Cc_I63?fnLzT$vHR;%j6)OOU$I){O$=s>y zWXc@DFY0DruR@*pz7HQhqzyQP-#6~U4LY4-gQ(*b z&5*3Z7nEa{=)u8Tige;Vs3DJHTm}3G{ZBP3Y&Rrku%0X2L|T}-9bp65WHhEBi(0sY>dd_J@$8ngtO>XArNUW80MwX7Ht1M9pnQWh*7vhdirg@pXj(a9K8Z{_ zD=ZCU#2@cORGs1r00GS(u#fVw@&G#7*F%SfA0ID zOR4S%0;h0J6r$q>74>*npHK?AguTZ{=A2d?rda$R`JRWgsMWz77~ybCWiAoZr~g5s z-z9n{)~H$P(JgVh=|7{6$HETfjp?-}O^4OSqadKxalBB2&hXbYHE=2QKstT;Z92tV zj$qWadw0m^kyU1&1i}?AhcYr&mzLXCI>`$3QGQqGUa2k`bWE;(d+12y9T9P243`h| z$6uJ6Fr{0i)87oA#9@Emc|h*GBW=uivC2wwjNSQP1g%K1-h4<}#-NX5 zGlnTE=PK`Bf8pFY#Sw0WY<;@xrPYJi1Ni_;aLha~xr2|wY7!!7Cx+RoZV5WQZYpK@{={^|`ZP>W+wod$XQY(Al83+%WST|pdBV^o7L?a>> z!A1A_+3|QmQUPG^Ca8Lkj~k6GiGTo7D!={o$;IEE&#NXcq+&li@4PE~fPP{kMZJ9+B|0bywKyc;O6@=sDq7)$CpsZF1>;wYQB~03 zTJFaM16oain{ftUfy#2tRHy;KoO3PZBk!j|jAk(x-X#*GOP& zUTOH^Y3ChMS5};=U@DJP0u)CptGnpeh;IYm1iIF|eG6bPdeo@7K0RYsAyZJBdE_#b zt^5AF9vFpW53B++;P<4$wsyC7bObh@NE>5hOZ!csv@Tt41z48%nwSG4cRv*?c3ZM! z4AXb8b6>D45(Y-#`>V{yP^d976lkq?eulLE9#`_dTr1tC|rON9Pu;Oxy_aOML*<@vLLU znFgIuoI(!5jBx=rWE>>mk1Q^?G55~1w`lPN@Z{%g;iC* z*drCbQcWkQz(_fS4DmGY%evL+j~1Xvm^N$HqY8;*r$J;kT%80Lr(D?2oZ^$8FC6bl zi@bf~58*swQtmQV_dm78KsXz!dgT@sO$$)48$k)WX{!3d{+@7~n_9yk(NEpEF;EKU ziVFI4oSP}KjzSq9K75u>g5Ak^=c_4pE3l9NBQN?GuRxF=04;erd2#8!?h1#6L+fD9XJ$URhT>NEuNIdz zybJ&xg>#w>HPA#yIn`EByb)!elOBYjLbA1)PmG=8dDjAP({J9Z=`R>Z-#^lmhu`$B zVtT-%jEoGs!n|NXLI;;&;3rVW<${$OWk_9HaiRH3SP%A&zm`OcY{IjB5=m{@1H_}@%8nk z=9vpnOPc=CPzl_qk#+m_gB1IA>N;f=7c^7H z!yk3N(3|(^vmQPNGx}of*W^{~tyt6N7EV?j9xeZpxK|huUqiY}%gPQyEXAnuOKs3{ zwPZ~=HXt`hDBH;h1 zx&!5c(LupmR1n*&MAgBN9;WnUA+dqJfd(67$MS_BEHq=@elrTc(U(y!v(eu9F9)Zg z17tE)|LRrTSIt_&)csfYLfLIsGBe-3^Hk5_KXX70?X<8*SS27yInCWM#u7Mk)D}E_ zmI}sV-C8gCL40F~(*4oINF67#zkQb-Z>B}Y#9U=7K%#ix7$K4F@S(c;9!)9mTHU)t zx*iUx!U@gDo+ogN#I|pr2mgFQrYE@w6FA;40ZJ*~bLn+NTEv>e?UOCW-F`vI?Y!|r z`i6G*>dyY}DkwZk+8$Sqz~@KMBRY#D4jetY zng53hfLRp-$J6}koi08nS(0+>4r4)J( zC~pD|-L^CjWyO&<4S)43`!Mp*@FnilC#$3^MRgM&W zbwhABVM6BD`hH~lS62PQQWVp#-@J)5l=b%Ud3$hx6aK!NTgOi4Y5p!vh9{B`y{|*~ zl-E2N9t&i&wrgoLxHR&~JX(||nZx!}-}g)>I=2LTYWZT=JJfL0#f*&7fGTSU!PsDM zU^cf$3=P(ZFo9D=ZBF+synNx%_4}W0Qrwwcc7V5hBqrwTHM1-x`I(syljq!e_|UdC zT}-hz@ylcd;SuyObHl~nGSd>uanYg|0=U67K-5Wtdn4x{J8bvgUsHdUzsQxbBWV9x zuDuP|Tl(Y)es|XJ_T6S@y(+$adm};czkg;gxWh4LcH4b+FbLj}z|KXfk*$?4ko+AbmzS~VfY{6Yzl7v zL>YoPrh7*5!|gvQS84sxRsQ=YV`T&&dZ@m>H) z%U+mKoZWG`p7dm*p!cggib1Ch%5;7}ll18G^g=3oQ6`;0tJ<@Ub^w%kl3GRjHBdtwf6^55$#Q{`rMh0_m__fbW1eG9*S{VL7DUZ1ay^o)!$FG@YAy~7XUy0Q1rB$EcrEuNN8|D1ZO_-&1oD z@yFG-0eMm@sU=gu<%TG@ag~WHv~qI>WzK~6>NWli+lwO41QPfnME#$SOsqcDtyotXuE}H za1{IV(H%{!!x^n}kAGV%E{0mS=uCo#QuuMmo?IEPdXWI}{O{Jaxph-NXt5wAFxP}r zc93O^(7JP?+=EwN0b!Ulq3`*ikc8_q_`eJMEGYOcQn~!ajRX|(8fPyw7{pTo6Izi> zj}1^SbT$6(7hJfwLcAuA7-|V88d_TJYA|Sxw>>SKMgb*9KyUdDJmUZN9rf_SjWpmz z1aMIle8;Ge0HK7`k>IK~a-;ye|F*bJkb`=5d*y!-HPAwMKO=AvKtT4JcncxBsQnwi zNePg)@#@~KTPIVa3~RUJe^V3+W27JdMW>hcT&LnLP{Oupuc&&zp4d*c4iXjg|JZx) zc&_{ZZCF!7_6*r&M@2R%TiG&8Mxi8x%Iqw%m2BBtRQO~hDP&f*3aN~g8M3nO<9%Mg z@BO>~zwXE5y8ih2=tm9LMoIo|l0^8gATMt4zbGMm6?dU-ZPC-YJa! zMqGRrKLe!>nlgOh@2qgx{`<8ye+Q=*rQq1PMkp8mRkSpK_DZ0_j2<>oG_OTs0P?Y6 z{ty89Wkn3u|F180Jb-`s&|HI)&&`q*R}j^D?T?i_{?EbX+%;yiMT~2Icmrw~;{E)m zwjj&8(1E3Y|Mg`B%clSQf@EX|?{4Ax&wnBN-~CUtOgppwqXi(o>Hn|a{C~b7+5h$n z`oG{A`fu9Id>Fpfvax*ot7b>uuKZ|Q%^-FCSnWk>Qv=h6SCR5zJ{+r8mlIhovwUt~ zY%$}v%jeaLCGk6HhEip>jV(2fEiJG8^_i9~Uo{Oq*H%+8<~uFlvp(Q8eKU1lf%pyo z{n8ERBrM7P`|E%HkN!YyrW zn|~LCunkRdJqzl=cYizbYbZ%ia|JQ%rGy_TKejan84LR;C#Nu}1PE{ZDHS!m4SYA& z5~{0F90NQtY7vk+XF`8-;MzdkF$oDkMkBJqQ_W3=;X5^etzv(>R~3F!uq=NkGWCI6 zqg&@;GzzHMVJHD504q@V?go6H7^)GN^MY2-%T<66#fuj&NHfBjpPXVnCN9!fv0h^< z10#kx1ihgx2{XCPagQF!x&6@24~LQ;I^P(54l)TP;t6iO{rb(D6Hd9{JYQg(;NK?* z!Cu=V>AFE*;Fcga3jTDX7=Q}H#`(CI*p1nt08O2JWN8*aKbVhRr0~MN!d0ML*&BZi z$;HLRQApc3&va(DLQd3koPu^<&x!volS;+*)cQ&!>oYnbyP5Dw23Ec`SOMfMr$UgP*xqh z8V3&#nyHJIt*of&=nUY$B~9stmx?Z%CKQW~0nT76+#zX7R@mW9?_x{>5Qz45L@I~& z3l@-I@^f+u(;Wo1jR!9SoDdbRC+0niv6kvLFjPm@xNSzM>b%y+!?86QgQ@zyTE4!o z`flwd21;Ozfj;>K%JF)3pncf4CB8!W3dJaBdFoJ{Ux43yUoT*#$}{L@%^skwEhM)9 ze*qVA`)t5*kYq`^Q`nA8wbpR3|(xoFzu^i--chh>Gi<1k1*GX$qUA!aI#Wu7oeot$;5o}o_8w9_WucJB$hcwut+&77#<9uD`TRAEsEdt>!RvWw+?R8j zRXSq#oHUlhFHxe+<2ooF=$Hp7JMb8NR@`;W&z%!k5O|7X&*qQ~yoaw*9MIjvs3<9q z8}P(tyZ0Vmt---ujL?1%CPls52C<&riyWFSv#sL=s&c`)j>Bk6;m4cZO|H~K&AHuw zd=!L=le%Ga7P_~BXh4Xxsau&7D9L(0<9GxwHK1)U^62@tTKAyqFd*58ZCLiv9=kw` zKKkJ>v8by4Wd%jupNWq;rlCia1Au`GQc&+CCx?3aj7ZPzf@#3CXpA2AN%{P}Uip#R zh?wQ>2pI_-F_I!vezhvt$SnaaTw-F$+r4*{xxCKg(%)8kEq`-qtPAY(nKO}mP) z2q;wBw&K0I`2OqH)V37tvcVrLctU09g6;+5P2t@QAkMMw&{)&w6IA8sLW5K=MSXu^ zzo>w~_cPDliM>OshrnekBV2d$d<@T0ESZMS( z)|G14>(p1THlUmP+>bxqeVzp<=gi(&mKHH>bjLjw4`OEW@}K+ryFxJQ+6TUR!Cc+mjGvBD9{BS>rt-Dsq#LLfPJ?m$~IhHn5M6=1Q#glRW%RY7rpO%SOm z#^NG=etVElF-AgUMo3M*w$R>VN8m zdXVIX{qi8KRj5K@ybRoA&5w$0FSU%6)Ni?|zO&#)h#V8Xm-b!E8;k0)P6<|Jti3- ztsj6p0Z(}2069GuZ7_s7K`MA)uvcL!{s|tCVNXCoA(J6tzhv$F=l5^y%+d3+t8j31 z1TK?g5)I%hF|lP{3d6iG$dL2A*w&NT+}1|5dp8#&;Xl;7y_F=7W~udgY4d9o$OQjEPWrDe{(Wju@*C`**OqLVf8d44Ev^0jzHO=r zmm`+PlB)?yn(v5KlT*aIh2I?jb9nkx9YciAdA!w^0%4$jEdz+bX-MJBm}xqZnFLg_Y}&bsnTN_}Si+t3z-1n$f70EATTp z4Rrt{lK@k2{W?U-!LrozEVYpYO(Z>EWhD4Ae%e#By z`&TFq5tC6;U>b{+g#{rZ3%DH68f@JJuiV*fI7NLMqh_F>Fj57vAN~P#B~&TbP?ezs z6_j`G!HK{cFc!FfZP20Wfd&B9B{=}mfS+IO&U^5$XTGo9+4)TY5fLBYZYa?)qk>lx z7aNN@$qiH;GA-yk0|Nv6vxtaD_9HERdSa>ug%4P11TFk8iXVbifXnF7qi~c4>N+MAr59M9d-@=MDThn|?&SjPSP6Y+&Z z86R(NWd*jv4Rt>Tmu8nba36znTfw1*g`t^%ZP-P`FIc}I!a?wiD}aTlxJjemzNLjc ze~(}U=_xbpjQ-uQk@Dz~1-9V<*uz~U5>Q_sVu0Y%OI%rCu(wdLfxK4qUcR50NN{~w z8n6_m!>&BM=5mk-nqMXi3rM6tSP_Z?NaLr0fP-2CKpFr$^ceVptmg-|7Fk>Czdghc z>o54_U=RRL7()CP0G9F8hgd(L-o(N^HCwBPca%6`W8;O0j6wq64wKN>N`$NiL=Vg4 zp|b48$uJsVRAK<1192`&_@uj*Vbl02&gG%>Fc`z5(DW1 zN%`&jRZ!NLxm8cGK8Q8#aClv6To(g_M9shu1GfRlOz{;PYpknlg%Zfou@C+!vphiW zjQ4#_#BT?o4PZu~k2s4E_vfq5;nNous=9*Tz|+Fdz?*?i0?07_G?df$@Hki4{n&|j z3*r|XB+gCtBRv%yRPc3Pki&WC+1vj_0RmB4ozM1kUG*?7_+8|JYORlis(2HYVGO@TFFq2b!l!n3rqwZ*s%#+quoyGghYm;l2f3Ec%ZMewRPwxDK) zlJreY6Gr|4QtIO2@kD=#{I-%((v5Cp%2`FslN4hPVv!Qn5XcNehyFP{eFQ%!z;TX; z#@z9Dm#O;j`LVwp1nTJENU%G~+nbPkR8XSuv0+x7JN~?^4CkmIdwfBPW@^3C_=}NT6L*-Vp( zn2_urjMTt#1=S>sK7tIZ#=zu^Zeo**6lTs4!c;PJ@t>g!k^(gV(?LVMl`asb-mv9_ z{tgu|qx0<25-KmIReyA}T$J3g#0P@f3 zaXf&;&I@XXmaf(|H-o7Y>5S;{`o39u-p(Te|&m?TC zyV_czFJPplbzK-Y8Y&PRmCb?*A07xzaMOWPm5{4y^G!&^356LRQ)#0OvW(`2(}fG- zz;Ezpo}IObGjeg6MR!KYCdKLg)Qb5BdeJC9ToGUtpFns(#q*wh&*a`D$#N?&)=^dA zcOO3N!l?PmBXwR{Xe-V`Jqb<}FY3|^r-U&iec7Osp@B7ecAjW#Vdeo2o1dTme&4x` z8uZ^VAjQ|E%|R(Fk@v=l1ANdJkt}hUadQ|(00^6ROz5$Kbgc-t3WJ|?imn(!19&m7 zSj7h0&-Jx6VrFQ;+-_s@X>LNoXS^SP5H=Ssq<8)`w8Jbg|5w|XPnb@Dm)PboOqtNF zKdkR<95YsQOBUeq(B@}JBF`Z=qbUBpPUngM2cF&bjW!6$fKR`~=9_kH}lwJDh&C{RVz-1G|5(!SxCp+O>Lr)T+I3%mfe9>JGFAY(_)2rq)$%$&B& z2f4V?YoC1Y?l#QdYxJ(8qZlo2eWcvYxvW~Ubah_1>G3h{W0TU&85~3z`1J90w((*97`;Ra2j73J?7+Y8b@(f@^PJhXV%cSveLM ztJ7xKrLPmZ4G^`ojFKGtc&n8wE6=~YF6(S z;9zOx<(?S3=<(nJjT{z#<)Nf(ks$QVKYNQ<#p#*gH5U_u)oky42wP6Na_kxiT$GuI zh;+|3cohWT6(3@3PPD>#OJc6*>FRozC0K-;jsb1_2A_$&M}h}9*Kp9$I6Fha3xPd$ zC=Q+&XLvU_=nHioQ2{&HKC|ss#*4d&Bb8fiLFRoPef|AZRKYnp2a7p=LzV~)R`he$ zKTxFB8t@9zL zG7y&mVHSV2dJ7c;qOaoOA}SR8O09|Q{ukn#n$(B>g7fQxEboQe7-ezose1WQldbEh zxFHbBeg2{a^7cV6p@1DBfy@C&X)Kj%z)MRb)V!Xev8KLK-U!(&0%s&oS42I2S>y(2 z=f)6~TWC6|_XMC0x2WRq4u z?JT{k3JbNf{SGc(sC3o@x(MuPb#r5>W)Bq~^)67hkmBD)w!3ljX7lme5*YA=Y|{JH z21Ok)U5ST^yN)I0(1C_<*HJ<7S8dnIIAktw4#x%r6~H3M29qdMT0iRX(eHU`QCWgI z!lP}6ITWs#%Ob=Mlw*(G8n#Wx^7Fu~lY)#z^!Ey|!ELI7rHe6xQ z*V}~@=bu3i#(jZWV%hrw=4A-Y5{BdnBN|)-xfw~#mk+yAX4pJMq!ltMkUOA2zJw~o zTQnEf3ej{E!3rahs9;v$Yh-w~SWt_Tnm=1Z_40GqV^;Pbb4T`|w1>R>CqTay!*8J6 z5zyur7Lp~M64`hj*Jqjop46s@>m($9c!dC|@RQx$-Ls#I0K$D&8bE9Top#|lGa$gv zue(NdhS zgtQS)G1@(=0~s9{+;cpK4aMgs(D>jBFM~KkaFnaGd00?aOz|BBrqJYmQAOVjIkX6H zlp30Rgi;L?1#znn@Y=QBS+xANPt}T!jRib^_0zN4W9LPnsg{!Z)Y9UJgM*6FsP{%b zt{8@Zz5+k_UOJC8R2bs_IW$y)S@LMogx?NH2{YeLsxUMcY$Vn%^;8k`(ux#oV zPFkX$bc+dG~vtaSo?hh0NLrJ zmS!J)#1nLb;cy7qxBH6yc@tB$)I63(B?5j%K&emd>+L0GsL&E(*`VEVVGc}_V=8&N z&eg)KBqA(s|GvYpN;2BmK?ob_$-bj{Li936<&tnlkc)a31{w%mY;o=(SIkV|tD~!n z70o7wZc&S`c!w;SL`FoY0_>qMxkIhwOK3=DXSo)IsS%x#GGV~4{?*?S>c8M*4nKZKGS0Q?Bc z0qWNG?~{=+5C)CxM~gcpyQ1967panMjO+r1$CWk#l_ zMZZ4hB9Ax`L_m+j{*&Dt)<~V`CWe=-aQU#)nZVN&WlRW+2|xry3i>7{{Edx%%;+ic zbcgBKqfzNvLcfi`Yq#$#j>L5TX5Zbk|7ZcqpMnWF;fvM^cB5eiXJ(aleM34M~9I4aP`<46?c42Zk<(IC(5r80mIxhjI!HBao0g>R%gK?<+ki;+n4d;*Gp%|Jy0Vw#cdwRy@^Le1p_VirBzyIEBLSdexllls0c*WN- z@B*4^j5T40gJET4nhZKaQreEx%jS-QQ6_i_Z;vVhJ!%jQ4+$xFRvItQbNZi4LBNge zpkYEgkW^SRkI)YL7D(0(LbR1bMGLDF4C6*!x~@Bf_=cO;kB`JBN(OngFGgDzJ)pwQ zr%9-U=_P|XDj7IQ&&a=Zihr8?RA4s8z zvOtxb55_{o35BXpV&G;_`Cd%(8|C`xQoDSY5%2p+zWagtsY$<|UAd7tITwN4ei<0} zlucyoAKL{Z%gEB7Jh{4JyPJVlkuO+9zjVHzc^?VyCFYhPbPDx6@g?O~u$O7=V zvB>F)@x-Zw9Surn!)cx%=(a0swIk7UxnH}+$q0LlroIBSj66j;#u3px*vu7*JNwex zDH^%1`D0CC5Z-fJ(s7-LxH?R}V>L+okA`B1r`F*gRzGRN0D2XF;?M^=BN<>aW*=nC zKJ1|c)_^MOAS0GDU-SNrLHCHb3W|yX|J%TwACDup1@cY|qxUqApN!UVSOPU84+ux{d3woFAHADc5S=jdhpnBBSx3ur1u8iNI*$iFO5MVh@8{vGb1uX%-T0bZZ6Me4&Bq| z24dZpG>L?6uca6S#A)Y_9mVBZM}j)f2?|}YX@Btp5La;ZCw&5y$9zfU%oIi48m=1X z8spzprn2{H3fP*ELvGFID#C<%3FT`47w=qCJh82oeypArn3YuemJ@p5pZ2+`)|k2eLv zNN%Xg4*eUlS4)8?*UQH6Qi+IH>cIgi;I`Y)>%D;&Y%L`?6%WF~J0&@E2@ae#FmOX_T%Q4k!Sql& zihSyF7-Z2g(HrIi0>SHPIi{l2LU6(HHw1}2UOVPH-;-UXw?Z&<+^o!LxW3?LA5Dhj-! z=U!G|zd-#iKCGIBPjt~Ychs`4z~0YXru{^v!AlFNron?7C~nBSZeQcJdp`9R>On=& z32!s)3NS5N3H(anamrBGK@wl$G6o27xn2!$02KOHUZ0$Th6ClG!H{qsvVZe~ttWcy zr6;y;-Lhm-hZszqNf}ka=~SW>Fm=4|Q6xg|*@{3DP*Dl1TP)rFjb4Phmoio zF;74pcYGKG%;q_a{1>cHo=wiz^;n)&)zkP-;A-mqwxC7b3jdx5++R2caBWo9f=5hJRM+jD z*8%en6v_6EaHe-JRuG!PAiPJ>qr|#UHi^5Ov0AVTjF*kSGbvÜ(#X&&m z5}NIh2KJ(0bF2RG;Inn+x^r8e?L^=Oiiknb6YnT6SQHx-rT?Aw4J|3AQ#!U5D=zU7 zXqLY5VBihaC2*ff)X}Js$JFiaCnQLtexH?Ll$#I+Bo3QljuhFh{p1vN7-l_Lk|@qm zua`|x7Y6oiJ@gv2!5PqcC_2qeOwh0L^73MzYP@XfJ5*n2wet%EWAR#&Fzv1`fx*@1 zxT(Y%kc97mV&9Sse5+)))bsOrQ}^CyYh>|9zk!hDeI^`BM% z1+A>^gMUYso#+*b_@0W&7BNvCvv<$UTA|FbM6Da$_X#}(@FQGrpqVvzb@(j?>Mm|B z)ofxY^!z~R9rTMxe(+ofwBZ2a4dxHaNg0`#)Kpbn{n&B%snNxLPu9hW?k|s&l|g?z zIW%N_`7$~$xJy+Uqy@EUS@>7KM18|1cjLYnArFGl383GTC+h%kq22WOJApNfL$^}D zhT_~|R_BhaS=!^r6VuZ`o(Iu=p?D_x1Rz)gk&`IXG1dWbjmGDNqSpw$pA4u;&!3~U z|Ad?ap*5I8f~|mdfK(Rp31I{(;U_nk`l*!o>9JQKzqWn`j5$bcfYJ1!rG78}?lS5in0$P{nnoO@K^o+phNK?3LnO23xkjNiCzpTB|tv1DS3gKGtrtgYf9BjpYp#W8t7Y(uK{UO<^& zL7ob#g%D_?<${GCW^2KUgR4R$7+H2Z|MEshe}7Vy%aeuwkRGt#BQR5^6$W?F@{y>U{$ZStlqKz&dX5U8rQ_DioN(MBh%19SzJ zhblR%n(5jyBF87zw_PzHJc#8D`ug1GPA0D^%foOLN77-K$A}ljq^M{_^_TYc`xR`v zr*8QI6~WuH4R@rb88$~u844uE)#`=1Rn^qo{4N2bgM1t{uD$d)S`KA1cETG0-OX&v z1Vit4^s1-^z%$Z2k*Dic*fdf`aAu&aL3Tl&MIQ##6UPTM5H{AUDK-$tlS5Gfm2E^w zb2y_v7y!MuzoJ8VF1uJ;b31tmpKLA|A0Pjh=BP=MxNKbG>$Avt2lX)}%aOaoS)?aB z6MCNsV+m;ZW!?|_oiRTGkB6Y@2hemyRmpGw68?5Bk+4cYg?aSYF_gd;&z(C5Y}Jz) zE*qXG+>tX5FOktevj8AA|M$NAY2zpTsg?BDzCXc!sgy0XIOpvphh5oFj|`K(D*_-m zU*%DRGl+VN@5>hM2R~7)fd9r_vRzUVr+5h4UtC(?e$9VH!8>btYtevmDL{7%S5T?T z_tEqL(;|{g8zlYjQx#J$UA*(?5nJEk(0NV z7e8`@@R!8t%~lXSr%tRBArS+27;df{jk|74lkfQp!3iF@#4oD9ZVb5LD}g?>bGv-6 z-7&2Ygnk?(TfFi3}XDM;!iOW zR`r;qr07>IBVFC!75x<1-v@}xhBNNN7onmza z5O}llf1W;_0R)U}G|``ymkL#GYFufEbBGfr=g`*Ks83)zGrb zes=aG z?=YNYCc95Cw0p_&rA%6PwIx6OAZT}#L3p8u4vZk$;=m2iWa8(z+`a2`<%)5k$#+cD z^iV7>PML$Q!zr-Om)gL?M@))2uQ2AfxtiL&R)#l1XI=|OHG;k9R^^jC1g5e=jUkLf zaS*oZKt}XuQ-A|tPv+JBvT(_`35;d9UB8aaD}{wdQD$A`5by!LDlRFBxg0=1^mKF-RHO9A&qnwwBlvvxpBN0BMTY_q>|WV&7rt3P-bF#z2reTmR>;Lq z)Pnw$QZ}epzex}*n`f}VwuO?q0c=BVE>V6|Yya`s4gI8^z!v5F`-Hv$UhO#C=>J=snf3%A!sFfzGiQ{; zG8MTJ8FR-(JAPNx#zC_BpWLOu-c3=y77MH33F@VT5wVTgotLPQ(UakrAN3M$1xW_+ z1%X2L-T47x_Rrj0)YJL9tW*2qbdaN0>EfU zO~?}dS-|u@GhM*=s<-#cni@rsyqiEbk?E%y_fPG0$B{>UWSD$O)Zd$$^Dc)es!_a= zXm=7SCps@10#F5AV%?htfS!YcLm@H*jREE>7Z*`~wD-v)1!vmj;ec*}zxZ6_y>DMQ zQZOz||A!A(k&^2lksWs2n-yCQ+9yLy|FJRK<%Tcz;*keFt?Jow3 z0sSDGc*mT5-D9k@F(cV?ZIokQSoi&RsKlrhvx|zH935N6UNVg1Mg#E;b|zYX;F8cY zbb-dO&s+qn1ks|fGvXt`j8<*?=K}N5qot@U`uh8ynwADGe}(`6NJLc=5F3(hGi~2Z zNUO2%54Y3D;{k*apl@Meh%q!ERV(Xkngq~jz2pfL_{NQ8jHWHKjS!Ik@hz~3GE=yZ zc<5r=nTiqy?NgA`I%qT2#yL)?XM9(QB~?^t42S*hiP3L;$W@%k9m4^5K2IX z3AIFQmxPE&IFAzCMprH&SDt4LrK`toq08F!)2I3yu z%b!L8g%`yeLDuu}<4k+{oz&E?xQjtspoAb1oD2G~?Bpdh-E2ZGpgljti)W&=nalu= zg1UDD;3%Lz!d%!vO?Ss)c=Fq@r1# z1P~|WBfQkdg-h>XiZK7BHA zB=1{(iQh@^alpHSDE_Z}u6=OH6{(&0%V&0A@n-~t$*{5m6Yjv?i|2=RPf-qz|IlOb z8jTO#m=7c!%ec)~V1EuKJ1BMZ!+gVoLa%r6;shMCU+z$Pc6JY3$O*lTQ{NwWMp(@d ziXT*Nn&Gt>Mwr{m&));3!b=k1-?c0v6cM*^Iu6nw=OB^}E z&G;{hNP3eG-Zxd=OLDaXA_#|z7bU?L0F;CaacV{V5Bw9v8;_feUcey(a1{0VQM@i- zXrmK^#oGw!=|J>c;Oh?wU5#_-*mxcNUK`e0-I@}-84{-M0W^^tkkzRVQ9GU9X!)w7_;I{}7(5=_cT)cX98VLemb)I631Qx$lw z1Je<-8NBS)`u5TZ%e*F{k&^PSal;ssggL$lABIQ@D!DSVqG)Ji``D(DO*<~$zKnIe zpFb0y7CmeI*ugq6BJNXC?`LKPRq?E!72D%tWGm>DTy{~{Qbq7&<`mjL6s+H8jG%Sw z7#?#E#67ily5=6iQaR$Sw}V=Xq7;vu!cGbCt;1Yp( z(gmLiDP%rO>>WYBIn?Gg+QN{sMR`bnoT3hpF?CG}8WuM87Ko)&;5M}sU|XC?N9ebtc02U0F5Vz862yQ3>TbCwp7@JZ=c=c>E_lCo7p8>dmo>5 z^diS0u4J|*bXCYPK`y5QFQ61v@phO*C2iT2Zn+6OM*b{OC&w(*$ zhw%@?CcY-_s*wk(v1M@j;9Yp`qIp4^bR4SlAxdNzAb(>k{F_`rui|1Y49(5^+uEMi z@}7Y#>o5Ed@$ehOKa)y8F3>fSnoq6Y{1yX=69N9?PYiu(Y-+Mc+94g#pJvN~P$G?Q z18j|$mxHJPNK~X_*nILyZbNyt0OewzO?Ju4TMHpJl8gBDu@|gq-4-P$p?*S%>>#vE zc(LPs%^5i(QKO?`V*t(40KS*dK*Yy4i9!#&vbJ(m{2eF#9*246KnfP1K8|MBpRMI1 zQuv}k8@hfU47(r$XLR9yez>0SNJ}S3u`Qw(uYY>SkS-fG67|_z@Po8lKb>H;>C053 z8uBQ{_(NX+32+t^N3Q4dkYMobQUC;tOB31+JSbr`8H>ORgsuAJUg7B<)p!$_1xion za#5iOynu+Lh_JCRz%e~ot+m#Q{RY?M*raoIgYGpCK7m>1i$n{wx|E-tEdit!ykXz{ z2%I+suSM-?hB;z17zRw!GSFn$0JsJCow+X?wLjpGgD(2QPK<>W?k$$b0bHOp>-yoZ zaO1bquPwDmShSZ4u-Ech`B@=DGqZx|!P-4>NmEcdi!0qgfJa|PZGNiWg#tx`KF@CZ zhbb6{31-(s=FeWxlY%~_oR04hK-4xj(k4812z9)L^a4uQVHVD;eM_F81`hIzf`_~e zl?tHa`kg0XcciEHpgZe=01V+cDb=B671?_CclBe{>bqnGbsaL_OI?@o$?UgXv+wc& z$QQ(=0mc!9*KY^GU|E_V12&M6sHY6S(*%L(LdQ}AKzcf57COmrmZO0t^jKF2M*Vv* zKpFcO;Z!A!b?m%p%k94mM3>ZXPo^{koreQzK!y(n`9_a>iQ|(^61M;&YID?q0CVsV|Y$S14z&YC(_oV>fFFpcl(;PzbFSh(%|d*t1oo*wWh(y4~cNYey| z5Fp}E_ZTWqhusGN$~9kNVFk3WqtgZ)luiqLl=6TtnpCs41z0&WU>(+_h9uldlq8k& z(Z+-_n-qT<>v=ajlnC^T9hq=sZRTDSw>0G0b8cQ=ZE7-5~LGGq=+e_xzOiSZD% zzSn5HXDxD$>?J5i{2Y`Ceh5~0<{qw6XHxSVg zwixN*r?Udu1!=_7gW{oMxOa~{^$^kaRsZI7DJR^eE zF}TF+UgRl+WV4N>`sGWhp&?*9z_;r&5GH}X31r`bH5h{``P=$C+4jReEP)TIWZ%Ad zlV1BXEsGMNCG)iHNZz)o*rub3-e6W8n=9oz5?wE^k5mz^2Ae{4w;z9|v_Nyow7zMWAGyCk`n@+@|noz=#Z zTJgS&Bnj@#KAWU?Z@ZKAUxX7uISD0(dm!p)u}6{sP)+EWnUOau6gLnXhxF%Bapq+I zNw<4+zVzb0&BXkTY0bR~`-&_$>qTe|SS2Y^Q8xXr0k+g)f6)QMrc_&3ETrg&eBv-<32 z?*h3*92yu|STrcIVXdAVKTuOq5zjb>WWI0dr#lhIp-M}Op^anus|P!)xk+;@hLRN7 z^}Ztk$;-}K+Y>2lpp`N9EXHEYN^}8X4*7pZSx8e3JxXUoL*Up=OtHWmU0qnlYf*T$ z2M9E7O@arAnw;k7=!Vu-t@pvvF+nzOzQAblv}1?DRREDW;iZf7^ADe@nbV*S9HX;} z{fY4bkv)W<4p#bnJrlA(na^nLz2NNJ=0^F#1Stt-VEI|MZf5}JeC<{d1?hGX&nj9h z(oT!v+JugQ?L1>&yvS9s zG(V)}1FC(Cwu|gh@4sqg#o6`8rO*Ek3Ys~^p#9xXER!U6NFF>GSg{UpWilK{rCs^) zpzvyf2WhmxOc=G!B`d4f4@OF}vhLm}LUl#lNL29vF z8SVP0;*9RV(W_2Qr-dN{-6i6hb_&G^_lI;_sq?Su?Wx+)%GrGxAY=gZJ@FTq(SRan zA$ld6+#-+`_tDCU*M8QI0s|WWU)#q$!K%MvN>alCwX#bBKp_UzN-n|1`1maBb` zjL*JU)Qm?8s%R7Gee$o0F}|XIf454v5tJ zMAW@$ti%9cn^wO|eS+<5TXv7`7qcRBGQCm;qp<#I<*rnHGQ{sqSkneT(kLG0m-!Kdn1YXH#~x?GrX#|9K#&%ujy~QXZ3$$;o${5rQX@3g5MpZx#e0h8Ma$mynP^&7>|g z`tZc}d-WZsrNNPy9&G~S661A(UN;F*1*T~6$jMol z&R>cCr&kw)EXY(b?(Ds&)jIW00emy=T5^gjy{t*4EA_D#WFtymlO{1-3OdJC|&lc_toAflr!-aETCE+{rWjEp>$-s5HNCFjJvmQmEP})C9@1WH9xzjt)B+g3aL%~;F;Ed3ako==oT17<-0Fk_trqf z;`m?o9lKzBaw2K?jCZxBwl=S-M=+0akTVAaintQi&bdB~b}t?hG%TZ5&cciaH0oVH zb}z54&L{Y4ww@rs9)kb>q*W&t_Ue_w)OdC_eN*ay*U^NdQQtGpX@w){ zx*$na7Cpdvn8i`MJff)+!|xKiU}>hM723Q1oAlk>m+1OhkNtpo-b0h?h(g3fY}-X! zTk36hQ7OcHiUd!5sH+wNt!7k|d_8$vF%`3R7?*UP+2HOWsS^NUSUCt?T1#IKF4NnN zeMQ^|`v6&G=y$k7{<=uIt&uis6wLnEUow za8g677+x)p$>?Rrk@0bu-k;tWW5`@cOjh(e=comz_F`w4N5@E}MQxi3ya~Naz6fcI zvQCWcrkRv??!#SJDdo`I4%Zsqu49_T#Mw!yWwRVB5Q7i6G-IKwi%a@Kde_y2Z$?GwEgyN)@)SGmqtSSx2cucbo#&*0C z2HE9Gu@_iJR(J&3+=uRGJkXmhACJPxckop1v)%8qEwTt8#F~%*ZE%5ApUHkRW}+aQ z>`o>cJou#ByoMxa|UU62SzRrpdl}zEKE@Fk=Z=!9E=L9 zYv?nn`)~_DET+DC9#ma>SoQE?NQ2vuliubk!n?;ZqKpK_X^Kxd;_DdTj!~1$k5Kn7 zwsT2-b0}5E;0Ut*5|EC(BH4ea08rL8pEKGsmF_YB! zxg(XIm2|>d>Df;RD?4HyVogfqEsXKDPMtA7;Pg(WP7Eqc3s^F1ew;|RbSK(rvMtJF zqj^S;8H?0XyiWC_Ne*&bfCAd#1bv^NHQUN7>Gquy%`$hNp&?;o*%kyhcZWK%%2KJ$ z9~Q2{les(B$oGfNnl`9r+Z!-D*zPIE%D_(jov>AIy?#zSf-P4NH7--%s++w%e`DUWT3w5=lZ^ml6T<`C!Bj`XLPs;&WDl+mIPLqJo5UG+v7 zfqid3<+#|yYJJ=V=PSrr2bC=bDfQ)NpaCL1j#!nC=$(t3nK`pps8f}*qv_-CJcC?H zr_Q8;OVpt0I*oI_C0GVZT4kiA`M2$-9?po<1&{+tq8lvcyGvI4)JkJ*Sp}Psk0sC2kuK@NYte~ox z8(kh%y?n~(xx3$%5l-`1R{xpM{QO@)^MG3Ksruyw)t3d&U;I^~d9bH;%HwRj@g1>! z$YbT4o;`a#n%6b>S8V2sA=^G!uzLkD1m;69hbmU}6KoTbC107CRBUaO&Hd-Jvlc$O z8J(;4wx@%646;IaN}p)oRt-ju#cWV&#h=6w6g^((Qt_OvnUdwbJb(a_C{~F|VTyE3 z9ghaJdyvYUiVt%jX5)T-D&}#?a6p?M#9s#htw@MNHaf&2(-UPqoD55Uf$wLqw> z=e|U@uyYdQcf{D?Jwrn1Vbdvd9X*Tf>DxkF6C!znY41baTwEU5)R!|C$;tvc2j0B) z^%Dc{Wx138l+D3mO!L;Q7li3^%-;=g>jAMI8q*ZyNI&T3NpH4{AIG3hg0VhtlufMa zD4^u1U*`@@P^q(ex1+u>ExqG?Sl__FK_?b0RkNoy=m-!Ww3nucX{l%x)80eTw_X&e zaO(j8!i*c#26#I{77ZDi7=QkSm+i9E6c&st6+!B}+>&9$ds&r1hYhi$p`#7{26+CJ zW__ZXi};QOd86?$QP2xpn3kdJn;TV5lV5U};Gs>x+-u?km4C`U*r}@rDRJt4Sx<<~ zBFHwmRdI|tfLjQ9xC3Y@gxh|V&hdCsr0xKQjOyzHm`!;0?7rVYZ4fNkAGwYlgA!1E ze5W0x;8RoV)YM9{eTX#(&jL@Ps;a!uT;g9hfP-VR+1Xd)0^ElV-K(&it$Gp@Ls*s5 z%k64Q1U~<{uaA~P2Qm)+ukw(%GNZ;C4434FiXsy%=cE8Rcxe6em&~+mUi)uZlU+yf zvkz7R!?4Vj4k;ROzMlM=o|#c35RM*dv;vU+wG@wE!{kl^%kN0hR`R{PqbGAG%7EwBO<@9eDeC>c9|FgAE?(F397(Rq6Sp+A4B z%V}w7>~^`9nvyaIwA8L}ZnNl4S()Uj_<1w4MBGh3I{~w+`>sO23E?u%DqeZ;Q%8bw z6xHm&;fr{4%8|2?dZtB%wc#;6>DXaR9nGB%MiL{HmS(Cn8f5`HsVBQ&XlMxbzIb>8 zcyfKm0I~vUp;?M?2h1F~W?D2eE$^3H{QUP!v!~inq-6gva?;%BYDRTD=)_nm>P~Aa zJUhO{b4Edu&v-;cioE^rGbY8k|FFCH^^5$&3(Ow-kBO_)TCr8;8;Spk!N8-*bhd@m zRRe^L9uXxI3k#SS2<)z;2e48=$4P>u;L^m4ko)cm35E8N7Zc_Zea}lxJBJ+8bb*IeOp3K83+xuTqYpYbdd1!9}!$`F8C z`#*z5keAmM^1T6$rQg2^;0)Z0kX#2kem?noghUoo^XOO*^&kZi{^}VnS)W=qDE8WO zJ92q;M`!1LaqI1X+%U=pgdEIPyb^)IOETS#rFoT?XAk8_}c4K9*Vm472}?q(;k>} z9ZfmwxW2QmwUYZwMaXt0p}kJ@rQ8CU(2IeyR?{9TD3h=P49B;WoM3ay6F8ss!rzT+ zYfY{?d#zrz{VG#rHc~XO-?FWeXUT|TYNHq6h>Gi#_P~^OYq?`Fodt)XvM?(H8xeud#kWF(bS6Hf;YBj1S}BFcb0@!Q-83A3KH z)t&*D0z`}Zq?0W3c0TOiu^p7f!Q}byWCs=Z3WBW%?pZsEe4uYf0^n}Uct&PKzV$9y z%P9-jM;GET5(V&KQAo%s;d%tc^0>tjvz(qgBbWC>M-qvO8}g9J3Qxko z*^S$)Y&~f>>e$68KPKqM!MG>DQPz3I&P(dUQ4LfWy*LE!jX`z^{w-!>PEnl9^s{z8cm#FP}W^)B=g1kVtIv?n+!j8qIX>;B=< zDo}ES&45#1^e4mEe6B2YLeoHyLV-&zAK%p1j{suDH$Oya^0Xa43oqw6CS34)qMOX; zmmsEp?6=v!sMhUxK^`wa33y9ano-2-OWng(ffj0rpBzN}I9-vGB6z z!-ojJO>GFhiZD26RIea!8gTC(mbXROu=&TAl`TRJ0fUC1(oP|I=qZ?(;I=A>No0(! zfQ5~^RCi~%02VQZ{UkFoqva1js>lpoK$+%b3vfm}=X#ZmQ6+Y@Je~+K|Wq;XKU6s7`JM<&2e#Tcx&xha@fTbN-l4wiu z{!^-9(aPhLAR4$K2!N?bor9(E3PVpg<&%TmD|>};9(HYa^x7WHv2_J&vmuEcIQ@W$ zOJ#azOhE73!ln_izylk4{r5R{Yq^~nwxosfpZNn+CFe*=GrN}k7?nXVgMy46i z7N&U*48ABxiEnZ6@F*K`p99%Z|CkUF4Q!L@X5kzm&V$pKmEcVw@eum7omt_!dJd(RfSXy||irhoC!?WGMC_kcTl*2V?9k$&W zhAuKONQvW}*?WtBf+iaBgGisc%dX=hhvxN(-tg*KC_SQbq@1=WV+cFt=nu?AjD|Ke zhe!^Zg`h705{JVyIyEJ-R7tENUz)Cl15L`EBhpV^%!np4`_o&zA#2G>PZ!7DA8VRb zX_zx%xWQ-d!7or z)3b)>P~Hxt#+U=Rh8MDiuyt+=bR>tSe~pg5?Xb;S*e_J^NkZ-8OYZgV*M@^W6(t`Y z!@zFuiqMc(*ny50DGY0-_F8fUPS;5P7%(^_=k{F7DGAxIWz*`ZjlA7EYA9i2rg>tu zq<#9HT*q_+p8ZqD<{n}s156+QYdj_W94c_Ou)6()aEh{zbYCe(W#UKd8ZB%hf+vJy z&ufGRN$%C9jkBhjqAEp`gM$DEJu8!@pd zagnYW0~PmgXWoJzBYd zdxt;yb~CN$VT-t*Qkcg*Z@APgbJQF1X{+pxZQV;nb+(Po6V3mI-vBHp2=xNwI^g;l zHe&5z0#uAw)yG*gr{K4tE%f)c+Vv9>w_(Vm`D17(14a+$#D^g3f|ih9Q9V`ib-1LB zM%dyv46{x2mp=`QDI(iEa6#oo5lmPDDcLo{Vp6ai3ibg}OE=+y1Da>?DjHERGci?L z)Ao=q6rsqCT8+ne815$xXbZ4BhyUI9h3!J+bJaWRTjSGfD1tivwnO!hqb}+d!MNsG ze(|JHCboZ}A7!JL!|2+m2XBm@-pAfv$)iVk&RDy7dY-*%o8f)t3ScHME!J&juTx=#La|+g+Uz#Td4|L zvN|z9WdmwC65U`S1u4v1Li|coH(k$PAu#6^?*jGB4H$MUXvw2b}b%S$+%_YE?hH+KCy?bY7Eb{N;drO?$V0P=1ZWw*pl2UTW7vCZdoUZwy!F z{sTXSy4qT)-b)WM($fhj01YEnCLaQ-1v-kGn;1VlBJ$1!CWHWPk$f2{q9Ve= z%Q{cU@)8M1{0OLAOq(5$^$4@1$3nClzc(+;yc#YM+{D1?)$J!(xViUVRev;^GIGi- z>Bm+#L$e51+lzgTvDq;{TI5~snMvyo#BM9E)OSng4G9w);2fw?oNoL`t~l++{-Kh5 z;$@0okMx+r*xZkSOBOQ|w`#uLn5`*^d4atn5~CL48H3pXmr&S>qz=Y{f&*9eZoU=b z&sogO-qLGVkdZO-2*i?6dtYs%v(I9%Qo~~fGc&?_Zwb6y{A5me_=m~>`G?8a3nbE< z&2YrUpdhi$Wme~x=@tr_7otvETW3Jvc&dZROR?rhmG@yru^sPhb(+wY^-Fx2)jC|w z%gRY;E+vjumh$acF+bYY(~@TPgxd0R;mQHjR4T&(Q{pZLy#NHmRWt46KkS(*znq|v z6scdnJAm4X`1V_rKbMF%84t>7*akl-UUA_J(Dc~PZkMZBEa^E^zdOM7H0%q|ff6Yn z^1S(9t;s?BVQ>-h0L2cYdLs`7J0ydW_rBl1eQSsObY33w1#s~AY$XPnM*o@t29Gem zQ!4mF^?x~51`|0T1@bgg~L%U)AK55x&rn($)miR#HGQF+PcD#CR%W{M>J-Y4Afu%-5a+LJ<5a0W~A4ij0d| zNz2g2^pNj5FUCxPoJLGBfR==t57>Bs8Xk}#;h|t>l45`4VF;;#mf(%*e^NbmN7sj4 zjkAsWEx(ml#@&R3(7%HQ`#55@8OMAe29|%Pu`FA z7mi_Q_7-cg@Xc;q6d^&qtIn9O^PMOvw>@j;8^pwLgDIQc_XL-c{rgBW!*=zF`NzGK z#zGJ8j51|BQSJD6RVX7Uv^rAg?~>Wk;^sl8GIBlt_Qd7)7!GrjS0U_BM5bTDQts8w z-tBZ9ANjNhDlnT=#3i8n*{=0aA=HAykN^gN3x{~sK(Eb<(zTcFs8kRxm{pZj1 zqEzsmg>P-xR94KkZQXioA4N&dzKj|NC@3Cqs|fe!!m0>^Sm=}#S4JM9wZ+nT=tOGp zHd|6Lf{<)?kB-K&+U>~r6(OXHj3>2tu(Fbp#**i?%1R%dw%yAH3~C9;cgDA?s35v0 zP5*An%DcXXa#N!VaBwynCTOBm#V9%bC|IqLT1gG!h zyua`G{L4p@*bMYpMs!i(NnYL^iF^T-U-5G#h{Y|UiZHxYRSmT3`NeR~Kj!G3PsYm1 z|Jco{cj&yrYbjX|%h1y`+va=IP52+gte;%(hb|K~wa^&ZSXRxkbZBHeKQ6{`+F)^M zDbDh$DY>bu>l~~$?9PU>%k~a^u)pXNiU6l_vrn-{5#PX6H}jJ*DhHdh|C+`G_meg)qzL<&|Ki>*^LMu(tJi#ahGw>yOd1H7!;6yLg{W+7d}oTuQq>rC^o>>wm!& zygSP-e~ScWE{eB#=Nb6fJ~^o7joRUqk50+9L-PUXn0gD0T3_xJK6sGOMS;4+p5_-< ze!=>%{gE&`)xs%;|EIk-ap!Vv-@a?D25C}hPG~f1K#2yGN|VrlLIY7KN#>zdY0xBd z5=8^0fecBp(oAJ3DWxPy10fpB@8|5k@89$O0q?fG@AJI(cU#-GGJU_-bzbLr4EwPk z`*DY+>z5~Ib**UlYIch8(`Tw5jYq17b<$`r9y4|Ce(%G^RqYqLGl)?df?nPxoi)$qCY}TViL*kcJ}Onqm{TZ1%`66h5{lzY?6Iu+U)XXO@IOAr@*w zx?N0dSRDN*atZw6;yo#l8^p}a0ke;|Rlgh^8E3X+-;P=4^^PCnHl%)Aq3|CrKyIvk z9%%(V6DPJ=H}Sw(V(YBy;Pz=3mfQDavM8t1;>R2*W}rLYH61_$kksiuCRXbeyYBt` zkC?s*k`)=dbHKxp+-Wmxr&#haxbd?`KKepNFM53?s#UzT> zb%L-k3(eJkZ%63weDS_S=nE#&a;q?F@YEfq9h^pV$WbOo89ZrIR8^PUn!?yChjz?W z=z!FsYah^}p>l$f$qs@AsM5UZ;CY!n*{~q zM~#~8dY}cvH&nw;E?0fXuwf3BXKv1nH3}A+z_lvk%*7Zs|FP%N4-5!nL7PIVw;`4` z7i3AlQGZ!h`hLr`s=qESl%A;`>pR%b&#!p6@}e8Hz=2$bakfv}=plI-Y*>N?t1m4* z7)o0ER*Co|3a>P*jBM{wG_xk}zlTieR#mR_p$LCEnIAD&L34TNz( zkJ^VxGk>O`XIfKUKC(H^lv(JVJLaHyBD!TS20fCt#yCFw^yWrp(V@qPqw$dsE(&v2 z$vS$<^5lMfaSH_zD7kp{`e3h0Qt>fziY+V*v2VrS96nm#XbARd}S`Y z{+v0eAI*6B#`^qKgP=l=x2~q<1!`W&hn3;zx76P1t^ZS|GY{!Xl`~>YUJDN}e_2`em6?;|?A zT$GfMxSV`mZ%tS}CU9Cy?JR1Ki*%wU+Aik(QxEB8dDO3WcfVSt)IH14WN6A5&x3~! z4LGPZF*}A1p+&CK%*f1vMNfa*3#lH+NvgAizV-^$kxe=uo_08?Z~!qzwc@;xCf^SK z>X^J>l|3!*8z;*wYIX5!EyJLFIr&QtV%q4N&z&O+FUpx#Zk6Ec0+{wHBEDXGKTuw& z_r`I9z;__1m#GVWY$EWeis~UXKWNmsd8C>Qgj6Vg^B(Gczy}4p?+u?!j#YJ4 zS15dH$%Gz^@6s+;2(cT3H$ApT4aq?*5vPvcJpjms53-^+^{DpTvh+0E0RF@Na{zsy<}5ehw{LHsSV>Nn0RfdTXq^HH2+-VO7RAHeIqxHq>L9?}?!_s;l7*6Lo#a zW60wz6{A>Y``q}JtNcN+P-rlrwPBRB@CXL-JN-1?jReKvqi1}qu0{#Go}Rc{-sLPP zs*H0@93~K#^}ef1YkG9G79le2c?jxFv`U374?oGix?sS;cj28J!ZSf;A zHizK3pUswsJE{57_^1BrEq5p`#3$xEF`&MWN7&RC=QFg-=bXFQyB561MdzK3OGYP6O~-z=Ys(_=oM$y=uJ8uX3~V)$gI8DCt4I2swv$}gQr7}EAG->_)BlED)QE!g7Mn5soF zef7OZXJl_cW|YVDC>_moBU!nSQ4bisM1?*O#E+snM!P4 z$eGH!?22P<$M!mZJ8y7V#o&pE|0U}uZFq8f$4T9z44jK6h~@|dS!A+uDhJVP4xH*W z+5m7hy-DFXTEWpyovrk9kJKE5q>_SG5F)*4)p?ojOP;v&6GN>cG}@of()g( zU*Yj*Gc+{$JmEoHLdthcufG2LlrBRqtf1=%us>4WaQ=Mrt4=4Y=B48`&6d|cSQWi! zd6*vpiu)`d3a+o)*Hxh#j-WAh9ig&gT95jY9R?rF!lbEMWvxm(Hj?V;68U9+Zh53Y52Vl01}0N*_aW!Eu_W!A;;)+=o(TE+QX=HFEQLph5Ao z12V`YMUP*_UF}3>I8)3Dwn!xjAeKB|Dw0n92eI9?jIvreQ?pvH@6sJQb3h-9l_D>s zK=i%2k=)Vd>|!eE2~|BG=J;-lW=^{h;xArCNBT9N=CmdY0t2`{`-%d-T4m_FTq!dD zZWdCeUGp@g&B(;_1yzfL-Z~5`wyFr@*FqiV%%2}n6dpnn{$Ng5a2dOsm!DH=+$eeX z_MJOII?{C+$4(XIt%<~{4FUQOoSmG+z<4{+Y@{(Y=qPdETy5PzeRBSf&7!l>X5EC8 zG;E1p;cj56h;%)dJ+IRoj}=|(3xbuLmwM*T@-dP(R%Lk?@1Fa>;B(C#M)nqjv|Bw@ zJo`<*96vkI!kXA~laKiy{tIqWI=B)QEUDgy3d$3gRRzaqW^_tcC^d-AHSS=#yMz2{ zb=A6C6qXfi5f2V3l$Kdk*%`QhX| z)%zRdhU}oXFEL@W%tkRIJa$>B7=>QybGBu%y~YrR4o{?tt)ua%FMRqy3$-cJHE%R2 zHCT$0Pix9`Vy*z=&nt-D3j2*UFlKoZ%!&P^QN+b3&A?EXzkN?OQTdES@6ld7uQU>;Xh?wQ|`0cwg z;^X7hvwqF2xcftHeuwklRxF2DR$$jkLa;ws^(Zqx%iyig?wCP2#B7Oo;d~aLl}@^4 zcO{T~nEvbSpGF2jRCozkm%4`1*{aa|5#wFh;zXI<#%o3Wp-FGtXQgc9eaMuIuk?#6 zm<%i6LcjTvU5rZCBAc9h;17P%SHHAAk)Uz^ln97Ramkfmh)rVmxv`h~EpwjG=TXvr zhPrIE>prN*ZpPuwbzNp|{u0#hS#Ptwd-q0Y+J{x0J8?oTPxAK5!*)5v$d|_Yo~XoK zq1m-Ib52D(<5%OOo{F}=fcP-_qK; z?93t%h?5FSqs+*F72MKKMX1leL5x_SQAZ_CMKO-jmfGjj=!?XisRu;uo}AbJ>ty24 zWRoxm^(yDfd%aieBw-XtQ^=lIH|bI<9Cm}I^W>Vbm^v-Lr)nl=4xF)G3#d78+Y;h@ zZ)|Y!8yV)?QYO*Aks|9|t9Maaks*Rda&3ng1ku}b^3%bB*=w4z9Xe{6#u1H4dTbW? zz?OHj3mmo+gv$E07}>v;$vns4h^7)9!nli!-)%bHwM&6zs2=^1cHhpq=26io{k1)A}Wc4OYLsjbgm@p5**Xr!3ZFnOmDr8ZUs7qpBK!2 zvCqyLEzXtCW}lTFb9jCbqy7{$r(QQOFc7V;3g^rLBa|0-nmXXhq0c@{i(kh0Oo8e# z^`)STH87o7zR$?FfAIzfw;mx5=u3qE|uN3;8*kU>< zYO+fP$&1;g4(l3`$xJ^nZsSGeRabxO`>mkPOb7dLJflZ%T!e^9w<*&Qrr%f|yXP~$ z(iw%=9O+GZRB+ENV7#+83?2o~P*XBbiO*Gf4ZF*{)L_~2S~2GFOw~uyzR=cN(ECoo^2ew@`q4Wa32++z z@`}#a*VYQbv!=V&TBrt~Dy@}u{)E6tgMsMWt*N-M=reHB#7n5I*nWq zsx*3tC2<3lL6sMkaF3{`L^^H~nif4tFABZhzJGseL#^8Yw(oE)2h+6rMk2;yq$}zB zxPK8@$WWi2y?gYKo*L`@qu5qyoromR%?xY}+gOyC;M6aDJAh49#XAmf^3e!o17qAk$ka*xwL(qCS=b13}Rr&~yCPC#Ux}9Z*iI`26`? z*6y&PYk!Q9?3hD9-T=aIR7VeM8Z*^v{Y|6Q@BXC^?cb9c#54NAFJ(1t1lt57${>rt z;)#yuI|Ho>FRXOKlpdY*_`vC!su~z``?H^V(&|>4zS+u1CXuk2{zTy2H$gsY)n2^uZFV#o&B(o@^rMSzWbve@{R25w~_VJ2j zyQM+U9Ey#c2O|~8P9Eg)D6!m6>z(&z_VKsESdLpWbJePn{o_s+*oDa0m6A#txi1Sk z#ZE)u!BTo1q(U9aWVjLOfDVg}P8dC~bmC#4I~+76$h_U!7%K#11%`mQYr$~#+Bsd- zI6&XnWi{99A4ApB-zii>zJEBjS*fu3!AN#UR?D{q1uw~@VXO;QjceAW0=w%}J}?kl z-C`ZTA`Crn+p@E#PBl~&*JE7*tM?{o>S0o9uYXcY~9+mmQhKu_Hmsh`ztj(npC>CXcNP8IC10z z{Vn>D@z%5JvM3_PPDQC>uk*F{Bm7mIM3o9+v;MwZ?h^w}ON=N^R80R%0T%j6r;+y` z?r^@YRR6&yAvH?1ckjbge9T>+vGHi9oIrPO!N?_Z=G+B$nR{@^Xr+qp1#@LLs9HzB z0eSVt^NRqm9#{^7KaSw-kiLCKL^h}!JV7=_b&%V6xv5hvsM>B#(ZD7wWU%!svYX#6Ck7V@5TM#2eQ@7I<(1R%2 z(HfoojVA|4DOih8br{&KeAXS&K=)SQ4ck&*vE!G=9yjnXUP})VqF> zf5vtURiH)m^JM7`VM%rVLuaffe&@Js+?`}P&iWF8Ev*cV1a>yhArABUL102uMM;?i zf}ID*x%cp4q;*4b>ODCg*$hp7HD*x3DWYp&{YS17nc89`8!!O`hj)80ZDDDqTYkug zB#;dteyC8o$b5kQIV-O+AGh@4s>bt|vW!1|^aepDOi5nUSzaDRcV4)!?`Q#0MmBj6 z0N@$nwWRS}!Rc6stxis&@_P6%L>Ond;|e8Ts;gT;{}dPgq~aSnW!pK09qxo5Y$=9f ziAffi0)U_{J8!y_pp}E(%|6fm1SBXbpC5PPO_%m6 zn2y2f-m4ews3`~*ZQS@7`T>j+N(JWr!>16~N#{ll%#_gboFB7|s~HU`fFCX=1*MXb!3SC*5gV#$5p=@cUJ^ z2a6tD^%5~MOe3|AIO1t+VZ)CfP?oh?=dl$M6z{G0%Ua3vnr;5@;#52Y))fpek=w?O=j7~c95MWq0XrF=$jl$p;#3s&h+}$7 zNWgHfAtR!>!2r~YNRHLuC(37|IQgG#V|>D%pXoh6XsJl5PA}LWeH^`40-YAT>5U&R z?ME*NgQMk*%F@i4IjlOUUN-C~%{`{blF-FU1Q!_{{k6P&-KztBS|=wQ5dDQ0yhJsY zCzTd=L`9+D6&?;OJ8@Npv8&KoqKCc`x5XLx8~OiRx5_Ez6C3fO5MX@&HbK1G_dl)m zanu8c4J)D0#lNx}o-810>7)dlP+JUO$2_7}xm~Pw zl-R2?f5`3M=j<%DI1!}Q^i{nu3xCBszwZvHpS(ICIx-@bkSB6S98J0d4sPH|eM2^4~f&*I_4*P%1n- zhx*ktgkgk!#_kKr3o&uj60ajKRPhL;RQkg?CA;F}ihHttx^ylTbP)+@*&f-HudYNp zvBiHK6^-IRt&+VTvCPZf>_i8dbLOI1cN&zMcwj~RpDEneqGh*rb#+mgI^t*%#kNq| z^M=HHEs4 zat&SFPzH<8ax}*VNnevA_nYLuVMj86gW8a%8&{C=)S<1O{BZg-q1U?ZUdq>vxgm?pq&HyT$LG`^Vpn4H=q0R5I!Aj&mU8 zRKFz6S{bu+qPBxWY@q7Md?4>%NJjKOr*3u4#o){81XvlWp)pk`_z6JhkJqy)6@+s&@BBD9X}2^TwA7{`vs zi%XuJ&}&+7o za5We%sy;yXO1easFixjsi_H|6wp9ByjogDN>qlDs|j?JHWnrW{f!@f$sc>#-zGfrA&yB52SAz6Q` zqfglQK|MC!9cLa~RNAB$`Oodu;}8RNMk6K6M|a#fC$>0!3~7#`cclA{%Q_MGbf9z1K{q{`~{@YQjy!`z9>zDL`Ic_#XeH7h^cbl@?Tl2?cI&a%%k>%}yzklY? z@>r*4?|N@@ITe+Ki;RbK?Yf6_qp)ep4tRj=AL9-?k3O=V!-pX2`c~g_OB0eYVncrf z;o96eUa{}XT$iDF6uQR3hKSb0!;LsOCDN$-2%^g-@{(_FZ=ZO`oU(8gv$a0ih>hPW zbuaIEOhZw2{G-!X*7qilOL2HN@8Xx2sb4^h98%L60vR8bkIuZN^ZR)#Wmfc?JNF*U zjk~);4}c*4qKVQxFiQ0vk?#xZCjT?e&piU5Q>3LPr>yVjBmXML0)j$%RWIX2(4&(B!XBe3V#;YSss=E3n*dKwjiF=u-g z=^l+xS(&ylr1!*?7_gO>SN|27VKCZ&s<%xa8FI*E5mn)s{SrHocZ&|CO;b_o2JT@smtxqoX z&Fe(El6{KF_GKqK{q5~RvV5n0z;<1KP)I8{9Knm)qRqfzRo-MHREj9V?0s{dDO+4? zASSH8zhFH-3h|o9oS*fNbo{7pJ3i6r@g12s995=sMJ~C7UDIkn6(pWzrKDEJxSGYX zF>;SaVu02y+C5|E&2e}VSWo7%V2={cxwj&|{n{G(Hgto=zMTQr-#NN|e0{3q=NgHC?Z_uEtK<~#~w)r$x zg!9CgKK|2T1@Y60h{v&a!>xRa!O=p8vPGV}v$KO7A)>uiDo^7riSv*Tu-hV=KFWY; z84oW+EV^i4ay7|$@Vd?fL*A9g-5g#;4_kL`Eiv?_3f&%K$DU>XkcyeK&LxFkvq)aU zezK0v;h~cr=f+<)AaB5GUpc-vCR37`F_<~!SrGs?B|ylz0VWRU7d$_ocVVa<^B+_S5!0-G_8a5 z$(_hS`m=t;awFB%FOi8cOzc+LgB^)wylbF_RnRHg3Y9B+BKhP%gLzR^NAtlwb`urP zojv=&5Y73IwqL@l`7+mnYEJGC%_qAzY%C<2G>P7YI?+ZSbw7eIQM=vJxx0ykEq21Z zvYwqptmT2aRphjavN9OC?}&IRYfDGeIQ=dHG*g%;d^jXrlZ1wR{laNwnPJ1I-&`jS zH=3H`0JrHqcGSGPyR_0$JI*!e%y}vVMI$MsX;8RvtC>vE$wJVn9^AO1ug4oQcLzmbk{MxhiWa9uS~noX_*L;;@xNFaxn~OYvtno!Itza z=Py05>glB?WHVUOjAySPXpsk`i=RIo=kDdj#0DFVxVgGYMoxadx{Auf{g0)q+A7?eOLFwbpMR>p+Dg6^dUl7+P`#xe%F3uc9YEq>WzkfbL4$sg zaa}M?%E=u(uFK9fIrvqK?CO+7py=>Vo@H#cwI3pvXQ!d`-Y@N!w%K3Ai#fkeLBENQ zv0hG5c<)|`?pa|Zeo!I<&IQ>U^H^CbA}WI~UC|%BLc#(3b-v^cVkiV&0E^3exiG5y zZ}8ofsT*ycKc7)hF`_+ew^6Th=Jnit_hsj|lH0)1npggimRu$r-|)j{Bu)OJN13D` z)MgELPY;K6h1@>26)0@m&fe4R|2S#na;D;Dk2l+GM6h{Qce0qHSu}lt_Tsgvp z7s|(gJO7>hQ<8k1#ZLsh2IAhB2C>tNvNw!Dm!UG=C$S3DUm5&u0dTm~_cmb&4)YN_N`SbRGDLfWYgjRIw&;Apf)dk@s70T)@-q>cMCYmned_RZo z*>jI*L6jy4%2w7IvaVlwcGH_aj?{d17-EPnGy;S%q?MO1{PLGGGs*H`+3?5p%zQYX zSih9m5hqAD75_Xp{z9&W@Cn7{kJ$3HOdeP_2=t z1uJ@~7is0K$c$r>(w12yk8Wrye9!#$^JmPY&6Z#txxZ4-;sp=mw;Us$PKJ&Iq7Mgm zMd@w=+ZL*2oUlUAMBY*$6rdpHI;P+;=nfu0ZC7xQ->n$*-O{(wrugb}KB3yjPRFQi z-3FP7kw?)S%X!#Qvs)PbJWM;?SYW>L`!;LQO6{N3z4-imPyj4N3MnDLs{N3$WtEjo zM)(EtVBwQ%SA0#hS*AX4H<43!+I#TeqiU@V%MA<-S6sYlzZHlmw_BGhbP8VeZcMgw z6tP3|@MA}gY!Owrv5U!J#ci35$$1Wk20VeXz5+}Xj6%wfWQq|FmMfv28Sfa=9eT@% z&jan~wjgYFcot6IZ5{3rgn$l30yc00AQIrL0gA@A$h?Knn8KBy!Z> zv1q6LD2rljhD~-_jVXit?aO5D52^Sxdl=iqho6DkE1W%1%Zn?Bu-Qz(oGVCP_9{7) zA`bBJ7#=3o$$R(4ju}JPbrp6eX~yXJA?Wx&)5x2ysrel|N8CC4m6OP&MA+=)bTbY3 zc7tOG19A40?;yN2dn_5O@>BikJ|UJuu8kjI)~|JO*21F`2;)elOlS~sG?vqvHm!}6 zfb%b)Y8vJ~ECZW_!eTB!W{_YT_ZoQY5ZE9793Uknrz2%r=8?#ri9Jd&qBLw#=!fcR zN4-v5cm)76X(@w(uE9JCO9c)g&AMfO>4rcz9?D;&GvsLR<6)x`fLDN^3SV~7oV~)? zAc*8-tFLDms6KZ>@WVmO;1NNweP|DP8(pGIPzUiI;a})Tw$?tr5Kg~-LSDbV;`J~* zGb3ZexkWa`56;M`seR=#&~Q8)5HO+L;M%ooC}N+XXnyJXxB0w%`?+DNk?1=tFMkvs4%A-XItdjZRM=8bd}cjpI@*#AaGLNQJJ|Mn^&vefpm(d0lN!D&2gT@lI~3n303DD zE)A!=FH$kQ5Wa(m16A?U57pm7E5wn)25g}(rjUdghiu>UfJ2z~!G_W+=&r0 zB&4me02F7=e1yEd0GM=ZQr3|%keXxH&J+H0?iA_wK0sjNp_p3ec32-~< zLC>RyR|56gD@DfJ4%xP5%5~YK+=21yqcoNblZvr)}GoLQ}n6_m7;mV2HmAPAb zcG-FM>{#^$L8Auu=wed3Y15?JO4MVxa@*KEW4*>FOLIf_dvshanO>Q>@QN0aW)6|J z!e8}#U?k4%#F~?<74ZI@i?ewn*6#7xH*?o}l&PV~5%I-QVKorM*4C`x`k&Kw-duu> zx*q(wgfRS{6M8f>JWNK4~l1Wqj7jRM6G(n@H(t(@TG^P0oaes}PF|~%sNL-S<_H0X5jL}0 zFEVx^|2KDg#iw>y@|IkP$SOh|7w`3WQWwwF z8bd@Tm319>pmVC^1eg8&hRhhwSb8L9t0E!>6{lh(GFA>AYQ9f$4(Wnu)tnP&^k^}x zCN!c(Wagp-jB5x>H;iL9^NcNlkzE~$j4mYj^!)v))|#72u3{w32EdZ8#$shW87}QW z#4(MSJIo(z{WPR!_xl6IvdTb*HDtQ>{tecgPAuY}@oR76PHfWs2&(|oj%=;osfqyQ zYh)N*pK)R-8#Td=^FKTt+ytLR5XOoo4?V!#$`n6kCd1vmcQ1SLbm17t`6;kHiWoo3 z)yvPXo%8d0xN1jnkuxgEc#uGL%vu$)Q}XieDi1Dtvd(wCjv0H0?CRh=7cc+>2l=hm z)>bkV5dot4I(tnseTtP%3EHOlBp^Vp6o?O2y(A9p_lML+NQevFejH5V49O!W zA@8~vx5zBVc>K|(RLRcyxN*EV88VNFQyrmP-LWbFG0_r&R`IG{&&M;ODfh1*e}6z) zS%9))^QQv(z&;b{Lec9mMU(a9RhY)*la?6J)&w2q%4?O$ldlp9xH@(dm(jtK6Z;G7 z+O`|)aR#>kfIe6`KX{28x$zV4GAb=q@85@reSDBs>2H65)|hmf90QijjuaD49j_X~ zDj@Wr#bI z-5u=Z*1;q4*s)hQF@pg|E>W~Va}hK;e~gzsev`rCl*Ts(-!Q|aZh#$)|IDx6{rh8< z)Pf4##&qQgQJWIG?vf`+x+2tvjbFQK=gwK2kNX{=)xQ@<@6~mWi4TT$-%f>M5kM5O zsUnPaA4@(2hpHMf(zp91dTc6y%2$_qjrjcm_p45aTMnVV73NQBXWLgkQE0|R47>^I z*rR^HlI?vkT64F3Eg`G*yGWqAX;P=OHRA?RLH$KEQNu2Q`~WA_sJ$5frDC4)kpu|@ z(gooItC7#BNLx|`9e(uwzxKvr7#(Bfl@aUEE*DVPIX;91Si#~tHKfAo2zixX} z8Mf@$E5{Be<^pr*VjJLrAj8f`kbyEX)r7G%HSJFps6V@~a*~2VJTY#ejLP4%?|QOR zu(w3~C4_avO4OJM>69r(z%>oPd&SP)M}E2@!T3&TX*N-_cGSZ%7_`&DaMsC8yf@dM}^}F~;ch{QjSN38Oe8EAYsXH5x-~R#dz=W?^YJ>o56cn{S#q^9emZ zbl1MLM+r1~{_~nK7i09FFFH(_xn1gizWApP zvMm33Z9jzD`Og;}To|zVKVO^}$=3OwuVm`?iq)Ia z|FbYB+=6wqR7@VKrmyU1hxAsXvFGmbUvHL|Z0h{)Tb)s3{B)voX1DF@PYwFd_d5JP zvP|#(y^S>{&VTYWr848Sl*?$F_XvuE*t<_`PsUHxZs{@3vQA8$_oyV?J{*~JR{e?NAZcd~>Evv|4ok(CuK zn*Kc@la#-G8@R4o#5UV?bL4@>(qH}lrR~)K)i+3eB!`lZPVe&P(QV@UAA70)ufXd6 z?VGM`f0!#S}vqswF;&lfGZ_v2)tF^49sVOpJ`quo|Dbw;Rttz)z)qL@>nD{el zx~`?ga}nxD$%p#Yi2S$R2DTQH%E)CSLVv$vVzPg}@uC6$0`)#3=1Zh(M96@JzE@fu zs5Fc3(o2V$9(fY28Obzp-ovb>U zc3E(z1(Zd6EgB5{nx1|&mG02tMZE;E@%DEWm6fD&UWj4E`1~lQ*KMGsccIZ->QdF< zTGQWd{}agk-Kw>)`{@Oql~~ZvP~H2N^WgJ7MGz8!+a{U^L?6@rNXoA~ z_b*q=580Dk7T@|tnFpy9H1$7mkye*i>&>&Fegt-4s9h043ydf-9QZ;o?sZv`8gI*u zpX|04Jx8D&Pytz=h63eF*ORFu1uYgO@`SU|FL{2{Z3nJw`TNh_x=kPBlI9FlHE;Ox zDIS27JywkziOPf}Dq3=obswU`DZm-1ynmq7E z%eOo*+8uJH0LI+dtN=iv;eOjAgM;gHl`n}atn=&4r(T8dD#|L?B7`85;6(!R!I|IR zcaa0oAa_ho`UbSrII(+&4pnuX$k1jKAYsf0yDg3wce3ijrW@aj>L2T<>&694l!N|J z&Z5dDpAX#b#2KR}#Jwu%-n%!yE)J z;|@(Zcm0nXHV@?3FT8CJ?e|08MQweY0Ucq1OLQ_Sb}(Efy>>C#=Uba2*7WJ3NmQ#s zPXoGKuIwXnQvF}Bfi7iyh{OVfueb$)03>?y`)z-_|B=JDthU_g&ma~FGlk_duJZ5~ zsAZgb(QLGT87CI5wN~`Xg?V>4ID!nt{P}aN%=NmvR1;EW&n91X1@jw#hG!#;8-`c)`;*N3j~=ytv1*?}4fESZ z(^K>Xe#+^t?hP3#FR2nD&Qw0jT}kZlp zp{VU@ykv>s@G)bzHW`>$27>|Q$}K+3%VRv^Q&3m&l-JI>iUJ)i7-<~3ZNUfWCiOQJ!cM5m_q{>a0(J>DkH9`5<^B(=9)rQ5V& z7tI~+ajGP|*N(TF{hEa%TV6Ht5DZ)2Pp89kvsRg9{p9Jfa2{xn*_7VBG-2XI^{a1p za16&5dF=uZ^ZRhrHs=^8F$+``OaCuN`HJ6LalxF;wpn%6)p6EEY)6`7pV9;Rq-Hn{ zXQ%s4@u;lC9bpNF7(2aKv*)$bt)9ZBwK%_mNee=~4I0WG^*X%4fWhbdv-NnFdy~}% zzHaQ9gZdqGxwg<1mfd1#G6}}{_%TNntN)n4MgHgp1U|pE`WP;&XUt@_!^%w=qoXZC z3+eB4yV-f*uIHmhjiTz}1}Bc?_Nq>OF1$C*CLZ73i>_4fwUDXaQ2mDhF=8$i7x$MN z&Q`pCziX2Aj~D9-MAJca+N*$JO}H>D@c{d^bYqC_^vBwjOV2Ic5Pp&X1MP!mzqU%hnQL?K z>Z0D-&=rdnJ5yj^Eth!Ou9&x^IfNBDl=NWvOj<77CG;mxPQV_Ox=&|gIP@vCm1P~* zw7B+?fMOK4HGk@)>uvbSY19TVJ#LNO1TO&GLn*+)K9;uM#I?W+H4`dMUp)p=#nffR z2zdq?KPBRkpS4?hTEGgnJ8#VwbS&yvH;GV!A!P%#U9b@p9;aDvqC0$gTis#dz^8Qs zQ`Vv7g{L>k+Ec2N=&Hm$4zq7y`&|2SF*8S}0e8)Es885{z(||^K#K-qmR)Wy6#9QhnYCq_J(}^y%%#-QILl#1!bvd~#Dx0-~stZ-?;`J8Dam z7Zb-p)A#+FQ8|qmgAhiIk|kh1eVUDY9=gxTac54Pc$-lf-Mwb(>ut|_4x4=0Y098Z zH{W>G_y}WLIUe~7%Hx&^egURq7Do+gTlx7#QaSs^(t64=*!1j_)^gc)iTuAfG0WcX zcR^FAyJ1%X#dfyIaMu@W^xyOYQg-J^4;WelgF^*k-F>mOuGi*tFMI0t-a1Lm&5>!3 z?BAu<5;EEFp!XcGbS<{Y*R5ZexZjxBlVWvwrd~p=yB}3q_5MC zboy7HnS?FsWtaYetN3Bx*l3yqyCrP+=fq9yt+eqt_*o-rYJ2p)%QeC`K$6GYzi?^% z68Wi9TmR}hTq5Bpn`N%7kF@=|vOVpzoFNX7f)({I)UYqA;)y$8ujeiL^@9yQ(7r)L z2X%Lca%V%HoaC%i?V*#!CUFORJ8Nre={8+mxrh1ry$8QOiHVkv6P_$dhSW?UzQt=Z zhW=L^#c2IRw@*9d1no6(q>0XXRCkCza1rmFU%zZ;MAqM`=_SS)&UNi!-7=IlC3bKK zOE8Z9rOvPP$xCQQtFO9}e^&_)xEyPL#8zs7Em?wm{{7B+PHb(Z90E$wZCxP zML=8Lm`7$BJL9*>xo0$2rvEojvnb)dR^Qy=Tx_`JY_#WR+GK|rPGJ&MGvVAWY1UYq zgHxySl1d!64$WSD`ArOFuKUS~$F!pjpMZ?q9of&_G`oXIpAw-jqRf&wh1HgZ4-as9a>{ z>Dfg4jjZkYk%x6BK=vs*`8N`P-#JNdDh`j+{kxfrL+#qfSYr8amv8mjzsv*{4M$(? zu?(j5$Y@~{au@08-J}!>%`W3ula%y6_L_IC8Pj$C zEuQ%k6U86Lh=`?Z(mw;5b1EJ~@_PooiYVdk^wAPK2*K2>^XCrRGP~shL>Xti*wpWZ zCi;gkMWaxXI$q-3qT#W zFJoKBHpnroIqv=KL7h688Yb^Gov>r0-A63H$)k7eCUL7~x#RPTuhq7gCoP`x=~Pgc zT|A6s_dk*lu87?vHhALpaS}UteAVCjiNamdz2VAf)gm-N{;#W^6WyAKD^#4=*=r*q zCkb0i*?6q?mOo~8=y2jTPyo$WwHQ+#l{4oU%D+$=pA~e$c?(U6_n;Rc8zUblKFOmh zzQw=vvFGhRbE~rYts`CcSC@HhhUZ)G@(P7h`8faf)nRHDLySwg`JgVVo2#xE?)$v+ zU2MgxO_{3E1Eu^@ArJ)?K-TjOH+)I(^!~`)-BuGbuMpRgQ*XW3zUj%S2jlMz+e$Pf zumPIg>U2X``PpG2v{jhH#v)2V*sTR;PiW;tTqYviPfs`5q~~q8;v`J&VAX31EVr*idARTWlDQJ_NwsyuT6HHyd2}Ar` z1|H7wK=3=1zM-(_=;6^$12;f;;_1EKvR3dFsan@OIh}{mTBWuUc;&~q-|K0|*bnxB zEZ7Pm8R5#0=1pfvC%_qE-d*bL*R`(qP^mDlnFF%HLIMkf=GK@oVJWr@p1A*!g0WlU zsP}c*auV~mcnYa7T2@;$b1ins#;I6|M(?uTY^mml6Z7%S(_1EQxXNl`(`qo|li7G( zdJK{q!|`)1^WiA2UV-0?VQYz6F0cTqCoOKID}A$CmoHgTTjSTRb4pJ4YLkrrSr?Z2 zjn9HTF>)%OUU}*4YL8w)M`3t)di~h4t_lnKd|A%90Y|HQ&LoW1u#RPdTJpYtqIvv}Da6e}gCx@2m3DBJ`u{ zqZq$7?UpWu#=~|uJMM~+O9W~9y3&(7m5)2!e2@Zfh+RQ#Wh>e@O9Q5c*e(C1ezL@0 zC7oj}=;j>R#fFCJ%`@4CnePIW18(RG2i)uTCufs#7XvorPisy*)sKjP`8sVSTl0}b zb;V$)|2!xzfUaKU>vFn#nq~a0;v$b8&1eqeBmxcGGPJ(ix6KQMzn2x2J*RIm4VdV} z6CQmnej<-XQ8D4v`4ICY4{OM&UkSn3#Jz@UC6Wr*Xg4;|0BJ#QE%B@3wyr!5!*@M7 za&M<|y?j z)!GH0Kl*bTsAi!3ir$moZpR>p$FET#vg$Fo^?7!i_|U#n&k3%%=}%Ks(4#poI_k&a zA2`1eEXUD3!*WL6$SE~~Er^_5wwdgo{!@z9pKM#7X3+JTBG2^ez&nLQZ1GYRoO(qo<-f=jNS(01{}l&~`l6 z&`bM$VBq!o)aRC&A7l3`tvK{kb~e0*3^v)?gQD4b^c$-l9H1V95lpK?_Ku|+YMTzn zf;Fp1nnTQ!xphfMM8pf+mFO#2-WsB4l9QgkpZmRmW03Fc-yW4?btwwwI%c;Qu+gud zwXkRISzVvy-VUP=`0B=~scz@R_91A*4xf#3&b4a$77n@9zqIf5mH8(zGVQ9a7A+H2+}TR>NCHoW}O z;nefT#hxAQI4B#+SN=K{Nd4WXe|Q{Rw*U1087r-lMXIuLvfl4)vnBtI%+`nF%Mxx~ zf=t;aq25vr=>$l)38ZLk|LcI^dt_WqbuW;_mtqJ^MTme(R*UVxdY67sIZ4@Kgmgu&>Rme5HK#6mg#Lu z?9^}ZWZ^6 zagPTD5da+$5SLpM9XdQ#glIeDB$x*< zYYzHn$t#nwGKUg>;MQ70wnc(RdQ`$=5xkIuv|bnQ3pSoIXp^lWr6m`Ep`}zmo5`#@DwE?8zrjHC?({svIA;!0o#|alZ%wl|_0X zJHh%szadk(AduYK3#>F?7+RU_YJMH?`aL#;9y!v-a0Xc;m>LonenxJp>*ncVjz6}_}oLRppQ=q#*q?HJCT2ifaPNmt*ymsX`X zzWNbjvbdX~u$oDeY}eb^ymro0mG2B_tK5>8KoE8Rn7^JBfK*ojU<)`Pt4Xw>vI>CO zrk!!?evNrnTrS;zbXCoaoL>KM;?I(;hV!h4cDl*E(m(LB_RkRc#e|?EuDp`L=1vBv za&LNwOjD%&#eJGhn67Q%hSfDBl@QC%{(sHX6f`~n>aj4Q^?lzEL)7k{Be-YhFJ4m`J9g~yo0t~SC@Adj zm~abMv&2pp*<>tL_oLjZKo`OLz}H61bvv~ar|9Y)EXDeO&>PIViDZ=6Sb-}&{Me5y z;T7;!>Iy2!Z;62LGSAdxK~6=Sv^<}L{qPV?C6{vUS6Jck>*mb6NgiYMf8X*au0CC$ zCnfG4zmPPCR${*gqr(>-pOX5*-GOGv?s3qz zGWB*%P=uDVI>ZXMdiMdJ1`+~t&;D0R-h>I^I_X5GeYuvB1(48rl}~R)E~wNp``zQ= zY!>+bw7qVma7tAm@6jVSugL*J_0m-q4TILUl!nlTtlNMG4ty+WvKemZJEDFIm!6@*=`{; zavyQ^3J4rFx<=LcBOX?CNc?Ir-7NJr@aRzw&O|$Sc7W|zz((Az{0h&nVhR@F)~5SU z^rT7vx`6!;o?R)`i2@y>YL`w3!>!&6aJPLJ z(dWzX!V#zG25a>D3)(F7{_FS04gwf`L1s`ZSfN?qNy76{2_>>)XA7{&^zv%n9y`)4 zMu%o#?7e*SB95k4T5k5wE-c;jUH>w@fOuae6Ide;G}eSAOjcQ1)!nt?OT@ZE89>Rm z{4QGEiRq;UEc5yNCAC{w0Y~V3BBF-+Ju%v9#r-46IbT`HS{E`xaR^6_EC;(gaCS{g zc8Z)tm)^ryIe@I`q4j1+1}yUZ$7!b*biK8$>P6il9n$SXI`0w>Pn21>U_qupR~HhK z*fG!5G5xiWZwl;1P!7oH6qWh1Sdn<3WXrwKwIf6&Xv-Z1fp^udsy21iQ9IqDYT;hy zUuKvax|IEaDDhxlj}65#JX=0^>HRpD)3vm@v^VDasih^7t^-4Ae~ypK-GYm3`;ngA zzd7q|FTmq#JT}m{h^y)oIeAuEmAI zD0i;uLDD{{udspb_}YV}ZtL%gCd#rs7il{)x;uLQImo1#m3p*La!-o^69~994jq-C zC*|_#i4Bhom!%%Q=`axAQQPRjwp$ZM(PqfunDFAIzpQV8;-}wxI*d$ zN8~|>ZuQB%Wd>L_oZK^9z>$g{z9xcSV6%r#^>iUz&wWx!Aw_@!<+}Yccu!I7d+fF4 zH=;=uR+g-w;t5297ZZQi)Z61WEii`TDw%IETW=}3A_qb7)13oE{GKBF?>Tfir-k%@ zmuV<15Cj&=U(^;hj-HBI#5!}0xZ%39cVLq zPBoaqx~SqkQ8hQ^+8AgcYDc?DdzqiYK5u1bkZY(JU0lUSAO!`47+!JcsaRqnPqD#y z&-t%0g)c@f6A@m`4f4OYhY2V2X^ut-#d@9)&%?ZUJ~0?8*bSWjY~N{^avrW)Q6gDH zjB~DHrnkr*$hCEgLO^J;r0Yyo1l2%PBv2h+7;#y6)?BK62%c9HmTVyPB1(E!)y}U^ ztNr`WGEEM-y@BBe`l-buqYl#UX!jPcRP$d}kH_yZZlY7qEU3zU))Ei!)qz|ph) z5=FJG(4>`ce_L|8jU5KuMb=!>cqvwepK6fIlMWsjI!SH0sC@{$49m8rQp1J79T$91 z(+1I@I=>4#Y2&$GQDumlJif*1DRvnGHQQ1!OIlj@r?BnFoEIY^K(9X=;7*aO%RhRc z;*+Us0}@%WgcC0IqKv|Q_Y8dS14`B)S>73Gzc?fDFyGz)A8-d}6O z6YHNo>RcW{D?iA4{P<0s*Li3ryht4wBu9IIP)MHCmfmH-XRy^4;t%{kVTNeY2fjd% zm)BR;m)x!8QQMIE`g-^dDLh5sAQ?Yx9>N9oDe*qgmjz$2)suDoOiz*4+1xWHDHkv$ zAr2JW0yFP;w3jzETniz$^Wn4 z6Nrg;&EESTcKL|eBF`4DJ|pDV&%Cxv{4Vd(U^y|CxswHnZ1W`CDtRz44co7DaoA{}2QMp^1yVkq3d0bwHp8>qv0G$fIW; z--7NHs-% zW$Cg@xgpGPKcDZq(aQ+>vRXbp$a-9)z0}j8Lsx#(Jv!~U{O;=L+xg+z$JJsA1kc)i z5()qDfvujbVzh(pHcnT!V#r*5;0Eh=NYwaQWW1cj)so?O6_jBCzrohV-QExkyqKF?xZP#gc0X(z=6HC~b`P3( zss%ZmH3iQ)b3-6c02zU&(Orb(!S9a`1b@Ht|BnNYkna8d>ZeD)-~XKh|MT+yKi`n} z%`ga#^!EpnN4LfXo`2^6lGksV9{fnZKm0of{v#aU5&e&F{1?%Gr;hJ9{>yMbiZXEX z$R+*l*is{Q+;-p7gyL`uS4 zg$g)2Vd;+~i_sBO88q6oEa35j{4qp3K-Uh38vkI<+5>n_J{n5b&c_!v>h9sB_6cCNa zJ+U5hyWUW+AhZym;wB?f>f=^HCljG|*5L3MX^g#pP)rx}c#E&0T|$*REZTg;Kueo9 zct306Nk(#XVcWXV+xFuP;=x`$$s-@DW90}f*BkcP*C9KWn=VPOArsKy20dQn?LsIU z5pJQ#Ms@p+InB6(R;?cRXUVOqF0Q3&oz1}Z8gw~aF@7CF`)s4f@Va^tY;PH?RR%Hoy965dH#|r3fqFUTc_M}w7usHjn4i#Ix zqg_HpC8yvsNW2UHl2MkyOd~5AOZL9E67CGcN{sP=wJQ*FxWt@ai9y_Mj$hTX_O*Z8 z+=Tz-Gxi*ne=WD}Y!MAs`GX|y@F;#;2=t$T$G?dFeYpM?@bcdY=znp1NAzFd=YKKf zkJ3}h-6u=$|H@M&H{&7`vS`h@zaEoE%1XZ;&+oqn@V$QjK1!1RdjLWA_W&DG-tPf{ zcmL{)zrX0+8h?MrKV|d3lK7tm`>!*U{hZxpZ)Y$-&U>Y3Km1$6p5iNwRm#lwg=G*>=LK8Xdv$NJVoo`)lO_;u2kX}=e} zr$|6ZCER`kwTncXgtijrf&k=9Gzd=41Mq+wLI?an>=KCc?acQBJzuS9+yRQ5e%R0* z9yw>9&f@P1>cNoR=3LxC7RCMlI$PRoSDI%NQ6q^rFSk9c`lPI{M?np#^V5kTzBDa zf&4c@XRQFJQ+wK94RP4L!l~!F?osL}sF*bc& zSeW;D0}v^qN#_>p*ER|()Y(k|e53JHtZo#j=^(jh_x>xE+|{Ei{%5L8hSh&m%Knkv z{*?a@ssi#=Knm+G{Q|9Baf|9T&GL8a_0GASX&?^AQszlIb@@fS8D^7`fuA^LDR7T_ zWG>IpxRxiQ7h`dAgO5kof=u6ohsQXX8Uz>toCSxm5f#<`f>OhcLbvnKWcQenMCdEA zmS9iYA^|wWjhJnRi)x4K4`V&mKsp38T?$Fw?*F9+*Q!6th)2WCm=?VEu@Z0~TJIm1_p5#7&_b)o^ z|J2f-?+W9)O7O3m`mXN0E1?DMO2oVB`>r7UuOvwR*E2l+_M(seeQf@>MUnm|!T#Hf zzc1;7e_5M38o3meO1_b)ACj0w~@c*&;|9-~bU-WK`zdr-?|2n6~M0LoD!58j; zw9`3|kGLumDPMrSG&cib^31F0xA%3X2(qy6c?-nqEF?r$yg4pHS^pUc0^R>(Bb_^M zME&Dzje&OT@fs1wTsgJxh%cveDx~vjf$$|AW-QWUd#_wqK#)b|q^`8tko>ep-6eRS zo2?KMuCZh>nh3Mag3QLjY%9-5Mme~}(B%ozm*!g5JR{OatF`89hJi0s4gnQAfDxlm zh}$mD0BkdmsiEe3vr2VM&e8Q{#1(H*Dy_&ZvMy%5hXo+cUVWBhaKuDn#lwp+C^LAy9O>=Go?oDa1B)a?*Eu_Hns2q`|t9Y(K z@dL|9#buW*8c?bCL*Dq$lv=|$jd?1VGEEmcDruG-k# zKEpJYh+PkUGq8nmdbRH+2d=UCIu>tX`;{QQb$5=;seEQ;6zV$}Y-5#G*Jzi;ZJPyD z$2EtudBEG+6x8Wrc-KaJbG6X@%<4qp`ebcmpV#+njl7b$7ZD8UOLpgzQqU4I^Km&d zmbqAR`hSD8ji2RfEY)!LvE2p~EVyQ?0Eo9h4Ea}LbK4{$x|CWHk0|lVL;GA z+Vb`I1^D#nYYrlm0n)y;S(9~eS#^XzPFU~~fX^D|G+2dxMH-MimPs-SN~Ya*fPfDp z_<1F%#125y`On5P+bGIuc}TQ(~JlO*s4E?5YSRjb0>OhvoUqo007>#iC5|Zn7uNDDjQHMS_`|F2$|j ze;!?dGa~?(?Po3W!YqBcXV@%e**L0O2)(g{XW3Oy`~{ypo^>xuXyM4ojK!#Hi0a|6 zoLTrXj}Gp2w(6+G1>RIP7)zD}col5JouYamU8csGWXtlb4<>mf5;~0_m%1$8k|NV# z*o=#sONSADx!uuy%Z0r77^pMQnf4Fy)ktP8c)%Gc|R zuU>*R_UNZpQY?5*_?*A^W8Q6p9_Y>na8?;SvYQ62jxHsy?7YsmwwZPR)uymB;BVz z^~9NWH3|J&KPog;l~&GjHcN7|%JbVTn3#NbeU<9nViKW)?YP#W&(<8lRN$(X#G2`c zv=6~pPrTn~kYB#S_|Z7NiGDkN6#|PnUHsz61hdTAvd7)0dMwy!a=5n_U+3)c<-Y0t z7cRcV3gj%s1y>NOO&>c*g_*PIbcNaUn7F=F$!xaB#awwoY}e0a?zFUbyXUL9wRNxS zYF{65aU}L@7JLWRj=taV%htogOAf>Dz;_csN~&JOF#e!HR0%8`*uj_2Om zZOG^Rke4H*1j%GdOq?Cf0Zl(e*5L!(_yXEGB*TXxn{Wzv}1H4gjo zu*u7`4ru}&dwH#~k&yt4KgBKRwu$ZR44H`OteP-##CuGXJ8I%hQ(96IVc|!xpRu?o zAB!A9aHZExhkCc*4^9BaNLb0K*(gZaUNO_sYGlYGv#e}wF=RPcN(=f01av1tPGK|U zyNyjP(Ttine`E!fVt9cXOLX)E1ItFzBhnpIRB#779URtSRRz8YJ<&|WuWdh$;}%<5 z7^`~U&52O}^fNIzSz(qK6+6gFdQDj#w_DcS-29y4l~(^&5wG?;#aeslYWWs>oITBh zKhuDobmLTauGH2@(2;#t*S=b?$R)wq&vV|Zf2K0v8=Lg~-~xjjXe zT0RW3#;(gaHi}$jrFGZy>pcG}rq`#fT?&TE`5Kkh$2AuhHh;}21LpjwbsRR=)P8_RGw@*t?lr{v6<5Dg%HZ0UC<5Goy}n8 zjhiQMnc3^g`JYAKSrp)D9yWHF1To*4tqTt>FF#uo$Q!laNq}Z3j1@wEX1n@FT43>#W!NhgzG(0qL4j{N8A{4{R&KqQou z)>F%alDK`n{o8wUV**~j-l&8l&chcOJdpP}O0@eNcS>RhWY+!GH1PV^PeTK<{Q(!a z@>JXX`WprxUa941_p1!F#iBdbZ@>HLo?DtI>bnw4pTRK!2Ud%rn~k3;Ofg}z--6F< z{_x;|CJ6G#^3^g&GcYJqpvG!mZyKMrIs01gh=Ger%;q+I0=-+l5n*BX0f?QQor(8m zc{B2`^yPHCGT|Fp*~Y3tp-gG~mEAQmH^Mu*K(Y1`(S9qeRJSh`akoJ-ZxCtNtJMpK zE~?-0@EDh1d#7#Sjxu1(TQv+`8oN5xZES8ne@mc9JDON|I`iFpf2Y!3g*I|g{U3B( zRmF*czjs}$8s6L@_@LJ>&9i0NqQ1=ZyQO~^0TH-91ErLCI@qwwZ9VWdhFdzic4y4IE0}6poVep*Y zR_@ASSok75e(-8vywp=}+r7rq!~_EPKkUs*n&`qnjUCep=4c|qJ}9L&E1RPseAnrj znH4oP6*VGZ9LvHxkv%Huc`8M&b`)%^tVXQ(1aRPAieixJwQtS5c5PW_hUyoI!WEd&8>kIT&$?b zXQ)23LLZbqtRNo9k2O8xF!yVSMD=n?gh;PZG95dCG3xr~=2X^Tly76VQ-lzYrKP0T zM-BJRQEBi7hU;ikX)Z`p5EW+VXvZ(g3 z$(Q)f6K>sV!`jY@h_`H4%8I$UYII}_He2exR_F?`-_0v5d@ML4n;YSz?d|jAJC3h}y@QyCYbZn9u4;@3PTR4DauzI8dG~*d)$5k^q@&-9Sk;EUQ>z5zeBVb}*vzX{RuEN^S#%kt#3 zyT~$TS!Fj};Ir!9*6)xBh*iu}`!IfD*B8frr+OXFN1(S`{w7Mw^pf-nnGrGVp=llC z1#=foqRB?%XAf?~MMPF%JcwoEqj@S@IM47#a?S8 z&7WIktE;P>PaCRjCpUXkq?=86o(i7lA>4+nTk?GAI3>JYW- zoTNrTN%<;k-fPJ@YUL$azP^cx#{;fyDn*(Nwj13UJu2u#TuxnQ<$pGbj{r~mcDk_I z7mG7L*FT}|X;FWrC4bOuv&Q6y-`U?kTWhyg$b+btMs{(s0RzfugdF)vi$kArrz3pZ z{lyP7oF0jZnpqwvP>Aq&w$_gOjrSq+)b|ADyaYYv8>;x&_5jq_*EiZTEc8&XKv zmGPILaDt#Si|zceR$=4%y1Ckes;&OBMSp0Vny=~H{l`CfKzol#dgPbo;Y zUSqOvOM7e3c`ue_Eu92JI8~m+sv8j!a@w-}mLvNn;e^X=dETqKsP_2eCmg6fM>Eey zd095gUW$fu>RfjRX}=@ch4kW=u_pXB?s<56whS$MBV>B2EzQO352xxmZzZ5F&er{$ zvT6CcSH;wDp^Pe@8?l>d*8?OF$`Hiw#l?fEyk=tyG8^+`KX`9a&r2zTp5+Mpz=1^e z7&b}`l)|FWan4Aj9e)ZG&f%Gg*A(5|%KhLCfy0&A zCjqysmRK!UUvz?(7nkROdJiltiqK4>#|qRXiS9qOeOI?QI?H4iIhUudfy!s7)JZkt^-2M`c43l*Em+2_|uT0Bc-?Q(;JARu6cBOFg+vz9G>8R>x+ z=v|d+#ruU}nNdt=MrMXoG8$B_YPVbJqT9yN)`CvrA4OPiqZOSNO|Be(OQ1~C~>+6^5 z%=Y5Ov*EaAWM+QB<14sHky9zs!i;%mt~HyBHeCicu|y>uSYKQFy1a1EdZqi}o@H4> zcdlX%IXo33ySyy|20?XQoeFJ!vt+Lim>y>)>c;h zzeq$LjJ_0{3*&`*?Ntb$xCVbw3AVF)%yW;w{ugHeobZ3^!dw#ay#GcNh+oO5f`FZ| z)1i!>&w>u)JR zfDHnC>gymKB48Xs%^DYqLeZOa3c68?Zvv4P4ct!&a874`5(j?CRW7Kdcl-vRCFrIU zeMGNVOdv4$i|pR$CXiGxz?GY$c|58`(kl|!EIJ`m*Fvg^jKd9 zI@5S;P6tru(+A!OCxM){tyM`-{Y6pqit=)7&DV#vb&fWfXvAy+9yhHyZ~TAgxXY!u zoLe)*ah#upGd%!R3HUWH0pMOXTpNsEpAyL&!ML(DKTmQ)&&IHGwy&V=et5+(cWt@2 zY>aSrD;@v>!pTwPy;3o`)6#F<-0JNijQgW2Q_c^B+oq1yr4z3=BH>HRNo@y(eNPIO zn9$Ysx}ThL@V_%k2@DL(evFH$N)6DMA$d>+-(+qj2XMjwWR*)9#{Paam+U&6(2Z`o;!n4X4eC%UX64vCCObil2mdHO_FsZj!5opH`+c z(Qvxe{c}YAVM??-z$Lri(c|niegk=^(uoKRoFq&t%uY10{b;BQ4i3K5vbP`e`<}vq z@p0=|UgcI809{f#fAqIeFeK$2qx&;{N#-OZ9RJxHYxDUz12?yGb9!u#mO5R{ceR2* zTnZzW1Gq~imE#RfF-wn=GbK=?3wGN4*nA=37T~K7H(fkNO$d3czmIV)uCCJF3Iez? z);;}2-!b>aa*^ zjD0o@E4eIi78(AP zx`a+!l73_9S6BO%U-{8o%O)OEd{F-X}Ce8G&W)X1}V0d!!zM9g~x< zjQ3wtWj#sN8VZYKF&I#pV?jQ=SnRR5O@?bQO*xC!@AsyLnFW|}@Cnv|?Uj>%FpM6Q z5-03&;|zY`xUb>N%`I0Xy%UGB*7vI>0;2n2Vl}b?tx7I+z{<)B0I(KaB}$+5b|?13 znKgfA0w~c2l>FMNFY;`SwFRuOpAnLBnGDv7SC@Qv0E+02zCjavS+6)tURfpUR_yMENXd)Ggr4 z$B!S&!hHcR|CWWgHCjM%5kSn`*>Ca-Zg2VYR%6SzX2QjNMsw#`0Ud}a ztNpUB@#MgcN)oZ*de!;fbsx}&aXKNgzUW96E_QQu0$_(nz)HT}Wpb5?9S7=I1wn+j ze*}85h(P)XcevViLtfA8+SPe#diqy?3V;Jj4tBR}<@&4(*nBo~xI3rA8;_gk3=9P_ z4Z65YTJo+zme)PQiHQjh+BT4Ll+TQ37KA`A<^gi^bJD1bFxXhtAj&N`0tv<=md#>{ zTI7ms8?SV=?xuc%nePQi(%bD(NW`H4(6jY!>A57cd#izrM7Q0T{WU zRj5(iQDbZ6EKq01y%iYH;M<-aD4XuZ137xfjczmUlWrkUe`3QAaHHjpMn*Q)6M`Sb zLeB)4Q?Aq?)ztx3M-43xK>S@Qn4&d<+NgW}`2mi^N*#Dvm(m~N{B)DPuq zX%H`D(7J=?qwHlBfuL2D;@VsJfPmIvH)rg}bQTSi;3Ihb+N5_G$hnTTjn6FVP7i9^ zQst-F8K%n28D)c<2KpD8?3MF?9ZGZD5Vm2)>QUmv$p*4HMxB2uiGJr7=)qEAAI?O{#aK)5C3>` z)U8A-5!fa@1YwZ`f^Pb|a=cnPYfp$hX2fc4meue4hgWsR{(&c&3v|sg3@wnm4P{rDpx7? zm1}BZqS8afjiHPuxRkcrSY1SaGSLqp4m_u;Uz>1b4dx}LOKF=uotx-oxqBc$?LooB zCKiTNCJC>c-KLJB;brI3WO%h3bn~cLQnY1u(1WoaC#bsCUtlV=z2Dy1eoiI`I7wTX zycf`-h$SJZr7=*-d}}P1nST;_pTBr*bycm@Nl7m48f5?(1Qe)^X}qi!!!_R7`}0lr zca}wf!~`;-e;46$*=j7;($@Cj?8mh{d5XG5dW^i{`|N^(0>E9?Pl%p*;S~FE;S_p4 z1OW~i@DdhcD-Cy>MH}1O4VotwQhO5|{rRqr0{JQ07erfSssN81@k2t%Rb4_BAk7Ni zsRTmwZH^+%oV}SkP`3pT@>;(|&9F-#;&GEly=}O+;Hd5Q z7gxj;4DwJ0J3yCpMyZeu9wwMH`j|XIV@(M=--AtfJF0)i?2V5 z@yRVUdrM-L_agjggY3GOeb{3Bz*aj@ZZ<3^YxIhf^Nkmxzdz6E_ON^0C{SyBD{46B z<>3(uI$RJ<_Fn)f-4<}`(-25>bQbm3$i#wj-pq^);UzCiqaGDI7S!o7zN zx95SK&{hAIf1TS)+vx%8du|FzEoIBDM;&WjIMK$e@& zD{7ejZVXvR=LBCj&o~AO2j9DLQY)zV+?)wm7$@LFT2!>d&rjzbh@ZmD^G7yCbM>M2 zU7ibCS=zzI#AbZ>-oQXQmRA(yxjj)X6EA}c-yKc&>@f~G^+&}53A#s6ie9~9U~Sqy z^_Yn0XsQdRt)0`5WKN1(#Q-LMnx{RNG*uBm{k81BZIu;hhkBR8LC2kSF zaGMGQ%8rOinzfks+u|?}a4MoKa#$)jy-P*<%(a0ou;qQY53!PAe@fy)*}XWx}}6X?4&6 zV?ui?UQKI~uUhH27%_R5x)*?~oSN1w{Hd+02-=WLYXAoXa6)V>4SYeEc3TufoPYJg z`C3w;QfUpAAW*)#PaPtF_^b8Z-|r^fCmgTf{BkoU9aq+IQVpD?-Mxa%2%iDh088Uu zb=R9^ZQ1PK^r_B`LbthD^xJo;cXjzL&sbbWho_yVVsU3|do*Fm0v`Ds)`Cc+UXKK0 z@=@Po%0Fa8h|v4M@4!Rxyvk3E#%Iq-mhvfMWed#b>jmY(&Iy{8$p&R#Rrx5SefjV(A*45Hs|NE83!2JDhw%~PAME>}Sij%M~ zJtLbRpMLV5&(JwRFo&SBHTvhZJ=w4rB(CC@I2i(A0w!DAya#72GOzZt(=hlrpO!J} zHC*#vr1lghzA{CR__jpD{P-Tpf$OI&Ghe?*QWT9ENg@22aL@2C*lQYiS0r99dT7^A zt!l$i=P28qenkrGPD+CB*ZZH;Wb*~9A8F0$!r^GZ8UlN;S;8LYW1$L5kVZ(FOQ`z$ zq4Qmm7+GFj$)sk#6$dZgjGfIvmPQKpMYV4%lk4n@=$X8W##Bv@M>(b(dRuAsgsD%7 zlfm8;-B$C$V`nK48}~(Zi|W|+YNw69zHx2mIyMz=B1w9!hDr2k_ru{`{NDnn$uizQ zaEzvbhJFwt&QKI@dx78|(M*CMj(|*aaqT>CXi>MfpwdBDJKzTSXgH1Ivr@^733FUL z-*qQM;~(Bap-gSyOYm6v2}i|^WJX=d-@`IEmuO4%`j-3;IbE6~IUl}w<(lx*I_rVw zr}V~?iQ+4xs%O4i;oq{ev4|cl5O?m>=0Ch2h8P)-ak`sdc3hLkB&Tw}!S&=Yn|O_t z>AiqBcqmZvf=CmEsNk@1EJ%@J;S+cq)Q>6)FFv8fg0}hMyS-V2T`ceb~$ke z<9gr*gv6H6x^Z@{-{{9^;!`KEwTtzQPv=)yC%OP}#*9MptU%bJJgZni<1th1&raVt zf|}u|_@cVal4G`~2`7a~yCO0U$HNxxPq~pjI=qZHG0y55X=3i1Q8&o8gb)4zM6|W1 zLZlMN;8JIizd6wOBO!D{-`awsBtW+j{c#MLF8Py3;*Xoq!*s2me-V4y`$(K7RR`Vk zQOI+AVP!78HHHNagZicYwW}%VAx(2?MP-dgFZxz1zVs)}3hM-i6TW}+{E7y+KUa6N zQ4BGI9O;$sjoNP&sV15ZSeP_*s^Yv2Y$Skrw(OCZ5{#wPl)`;-t(Zlcs=XP-APhz$ zu4JtwsMc1sB0ZY04UXJA5VFCKW3{F7nN76C4Q#%O$9qmzBiWjQQR=++ter#v&#wc4 zfEaOB_uQVP%$#{V@3bwv%+c#DPdJ(xo^%Q7*zq&@Lnsk+`Xc4(N-=qyty5FGrNYb*#omy<9^+IRMbCsJf~RxRzk{Y;pDqu>Lg^7|FE^i25!rAa$x0BG zjb3ofI8_$HylgolU{!g9iDuUQy}+jij0?^$ko&$YV#-Fcp5&en(z{3)-n}?%V{WKB z4NvDw;M1e~MYu~`NB2Q^_~3Za2QNp6 zW7C;78to-w;CLWC4MWrI{KG(XLiq0KJ@9icV`2zDLlN4g^P?D+zV zO=w}LPloJ2otA;qTV83r>gV(6K81&^f20ciaibskmj);RNZEJTl%W|)tld4PJf*iD z2Sw;_W0IKj`lOEapyUVx0J)9Dq6J;ZmUI~zGrg1U{kv_n$a;zwV8?Buti+B-emSa3|DW}#!2x-QXQE3EyzlKOUQ ztN>_vQ-J1aeW`!l53sxe+S^T^TBa+E(~c>=M*#%iyaO!K*l^J_p z72-sGRAZ=+aO_b~!s6nS^XLyfDrS=jzTc*})Jru`ke6X#6q3yo2viOi*RV~GFbZqN5oa)QtQ;(Q+8U#;) z2=TXFUrnBb4-02h#UNSzIkg0?ro8wt#EF4{F*p(sNqloOjQ?r)Gn{YTWpg-XxOkb( z&S*5$ZR;2=>lMM5kW31{F-jSHD%htMi|B>$y~+Z!8=(|Lx`{fTcB zOvehfD_kNu5%opj`EGjCHphsx90ZQ;pUyJ&3y6yw3+lxgG0>CC{`jG%RJb@(?mRG5 z`$68*E1gx2#^t~vZIHVEH&GC9tD{-)zOX6rOWyS|yD>yX>!UNK`UbnvUD&hnLR(rg?h`Z?q>i zIPy)%*Jh3W5hs`xiWvee8s2zQw@0&-?6U2KAIWmEGtK9|AU~*x7|+%?C;G#3QJ+jW zHXtCN>}b0N=WAw8Jvx8FZBYz7fRl-saM^8=#C3PaZuK5vr#`3TJ=x7&kha@1k2`>JV z36c-+R?G_+JeDd~1BbzQ*ayv}A$X`x0tL$Mmy?-&>TeWC1wP`Ly%>~J2omwUjWwlB zc}0zcL>`rW6iKgWhYQ&bP!R%Y9JP+qhCdHpA>S_)rGY|k%R+ojv+ z1=6M%bTXADux%!*vLR&_56#DqW=S~qc#FgBU;}s2>z8#njl9}sw0?`t5ADWaJ(8dl%fnDLB)%$#>U1@&3WA7D^@4;?%mfmJ)92) zy%LYt@>L<%!vpn?J_LyfDK3-e{6hdZ$hr@X6sM-XvcZw)vpkN(owM(;TSV|dCE6R? z8sIRSdSl{I_w!_Jg=zTGAlk|IY(h+K^_`rYJxs$&O;E2U8|yJ|C}A^bbCon0>y}-> zJ#{+guTygF0*`KwB8~*?{=cZD$f3heT&Kk}^~!qLXyHKVGjL~oY^$jD^0}4d^))YX?N5n3Wd``sh=>T2 z`VYXxmTP%!9p*|5bbQiomy`2ozN<13jfjLWRV5{g?z3|z$0YZ{TSkGNB!IWM1A^+c z+y3Hn?AEI6|SRYPy`M&E6%D*B-7T-u6TK}E`^woRjev`dbsm%b- zv*; zNQXs@i^M$1tBeHKvDjf=ryhgy&IS@Di`X$4equQcAP`gE0{=WIVG@-kw8i- zEG#{=VG9T9So!+P4{q@_rAh{iQJu#9lXRBz#r{t!c#KGeAF+lB?E0J202D7Xy{pi( zQ&NgF>M%cL#Scz>QoEhRJ8LgzV0>L-HVy6+7whSyQE)UjU6Uph{qpqruVa*7cJn|M z^ljM(lXz(rxu4|tc7z~DDkz`AG~La-G;3_5<`(9ggn&ZM)2QS9%Sq=XCfbG16G(D2 zq|8d5WT?1|a<7H(NP~ZC7X;jEv@2F+&}1{?JzY4-M$ktNz4ht0Aj8qWp3aKnaa8~K8{$_6MUahj)howoD&Wb?BcP8lvnq4hFWk@8qX=5^GxFplN( zzWVM@0vXn_uU>dmYrm?p&^9zw!6+8@-YzUkCTKu(=OcD^*Y16H-nf2)LH#8t=;Y{R z0sJW-J8AYhksE9_SNwCiE4=lo{tYEAb-2VbXIm%vQ|laadu!`Ucij0`4(pcM7Vg>& z@*EctiBKLwLT)yEv|?lVu;=?H&7wsOoBWeeY?rQtPlj49%zAD#+`Rbkdrg8x?52zy zG*~=rWDK)P8noT*J~cDG1hqfaPat_8R2&l{HtQi9l(NiiQ6Cc-%iaUoXY=iS$5re48rVQOM*E@xSr#Oxy<-dcOqx;I}%qRoWCA>hI$<^VeoH4aSB;wvnYfm-fiw|Zhoe^>7e5xM`2#q7CZC(jGbYfk_S;4 zEQFLb291&!RdBh+Jp~*!LE5I53e4r61vAKN~5&{@~5jH9ymaaOVzKS$SgwH^By zs3R{Au(aI+jL4R7Uh59R)o>4P$XP zU4cT+Izr^WmKFvUGQ0C`HrBq$L}zme2{=K!{o=t-pRQ{V1X@bU%Y|V$OH7(RVw43% zIYotqq6$dJ0YF>OAT!IrAf23|eJgC`dCNV#Nn2Fc+WK;-Vwbi!peR4IzE}qX{T>lZ zjjtp0B&A{K>>tm68Y;tiH2xNx=yo`}n!uL~BQwby^GQla-WF>SJ;hQWUJZ zqjoJ-$||Tgn7b188CA*3_=QNl4U!BBX^NXg$ocdl7zv~43_2NHhC%RJQ9+@>`uL)~ zT?#maATihri}2f%)i5S+?Pz@?I$vwy@i{9c1r(Iptl=6@V~%YXD<~`~Y3gjM&YiSC zA%dqLWcB$gGrJrmC8fY8H*$iAioOGG9QqdrO^_l=DvGb)T=qx758F;~lilHxDg6hU znyz~WW+4|f>Vpgdr4tpI%DUqrXlQ6SWCERT>S0oP7cgIKF-{{T)iQ_k578R@snv@m zft&&kr->Ze&d0mP&E_==xgosg2jv{IWZ%Tewfs<`BXO!ZxkFX8MB>E(88|*R?nl`Z{3l)l z3bQNGT6-%hb9^^L&sdinsvwck*h&$&WMsS>lGPfvy4VO#W8+HWMQU~EKb`#Q7#MB9 zUu|S_=HI7`wUY!Jzs5S3dqnOSzen0Ms7guK!`wA)9 zTws%sQGrLD??mHS44LNdKNu=7rJ_R#pRKFe$Mfvz?2OPO`(nOJ)Z&BMiuaOW64&t| zo=@mv%cvtNy1ULfAFr;c94^ii!ktY6pNllnttEm22YL5mY*b>cQXVV&hY&_ajoMV% zc-ggqc>hrWoVkgOVM@v!Zof&V<}cR{GWG^)gyigF2Jc>W>{C{Y=MlaBo;>SE%E_$k zho?HrvPI^D){JOgBsm49e*W^LANrHuOS-R#3S>{Rz>ebr=W#ZV_?(w-|C1dVYDE)o zdfiWqI>+#bFTG8ZD%-ts^K!%)S#a(n^B-}QSv;%JWg}`%;BrL=l$(94TvqcL50%k3 z*Sbif7xODsTyPG^50N#CX`f!(?){Lf^iQIL!_{qz9xyv>Kc?$=B~@d4PD@QrkK%fL zsoJ<}za)YtVALvaLGm3dc*#=`0^Yr6uU6Kw^S$?7+%r1sPqKSE-#rnJG1K||29;Q{ zWSVDa=cySO2-DMy!$m5_41hgB({~LT*uLHO(pE$_bMxT2;@z`qnLWO*U;6MTF`kX* z*>D>iTi-Ky`15!t7~^BCS|#aaNJ|G6nMTS>H0#* z>T`R{b|urme_||Qf{A#oYg6V?IzOk?VQ+1c>@+0Ib45M$@_Iyy0{nRH@U9zMIFUqA zMP<6m{KJ+qgGY2^-gp7pEYgif4_^W_vrx0#YXFTw>q=i>q|5H0`Y@V*e|c?9Un{{w zDM94v2_3ckx7x94=0_0EM<3oaeasjfBxl=Q4Ty4|;efV>V6Jj`!2G$s?CTh^ zfSjxgC*Trlj{8@!Pmgd#xTe$>8>3vd8(KTI^S22*2F#|c=0^iN`0Ew2l>2gqc`oeC zFrIu;@u+gY*k8(e#x6Xco$a!=qd)cfd-^vy={+I$`Og7#^1H=HYfz1ji8cNQg3m z9$IS$d@y)~&dki(2x8SS01ifzd0pWUPIhiQH#BgSztQ&w^OK}=N-BR(z8^w%O40Ug z9ph&`ml&p3Mr4G@CdPC%gNab*!+i8^RqfEWAN4=S88w#K3V^#hBsO#Wn0z+?~ExGB!c6% z83)|EAh+}%_*92H7Dee`K}UR^{Zz#x`HiVE1F*5AnKNt3_{5{ug$f)I!3zo^Jz4uP zbo{K6f8WU1#LG-=y5s}Pd>fz6hrOD%D*=qs)}jRoMB?~@`p37x{esMn9Em{TUd2ydJ=y(l!3bG37ZJEwroLR*A9 z7xi0SC}7?+c~`^p1E*rQ{(sN{v(uGfgz-5%c!(er^_>g2Dyu)= zHqLb0_S=)hWzw`G;3lQxj#tN>&czP2x`#m><9tf&SD_<=fWEF?E7W=1%TGhQWq7Z~mbho#DEJ(!`$y(0#?M~8m9d)iL zpzkkyvckEaRMN+AlnQzuqFsvoh~L2(T*?$&x}7S7WVUGW zl(4#KU_4KHM~wu$IbH;@x8rYJou>?b26rwEsVKl)Z2mm{V6jl(EBNV9J;mz>$*2Wt z?1;cApdtym*H?EF*@nU&$6>xHVlV3NL(un6o>VoOG`S>GEQA)zBB>P4ez&o_I%7tu zY9tZeu4~JHrHCc*xYK-$GfhJ{79eRIntA#zpm|>)N~_)_*uSYUEF<>uqfgCIflk!1 z-`O-Q&UC((mtky>yyO(FG`^zM$W+gZLZ^O8kBN`BNh}snSy|qAPr^IkX&X`64svLf z5Xv%2CVdqoc>4eFbd7;|ZA~|}ZMI2c+iB9cQDfV-Z8mnAHnwfswrxA#>Am;;`m;@+ zoU@<3*Q`BjW=$Pm_*Y6?ozK1~L)}GhxIjed4+6>o(00`akgOW|EuHa9#KQi3tl~$J zzsRGWq;Xh)g##~FC6AB&;{NtAPxHT5OygcADSQe4LDKu06go-5JG`q*czb;x5gryI z++ufAAJygnRZ$k30#)xg6$Z3X2qQdrorGcH~LJUbK+aDq>4$}w+K17;1jnP z8LTze2~|u;1MUpRb?`c$d<7KY{@|E;S08aA>`=6UujW_2(6r z3n8W-MG9PGw2j(r+^cZ%K)4T$*gz6>d>QAX;VD3FRhHh$WDnktnk9z14*gnMF88ye zcX%2?HGC~Cv_ew%bn$AYB7OrzDhaD!&Qc_A59en&?$*ums@z@PF+t)O-G6?J{)9o23zT0+BIjc*H|GP0!P@M0k+CpM5 zDN{e$J1`Qh+m#@>kKeA>8%)^5IH|92<+Xba(2@h>9w~AOr>A@i-*tzE-pAG zPKJ|$Wu#)hhwqet;SekAyz2#0oK!N8J=XiS1_ z1px1~n~sG`)NREvoy?$fF#=Ru4C-mj~^6e%kqvFB{b>a&hO00H_GvavGIz22-+ ztO^<)l7fTF7&XRadwKctKd10e@Ux{G?4j-O74>w#R*$Rg#KPfw23fo?%fZ4I2}D>*gSL)ORqM<#xwxyWI^1T|Gwz{+ za`TIu`CZj?*0NZI#9=Jd)zeM_R5sE0PeZ}3AK;G5n9_NiP2ufjB#LG+kdw#oRX(0) z;y0iA^Y2RfG*~G9i)%AosCxJfI&I&R9)bkfs<>6#+?6)L27)PEM>%aTLw)mTGst^& zz!+u7w9xa0gaC>gZc;Rr+rC_tpt)6#mN?*g`e!wM(r zAkZ%^rSu5M`Ju!&Hw1=k{vfa-p!MYYCL@En3r3N@EuGt(hWCY$z(J>J)#h>1k3=S} z5E*T{SqWaVb)iNKo8&`TTMFGmc##asz8HX(D*1E*!qTGjoLDBD$Em+@8KX=PI3$f( zZH{K2QO2d3=uzfNR4B=412v$x4<@p;)(U`1ErQrzqM9@ zO*0iX7rkYuW9e*u!sN(AykGzvhpPY~XHq$xT8@)dXt7eLEp+nNa4VLI=kx8*lGQQL zMCR+qVWVIdeR&mc(m4XLP=#{}K0R=ds#As|YC2sj@#p?*8H5F394*dg;OF}K=ze+m zQTVksz#I7$78k!?!Zt0sWTmt$2;}BnZFpngVkyi{C{`ODNyfHQC(;C!BK~+8hzRQD z-5<-Oca4fA`vwbu@5izd=)_w@E^6VVF>&R~hp1HyVhc&BOS$obkj16_I|QBXZt;sTK+rzP_a~T@lOYzh>bwW~o>GvFFceUDlkU%gTFD>G0b^#R*6^#6L!f>Y}H<(Mn z>=Z`>l`|rS^>Ax;USlks?-egvH_3nkoZ2sjez7RREzq@soD57x@es!QB!Z63s~cC`&@TwZ8{f08S-BXaCzYgyTBv(ZC5<=-pc^j)UC zbXt4dB+bXUvXt<-Nuy9&U7y2oiL8s2gTCpeu?t zc_4H!a9WlN^}J%E(H=!ZzijcYf?cGFQlp|y6rIm2=aU#2jU;KIHV)1&6Nsa3(e)?N zEaapB&o1}((a{4hrkRD#Yb~cNZ~EDQ^VTV<>|Ec|2z$VwxnJ)-+`qopAGOjMQI{9C zKp-2-!}*iSbWa<7(1wW}FRTDO(glM$35jSzdU}K5k$J2IuvH|1&}=KgEIslHbDbx1f|Y}>Y-XCU!$z90 z$LS1qaNia=D&4|V4z%MzXpc&NdvcvfsF`CsI>Oa2T%DnyWQm_z?T3B>y6gB)l8dK& zwSil~W&_Hck4RW?Ny%6$8>9#W;zmp3r52;d>^EKGQ{Yfjj0bn)*+U8PS%PCH8w@djRcB?2l`Dl4y-&UwC-% zA0MHrMb%ktxIOkUzHkeRe|WbQ$fm>e3EEoh3>$ebvlRz8>PpS`JJFmhRKSahX;XGA z;o!l3K>x>jzUU`V!0VFB{?0nSdtOU~VLdKh2=j7Pt z^N};UfE?*`t=iVzVG={%*;knZE|pBrXLelb@6SMD=f7Y%Y+?4fLjqL66o4GVw6NQ~ zk>tg)6~TFapZAPLtA@5RNXD6Bw;3$DwDnduXm4!M$nTCW-RICltQ?hwHs+hG^H|>4 zYK>nmR~l?OWnfXjw|Dp~8vRl$!P^rUpSc8xVPfDDJvYmZWzIG~dT*!$9(C{boa`m- zuhVB|8=Bm*udlB!vrcXfWET-blM$(lsrP2*oN6r&XJ@e{knCFv?==qh_|2d~@$i-UWP7gkdlN@)It-2-|cUqekKdAeUOrG_hEtFFXQW?^0JtOjhVF z()^Ou@G)kD$HOs_<|f5c;t1Bxn~AqKzYNNId|Dbc24s~!Z>7`jA?(l7gU~RU+8QPk z?q)qB>r<{7{P0i!D!~MS==5@T1PQ__WIEe1Fl&c(*)o`w3!Yq|3I5xa@t14+0s@fl zAtA8;==xKk(=i>0YXNNAgLdYx23nKXaG1jZoIs91mwFTc{mbOX(jLC*p!P=<3%L$! z;3BnLZw3@Ql?(%1=@bEP5xau@YtQfAR(H=Z05z;FKR0f0V`gR+LJ33( z$N3zHlCc4{WoT>^(0g=$9-T_PS{zVhv!S*WJ#b7C3Was7Nh!@UXg8(4!OwT)p`9;{ z8(ZDlD%xkT@FnR@LxlC zJ>J0#4YvcYoKEJUs?sn*uc?153RyQ}}K^hO2{?J&**xF}C8nMTgPGs{Z zQfaAE^m*uWs%M*NeGJVUsK$d&g+|L9u9vaQ#6Y2w2mFea`vT|RHM_jbcBx97yEB&l zL-&{Do+M}%eO&r%m)kJ1nOPH;8&^}4PhKafCs%?}e?>KQigv+o%_jRiNlY5sFHx3@ z7+3fLg#KzUve|8}*Skv*$raVr)gK7~5lKv=nleg|1DeJ?6|1iRgj-WG9yDMRX)600E)e&y0|HZF9vCZo`It|vEYF1q4LV=r> z*$e024EJ};b+*0PRH2boIiUQTEm$rw|D|)5~#-s6$J$_dhNFF^;It3PuFarXyqE|+g#WMu)tN)e&wZ+-?fjE z5}7v%(rkEw0i{-05l=jaJa}{rL9M{uKZStb9*hS8$U(r3rr^Z@sY!wjxL+`)&^h5# zrhKr3X*;VoMKcG2rjn9*NiPhAzluP~f@g?aF8DgtqJTQF4$nJ0f#|DbRaDyD58XLx zC7=rHcbQh3-5)5Kbk^>W%C8M6at+=F5V75E@2`7BEC&-Ad_FJZZ7LOU5w&%wKGB3L z4M(d*Uk|>YSqR;K#pjGCxg zDxK3xSo`0Uu_%ghR63cOKqlO!rBDi$f%2=9f@{TTT%L#t9|4%mQ{%+F34*Uq@hOhP$ZSXUKv zjZSyjCTO3`(^a`41RdG8YK=5HXv1Cg76#asVgC6=reJ5J)2 z;b@^jCF*!C1?tUerAot+VWRPo5Fq$qEUu>fzp~HU!F@oeSOJ3wd2%t^bSID3T`H^w zTh-&Engc2-n=4In=(nd4n@dE>JX=;tEv+)i#NoN(_kuK~Ki}%q*_><*;RaqnKwQk} zFA-fcU!eloo#HfF*y;MXG=lwXu<5nh-0z^QL%KJDHvDT$7xw~?HBlPjK}cWuceV@9 zwRl|4mgRv&7zT21#QVetufITVuT@J-Cg)o*4)%{n;l)fx5MmIyn*93pOH!QEuny2| zU1Mf$eW}w3>^1wK+=bxC6vzsDl;o$UrTvSoKL&5N<)5NF^nB3SUJ#IA=#< zU~e2dY-x(@;#=Kb3eCxpx8AE3eRROKNOChf``8Rl(&mKQPt7kuHOQOz{GBoD9NL!^fQ=5 zryPS2hRFd$2N6&glxYZ3q#?TN)Sff?lc)5Cc}1_vcKvX8v*%m8p2D-2n!u^eY>99cyl_d^0&FQt;%|C|D9F%44bQX`9sK zns&DbJ7n{a9|!exo*Zlwmy^WA zXDfA8tQ>f(l@+4~_DshHaV<3i32K)%fw4vLYk2I1(4K3Jb}JU`#7H#Y3i8nB>+K#f zE+$(V+n(5?)>Exi*}|t}*-hV!ok@@)ybg{IO#=ouS=Wihq7C*QxBF;Z^GJ0K(8pu8 z!QXT9^1{d+*P5M=m)dB?vAZwSYh7`%E(QHB9l;*S|IKrK(f`p-2_qImP}S){(E$F7 zl0j!>TqiaB-a!{3yH?TQG%`_sCN0t0eT?;yeABdeIxD^&Rk~m!Wspe zYV_RW{;u<8_sIF(6MwiLqZXC|x;qFYUE_tRa z{V(#Hb*V)`;NMVU@C`;t!3vB#CyJy&OG!O>^^1KArK|Zf;HiCM^z& zv!OI*A1mRr^)gbYU%T-^H6sy3?SR%WPY{48Ln@+ik_5{27D7KOvG!+g+ zBICfLC08Pq6oWnBY}>L!zDMc)QBXBJ1^Sy4c{E`QnnvOS~ zelk?{_O$*MqKs62QOW&92Gp-4Kv>u>`J0ntH@0-yk1Af2>k+n3fJh0I^!xXYQ0XP_ z_TTix^rc?FWjaE&V4l!`9lA6f0h4*0kXHn(!B_B8ljNuK?8e8lH>g9|bf$~_vKA6N zSJx0R*RR3&dV6ReBwRqLcGsp;i$+=oQ}N8K0yoG`kOdbHIt3q50)>OZ+Z%mI2!kPM;5 z*~T%p;3mcP_H3!HIu9PCNfw}twb$l`iJshfr1IItm60Y zQFcz#4N{braC?*>JyU&U4=cPAApzTaU7n;c|cd(v|t~`-*kLBPMIOJ`)L9TMQ>-zmoyjBLP`H&H>cegpZ z!gabXy0bQD!xabV66CFmN5mJ5`_D>evjdeR;D!(`?@KXuJ*a$<*HBX)*SAjzW)4wf zr*_vnAG5*aWCnh(J6~por>vX|_5C=b_kp}*KWm4U$9(`T0^VeWLLXdhKrBj3*m!X< zb*J{XZ~2*jMz+WYgl;Qixw?982B+dX(Y%LuhQG!_Y95~Ot`iwja&Z|QJ2DW=^ZINt zhb{scKXW!@4V>O)k-lYm^@B+8;lHv8z#Hx7Z6Y|kpV5y1c)wSO+5%UA1+6@AhFl? znJ>Aijb_M$8z-5Un09;1h$!gN@#)80E)tvOufCf;QF{8ka2WWcfTsr2BtG1!-mfpw zdq83W{S%l9+V{&8@9kYRU0B6$b%s+2yKElC)z!>{;?kPia(p{lEf0PotsWm;BP%ww zRbzW23!65;g>V4D8IX1VkvJ89kkAG|qS-mv+27i_fN5X;UiBV@csiMdj|k1WsDW^u zDwp??Qndv-=rJw*FIi%Bs`WD(f)zCxblRZ;F*uDd)Kc)L;I#7rGb3|-;~2eJ5~0WW z5O^;mHog5*Zln5SoA1{2;xqMYFHUC#2)1ccIun4m547OB_X}H%ZEqMKN?uetS*zFU zQwNabkLjh;3|}=C8bpvqMv~=ywe7maCXh&8^=d15sRb>kp;icDv`>GxHwd7}EO! zkX;1o1&j}NLt9wL?Yg=_-b)r3O))SqNdZ;1-ev&`XJmMsh{c<%JQ5PNo62M%EbC&u z&4gQIutrfxM#-t)5gFLkC!r-Kc5O`JYSZfhoR36}o>l-s1_10Y+X`e$Bl$t40o7|B z9y0P+<=i>42lz)IU+D;br7j`W7h`S;J~yh7HUL_LSuw!#9txPt(T8TsS-`Z z1Br%8h(6&i-5b}%k+Jzwa3FnA*M%=sosc-PyrMp6xIaB?%^PeA`jcT%b8nYh4UOe? zQKZ^+2yRo#rdJmw3P@+dh&i7MSXT;6ICa-*G+g)_>Tyy-Dc4xAma5mmO?-!>k=iL% zq6T-t|4N>@mY-_?#R}cyJ=*)Q7V{hiPWP(1xw#)O`r*&~)!i}Nxv>!HwQkt zu_(V}foK93yYynytyq9SXKgZpTTrh`+U4NS*ILgBx5Eb}nB7D)N@@CZKL;N6gs{dY z94eJ@Jew(>EYn1SUp$!cnn-gA|x)LxRp(#bh>2JL(Ko)Me+> z5H@2QjPH81(a_+^AMJ%7YmWBm}UB{)yl}ND=}<<$3Ebud>390NundKx~yS|6nIGWt+=$my`W{#|pC{ za470T1vqctq#=c6^q{-H@LiZZ-=63E`7`ETgCRaPW5S>sqCZ!rSR(c?E(n3sy56Cu z2qCU%_BoFUNx5?>>9A}>83I(V7-F!unC)adqYY&Gc3*~i!YHuK!>LDw_zRkFDXnyZ zD*stkpZUCI_UWl57ra$;m=py2^TUFY0yQLUDh}?C?Zv>rz8^7EHGk7taKZn*0>)ti zeKLBWDxu~s%Ybby|7Eqy1}X4EaB%Iuzq>8xuIL-xn2;MgJA3ZBMtEGzk+(@KK>*F0 zJ2tzrmJurHe9gmlZ`di8gn$g9pLR4d$91r5#l>Vy4Q86dd^gm5t{9BLBMymH6$eD* zyADQ5FtkEaqZdbmfe~=~9na*ML=)~4vc1R$ax9ezv5hx?EJotuFD%T&f{rseJ$pJ| z$HJ)C>}ZySyRS;x|1>3lL>#dFH-h|4xa7cg!{O}-LP#dj9$g$*{SrWMT>?1Nu9*Yl z2qXr6R&fl~9tVS<9i1^7y=wEux8 zT;Lpy3WyqwQt^*Xv~1KKC{TtK=hLeUrVAkNE(kKN(|F1W6c5nAH_9n1BdHTkwy3zo z*5S>S_}NYu3O=GI?SJb;<9Bj7U#D5~V$s-XsIl&-WMlzr@?G2RTnkqs#essKUI1KM zq3%vVu>t80oi~5P;+Ppo=DR(tgU7Z525CD&ytY&MGE#CRz+rsz%QK=00K|vkD-YT~ z>oTh$;SS!N!CR($n~=#!P(had+dw$`ci}^)@DgeKrMKtpOrmeM?kXlcpF+Q3xSdYPa#prT-HZ@W|y_2L>a zYN|ESVh}btzwPf|n#RKOn%o|^)45;o;-c`kgUY59v{`%M3`PLa`iWKiZ%M#<2qpxe z{2wmofivEmK1EoqJovtLFH>6c8`q+>n>^4*CTTaAFJ&yCEhSK8IRrH&Q~vMKVTIW+ zjbxVcB9oLA)SE1?IzhdBlMhn@m$cg*#jbiBY&D>hZzBuKbrHW#$KZGPLC`-qU#boeLD|jEyv*~!?R!vmwb^T7dHe|g zLv84JNvUMoP8N$L85Cv6tyT#M$m=zs+@Ms_O2_lpyn&c(|K7jKxdE0avioP%y|@?x z(b*D{hwHt%$5FmVIyF#{?^~Df9YcVK!;)kb!xS`}Gq zzR5s;!{aj~*i#KV(RrnUrF z!$RMy>j46$TR~plQj?;GE(IC$ccD04oH-#tJ%RDQh!MCtUUVMPK3;KgwSoek`5!>X za1SP2^H3@7Y?Ptc_h3WejVl*;uximqcliL`3dKm`ndS`SxU z$Bz|ITdnSIc<)iFYAKcc6o3oU7b6MGxV$DN3_OX&`kTH875f?_NtFiZN|&2?!uknA zsCQzZO^0aVUKG?5v+Gk#RlI~b{=`2H6CKO-S;yZMX(X%$tWL+hIDH)3P4>>?cUSLT zPB~dz&f2hLBj3FM3vk5(A8>S;3|7QzZYNWd*D(3tHRGI0=k0~XQrTB`F1Eo>@Cu|t zx?yrFDAO$$Uh4Alpk!oZP=O*MscK7=vNeVrtZ?>CPTb zF$OTxZVTZ!v+tg;h2)o5O!+<1dzRC_S!{thc*8w-acED{nC z>t>C$7SC5~r;yzm2B=Nq-(D{)Hmy%tqocG|xLXku0(K)Z3&P3!V~V=Om}dmEUwS7d z5xetTl8mCVIT7=}P|>|P?`s~-Pgs;UBlv&={bR$v)>6cL=v>9snArv!CkjV>GBhu5QuF{^GbGLyg6Y7DVZ!lS`7 z$u#M>e7b(WzJfCjrc}j~NUvSrz2K)Cvbvv&;E2>B4HtZL<}hOOz_^^R0(e2Q$g~;uY zNZfq2u`10j*z5jcqI+WUuKPh$$+XS0&m70(^l|8VBdtWx$9&y?me~8z??LqAr`~Ib zMhKozK+_E`V%c=z$~@sb0U?`UGOPiMo1Wo1y2RMZBrfOATvzH&-LmK#;@<26G2Ha3!y)iO@O zT0o~dm>xQX%)kUHD!{)#kx?^LR6gVaUVv7lG>uJ*koR@+q5lvjggZU|tcv!WvqY#Xei9l1sSLlWmPlN^fzjZ33k?niE9 zY`kz#9F%qaRXoYai^GEczoQZcg_g-(7vdXwS&7>7%qArfjCK5FwPvD&-E9~F=2zVG zw8n)iiNTrsq5TY^O2_N=49aAc0neiO%01z)4@t>Lfvv}^=Y`WqChKkt7@n8X8R4&A z1v@DDyxJB{f~aN@nd*9x^>n=W&<$_HrfwshY<<6mAf2IT%ZEotgZ*^#w4v-PRnJ5c z8y*@80s#;Wlb$t{267~+f|`~V3|K~RVKTBQLE+DCQ}RD6l?)Ag2e;nh*1{&YUoJX) zj#HBh#vZZs#q*dOHl8NaY7q|YfnMRZtL2-h(=68u!;`SS(+thJS$J+uyMq^RSX>rs zw9z_?1)?J+Hy?qHl8ROgLr)Yk9mdjxgap9k3Bm9lO7B^nGvGEakR-XJd}j9>NgN)k zR4f9_%%*r#(-X?yKg8G(%XUp*UTmN3jX9kFWDG5&3JrY+taEuRv!6#(Q=!v=ex{<4 z-*$FYlik&&lv&6d>H-J`(ZaWaiTs`T?A5$?{xpxBmUJLYRx zEVYsh*I?tBXGTjRf~%#qcz^wY^6#d7F0)#3?pDs^uK%#!*IXo}r#F6#<*#Czn(RKQ zBl5U@;&R}d^#1|Ay7s{LzGrfgY3s>gYIh}i0Js$LJ&leWGkrEM^Lk+~{;mVO%nxo? z5!=ek=S{;D>vP@-zW~TBy&RN3_5BmvH?=k$>EO>s5ogbL>AJDN;haTk;0B6g7PxvK z0B6%+#^e#D5YU{}8PDH=kE(;5*MsEzPlt4|W!w6HPChImqtfducT++`UG)<}4H7?7>yBdtudRS z024TNF2A{M|MCgwCx6+;K`>U^kj-Ev?6z*amz-n(d_X^rxiC0jmf%I(G0`ap$Ar9TR6F9ocFFKW<#kYurPDI&An4Oo!tsl(EQIV9j_!W za0DwB;Gt6(&5CVwl*NTt#6+9U3dRVGf>j+xHKVP5<`8yg!P>`u=>&uXPhfz`zN8^~cketGbxyGiHM zz#`k=)m2Z~V>FnSt>+R!ftm>b8MTTM`JYO-h32%BaiWljXafxjA+4RZaO3=sIY}UX zLMSm#HQE`-^`PR}Tb@w{*|8MC!Vi01M^wB_|0%nK;-m=Tc76zr-AG( zP|dJ~V=y4&UkN|XbCU8Wrduz;tP?q9ed>L!<)Pd0hqg8n<z}uJTzlew*I1Ky2PGUJ%{dAe*^;I}J2&V18EY3Ms}LgXdP zs1VSIvElVR2y8v$fGSKvtWf1p=s-KX1YM>1Iut4wmN?V_%=XqlAllRz z`pxL;b13D+JD6~zc!kvXjz z)|5Fm9#p5PRM=&p3#LqYlg&qU)S-;WGQB=NP!(sex-#I&Q`gkyolKWiiM2O-`>FJM zyTW+eZ?B}W751@58dr6dHklsM1ch_qV14sbS2>&bbo&^Q>m1HsKj+C2y&ui|?o>lof#Sz%>Q7xv z^7%cUOo*Nkq=~Q48bT=57V&3cCCZmq2MV_z$NAQeqn%lO(vt3Q>7Yx$Bj@7<+v z2XYb)F5;Qf^5^V_5Cv?BL>>)N?z>=*sK8abw>jOgK5Vtkq!Wgfo7xByh@O{$kP?Xd%&>`7;_6H@U!GFGJ zS8yo(o*C2nW#`Ojk&3#7jOufq0LJlX`dyoMg3RT0*1e*6;`e#YBC`v3prCe6D#>Rd z7^Oz^WcsK#WEnwR?5IQxl0cE@m&cWCc6B4J6q6_;?2ebF1xB`rF`j`tN+PsNH@&c} zsZF8+?d!RTF%;pwapzDF?w6z&#GXZ~_&U9?po6Tpd6ww)o!N+xZviR(Y{?p6`On7% z#^kA^#Uv6ihW$K5&`0te?~MR zI$Qlh=|OGQ3rl1Fdvck;!CFa0BAYmckq!qL>6Z@)nBr0y!V*)}d&fcsoJgsKqGlmD zQn6sh*_e#`DH^nwQu|<9oCs>w z(rR+3pCTuk1nWn_#7^evQEgAHXmEh;+(M=ny<;YIv5_CoTu2N8_XYZ&H!t9?6Zx}_ zgu!%=UR_K{E01MWBHRLFMe}~=^3H`kIHfLf4i%Hx#(}rJf`>=hA4G`da7LAs(4j?r zXK-0}!|$@(e6e}@+MCVu84EJobrngpTVVZ4@ucmTKcaa;e`NItCWdT7JoOnLHmczw z90Tt&8c3}8plxg%>?>v8o@6pQu6*jr-tAkm&h7o(go3>Fx@k#S)hZe?-!%k9?dY_W zw#QOa5+BX-hCt;?7PR+A53rcgjgdO`Q%2u7T{qu7y3lS$xn2ktv>Q*(p>OYybv^g? zjHGCrNu=-QPi%~NjDHGTzWBj)Gj4kFSk*D5w7pK#u=RQG=A9?)?ggr6l!7OsztnSqlXk29Ax zQX&5iSi6?+2&DJA1ua+GUkEg-$rhWUhKEirhba|2IBy%<&M%koy`2Yy2pJF80YMpk z$vQ4V)c7Eam3AY(?`?a0Kt<5IVzVA<(G!^TJKN9T!6yVqgt zNxepSJY5>A_3ip7)t>~32lN7s35;73{Vb8?E`+oUa%#W zQGvS;`qyDrcP8H|1erML0r1ClId*M|&Q}Z>S$92aij75CA|oef(Yp;4c$ZG{>Ap=R z=D+W~A!<=3TPRUEcvDj}UntM}0IVx!+O;g)=AIGL_bio%7>gA0nCu^QbL?Re5#uF7 zH0htfAPV(C1?A*oUlDnUVkWeOt1&P!PXa;y@tbaaeFYrfw6&dP$EWEtD_r;T3d$bk z>cyodLWx;OxjrksBM^^feN2+et|Xz(mn+=_q{e@^=xKED^R;=~S6TN^aA^QF=)j}? zpz3s=Qw85H7Ln7`q>UeSf&FF43&!Gk4@}iT@c4;D^mLNy3I)qaZ2)Var|UBe2U#%!VdTU%;8K6`0}56k87 z`gO5De4L`<%%0^H`Sy=661`m%znx`f_=gE$E)bBDZ8>%K#R1|gK)nDQtpHcy!dQv? zzs%{wDzs9z!kU5iCBZP49WO(=!cP?s1$$mNmfXV<5rq;|51V33rsq@89;?j zMuE9y9C!EU6Jz%E5%iWTxpw4AWR(;!fVcjiVK7L@VDRosTTn*Eo&gBb$6miD-^$xv zdQ!}%VSTB841_mVYKKt=v$I5kSGg`J(Z9eR2V7KnZBbaEZ5S?mKi3jgpdv z5sQl{sTb`_)q8GU?k>qHd;8~W?FPvNr9hD`VR@rSBGNw%x#lUIc2>B7!NE|_(D0b_ zg1%3A+P-f$hKz%I_Dp|Ac?07VhB4YolN$J5H`ihW>?^E}Hf06gn9WZ`Xx!!Zg4iq; z)@*0A=#!=DL!+aso4*PjYVNxcSZP$sWpbwbto1SL5yWOIL9xus{t2rGVwLy!_AN z+{s+KzYSF|?+gMTAR#Wm_GXRjhH`t2zM&zCIq2bncSHlSNR5FIAinZKV7~Uxj(x{f zf5ZkiJfG$`RAM@gHoL&MVC$_{%=pd~DLXJwiRe43?UjBH?EDOfB483p#6$bmZ?#tc z_0nO8s)%46)X>ovF)mKgaI}0)$LDRV;X3>mim1qtJ)=$@J=b*3*K!~+pS{b`HacpF ztK6Zj1$bfu9%DuicN`mec_u)Wo#H!S|Hx30X)EPN-k_|za9&Z~yx-qY(5hd?cT@6- zUmnSLEQ!r(T09Yt+qtpSIO-VJgBjB2{vdmZxzw$O0u1xdC2_DbG>C)*6*C1N`OcAv z&QFyeQ80yTf^n2*vY3Pz-+wFQ{ihPU}UV1ZB`)S2 z|Cw*OwPL3fJThe}|z)#&9>q5%N3k)_Ksm;ddFYiM|Ey5s;g z@ZovOR00sdX#yD*7WL4Rr~KEiU&?e7*dPWhp3*4(q}|+g7Qls-${vB}ihQ}w0vJI8 zpz^O%0Eu4p?Pi}5HTq?n>lzEpy>Z!`^}l~F_e@_o({6NaA{b4hhDSh104HIm zXa<0Vo7C2Ip*|4=gks9Vs|)e~j(>k5*ARCes4@KasrQ(Dx|pBpCps1xkAhc#v+)l5 zxVNx@-v1p4F!yJ=9uCIFNf|%}3-FWkwnylVAt1ALb=mfj{lh4YD#_zLyR$0tONH6;aw-yaaKS7Hj?hp<3-!?n^47Hwj{ z-PsyBH@9T8U(LAXIsgD*Aua<>?`|g9cKt_Sg8Z-)Fi}UVSN72TE1JT^Ksn1DV6#a= z0^wU-Q{9j^!k;LsUPXPizj97TMK?DE0&LDJ1B%@IypadPgI)EWiqUv3IJ9pFsIN;8 z0`IgvrOR7z)_+8OsR=+{Z*Lfw_h%Jl&D^@&{288hCJa*-3RGPFTNX=PEwYW9E6Nh< zmL0$8=^n6XIyyQ&@7u@S-5*aWeNz0~o{yCo!|E*at!n682tX^4>$6z_oc9Ufv_3R4 zlC1akd@Bd(FLoc0o#Y8Mh(W@}wq}Yd-cU{mp;PVSvwq?8X{fT@bKu|8?)LV)Ld@fQ zp2VQmd>YSl?p;Xx1XpPyo0N!}v;$q>X5HWcT>R`S1Al(q97=cPK9e~gP+o+Dlz?C2H9(I$U#R!yFm4Ti^4~3_nLm+1mtCbhRo!yo zF&nN5kszb&{JlE`w&V4=#k0qxM4;gt{@xEZiys%WSIk^!!M%tuNN{n)JB`i_d=uz? zu)>TTFajz?$)nDFKRZRAbzM)8q z^#;jDHo5*beA_KX>i}o@{hJK(-(Qf4IXITWrh$1DuyjN0zH0{RGt}<&A{NtfzH;F$ z7qndWasoJ7Du2hs!{c_f_2I$+22G*9&La!Fdv10L;bLK7v2*LCyhDLpeG>jEyvs{P zW#(~jIGh4FHL_bQt6t&)YM;aq6*DavFRynm${R8XBctFy;57g=pAG>2l11C28Eh|A zlvxWBAlKJ71KM6*efthGCf+2_Co2UW(vGzR2-q1u=Kye^yxwXqCaKAO>j`qG_!g4qecIqn<=hLD6x8-dCEIF3LX~4Kik`Yik=^s3Mi};+pytv zQDmYsF9BYC}(R!f8K=s)o zF(xpxr>t?o?w_v}*dbbtrcI}J&*?MT-cHpZ6@UuV?z~M0NJEKHKyxiNof`o=CY8=uqqUd6@y4W2!9p)KRc{iBMv@A3p_Zg7S41P)&xcDe&+jdR7 zPafdB)?0=C!kC!oczDcAO|TQ{ez(qq(7Px$P!eIDEJ!N___KZbz9*2j&LU!ZLG5P@Rua7c}cKFGGjSkcAiB7$d7a0r%bh1M&qn8boq%)GI$(moO-Jz6|$I~od7hz{U2*@0aVu(MF|2ygF~?3@NjpB;1Jy1-JORM z+#yJC4FtE~PH+tx+=9Ei&&|*OQ(e_F)!j97tEl2p?{e-vvd`N4?7h}o#GW#>+V#kw zFUY8o_~M*C&<+h82=EHP`kw?(As+Xi|C!Ap$&Tx3OMZLjHy+j7k`>YhT`taaz+ zOkEm0uDg$T>e|{ZhU>~%?4ttq8SGzbsi~|M&#UuY^L8%D28fR`sB2yW&m%(mG$vDQH=_pCVkonX;M@6BOS}fJpFloL zGq06qy?YN}j?6THDnst*%fm6Qg}zd@cE70^sNX$ztZ6y^A1JfHCkxJ{X2cbrjeser zAat*&b!(X_IZ}LN>_+Z(x+rZ3w=T45H9m##&)8~4>ioFd? zNOT&%SxZl=4Pf5lJ!^OA6H+ERS}lhpSsk{*xx0jbBA0WiNZX)@%>g|xX>UA;YM2SS zS686oV6Y&WVf>4V-BQO$i!D{p7;kO!Og6*aCjhYR?wowl%l0_x04g1Z6{;_Q3Q*&J zmZzpg;Hf{ig89|KLcQl@VGTMOA=dS1BIhEew5*Sa%Ls=zU85bPBp zr|GBPZ@^r;V+LfcK)kx`W|+-~yxtKj-+pCrrYt896Y7uil=^Tp3S@fVEvns2xx|Hq zgbXwO*o<4%=$SW9*){O#q0LSRqL^nD+%L*YJ=?xV^66%GCn|8_B&_w)$ye( z5Nd&fjNfN*OXEF!p|1N^e#`*>-(+J3t{dlBdo5^1g{ z!mCVaHO|^imDfJa+xWbmBujTljXOc!UQ4M@~t3)(0`A>ih=7!z5b=HxVg zsGGB%E2T-r%w>Ipl^N64SjX&t4@!67YMvx{H`53r_th8za@=QL1n0 z!5)EP^EH_HgadTH2+;xM_CeU z_|Sf>0X?Sxka1?z`U0R7#P?iEn zHJ8Gydxztt2~=a*nUwFZcl!%KzLnU*iS4H`Z{<=q{DwA<^Mu~Oj6@(2Hx(C|@_MRO zqj9jButK{b_m%zU&t}Cu5fFupMmc7i-4)-yk$>mU{G(8l-=Lw)^m;;rHfOm^V`KhN zjK3_P{m#biVRJo_anj6eMXe3LY~-W2(FwDh4`=DoulB(^QE+L$qon2AA$#}nwOg!@Q z(-&%epUJ1RvSg+^^QmIz?T-z!>dN@50MnMbGECdmW|qXG-Sv+PleEf+zS*f2mad|> zQ@MGoJcYO%?jf zaJtB%BFY@-14uTPV4~lg{#_RUUqfO|9`8)A<>$pZ)S9C4gjhl$@ou&h z7fjMt_h<8oF-PTkdp*CXSa{tUM{E%)<-;;}T$5TRQs-IO#!jm-Tyv{P2kGc@STWDY zs5J#+VIw)yCjZmy6)Crg%sP*N$Bw%}mi+STtMo7QN>Ezt?4pT3PAFE_b`Gl|b##&W z<$5KKk0#sMhQz)bi|grSx(^&3EpBTJrvWLN;G>Dyf-Qh14#68W;p2MrQk@YDh68|R zlg!(tfI6r*4c=chOXX|?9p4v)JCtvD*2S_5BLvfmnV^L zyOB97Tdo`qW=m$8Rp2n@A7b>!6B4AcCSKd!XNvP6a7f%kl z_x_yZ{J4&Zf%q2cEBO;3?IKM(mFuUc>tdWAC@U9Avi<6hsThL{2N0`E(*iu{CQbw6 zCqljf!KP+LtnPKlEH^=liV>dnff6-9QarQwDh8P`u$zP0K35kX9gX*jIqjW&PfAk7 zz}=uX7ex*q!hR^q(kmqAmY@3c)@zhX=rbBmpPNq2n46cK^+WBjolIwI?u z86CEzrD<$*Y>X01_+0X=;abOB-cqTP6HstTpqQBUbaZ$Z8uGP*4cwmB6P6aA1fnRS z*KJEEfPAj8QD=;dLl(ZM_wgiDhLKGbQ`%{ni9$V&>fc%#<|+H$lcWSnmU`KU%OM9& zr;#htiq!{@^f8n+C9YZch4_0+-+1d;yKf>F)R~%C>ehp# zQol8#puop-#Ynvn(oY9XSkx5Gmw_S@2d6mWEyXH%Xqw%PrsqSi{waeEGBWHA8Ee$m zMlS+NFD@AEB59IfdWI(KCBgR`J^xtpU@r-?SZ2t!m~`V;s!@2Fx5xFXpzoA&6%WD@ z07~gJygz?*`(<;~X*t{wGxB(K5{vg(V2vBJFSvqLBFvs|5+(Eu-In6&<|g&gJycBW zbWt=Rpu!J#&5MMT)-i0?k#73!wwtsEZi5lCnE!QT$Ut0gg(fd5Te4rVz`He%wrT2w z&O6NA-q%6Vdfv(az<2H^&Yuv{m>cUf&bE`9;6xgK&9FCrXRSEK+@A^?5y;Z7-|j0k zn4Z(qB~?Mf!RK^?(SHTAk%&+kw|W&N@(O7e0hsw5K^*DZn^}BChtm`mF%t zCc*LdldIo(`Rnnm08R77#dcW^5ruZUNvnG2^Wsa2dxcWR2Oe_^6EmS5GKA3)3qIEP z`ASLJnFcc#0*BR(n8;XB;hEzlu(YnF@!?#NMQ4Y=rQ>U5L&K~o4%M#owDiYi3kHBC z!SCn$8IT*H{c1S^3fJ6uK>U%KG-D4uv_=UBqEl^AER2#6f;(n~1ukzUs(5~T5JWRs3!7k|Jw^LYK}xE^VKZiIEVezI zyg!qlK}~lqBCSi$!-M6iwZ$N1m~7rJg@%z>D{X%gZ^Sn-Nw$#ru|k`}F}Ek~<&1^l zcxbbz)8ef`r?f&(O7xYGshJrTt*$0!n7NVI-r4Qcw~zY=$vqCp0=$8!JBd8CrJR&#FOW8JNWgv6}4&k*>^?MQ!k5l zri{aKp;S04J;qvna_CrnAJ{ZM6zBx2rY+Si?CqDReupY~uigJjFY0->citsBfI`gU z_b}?|6ARCkO6c~vm~wx$0<)$-Br`765bqs<-@z46LUi5L)%lo;JFJI|wROUkAtY67 zUcYGg-hEU`qy38K)7HY~fP!Pt`Q5q7Q%)WG6AEjGCr{sLu~^zv3)aXXcBz(nnIg=J z^B~OEr(*4TTJDm|o2eLYBpW`e1fI^^GcEf~HMbfQUYOY0UB=(0128v>*BP4J2}{Hk z9wW&NyiZewqG1hy0(u^CK&zJS@%NYHe;poatu|X^ckWH|5a=MMc)FDFM*L%+gDWlL zBR;cV`Z}}5EwK}|jCw1}=tyJ|?7vK;qKQ zKs=iax|o!$k6x8CAEabZA}wt;W5R+!e<-+dH*gv)h*@|ZAHJkQ-55`(kHn}ovhU;_$J!pjKq8239 z>d#~DMjujE+d@Wme`ZrYw@4GLJ?P%0$H%9|@*9~`uGSR`h|nYqp01)CFBz*`oMRSA zkC7Q~48#!y=n|I5mnAbeKHb*{dObl~@Un)C=X83+$s9et`hV+NV`CFq7w`Xqt+BMx z7nz45+SrC-J_Q_Y*BS-2G<}>__|VGv$LIN@d?77wZeBRDl_m_i8o0W@@nSt4x{b0) zNi5)=@PcWgR;Ido(5@d$c%;+j!;=W9s3_XgYsrkjWNE>j-6iFE1eDkVCuW*pVW?VW zHthAf4RCz!m_b{cSYs)_buV**o&-eLQ~kOw-8s4Wmo$n3gGsJ6u?zT zrS8N81h0NzB=4A}9 z+0qk~)JJCPuX1z(&yc>RUMsUxQ@z5pA(Y)+p~)bN!D?98keC{L()bjtFOb~Kgh{_{XPhc0Y-Z&WC@a zADHj^sO8|(6Eh_$x@rY2t-STgg11P|HS=P7TZWQQJ=OH14zhB-^0H&@Vgvaeesx9$ z#?8w0)@IQ(ODDuYd(G#oEqYtfdF+YtoaFT8<2oYUm#9cxM1p)7Mj#^(&Msl+P3~E9 zjiYRwc?%kfY4fpxc4Ht+7{2YUAjDd(G}$UW=6(mK6Ia~}fv?P|`|w9B=27xq+BKRb zbY-sChbkaX+6ma|H0$M}pRem`eU~KAi8>8BJ^AbdmtL>knPsQR*88ZA{I3rq#9gaKE>O3Ks%f4~RwcgnQNr1GW)kq{1oo28QKKdaQbuh0Ga;Mt=avet$!X zVEm7kML(rNmdk4wIeMuI4wK`6t*A18C<6Xc8&?vonsTr@EzTTXD!SNFm75l~lm}#h zQ2{TK9#9KMNU@HGkJ3A#ZG6E6zTVMm#SGtmD>!B=p^ag}zoin2&7>Dok62)?SN$I_yiiLnZxU~aF&ZS2O>e%rgog!|DF-E=sRA9LsiKh0~i!qu-A0w$IU#$Md z3XV1h;$k;-zh`GbCky$%08s(}&BOB$BJ%?z8UwC-#+HU~I zSJK}!|6p%aWH{f4D-ufo`RhGiyRrCus_^Y$M>-Xr*aDL_$an$YNSRD`)6jE%BqPVfpxy+L*#5PXO~ zs}9drjUnZT&80#ZpBha~)&4buK`$Kk|2Cjjv)(Tkz65KF?6Z{61pC zp-=5G^%T;We`8#s(oDe0lzx}mTW^1DEH*7Ao!Wz&u`RQUO{*Fne0w%&@{1Dlk&Cil zv>G`HI#hovyjU{7b)L(0JvnWn;1KfLK zA$W=g0KU!q{)mr(-N!^x$|3~_^ZX-ZG@c_wUIFkJl21zHLc=}$5xGd!25NW1)oa)l-ssHj%vJVeJ%{X}))dI%7`Ro6LUhWq1e z3{Y=HQCP_AfNb>}`)9^y%^fCPzz<_FejO4?BC3)}sakFF%m4+!z=S29F}KY2TB5OB zZ)_iPSzU|*Mz+_lw;&=m0VssUwV-mzE=gy$S_DQ|stX{Oi}sxXwbUOr%4V=IDfAOD zJLC`+pT>LqFba+_(R~s$7Sgl{^hV-HH5W44sEdw9Qm+0g9+{f)KEd>_&X!3Wu@K?r zULdIn=&hXGPc=Gh?l|J01>N3XGC-nO5L6qTMyZr>mk0Ih4>aRf1m6~b-&o1;k%Z50 zgPn07)CK@7M`VrKF??)HdY$$>xAYRia5<=Rnm4Cr*aNMR7;Tz8FlCeL^2rn8PTt<{AK9jm>- zRvlXu5r!^$)nG1k>D3mBsSOgTD+azO{I=D6c)F%3L%Txq(3Wca+dP@ z(F)k{e2U{rDD_*~cW%rW#nGeL~kR_V{5mw6n zRDOU-dfD#a2%tLotUOa?&$pzY2q^K(hivTs~pi3&5zT$YjXrG`uLrCihVh;F=l+yf@%k zEkxn0YjeJa{hry?i&C%k_?`em`YmM;4D#P-BkoS(5j;F4`WITQZj%*f4IC=u7^vPY zs}G&}qv5%8@=??o1ktfulX{Ks!3g$Zkw4J7@B%~%GK_H&CUF1SjWK8%&fFVl=s94dzPm<+i1D4aDH^IM|PL;i2bmYO^P z_2;PgYmMK95kN0|F3l2j(f1F(U!y{u&%S&1g-b2&+GVZjp3mm)?q{K(_|g&Q&_f>@ z!|T6}QG!?yOw~Nb?|4Q{Go?iId;FgXEX!Ej+eH3 zZNf13uJ%+ylMmQvFdmb$1zHXclE~L#phGYcPu@4zq7n&`tzVzcm5H5iShodz&QrqA zdOPnNOpWy%((ZBYeDP~xNBySJVU40cwdIE;^drj{v7n!-Y92rxZ4W}WjKDwTciSky zdtLfCn2?|>!6!?w%TIBAkLcE7K*-(8PfK~ydGh>+J_)dF=7#)7KoGe=zow>kfLHDU z6`nN2^YLb7YWpz!uk}cjF-nO#M6x}iaNJOFKB)Y_6=? zlgp`EYa;}Rt0p(8t_Vk`mV<*+5*~bB1IR%}wib@i2ns+-=){Md)D}LMn{G7nGQ1N+ zKwLw7I5{nCfB$%{wNuGdl|CZwJXq<3v(+V(n0)e$Znq!pt-HZe0_NiAQU#F*Su+dvq%nQt3p6;c+<{cO^ zddsuz_?vP*s@u;m@~yOkb2@?mc7#sxOG;4N@6YfNdCAlMPz8ThZc3VeJ#Mu$1stVTj_8a|6z*TaG&tN>$h=5@&@rJy{}#` z{pTSdeziZn=AmKBPowGX&RH07b7a%xdcRnA<*IA|$g^;85=PAW{31yRT<;YVm<5Qo zk`&{%4{`Q>Z#}Ru#Qf4$SHDSj%a9u_Kc!fu>i;_h-RmO(qt@oJ|2Cr1alIRWu);5^ zZim0fh755*O_sA;a%}x6OgiaeVPSBslVciHD+Q+}*gO5k;&f!vi}M*=4x6_`By3He>$9m1{@{*>P60>Az79EB8BN!TwZ(E=6p^2fTI5~zKMOBFo?D8jWRqpEtI}=H`|&k1bzVS|E1YI+cws7R_G$GQ>H7js0K9T4 z(BRTM-+Hg=FEOyK&&P{eYoNm#S` zRF!LYqc1A{Ba5rcS7~ZSPE*Cs>{9I>L%YMfTl_`5u_ORGem-OVO|6Eq-A)g zbInQq7IG5YSNXS}qJKlDSW%1cdL6x^K`pe`j=^oW9HL!TDAl5YU>y^FfkGND^Y*BL==5yYcG4TNB)#k~>17-n<9|U!OF!f9!bd zJM}GdfKV>@1Gn#c_}sg`VxMeQqSt^1Rv`N-(o&xgn?n4*W(#m4fu?G`Mc<+hI-cD|zMo z#a#-fp}E>*i89&@p6Y#KfrzR7baI7W>!CuHpazhMsJRs#om&!uOyvC9E}S+pHd=mU zsuu%N-u=*>1j@Rxx> z4r2<~j6LsgeEKQ{7=m0?{Cw9Q7DV(1C;X88v*j%CURBZzmk+S>+ zXrm$2MefjPr-L>ZV|3nJKPE5(v|V3|ze$p~u1^BW*J>>z2Pg>pJAk(FkrP7PG8O<2 znN2?}D2hffeH=h0patD7qaa7xG0lUGy7LMVL+WBhE=c?3g+kHPCNOfM{l>;d@<=XnGNc_l7xiXKR!Q@rF8^t)9GY?JVYC74Qr%k z`uY{{G70+U6H4K&;X5P%uBgv05jyKj3` z0&*_!tyv4)kJDi|*s0@uo>D{Gegj*aQ_J?bS(}L4OWVlgvC6lDySB#%ZWf$Ih5L)` z3_kBt$9h6s9=@qrmT@{P-Auv>OvMISs|U#YGZ-}OyPTc5@!OM?wH=&KJE#ey!egzw z(gyn9A{|#b9AY?Qno1c;>@XNWut#_toC=x67)#-mU}Jl5gQ-+3lY^6CP0r z{4RGGo}mR#A=o((H&39_M79u}z@$GDXp)HYh))h?@CiFKz8hquDfBD`!= zC`5t{;L|)HSd*_TEU`;C;Cm3q$%zF}9j{Fv84Z*S5$dUujBzcm2{~qQ&hi&fMS1Xxz^YGPVM!iU}tBY;AEhr{~=Ge~74?di? zyM!acfuDV;ga?1I8Aj?@zN>dVezJMIu{&3y`xyMNxlISi2)6kE#E-vb)`j-h&O9~B zj+q$ne_3g@8;_VH(`i%|BnY_R{_s0q{3)YRna$$@nW%Kvh6!&?hR*@Wz_JM}>#;jT z!s*P!{^%0u-=E%%|L{@HckFz%EpTiS@KGfmh_#G#P1Ne2w+6psh6`r#d%`9QnlL9kTmq! z_W*{DXScn+HfVE2R_;s!Zs0H%Bi6)1MO%w(y zV7V2-1Lebf=f9crcpUcUas=>_wnKO&WJrIZ2%0w}4ldUmg@wwTC;^tx{F?-WEp zK=AX|Z5z`+f86w6j+kajS;Bf764*7dXeVl7BI+xu*KR!l*Mx)-hje^AD^SbibdD}H}9a_rt%yp!BtxHEXWvr}k3Gc_@xsjHh{ zpjfP?t!=+_Q+2vLLyRo!t;22Lcb%2|Bu3RNQCKAQ7$V?(bGNV8UzKsUr|y4s-wjqF${^O;Z(Pfrc@UylH=*T&EuN(LXO90k0(g zO1i)%uI_bdIH|$z(8^R8(6}~I+A7X4DAq_$rq}yk`DFz16D%nNKn~-!L9@&MvggYy zpq^aWX${4ntaGnVh505dki)t!*@^5M0z^Z0RSx#^b2OQr5E4Wu>@Z68e4tvla$E&xbG>aF%7&25Vadz1*EIOk=y3 z_s{Wm+ywTqmJ#YMDv5q^N2==THU?+@x@*u7mS|9hf;%M^x@WgKRYEs=J$)=!NUyz{ zakJW~$@fDAOs*}KrX_imKR4YKQkiegL{XP5PS5qLGzci^_-X+h(INg^obQjZ zta3EV^lb7dZW3?<(ieFv0A7s2LP!X9ct{d7_+{rq|EqvUt~HOCxlMGc1*?JMx|i2N z8;h~@N1)it_jcu776qkVgb{A*am(d;7?IUJ&Zy z?eCzQxwY^_4KeSn??pLYI}{N>HRnIqhafbFDK>0k? zfDeWzZ6VWz`&7Ngkz!{f1(eyuqu zcVTM3xQH4Pcx0bu?<;B3ui~7l1EjlY_2PJ^Xfj#6^^M#Tdx;vCzVLb_al#D5;V1HX z6&T@SAWlu;=z)9eLPErWO1FQmKiyauBC`HS?4#>|*t$FBe|5YhN#HQ?1ClDoBRbhk z%jT^NYjUM*4hNk8gNdAatliRv)I;}4wcf$aQqh6?)n2?{4pRemFu+cPL+pRy2~?2% z`@eyC@L`wP;v|qfR`7c5we9}X^KCM&QTmR05S%3;__sb8uy8*&TUtr%BmjkAre@n) zTRV1@W{7%>bH9b(grX9+^o6gNl;pcF`z=ZBa&Q9W1BWp|R#s{M!_(&`mQ<9rZXDpp z3Ed24IJEVj#wBV_1F7vS-Y10=N)2{6DM{8v%yfKQbbNq{M`v5x*RNk|3LE5k`ktJ`_m;)27DdLZ0`!4WPF>FCAfu zjJuWD-8gT$4#?3CNnw&CIX=T_jLw`{HA;Q3hk^ zH1FP_N%;9CT>~CgvPLF&!A+9T?<{6cKRY24l=Yrr{Z=s3^)@JugPpwrPr(^3CFQo& zJx7ox|BXVhU${hBA#|i)v@^9bH8%$F~}OsN*C7Z^Z_H3S~sPItiqZK8Yp-(ZJnYCCGDL?nyKPejf-<@i*0PZjw%#Z?>535 zy~(9dxT7=L*6I(VXC3$Z8@PSRz=X+s@<3OK&sTYy z&>A~%t?w+E(-+^&CLzx+(t@$H$(Gn^({TKtO+HWS58Gh$erN?bZXBgyv3@4h4q?$N zLGz*R?f;!AZ3R`Kt`k7^F zOB-HkAFlH|5N^_eb6HF?1~4zBkL;uNw9;4HlMHbSd+*7c%PMLDA)Qih_5ClS;siUc zx@#4LuAv=l1zGW3c8i{OE8#TCbs03*mYr~Ksm}c7vZtx+d>6K)?&qkdl&(7S7((})m(f#m%E)W0RoF5u=NsAP)a@T0oxH58rRYCFKJRBeU? zVqu6T8R<;jltK5r@PJ7zP>Kp49=uPzx3a*3Z5uU+C_EniJrPD&O zFx*)oFhRd(r_JtuB5CR01;fVfj)JQM%*Ngifegkku7W=xGl5}t-u<<#we_dl{`@c& zKGKhkX3;1?d|GaMvZ?C49yF1EzG)rW@E9DTYdU$*iQ|4qk^-asYZ4~x?I9tahKJQ` z7+Wtwe@&8CwLN`3-@JLZD{Q3Ihj}Xduvb6VgY5R7F`YjHjGWr5=4J-F{1 z&QbF~fmI{s&9ufjD#}+x@g*6E~m$8K+BG(@s_KiB# zY4ipi7xyXpuTN19-TIv@j;X1I|K0|{+5bKm;uEls>w=%{;0Szf zaB$TB-+gcdAmLADT5GS&YGnqUf&)apy-ouJlb!wsU7=QXcFzYH#H*gSJ@<%H|Lt$9vsh^Dy8;qG_7w6?T#gvr2BB`OJ_ zkb9hdyVpkzEO_Xhp9&egcC)|s*=lQD{(GYd8sOnRwX{4ibv&ud+`e*J9Ui{bMAE4A!aTYc-UGKWKd2SiUJVn236?WXP)}V1~ z8o>dSRgY+tYgaRy7-{cx*F_&3yuVlZuiZbB$&k623*aTVoxT`A|QmZN}mmdEJ4E);t)fhOVdsnHQwK6|X z{Xaew3JyvbfNE@p9KIERQ1{lVB;%4!XlR?gZ*#y2n3$OD=tSS}v7Wo^(#@H1k)Q)< z(eAM$?Sp`W=ot=<8IJk~H9Z}i1qpX+8JXdaA4lj%{#$r|+_fJ&0Lmz%_^-WkAr%6Y z|2{zc`2qyQQ;GoJUt@6LZx@UVz!NnN_%eX{7Py2p|9n(aL+<|j`F-%;&od|c8~y*@ zH*X)^bB)x{2ArNAbzl%gLPS0&e%=%IidroOBYe0*%JT|@f%e|ji7lIHSlQGcB|14Z zfkoU!db!MSdhu4!aEoIoq5UF<_Q_EZV@#D!rS}y__LHf3S24qWY0IXEDgn3Z6@QP# za~m$sg5EPx>sQQ&PH9FnM8vBk(uBn&Y05z>s`)(b)Uh zh7MKMd3e|%1QKBw>-1A}b>P`Vwd(#r0)l@N5cGaPR+Wb<`962WyTv+3t73l^79m<=f>15S z6b2&@0s~r1`FZ>nNr3caXWXw-=lED;d(LlQhv~_pMK52OBX153<0Bo~qhv3Usy5V( z+P5C`MPW=mlHwT47F=SNiD(4`|8tqwFB_>&Z)QuiK<|;FkcshyL-t}#A>TS?wM-g% zzuV5#BVnGO7!01Eb{ubAMB9af3Wz`-i)k#X5`)O!>%}Za|HN4F)o3Xvc*CF< zWoLj#FrikT3gMK2Jm5t1#;d&sgnO~)+Hj9@7?AP3vhp4>r32*E)_osgi_?L;7Q(oa zOkW;S{+Kn!)q|!my0LHK<4PJodPQyC&&(D%`4+TXX;U9sR(2C}Xq}A1c$k$@$*0lG z_1&hBxd7o!z{EuZLdHFnY$oHyc5a}GK#Ci0*=$|7Dkzyu$*>My< z^~MqIj{9POu^x%_<6hShQ`02`$@5bMkUoHx%j8Y8F+hl1yUme8)IiD=$z(|>FkN;aX8(IT~RKW96pf^Y!I!?w3sF#NdnFF zDY;0L7uUn0G3S!;H`1LtfnXnH4LrAqr7F?;XobS_AK7n;m`?-C++YceR%k|B1;<;h zrU*>^sUkkzFT`zPQpFFj&6B+#8Z_j1;>@Fr?~$|HzoIRjCGOst5Q{Lz7~HS9`L29} z*OSv|)^ACDkAOOsv33EuvN1 z@_INONxFyH_$xDdzL=fZrt6Qe2yc!}^zdZ7l+VRBuWDX{c=K(E!Pw4fD7M~-Yfhrp z{c`_|OMp5sE`?P8jLY4`SAEavez(}@TYA))cf9UXr1N!OB# zv1FFaOT@4GM$TL zFGl)01x9CJvt2z!e2A{QqdtRTC5?AVBoTw%{cq4r{4s)um_M|*7+8{tg<_cYhD!`q z1|40tAx=yTQQ@8$X5EC7e2OP6XorzET7@yYfhG9B{2Tbqf6gN4Y>>U5>?+jLmMFi* zCT2D!)-nOv=Ci%2iWiRhcl2GZF*cQ(S{%sFu5uLh=R6_~){CtA7!a#MAw<95B%V*z zjKHTCte$iyNT}|*Oe(KuW_@5hkD9Zsh^6LKf`KlFK`vjVKZuU<>g7PPr8QiBi&D{9wpWqjl#83O^_{KyJ7arL z3_R4=385lzGB{g1@G z*x9*_+p$^%i1#K^66_@^T(Z4J{klE1*6nq$V$5cn$h;k6M zdITBWs!9Zp{vGyfI{jDlJJ^ak1NC&OJ^a4>4{qZw=I@?^B&o_eFVX-h-UI(*mz#}` zyj~Ne3AymOdM^+|MtY~n!Td7Bv)*B|Yif#Bn;(>{AfP@;IK)f6EGL|iCOS)XF|Zf$YVDNFeeX?hANjBY#nST28L&Q5D7Fsl=%s=&DrcSC zkP#CHzr9TLnPN{EKH>#4C+pyYgsV7pK6|rnA~>5b%T*eGX}EqrTz19G_Q`V>rN{3Q z{QHi*W#Z1{b>L-u?sx91l6Q@T2Mqp`-n}QzFG^u6el67gqP9*=WrC4@%h{N8$O&91 ze8xPuhJ14FPV?x7{txf}F954RRKM@({4n-?-UX}x(OR1|;DHbtl}E-JYn@V+3!K8d z3$8ZDfcJOZDa^Yt@8SdP?<9_o@cqY8hUmNQul>uf3QY0q6(F%YrT3NhkeeVh=MGs~ zY&QJOKYh(s90;J@+DLqG5u*`$AbR?kt<^}dy?q#yek78eyEuegbaTD&@{(vwW5UJ_ zHexh3qwjrS_3K3D%2-|#tFUx=g@Fq}EUg7w}&$g`AR?;U1; zXAlSk28V`V1d_FYMJ{S$t&|o)+dz=En>r{2;(zcp&s|Djm>Nwa}`hFUiUQz*h&5Kv0{k@lk>CIcWak#fwlHjR?+J+%q;@)@~K2yl`p@ zxhfFYA3|sp2n1If2!xB{KYR++3d#^YaSV%-*2dPl050`?khV(OSz`9DvM;Gj^ z_1k~+zXCoZxI@8&p+I-6(g9A6AP0Y-l{r9ytOSIRKd4Pm8%VMR#^)gV3wWdcSd4l4n5^r{oy$~&?tvEmr>)zRPfeW)1hKb7xz zp!&-`E*rc2V0(@*tQZ6WAwd`j1O|!#7rx}9Z6L^zS;!L(7=ieY{_prNeHLpqv{V1z zude*ezhkei0q{5QX#!#kCS@29?o6cv93Mes&>d@KQ!*(ZC*Ff6-9S*AV0?=G1qrrX z#=Rv*c_3u+gWCvwClCnMDG&(C90&wv$N20ql&AW=kGNwFpV)KkI`ok6jf==7dh)oe zJIT=lpTX-G5LSpskDzCwXHO>WXVZ{S0JJk_vQW#P={cm^7KjM(s<)4RyNQL zVh8r(tzPqp5Yqut%)}ss1QG{`00Bw%-@O?B&)4|i0?y20dNh9XYU9<*@%d|#m}&$a z0J)teB+@E{ckAxGg7!nD!;K=5>V~x-DF5&+1G?Qpz>C+Z%C{qdpf;7gK=G1iML&wnrjW1uQ{ihci?=9P_E4s3xx;2Ya(TQ1e;!t#IzWRv= z&B-|wvH7pQ-gx06X<)4k5@ZO0bW4u}A%OVyCJ+b-!ayLPFTHEO_^uM{R@FKusEH(K z3&`IFeg1#{>U=l9_NV@P{Y!5lg=FiE?#JUkbyYEv2!L!qM+w4#blm|0!fMTa}wa1i%Aq2aE+Nd>F_}H!b`ytY>K}N3SX_qK)};~^%#CvTORF!ecgj9$?%V4*yj7NMYHO}&@RPraf**E zq6=Ev)ba+pQ~jPtA*&2-{9jlBycNDoaK6ifYcl^7?n^z$#$ccyG7Vga$lJU1LuK$VuzWihV z>iS>%G}i0b#rmKAA6nh;k#qZFVqG~n1Og#J7zhN26w>=v(6lG;{PI~+%C}C}tZ&n} zrd-R$eU82$l;RG8#Xd&8=o9-Hh-aCeRJsJ#?7(qpE_CwP>_FVD0uy{iZIvQzf6HAnvvb@F9D^r|oE#+=D0 z&s|cRvX*3!o}#oXRUa(FJ>)O8vV#>GL&rWE@csui0~@5|O9`WWm%^%k>E7Tyb$Ro9 zFUW9E0TPNCfYO!^ZwB3kKD>J`U|j1~A_T9TJpoVemV} z(Jv9X7QXW=x>NsuZ!|A=%e^LVy7KHPK~RfKt|~1Kef=VG8F}iMp!U|XX|EI&Jb z&DQ?@7gv79->&`V7u)*%)a$kX{VK?v7Fi)V7zl&}VIUB)gk(}$IXs$#$QVOL#u1?; z+{U*^8V?z5cR`e=-F^G;M``Iux3w*8aYxalYb}RvOKJT&ZMm~t)Ri7WAGxB;6$u5X zL+LW+-h`m;Z7S0?2@uF;wObbs`b!D7bsI@>I`7{km62ro4)3f{LjNe1l6)!Nxr0&Q zu8V^by3fdh9v#wTwfq8YT3O$f)5H?8QpeJ*^AhT<-K`1e+(I{j=eAaA*Ta`$9dHzl zN5$gWo7#76eDG>h!cFunQe$^p898)Cm{>rBoMk zNpwg;3GE$VSmn6`-7DTr1>@L%^e?3`RYM%GK`wtbs433`oHU`)P-Zqml9>ac%Z@B!f381JMvG=nkUUzPT7b zuz{|_IQSj+qdT?#`SRxfd>Oe^zyHxxr_kk^yltqWyNp(zJmJ@GTAB=>#cTav`3Dd> zs?VQJ8xgXV)HXrjI6IH=3c3?tycI9q!Zst%o?eCZ?!AiKoqz@Ga-#olMzNDD2tV2XOEp0Cwh69TnqTx4^0k8 z#j+|?$b!Sp!q#?7L}jhn?r&6}2|~8DF5@oR^(AzmSX^nn z?{^Xp6i2gGcDu-8uR|*7VxXKb8~eKs@_eTlFu!rIk%|XY{)t)rf)5 zx3wM5wO?iY^(EvIojuH%QM82Nzjdc8mY-Tg7wnalyvGn8n^RjC88e2qE==JA2)}#* zKG#Q@BU8ww@xnzP7PVq}e?u~}gQ!{PHj>(Y?Y;G1{7>RHuWkO#&+6)0>krA+`XyS) zLgFqH2m~q^D1ktLfIu?yEM(C@pwbuUT)ld1j{coV@p+oIY)$(;9!n(%1rROx#F6OH zBRDy0PR{Y<3}(i(x{2itTwB*Sm+V*GwJ%?RmFqD@ma?*v`q&dwq8q1zG!z)))z*0!#nA#iFA zVdKv;7C6lZfaS z36?i>aTz{Yjf`aJ>z#1Cq9>2?+2e^K%_aMn&9PZvbyF*eQt6HB_NB|sU93whtr;Vm z6bs18siz?H2?4}-g(qjbipaCP+1$}t$@`aQUln)Ldh6;MZma{!v?fUGs6r!#XXo?A z2I2e-)#LUF=t%bULkrDfnvG14VrCT6W0H1kkHj z0PG4`$@%dlh@1gi4(QYzCl0`AwXWbOg|%1%u`3v zh0TBcjnNCZD|&aQfu5?a>Z-18GR{QWWtYOw2?AvqZYx2URl-F?Ma;o;mbOPO zTkP~rLMAEaH8_HN;ruD;vi`t>_y79m{&kPSXA=Ez4ED{E2x2_NFyEcp$J2Sew6IMF zowK0YD1syKQvs}*>AZ6(KYftzc*_5`2jpmC=%TtE&7Wu&b#(4Kt!Sss9W=iU5rr(8 zYN)9OGn$;$GaZ2Md&d8VU-E-5m={U{Q9Uirx3-1(ZST4n>`QP6>mjA{p;Z*>?Rg*m z4-Oo9EmM{UE;$;R-ZGcAb%verC$~xP?qIu|q~=X=KKlmb#=rTo#J6t*p&(qMH_WCD zv#DnyTtXI(X-t6TOjhUh0g$H-`qw|=-}HD8>>y_Ne%1m<1VO2YIO+=d!yqTWuv>J7KJz`&h7NVr!itHF9()EZtj_6G3#Y=KP@EAKtVv~taEgr`4j}su z@%{V!|J=*Z9kLqPYA8##@=Pcx9#PG8v8$K4+j`(AWS~;1wJGBWQ0r#ly(@z0w|wm* z{w+_~ri4JJjl8H2t)%WV#9sX1R!~{$GDS$OEYeb!6%i@2)9!%+aCt|rPTN*<+rO%$ zTa|MEKD`dPU`d?!XAlOE78Po)QI{`Nn>w@mG$LxLb3U;aIY@r^-{sMl^!=C#L#*@A zB%w1Q6shlQLt`Ad37(h#@LoX5Y}w1-hEvAzphqkyA?0_@%j(|PnqvO+C1zqvIWCc{ zj80%-7mcOEqfaJepRE{&2O^f~m&Kh;Hc4u?=DS;Qu@*1QI|b=OqIACL)yN{m)oa1W47z5Q^K^mc08(^Ar6e zjT-t?iaV)^>XrLk;v{(%n_6RC!$`2&+`7LNw%qfUKHASXR>% zmI(@iVC4s4stD~OLVeky6NK*Blj9%W;B>a40BAy;`=Qm&1#=Q#yO#GKA|dz;W<8$N zgVOZJ>6eeVcs{L~j*+0IHwA}#ZeQ}R?)U$DFMKvG)6lRXBn+B&5~!YaPVZet^QNFM z)ROk#2y$A<-@O~h2T8x~$@K_D*oW^0pDe7H&6p<)z0$~#23VArZqFvJC>lS1|vjuwxF}cxnhxj z(_`L0{zCR0)`FuTC^cHBjHU@-HQMfHLlT6#WLf@ekLl-ZL5Jx@tP{?kj8KA{fe~-h z6-fYtS*ttQx7XK-P=dj^Bt89IEj-KF)Je;xr9xmuL6aNYs}{SLE#zAsPyXROICK(P zmDBq3(lNS!zgluu*h!X5gF}+^hkl#YCuHUbvsu}m?|EO8;|bB7dFFf6lwWL2B}9-K zyl|e{)CHF?66mZ(CpgaS^KX32`SFOrm&A7UBjzG6id6s9 z)UmxM`J1-~1yv*j8rFd9Fp%bquovm&>M(Q&N&ro5RPS9*^NY09`Z3Bx`8sW*=A=cz zmfp&^Rk}PhT#}_BnhFOS4RdzQcP?3=wP2*s%IW?iFKD+)&p#t(v#^)#fn@6}ojoxm zJE-An9@aWyyQ#W0v}Heo+K>khtM*2e1Od%xq>C4n-8nD6rr6E|t(mFbxwK-+D7*L3 zqOo*%^u3XoHm9N-9&Lk|jotwe1TXrMGKz=(ckE5Ad7FiJ1*tN)&E2$QD&h{6$1Oxg z$`|>KZ&O@eIR^c++NiT@ZZKLePZN#gPHJ5B=1#SJHlnJ0FRSv#*A|l8sli&cYaVUt ztb{ikjv_S1QpK9)rz*&gzGsE%m{4T!Cu7-2b7xX~j*xm=X<|KcAV&t1yPr07a?i@K zM95ADk(IMk|LyUlh>*1jp-H(}rI5cIz}BwN1mRSOsbjVG2qY_SCqx}NHz1Vb32*NK zb^o)u5`@u((~beAYEUTGC7NqO+9$w&<`sVF7=|Da_~@WQ7?J*ICtyJ~){15JR)PdT zx1|0|w=hT~`&7tC5>_*WRjO1IgjK4%eshF+&ZTV%$@cCG4b@pY{aW@G+H9*K)0?>i z@W`T^(TzQ|pV>@Nccin7qdz=v@QeS;55GX{lkbsWC`Smgz1WP(t#>Y=ZCxmuhFIji zE1jKviLYP7&mPKrcCoHIvPqzH;oM;M93l!M#M#uP`X&v2`ak)F<3x~rOTDx2k>`PZ zVF@TSJS$A1C4sWmu`ME?trs~ZJ)@I`LdJR1Z^pBRozm22fx9c>lF0`Iq<8(ZOs z<+Y|63Nn%!5hw55NouV_TLbSqL}XNkS$L?35L$|9I8=vFy!)PEh_iN9WY>J^XhBJE zmD<=DT|6!M+qe6-KB1pC9s7`L9zl45ur`7PQ~2IzjBwh0LTHY#wT|*d0leFuW6y*5 zFnK#$<;yHKX6UF=Rj2BWa}ZG|8bv`i*I7T?`_DbeKf0Sd7D`K!Zf#J=gpy)$XSUS; z=q;+H4kJX(n-cq-Hz)scxA*tIAhH#Kj3PilXPCVZ9^U9w0LUoUK2#UYb1v>5jir_s zjtQuY<%4xWr@f}sopxfV<%P1M|A0`$QSVw>R=27^3oOlXIe3f&0nYnYIp>{?VsX~Y zO#aC|qKjae6|?9ZA%sM-eLSoEX+@ZE*JUE!lP_y?GaO@$29|wU5R5*<+VJ2B9!wB3 zMvEZg1g?=PvlQ8Z?DA@g?&s?w?x)vROc`|#&G+wj#@696Xv-l&BXW4mz0oPX^M~qp zBPvL;s%_onRuIT*!_?+njKQEN7)Pi#&%vzb3b=&;SruCOXs+SM7=Y8>9QoD`nowJ= zCVCCsiGYB*SOtx*`4(O{s3<7BqYL^forP0j!awHEtk5Js+ z$#4|d+9PmyeNlnQmeahP9jyQB=iqblXHSQ0L+DIt9XD$yu2(GEi`-^tp zsjV^k{qv-?mYFfRA#Z|^PqmeZ&%(lte2DnMoPJKx2gItWlMx3p+2;T;r%X}E&&0H| zg}D=TUa#|=?RIvscxv3p6+Mx6_i>Dvec_>}#;8%d=Bjgg5K7=opZwH+@KY~|ZgtUz zpt;8V?hc(DEVlpyf^jkD8(Z{Pw*)xKJ%3L8_jghM)UqT9wNOcLh!(0esR7TvL!l9_ z`ao>N$ha+JrUc0(cY7zIfT1k)x3TycDsxJTAe`PgLbnOJS`mtW&(mtv^yp_dmMS}F zcb?JDZE`P~&%&pK+-Kd0_dcDfAPGgSo*`^KplLT)+veN7oc>fR^M%g$9r7N2iG5F> zSC-$A4GA^oRz{rEXm}R6aidK-w*;5*R>mnVp zEQW}Ryltubwk7(-vYh5_&oq1C2Zwe4CKCbxR$KU#9FJ1)cUc%h74K z8R^XcBGepL-`-XMx2lj1fX2u5O}Zam z+vWz%arZlcW$!uT+Rz_3EbNckplj!RyQ+wDu62bPqRuxqms3+14N>>o+bgAvKsqcs zaAfQq9<$GR5e`qbp=2M85%*hL)wZ&`zA0V{rq(!3xrUG;LMz+VC)euiU|HQlu`stJ zdDC*jzUpp`{@`4llPjAy^4ho)E#D2XGIuE!mV|_52kWEiOB-p|oJx7KrYZ8jloZY- z{gF>^polY?;LqthG1EdLcB&nvR)<;e#ElO_pdnE5u6+n4y17^PscDcl#WLK}%E9A! z`c>qH;t{u_HDfg+8SY~B7rkdn?qxrp1;G0b@(V|h1Gj$~0IMUk-l@KXHVUC6QtOL~ zwJ{Oo#bXGEsNpN;xxG`64Urv&G{Hw?#4^>X4_&dKRO-_)U-W-+3J^#Uy}omTRjO1I zgjK3kbA;9$o-ANb_8ie7qp3rG)4wMDW$5D8nG4JgF0XmVN{j-ki^e{_j(uNzFLh{# zH9J=abWTt|J_lVbC=oO+7XRM4YC)UMwCN*#X^7-@-z{&Ih(54_Ovb2a)Z}sTAD%A_ zQI)TPP&`k(B(ukMOg|K1F<~-&oF+M!i69g<=&ca-0g*!D#F9=(h`=1;lKR~G)FMtU zp>#O?t+8)z<+`Y8D-?-9qc(P`D;FUYIXZaalmF&F{?bqr8K|o@`kQa0?$(M3FpI0y zH@9N;1e6q-P#X;DXj)@A;^S7h$BN|Y|L(qh2u01A%k`wM#zQcPeK8x1yh9s ze5+l}7b^fqGsmOGMQ;2@U-Vx->fQMSj+{h!h`e=K5DXgDM`lj?{`HR{6nDi8CYYbt zU9L4ahm3T6(d4y{vY!;+W8XAgR$!{kVuNYpqCdSrl_sZM_JV!UjsaUcfEL$%6PypP2^QKafu;V@`DlnD zA5z53_lQH^*b<0YSvu`y?bbUrub`{N`N?_IT?w}e!ueaJG0yBq-nPWu-iy32=bHvG zOC&9Oo)ILrje^EV7pSL|nro07N%+a@ALbOkwhHKKjs51Ef*+oVZO8+Mw7DFOYZUl4 z?oZFJh!kmnh@$ejH(FC1a=*QU^d%~yjP`U$*}Z@493H#dFUH|98mA8*?e&pwtgD!K zKxFJqt=87?9N|6taAdFoZefOlRNy?D)V_KXW8Xao4Y4wNBV&Ij8t4&I<@H^1Pb{0( z==@+OEo`f#H(QXC)l|dmr?P`rEh$0p$6#6K&|yd@v|vie3gL42q}g3>CHJ&2O9x)62Q0=1F~&h4kC!y zhd>_z0x2#iFTT$86&Sh|fjtbchb6(D1iCn>qi+*)$1qE1A8@*L=! zSI>90W3r>2?`%*_wGH1qpW+deg2+V+opX9wW9!42WiNCMgzsCK#bO)e$|df$?$TN6 z4JZ^r!KjPpm#@?If4Oh?g=$*roG)*xq*amv>P4tyLS$Dz3V@$}1)&6MUNQS3zNDpy zbq8)2N6CoF2mL#r@DHER3KD>p`qf-CzOi+9B%N_A!r`&a2b!Xh_w}JMRvGbtq!@Ek3(CY(U6|PkN8NDEcXW{%p=mESv_7JyXOUp12Op3d@4~kH5$VPYf3c z5Cw<->lgIT!=b2K^Nv;H|KjTC`STHTtS->pM*2JC^y{UW++gZMW4?f_K;`R@Dpjfp z!YWm&PyuM$T@<80tzyD}k(KT{6UWtm=^PND6u8?u+4scvGuEclL>=dI8}y{GaQK;5 z692bn@UQMW`Nww-{>v|tcRnG59zvnoXza6_SR^}8o@4pAj9GtOE%cT-C>`#~nKZtp zpe06qfA~I;2i=$k879Nw78H&I=u_E~{tBxg)Q3fCx3CQzC>#9haY=Y0EJatJK+w|~ z353v5$c-FNocPqgc@H1RdO(S|(Jyb)Z?-Z5Ozq>HH_t(NIPtr;>ANa1nSucbtoVWK z9gyS6(2Yi>h6uT6@vDoXv#^cy>toc}nif}1&xOxip-$#ZLMX|5p3o!S#DD%8g&_%F zMn11R_Q7>R5L2Y(KXZ`xmUjF~KN5AW@hcR$Uq9AjU{;)l;BC@1Mh zP!#{-R%)$B*`UUF{3~0mPyoq$pFt==f``r;&jBXWY{h3!Uk*$8ilhhs_d#L(WP*qj|Ejj^XKEYrfkV1Y zigb;lj{Bv})L2tV=N#?h)tl#(RZ~=ZQ)JhI$|++S6K|Hi2js-qIXoG+gpoNs`Xu_c zTowJ$B5H_MR6!tPZEEctVOW)zT=Pf;+(KryHajS2s+PNYHZ|9lxrwxljs2Yj2bnIV z;`$ySrF5cWSXJa8a9i{{R0vz!hw2ZnQvAsZ0>a-TUl=~BXwZ3r=h-HHPJ z+1V1ZTy1uFA`zLX&)%H_C=4}qeC@|JjQgi|)O_R(s=GBiq!s|lvBI#u_9!wJOf!F= zth*Z%s#K}s0@+llQl*MJZ)z#e);p1=)bjqL#0(Zu3??Wc!1>@x>S)flB*OlaKfTF+ z^5v}ANfe7jcbpx6-HQC>7CPIp&vB_ z7W;(C%z`VZj$|kutr&nvYU6bG(uF7+{NmB$-@X>Y00|3TAkMNN}I{6Ass11e|?$Q~N z6*JYuhST5Y&!0_Pw>P%!Z2#dG?5bqdQXf8y_XiHip%WN}?4Ro`9L%J5Ei6PsjdR(cRAJQ;L7**p(<9zfFU#|X z1yB>~o#_)I>$_9|VQ!~uV(g>qPJZ_W*6pmIKwvH&L?^QtNh|IRTov0 z8k~7;PNyYxq4Cq2k8e2s>3<^{l46ho;mooZihTr!uu*Bj2%)GG`_%f;Sn5=aGUgVQ zL7@@sKDe#3z)stHa3D|$4$>G6F=}l{b=u2kMOMsGEw#Bj?T0`FFo_Z{prRjHqdF#3 z(ybyegb_+?TW{e`QR40=+_kfHI4l>z|6uSh?}g4Zv#*%7<3tb;WxXVtJ%J|Hhq@C- zlJ`6%A|wD&{1fY)&ek)!4ZZz`v_7IJq90vbVJT8zwXM5&O$m2zjHb9d`|@96_W|#o zXOg=gkynluaS2-)Nxy<&lPgGy{9=Gsw2zI$!w^LzGSuyZ3U_$GlAd)M3&dk)W5pFj z#@^H_F#eytvw)N1I2L|Y&+P7jPA8U5ELkjDU}m=C*bX!Equ@*8a9;BA^2K3hFeZ+j zn3-g@#Y`5TnD2D7G&5aa@9kXudPcXiyLY!Yk~9DG&5ji7rnje|x~jTL2mo;Rk^t^| z@j$zpY13iOJKzxuHyp@`g=>{q*xGxsFfX3S&N`90^t6fWg^hC0G3Ri5-$)~(XI`5? zNy}ciL+)(SvJaFi&lO@q^{gW+4cq zp(}sf_Ca8wx`+^U_82TYD5RR8R_yj>#1kllz5WO#v#MhhR!@ymo<_8{1<6C#o9hya z+cLDRNgdx0u->VDLWkSIo6RsURRfSXZB*g-qPux!lLy<>Or`8_1=0|X%|5n)0JQ26 zp!<(SvG}6a%3XR4P(T;!-fiX?BcaNGVzASRGX1Ke#;N_(X6KnLbR?O#{sEyr86yAa z=zql@Cl?VBk%2HGA|iq^w)MgmdvT-Ebb~;pIx(hUH0>nRfcIKgV)SeLny3`N^ z#Bmf9%V)1`J4@$$?dN{XX-f_g~ERb<|Uc6|3q*_vWEI4B=6q$Ymjbwy5EWbBTwJZP`kLu?)FI+ttC9b;ZGtzSE^ z5XL2wi^M_w-$(L_P8d)RwRJ#}TGPyX+69&A&6KJ|x}tKNTB;yq^;sqp2~R9E5C;ns6oWB+*}*2JIyYWOJq zn!R?f00AVCu*~d* zG(K{sN(|H6ZUbn}8Wn%*+)^}Lso%VieR3mZZSOz>_|Lzye%fbJ|EX++t_(SP0VNm={d8U*6tXPY|F$AUc`W z3n?L2c-)n3po_oz3^8tSFIVcsb*EN+;sQ1k_B{ge!ignL+B~JmmNc}abCdRxJ$U;@ z^OT|StH;GJnR5K3O+d&iFrYEFLB;jzXR*rdOu>{R3px9bWglH%{ju|*F!770rf*x! z9f`Uu&4kc-gB~kkQ6GrMH}@FbAM5G4T*xWqFQ3}q!nq*?i#KJD zl;Yw|-p3<$+0-JB_~G;RmUc>|=vWguPVggw2O}bMege85;IeFwIt>$!z~e^yKyU?u zG6Wu;dd+#`W0y}0Wq^de)Vel8a+h54c@F6{luvFk*gz;ruH0umvd&t#gR(ZKx*(ul ziiJ`Fq7Z^4kpKxG%Wb06A70Ei5ompsfO;j3sE=}AR(m#m=lZNNHXJ+%j?)JrSu!*qK-xD_5FDbs^a!<3^$y&L`*F>E+f?6&6fi32{WCPXUmcHf4|e&-3$f5gc-knHj$o~ zfD^-a6KK3`|JPRe$6&i&)VG%P3 z0^;wY@W-|20YnTysRui_9{dku@19>uh%;x)q4qD{)AEtqI)1(&^T4W{9j+}ySz8`z zwU_Nm{qCjK_uiEJ(NpS=;3fI@b@qk>Kt1`Q#7WduR3Gl0$*(y6JD7wlneJ-LBw$L&$T|CGBjgSozb%~QU_g>GWEriq9lDhGk?k82mSZj2k^JSe9p8AU?Q?gl ztLpsfZ{(pi74Q>?f)7bx!$3FoGK-g5>}q|qiVG${AnC`}b3d;7@Oc$j*+XbUP+-sU zdWO)8#N?sa%aIZ+-T)X=hU4I132KG4Y&SWQ$m!W5GgeUOmzYxk2cz9cq z`0%-5Ofoq_UuwNFl^)I5552I1QWn_cJhw0VwZ)n5JY&DO9W3390ev7Ak|bg=pgj3R z`H;1I_}27;Yg7~IeJo$Oo;OkXvzfhaZ_9t)lX+^JO!Zw&NUFuR^c_>>#yf-Wp3_@t z)^f7XH@1K2X=m%vvZYxCl!w}qx4iQ&9p8N{`{V|DO{enbo>j>oDCN)Xr7C}BjN&fg zn}2xd6sInKS;X8Xpku-#ErFcKWhQdGtp}qMab!7Y-wJxkDchbIA=oyGAZ)NO@msQ>Q ze)IE}z#R3)J@Y`<6@Y($iL8Ss8xfI#Fd`x%B7NV=me1ZLo7?@$8U!Fn{o+~W=?29x zCJ!blwGjQ%m@_Ka2iAIQy>j1UQBu=L=MniL)J5s|Zdn3_iNARc2_)(!Paca`OfC<0 z36`z)?>(M=WUcq4A9@jTUrX|a`{kkbGE#1l1aNH?r7BuM+qkpr)l-O-#pT%ENVho< z;IIL)x6OrOWFA`E`k!~I?HO+cS+Li%2)W}~t?#=v{il~fQdek~{n>{$qbpALh?uDU z&b8u{VZqkHj&DAsocr`Qf$nS0#riPjjV{)KxA$oWmN23g0sNma-+U6j%Yoc?R?^%IGiH{U<<8N!rm=Wb5Vjba~tk zlW<5ij;k-nv|uU^eKzmu(}L?dI(q~JVlQg+>~7Om`d81lfB5#yub-Dkk~|v#Ami>= z-HXsm`d2SF>jO8R0#&dhJ)xlW*aiqBcJWlw0M3}NN1Y=oNp=44IsjIE(D9LD`0$^5 z;XP>Yx{X4`|1r-lQaz;yZ@=MQ=RgbTT^5dm zs7L3Od5hlq`MVvZxF_(TcarR#E7E^@1&U#wK2ACCk|bgq;Yqb#C_r}gs`4wMP6Dwx zp_eN)?QZV4;Q=)ZmGi|*W_S-KZRBx*LZC3vFw{-AlePlDEymo@s`Rs1mFs#v>POa+ z#$)gNQ`-&qrte;UdzyriU`2r6CsnKE18xzJPBMB(9&`S& zgN|hY0R1vkUx(bq`;VU@ zTLOUxO|r<|z0zqs3W12B)lg%SM(jPO7m54v$Cr5r%W6H)WaO@^p^AKdtK5FHuuxSO zJAX2fWE&;r@AQak{E+KsKrzyPUz&M(qvmV~Ue$IE?5rU)C)3}01WJQI0&AfONS#SljSa*KQ?9VSl;o)`{`Ix z9&S(lb{PtxZLy(TYQA!{F>h?JSAOza4=Xo(U4(Tv^N_o$?^vV*|Dn%2FyXKo2n5H} z14+L&96(pf@I4A4SM2Th*x!=hdK4`O1si6(076mN3JIW_W%yYxowsgI3`DndLQ8f- zVRAW0YU8Bft&u9+ML9uT$;8f>NWd=OGOw6m16Xj#P5adY&an>9@IX`%>g2xG<82RY zpyIxaXb2yG&XS!Fh&uW}nz~S>v5|qZZZ3Dr%uxiS1MF(bU$rI%a~gs@yPaJ}xvAYj z#~X3hil9FWJ=61UBShi@XG1a6S@xVBQ0w&iRIGlG$69M9b>mY|jH(ZxLy~ltXCUcU z2bK?|?UpazP01`!w+c&EN99WP@5^l!-l`b!H=o8{+3NFTS})j=6RaW%Iw&x&4_9hD z(w_eA<7IyJ(im1#G!HJHMe*vmgj)Mqgcf%;j*HZb^L5W>*xRJ z9BBvEP5bME*+(}(Ac;$-@f@y-J5+((!tbe=4@BmXbu4sMfAHKA+EAY0ZKxs2?9!A7 zsTX1IMoMwXh6>H{3%VnJ#U;r-vf;x``A}MonZ#mJQf_Qj>fw za9Aw_BJ>?opO1G09r4aNy_9BI9zer{b}RM$r%RP)*@Rq<@~7>`PlDwTkV3armZ$s~ zJ^%(Jh#^V(9A274jh9S>!dTC51u1<2NqFZ4j+6_FjHATWv)o$vw@aF`NLtz8qZvS?uIVB6bkL10Vc+7S!{Um0Ngg~qnoPZGZ4IH=)g>qX{ z_Hz%??qkqvaLmBif1Mw{{e8v<&XjTC3OBl$&}%1z6P$>M$Uqno5fQ=L!j79?1~0C$ z!NuL)SP!pc!2k2!|cPs^>sby#wfm*86lEtXmKR5=QY3+|l~hb{1FQrlATfV*futrGYgzY0 zFQ(3=Q4YScyL-+(e^ihf(OS42$a|#J{b2+vHMAx*_?`1BaNhz78MyOQ;NWWVVm-RC znD%@s@VPT)BI?kDv25Mk?ITRy) z@igFFH%S0Gnbr%?l-^}xj2&c5AJMlfwX@~`pV;U_&=e3z{MysVKyA|IF~oH>(a3d) z?k8=x@T%0`Vin6&rH8~k_Q^X^cP}Sx80nSi@(nUnDk(LG2UTEJ11gix@kgS_(>X<8 zf?G&inP*;g+g{B%^T!4Kx3_n$>;NZt8*1|jLOEb!j-+@iGxFOQy?A8F~n@B|)~cghxcN*Ev&=^lKZGW?}hw{t)-uOaOG(Y`xZp>M@P zeGV+KiJZf2pqs({f>SS>NCK5r69)UFCT<-JEIOs|j;YVbyWRn@I)-PA?h9$w5JpUx zrZ5b-@o>q~EF()*{@n5kcyUGj@|8bIGGUXa$Jc>M5T^4J)M=xjFe>vOTg-Sz0iAV( z&X*!z+yQ~8B;_DLuOx4r^a{$=`vcorm@^x6Z#j3?G7)DLwBD&O2|h1mRn)PhM;usU!Qs zR*p{NbL(RbQvQZ*4|2!R;FKPoj9lc;$OZYEStFnrS(UJ%xr6KF-FCVS!rO^F)<0Ln zzYOZ!5)P?>KstW$4A_nqM@DNzZIkTYxVO0v+Sf*#kD?LlJW-+V&^*0Ue4PE)Jv@_4 ztch(~jjhH`nzXT##KOf$!UPeg7xI~d}vawG)QSOETkdaVwm&htu)c9t2?qfU0SiACf7I>tEhX3!K zZm@59JlxaohM_$^@rAHU%qOwMryZzoA-Rg-1QTNI1ax7ZLm>Ni+CN^)BqS6K*|Ws*KKv5h%d_p@r{`%bCc1vEFO7=+ zJc0d?V%v`?9gsU)?L>Sg;Ll{@wu;}A)e*RvfM57b7esTm>cJ;OREy|gn(`T9X;i~= z3OD5b8}khYR8bZDWhc6E3nvJ(8^!gB zsDLQN1~bV)X>#j+JuXG`>hs$4UyZ-g$gl6N#xj~{B)yM2WzH3D%uGDC{8*Vi&>dTW zPB0|(hXBvopWe-oQsnz_s79tnQAeZyaV{wMqQnF;F0rv1U_SI$T*Ot>P*S|@G`z5; z&`@L$DZ(PX7`LL7Pckn^|72ZajL7-B>bT0(Dpk2FwdmE+s4-rr!0CsGD+1K<UxvCEV44@F(JNQ@3cEY#DTW{E;+?9BX@gP|7I1c_yfJ|OP zDD)pVZtfrWIvH}jcZKjleR+G>qcc2|7VUGmt?!QN$$Zgt zZeSN6e1W>lH}>hunOap?tAUC*Ai3`|q}t%aQ$k+H3|e(NO>K^V4G%nlE|F6|sO5>iFRcdH^B-!8KSOn%* zqg*qC)wlXQJu!oufyq2jpf;O{va=TVwYYoQ&)^7&(wSQl*=>i8%EaqMh zq`&~xYj0(`aLML07YkyIL0%Kx4|hW%a2ni70p9*qmOFEfNH;Hh&S8!`Y@{&%a2ZnCLFGahV z;&S1vTedc_U!Q9YR*?B-2&Og|tWAy5&QCzWcWOS3{rci`S^m&UOlu1df}8WGR{}Q{ zo@u#>8inwixsEz)pYi(F1qs+iZH|9@Co8O92lPNSIOhcnmy5S#-ThuEi6$_ENkj0% z#W$mdL6r}Mf8OLsm?ACTHXhM(Q&nyJ`*o)siDv$W?AOuoLOGVeDvf?Hott-<=$gO> zlh}*%_u!_~&igGQy&u}8Ia2Lb28_4N()^?84F~ZOfzvSVXy8y<+pXi2*nh*Jv|s*U z2pG7@{?hWj5NX|xB{f`B?m!HrYMTK=(Fai4IrbtANsux8VRuhj%)ktyC9;^3{TEiz z5$41;g)4DFf~7aezlLR&u1kP^m;c~M~6o!s(EU6Eu8bX<)Vw*EO| z9kfaOwX^!qDJ(_Oj~unAc=yz3M|}y|8747DD{glmHhVIxBKi6bM>@@?U(rf7hd6um z{*P4njQ#-)#1UT#@}u-H3e`r+9)HGx@^`kQDO_TC>!_KRVFCxLGY1b~g($keD0i_gF%gK_ifOUUNpk?Rpo+!k*w}l>3IaVIUbAH`y3n!vTja~TDJ2H3!Xm` zmCHj5?zw9D=BR)5-p^hZ`nzGTZj=H=XW}a#XndyKi^YdcOpHDh`@!bpT;NpaQD(RE zLZCq_EEJgmFE+bpC`ycg zbP-rYL*{k*2V%w)DoVF`(5A-Gw_9d*Z;k0Oy&0L^qfTUhfzFn1q@6Vzzn5oGDmBdo z*=<`?naaVa6~^*-d5VoB8-Tz8mYgqiqjczd;v_Kph>9X@ai0u440l-UneUq8b9D^8 zrfshY(C^Hl|CD7=nGk=lgiP0`?~61NB21cOMVZ-T0(OB7)W6`q-l+K-lyRlS>F}I0 zces_1wkj-@e~T*H4Gf?qcL4KFO$dn>&BKZ-k7${`)3AGG1ckM9@ za};(6_lI}<*K)TTEDWt^aieTkxYc<9{AF;cYEvMaKhXZ~adjlUp(5DRcfkCM;yz3dK!diw8KR&RoQxSQKGe_Yv~Rf#cC3~T!OhR05R1Z zdlBD>C{#7|6A}?lGt*wYKlo1aDcCXifcQ*YC5mi~4P1=Mh+!}*70rrx9cZ2r;Tv5T8V2%#-pK%qdPKCFhLU^59R@Q=`GMwD! z?XTf4Pfv6&Kri-;Y8Nj$_fyd+>7dRbL3i=jZq`J^?Y?9f_lS}IiiI!@ku;=@3K5(! zs$LHEvVqtKIx%-2IPM__nH;J8L(LG6!3Tw+@4(LaoqSU?-~Oo0KmYSGW!M+e7m*0< z!I}nlGlL+04h#Nn!q$cg<;YFU;6NAnkawQf8kbUidr$MY(31{vtVl4eUYw&|smq8U z{_Of;{DrxN44o_qY?&Sc9|jb+eEvrkBin!6_40cYkM%xkEn|4zI*48iRY*w0Zu9W@ z{i0_m0{CS}jeHVgVLWUG42^j;Mq4UQ{MGxf(!rjs(~;e%TwxXMOL@TpQldTd)~@rr zV}bo$qj|uNe?kNx^#bN+&`WlD0f$nlXXG5((^d4%X9@Qb^|HEF$~>{*bY85uepAH~ zw{y_4dXwKxsF4H#j+DDVaTh42#zQ-jz}wQ# z$$!CkBw+whtM@2RL_ildk}9s5asUm~Pp9vFnXrF5Rt+OTQa@9>{H0lYFHn+e|gN6#9kE*nUe(!=3s>? zkRLAhpHHpd?s4a+RK5y9AB664Q_rgwXGn`Sx_JNm)>A`0eIg?^f|(*7kU$1g$aF%= zSntlFwb9q%<#jq!%1Z_mqISDO##R_>vqvFwz1L3&fUg*G4CeueOG*wPn32UqL`2l^ z0r<%*jd6Z4F06i3aG?|-L=NSDhaX61lf*u>uBlqamf+*>uyB_i&4e0sxaUTGG{uQtEZ{N+xmGfVn@SJ)qTBfWYYIX<|Av^Fz4pch%opuH#Ik@X z+0HbC0U76VbcAT2?3f%Vj&{`%2Ryb8KlrehaA%`dET_`>K14xq5mCdXrM~L)GDK4w z3!`6euiUL3xH96~cE$ECYlL=Cbm+5+!X1Nqgxx@l^w;@(F2$_)&D*Weo3nUTZ>*o^TTZ>q@4E*Z&qw56$eS`-flv${0Pj1CUXJge zY@W~Ko3EIip@5o`VrvGn?;P)j`H1!Ii?42^(+OTdhC90hY5TODPMn;!SxZV)1#SaaT zsgE|52LOW2NDZcQcV(4ieG_; zn0xW%j^u0nGF9QAj|_Np`AF8$r(m%*gHiilsZBZK_sflKJ&z@NmGlA4dM8-%nJuF| zRGV*|Xq&g2pF)=Oq}RN_kyez5u`U+w^@1~~F~k3`a^_yf-NzY|!loM!64@Cqu^yj& zlPG^(FR9o!sNU~wUW{^!14W_shJrKh;5fSddU^fTUR^mSIQj5xJ*kAfs_s^CmQn^L z4bXB(;e%F36JKs2j{}ooz!FlLK#8DBs`2ST_4tO-zMoWd=+rIYfhEcg03RW1Xf|j$ zcJOs7thUtT(Qtt8n@4}YJ3idE8S3Ld%K8Hdna2EYIAjKP(8BXu8}L_}8|m;uR~Xm+ zXujeTC|d6O0>JBKe~19S7LuK-=y6ZQ`{(srC_gs7SwE-+x|}eu z3X$5-B;@3#qXZIGLeFN-TL3P4PF7P!n6XG@hn6 z(U;ilw&Z5|^C7!qKd-mx_DLFy;&MTy90C~~jNI3Gd7V$)==yJW$rM4!2~JAJmWpH4 z?NB>ju~^W?URY+r3YNNfh58Mt7c)s31^mL-->myriBnL+mZRZEmVL;4r$(cqcpC0X z-Zr1*goDJYnSsj4fzl%R>SaCs=3#7b@M5aF>rt$YHV0%dW6*(y3Y&cWF{FBC?^~5a z;gcmX+9UQq#M3^nE~ltthT0*Y{K^D?7qd{WQ!ti2E-0;1?a8!8Q_VFIRG<2>D&c~Q zk$c(i0>94iShGU8I@eECi(@~{pu$u6ol})WC+kQ#v98ZaFq8I*S(_BM0{it4Oy4c( z0_u%<0+B9C9+j#@08LEvDC9rcO-yUDq4N)-q$ik0&~O6UG}AX)bXG5$xOu1S<^Apo z=G|9Q-p`OG?=rZbMem`g&QYby3<11#w3)H;$+@4`!YCn0 zz(wm;3*bA#2g+1eQT(zZa(U(3_?{PvYpIYyI9Py9EN+(6pyA7T;Cf*2cjF6@`saQ3 z=x7>MTG1I|q)xG^t0`Rf3apQ`1{dYcd23{NQ_9%BbP=4k;JBh}ML6>Klv9`s$c!NA z;Mm>bxJ*Z<;Fjp!mU5O281a?V<)?PLX&;}`8(?pLPPa=jl?h+Y`QZ(%Zmr;~g9P7( zh#r9irFnqVtgaqzF@rgS`VCzhDkOYuw6iGK|(vH4b4p$!2G%rdOmFAbjh#fsz zbvZ$7-4`8%;6_i^;K4G(Jxc3RI$M(mNBYHqy+7(>BgIXkfUt-hp-D}_?_b1;zF;~C z$|ri73IVQ8uNaK zMsRLx?(HPESR3_um?(0@{wt z=<*XsjHH!dH|*}j6}rL&D}%3b0Z{6Eo>)EKwv-T*e|;U7@0lm%f0el^rNklVV$!xxqx4+3>)l|?Zq)R^5)1e#e?)O&t~ zZ2;N(wfONMbadK^|Iq=V?m#Coehed|)*|UOohr2qI3;$p74o8FawaTak*^~r^Wj{K zfn)9jNKp{jp7&3$F|7D^S>TRHUhzh~qAcSGJXV{$l>xWj_FetXL0%t?_!~-_nTn=1 zF`igpO6^LQQ+1;U+-+`K*}y_|l<%HXNn9eVz5OT@(g*d1vHPL4?WQ(E&%<;!f6$K} z02$)p*eSJu7zUb#x9Wo}c9zH_ad8T?F%+~AyKNEcKf|$PJg~CQ!}6mR%WwhL^pxQN zd0$`pKWV&Qu*bzeFQH$Zil>^*z1zYI*V;*S+(dbU zV4qx=fZ>A}BN%m6Ml7Hw3y5VP?dQlFbHJva5)eNgx7%VKD9S&L8fdtx0h3NQU}^v5 zcoK>DI6#=zT42L7D)p>tx)9|q5d>7Eq=2`Ta+hw@hhx}WHYhozDw6_D(}O< zszx7hS7?D!?()Oqk;Cx-0|)ZKa3cuyv&X6!8FptzT#h?BS`kw@v3Kn7foxeL%+w1Z zCK?*zEI(uB?&n_424f3iAD$&ilLh0H4wC(b^=Q*nS)S5Cbyc(n#W7M#yZNH zC*?aDZ=NBHd!DJt?xRmPvBjASN<1u9;ItTw>O6|7yhO(8EZ9Mx?rp6JDzeM2uMQ$@ z@GdN>PX>DS%oH4d>3k$tzSfSV1%UrzT543ylkO@@!248_po@;y@sNN%C!+!y=>d;s z*YA_T3v!kY1(k|Nc|r^K_uYl|dJ13R)VdTDKZ*XAB7Jut*px5D? z?32E<`M=rReSDIj01&Sk?@$cDU-Qm#TX<|V+6WqhM?ddo8yOl@7#cg9iQu3Xr^hkZ zYRyMZu@|V@j(s1VAkANg6web%0T0x6sFIL8l%N6yi$4~FChB`gZ~tse1xPx$-khY^ z>rqaBMA=6dggfnx9$S=fNiaTZ1%Jnk5^K6)b@2nkQ)w6%?emp9#zd*$oa<&bRoV-M zYALaQyy;dP?Z{?jL&Ed@@Xue6&>mZm7Uj5AB-I~_CVYF5%FD0is^3#ollp`A*r4X3 zmteB!P7>y&0`#42WmGtfngi^n6uuH0__6t&Rg`_Swb&05LP;KW6rPSRkaFttP~MXs z7%2`?(Yc3yo+R+0fER4?W(##Vj!=Uk;T40Gd6chQL6uovq7b#C!9fn2kFeJRV!}!I zi_=DYf-)PEI;{`({fap|PIYE5d6r%#{6}3*B+k9qzUb>|;-@h?J0m)OD6&KDBA!W- z0$A1jiyaxw{CGoLMD~ujxCY82K;3D4{;3K6#zip8|$3*-`kK58p&Y;b*f$M3LiA;o!X@`izH@uzDWv z8{mCm;RxPN&HT`egt=yu!fGzPUcbfLTYg;H&i~8u%KJ2y&d+ppwjc{5dw=o^td>R2 zyoMASIe`z&Qg|=5mY0)c%4$2?tnb2PWiJR=GitMfcTRT>;^tmXR5UeEPGl?ZcGo+a z7n3v3xr3{K$>Q`kNPRksE+x!U@OvxRJvcvlycH=>@VHf(cg$Uakgg22<2k<$)iE3?EXH6-a?H?m07}G8(GH8V-K_D>0K`Kr>U_$jzkAom7BuASj7n zL$Z?oIR;-vVF2)M_r{w?BG+-c~%M@47fZB-1Hk2s$*GX&(>R%UHYiLjV9<66^C2f!$c)l&^ZyI>E;y zs$~ar`U<45M5u*EG7x6w&y@4M_;Z_Q5NRMF;5K*rnp^A~6$>C+g;jA6Gn z#1_%1VH=A@7JK)B0oqC2tC2(K0uMsYmvs}}(Ft$zKO z$cm#0wV!B6|fc?5!N=tTw3j`9a6F?rJ zfTzMa?|1uEIMKHIjPM!jUnt5-TiNIU8O1;2vC0-7bt67+73l=@omlo&IaWe-z#G6G zT;VqyP7&>dRx8!h%#81BUqpj2p0`YAr!qq+F0=Vq-kPbOaLJSyWjD8!J{v`Kou7JA zFgJqM#L0wxU=;{3Qnm5?Fk6GmV=^z{zU-PgsyHS{Cm#{!jlP;0DJar+n3SD*9E^rA zOoUax{w0T}p}7pY0>efwOek!$V*P=MY*RwUq-gv1FB95hYoL#?iXBp)YCS_S!A?G^ z=X*AUyCRE8+#~~hzmST^$ItE2C9H#BWZK&m!kIW7Tnw(eG<+fF8Lzw^htG(=7*^40K)y+kn z197qx*BOzo3BJ#oPE?kcD`>g=a@krC=}+rXLb@;%BDmW_?zw9Y5CJMn2DzYlPv~2? z-#9wv;q`VlQ(Q@9U}!Lem8<;~+mLSFyaaYG{7CEa=W5pyH!2|Z{93$ZD$fvdN1;)| ztk?U)Yd0WjP}y9O4+EadYNeTZOmUf0I#WyGY^|`f>u^+Fqd+s#Kk{(w7eWQn{CN58 zEe@Rx*{3NYBu$z^rhKAWc_j$ToJ40z9@Ku0>xxdvTe@81(}z9TnG1x=T%$y$1GPJ6#OLZwy+M%g|Ldl(g@UCy{mzAdK^<|{Fyv`r({!d}**q*ShhEP2hoY){CicQ3@mFR$<}dk- z`8botfuP;@1wHe=RXCT7TX=-UO*rY~$>q0wKFlDmmvk{vQPFRd66fo-rciMl5G{hE zco<$RB=hzJ@$9K<6j;TS;ofPk31MfHPLd>N0Xsb{M&pp{gvPqWs4}9!)4P{d z@W66RK@yc1n-$~J4>%5G8?u$Z$?Gq{q;50qOZa=3Sp{tD*k&oKbid>Xp+f%%*6IJ_ zK4v!u!E3fWeBowtazG|Ut%nx+1)@x_flNB$F%`kNT?R}|4i43*MxF4$xHQ-8>RA}n z2{Nb^QGN^8J*wQdx#;u4w+AzuTvp#1?n$BxBE}h%m@vd@xt|u&m}HxlP|dknXNQBt z2~7n6JkIR{WjFO8lnUR)fS%h4?rkni2w=E z{R~V~+KSZMAv;{Bor2RmEf=5tr8s-R+NhzKo^r}QwM1qu0)#k8BK70=w!7h&uOX)X7qnfGhFr=aO` z;P+8F&M^V7lfMgbUtVTEppJ4Fd7wTZhoT zMMn2_SS{b3<3=2D08t9g-LKA=!;VY2oDWspUxtktAwbdG&*sJ8v!(yae9r$3+XZlo z9JngfU}rDrYx{-fR2ZUI*N#z`q01EwynB6xrG^7M5JtNtqIcV~o;0)+fuOsf27tYx z3B+uVivsPaE2M!XD+N70Jedpfj3BIx+11~L8SP#A=X09uPWLZAX>!Hy5)X^gapH8* zGkFycFJ^BfN3p=gFzlhZHTt)xqnL(Q)wpdrznw?Z+l_LOoxaRqML~>bFBN@}9VIB= zFIUa-C^!F|(;XSGTPFY?vXc6&Uru+1n# zoO*p!=htua@=WAg8%Gq3m570UBM*Otl3^vtoRpn;_=!)Co^c`ZqIBL==HfFE`4|Pg z!)pTJ$ycx7_IaV>WY=0*s26=Xb{>*26IHxH61?=}xcH=0_|Z`F7TgTswlvKe=+pbo z#Obj`*17eJj+J9**k~Rf#bNkz_d=;hF&6wuBMhEDi7wv%p|t;$+!nhuLR)3(EI_Ke z^#wp^Y6A1+K4H10xbNxjbcl0&0OhTJK+w^ajL{Vh>$og^;3}3n2@<*6{4krPj{Gxg zwAVF!YW^)Fn3fhAQD;+?2E{dp^S44E+}}i>5&9HhPz3FaTJ&_KdOvn?2s2LDhNQN> z;^Ugp4yHVfn$ zibLaQpdl=v$O%$hutAE)(bafz)nWg-NJDF6(iigRy6a~SXq1qpAMLmGdp*u<)?JTR zu8x8h*{N+tCO z!)o?xp0wQfn$)hJ`~#xYW{Tb{uCy&Uz>TYa3zaT_&)uf@#q=R(Nxvoe0Y|vo$U^qv zpOVd_41moX1#Nuz-yyNQA#!DJFIR6dJI9pG3{;6_nQkSt1JB`7ZnjQrQtHhNDqV=E z83#Gp9H-QlX~~jBv*_{+p>lz{p=e-~aHPLx!%D@v&a7X2Bf=MY7{b7ah&i?GveKeT z6@4k%+w8K3To_S61r8biI%CkQ<{-~xScqz2nf3jpkXgm$LbPA6etRBaP z)3G{lk3>z;bF13-riyIY_S^_L^zs^xatt@WFXxs}Q`y(0JYO?4phI-p_P(O!XQkcndOq>kk_BZmhj89Ee`^C}b+R1vUmJ+hkUB2(RM z_zQ&XJ9TPWu{tZ4r}T-NPORB7>@Cg~_>;{|;lQ<_Nd_c;+_s5EQ$ROp18;a{?hkF# z`xG;Cu5*SyL-Ctg)>2l=>Z3eKr_Ds#BVlGBK!|Jqu{sB=hu1Ax*I)vvShAtMIf-h? zpHX1>pa5Dg?Ks`-JsQwFb$jVYL`O6_514QkxRw%mwAW;A9)D+mc?$4ehmwMH9R8QfI!FJqF9zY?_y@~N(HU`G zOaGD!7^)ZDRZ`9ClO-q+&udluIE$X52UHG)S&AXx4CNy2cICE4pB4O-es@&J@Q>ZG zh-XbnbQWj01aNoD&EiDtnx+DS5>A}#IGuh8^$B@%&1&@eqWmB#zbcM~bORI`>HZmC z5mYu=A78Pz74Fw;-CXb3exJT+*YEH0`-AKPMDf z4gL(<-@_+L?VzONWY_Whu`;aRJ)E{Jc-n)~%5oSUkM2%F{di>Xc<*W_c|D!bc8>v< zgMF7-C9jz(T_dA&180#vq@Ir@PJ2V%=M-9JXa<>sx_npYX$nC#vbtQscgQjGgppt1 zI#ry{d0iuFMBi0czP7`8970dky#n>9edf* zh426aF9(D?x-qVf$EYfy{;#RxQ%4Rzvl}oJ+MDE(V}|q+)KP`ly9Z@D(3Y%O3Dii7l2< zcsdtC$Df(T>klVIZFO}8IxU9TYSR07{FYp>`PdxP#hwIS55H=s9l{M3*PD}?*}xax z*QZ6-2H$Ya8F?m9jt0bs1#V~IiX(es4vnrGp2otJv_kj%stG9k@%r~4HHaX`ESD!z z8C*sxonugIYDtVI^-8FfVK0ml$YtqMKKKTPLV<`w^5_eHyF9}UcG;(02UVNOLXN@< z{`RJ6HF21(e8lF2H1O?fUSFSq@Us;b5eaS@=PtY?1B*qN1Jjv(K!kJw0z^u*#^3L+PS?t19fd#A z)cyCb<*HUYs2~dS+nke`W+vH>J?zdBaNXoP4rKNDgpAQ=>*yPBd7@V@vRI2(J`R=R z+&#XSTUfh^gSuZq%82TbfG0p#V$ybz6GcTvq!+!wC5r2DMRoPkyjfJ7kfQ67MxX-o zh>5rR$MKXbTL=;A&oi{*(Y^?Ygx=KlPk$_abwWtj`#;99k{m}$u0w zBNfbxuO-~yWhKb)crfj=$GADp`s$cUf)3*P$CLw;$c`0}8#^YARVhJ1jgf&H-khjq z)Bsy$DbbmgF#U(xn;}Axb{u8mz=c>~(q1uukZs567**7EvNJ6!7HZ5Z%?qLZNx|oyi{r2KokI)HNmIZw^T$a@p;bL2zMH8@(na-i06S-?=a{>Sk#JS?9DD$4L;o+n5}Kl$IE8R(&ge(Q zyX=b4IX6oxrNMV5f(?4dK^MS!M>{}yZ1*VGV;>Jfiii5s)$n8apZ=YIK=Q3%ioy1b z)qeJ0!Sbg*oIov2lwYtBJX1jsRjhvTiKCgd<%yJk5CGzQV$mNctY0cJe!l2yPQLr3 z*kR40&nD)xZL`C95KMoqe0xhh6$o3PxC~1qBQ`|OVFj%+s`fq2VSoWf15t7|D-y>B z`e)w}9xZKEF3BfTlCQ-)!nAviBAncLiHJog{j|1U<=sN*vKg;F(_QUvOmT_0qYt1= zi}mCus{Qnkm?IUWbvv3pR@PJV?Z-An%yo;*+m2FR{3i{t3NXI`u#zJP9^>Y!=Jxc< z8xFapo}tvhRuNot9DFdulA(6@CmO?`1=$#? z<4|2rYDmCUwx0Fkl+dcFoNFNC*I2SSaBJY;6~WMWn#apW;yP7JaBn`eROeuGtLo%L%pb2}Sv0l>y((;8ZR=gvXjbdu=E{Y#DrAt95$K40#kpH+$0{d5J#|m#%y-V)9#Azxz!){IED%f z?s$BA1RDdby#<;48Q9T3UZ5b~_Z2HWu4K|R`aOYTNbJ4(M^)QmrhYF;f-|bd`Ko@# z_to+eM?FJJJ27Z&qr{GP4U5Vf5jUT$kBGRmgqzTRZst_;Il^lU=Cg4WThjm(EfSid zLJIm4W02p2;w)*z*)bmvX08cfR1(8oPhh{FyLb=QUTr{9UL!|^Rh?G5V91~ z`afV-o-S<7wCQ4ju7%G1lk(V)PQ)nU&17i-j;W5Q%-p|AZoCi(4;f76`%%^fu~p&8 zv;FCt>xMo>5Pgw#vTndN2bsipivvaT$bpUUfx@mu>`f#XpEnEFGC!nBb@UO;G>_w{ zq$*s5lOU=PX!Es2zT^VH{qNxW`~Ka$@tc;1Nn%F*WLs@7Bnx{3q9g~@?d+=|I3+k7 zd%tVg>=nQ_h$b#kEy&|v8EX0$|5qq?6tB06WrI$=aY6}6KSf$EoYP!c6{gRsfkZ0> z2!gLj@>m{=F;JVUwSuoejD5ASyK5WbHEVSSpIWw88Yh_H8Ec9mWGJD(-qqH9XM_U& zPIC~5RB7DW{L9;RrSZ8Xcb%sJG-M#)bUDZrPBN#a|E#fNG07^O={klG*W!W!O7e8$ zWE;6;S5fZ!_9>~*d9 z(Qf99akpDe38(RK85>!xYosfTO^ZDA%)s8<>+$b&(SDs`-I0L(**P%u0Me5EPk!lG z7o4Avg<8(b4G{sF?B;j-GWjii%FCXB5)#02?xpV^x7RP7MKm6Q2e56hqrqz7R>9TP z3_L)rz#4xS;4wr^27I*Qe8=2O{Dz01`TKG8X&d^cz*PI()O70=E~ccK;PJ$rcAZyx zL!$*bg3zFC;BoQm-k#=9eQEqPuK_PRB(~5>JJ)VMt+VE8?0;eMYL`-OjinkaHrqG2 z8QtFHEk1~r5f2Kf><&E1ITY4>`(p89EWc03mGhXnrc0t-xQXjviCpEK)YygrEtb;8{*zN1w<8G-gFszZ$vs#CG?toOpd7^tK=JX!p6_=H`Zyv zjguBN*eR2J8DalT&Tag1}63PJcABUT4?0iw)fNO)TH)lMVYR ze6!b6e#??zaICirG2#t0$zv_I-^}eqOKq$3Cep z*_GFIu2C_aH5H!U2pfgW<72}=III{?wb0CQ?a(wU%E$!A_>}EKowjy@L4s|rgkb-X zO6k3sHS$KIN3#6-uYb5>-Z}64i7&3Vz?W+3Ud(7$09|l6KQyz41iQ zKS|fDW9oX5i(T1YQEM41kpzYh%Nzi{)-gh!(~#O27b_NaLS{cMQolWgUwzTSuKNZ1 z6v^-vvbRC94|NRWetY+m*ECo?jM~q^_tbk~o4&s%E24p8Cr51AS)prjQO7Ek-(Fe^ z-+;GX*9u432Wji_TRIm8BIU!U6&*C7vK(MjD6K-&$YmYRGF=?oC}JldXQHka0V>kq z6HJ-0m!P6@pArDV&>Rg>OKtQcRbE=3NEK%EdPCzIwfr+8VOv(&Fx+#60Pi@7ca^#X zj!5U>e;3ixT6-qh5xQ}FcCZrlOYn-rMvdqX#T<;UnrQ7(#77*IS$mBV4i{IL^?N|s z$KPo~@iy@}RJaPuAUf5^!&&TQ;g`fi|J$4nMuc>L=%NnX2z7LU3XkEAwW&i8+>mtW_naxH)e5r`L%&xhgVotallaNL4wZM0pBtH}lE}mm!Tl#OjK%m1lRd9b=^V@%RMp|CZ08d=o+0n7-N;!T%qmuU z+)DZ!sKY=RDmOYo+xaBl%`}|`pJeZ~N186|nnnB@##>Op#Z?Hw$iHtm)_R^4A@xXJ z=H$&MosYgOs7P-0cbyBLJe!cS)#uWK$mqX8{{a5DyE;j8&Ek|DC#Ce`8d~&{6z*R0 zGin#Gy5S#8z7L<|X2I7wE{x4rI~|zHS~V!gKvMbvgB}@?2G(vMT;@#wN!D7|;Ov#wuJt_V9wxZ+lu5x`os9GEgw+ty;3Z!-|>XrLyq4FI(~Fa&|RXBbX% zts$1?OZS5fyBROm(Cf(8QIp8~Mj%v@zzs%=JSjOvwKn91|Ibx$+cd=8YjVGT-nZPu zJ_BixO_|i-A?-nI)X9zKUv6qP3VjB4zqO;Jo&`QQf0MH+^Se+>TocJ(x9zG_gg}v7 zU;Y`9g}+iA1}NftPu0(lPi51!DT1?cP!0p4ZYL+0*#}J-3ll-2kD|GF+z68ypw3XQ z3v)VmZi|a==>8A*Dg<~uj>isr6DZUsx;ztJ=D&2^0RYIHau&Qcz=IKB`R14C_{`gM z1PdZiTz>=sfq~Z(r&FjzAFoBc5buDf(tZtg5jWH`+r*b|rF=+MK(60lldY6q<32Fm z=l!C}I<7NLU?K-tj=`&h?&^7|Y?nyTod{d=N;e@v_3k^9w!i-AYW;jQycn4{s9Sp~ z$`F+ATbbVk`gM~3iAk$=(3}OP#yC2Mc5gA%A>|S&96Ze*?9);WBr<>=cSMlf|%_}w31+swA0_r%Lu{zI@{h+#c`D zD6l|u*9o%WLan}QmPn~xJN{Tt6T8qHM?3i(B?ji{VTz46Jh$Z+s(r55*YF%8ke3G9uUsdgnAb zX45nVxX{VM@$a5HI(+&QPiGKhJpJOxfhd^2^4DriRk~GGU!*<{4jv;1Prfo}ki1Ks zOgky{v{#-soD2s8m@6|Q^VArbvy_kMbMz`)D!aB|V1Jp;+-0&&Ulc#w4!b>xbI`PR ztfIkMxKwLs9AEfVaO*6XiX}t4us3g`;zFb$;AeU_TrON}b|5%%2lE3k#vPE4ci2h+ zI2Prw{-0{pw~t{{Pr}%cwe)da*KkS(`d#1Xly6V@}Jyq421^6fmQ=g7y*af1;Bm+&3Y1u` zMT9ny;*8AMre@ETlA7$bV{M6&*s(TVZNNx8xapBpcptE%i7A9tnC@U((%F^^!hhND zs)~cjN$x|=8L+$;VZZE2I@&sHM|reUo%QU7?UAa&`5h1T4e@Q+Nw!C|E>Z-OxS&)S!2G=T0R`BN=!28F2e`m_oRA(v z2vQ|YXI^6VMk9HIqew?RCjPzB=9|RT*|YhLZ1(H#I8>RLV$vPt({|{B#q9RozVGqE z8^6~_V+S(QlC}~QjRwH+O<<3=3OWe*xu!=W&XHvNZ(tE8!6t>s0E;*m`)}janusDb z-*X0mHIE_X-O#69EiBn&kn=O;_(zAH+@sC-z{pysQx?}Nwe{{GGeQ@8e+C2CRF;@v za4;rdnq9?Uo~5}}GZHDa+sItDPZ;dH_}M;6ZVh&L_A$~4Ie2lqRj4=KKcWyGL zA^-B_=~;NNNGqbet)0iiCKX|A42^-ZvPF&+BqN*izFkuNfS7h|+n2f8l69IUaXmtK zKr!E!b0ANMRv{UhI}TkFNqAXPzS$9ZzRmnP^?E9aqM(UTOdHa`5{DS5WPqNsZ6dU0 zMy+nWyU(BynTlT-xWu(xlko>cR1{v~W82W?ST=TAt!NwnOwtbr zD}1pBgM|JVGw+J<;Aq+8e}Tcg$Ze={1q%5zShJ?zul}prF$2{g>S=YGGfr-uI}Wid zBL!{(i*FcJ`!F|4Vyb+S;A+2K^cU1$=A0MfiToSyEFcVOh z6AKd3<0&umV6ajpxf&!NK}7qXuQy14;9LV&G~FEY>N*Q1N7JWZROI z_b7CZ$e#fbm7SIL8DUKvsGQ?eMp!JT zT6igI(svTTv9C{aSS&+=EUXO z>DyGTO`l@C5Au=gW_~=d!ikzyKhK>7B1HVn$86E|^0i_%3G8EM54>U#>AzLwg+tyK$p^g=Dd&3(%1MJe*r?HSK)4oB+K zN!JE1dr#o%G8K^V=72Z(_E@vr-&^ymzX6)qP(xVX%Z+HfpcEVQC+&zzf-{#{nqb>b zyG+4%5S(I^>vzmhd100u@r=}cL^FO;@TtA<;$(*ZQKef+<0@!bv2^@n@d)C1UB&(r z;L2h?!VA9m4`YQX2wx7+i@m*4lq%VA6{C#j9PxY*FgNiO#Pcy*DC-~q>~0X4mh%VO z?)65bfHw?!nOjT1qsT_?6Uq?^I@mqqL$MS%w!B=N^Xj)0LxkqDwE8CRy0?_TgO#7m zQsmIHkTvCXA{<>aZH-1EaUMq4!{VTfKtpr6$kdWlQ1;>NBpt$;xb@P*z!rUK$gdER zZcj0*ag&Y*i307eMb8Dx3ChkZ|8OeJ=Ga`w6T-(8L8aTuBYA{yUTp2`W?Om20CCRT zy3`aNo5OkhJt1+wcW97tR6R;`!5hYdnPYbM@{$+oRlyY4Nk#=0hs2hm24U<039~Qv zUaY9)0_X$05A?w_gD*>4V6P)zaAGkof6Qc~bFqqD4ybd;0gs)s2V z1SbwJ_BlG!$XJx%fVi71{ye;jFNaC(O$`aKE^Y)A>R*6gA+q8Hg~3keCT|hJ#o4}5 zx)U1i`{KzGGpTrQuF7cB|-^sIL zHNG`9E~|CfQtoCUCGCbl8Lv4TC;#=yY3HV2REYztDugo%NSZWj*yYs+yKkWVz1YP^h5xEo-}hiT9I7wQ^}6|2xnZ4KcDb@;SE^x^Cbbakd;S4%&QDo!K1RlA zN(_W{m)@>9mIU4d-4_hOPKSops~vMytMcu2%QT?Jxz`ru6U&Q(t>7l$k!_89_%$S- zuyxIf>StbNf83+dkx(`9LlIqyDLGaPP&SKZP@LiA}6{_f* z+SFRoQPD}63liF}-1*M^j5={rD=qmNnwH!}k$jWyxt{s%Jh6E!| zn;s2dTb82y{3mf+n}YMm!$|K>%(MsTR8vK@;Oah?OKY^YViRbtQWWs&QbX|;D0Ks- z>v{ay%=30s8=%S(4C&KP*i&C8#&C`%aWpgeS%jZhW%@X%RLENE-A&xF8-1i@d?S*- zKoCJz$e9p6!GZsjLJ3`W6AyL0+q9|W5SPoS+ar!OxnHcn7jUYMZ_%J98wf5XL0;+$ zCPw4Y)xm7sxx%1wk)dvTNdG6^v41Vm26*-```tZe<{@Fy|2as$_+|a2{M$yV$jFHA zAp$txQM=$n7Z*Niz28OUOf-%H?I9vYDVjD6k~SsVyRXlO$;aABaoa-C3io_VvouY; z$D$Zg(5?4%m%lt8*pi-XJF!z^}6{u>P^IR15bVpB_;k`{4*^W&*Z|koIzxZ4_ zDXSe6CLXW*s&P=Yu9@wJv#(B1V+zK;`fb}X;Mg$G{Mz$}9xa@SmG#+*JsOWFF(TA} z5W3kMh?0NezbwNkW?$tDfVS73xhZ%AS|7@8)o{A#ZHKqtFpOry!Hb$64GYKF1`9C) z0)#);^kr+S6}cv%`rj$@R+Eql)~6{K*c_D4dI4>r+&Q$6ceP?~E9(3@;XT6}44f~J zZikcd+soco{J1fZMWSQz{k=V?TugFsXJUu>9%<>C+xEIg+9HsRN-!70eJF*WbFcHizVC77vFq6o}omyQ5^ zLeMA!m0gM16(L1o?y>SieVVF$xutoWGp)+uK)%aBw4;*cdcDC^6VuL?Zc~KtjnDc) zcbSIs=$5ZAw{tzN*Os^4+eG2_Qf{*khY;SHdYYJ#4v8u>uUgk&o`0QD^l0k;>ub%- zMVcuv^d(?}uX^o8q%-0RMP6$0HWEmABF#elH{~Wix|J++OA47=!OL;wk-Z*Rbt2EB zy0ZA3=xhC6a<4~m9>r5lA5C#bh|j3~F7Bpkv8Aic`8zeI-R`~8wA+%F+St)}PJO?tCrUvhIv_|E2pPiTI|EWsFrC&0ZMfKWG(H5yg(kbK$OaC?tsHb zFu|F<5jr@B7UNk3Jkx2o|n*+lp}d;%u~PKe6C${78~$&_DCFMh9FeGXor9_b~l zk=Il3tVQ&i&Y7{#tW!UR5G98MET#t<+$CDPm?@}*o{x02`81wtS~D#yr6o%b+dQnP zrg+WA6~nv-2zk!acS<|YPxDd&iiPrO?(-ZaWG994z+p+yz%_vBOAGzuP{>{D&fvPc z6*0(Qi)VHX+@wJS50= zz?`us6*mDY3U8q#D^ViQe`RgK1B&2dVHdMX%QZ&*C-Fbs9Q?Ry0Z&R=?kyCpku)L^ zhZ_o~)1O{59^hk9E1N!~Mat^~2WCWuf7PfQ6it9rni&`1LX*PI_f2G2FxbqvEqp0N z?JLiN?ENr59xU`xzFo>vy9o+gg+1xOHO{ZSPu1x}j}Eoi&e`yOwXmaZ86ITOvPyg` z&ap6I6V<+7zred|sEd_=+F#329b{6)r$4=>rJ9cqvUBNL%QhXSF&bWcJ1CAkdU z=LplU;=UFT*dl633VG9e~~y zWj^$W8BP7Ej%nu)hV%Uh&lV-#N?y5hv^+i}clCIGS6!)Hl3DwvFwQJ1JpmXxcFWyI zDD!dXPxYr7hJv+|-n%O!VXAE?w`D3{0l^!54gGBn81Kn0hqP8*Gxj;;fIC&t`Ib+| zyonYqlLq_Se=K`13VeJ9cJWZtJF6UM=O8ngP9+{+8fd>&-ZwVyU`;=KYWuBOcli0! zO~>q9pgN|#AiwV{GD}NG97e(~DxT;$oO2TlcP`5&N;c)>3;y!A2?Slt?|{HPuWueT z4kASw?ydgtVh0CJEofSLlOmaGW4IiiAll0&O`|R z9!EA~N~Z6% zwaRW5!1?%^A;9VI_X=~1?<-*ZaFRAx!Bg*>F?C`r^KYz-Sw@+h=%q&8;wxZp(upVM z=J2oR!Hc~Cn zPG-E?B8rvHLh5#3zfhpOn5)UA8`@w5x>-}D)r2{>i|Yi8o_qr8Yf9hspqO78ZXG)( zMDbd@XO24>ha*WjzPKS1`b7GvuV;#1`#YLH3aIO+F|(n9!YIR16r!9BFy?&s#c=C& zs{L&39xbfF0`7vG0-69+88t2z%+0BED0qrBFT+}y!bpiqcc7NyW0P?`W+tUs4&gj^ zlvn=Ek(H~lqTQk>^Qv%}yVtfAgCJfxx_r)4tEq?_{p#tS|Evz6fSJ7FE#ZovH)gkW z^FeLBj)LY`15{a0q+_kezsltt$PIF#=}h|ASnErZe0gMyUrg4Umn7(uS6E3P_N+gOloDiM*l&9Zw#%6 zr9OES8zPpy3@|$cyX`sN`EqaI74vD9c3|vZPt^m#^!0?RzeFvl%WK%0T8j& z)ng>Cmf?MjVLv0W-{9U`2g5``2#&<Dh@?umz`v3qrvw~ZZ(qU%-9k{Z8wSu#A7mievrOqx=FsYIY^e@8yv{n&IFe zr~SH#5I>qyxQ!pfK#F7AU=?0b7dQlw$c)Ga*O^JmTO09xAf4e_!<%vFgvJ#Z@6YDCBbl$b^90Z~7 zx^fzf763~1tp}IdJ^XDF!4Ld)J)CpL|;B>)G&rEq)FmX<5p8 zw)jd;(v^_2c~t}6=%G|oLDHV3chOm9Tg}mpgPRv+*+UUSQ^44k@|Dn&_d|2jin^1_ zWz-!*Sr#PW=TnBYV#>K7wHX9Wo2kr?u&fv*Z!=D);1{Sbwl@e8f90sz{p>abLqW&ixxop`uTG z;M@d%v=Y6-q6Z(uzk})@;$bNz5}*A#88nGDlawf1F%y?NSKodd);{vCabT}Kp)r<7OfR7AR307NkKut*H(Ex~m7@-Cy9Q;^~2T@`GC5efZ_qH=wdqQ^{6U0I1Az8VfkViDoduKcShFor^EUe z$D*pDHig!8r(b9v6qqW?SLUf1A|#xg_a-0##w%#x&+nHrlU!{mhh?I&IvlRxHMo6; z)&r8c2-FcP2)T$na1Tynd5d_h+nS)C^uAojNUbx7nkw(KySf-RhC2qO)>6PEi zI%IS!yK}x5nKYJrFo-a+-*E<7iadM2dfEk^pj96>?3ea8KB(Xa%aV6-i1n$C*BGmgsm=p)PfryAH$fQ;Ssf9)zzOc1JCcF@Eu*6CwBimB^F$ ze4+*>+9zaOYFLyIn>pM)YBJ4J>mEe3DpApxWHBi0b;QV9NJOHEkxe%f%%J?mBsSNW z_L5=Ej#X|q;ZtuU=_i_`BL0{X3+QOca%I zvQHVx5x4dyS+g8gu>^$Yt5(kD(z7;Frhb%#0ZBwx-OEN=k)JDI1SG;T0U{w= zzhbRk=}?b?Z8%;5b1ZR?!{50v2H*W0|I-T>meashu7+HhIE+jvy-R*zOtToL(#qlb zUgKK+mHY%R(<2xZlY2NYrBKwuFGCP0Qkr-g*uEW8>!&;iOL`Hu^7JjzPRz~~RJ-Rz z#w%@Np7Z?8Ky&i1DF2U!r@AhAL^MJ`GysCbWcmA+U})U;nUcRl9z~qgbz?Bl!eXv$ z;m%Z@Zw7(H_P1GRf2^(jnb8S8#lE&OMkKem;iMr$PIyfBoI$K!Vn3& zE(bAtP8yht@5y1({U!;YgU3|I;x4`%|GZqzPw1MRs#iO*C_BCK1d#e=`*yq&21qvF zhdm$UyiTmCQft;84am&mv9hv?_>(M*Aro)CIx>G>6gGP+Yx`FNSJWThdp4|2^O}Qp zJLY_x*N)n2XbBU66soRNJnvPO46h{hQNMda$wAUcg0g@n@3eGXqjeHw-xa>J3wV!@ zKS#g%_>vvJ`re^p6sohU;hfDIGQ$oCbthl@sHylS0-)iY(Gdi_>AMLZY553RqPVc=rqD?0+ zyPxXJ^=f`p%huavA{||{Ck)(Wy%rHa=e<7v796Tot7a<3nW`31!CVJs^@mWysvnvI z(VERxqky^$o_+{R>l9pokB}@}uy_W*dON~IuZ>j7vAQS<1N-fZqSv;kb3wD{s-?yT zr9vhX!C(}x?T2W>It_bOYuHNp$LxKVU-D~@*95NL>-guR?7tEb^^%j~bfedue>Dyi zCWa4HyUDdn-d2CPxJiC(D?|YLg^SKkQVvXfBorM%wJWfUOW+R^4KsSR3x3(u&wTFh zd|C&+eokx88F0Lz%WS{ygnIK1T2)G*9MuHv8m=<%Vz%cmM6&a?PRFhqvS=^PI zmy$~UK!UtOrB&}J!I&L^350;If%gBU6m;{TIi_}c_B8PH$h~0$Yl~m8EnWzYu%m6c zR%ZO7tRWVaERuM6s8+^IPSyqd+E-JyEJ<;lERlKMMj1xb@%^3xePenmXHvl6suk*( zN}FtgF3`E^hi?~`f`QP|S%R$lw32x{J+0Kl{UPWj^YjMfetWC+@+j!ad3%8oil!2? zU5a=A0D(#ajo>wc(iKm?OoJ!>NXILY;gF94sWAjdQctpKQiS;ZIEX9?J#d`$JbKaU z=fSRF(L;$BzI>V__?p~L3mNwcfkhY_Ob&$}sqwN&oGkb}n4A!NHJtOXuqPJg&nDk7 ze+$Bh>mEEJC#Q@JgO@!y z93#MGVRdJnrXvQ3IV=Gtg=yr+TnBgpvp0Cj@dXzWBHJ)cgz z9DoYMxbO0zVbjxwsx{?EZY8NQTu|WUdG;%02l7cJNH5lhP_++KHehxmEe#UJxg>+h zLC46(k&$Vq>0WBW;^RsRj_)eU1^(lqPw#E)J%e>^sIiY+?z% z&@5j0A}>~xky~Q)($EDkw+9&NmftUC>XaA6(qB@ryer%VAdyJF4-W3-vV6_+`u4hEozpK%f z&uxCrB7S=3B}=2Uj~CsZyol!Q4kHI*L;d~@;XWX-Hjm^JlFg%02>TD#(j8L zjLZxlYx@DB@_8Mn7o*23U*+((jBdwAhy?ym%Ti4SM?y>|usg+)HQ{h0ZqnP2w%<9h z!h|wQmWb;k+5@w*t-EPYMV8iD;9{57ztW--3J!%Fg~Qc<;I<+F%TT-b2Rd_);-BzY znJCBY`J_Xu7Fj521LE^D01fZON(cn7=Dl-Q7Lo|qPB^`c2@4pd7*GgKI(t*N_Bsvv z!v;WRB+ZzMe}+FCMgDRrvV?wYP(A_n!s?THqE%6`kW$1wIEhu5qp8OC<@(lN^;vKT zb96<}V&`Gu8@5aO7oMLb0?#kv5*GGkzsh{M{Nu&$mmHj_8Hot6%~{kq@9HWoGZjpA zT{N8#MH>a@Ym1P$ucV?|6w{ng`kE~fu0f?1HiH9Ejbf^pH=Q#NWFDu1)VQEWHXx?6 zEt?7RIbB;-4^S^@u%jMr%uBT};Mt&0GE$6xhl|aZ)Tl6yf?mAizs} za*BMCx|mIFE@UKNf>2Urh494(vNsM#Ix3VoWZ;X=`yh-i#C2&_X>yW3F$xf?@w-45 zTk=3m^t~wJ1!9d(AEx{X_*J0h`y7HN01Z&MSZWiT0dd$-knz6RS0^U&IuFx8Z19+wyYKarn$9m zW^g5c6*Gy+8|Y6#$N7Lqw6@JdcJ)nO;l1d2EHbVMq52O}%s;9ZpuR835!j@#pG2C@X^*!1VJ zz>sO!?`o9ut+XtS9;Epz4P8~aju)o##8=y!5r3QgV-;%|R43j!$a~=|XtwpRA^*~S zDeg(htAbxA+R@gUMw#)E*oMoBgB{!Bj+#VTvlYLzXZB|b_UQo`qm4XVYmS*NQ2@(O zS37skPeW_z8HUjW?tZg(TkVpQuqo`!4!SAsP?uuROhH>cxZ&B@%%!;?^OTF)`s9fj z@?9_J>KjjkEf=A!<;Hiv%y5J0^_Fb$M0PqHb-EOwNr^D(@iTuAm0M9^K~Ke=ah0yP zcCSpM$LWw#7w=6!B5}IpWon*ZT;lzXpEf)WSdwU*?D)3mU1cW5zoun30mI2>iof>$ zG@G?BXQ_u5gwOc_M~u2hn&7j-vv5Kc`dPh}6VlljS(?{UADs)DnrTJY=z#aLO6xa7 z0!~023m^tPvaIKm!GuPoRlb(Z#mEh+pGRZ01q!^C4(}t(jF855$ z#$WV7#s)gf14d%UVs)P#gOl5}F2zZNEzC;`eP|0E0KfMQaK?f^Ue$8ks8Cy?T%&!= z3;g`uQa64Z9`Mh3}vU&2~U`;l(Q50G{b8Mv#1kP9XUf zDd6>Gdv+0$1_RLFM z;+!^08mzK7h(1kvP5NY9m)ypdk(;q?g*n71CJ$7zjX2ameDj^{GIY%mB6e`cbwa5b zh3-9*5#YVBX2=#SAF=w~dGAS{p)R`dhEtw4C3^b zzNOlyhx8^J|MG~Xo!`3YnNS;lAbQ9HBhigBP@=q!g)6htB)!a6+($ej<*9?DQt!;3 ziyFAYpkbAl`xFn*RfPJ2#$X#nCMVK8 z5mx=if=DPLnA18~DANc-YS7`P8ZOz$#^;%JZaYxFV?p$cSSb2u6G z`!!gY zfhK?#BHGc5WMW>wCaBz#MwqCIc6P~kCug`$FVF<}GZ4IObdS%>x}98VfbyC!R=|QR zHYu7gY>9Ym{>IlU|8IZ1#Qd@*;LC11;l~G7UCx|@bw~p}(NeF`wYFyIIQ*2{)$p{l zMl3o6KHvo~;x0m|U>l5zmLQ1GwAR~W7Bp^BYE5_7Gw^C4-MncwLlMC75KEZ9MzkGbH z077mQc?)@O6>WWSc^rH_^XohtL_w;Uj}0UcNL%DJ1)SHK88ZQ;=au!80)uL$u9tMm z+0_)jts5Ffz~jt|LT@_V;x+rQYq@8Mk@VV!z#@FpQfNqD{qP8J4VGz9hZS8%A}Dkn zY;E18ivargT7t0|EE4xa8dY6fwces@Ia(tEge5xpi`44U zrA$=Fb1-xZ_xte|x)Ky)BWfsqzjZ$5JDwm1+cw`CaiNC*#%boK)kx~|{!P6Dh|H`n z-#tbc-JxcV=Ew@b26@2rc5UV**t9`^zdPNnj_MBoogXLwIII4hG`|OAsB7y`L5iDZ zpcqC=K(0bSf`BDf)0&d6pz1{;yC+tP#aW<1U=_M7!A!=F1b;dAWwYjfa!1f@x>xq_RMvooB0NN(4HbjnI=TLyjPV7ASCo87vqiE- zey%_`t%^F_z#2!TKrV>G3V8*i;Q$Zv@e}G0ioue+FH&IHlV!La)2{&Qr83K(Mv^-x zmi9rmN;@kVjQze|x$$y5aKT{XAH!#uh`u*E@XwQ?!$G>loSxsdO(WL3i3j}#Xa=h5 zIWqe{6{KjBqT_<|WvC6~$+$4biK~~O)ie+LC);`V=8Y>@0Ds)De6`e{hN$UC%{sUm z3rb6#4y%4hYBkxUNxZZq5Psw$LRSz+vXA*-*yuRVq_C*eLW{Klhnjm|zGNw0UB+i! z*^)AO8;f4ls2i&TCj0K0+lb@+snPG*h61A+<~CC^y&T>ycM(2vbT#rU7k37Nt@R^0jZX9Zbm^()<)HmGGv;u? zN$}UEfaU3id&aS?ietkMxMegqZo&{GNmVemPTDginUaR{p9r(nTx(43>&5cx{53h< zn-grXhtuk0R;JBcx-&0ss0zU{x6dE|d;`tWq1QpEmP>9whilK*-7npG zu+V^bIk*6HVGM9`Wc3mu4^%BFSCf^6mI2)h6semncWJSkOfk|TDZR7UFy`;1+_RCE zxrms;6f-6Po<|2CC*bg8Udpq?Ig($5q32uQqiYJy*@_F_GhQ{ydb-uujSlPOKO~d> z+QN5$nf2IjJfWoM+rR}Ty8=SiR!%a7A)Oo8#P^b8>tu~tp<9}rb_R(*( zpebt>V`x3P^RfMSk$r5SbacgZ>r~IIG11xF*Mbeao%sD(BOnh(l}Sf`UD%)~W6b)f zxv9hPo-~jQ7Ycd3qYj?bop}_k@3+jcew(=IM=g9(@@iY|IF8@n#s^OTLIgp{NVwqv zxZ*)KvxcgIW5HX+aj4M@2@@G6Bs`xL zmMu#&<90hvKGSt_3Q)~Be%T;Ljd}(ee$75}U>oJD^t|4Y@0RLP zyQE^OxCS(Y4lAaDdN1PZy1)_9FAo$aDJam#QnC}=a#PMeGTcsWn&zt$-7eSOAvH#1ms0^=ShC}#)tQtC>2`)!l3G?*dLJuK*N z!lkgO*Vpn5>3Ib?r5q-l^bFQ%F4pR(CxlBjj?TXVO5@VZ3`iGL6)ooHdK28J{RfeE zx^_Ix@y7On5)tMSlB%nieZujLhc#U$m{hOHCd$p>5NX17p&Gk^k?=8})+s#OLt)Y6 z7-C8*7Vn=7r0)lBdju~->@C-s`HBIWyy}m(gMc%H1ulCX!d?#3 z{Ip)5$DVUuD6z7(vSnlWGKVTHIacq=dU%&T4ASQ(9y?E-qoHQV`LJ(QaqtVtrqmib zJ?;ZVBXLF0k2AhB>krnA{g#pa8Fc@oJ)hNreo445oMww5$&8EB=i|?VRl;f1A2(U-C~B>HAogr`V+GLOsq6%Mm_g z_pysvIJ|6Mq_$0!Wlonz)8HQ;>4Q;zv(2_^JR?srT-*<*%Ocivx{3*SA4vbqMq3tcxu~XPG^1LcNoFee#{EUTl^<0D z?>BN?tx0a0vo+-gg7?;o0hVx=y+1z+>Q6Z6T2=7I~|3KIiwWbpxr>f|8 zjdxs_`D%VjUz^{W2qefN5@g*PtB0_kEMxY9+kwF~FJxFyW}RktC3-h?Esa%qbzGTe z5hB$uD;Ag!x&4aD{6ls759#C!m(!X>m^Hz7JY-aPkdD)WyaXdk0^*&+udfksD6~Yw zY?S=S@j-@BLu-UO=)DH%l4=ADohH~2kik1+W=nAH13KU&p4he87m7_Yd3dg8L&qz3 z#DvjVf=_>zan_F60-oOIIl6?&0kTy%77O2_M4N=+8~G~}S{N-0We0ovQ<^R<*s#`& zYA{*+dhaOSagIKcA4oCk!;k2HpJj6cfj}{P%)utWA!bNat7FuW0W${5~IW`VDZ5aZOQml~tDsWN6y`Zk+H=e{OYWy>lNvIMpAhy12xd$E_`X&wo zJ>RQ>MaKlPhuvK!ghU}mNyg(YKqRPeZe~Hqp_~}ZUhlLHn8EwcMptExehBO;0eI{@ zu^1aFUj&$$U0*abG~j}fkdR8`sF*vNjZ-9z#Bq-zZ25vLr++~!FcU&o3Boy+p~nD; zsS&%gm1PKY6dW-(OyZG#Q_* zq~YE0_5sfZE9}c?Yp>7%)y+XWjuR81B~yzWhx{Aj;erZ3arxN;1cQSfLI(A(9QUD2 z=9SW7psGt5kh_jPvI>|A+^4Mi?Ehqy6qV~HuQrzA_A&kXSy#uv!Z~!DxOWF-Jm@zX z)E!1?4&uW7T=e@+K0^&&XL|Z_sGcuhU^e13Zjc0@S2=#zF0ak+DF@Pw`U4y{xSj4s z*%bH>sFEwo$}oL8{C)g38Su-mMV|3wAmIBzN7Ob3QevF1(Qx+Dv3Dm0s2v`g*O_q$ zY&@HLtGBmAwZl{*trAGg2fDFxkjV{tcVH#R*29=3hodSHN;H3xSb>1~#KTGKw(Gy) z?F^P-@iJp&!vAWBq=Nl1>Up+lNJU|_A9|J1UDDv_kp#!TU98a4svvdH^%NS>O z)yPqLVYzS4MTTR z2}tg5Of2-^4Y@|86fhj6i6X{c2ox;v_cw#?)Vh&_ipGP(xPA%9Y*_W703Mc4(dy2S zyg&gf5}?n9cRrnJ-&2~I!6{ELD(ir9 zeoNDY`bkSSdVHysuzN^p>BX&|7cM+nQZ?%qG72I!t&?o&!Ou}nzxZhHDDyRriMB*g z=Ug&>*5Ko9a>wgLw9oe1ye~?z|7azS%MD0Z$u6`MTrM_;)?e$EjY2Z~p2WraVbB1= z_S6V1_+Nxe!2e2Ztr6-8JK{GF#tFOO#p z70`~QoURHkiT2MsYhHqh1XZ`GgXR=C6LxF}w2UZ`NTmLpanRzk!VnPo;MQoNsi|hL zvVZ-ckO4WLk}5=Ibj$G2$e}wvl++F z;#gt|Z?99jEEX*Km66$VMiMem{WBJpBD6gaA&+%zZ%;rH+>Q)GVGUK)PeK$HxG+)7 zTy|;80o=^Sxp@LkbtcrU2-M%)SmKq938fZdFdHtNaE-NXXK_7|m-N3q)BqqImnxq+Mh#`nay zY=3CzU>nMml-_{e?&BCd=l71n3V_9uQWOH}Kp6>g#dv=Nq=T1IG{ztHa0PEXu_Goa zhLC?Hj)Z{npGW=joUkBEp5n-1ZcN!qZvNIEFovqCUr7#puCvKUBI}mAZF|w7RcyF5 zRHF&Gm<`GO(b&IAz^g-_T`53dd8qIf|ILliIDcGp0Q=YUp-o>Y(T zzZr4Bh-Mr%!p{D6i^DFhj?kR%v#5|zt7a+f4Ef`0G0A2Jo2ZHSEjvkeS4w@*8wYf$ z!r_GxsE2(GkZ+`gw^JXk;>Ngwws48#|CFn!sy2Z8?SS1!R3GNvv0j-*&e`GhROA9776&Xlq^8%#wNsi(A*SC|68 z0-4S8vrqUNpUOKm)e=cAVVF;m08(h78^CFQ@RwC$rP`60;#vwRi4Ty9i2?BA*g z5><8GZG;Ebh9Q;a@`X#O@|T}dkqQAwrEmH-oW$3(-+12g(c41u&iz1HHWxm8w}Y{w z6bu(&p{9)q7RT)OFk;tGEvV(QyD$*W6#A=^etH$%3zl#uh@Mrh$mac9rpKHa`PaJq5p_LJKyur%B* zXAs2j4S*2y;h{s;r@3`Ue&%cp7r=}L38>E6#RY&%F~r+10Dv6)_t8H9?eCMfoBk@W zpZ-2}3Bmt;f(!p|&p?swxMDc~|#O6jrbMQ%>BDe+tu@mIeI*u0D4? zoSw}Jj~sYyXfQdf?#qE%c>Ri3?;WNxZuM3@PWd-aMnZ{w(&Lq+Ld2$6zwPti<`&Uw zNy%nCI>`)c)r%>8j85yADrRq>;NSYVXNNlPE-h8KeKP;!g!-8IFM5a5-!0b)cvrb4 z_}MQx;D&|6^a@&ttL5<+G_&;jK-T$+G3RmLaIraBcH(=- zvxV!@w8j4Npj|S{-Vu6Y!BExd6LaEH#JgG{koEFpn|$K33*0{Peq#hh8VW|kPQUud zXjMfAobSsT4A_n7`0b8%bu&q4MXR;P6-Z9@bl=C-YW~T-Xg)_q*-lp3?@B(U z$f2r#^MosLJHF$EOR>`a<@6+rK3N!4>9|Tb!S0*=SFMTL(;kCwbzYwUZCzvH#^HuR z?(J95s&|Yy!fh>`j3KG{mrX?s{7}Ue`(JDq|N_<$bY!-ze4pNBLAyx{fFwm@a8{U0Q|2C z)W53v-=+GGRMzXP{mIwSDM(1DeF$Kes=y0b`4Hmdk>P=IYju3Wb=`j-lCT$Xc~Rba zSkEH<=}rA6Q^C5|D&jhiW8N~oS_xP39?r5X$mO=zv!hoXj;8E1z_`836^se{CpsY1 z>t4x!)Aq1dI%3}|M>#1PJZ#Acw!&M7s?1so8g`$PQ5K5wS!~H+z6Yu0{JEK=tH{yp zR(_o=2AY&4aD~T}Y;Uj^x?d@8T&M|ZS>6U-&y1l=alp~|KDSEBhiHW)3EVm&gIl8q zzV9z=d4rhf#?~Y)XQh#fD?O#douI?Lr1BSjk$2XK`3Z3|OT7c@bm!%*B>TdkR_ckC z!?%irCo@i5K*cBF6I83m`7Z0fwTbgrJWqt30;u>I!B}p$4#v9E_Lj@FGVnosMfXtO z$J5F0>UtdXapHNG_~LHep-O8s?X>cx)AOSE^{!%_u13vz`xw=;;(22I@{!5#+slRZ zc7L+^s?V$H0Lz|TlXY9$%Uo$Iai{aQLonFi9oqkeToRy5;?C^}aD}b9DBz$-eV
        cE2)Jqds!dlf9pl`uR79>Qmr~_Rq3oht*;7dGCK3Q?0%Sk8`Z!}3}~SnEvf^L zB3r@-tHMhMU?@k8J3aIC@VVu8D98En7xeN^u0lQkGp6mF{2NmEhmQPThu!}YR=pTc zp!_vD`#wN&M$8_V1tgAH3=R&zsVJ-y#2br~msWO8*N|@P)9o z%W(l2lKRQ)$h~H41<@;GE$5bz)p_Xkeg7eKT;4!g8z`{Lo6KwM|0s-Y9kp9=;WGY# zVQBU6 z>N1&@NEy46O#nq}^W(&-@`Rc7_miE9bHCL@Ywt$hGMP6V-gUy^1i^rDB3(FKh9I8| z_G{2-ryBbCX>{EOoel7H%jpcTtpx_6H;P&2YXvmjt0qy>duwJf6lPwOJhZ zy@4I;|A}=EY6`N+K27Xar>I9Gn- z#Bjve=BSlZHbT%(b=0l}u(Qtur7?nXh92bm@RjOv*k8fPfyuDR|MD;4dsB#4P*2Zo z8ls_n-I^Ws@{+o9*uITWoC#HNO=FMnxRd8Grd6MxCjZt6*jPjKvIAG2J4SfdQ0UwP zxb`f>F8KFQma|4WQ6Rwb7Hzv6^ZsVAnH_L(gW@#O`V$z#yi)KjFsZf?I5EPC!eo85 zEzY%rSCgv%75&5GHPrT$I}x(T3_kyP?eHbq>G>cO-bGl5rZr?uX4QhD_OmU4k};U? zV%d6PO#zzyYW`VOn-etQH*inx)crOLIGHLx)pl%{-+MpDw60HuH@<1D-TWs15qvDpWDA9xRtRA_VQjJa{Ee*e%T5OfW{5#eorlC%!wf)>oY8Q z<@G2_S;@ASSRykzE(E5Koe{0BMJE;V`DpFwQHdfG0TvROf6qash;AFUtRQ9K>0w_{ zRaNV4ySHRTLf_wzMWDQ;Rd}#N2EiKqxxKovv0($hyfyuib(Y1KI|_5yy4*IE^JZY@ z-0hwTxN`A`(8#{$$e~W3LuyJ&6H{9cdvVd>A+C4jwtdz8NnZyVx%Yc|#ZipiB9J`K)>l(Zz(^y$8&$~T=H!q$T&dX&zQ0?R(kBxo8g2SPhd~$x&$<3&cq5y$p zG<`0f&WTDcPcB^4pd@X7pRI7|HMbBy>5fz5daCXuvJ-G8^wO zX9goKxscmg%j$^DR0Pl3NU?>Pk-?iEFZAo}MxSKmQlCvB>=#dt@5LTa2#`~yO4I%W zD{MvE$GSr1L)F<59ngb}TNZ^_Ww}LOw3IX!k3-uF$34#5*kB{n%RbnogBiZIt{*dU z`}Eo;jVe7aMd<62tQkO{Kt`ryuon2~-ZFXCs}e(BZ|U0V^5eaYNnw8e!$Z+ttH}zZ zzA3*mTUB1-i=wFHETd^uo_Y!691R zH~1iaiRH}!0#2o6{R0D8zP3w~S!Hagoe$ev+N^>uTq&diR2`4NXh*FMJ9$}I%oi>Q zD6-{4Vq|vT86MoLyHQ*U0^#A|sdlbdgh%;2H-e$piy!?OdnK2^c`~-2m{h+5$H~mf zdU(YV>T8XDr)bC7ke-$ts)ndw+f5M1>VK(0^{bwr3iavu$e$eS6$DaA7jr%N0iE`2 z&xIj7XeQog6w64<;m3a+tF_3Eq`Nazpp?AO%8~1ozvS^no`i@Hj|`6_|LF#odd;g6 z)F%eIQ|H`V6-^0LPImS@>S=)#T)|Z-%j4}xQD^&TiD>&!W4cm!rDdM#`NyW5UbB}U6BTRG+YJ9YBcS*Qnp@>DibWb200_4e$fUKIDA`{4)a$p#MFTs+OiMVNf|OxCPgFyhHhwAPcSkI`Ul}$&EQ#h5b4!HG@G{R>>0`Fp(V-FUrN=EKpv7( zx56ga;%5yrB+amO=Xl(!+gmFl7AI((?NkQ*b}A|N%q)tIf*_t-5PA?j^G?lm^~)eu zrO{9qi+%eiwgmgZmWK?j1JCWIy)T6|Wcdq&7vgg=iNR#u*mihgt7&Mg!8lw>K99O$ z=~hQyCE9$vN2G{>Zuc{atl7@M!trRADZ|-Hd%JnT@n!X0kCB7@iID{&$kkxCdhT4i zsfcZnjHqNMOkQ4=$1$vG_c3*b@=Ul_B}4LZa|`uKGBc7NEk?qhcjRvlw+0++0#9Wa zkJW7q%X0~>Mq;JPO#SqFox1fvUx5%JGnBX5)*7%=Ef3RxvpaXkvd{REGAqtYVmFC< zwi4dx620ZT{$_-iHFoRvYnWuunp??~3Q~Q5#=w+9?xsg`hgQ1%lO|2x)(x$Pp%-#cJXV=^5_w+YK*NItT(8T8R*?e4}Fa_1_ zEOtxypKj|%W@dLmRay0t5Fuq|a`=jq1QU^+f+V<4=tuWAhMYR*1eG0sR*rNO2bnFv zZV$@FVC`x51`9$AW4dEQ^>{|5>my$q44MsvCrv4(bN;aT=IW`cm-XmsV0BgRuG6o4 zmJ^cx3c9t?n`^1j+Iab@B~8=XKeP@|qcO(Y2O9`R#S|}m8Xmo}{zUkSlEG|MtVsSR z9vjma{VJp2-bAo`T6fOE)8r51wu*bz57ur+tvh)YWx{?-PQBmThtc8V(wYG$wkN5>FREs73nds<@E}BxWv&}(bcFNdS zy!mQ3P+_i8BaH^NrrdSiiS8T7?h|O3nbOOWd34;KC2J8CB7i;i)ec#;8yg)X;1=o> zMQ1K8CwH>a_i(-5ciBKWeLly28}=W`yh}>%EQ^0q`2f_MM>wkG~b@<$pLWzbb%F250uQ{1pZR|Yi8p>B0?<&1je4pT~ z18yalQy62=f%hsev%wQ&r3!a`jb9vy zyK*slYARZ&1glGez+SHPmeZd5W1$NR(b3U73L}nAdFsVQBUw@Mes}hz4a?uE>zBGz z%-otyM_l+A%;JffnVKkx^y$~kI2@wRg->yI+LORx;&;HGUaDmHhEO5Bb{68tp{SpX zfJ=KcJ>Q{^oOH(}7qv?m=u(7h@L8C?u^vuQ+|c4(=?2gVE>-LlaUc2_fY}e8Thf<9l5n{P;zddvzziEovm^skMbUZ%h?F z#LQR89{xDX&Z>d&gXoRnsIPCCl=GCnkOL24HW=S|#udd*a`Hg7v-@fA9-D{Kgy1C8D^~UU! z=ZDXRa{}13qjrLpqgeV=mdoqEQg3gmKI2xIXB&5p*h{JP@LXLBjRxK`9Zt2&x}cij zH95AwHq>eHfRID)yF~%GlNJni2hid3Mm)Inbe5v6N9%`-fvt{LDV}Syde86Fz5UK@5|~Pd`Yt*c&UP z4!|`u*sz^QkX7JiHl34`eT$RQ;Mk%NTZ-l=zV=WjBIbq8AhMugbyHui%O7|dE^ds0 zRbKO-x*x!Qt<2mUq1V!ivp0Ie#eAG05f@52%y`4X!&iU;#C3=gjuRdkAK@_GqW*B> z+}%7Uf57{KojT+ZTZB%-);uoxK*dQ4C66f(lo*xni*yUUU? zu`(-CBg;5`W+D|<`b9of5g)MCJDD=u8+O3jdCIx2EJge>hmpF4=)sPc`s`7WXhoyg z_9T^Kj4Ng5s_i#wA%t}oG!`Cyko$}UP}J1np=JV6F-vgvxUJVVEt@bUT4F2?)?8yc zfVqTN1Zh_5gqR6kC?A@ zi|Weezhfa00+uelyQviML!gU!V7b=&GUaw$+&4VM7sgH-Cp|u4&2922o;wqZ>q$v{ zgfkbTW?yo1XP2Iayx-Pq(>vEO_S88g!!pS}f)biIf$;9);|9F5wjT-&&GzU!pOb&-x*p65{GYlOyfPdH&Pr@*OAa-X`4wetL)B#>8mA zPOeTBE#?eKy2+7e{=3jbuhlW5*L!`)-%&gou(AHNo5*CxG7~iEj-fXhuXE@lF3#PY zs%7L-|3o4EJ(!4NQi##^rVN%e1mZxsPD+4JLP{y#A9WnYq5r6fLa?&5K|37Xd~PWO?y9OK{>tmQt{nq1Hbk2Rg1i9HJJQC1o7(nCbH3>NFhQV}f< ze6EU=o8{@_rFY$~lQeOfyuU~0V54Y!I&+Zh4!J=>LL$@~i`8H1I)Hmg7|B5SKp|Nu zY**omQ)suZ5olVM068t!V%I17#o18kLxw(B?z!ny;|orAX<2UqxYxbhC#{=D3z`#4 z`VhA^EA8NAMF0pgwpxx>C%4#^mrQ=}Y$Qyw#0*vvm*tblZO_YM?CV zAx8TsQzoYCsapOIZ)KCwy8<1qujP!>{9WBI)~*rUpBM~nC^|8bRmYlDylbB50RvK9 z6i7|rKO`ljqs+=7*ain!jYmaBLi)L_M}k_&g`JffU9;B#GWl&LX}H?j3KuONOw}H~ zoA$!ecpcTNUzr*5?kg|m%PxJSfd?&S$0g`tl(IBoPa?_5>Em&@dl>@x)y>J`AH%@U zS?NVZ`6}gJwNK?q`7MVB)8vtaXWSr3ZSBP9g@a_ojpqPHP7rXLf0i z@`mlne0n@u6OR`-3Z1#j++275Vc`vbUM$N{j)5osF7iM(^ZrDf>KUE6agO56-eklJ ztl)4(>Ki=?r2XF3Q#C!ist`%H>ZcjPQWw=u8!5?Tj4rNxy#0*71^XTCw)X+*CQF`I z@XaG7F(nyhZLYfr#3KaoIW7DB7dVW$qg_p+j5)2@>&8BQX@Uy5zdoHnr2p>F+lsolS3gC+x6l{Muh^S3dTix(VUt4g=Iz@iTu)(P8Fmt>J1GLIanaEr zE}M>CrJ&b>AsVBRg!rQKWK{LXoeYK1+oVj? zBt}pP9Ub;(SuAttc^<6##vUN8GVC>(H|5rz)VC0h53D0mYw?2 ziJ6K86}T6;I#xwt9uyeJh)CVqy*?dXVP(%}D<^9d<}ZdHYqmf! z7#J8}GBkqVkO$iv#h4u^+uJojm~p4SQ>9GQ zp5j7R2g4Q`6g5vP*p3^Mo1(JG!^wr23D~YD(D~ZXJ!{1>;V;nbI;{=BrAU)lrJi4U z05M~qz@7KPHz!#&Q+*LBX^ak+iaz)YNci zzDK9RBe~uituqMhFXXnjp6hp}GMY-rb!{U4dIDi%a7EE%or!$tnp*$1;WI0T#WDHv z3Zz(bld`8DryO2x?wxezz`&3Y+T$0J5|9mn1p6=ak~GN4c|VIKoHB1-!)S^2mixp) zT4%$7^QkRI*`>GK;g7XAciThA|NDHS)kld~O4mP>0+yrd2Ygevv`lhqF8g}-_WQYo zu?V6^6!JTPK|zFdVx4r7bOcziaM~xzx1g_@T>^9K>O?&ICY$pWFK3mKCiA2Q+V&O6 z7gHy?VE9)({IxS)^7RL9EgF2iwir6E0CwDftoJx_-OlKr_@;) z2{G{xA`|A;DHJR(GARHi@3wHi;tM)^*hKkfalr*Hsn> zwd{M2L2@%)Qos@KJY zxgLkUt6MGY6;J>8v_#nnWnxJ)qdzP=a!@+_*{yXLkMH}vS|eD>5-9f(d>xXW1jF+&jkoHuE5!ZUAz z2M+|?Q82Z9{_;0dm1^A#6@2Ir5g}>U-tWvC;KQZQ-2a{J?|1}s9NWHOg4Q<>hZe(D zc0y1kYN9~~9ZwL~ap7*(1@}@{O215KmBTV9er0XVxZ9eZ@+%~HNHgd44ZW|2$Gc{l z?By>T&l0MdmwWXAck-aKqk&Vm*W<p+r1PTP7ap1VoSvEUoCAuagvt{frKO?7>hB$PA57nvKS>5FqDmiI&b#waiu8A0N zks;+sxFb%EF>b>+!Q*0}XKj5^adE`N1TXZDj*cR~0xQKKIA?}*L$~jVt_liJ58hEs z5z+rQ{2yYb{^%N4`&f209ZqHvK6_s=JV@?f zBLC)XRzsjnrk1BFy=XT0GgtXDXYMp|#71093?euBgdT#k*cDC7rO;bcQewB~kNBV= zC-*qe&NfHFK1aV8C$|l`Xwf*E)0K+#ts{TLhRrB#t(>$^zcMMCD#|g2_0yHF zMEfg`UkC{FY@8R@lg zrQFj20fWKx1O%hv*3?)N6NsbUmYS5QdZw_6t^yF97I0mk{DDogzmXz5m+S6?jvuUn zqv_1>v&jpvuGs%4YV40DA1#y)3C<_Wat5HuBg(T^nKFx5xo08%1^KE>;%m@D)Gd4? z3ze_WyeyRE7iAvF$;-XJ)pR&Ys`rnWFr7>)QHm^e-^(_=Q}Ig$_i zBMl^*wjT5avdhky2}Mn*J{UnF?x?-y128^cn!ci%vsyyD$;ME|!_L_X+uP$+Mr3q! z;wMlRwa0+<5oei+{5sE|AnG-DKd=+l8r@HDMe`pB8PU@PYaurNF5L;E@e?r*Y-pfX zEY<+E_4b+$?*(R-`l1&=HzzpV+d#072ooV+*rj%;**E4iAMTS=j5@E~u$FHY147;x z9xQ_x-5U8?fh|HFdmtK`$hz&l_}y&9ROyhaD$V-3N#-iaP-5dZZ=~&ywi?^V$3FnU z7V#l+Ao&8%>urUlPL*pj)=ZuWLr+OfRS~o{_ zwNhfp@=LgBKB2s{NOqqdHP$ovk&%%$ZWP!S^rEt(_4)jkaaJ#R#@HAkEmx5>rAG1O=hXF4Xx#hlffDB- z!#Z3L`m#eX(RaC6c8X53)3Dl~TwJ~*HKs$fVMuA5RxC{_9UhaHo9r0@xM#ai`~tnI zAHRNmtm}wk9Pz15bR~XlRvrELOd_52pv24Tf0CJ&_Imq=*xH+RYh5spxoYY+8DrzY z;SB^NND`YuAj#raTG8vzM#&s~zEuO{iWHV(l_H*g1CgsLj6XJe;`j{4qV3|jO+M@Y z92i*4f+h}g0F<@0dQMauabS}Dsy9RMu}NboC{|%ZnuZI;#p>r4*4Gy16q;OGCoAOh z1&V38$}QBj>rFA2>p=NicUysEphWTLpz+9olZi|$=#g!UfcMGKt$U2)%YEW6dJ=(G zvn;^*4Nys!UO5f+IYO>;Z`ubi68X#{LJFc)jJJzu{)ad+3B2-{pG=4e20U;Sny|2N zSSdp&6-4^8 zh~-7rkyZW!N&zwDg{~Nf>69MfYNv(coIUq=ZnG2-r?au4U_nWG-d`1-;jaTDG&MC* z6BW)KX(AIFbj(K<_0ENBXQVTh#S-&w`udD#-j$*<^-bEi$0oZ7ZTOpukogZ#UUSv( z;uk`FsF7?k%$eAUfou-x`71Gg7JET)b>MQg;A&_{yG-a?&Z&pbXZ)-3NR<7sE0+K8 zGkRIjqjJW;`%g?W38)$PoCiK7&u4K|&)>D0h9UQn}hOKMZd+uhv`jnh$&?)j!>A1R-srPntZij1b zd%toA%zEqHH_ulG7*CoyIwEe30L3C(X@&@Bo)+!;H2lL+bvupUi8Hd_2cv;f)NZL~ z{LowO(1}HzX{1sKsFPZ31+HjR!d^|M9~=j3tdObYt1j3xp5x&L=+@W{w}(>|Pgl;n zT=bVC;YUMaqO&76!Xa>bEv)mZH&BQm)=jGr+#qiR36B$;j-N-${x?nf>-9&~C{ zCCO)eeUllDNc)Qpacgxhq1ac^aNV9ZIf!s(O}Cq7TDP`b%Qb8?W`h%toBYZ>Kt zNaX>9H|P&Ost*slcE_@w^PUmHE&84>9yCtRTH18&$b*UGBA=f0H%)}>3VL~5 zoW<`dNxX0B>JqC;Q{o=B`lXejWda71;kP+SF7jevd;luj>*p9YVegL{&6cSnE}83} zY*^k~!)~;4uXV=>eA^xvv;4*j3QBz_=rPJYxw*3xApZeai>Ji?%uuI zmDJh56U==0;<)uYG%i!1NuR;|I^pmaql<;RJnJZU%vLGhHuM?5Qb#8z+hlv1Wu~1m ztWr}#Rf3$qHAVz6Mi$;wiFDP6#C%2G6_rToiw;#fBKz*vPgk0>VYo zZfewa4qcdWrhE)hUO^&93Y20NwgCPCW%$c;eTRcz4hJ%^ZB9&@0=n}|!Bm-=HAuUy zuXZ1BQ8R3QAiVY>?6nb^p)Kz5S__P#Abh;=`?|IE=|GGMY00n=feJ!0JIqReZzd=)XqCDfbegD+34(=bpeA*yF|WV z9AwBY0G|rl-Gh*Z8cP5Uii)7OoiZi4N6MAsEb7Uxc*MER%{9`8W0FbqI;e3 zxGfo8FeztiIuO>|+S6-JdT+g%or~EE-;y43wn|`yD;$sstj%Rv>~VaLuaCZEe;o|{ zK_ljb90VQ*6A<~;8SjB*tUA0t?G~3Tk}MDq&xa**%12Qka&mHf#M>sSJyYvu*VdjZ z0||pSlO*16$`4jWg@kB*dHk0bD>i?f`bXV^Y&Z4fLoXve$d$u^;!LuD>u~cx@Ir;d zp--pEvaOsfX*=Ussa4-dlFQ1+?ch%Z{k9o)lL1y9B>xDEpM-4-(C!@KQft!F)62&{ zUEYd}G63xR7t46%=q7-PMV`wdR3b+aC$*l3b-LM8@XfQhq$>LvM*sZ8?BV2X4Ctn? z=9PwdTsb-`NogkAtXO&vW%#=_5^31rgkmv9PEz5H_3tx&UE~Y(yhjw$<0ex zf1?n`V|12DBFbY3w;Z2Lm!;x|D)!%->|~+|ttO+!}jIgWX(Ae;-rB z_&8iVduo|ON6CVx&gnG8>z34xV_Z~VMqDhPZ2%k)fuoxU)Y{*uXkM%jR{H16_TnAWGgB%<1Q1PV}#CKJZ!fC@mqI0txT9r`I^+k zgnIcC?QG+oGmGef0^@m1_%LW#lDBK&482Uh{moHMps*V*P$R&sldH%uRrRZInc9cQc}Hbd_Auq!23K6L zpO4S;J$DbJKtZ8OeJg-W2TMjH$8#ng0%A@4-!%vA=u>#Hes+;(cAr+ndSoC_96Xx^ zrgs1I%S(DarP9*U0u8u&5JijIne4rw_LASoS+y;&W1kETc3vGQ>x-zjuHSV#c57^U zbVlP{*Q92_C+vEnGsIo7A!t4NgTv(2j#FhnXm)cyk%8rooZ+0|`u99J51{Ukr(v;6GOCL8;^4pyx!Z#rd1_ra> z1Ii*%+qoad7D@iGZ+7~GST$@4ln|>eo!qWCg=;?fJ7ffsAqg!8UmFGrX|CojP4?<1 zqR9{d%3&#B?<%!m1}iPz?o`p#*KG}(OH{(nCp$67ZA{F)TC=|7N+J^g@ZWShSaC!( znaJc;;!kVGmx)3D*3O{E$0JpoRGsjyj*zXo~}ECRaW4`3+tmi#E01A#Nsl#XB*P_D)Vm6LX^`4i zZ|u0N5fZ_nU2S2RlSoWOLB7Jq%#4q&M<9WiJUF(bjSR_s3&QswmW84w{MzK8D3KrB zE6*dpm~SzRk85cqkRg$8O~UOj8=Db_l$1h_Jn?di($LZR_K;auYfHzwUv^5Bl?bq2 zJb&P?_V{$x@=5%Cf4auk0t8sK(F^haU^eNKD+v2q9WSGa^yEI()u_c$zCR8O{ z1%>!IH3fUmXH}mjy-sFkjcmCLd{0j<#A!jhXEqWN$6K$dDl-e&Qvty;;cZKF@q@g^8x-CwCP*sCYM7)>=^u#Q*MDZN#R5HYKWv!yt_~Qt?fD}CHCDWz!Yt(ot@ve*bA+U^vq(huvuc8@>ym^vXQZAKA(!-5B@Hj{Ff(O%8ZCA zi^!f41oV+)$HtSqpHw*fA+ParsXZjcmFYectT0w*@lxYKoQ-i`0|uj3<{H98DmpXS zv)Ja1@xqUO7>JF{_3~HDXC*bBAlny(RwvJRD$09`QO@B>g?FKo!$%s>f^EHtk~X^! z;EA5D$+3V9c9d;9wcuysOy)a~sA=!c^dTn*Agd$jVc>~b9B88Rgf4W#-LAcs2>4kZ zNUpz}m10w^$jF7|sR1u9|M{zkMLt2R^m9p8SJz-%2cEquWK<@LeKyRpszhznGju+z z;O_5+xa|&mC{uyHxTNtn>s8pdlo{@kLo1Q|6SHCN9H`2}xiI(5iE6SpKfg?{^D8qu ztj{QS;=u~@_)J1WY4ZxcV@BtIB&0njrtPFE5_0T0EXbh?TXMgfuFRKna`*tgliQVG z7(onzMBNFLp|8Ts5Bg2RJ_SJF)!+ddpw^SvYw*->FAED!_q0Zby}j4=?}dgKrVYpz zTMr^*_xq^24oOLPW$P-{c=nHcD9?-Sexf3wIMG(;$H8N8+6gC}`F5h9FBj(-r=;x^ z7CMZ}Wxshji`u>=?E0&f0!0jBD^%c>z7OMBJ&!d^+YsKQ@^+&P^^fwo)8URXOqhKtQ!}?rdhkG7mS~J)wEhW)NldT6d%+FEfjo_I!I_(uM}`XyC+b zQ8+Jq?uq7nWd=!AGeFYv_w_X#=zV2*exNIc`}k_c#xlx;_dN6_e>245&wOp>fKj!( z>+Ih+fvo)h{wTef&A?qB_4zHT@2I_zc!W%$*JAtNx_Anly@q*cx39e$8uee{eg0<= z@ZD>aj`r-jZi9yA`)A$ozii?^zvJKU^#9{9|EbgeD`Ee1$G=bM|2sGT{Z9WSZyx{W zz5nNT{L9||C6oU1JN~7}{S%Y^%w>)+qQjXC>ob$v=0lGq2uK_vS}R9QhwEU7uT}?s zKA>fKx{gP@ChbO#HiQ000{{j2s@QPvkJ$fKm#QE!Df&Koq>{)!qM2Evl#(97G{l>5 zS2LGOs>?LwA+5#%=PZ_^!G1{QTa0D9_nv^SLq33#h*K&#D|-MjOK zEHohK0fWrJs%ytv7PS~oc}*6M!jA^}x_2GnA&+-E%{xf3D?`+Qxsoy_D&pHADVHG1qe66g?IJ+1()-Q-#Uh-c%KcBMS0 z^y7g>fb1@kX)IH9kLFm`Sn52NZYn?>;aZMT&~^9KFi(!jlFi9cl-JGbx1-ph{KAOe PBZEjNyeJZT?fbs~aR)fB diff --git a/public/css/index.css b/public/css/index.css index 915b6232..11231f90 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -35,7 +35,7 @@ html { } .logo, .h-logo { - height: 1.5rem; + height: 1.75rem; } .left-sidebar { /* Hide Sidebar off screen in mobile */ diff --git a/public/playground.html b/public/playground.html index d6cb4917..5d70e6af 100644 --- a/public/playground.html +++ b/public/playground.html @@ -58,7 +58,7 @@ text-g0 " > - +
    Playground diff --git a/src/views/modules/components/logo.js b/src/views/modules/components/logo.js index e99a0dbe..e14a6acd 100644 --- a/src/views/modules/components/logo.js +++ b/src/views/modules/components/logo.js @@ -4,11 +4,7 @@ export default function Logo (props = {}) {
    - - - - - +
    ` } From fc88581a141cf0800048cf691b33cb4cf0092b7a Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 8 Mar 2022 10:16:50 -0700 Subject: [PATCH 382/680] 3.7.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 28a82dde..ace34ce1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.2", + "version": "3.7.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ca111237..f960b199 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.2", + "version": "3.7.3", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From e81cb84399e2c354029e8a8e848dacc3afcb3e15 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 9 Mar 2022 18:24:43 -0800 Subject: [PATCH 383/680] Seed data Remove `NODE_ENV` references --- .../en/guides/backend/events-and-queues.md | 2 +- .../docs/en/guides/backend/persist-data.md | 2 +- .../docs/en/guides/frontend/web-sockets.md | 2 +- src/views/docs/en/reference/cli/env.md | 11 +++- src/views/docs/en/reference/cli/sandbox.md | 64 +++++++++++++++++-- .../configuration/local-preferences.md | 2 +- src/views/modules/document/ga.js | 2 +- 7 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/views/docs/en/guides/backend/events-and-queues.md b/src/views/docs/en/guides/backend/events-and-queues.md index 5781a553..57608470 100644 --- a/src/views/docs/en/guides/backend/events-and-queues.md +++ b/src/views/docs/en/guides/backend/events-and-queues.md @@ -239,7 +239,7 @@ From the terminal, run `arc deploy --dry-run` and take a look at `sam.yaml` in t }, "ARC_APP_NAME": "arc-scheduled-app", "ARC_HTTP": "aws_proxy", - "NODE_ENV": "staging", + "ARC_ENV": "staging", "SESSION_TABLE_NAME": "jwe" } }, diff --git a/src/views/docs/en/guides/backend/persist-data.md b/src/views/docs/en/guides/backend/persist-data.md index 3a6b5b49..7c180d6c 100644 --- a/src/views/docs/en/guides/backend/persist-data.md +++ b/src/views/docs/en/guides/backend/persist-data.md @@ -896,7 +896,7 @@ npm i @architect/data Now running `npx repl` opens a REPL into your Dynamo schema running locally and in-memory. If you are running the app with `npx sandbox` in another tab, it connects to that database. -Try starting the REPL and running: `data.notes.scan({}, console.log)` to see all the current notes. The REPL can attach itself to the `staging` and `production` databases also by setting the appropriate `NODE_ENV` environment variable flag. +Try starting the REPL and running: `data.notes.scan({}, console.log)` to see all the current notes. The REPL can attach itself to the `staging` and `production` databases also by setting the appropriate `ARC_ENV` environment variable flag. --- diff --git a/src/views/docs/en/guides/frontend/web-sockets.md b/src/views/docs/en/guides/frontend/web-sockets.md index ca3221af..1bb58270 100644 --- a/src/views/docs/en/guides/frontend/web-sockets.md +++ b/src/views/docs/en/guides/frontend/web-sockets.md @@ -105,7 +105,7 @@ The URL lookup code could use environment variables if hardcoding seems rash. // src/http/get-index/get-web-socket-url.js module.exports = function getWS() { - let env = process.env.NODE_ENV + let env = process.env.ARC_ENV let testing = 'ws://localhost:3333' let staging = 'wss:// fixme: these urls are printed after create' let production = 'wss:// fixme: these urls are printed after create' diff --git a/src/views/docs/en/reference/cli/env.md b/src/views/docs/en/reference/cli/env.md index 1fa8ce1c..cfee3ee8 100644 --- a/src/views/docs/en/reference/cli/env.md +++ b/src/views/docs/en/reference/cli/env.md @@ -14,18 +14,21 @@ Read and write environment variables. This allows apps to centrally store sensit arc env [-e environment] [--add|--remove] VARIABLE_NAME VARIABLE_VALUE ``` + ## Flags - `[-e [testing|staging|production]]` Displays all environment variables for the specified environment - `<--add, -a> -e NAME value` Assigns a value to the specified variable name in the specified environment - `<--remove, -r> -e NAME` Removes the specified variable from the specified environment + ## Security It is imperative that the `ARC_APP_SECRET` environment variable be set to something secret - especially in your production environment! This secret is used to encode HTTP sessions if you use the [`@architect/functions` runtime helpers](../runtime-helpers/node.js#arc.http.session). + ## Examples ### Display environment variables for the current `app.arc` @@ -34,6 +37,7 @@ used to encode HTTP sessions if you use the [`@architect/functions` runtime help arc env ``` + ### Save an environment variable to the staging environment ```bash @@ -42,17 +46,20 @@ arc env -e staging --add FOO myvalue > Protip: values that contain special characters like email addresses should be wrapped in double quotes + ### Remove an environment variable ```bash arc env -e staging --remove FOO ``` + ## Reserved names -- `NODE_ENV` +- `ARC_ENV` - `ARC_APP_NAME` -- `SESSION_TABLE_NAME` +- `ARC_SESSION_TABLE_NAME` + ## Specific function opt-out diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index bd845132..7a9efa69 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -15,6 +15,7 @@ Architect projects work locally and offline. Sandbox emulates most app resources > At this time Sandbox does not emulate `@scheduled` + ## Usage ```bash @@ -28,22 +29,25 @@ arc sandbox [--port|--disable-symlinks|--no-hydrate|--verbose] - `[--disable-symlinks]` Disable symlinking `src/shared` and copy instead - `[--no-hydrate]` Disables hydration + ## CLI variables The following variables can be set on the command line when running `arc sandbox`. Other variables will be ignored by Sandbox. -- `NODE_ENV` - `testing|staging|production` +- `ARC_ENV` - `testing|staging|production` - Defaults to `testing` - `ARC_API_TYPE` - Set the API Gateway API type - Can be one of `http` (aliased to `httpv2`), `httpv1`, `rest` - Defaults to `http` -- `PORT` - Manually specify HTTP port +- `ARC_PORT` - Manually specify HTTP port - Defaults to `3333` -- `ARC_LOCAL`- If present and used in conjunction with `NODE_ENV=staging|production`, emulates live `staging` or `production` environment +- `ARC_LOCAL`- If present and used in conjunction with `ARC_ENV=staging|production`, emulates live `staging` or `production` environment - Uses your [local preferences `@env`](../configuration/local-preferences#%40env) environment variables for the appropriate stage - Connects Sandbox to live AWS events and DynamoDB infrastructure - Requires valid AWS credentials with the same profile name as defined in your [project manifest](../project-manifest/aws#profile) - `ARC_QUIET` - If present, disable (most) logging +- `ARC_DB_EXTERNAL` - (Boolean) Use an external DynamoDB tool (such as [AWS NoSQL Workbench](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.html)) + ### Example @@ -53,6 +57,7 @@ Run Sandbox in quiet mode on a different port: ARC_QUIET=1 PORT=8888 npx arc sandbox ``` + ## Local preferences Several Architect [local preferences](../configuration/local-preferences) can be leveraged to change how Sandbox works while developing locally. @@ -70,6 +75,9 @@ The following can be set as a part of the [`@sandbox`](../configuration/local-pr - Defaults to `false` - `no-hydrate` - Disable [function hydration](./hydrate) on Sandbox start. - Defaults to `false` +- `seed-data` - Specify a custom file path for seed data to populate `@tables` with on startup + - Defaults to `./sandbox-seed.json`, `./sandbox-seed.js` +- `external-db` - (Boolean) Use an external DynamoDB tool (such as [AWS NoSQL Workbench](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.html)) ```arc @sandbox @@ -81,6 +89,7 @@ no-hydrate true \* These advanced options should be used with care since they will allow local development code to interact with live AWS resources. + ### `@sandbox-startup` Additionally, Sandbox can run shell commands on startup by setting [`@sandbox-startup`](../configuration/local-preferences#%40sandbox-startup) in [local preferences](../configuration/local-preferences). @@ -91,6 +100,7 @@ node scripts/seed_db.js echo 'hello' ``` + ### `@create` Upon starting, Sandbox can automatically scaffold resources (via [`arc init`](./init)) found in the [application's manifest](../../get-started/project-manifest) that do not yet exist. Options are set with [`@create` in local preferences](../configuration/local-preferences#%40create). @@ -108,28 +118,32 @@ templates events path/to/template/events.py ``` + ### `@env` Architect Sandbox will load variables for Sandbox's current environment (`testing`, `staging`, or `production`) from a [local preferences file with `@env`](../configuration/local-preferences#%40env). If a project contains a `.env` file, Architect will load those variables _instead_. Variables from local preference files and `.env` will **not** be merged. Further details, including the variable load-strategy are [outlined below](#environment-variables). + ## Environment variables Sandbox automatically loads environment variables for availability at runtime (`process.env.MY_VAR` in Node.js). Environment variables can be set in a few locations. It's important to understand how each source is prioritized when developing locally. + ### Load strategy Sandbox will prioritize... -1. a project's `.env` file (if it exists), +1. A project's `.env` file (if it exists), 2. then project-level Architect preferences, -3. and finally global Architect preferences. +3. and finally global Architect preferences. Variables across these sources are **not** merged. Using a [local preferences file with `@env`](../configuration/local-preferences#%40env) offers the most flexibility since variables can be specified per environment: `testing`, `staging`, and `production`. + ### Example scenario If `.env` is found, Sandbox will not load any variables from any Arc preferences. Given the following case with 3 environment variable sources: @@ -161,6 +175,7 @@ process.env.URL === 'https://arc.codes' // true process.env.ADMIN_PASS // undefined ``` + ## Local database Sandbox creates an in-memory instance of [dynalite](https://github.com/mhart/dynalite) with `@tables` and `@tables-indexes` found in the `app.arc` file. `@tables-streams` is not currently supported by dynalite. @@ -169,10 +184,47 @@ When Sandbox is terminated, any data written is cleared from memory. You can set a custom port by using an environment variable: `ARC_TABLES_PORT=5555`. + +### Database seed data + +You can automatically seed data to Sandbox upon startup by adding a `sandbox-seed.js` or `sandbox-seed.json` file to the root of your project. (You can also specify a custom path with the `seed-data` preference.) + +Your seed data should be an object whose properties correspond to `@tables` names, and have arrays of rows to seed. For example: + +```arc +@tables +things + id *String + sort **String +``` + +```js +// seed-data.js +module.exports = { + things: [ + { + id: 'foo', + sort: 'bar', + arbitrary: 'data', + }, + { + id: 'fiz', + sort: 'buz', + arbitrary: 'info', + } + ] +} +``` + +The above example would add the two rows above to the `things` database each time Sandbox is started. + +> Note: This feature is only enabled if the environment is `testing`, so as to prevent the accidental (over)writing of data to a live database. + + ### Live database example Connect Sandbox to the DynamoDB staging database on AWS: ```bash -NODE_ENV=staging ARC_LOCAL=1 npx arc sandbox +ARC_ENV=staging ARC_LOCAL=1 npx arc sandbox ``` diff --git a/src/views/docs/en/reference/configuration/local-preferences.md b/src/views/docs/en/reference/configuration/local-preferences.md index ff1f115f..c4c4cb4d 100644 --- a/src/views/docs/en/reference/configuration/local-preferences.md +++ b/src/views/docs/en/reference/configuration/local-preferences.md @@ -95,7 +95,7 @@ Note: `livereload` will execute your `@http` handler with each change so long as ### `env` - String -Advanced option: set the `ARC_ENV` + `NODE_ENV` stage to `staging` or `production` and use the env vars for that stage (see the `@env` pragma above); if not specified, defaults to `testing`. This setting may introduce unexpected side effects, so only use it if you have a specific technical reason. +Advanced option: set the `ARC_ENV` stage to `staging` or `production` and use the env vars for that stage (see the `@env` pragma above); if not specified, defaults to `testing`. This setting may introduce unexpected side effects, so only use it if you have a specific technical reason. ```arc @sandbox diff --git a/src/views/modules/document/ga.js b/src/views/modules/document/ga.js index 3c6868bc..98476317 100644 --- a/src/views/modules/document/ga.js +++ b/src/views/modules/document/ga.js @@ -1,5 +1,5 @@ export default function GoogleAnalytics () { - let env = process.env.NODE_ENV + let env = process.env.ARC_ENV let production = 'production' let productionId = 'UA-74655805-3' let stagingId = 'G-22723SKNK4' From 8ee268fa3d0cf415b2b9ba3eaba639ab77f968ab Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Wed, 9 Mar 2022 18:41:42 -0800 Subject: [PATCH 384/680] 3.7.4 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ace34ce1..f9e641f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.3", + "version": "3.7.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f960b199..ea1b3aec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.3", + "version": "3.7.4", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 238069065c95146804b3044721d1e0fbae7f0fc5 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Tue, 8 Mar 2022 17:59:48 -0700 Subject: [PATCH 385/680] update sharing code, shared, and views docs --- .../developer-experience/sharing-code.md | 69 +++++++++++++++++-- .../en/reference/project-manifest/shared.md | 2 +- .../en/reference/project-manifest/views.md | 1 + 3 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/views/docs/en/guides/developer-experience/sharing-code.md b/src/views/docs/en/guides/developer-experience/sharing-code.md index c2456088..f4811630 100644 --- a/src/views/docs/en/guides/developer-experience/sharing-code.md +++ b/src/views/docs/en/guides/developer-experience/sharing-code.md @@ -9,25 +9,82 @@ sections: - src/views --- -Architect makes it easy to share code across many Lambda functions. Apps most commonly need to share business logic and view templates so Architect provides `@shared` and `@views` capability. Architect copies the contents of `src/shared` into all Lambdas and `src/views` into Lambda functions wired to respond to `@http` GET requests. +Architect makes it easy to share code across Lambda functions. The most common use case is to share business logic and view templates. Architect has [`@shared`](../../reference/project-manifest/shared) and [`@views`](../../reference/project-manifest/views) pragmas to provide this functionality. -Example `app.arc` +Architect automatically copies the contents of `src/shared` into all Lambdas and `src/views` into `@http` GET Lambda functions. + +## Example usage + +Given a simple `app.arc` where `@shared` and `@views` are declared: ```arc @app myapp @shared -src src/shared # this is the default @views -src src/views # this is the default @http get / post /like ``` +Where utility code lives in `./src/shared` and common view code in `.src/views`: + +```sh +. +├── src +│ ├── http +│ │ ├── get-index/index.js +│ │ └── post-like/index.js +│ └── shared +│ └── authenticate.js +│ └── views +│ └── document.js +└── app.arc +``` + +`get-index` can use shared code by requiring it from `@architect/shared/` and views code from `@architect/views/`: + +```js +// get-index/index.js +const auth = require('@architect/shared/authenticate') +const document = require('@architect/views/document') +``` + +The `post-like` route has access to shared code as well, but not views because it does not respond to a GET request. + +```js +// post-like/index.js +const auth = require('@architect/shared/authenticate') +``` + +## Custom shared paths + +The default shared and views directories can be overridden: + +```arc +@app +myapp + +@shared +src path/to/shared + +@views +src path/to/views +``` + +They are still required in the same way: + +```js +// get-index/index.js +const auth = require('@architect/shared/authenticate') +const document = require('@architect/views/document') +``` + +## Runtime details + No matter where `@shared` source is configured it gets copied to every Lambda. The destination is slightly different depending on runtime: | Runtime | `@shared` destination | @@ -46,6 +103,6 @@ Likewise, `@views` runtime destinations: > Tip: the entire contents of `src/shared` are copied so we strongly suggest keeping the directory structure as flat as possible, and the payloads as small as possible to ensure the best performance. -## Dependencies +## Shared code dependencies -`@shared` and `@views` support having their own dependencies defined by `package.json`, `requirements.txt` or `Gemfile`. +`@shared` and `@views` resources can have their own dependencies defined by `package.json`, `requirements.txt` or `Gemfile`. These dependencies will also be copied to corresponding Lambdas. diff --git a/src/views/docs/en/reference/project-manifest/shared.md b/src/views/docs/en/reference/project-manifest/shared.md index 7fd6386b..079333cf 100644 --- a/src/views/docs/en/reference/project-manifest/shared.md +++ b/src/views/docs/en/reference/project-manifest/shared.md @@ -4,7 +4,7 @@ category: app.arc description: Configure src/shared code --- -Configure the location of shared code. +Configure the location of shared code. For a full example, see [Sharing Code](../../guides/developer-experience/sharing-code). ## Syntax diff --git a/src/views/docs/en/reference/project-manifest/views.md b/src/views/docs/en/reference/project-manifest/views.md index c7ddea09..58a9cb28 100644 --- a/src/views/docs/en/reference/project-manifest/views.md +++ b/src/views/docs/en/reference/project-manifest/views.md @@ -7,6 +7,7 @@ description: Share view code across `@http` functions Configure the location of view code. Architect copies view code to all HTTP GET handler functions by default. You can also specify only the routes you want views copied to with the `@views` pragma. +For a full example, see [Sharing Code](../../guides/developer-experience/sharing-code). ## Syntax From 9a0d305c6ba46addd86b282f94ad787582067321 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 9 Mar 2022 13:56:03 -0700 Subject: [PATCH 386/680] better demonstrate Ruby and Python shared code --- .../developer-experience/sharing-code.md | 127 +++++++++++++++++- 1 file changed, 122 insertions(+), 5 deletions(-) diff --git a/src/views/docs/en/guides/developer-experience/sharing-code.md b/src/views/docs/en/guides/developer-experience/sharing-code.md index f4811630..13a8d0da 100644 --- a/src/views/docs/en/guides/developer-experience/sharing-code.md +++ b/src/views/docs/en/guides/developer-experience/sharing-code.md @@ -36,30 +36,108 @@ Where utility code lives in `./src/shared` and common view code in `.src/views`: . ├── src │ ├── http -│ │ ├── get-index/index.js -│ │ └── post-like/index.js -│ └── shared -│ └── authenticate.js +│ │ ├── get-index +│ │ │ └── index(.js|.rb|.py) +│ │ └── post-like +│ │ └── index(.js|.rb|.py) +│ ├── shared +│ │ └── authenticate(.js|.rb|.py) │ └── views -│ └── document.js +│ └── document(.js|.rb|.py) └── app.arc ``` `get-index` can use shared code by requiring it from `@architect/shared/` and views code from `@architect/views/`: + +
    + + +
    js
    +
    + ```js // get-index/index.js const auth = require('@architect/shared/authenticate') const document = require('@architect/views/document') ``` +
    +
    + + +
    rb
    +
    + +```rb +# get-index/index.rb +require 'architect/shared/authenticate' +require 'architect/views/document' +``` + +
    +
    + + +
    py
    +
    + +```py +# get-index/index.py +from arc.shared import authenticate +from arc.views import document +``` + +
    +
    + +
    +
    + The `post-like` route has access to shared code as well, but not views because it does not respond to a GET request. + +
    + + +
    js
    +
    + ```js // post-like/index.js const auth = require('@architect/shared/authenticate') ``` +
    +
    + + +
    rb
    +
    + +```rb +# post-like/index.rb +require 'architect/shared/authenticate' +``` + +
    +
    + + +
    py
    +
    + +```py +# post-like/index.py +from arc.shared import authenticate +``` + +
    +
    + +
    +
    + ## Custom shared paths The default shared and views directories can be overridden: @@ -77,12 +155,51 @@ src path/to/views They are still required in the same way: + +
    + + +
    js
    +
    + ```js // get-index/index.js const auth = require('@architect/shared/authenticate') const document = require('@architect/views/document') ``` +
    +
    + + +
    rb
    +
    + +```rb +# get-index/index.rb +require 'architect/shared/authenticate' +require 'architect/views/document' +``` + +
    +
    + + +
    py
    +
    + +```py +# get-index/index.py +from arc.shared import authenticate +from arc.views import document +``` + +
    +
    + +
    +
    + ## Runtime details No matter where `@shared` source is configured it gets copied to every Lambda. The destination is slightly different depending on runtime: From e3c14f11cb4fe7d16780f0a2d707f1365f703387 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 10 Mar 2022 13:33:50 -0700 Subject: [PATCH 387/680] update shared code samples to use relative require --- src/shared/redirect-map.js | 10 ++++++++ .../developer-experience/sharing-code.md | 24 +++++++++---------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.js index 75ff2def..dc4655ae 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.js @@ -40,6 +40,16 @@ const tempRedirects = { '/@views': '/docs/en/reference/project-manifest/views', '/ws': '/docs/en/reference/project-manifest/ws', '/@ws': '/docs/en/reference/project-manifest/ws', + + // Runtimes + '/node': '/docs/en/reference/runtime-helpers/node.js', + '/ruby': '/docs/en/reference/runtime-helpers/ruby', + '/python': '/docs/en/reference/runtime-helpers/python', + '/deno': '/docs/en/reference/runtime-helpers/deno', + + // Other aliases + '/typescript': '/docs/en/guides/developer-experience/using-typescript', + '/esm': '/docs/en/guides/developer-experience/using-esm', } // redirect known v5/6 arc urls to v8 and then to v9 diff --git a/src/views/docs/en/guides/developer-experience/sharing-code.md b/src/views/docs/en/guides/developer-experience/sharing-code.md index 13a8d0da..7a525195 100644 --- a/src/views/docs/en/guides/developer-experience/sharing-code.md +++ b/src/views/docs/en/guides/developer-experience/sharing-code.md @@ -9,9 +9,9 @@ sections: - src/views --- -Architect makes it easy to share code across Lambda functions. The most common use case is to share business logic and view templates. Architect has [`@shared`](../../reference/project-manifest/shared) and [`@views`](../../reference/project-manifest/views) pragmas to provide this functionality. +Architect makes it easy to share code across Lambda functions. Share business logic across functions with the [`@shared`](../../reference/project-manifest/shared) pragma and view templates with the [`@views`](../../reference/project-manifest/views) pragma. -Architect automatically copies the contents of `src/shared` into all Lambdas and `src/views` into `@http` GET Lambda functions. +Enabling these features instructs Architect to automatically copy the contents of `./src/shared` into all Lambdas and `./src/views` into `@http` GET Lambda functions. ## Example usage @@ -71,8 +71,8 @@ const document = require('@architect/views/document') ```rb # get-index/index.rb -require 'architect/shared/authenticate' -require 'architect/views/document' +require_relative './vendor/shared/authenticate' +require_relative './vendor/views/document' ``` @@ -84,8 +84,8 @@ require 'architect/views/document' ```py # get-index/index.py -from arc.shared import authenticate -from arc.views import document +import vendor.shared.authenticate +import vendor.views.document ``` @@ -117,7 +117,7 @@ const auth = require('@architect/shared/authenticate') ```rb # post-like/index.rb -require 'architect/shared/authenticate' +require_relative './vendor/shared/authenticate' ``` @@ -129,7 +129,7 @@ require 'architect/shared/authenticate' ```py # post-like/index.py -from arc.shared import authenticate +import vendor.shared.authenticate ``` @@ -177,8 +177,8 @@ const document = require('@architect/views/document') ```rb # get-index/index.rb -require 'architect/shared/authenticate' -require 'architect/views/document' +require_relative './vendor/shared/authenticate' +require_relative './vendor/views/document' ``` @@ -190,8 +190,8 @@ require 'architect/views/document' ```py # get-index/index.py -from arc.shared import authenticate -from arc.views import document +import vendor.shared.authenticate +import vendor.views.document ``` From 56eb723d0e834534b5a734e1d21de6ad1d8cfbdf Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 10 Mar 2022 13:35:53 -0700 Subject: [PATCH 388/680] update arc/arc --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index f9e641f4..b3a1da7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.0.5.tgz", - "integrity": "sha512-i2i1/znCyd0/KSMorFejuaZ8lC/ZGciqZ0Xv4d+L+hjIHcUJViDvA9dKuaSPZ05s3OhsJ0SJcTLfHV2ZLDRNng==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.1.0.tgz", + "integrity": "sha512-ChU0i7uWZaubHHqBLSz5Btn+tWq5s3Ac6Mth1lWhfiZOUJ6/NpiScSYr3VLREbhwPNcqx7KE5RWXRzJGPoLjBQ==", "dev": true, "requires": { "@architect/create": "4.0.2", @@ -16,7 +16,7 @@ "@architect/env": "3.0.0", "@architect/hydrate": "3.0.1", "@architect/logs": "4.0.0", - "@architect/sandbox": "5.1.1", + "@architect/sandbox": "5.2.0", "aws-sdk": "2.1001.0", "chalk": "4.1.2", "update-notifier": "5.1.0" @@ -211,13 +211,13 @@ } }, "@architect/sandbox": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.1.1.tgz", - "integrity": "sha512-41Y5J4LL/VD2BKn8GxJpFVYBznyaIqHddDl90gv/1o3NGS9EgJBggv89EasyRpAwQcOscsCRhFtYEYjEFnSJTQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.2.0.tgz", + "integrity": "sha512-9d07GUMvl7gaMDYzDjj+NxXR+XG0XKlJRy9wn7HWFgU58iKGVaoWf3ScQSPWW8MqyHrNn2bMLoLFiH50n27p/A==", "dev": true, "requires": { - "@architect/asap": "~5.0.0", - "@architect/create": "~4.0.0", + "@architect/asap": "~5.0.1", + "@architect/create": "~4.0.2", "@architect/hydrate": "~3.0.1", "@architect/inventory": "~3.0.0", "@architect/utils": "~3.1.0", diff --git a/package.json b/package.json index ea1b3aec..43837b99 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "tiny-frontmatter": "^1.0.0" }, "devDependencies": { - "@architect/architect": "^10.0.5", + "@architect/architect": "^10.1.0", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", "eslint": "^8.10.0", From 03316849e7493a9ae79485cc094ca5529c6e0984 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 10 Mar 2022 13:52:04 -0700 Subject: [PATCH 389/680] Update dependency-management.md --- .../en/guides/developer-experience/dependency-management.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/docs/en/guides/developer-experience/dependency-management.md b/src/views/docs/en/guides/developer-experience/dependency-management.md index fee51560..d36bb176 100644 --- a/src/views/docs/en/guides/developer-experience/dependency-management.md +++ b/src/views/docs/en/guides/developer-experience/dependency-management.md @@ -41,7 +41,7 @@ require 'bundler/setup' # initialize Bundler require 'architect/functions' # is ok if it is vendored in the Lambda folder require '../foo' # this will fail require './foo' # this will work -require 'architect/shared/foo' # this is also ok (if foo exists in @shared) +require './vendor/shared/foo' # this is also ok (if foo exists in @shared) ``` Install runtime helpers for Ruby: @@ -74,7 +74,7 @@ Architect uses `requirements.txt` with `pip3` to ensure Lambda function dependen import arc # is ok if it is vendored in the Lambda folder import ..foo # this will fail import .foo # this will work -from arc.shared import foo # this is also ok (if foo exists in @shared) +import vendor.shared.foo # this is also ok (if foo exists in @shared) ``` Install runtime helpers for Python: From c8df4c8f2e56f9ed843746c1cd560bfdaafd3d13 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 10 Mar 2022 13:58:12 -0700 Subject: [PATCH 390/680] 3.7.5 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3a1da7c..f1459e9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.4", + "version": "3.7.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 43837b99..919876b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.4", + "version": "3.7.5", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 33b3b845a2676a29c8e34aa9ebc8cd30333091b9 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Sun, 20 Mar 2022 20:45:23 -0700 Subject: [PATCH 391/680] Update Sandbox doc to mention the Lambda invoker plugin --- src/views/docs/en/reference/cli/sandbox.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/reference/cli/sandbox.md b/src/views/docs/en/reference/cli/sandbox.md index 7a9efa69..52b62fa5 100644 --- a/src/views/docs/en/reference/cli/sandbox.md +++ b/src/views/docs/en/reference/cli/sandbox.md @@ -13,7 +13,7 @@ Architect projects work locally and offline. Sandbox emulates most app resources - `@queues` - `@tables` and `@tables-indexes` -> At this time Sandbox does not emulate `@scheduled` +> Additionally, `@scheduled` and `@tables-streams` Lambdas can be emulated via the [@architect/plugin-lambda-invoker](https://www.npmjs.com/package/@architect/plugin-lambda-invoker) plugin ## Usage From cd637064312b5adf37c486e96ec9cab379e7d11b Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Sun, 20 Mar 2022 20:45:26 -0700 Subject: [PATCH 392/680] 3.7.6 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1459e9f..107b1937 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.5", + "version": "3.7.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 919876b7..bb93b1ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.5", + "version": "3.7.6", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From dd840c676555edf626dcee967ac32c9a1ae6915d Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 28 Mar 2022 12:48:36 -0600 Subject: [PATCH 393/680] update and publish sessions doc (#526) --- package-lock.json | 343 +++++++++++------- package.json | 14 +- src/views/docs/en/guides/frontend/sessions.md | 183 +++------- .../en/reference/runtime-helpers/node.js.md | 29 +- src/views/docs/table-of-contents.js | 1 + 5 files changed, 298 insertions(+), 272 deletions(-) diff --git a/package-lock.json b/package-lock.json index 107b1937..9b23b442 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,13 +5,13 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.1.0.tgz", - "integrity": "sha512-ChU0i7uWZaubHHqBLSz5Btn+tWq5s3Ac6Mth1lWhfiZOUJ6/NpiScSYr3VLREbhwPNcqx7KE5RWXRzJGPoLjBQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.2.0.tgz", + "integrity": "sha512-p0c4+h5yGkfP3PylZf1KtTcYEiT75I2eA8NfAjtJs8XQhoYxxgVea6DJGB4lwPcGeWnbRSYzXB+6nB28H1R0MQ==", "dev": true, "requires": { "@architect/create": "4.0.2", - "@architect/deploy": "4.0.4", + "@architect/deploy": "4.0.5", "@architect/destroy": "3.0.1", "@architect/env": "3.0.0", "@architect/hydrate": "3.0.1", @@ -38,31 +38,53 @@ "chalk": "4.1.2", "lambda-runtimes": "~1.1.1", "minimist": "~1.2.5" + }, + "dependencies": { + "@architect/inventory": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", + "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", + "dev": true, + "requires": { + "@architect/asap": "~5.0.0", + "@architect/parser": "~6.0.0", + "@architect/utils": "~3.1.0", + "lambda-runtimes": "~1.1.1" + } + } } }, "@architect/deploy": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.4.tgz", - "integrity": "sha512-mZwPEdVtzM4m1auIK4qFEhWxCK/nsbf78ezq0NsArHapwBEQPId9SWRPIMSHXgZplTFgyPH0vUiJcWYJFuhMpQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.5.tgz", + "integrity": "sha512-FQ/qRSv17cXYLYqdMActYglWuvpOVfatGtcg80pNyBUxNCpEapQUeVTgGPNUq9tvmby4DhHqJxZ/jmnfK+PuKQ==", "dev": true, "requires": { "@architect/create": "~4.0.2", "@architect/hydrate": "~3.0.1", - "@architect/inventory": "~3.0.0", - "@architect/package": "~8.0.2", + "@architect/inventory": "~3.1.0", + "@architect/package": "~8.1.0", "@architect/utils": "~3.1.0", "chalk": "4.1.2", "fs-extra": "~10.0.1", "get-folder-size": "2.0.1", "glob": "~7.2.0", - "mime-types": "~2.1.34", - "minimist": "~1.2.5", + "mime-types": "~2.1.35", + "minimist": "~1.2.6", "path-sort": "~0.1.0", "run-parallel": "~1.2.0", "run-series": "~1.1.9", "run-waterfall": "~1.1.7", "zip-dir": "~2.0.0", "zipit": "~2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + } } }, "@architect/destroy": { @@ -77,6 +99,20 @@ "minimist": "~1.2.5", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7" + }, + "dependencies": { + "@architect/inventory": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", + "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", + "dev": true, + "requires": { + "@architect/asap": "~5.0.0", + "@architect/parser": "~6.0.0", + "@architect/utils": "~3.1.0", + "lambda-runtimes": "~1.1.1" + } + } } }, "@architect/env": { @@ -94,6 +130,20 @@ "run-series": "~1.1.9", "run-waterfall": "~1.1.7", "yesno": "~0.3.1" + }, + "dependencies": { + "@architect/inventory": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", + "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", + "dev": true, + "requires": { + "@architect/asap": "~5.0.0", + "@architect/parser": "~6.0.0", + "@architect/utils": "~3.1.0", + "lambda-runtimes": "~1.1.1" + } + } } }, "@architect/eslint-config": { @@ -137,38 +187,31 @@ "minimist": "~1.2.5", "run-series": "~1.1.9", "symlink-or-copy": "~1.3.1" + }, + "dependencies": { + "@architect/inventory": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", + "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", + "dev": true, + "requires": { + "@architect/asap": "~5.0.0", + "@architect/parser": "~6.0.0", + "@architect/utils": "~3.1.0", + "lambda-runtimes": "~1.1.1" + } + } } }, "@architect/inventory": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", - "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.1.0.tgz", + "integrity": "sha512-AxxsCbyNmusyy70DkOLwqBfa/FeAw66WuXJDkWY966mP3vWXL/vD3p2xMF4MsJwo5kPRM7PjQky7GbMCtRckqA==", "requires": { "@architect/asap": "~5.0.0", "@architect/parser": "~6.0.0", "@architect/utils": "~3.1.0", "lambda-runtimes": "~1.1.1" - }, - "dependencies": { - "@architect/parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-6.0.0.tgz", - "integrity": "sha512-KqpMvxt8LHd+OMR4jGaDxhgNlcLf38F3h0Kub3aR6DQShsyMG1KGa8A9Bs95LvIV3LzGV6dXly5Oamvi2APmgg==" - }, - "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", - "requires": { - "chalk": "4.1.2", - "glob": "~7.2.0", - "path-sort": "~0.1.0", - "restore-cursor": "3.1.0", - "run-series": "~1.1.9", - "run-waterfall": "~1.1.7", - "sha": "~3.0.0" - } - } } }, "@architect/logs": { @@ -185,22 +228,35 @@ "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7", "strftime": "~0.10.1" + }, + "dependencies": { + "@architect/inventory": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", + "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", + "dev": true, + "requires": { + "@architect/asap": "~5.0.0", + "@architect/parser": "~6.0.0", + "@architect/utils": "~3.1.0", + "lambda-runtimes": "~1.1.1" + } + } } }, "@architect/package": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@architect/package/-/package-8.0.3.tgz", - "integrity": "sha512-GiIWfrmPetOIt4C/BEs4K4e6X87fNlFM7phekPcvbLucc12dd4pVJadkkc25tdfkIuFBgu3SQWU+UI6EE+Pzzg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@architect/package/-/package-8.1.0.tgz", + "integrity": "sha512-KcmbrS0TDhUNocqn+ctfNA9K6wT1cG79rG5P36RSWerzgYw5DARpwOEmFsql8PPQp4uWAcWzgJqk1erX/0y0uA==", "requires": { - "@architect/inventory": "~3.0.0", + "@architect/inventory": "~3.1.0", "@architect/utils": "~3.1.0" } }, "@architect/parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-6.0.0.tgz", - "integrity": "sha512-KqpMvxt8LHd+OMR4jGaDxhgNlcLf38F3h0Kub3aR6DQShsyMG1KGa8A9Bs95LvIV3LzGV6dXly5Oamvi2APmgg==", - "dev": true + "integrity": "sha512-KqpMvxt8LHd+OMR4jGaDxhgNlcLf38F3h0Kub3aR6DQShsyMG1KGa8A9Bs95LvIV3LzGV6dXly5Oamvi2APmgg==" }, "@architect/plugin-node-prune": { "version": "2.0.2", @@ -240,6 +296,20 @@ "tree-kill": "~1.2.2", "update-notifier": "~5.1.0", "ws": "~8.5.0" + }, + "dependencies": { + "@architect/inventory": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", + "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", + "dev": true, + "requires": { + "@architect/asap": "~5.0.0", + "@architect/parser": "~6.0.0", + "@architect/utils": "~3.1.0", + "lambda-runtimes": "~1.1.1" + } + } } }, "@architect/spellcheck-dictionary": { @@ -356,16 +426,16 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", - "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", @@ -379,20 +449,14 @@ "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -428,9 +492,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1367,6 +1431,12 @@ "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1626,12 +1696,12 @@ "dev": true }, "eslint": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", - "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.0", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -1675,9 +1745,9 @@ "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1960,12 +2030,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, "fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", @@ -2264,9 +2328,9 @@ } }, "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -2368,9 +2432,9 @@ "dev": true }, "highlight.js": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.4.0.tgz", - "integrity": "sha512-nawlpCBCSASs7EdvZOYOYVkJpGmAOKMYZgZtUqSRqodZE0GRVcFKwo1RcpeOemqh9hyttTdd5wDBwHkuSyUfnA==" + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.0.tgz", + "integrity": "sha512-SM6WDj5/C+VfIY8pZ6yW6Xa0Fm1tniYVYWYW1Q/DcMnISZFrC3aQAZZZFAAZtybKNrGId3p/DNbFTtcTXXgYBw==" }, "hosted-git-info": { "version": "4.1.0", @@ -2967,23 +3031,6 @@ "pako": "~1.0.2", "readable-stream": "~2.3.6", "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } } }, "junit-report-builder": { @@ -3086,6 +3133,19 @@ "inherits": "^2.0.4", "readable-stream": "^3.4.0", "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "level-option-wrap": { @@ -3540,18 +3600,18 @@ "dev": true }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -4144,14 +4204,18 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -5027,39 +5091,42 @@ } }, "tap-arc": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tap-arc/-/tap-arc-0.1.2.tgz", - "integrity": "sha512-o1Wl5LtNXw2W9ROKqYh/f/uoFMzdcej+jrPEbouAu8U6UDm/ux7UBg5tjZlIEOhAbYKWvZD4BSEPfn0LrsAHHA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/tap-arc/-/tap-arc-0.3.3.tgz", + "integrity": "sha512-AKE94jX3PNP3nzMBYqd4+TvCoBiWHNNxq7tGsdqORoz5nLXCqaussU0gMpaYfuUhRSrNEktanmLklofIF7rgqQ==", "dev": true, "requires": { - "fast-diff": "^1.2.0", - "json5": "^2.2.0", - "minimist": "~1.2.5", + "json5": "^2.2.1", + "minimist": "^1.2.6", "picocolors": "^1.0.0", "strip-ansi": "^6.0.1", - "tap-parser": "^10.1.0", + "tap-parser": "^11.0.1", + "tcompare": "^5.0.7", "through2": "^4.0.2" }, "dependencies": { "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true } } }, "tap-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.1.0.tgz", - "integrity": "sha512-FujQeciDaOiOvaIVGS1Rpb0v4R6XkOjvWCWowlz5oKuhPkEJ8U6pxgqt38xuzYhPt8dWEnfHn2jqpZdJEkW7pA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.1.tgz", + "integrity": "sha512-5ow0oyFOnXVSALYdidMX94u0GEjIlgc/BPFYLx0yRh9hb8+cFGNJqJzDJlUqbLOwx8+NBrIbxCWkIQi7555c0w==", "dev": true, "requires": { "events-to-array": "^1.0.1", - "minipass": "^3.0.0", + "minipass": "^3.1.6", "tap-yaml": "^1.0.0" } }, @@ -5119,6 +5186,15 @@ } } }, + "tcompare": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", + "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", + "dev": true, + "requires": { + "diff": "^4.0.2" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5138,6 +5214,19 @@ "dev": true, "requires": { "readable-stream": "3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "tiny-each-async": { @@ -5152,9 +5241,9 @@ "integrity": "sha1-9jqhUhbmlobUZjtSJsHnR/dgs+I=" }, "tiny-json-http": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.3.1.tgz", - "integrity": "sha512-sgt6ABJnNftz8itxjVwyrKZsk+Dy62uXPR/ryeQ8wxC3sB6UCaz+3mrzKbZdu5DoyzEa/bpHMVkqsTCvuPaDNg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.4.2.tgz", + "integrity": "sha512-+3ns4PfQTLaF69zGASkAfDoOEVmwYTXSDrU6VR93h317uFOW7evFzKa7Ih9JzPHiYSee3lUXHLAGhws2wFSexQ==", "dev": true }, "to-readable-stream": { diff --git a/package.json b/package.json index bb93b1ae..d08db1bd 100644 --- a/package.json +++ b/package.json @@ -19,12 +19,12 @@ "dependencies": { "@architect/asap": "^5.0.1", "@architect/functions": "^5.0.4", - "@architect/inventory": "^3.0.0", - "@architect/package": "^8.0.3", + "@architect/inventory": "^3.1.0", + "@architect/package": "^8.1.0", "@architect/plugin-node-prune": "^2.0.2", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "esm": "^3.2.25", - "highlight.js": "^11.4.0", + "highlight.js": "^11.5.0", "markdown-it": "^12.3.2", "markdown-it-external-anchor": "^1.0.0", "markdown-it-toc-and-anchor": "github:macdonst/markdown-it-toc-and-anchor", @@ -32,15 +32,15 @@ "tiny-frontmatter": "^1.0.0" }, "devDependencies": { - "@architect/architect": "^10.1.0", + "@architect/architect": "^10.2.0", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", - "eslint": "^8.10.0", + "eslint": "^8.12.0", "linkinator": "^3.0.3", "spellchecker-cli": "^4.8.1", - "tap-arc": "^0.1.2", + "tap-arc": "^0.3.3", "tape": "^5.5.2", - "tiny-json-http": "^7.3.1" + "tiny-json-http": "^7.4.2" }, "eslintConfig": { "extends": "@architect/eslint-config" diff --git a/src/views/docs/en/guides/frontend/sessions.md b/src/views/docs/en/guides/frontend/sessions.md index 89147a6a..e48197d5 100644 --- a/src/views/docs/en/guides/frontend/sessions.md +++ b/src/views/docs/en/guides/frontend/sessions.md @@ -1,134 +1,86 @@ --- -title: HTTP & WebSocket sessions +title: Architect sessions category: Frontend -description: 160 (or fewer) character description of this document! +description: Use HTTP sessions in an Architect project sections: - Overview - HTTP sessions - - WebSocket sessions + - Strong secret key + - Example --- -## Overview - -Developing database backed stateful web applications used to require a web server, a database server, a whole supporting cast of software and frameworks and all the near-constant maintenance those things required. Now anyone with a text editor can handle POST requests directly with a Lambda function and API Gateway. +Developing database-backed, stateful web applications used to require a web server, a database server, a whole supporting cast of software and frameworks and all the near-constant maintenance those things required. Now anyone with a text editor can handle POST requests directly with a Lambda function and API Gateway. Read more about [Functional Web Apps](https://fwa.dev) The first primitive to understand for building stateful interactions on the web is session state. HTTP is a stateless protocol which is a fancy way of saying every HTTP request is like a completely clean slate. If we want to remember things between HTTP requests you need a session. -In this tutorial, we will go over several ways to store session state within your app. There is an example app at the end that we will build to display how sessions work within Architect. - -**Sections** -- [HTTP sessions](#http-sessions) -- [Database Sessions](#database-sessions) -- [WebSocket sessions](#websocket-sessions) -- [Strong Key](#strong-key) -- [Common Session Use Cases](#common-session-use-cases) -- [Example](#example) +This guide will go over several ways to store session state within your app. There is an example app at the end that demonstrates how sessions work within Architect. ---- ## HTTP sessions All `@http` defined routes are session capable via `@architect/functions`. -- Requests are tagged to a session via a stateless, signed, encrypted, `httpOnly` cookie `_idx` +- Requests are tagged to a session via a stateless, signed, encrypted, `httpOnly` cookie: `_idx` - Session data expires after a week of inactivity This allows you to write fully stateful applications despite Lambda functions being completely stateless. -Read the session: +Manually read and write sessions: ```javascript +// a simple request counter let arc = require('@architect/functions') exports.handler = async function http(req) { - // reads the session from DynamoDB + // reads the session from the request let session = await arc.http.session.read(req) + // modify the state + session.count = (session.count || 0) + 1 + // write the session to a cookie + let cookie = await arc.http.session.write(session) + return { - type: 'text/html; charset=utf8', + statusCode: 200, + headers: { + 'content-type': 'text/html; charset=utf8', + 'set-cookie': cookie + }, body: `
    ${JSON.stringify(session, null, 2)}
    ` } } ``` -Write the session: +Alternatively, use `arc.http[.async]`'s built-in session management for a simpler implementation: ```javascript let arc = require('@architect/functions') -exports.handler = async function http(req) { - // reads the session from DynamoDB - let session = await arc.http.session.read(req) - - // modify the state +async function handler(req) { + let session = req.session session.count = (session.count || 0) + 1 - // save the session state to DynamoDB - let cookie = await arc.http.session.write(session) - let status = 302 - let location = '/' - // respond (and update the session cookie) - return {cookie, status, location} -} -``` - ---- - -## Database Sessions - -If you have stricter security requirements and do not want to expose any session state to clients you can opt into sessions backed by DynamoDB tables. - -You'll need to define a session table in your `app.arc` file with `_idx` partition key and `_ttl` attribute for token expiry: -```arc -@app -testapp - -@http -get / - -@tables -session - _idx *String - _ttl TTL -``` - -Run `npx create` to generate the session database tables. Next opt your Lambda functions into using that table by overriding `SESSION_TABLE_NAME`: + return { + session, + html: `
    ${JSON.stringify(session, null, 2)}
    ` + } +} -```bash -npx env staging SESSION_TABLE_NAME jwe -npx env production SESSION_TABLE_NAME testapp-production-session +exports.handler = arc.http.async(handler) ``` -This will sync all production lambdas to use the DynamoDB table while testing and staging environments will continue to use the stateless cookie. If you add new routes you will need to remember to sync by running `npx env verify`. - ---- +> See [the Node.js sessions reference](../../reference/runtime-helpers/node.js#arc.http.session) for more details on `arc.http` and `arc.http.session`. -## WebSocket sessions -ADD ME! - ---- - -## Strong Key +## Strong secret key Ensure your app has a strong secret key: ```bash -npx env production ARC_APP_SECRET something-much-better-than-this +npx arc --env production --add ARC_APP_SECRET something-much-better-than-this ``` -Environment variables are automatically synced with all your lambda functions. When you add new functions you will need to sync their env variables by running `npx env verify`. - ---- - -## Common Session Use Cases - -- Authentication -- Error messages -- Shopping carts +Environment variables are automatically synced with all your lambda functions. When you add new functions you will need to sync their env variables by running `npx arc env`. -> See [the sessions reference](/docs/en/reference/macros/runtime-helper-reference/arc-http-session) for more details. - ---- ## Example @@ -137,6 +89,8 @@ Environment variables are automatically synced with all your lambda functions. W ```bash mkdir -p ./mysesh cd mysesh +npm init -f +npm install @architect/architect ``` 2. Create a `app.arc` file @@ -157,29 +111,23 @@ And generate the boilerplate code by running: arc init ``` -3. Add the `@architect/functions` runtime helper library to your functions. This gives the request object a method to read and write sessions. +3. Add the `@architect/functions` runtime helper library to your project. This gives the request object a method to read and write sessions. ```bash -cd src/http/get-index -npm init -f -npm i @architect/functions - -cd ../post-count -npm init -f -npm i @architect/functions - -cd ../post-reset -npm init -f npm i @architect/functions ``` -4. Add `src/http/get-index/render.js` with plain vanilla HTML forms for adding and resetting the session +4. Modify `src/http/get-index/index.js` to read the session if it exists and render the forms with the session state ```javascript -// this is perfectly acceptable and FAST server side rendering +let arc = require('@architect/functions') -module.exports = function render({ count }) { - return ` +async function home(req) { + let count = req.session.count || 0 + + return { + // this is perfectly acceptable and FAST server side rendering + html: ` @@ -191,28 +139,14 @@ module.exports = function render({ count }) { - ` -} -``` - -5. Modify `src/http/get-index/index.js` to read the session if it exists and render the forms with the session state - -```javascript -let arc = require('@architect/functions') -let render = require('./render') - -async function home(req) { - let count = req.session.count || 0 - return { - html: render({ count }) + ` } } exports.handler = arc.http.async(home) ``` -6. Modify `src/http/post-count/index.js` to mutate the session and redirect home - +5. Modify `src/http/post-count/index.js` to mutate the session and redirect home ```javascript let arc = require('@architect/functions') @@ -230,7 +164,7 @@ exports.handler = arc.http.async(counter) > FYI: Per recommended security practice Architect applications use `httpOnly` cookies for storing session state; anyone can implement their own mechanism using Set-Cookie headers directly -7. Modify `src/http/post-reset/index.js` to clear the session state +6. Modify `src/http/post-reset/index.js` to clear the session state ```javascript let arc = require('@architect/functions') @@ -245,27 +179,12 @@ async function reset(req) { exports.handler = arc.http.async(reset) ``` -> For more information about `arc.http.async` helper, [check out the documentation](/docs/en/reference/macros/runtime-helper-reference/arc-http-async) +> For more information about `arc.http.async` helper, [check out the documentation](../../reference/runtime-helpers/node.js#arc.http.async) -8. Initialize a `package.json` in the root of your project, and install `@architect/sandbox` for a local development server +7. Preview by starting the dev server ```bash -npm init -f -npm install @architect/sandbox +npx arc sandbox ``` -9. Add a start command to the scripts section in `package.json` found at the root of your project - -```json -... -"scripts": { - "start": "sandbox" -} -... -``` - -10. Preview by starting the dev server - -```bash -npm start -``` +Navigate to `localhost:3333` to test out the counter. diff --git a/src/views/docs/en/reference/runtime-helpers/node.js.md b/src/views/docs/en/reference/runtime-helpers/node.js.md index ec757be7..33c0e3c1 100644 --- a/src/views/docs/en/reference/runtime-helpers/node.js.md +++ b/src/views/docs/en/reference/runtime-helpers/node.js.md @@ -274,9 +274,9 @@ async function handler(req) { #### `arc.http.session` -`arc.http.session` provides methods for reading the current session in an `@http` request, and writing it back to a cookie. +`arc.http.session` provides methods for manually reading the current session in an `@http` request, and writing it back to a cookie. -These operations are automatically handled for you when using `arc.http[.async]`; only use `arc.http.session` if you prefer handling session reads and writes yourself. +These operations are automatically handled for you when using `arc.http[.async]`; see the second example below. ##### Methods @@ -288,7 +288,7 @@ These operations are automatically handled for you when using `arc.http[.async]` - Returns a `cookie` string - Must be `await`ed if no callback is provided -> Please note that session variable encoding and decoding relies on the `ARC_APP_SECRET` [environment variable](../cli/env) being set to something secret and not easily guessable. If you use Architect sessions, please be sure to [set the `ARC_APP_SECRET` environment variable](../cli/env)! +> Please note that session variable encoding and decoding relies on the `ARC_APP_SECRET` [environment variable](../cli/env#security) being set to something secret and not easily guessable. If you use Architect sessions, please be sure to [set the `ARC_APP_SECRET` environment variable](../../guides/frontend/sessions#strong-secret-key)! ```javascript let arc = require('@architect/functions') @@ -296,9 +296,10 @@ let arc = require('@architect/functions') exports.handler = async function handler (req) { // read the session let session = await arc.http.session.read(req) - - // save the session and get back a cookie - let cookie = await arc.http.session.write({ count: 1 }) + // modify the state + session.count = (session.count || 0) + 1 + // save the session state + let cookie = await arc.http.session.write(session) // set the client's cookie return { @@ -308,6 +309,22 @@ exports.handler = async function handler (req) { } ``` +Alternatively, use `arc.http[.async]`'s automatic session parsing: + +```js +let arc = require('@architect/functions') + +async function handler (req) { + // session already exists on `req` + let session = req.session + session.count = (session.count || 0) + 1 + + return { session } +} + +exports.handler = arc.http.async(handler) +``` + --- ### `arc.queues` diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index 1d59c2de..b51c6660 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -20,6 +20,7 @@ let Guides = [ 'Customizing CloudFormation' ], 'Frontend': [ + 'Sessions', 'Static assets', ], 'Domains': [ From e517632815fbdcdbfb5de4d8c5752214d51af52e Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 28 Mar 2022 13:58:31 -0600 Subject: [PATCH 394/680] 3.7.7 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b23b442..78633e60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.6", + "version": "3.7.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d08db1bd..09d7ab22 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.6", + "version": "3.7.7", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 663c72f3995a8fa918707c6465baef9ac6e02274 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 30 Mar 2022 11:49:00 -0600 Subject: [PATCH 395/680] Update using-typescript.md add shared code and example project --- .../developer-experience/using-typescript.md | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/views/docs/en/guides/developer-experience/using-typescript.md b/src/views/docs/en/guides/developer-experience/using-typescript.md index dcad2089..99087ded 100644 --- a/src/views/docs/en/guides/developer-experience/using-typescript.md +++ b/src/views/docs/en/guides/developer-experience/using-typescript.md @@ -50,3 +50,31 @@ You can use TypeScript in as many or few Lambdas as you like, relying on project We recommend using the [`@architect/functions`](/docs/en/reference/runtime-helpers/node.js) runtime helper to smooth over some rough edges in working with various aspects of AWS (as well as to add built-in session support, and other niceties). If you do, TypeScript types are available in the [@types/architect__functions](https://www.npmjs.com/package/@types/architect__functions) package. + + +## Shared code + +It is possible to use Architect's built-in shared code folders (`src/shared` + `src/views`) with TypeScript handlers while still maintaining functionality across vanilla JS handlers. + +A sample `tsconfig.json` for shared code paths with a custom `shared-ts` folder: + +```json +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@architect/views": [ "src/views" ], + "shared": [ "src/shared-ts" ] + } + } +} +``` + +In the above example, TypeScript handlers can use a shared backend code folder (`src/shared-ts`), while still making use of shared code in `src/views` (by way of tsconfig.json paths setting). See the [example below](#example-project) for a functioning project with this set up. + + +## Example project + +View the [example TypeScript project on GitHub](https://github.com/architect-examples/typescript-example). + +This example project demonstrates how to use both TS and JS side-by-side in a project, automatic sourcemaps, and shared code. From a61462c2bb5b3cf69b4bb7ffa2f283add52b88dd Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 1 Apr 2022 09:56:32 -0600 Subject: [PATCH 396/680] document aws storage property (#535) --- package-lock.json | 310 ++++++++---------- package.json | 6 +- .../configuration/function-config.md | 17 +- .../docs/en/reference/project-manifest/aws.md | 34 +- src/views/modules/document/head.js | 9 +- src/views/modules/document/script.js | 4 +- 6 files changed, 188 insertions(+), 192 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78633e60..0d01a52c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,18 +5,18 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.2.0.tgz", - "integrity": "sha512-p0c4+h5yGkfP3PylZf1KtTcYEiT75I2eA8NfAjtJs8XQhoYxxgVea6DJGB4lwPcGeWnbRSYzXB+6nB28H1R0MQ==", - "dev": true, - "requires": { - "@architect/create": "4.0.2", - "@architect/deploy": "4.0.5", - "@architect/destroy": "3.0.1", - "@architect/env": "3.0.0", - "@architect/hydrate": "3.0.1", - "@architect/logs": "4.0.0", - "@architect/sandbox": "5.2.0", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.2.1.tgz", + "integrity": "sha512-fiaZBEwEGFJOSNokhLUfaSJ0qVtwGGcwYAv0pOPliAxUYlyOzvCGvxqLFaBF6TNKLsO03FC3P4FvQCYN/eV5Rg==", + "dev": true, + "requires": { + "@architect/create": "4.0.3", + "@architect/deploy": "4.0.6", + "@architect/destroy": "3.0.2", + "@architect/env": "3.0.1", + "@architect/hydrate": "3.0.2", + "@architect/logs": "4.0.1", + "@architect/sandbox": "5.2.2", "aws-sdk": "2.1001.0", "chalk": "4.1.2", "update-notifier": "5.1.0" @@ -28,40 +28,34 @@ "integrity": "sha512-/QI/ffbOCRNZZKwOvRj9iLcO/Wj4Zll/UBy/NCobc2nExzCTmtLpSTNcpIU0wM7vQdFhbjhHm5G7LMtFc8BkkQ==" }, "@architect/create": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@architect/create/-/create-4.0.2.tgz", - "integrity": "sha512-7iSPKKOvAe6DtmtujtSEWHBtbt4HxLXykPEl9dX3i9CwPBN5KTSNCN7W014LjDefGHkqWHuPnJFoM6yd8c01Xg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@architect/create/-/create-4.0.3.tgz", + "integrity": "sha512-ki7yWUBxvEEnScM4LcCIBe4A8lj+XRZTlRfASSN+A8xQ4VwZPh0igGQS+i4L6kJxO30f1QMJHS6we2uz0fzgSg==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0", + "@architect/inventory": "~3.1.0", "@architect/utils": "~3.1.0", "chalk": "4.1.2", "lambda-runtimes": "~1.1.1", - "minimist": "~1.2.5" + "minimist": "~1.2.6" }, "dependencies": { - "@architect/inventory": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", - "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", - "dev": true, - "requires": { - "@architect/asap": "~5.0.0", - "@architect/parser": "~6.0.0", - "@architect/utils": "~3.1.0", - "lambda-runtimes": "~1.1.1" - } + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true } } }, "@architect/deploy": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.5.tgz", - "integrity": "sha512-FQ/qRSv17cXYLYqdMActYglWuvpOVfatGtcg80pNyBUxNCpEapQUeVTgGPNUq9tvmby4DhHqJxZ/jmnfK+PuKQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.6.tgz", + "integrity": "sha512-N5kInhoXSaVduUKcPwnE0SF/smNH3PqlorcO1Uuj0TW0ExvrdWt253d8PDv/wdg0hyc41s4/fxdaRajsxPnS2Q==", "dev": true, "requires": { - "@architect/create": "~4.0.2", - "@architect/hydrate": "~3.0.1", + "@architect/create": "~4.0.3", + "@architect/hydrate": "~3.0.2", "@architect/inventory": "~3.1.0", "@architect/package": "~8.1.0", "@architect/utils": "~3.1.0", @@ -88,40 +82,34 @@ } }, "@architect/destroy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-3.0.1.tgz", - "integrity": "sha512-4vSweeCtfLwqW2u78wnXD/lT9WbwCqBobJLEbBlCjk8Tb7d9Y7hEsQLlaYTGISQ+o737kJRFHOJ+bG9A+mF2jA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@architect/destroy/-/destroy-3.0.2.tgz", + "integrity": "sha512-NtVOOTy9IFscUCD5C/iqKgzrw7tWxipzAwH2+gxmRYx5QYipdDmsJ1GEm0XDPaiS1W5X1EgO9sAOtRCu3Ni74w==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0", + "@architect/inventory": "~3.1.0", "@architect/utils": "~3.1.0", "aws-sdk": "2.1001.0", - "minimist": "~1.2.5", + "minimist": "~1.2.6", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7" }, "dependencies": { - "@architect/inventory": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", - "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", - "dev": true, - "requires": { - "@architect/asap": "~5.0.0", - "@architect/parser": "~6.0.0", - "@architect/utils": "~3.1.0", - "lambda-runtimes": "~1.1.1" - } + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true } } }, "@architect/env": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/env/-/env-3.0.0.tgz", - "integrity": "sha512-1IBwjFyk2Nz0T2nYHx+CQ1WLNqqej6VoScXysVy3r6HqVOB7Q4FWr/GPdAIwwqxxrAt4J4bLdvdfGOkbWldtHA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@architect/env/-/env-3.0.1.tgz", + "integrity": "sha512-XKJ15SnIB5d0FF0BgNJAd4lvForRNuUA1d4Juk6CFHnYikjMfvDp09HXiVOYvzn5Ajmfg+Py/0HrZFjW0EuCwQ==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0", + "@architect/inventory": "~3.1.0", "@architect/parser": "~6.0.0", "@architect/utils": "~3.1.0", "aws-sdk": "2.1001.0", @@ -130,20 +118,6 @@ "run-series": "~1.1.9", "run-waterfall": "~1.1.7", "yesno": "~0.3.1" - }, - "dependencies": { - "@architect/inventory": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", - "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", - "dev": true, - "requires": { - "@architect/asap": "~5.0.0", - "@architect/parser": "~6.0.0", - "@architect/utils": "~3.1.0", - "lambda-runtimes": "~1.1.1" - } - } } }, "@architect/eslint-config": { @@ -172,34 +146,28 @@ } }, "@architect/hydrate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-3.0.1.tgz", - "integrity": "sha512-XLF9j9ynYbXyIVtXrICdGabKszUTpt/i/w9gVmUDaqRFbGv6so6lH/HUxuucWrrM/+iTl4UNZGgcCJG9uQyRiQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@architect/hydrate/-/hydrate-3.0.2.tgz", + "integrity": "sha512-PB1gAkeofW14VrU2W+VhVryLXcQ7bzSfJwujqDuDYOapxlFGvBMZmobP8xhgCSw0JGsdZOQ0YVbAuvFwwzT0iw==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0", + "@architect/inventory": "~3.1.0", "@architect/utils": "~3.1.0", "acorn-loose": "~8.3.0", "chalk": "4.1.2", "cpr": "~3.0.1", "esquery": "~1.4.0", "glob": "~7.2.0", - "minimist": "~1.2.5", + "minimist": "~1.2.6", "run-series": "~1.1.9", "symlink-or-copy": "~1.3.1" }, "dependencies": { - "@architect/inventory": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", - "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", - "dev": true, - "requires": { - "@architect/asap": "~5.0.0", - "@architect/parser": "~6.0.0", - "@architect/utils": "~3.1.0", - "lambda-runtimes": "~1.1.1" - } + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true } } }, @@ -215,32 +183,26 @@ } }, "@architect/logs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-4.0.0.tgz", - "integrity": "sha512-+Wmwm2Dk69JvhPt+CAZxrK3VPtqxice6iJBl5h1VrkT1zXc/S9Yt4THhqpRkcK1EU+jl8bsgcQYhmCfLcTJM5g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@architect/logs/-/logs-4.0.1.tgz", + "integrity": "sha512-8vCgx3kBRQP4mFihkHmRPJE6LF7rQ6JEomoANFUkW3osfAZRvGkkjPDhBEEjzEqZyjBhpVwhRVHmDG/uA3ilnw==", "dev": true, "requires": { - "@architect/inventory": "~3.0.0", + "@architect/inventory": "~3.1.0", "@architect/utils": "~3.1.0", "aws-sdk": "2.1001.0", "chalk": "4.1.2", - "minimist": "~1.2.5", + "minimist": "~1.2.6", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7", "strftime": "~0.10.1" }, "dependencies": { - "@architect/inventory": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", - "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", - "dev": true, - "requires": { - "@architect/asap": "~5.0.0", - "@architect/parser": "~6.0.0", - "@architect/utils": "~3.1.0", - "lambda-runtimes": "~1.1.1" - } + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true } } }, @@ -267,15 +229,15 @@ } }, "@architect/sandbox": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.2.0.tgz", - "integrity": "sha512-9d07GUMvl7gaMDYzDjj+NxXR+XG0XKlJRy9wn7HWFgU58iKGVaoWf3ScQSPWW8MqyHrNn2bMLoLFiH50n27p/A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.2.2.tgz", + "integrity": "sha512-j/k5IuYRFv+UxaeF6TI7P+7pdx7L6FbDvGwQYWdc+Cvz7k/ly2Yih+VmfP0bs3/g0dqIOgBj0eo6mVODwFqq2g==", "dev": true, "requires": { "@architect/asap": "~5.0.1", - "@architect/create": "~4.0.2", - "@architect/hydrate": "~3.0.1", - "@architect/inventory": "~3.0.0", + "@architect/create": "~4.0.3", + "@architect/hydrate": "~3.0.2", + "@architect/inventory": "~3.1.0", "@architect/utils": "~3.1.0", "@begin/hashid": "~1.0.0", "aws-sdk": "2.1001.0", @@ -283,32 +245,26 @@ "chokidar": "~3.5.3", "depstatus": "~1.1.1", "dynalite": "~3.2.2", - "finalhandler": "~1.1.2", + "finalhandler": "~1.2.0", "glob": "~7.2.0", "http-proxy": "~1.18.1", "lambda-runtimes": "~1.1.1", - "minimist": "~1.2.5", + "minimist": "~1.2.6", "router": "~1.3.6", "run-parallel": "~1.2.0", "run-series": "~1.1.9", - "send": "~0.17.2", + "send": "~0.18.0", "server-destroy": "~1.0.1", "tree-kill": "~1.2.2", "update-notifier": "~5.1.0", "ws": "~8.5.0" }, "dependencies": { - "@architect/inventory": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-3.0.0.tgz", - "integrity": "sha512-DbdEWzn8ErpuNbSiH/FVJm9EIZSLUIjekruwPUCmcxv5zPFM2Qi54366nijQnWY/NFBwXBW1EHGZu0Rda9Rccw==", - "dev": true, - "requires": { - "@architect/asap": "~5.0.0", - "@architect/parser": "~6.0.0", - "@architect/utils": "~3.1.0", - "lambda-runtimes": "~1.1.1" - } + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true } } }, @@ -1375,9 +1331,9 @@ "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "depstatus": { @@ -1390,9 +1346,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "dictionary-en-au": { @@ -2098,17 +2054,17 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "requires": { "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" } }, @@ -2472,15 +2428,15 @@ "dev": true }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" } }, @@ -3022,9 +2978,9 @@ } }, "jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.8.0.tgz", + "integrity": "sha512-cnpQrXvFSLdsR9KR5/x7zdf6c3m8IhZfZzSblFEHSqBaVwD2nvJ4CuCKLyvKvwBgZm08CgfSoiTBQLm5WW9hGw==", "dev": true, "requires": { "lie": "~3.3.0", @@ -3558,9 +3514,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3584,13 +3540,13 @@ } }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -3640,9 +3596,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minimist-options": { @@ -3666,12 +3622,20 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" + }, + "dependencies": { + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + } } }, "ms": { @@ -3814,9 +3778,9 @@ } }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -4646,24 +4610,24 @@ } }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "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.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "ms": { @@ -4775,9 +4739,9 @@ "dev": true }, "spellchecker-cli": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.8.1.tgz", - "integrity": "sha512-7D4ZznwVTABfmyJEktFQNeO1epdDTy+AGZ3GWm9OerDDyFkzpCFNZ6IW+ZYpxcrmSJ92Xo0ppaJPRGPgH9uC5A==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.9.1.tgz", + "integrity": "sha512-znlZFx1u3ZVS8dMdZWLPN2feXxrvP8kZin8Wtxfsq2wRAHKnDRb58TpqXoKEA+YGIpLZy8hboPTr3KZw/wUcTw==", "dev": true, "requires": { "app-root-path": "^3.0.0", @@ -4903,9 +4867,9 @@ "dev": true }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, "strftime": { @@ -5091,9 +5055,9 @@ } }, "tap-arc": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/tap-arc/-/tap-arc-0.3.3.tgz", - "integrity": "sha512-AKE94jX3PNP3nzMBYqd4+TvCoBiWHNNxq7tGsdqORoz5nLXCqaussU0gMpaYfuUhRSrNEktanmLklofIF7rgqQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/tap-arc/-/tap-arc-0.3.4.tgz", + "integrity": "sha512-FYvZS6uYnrZJ+F3xBxNKG1V3LAJ/7+HtxIvelFz2GkIuZG7juSCr8DQmBrr/YtO0tq+gxhDt3nQLfKOqP7phJg==", "dev": true, "requires": { "json5": "^2.2.1", diff --git a/package.json b/package.json index 09d7ab22..e27ba3de 100644 --- a/package.json +++ b/package.json @@ -32,13 +32,13 @@ "tiny-frontmatter": "^1.0.0" }, "devDependencies": { - "@architect/architect": "^10.2.0", + "@architect/architect": "^10.2.1", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", "eslint": "^8.12.0", "linkinator": "^3.0.3", - "spellchecker-cli": "^4.8.1", - "tap-arc": "^0.3.3", + "spellchecker-cli": "^4.9.1", + "tap-arc": "^0.3.4", "tape": "^5.5.2", "tiny-json-http": "^7.4.2" }, diff --git a/src/views/docs/en/reference/configuration/function-config.md b/src/views/docs/en/reference/configuration/function-config.md index edb931a3..55fac51a 100644 --- a/src/views/docs/en/reference/configuration/function-config.md +++ b/src/views/docs/en/reference/configuration/function-config.md @@ -10,6 +10,7 @@ sections: - 'layers' - 'policies' - 'architecture' + - 'storage' --- Configure individual Lambda function properties (e.g. `src/http/get-index/config.arc`). @@ -37,12 +38,13 @@ views false Configure the deployed function with [the `@aws` pragma](../project-manifest/aws) and the following properties: - [`runtime`](#runtime) - string, Lambda runtime or alias: `nodejs14.x` (default), `python3.7`, `dotnetcore3.1`, `node`, `py`, `.net`, etc. -- [`memory`](#memory) - number, between `128`MB and `3008`MB in 64 MB increments. +- [`memory`](#memory) - number, between `128` and `3008` MB in 64 MB increments. - [`timeout`](#timeout) - number, in seconds (max `900`) - [`concurrency`](#concurrency) - number, `0` to AWS account maximum (if not present, concurrency is unthrottled) - [`layers`](#layers) - Up to 5 Lambda layer ARNs; **must be in the same region as deployed** - [`policies`](#policies) - Configure [AWS SAM policy templates](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html) - [`architecture`](#architecture) - [AWS Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) for the function: `x86_64` (default) or `arm64` +- [`storage`](#storage) - number, between `512` (default) and `10240` MB. The function's ephemeral storage (`/tmp` file system). > Note: any function configurations made globally in your project manifest will be overridden by individual functions. For example, if your `app.arc` includes `memory 128`, and `src/http/get-index/config.arc` includes `memory 3008`, all functions except `get /` will be configured with 128MB of memory, while `get /` will override that global with 3008MB. @@ -176,8 +178,6 @@ Terser single-line version of the above example: policies S3CrudPolicy architect-default-policies ``` ---- - #### Additional resources - [AWS IAM policy ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns) @@ -193,3 +193,14 @@ Configure Lambda function [CPU `architecture`](https://docs.aws.amazon.com/lambd @aws architecture arm64 ``` + +### `storage` + +Configure Lambda function temporary file system size between `512` MB and `10240` MB, in `1` MB increments. Defaults to `512` MB. + +Ephemeral storage lives at `/tmp` in an AWS Lambda and will not persist between deployments. Amazon describes this disk space as a "scratch resource." Read more in [the AWS announcement post](https://aws.amazon.com/blogs/aws/aws-lambda-now-supports-up-to-10-gb-ephemeral-storage/). + +```arc +@aws +storage 5000 +``` diff --git a/src/views/docs/en/reference/project-manifest/aws.md b/src/views/docs/en/reference/project-manifest/aws.md index 293abfa8..54b21241 100644 --- a/src/views/docs/en/reference/project-manifest/aws.md +++ b/src/views/docs/en/reference/project-manifest/aws.md @@ -39,7 +39,8 @@ Lambda runtime, as defined by the [`lambda-runtimes`](https://github.com/archite ### `bucket` Bucket name (in same region) for CloudFormation deployment artifacts. -- If not specified, a secure deployment bucket will be automatically created + +If not specified, a secure deployment bucket will be automatically created. ### `policies` @@ -55,6 +56,16 @@ Configuring one or more policies will completely remove all of Architect's defau Configure Lambda function `layers` with max 5 Lambda Layer ARNs. Lambda Layers must be in the same region as they are deployed. +### `architecture` + +Lambda [CPU Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. + - `x86_64` (default) - 64-bit x86 architecture + - `arm64` - (only available in certain AWS regions) 64-bit ARM architecture + +### `storage` + +Lambda ephemeral storage (a "scrath" file system in `/tmp` for each Lambda). A number between `512` (default) - `10240` in MB. + ### `apigateway` API Gateway API type, can be one of: @@ -63,12 +74,6 @@ API Gateway API type, can be one of: - `httpv1` - `HTTP` API + Lambda payload format version 1.0 - `rest` - `REST` API + original API Gateway payload format -### `architecture` - -Lambda [CPU Architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) of your functions. (Added in Architect 9.1) - - `x86_64` (default) - 64-bit x86 architecture - - `arm64` - (only available in certain AWS regions) 64-bit ARM architecture - ## Environment Variables Alternatively, if you want a less granular approach, you can declare your preferred region and profile in your shell config like `.bashrc` ([more information here](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)). @@ -91,6 +96,8 @@ For example, to deploy Ruby to the northern California AWS AZ, with your AWS `wo runtime ruby region us-west-1 profile work +storage 5000 # in MB +architecture arm64 policies S3CrudPolicy architect-default-policies @@ -108,7 +115,13 @@ policies "aws": { "runtime": "ruby", "region": "us-west-1", - "profile": "work" + "profile": "work", + "storage": 5000, + "architecture": "arm64", + "policies": [ + "S3CrudPolicy", + "architect-default-policies" + ] } } ``` @@ -126,6 +139,11 @@ aws: runtime: ruby region: us-west-1 profile: work + storage: 5000 + architecture: arm64 + policies: + - S3CrudPolicy + - architect-default-policies ``` diff --git a/src/views/modules/document/head.js b/src/views/modules/document/head.js index 02b8babd..a1c68782 100644 --- a/src/views/modules/document/head.js +++ b/src/views/modules/document/head.js @@ -1,3 +1,4 @@ +let arc = require('@architect/functions') let stripCode = str => str.replace(/\<\/?code\>/g, '') export default function Head (props = {}) { @@ -44,10 +45,10 @@ export default function Head (props = {}) { - - - - + + + + diff --git a/src/views/modules/document/script.js b/src/views/modules/document/script.js index a079c4b9..a41714b8 100644 --- a/src/views/modules/document/script.js +++ b/src/views/modules/document/script.js @@ -1,8 +1,10 @@ +import arc from '@architect/functions' + export default function Script (props) { props = props || {} let src = props.src return src ? ` - + ` : '' } From 4b02b8685a259e1325481cdb98140f78f0e1bda8 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Fri, 1 Apr 2022 10:01:23 -0600 Subject: [PATCH 397/680] 3.7.8 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0d01a52c..5fea1c7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.7", + "version": "3.7.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e27ba3de..53b547c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.7", + "version": "3.7.8", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 77c8989bb6e954d856288f4f3aed0756f5f3d7d3 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Tue, 5 Apr 2022 18:56:39 -0700 Subject: [PATCH 398/680] Update project-manifest.md --- src/views/docs/en/get-started/project-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/docs/en/get-started/project-manifest.md b/src/views/docs/en/get-started/project-manifest.md index 80c44a84..626cce79 100644 --- a/src/views/docs/en/get-started/project-manifest.md +++ b/src/views/docs/en/get-started/project-manifest.md @@ -12,7 +12,7 @@ Architect projects have the following significant folder structure by default: ├── src │ ├── shared ...... # Code shared by all Lambda functions │ ├── views ....... # Code shared by HTTP GET Lambda functions -│ ├── macros ...... # Modify the generated CloudFormation +│ ├── plugins ..... # Modify anything Architect does; including generated CloudFormation │ ├── http ........ # @http Lambda functions │ ├── events ...... # @event Lambda functions │ ├── queues ...... # @queue Lambda functions From 01cd5791df9bf90b7551fa223ab1ed6be10531cc Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 6 Apr 2022 06:49:42 -0600 Subject: [PATCH 399/680] Update local-preferences.md fixes #536 --- .../en/reference/configuration/local-preferences.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/views/docs/en/reference/configuration/local-preferences.md b/src/views/docs/en/reference/configuration/local-preferences.md index c4c4cb4d..bd9514d2 100644 --- a/src/views/docs/en/reference/configuration/local-preferences.md +++ b/src/views/docs/en/reference/configuration/local-preferences.md @@ -93,6 +93,19 @@ livereload true Note: `livereload` will execute your `@http` handler with each change so long as it is a `get` or `any` path. Traditionally, these routes don't create data, but be mindful of how a reload might interact with your app's data layer before enabling. +### `ports` - List + +Designate the local ports used by Sandbox services. Sandbox will scan for and use available ports unless specified. If a specified port is unavailable, Sandbox will fail to boot. + +```arc +@sandbox +ports + http 4200 + events 4211 + queues 4222 + tables 4255 +``` + ### `env` - String Advanced option: set the `ARC_ENV` stage to `staging` or `production` and use the env vars for that stage (see the `@env` pragma above); if not specified, defaults to `testing`. This setting may introduce unexpected side effects, so only use it if you have a specific technical reason. From c8e6b93012077f76e50cf53b6240e3a68a446bbb Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 6 Apr 2022 09:30:32 -0600 Subject: [PATCH 400/680] add missing `@static` properties rearrange related docs some and update arc/fns --- package-lock.json | 6 +- package.json | 2 +- .../docs/en/guides/frontend/static-assets.md | 77 +++++++++++++++---- .../en/reference/project-manifest/static.md | 50 +++++++----- 4 files changed, 98 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5fea1c7e..ce4dd2e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -132,9 +132,9 @@ } }, "@architect/functions": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.4.tgz", - "integrity": "sha512-G7CUeOwrwiRRjsws44XI8fyeYFv4nqfrD5kzZWfaoba3FvIZjSM4vVB2eTTXThYI5u4PRJL/RxotwGW3bwj6GA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@architect/functions/-/functions-5.0.5.tgz", + "integrity": "sha512-7Bxh6W2Bg338Noelu+6g3+wm+namAuBfXxGSnRdzU2JllSKnSxKb/BpvLA5N7W0ZEbM5mKpV2xqgXK6mHksLPw==", "requires": { "cookie": "^0.4.2", "cookie-signature": "^1.2.0", diff --git a/package.json b/package.json index 53b547c3..e58774f0 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@architect/asap": "^5.0.1", - "@architect/functions": "^5.0.4", + "@architect/functions": "^5.0.5", "@architect/inventory": "^3.1.0", "@architect/package": "^8.1.0", "@architect/plugin-node-prune": "^2.0.2", diff --git a/src/views/docs/en/guides/frontend/static-assets.md b/src/views/docs/en/guides/frontend/static-assets.md index 79d8de88..a52147cf 100644 --- a/src/views/docs/en/guides/frontend/static-assets.md +++ b/src/views/docs/en/guides/frontend/static-assets.md @@ -8,18 +8,22 @@ Architect projects support text and binary static assets such as images, styles, ## `@static` configuration -- `folder public` configures the deployment folder (default is `public`) -- `fingerprint true` enables asset fingerprinting (default is `false`) -- `ignore` asset to ignore from deployment to S3 - -> Tip: `@static` assets are available at `/_static` which makes them **same-origin** - -### `folder` - -```arc -@static -folder dist -``` +- `fingerprint` - **boolean** (defaults to false) + - Enable static asset file fingerprinting (and long-lived caching headers) +- `folder` - **string** (defaults to `./public`) + - Designate the local folder to upload static assets from. +- `ignore` - **list** + - Define which assets in the static `folder` should be ignored during upload +- `prefix` - **string** + - Set a top-level directory in the S3 bucket where files will be deployed +- `prune` - **boolean** (defaults to false) + - Automatically remove assets from S3 bucket not found in the static `folder` + + +> Tip: `@static` assets are available at `/_static` which makes them **same-origin** ✨ ### `fingerprint` @@ -32,6 +36,13 @@ Enable fingerprinting: fingerprint true ``` +### `folder` + +```arc +@static +folder dist +``` + ### `ignore` Ignore zip and tar files in the `@static` folder: @@ -47,9 +58,47 @@ Ignore is greedy. For example if you ignore "foo", all filenames containing "foo > By default, Architect ignores `.DS_Store`, `node_modules`, and `readme.md` files -### Referencing fingerprinted file paths at runtime +### `prefix` + +Advanced option to specify a top-level directory inside the S3 bucket to add static files to when deploying. In this example files from `./public` will be uploaded to `/downloads/`: + +```arc +@static +prefix downloads +``` + +> Note: locally in Sandbox HTTP paths to assets will be `/_static/archive.zip`, but once deployed will look like `/_static/downloads/archive.zip`. Additionally, this setting is not accounted for in [`@architect/functions`'s `static` method](../../reference/runtime-helpers/node.js#arcstatic). + +### `prune` + +Tell Architect to automatically delete files from the S3 bucket that do not exist in the next deployment. Effectively the same as the `arc deploy --prune` command. Useful for removing old fingerprinted assets and keeping your bucket tidy. + +```arc +@static +prune true +``` + + + +## Deployment + +`arc deploy --static` deploys static assets to `staging` from `public/` or configured folder. +`arc deploy --static --production` deploys static assets to `production` from `public/` or configured folder. + +Static assets will also be uploaded during an `arc deploy` along with your function code. + +`arc deploy --static --prune` deletes static assets from the S3 bucket that are not present in the configured static asset folder. + +## Fingerprinted file paths -To get the path for generated files at runtime use `arc.static`. +To get the path for generated files at runtime use `arc.static` from `@architect/functions`, the [Architect Node.js runtime helper](../../reference/runtime-helpers/node.js#arcstatic). ```javascript // src/http/get-index/index.js diff --git a/src/views/docs/en/reference/project-manifest/static.md b/src/views/docs/en/reference/project-manifest/static.md index 0b775ca5..5cc06f35 100644 --- a/src/views/docs/en/reference/project-manifest/static.md +++ b/src/views/docs/en/reference/project-manifest/static.md @@ -4,14 +4,28 @@ category: app.arc description: Define S3 bucket --- -Configure the static asset S3 bucket. +Configure the static asset S3 bucket deployed by Architect. + +Note: `@static` is implied if `@http` is defined. ## Syntax -- No parameters are required; `@static` is implied if `@http` is defined -- `folder` defines the folder to upload static assets from. Default is `public` -- `fingerprint` enables static asset file fingerprinting (and long-lived caching headers) -- `ignore` defines which assets to be ignored during upload +All parameters are optional. + +- `fingerprint` - **boolean** (defaults to false) + - Enable static asset file fingerprinting (and long-lived caching headers) +- `folder` - **string** (defaults to `./public`) + - Designate the local folder to upload static assets from. +- `ignore` - **list** + - Define which assets in the static `folder` should be ignored during upload +- `prefix` - **string** + - Set a top-level directory in the S3 bucket where files will be deployed +- `prune` - **boolean** (defaults to false) + - Automatically remove assets from S3 bucket not found in the static `folder` + ## Example @@ -26,14 +40,17 @@ This `app.arc` file defines a static bucket: ```arc @app -testapp +test-app @static fingerprint true +folder ./dist ignore .tar.gz tmp user +prune true +prefix assets ```
    @@ -44,14 +61,17 @@ ignore ```json { - "app": "testapp", + "app": "test-app", "static": { "fingerprint": true, + "folder": "./dist", "ignore": [ ".tar.gz", "tmp", "user" - ] + ], + "prune": true, + "prefix": "assets" } } ``` @@ -68,10 +88,13 @@ app: testapp static: fingerprint: true + folder: ./dist ignore: - ".tar.gz" - "tmp" - "user" + prune: true + prefix: assets ``` @@ -80,14 +103,3 @@ static: > 📜 The [Frontend Static assets guide](/docs/en/guides/frontend/static-assets) has more information on how to use static assets in your Architect project. - -## Deployment - -`arc deploy --static` deploys static assets to `staging` from `public/` or configured folder. -`arc deploy production --static` deploys static assets to `production` from `public/` or configured folder. - -Static assets will also be uploaded during an `arc deploy` along with your function code. - -`arc deploy static --delete` deletes static assets from the S3 bucket that are not present in the configured static asset folder. - -`arc deploy static --prune` is an alias to delete. From 030479451a081f939ff21998f19efe5ae09a7ea1 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 6 Apr 2022 16:04:37 -0600 Subject: [PATCH 401/680] more detail about static spa --- .../docs/en/guides/frontend/static-assets.md | 27 ++++++++++++------- .../en/reference/project-manifest/static.md | 15 ++++++----- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/views/docs/en/guides/frontend/static-assets.md b/src/views/docs/en/guides/frontend/static-assets.md index a52147cf..9a7e435c 100644 --- a/src/views/docs/en/guides/frontend/static-assets.md +++ b/src/views/docs/en/guides/frontend/static-assets.md @@ -18,10 +18,8 @@ Architect projects support text and binary static assets such as images, styles, - Set a top-level directory in the S3 bucket where files will be deployed - `prune` - **boolean** (defaults to false) - Automatically remove assets from S3 bucket not found in the static `folder` - + - Enable "Single Page App" delivery: all page requests route to the root. > Tip: `@static` assets are available at `/_static` which makes them **same-origin** ✨ @@ -29,20 +27,24 @@ Architect projects support text and binary static assets such as images, styles, Fingerprinting adds a unique SHA to a file name based on the file content before uploading to S3. The file can then be cached effectively forever. Whenever the contents of the file changes so does the SHA invalidating the cache. -Enable fingerprinting: - ```arc @static fingerprint true ``` +The Node.js runtime helper, [`@architect/functions`, provides a `static`](../../reference/runtime-helpers/node.js#arc.static) method to help create a path for a given fingerprinted asset. See [below for an example](#fingerprinted-file-paths). + ### `folder` +Use a custom folder name or path for static assets. + ```arc @static folder dist ``` +Architect will expect assets in the folder `dist` at the root of your project. + ### `ignore` Ignore zip and tar files in the `@static` folder: @@ -67,25 +69,30 @@ Advanced option to specify a top-level directory inside the S3 bucket to add sta prefix downloads ``` -> Note: locally in Sandbox HTTP paths to assets will be `/_static/archive.zip`, but once deployed will look like `/_static/downloads/archive.zip`. Additionally, this setting is not accounted for in [`@architect/functions`'s `static` method](../../reference/runtime-helpers/node.js#arcstatic). +> Note: locally in Sandbox HTTP paths to assets will be `/_static/archive.zip`, but once deployed will look like `/_static/downloads/archive.zip`. Additionally, this setting is not accounted for in [`@architect/functions`'s `static` method](../../reference/runtime-helpers/node.js#arc.static). ### `prune` -Tell Architect to automatically delete files from the S3 bucket that do not exist in the next deployment. Effectively the same as the `arc deploy --prune` command. Useful for removing old fingerprinted assets and keeping your bucket tidy. +Tell Architect to automatically delete files from the S3 bucket that do not exist in the next deployment. Effectively the same as running `arc deploy` with the `--prune` flag. Useful for removing old fingerprinted assets and keeping your bucket tidy. ```arc @static prune true ``` - ## Deployment @@ -98,7 +105,7 @@ Static assets will also be uploaded during an `arc deploy` along with your funct ## Fingerprinted file paths -To get the path for generated files at runtime use `arc.static` from `@architect/functions`, the [Architect Node.js runtime helper](../../reference/runtime-helpers/node.js#arcstatic). +To get the path for generated files at runtime use `arc.static` from `@architect/functions`, the [Architect Node.js runtime helper](../../reference/runtime-helpers/node.js#arc.static). ```javascript // src/http/get-index/index.js diff --git a/src/views/docs/en/reference/project-manifest/static.md b/src/views/docs/en/reference/project-manifest/static.md index 5cc06f35..4c66a0a6 100644 --- a/src/views/docs/en/reference/project-manifest/static.md +++ b/src/views/docs/en/reference/project-manifest/static.md @@ -22,14 +22,14 @@ All parameters are optional. - Set a top-level directory in the S3 bucket where files will be deployed - `prune` - **boolean** (defaults to false) - Automatically remove assets from S3 bucket not found in the static `folder` - + - Enable "Single Page App" delivery: all page requests route to the root. + +> 📜 The [Frontend Static assets guide](/docs/en/guides/frontend/static-assets) has more information on how to use static assets in your Architect project. ## Example -This `app.arc` file defines a static bucket: +This `app.arc` file uses all `@static` options:
    @@ -51,6 +51,7 @@ ignore user prune true prefix assets +spa true ```
    @@ -71,7 +72,8 @@ prefix assets "user" ], "prune": true, - "prefix": "assets" + "prefix": "assets", + "spa": true, } } ``` @@ -95,11 +97,10 @@ static: - "user" prune: true prefix: assets + spa: true ```
    - -> 📜 The [Frontend Static assets guide](/docs/en/guides/frontend/static-assets) has more information on how to use static assets in your Architect project. From 74c79a315ce81e1e42897f8ec5f518a45a131785 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Thu, 7 Apr 2022 14:04:13 -0700 Subject: [PATCH 402/680] Update contributor guide --- package-lock.json | 2 +- src/views/docs/en/about/contribute.md | 107 ++++++++++++++++++++------ 2 files changed, 86 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce4dd2e9..68312e28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -269,7 +269,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#1b60fdeff5a0025370820b0e297cdc0be08099f9", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#503a9fdb0fc477f7725a3f749458c12eb323f500", "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, diff --git a/src/views/docs/en/about/contribute.md b/src/views/docs/en/about/contribute.md index e967972e..183c3287 100644 --- a/src/views/docs/en/about/contribute.md +++ b/src/views/docs/en/about/contribute.md @@ -4,7 +4,16 @@ category: About description: How to contribute to Architect. --- -Architect is an open source project and you can totally help out! Contributing doesn't just mean landing code. It can be reporting bugs, helping us triage bugs, suggesting new features, writing docs, sharing examples and plain kicking it in our community chat. These are all helpful contributions! +Architect is an open source project and you can totally help out! Contributing doesn't just mean landing code. It can be reporting bugs, helping us triage bugs, suggesting new features, writing docs, sharing examples, and plain kicking it in our community chat. These are all helpful contributions! + + +## Helping out + +We are always happy to review and potentially accept pull request to Architect repositories. In general, we suggest opening an issue and starting a discussion in the [Discord](https://discord.gg/y5A2eTsCRX) before you embark on any large project, as there may be requirements or considerations that you may not be aware of in advance. + +If you have a larger problem to solve or idea for a new feature, please file an issue for community discussion. If you have a time-sensitive problem and need to talk things through, you can almost always find someone online in our [Discord](https://discord.gg/y5A2eTsCRX). (It's also a great place to socialize new ideas and to solicit help on how to model specific [Functional Web App (FWA)](https://fwa.dev) patterns.) + +Please help us by making it easy for us to help you! If you are experiencing a bug, please have a reduced test case and steps to reproduce prepared. In our process, the first step to resolution is to create a failing test case so we can ensure there are no future regressions. By having a reduced case (even just an example project) and steps to reproduce, you will dramatically reduce the time to getting your bug fixed. ## Agreement to the Architect Code of Conduct @@ -14,38 +23,92 @@ By participating in and contributing to the Architect community — including, b Lack of familiarity with this Code of Conduct is not an excuse for not adhering to it. -## Project Code Structure +## Project structure -The Architect project distribution code is bundled in [`architect/architect`](https://github.com/architect/architect) which also serves as the [primary project issue tracker](https://github.com/architect/architect/issues). +The Architect project distribution code is bundled in [`@architect/architect`](https://github.com/architect/architect) which also serves as the [primary project issue tracker](https://github.com/architect/architect/issues). -The Architect project is composed of multiple core code repositories on GitHub: +The Architect project is comprised of multiple core repositories: + +- [`@architect/create`](https://github.com/architect/create) - scaffold and generate project code +- [`@architect/deploy`](https://github.com/architect/deploy) - deploy an Architect project +- [`@architect/destroy`](https://github.com/architect/destroy) - destroy an Architect app and its related resources +- [`@architect/env`](https://github.com/architect/env) - read / write project environment variables +- [`@architect/hydrate`](https://github.com/architect/hydrate) - ensures Lambda dependencies are installed and ready for use in an AWS environment +- [`@architect/inventory`](https://github.com/architect/inventory) - enumerate an Architect project (including plugin-generated resources) into a common internal intermediary format +- [`@architect/logs`](https://github.com/architect/logs) - read/write Lambda logs +- [`@architect/package`](https://github.com/architect/package) - consumes an Inventory object, and outputs a CloudFormation document for deployment +- [`@architect/parser`](https://github.com/architect/parser) - parser/lexer for Architect project manifest formats (`app.arc`, `.arc`, `arc.json`, `arc.yaml`, and `arc.yml`) +- [`@architect/sandbox`](https://github.com/architect/sandbox) - local development environment; mocks API Gateway, SNS, SQS, DynamoDB, Lambda, etc. +- [`@architect/utils`](https://github.com/architect/utils) - various shared internal helpers and utilities -- [`architect/parser`](https://github.com/architect/parser) - parser/lexer for Architect project manifest formats (`app.arc`, `.arc`, `arc.json`, `arc.yaml`, and `arc.yml`) -- [`architect/package`](https://github.com/architect/package) - a pure function that consumes `architect/parser` output and returns a CloudFormation document -- [`architect/deploy`](https://github.com/architect/deploy) - a wrapper for the AWS CLI `package` and `deploy` commands -- [`architect/sandbox`](https://github.com/architect/sandbox) - the local sandbox (mocks API Gateway, SNS, SQS, DynamoDB, and Lambda) -- [`architect/env`](https://github.com/architect/env) - read/write project environment variables with SSM -- [`architect/hydrate`](https://github.com/architect/hydrate) - ensures function deps are synced (including `src/shared` and `src/views`) -- [`architect/logs`](https://github.com/architect/logs) - read/write function CloudWatch logs -- [`architect/create`](https://github.com/architect/create) - code generation Projects built with Architect are encouraged to use the following runtime helper libraries: -- [`architect/functions`](https://github.com/architect/functions) - runtime helpers for Node.JS -- [`architect/functions-python`](https://github.com/architect/functions-python) - runtime helpers for Python -- [`architect/functions-ruby`](https://github.com/architect/functions-ruby) - runtime helpers for Ruby +- [`@architect/functions`](https://github.com/architect/functions) - Lambda runtime helpers for Node.js +- [`architect/functions-python`](https://github.com/architect/functions-python) - Lambda runtime helpers for Python +- [`architect/functions-ruby`](https://github.com/architect/functions-ruby) - Lambda runtime helpers for Ruby > Note: runtime helpers are not required to use Architect; they do make dealing with AWS nicer however -Architect project documentation is in the following repos: -- architect/arc.codes.next - new docs site in progress (version 6+) -- architect/arc.codes - the primary documentation website (version 6) -- architect/v5.arc.codes - version 5 docs site +It is also worthwhile to take a look at Architect's various supported plugins and example repos: +- [`architect/plugins`](https://github.com/architect/plugins) - officially supported plugins for Architect 10+ +- [`architect-examples`](https://github.com/architect-examples) - example Architect apps and projects -## Helping out -We are always happy to accept a pull request to any of the repositories above. If you have a larger problem to solve or idea for a new feature please file an issue for community discussion. If you're having a time sensitive problem and need to talk things through you can almost always find someone in our community chat. It's also a great place to socialize new ideas and to solicit help on how to model specific [Functional Web App (FWA)](https://fwa.dev) patterns. +## Architect releases + +- Architect and its constituent libraries follow [SemVer](https://SemVer.org/), taking into consideration [authortime, deploytime, and runtime lifecycle stages](https://github.com/architect/architect/issues/938) +- Architect (`@architect/architect`) releases are as deterministic as the `package.json` format allows; this is enforced by the following build dependency requirements: + - All first-order `@architect/architect` dependencies are version-pinned + - All second order `@architect/*` dependencies must use SemVer `~` + - The above versioning (pinning + `~`) do not apply to `devDependencies` + + +### Creating an Architect release + +Architect releases are published via CI / CD, with a degree of manual input. The process for creating a new Architect release looks like this: + +1. In the project to be changed, open a PR + - Ensure test coverage is maintained or added, and that tests pass (of course) + - Ideally: verify your changes locally before asking others to review your work. Sometimes the fastest path to doing this is simply to monkey-patch your local Architect installation + - If you're updating any dependencies, make sure `aws-sdk` remains pinned to the same version as all the other Architect libraries are currently using; this is intended to keep it in sync with the [current JS SDK version included in Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) +2. If the PR is in good shape and approved by a maintainer, merge the PR to `main` +3. Make sure the `changelog.md` file is updated with the correct version, date, and description of changes +4. Use **`npm version`** to publish a new version (from `main`) + - Tip: make sure you push the git tag created by `npm version` (e.g. `git push && git push --tags`), or the release will not publish to npm +5. Once the build is complete and the new release of your module is live, if necessary, update any other Architect modules that consume this change + - Example: if you publish a new minor or major release of `@architect/package`, you will then have to update `@architect/deploy` to use that new dependency, and publish a new version of that package as well +6. Once all the impacted modules are published, prepare a release of `@architect/architect` + - Bump the changed versions in `@architect/architect` + - Make sure the main Architect `changelog.md` incorporates all the various changelog changes + - Ship the new version of Architect (see: step 4) + + +### Architect module release order + +Due to internal module dependencies, Architect has the following module release order: + +0. `parser` +1. `asap` + `utils` +2. `inventory` +3. `create` + `package` + `hydrate` + `destroy` + `env` + `logs` + `functions` +4. `sandbox` + `deploy` +5. `@architect/architect` + +Per this module release, should you make a SemVer major or minor change in any of the packages earlier the list, many (or possibly all) packages below it will need to be updated and re-published. + +Examples: + +- If you make a SemVer major or minor change to `hydrate`, you will have to consume that change in `sandbox` and `deploy` before publishing `@architect/architect` +- If you make a SemVer major or minor change to `inventory`, you will have to consume that change in all packages in order stages 3, then 4, before publishing `@architect/architect` + + +### Non-reliance on automation for some release processes + +While some projects opt for highly automated module publishing and changelog / release notes, Architect has thus far been successful by utilizing a tight and reliable, albeit more manual, deployment process. + +For example, our release notes are written in plain, highly readable and explanatory language (as opposed to in commit message format). -Please help us by making it easy for us to help you! If you are experiencing a bug, please, have a reduced test case and steps to reproduce prepared. In our process, the first step to resolution is to create a failing test case so we can be sure there are no future regressions. By having a reduced case, even just an example project, and steps to reproduce you will save us all time getting to the fix! +Of course, we are always open to streamlining our processes, so please feel free to suggest improvements. From 67c357ee528c9644dc90eb6e534e26041ca2c0c7 Mon Sep 17 00:00:00 2001 From: Ryan Block Date: Fri, 8 Apr 2022 09:46:12 -0700 Subject: [PATCH 403/680] 3.7.9 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68312e28..ea0422fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.8", + "version": "3.7.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e58774f0..8d6d1b1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.8", + "version": "3.7.9", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 0c2ce256be96515da8557d1d4a46c6c355a01282 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 08:01:19 +0000 Subject: [PATCH 404/680] Bump eslint from 8.12.0 to 8.13.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.12.0 to 8.13.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.12.0...v8.13.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea0422fd..f484a8d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1652,9 +1652,9 @@ "dev": true }, "eslint": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", - "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", + "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", "dev": true, "requires": { "@eslint/eslintrc": "^1.2.1", diff --git a/package.json b/package.json index 8d6d1b1a..f85c454e 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@architect/architect": "^10.2.1", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", - "eslint": "^8.12.0", + "eslint": "^8.13.0", "linkinator": "^3.0.3", "spellchecker-cli": "^4.9.1", "tap-arc": "^0.3.4", From d6ca74ba54f8046eb3b7961e9d5d9d3df2e4f1c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 08:01:49 +0000 Subject: [PATCH 405/680] Bump tape from 5.5.2 to 5.5.3 Bumps [tape](https://github.com/substack/tape) from 5.5.2 to 5.5.3. - [Release notes](https://github.com/substack/tape/releases) - [Commits](https://github.com/substack/tape/compare/v5.5.2...v5.5.3) --- updated-dependencies: - dependency-name: tape dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f484a8d9..c4970538 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5104,9 +5104,9 @@ } }, "tape": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.5.2.tgz", - "integrity": "sha512-N9Ss672dFE3QlppiXGh2ieux8Ophau/HSAQguW5cXQworKxV0QvnZCYI35W1OYySTJk0OC9OPuS+0xNO6lhiTQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.5.3.tgz", + "integrity": "sha512-hPBJZBL9S7bH9vECg/KSM24slGYV589jJr4dmtiJrLD71AL66+8o4b9HdZazXZyvnilqA7eE8z5/flKiy0KsBg==", "dev": true, "requires": { "array.prototype.every": "^1.1.3", @@ -5121,7 +5121,7 @@ "has-dynamic-import": "^2.0.1", "inherits": "^2.0.4", "is-regex": "^1.1.4", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "object-inspect": "^1.12.0", "object-is": "^1.1.5", "object-keys": "^1.1.1", diff --git a/package.json b/package.json index f85c454e..260e1c82 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "linkinator": "^3.0.3", "spellchecker-cli": "^4.9.1", "tap-arc": "^0.3.4", - "tape": "^5.5.2", + "tape": "^5.5.3", "tiny-json-http": "^7.4.2" }, "eslintConfig": { From f0e8182a74e8673141ccd4f213f40de18bb9f90c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 15:59:50 +0000 Subject: [PATCH 406/680] Bump @architect/architect from 10.2.1 to 10.2.2 Bumps [@architect/architect](https://github.com/architect/architect) from 10.2.1 to 10.2.2. - [Release notes](https://github.com/architect/architect/releases) - [Changelog](https://github.com/architect/architect/blob/main/changelog.md) - [Commits](https://github.com/architect/architect/compare/v10.2.1...v10.2.2) --- updated-dependencies: - dependency-name: "@architect/architect" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 68 +++++++---------------------------------------- package.json | 2 +- 2 files changed, 11 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4970538..81337a24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,13 +5,13 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.2.1.tgz", - "integrity": "sha512-fiaZBEwEGFJOSNokhLUfaSJ0qVtwGGcwYAv0pOPliAxUYlyOzvCGvxqLFaBF6TNKLsO03FC3P4FvQCYN/eV5Rg==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.2.2.tgz", + "integrity": "sha512-vBSSgCKb2ADZZb0cHorWfduSPW7EOTcIoGVTbuMK9vhAKBsg9ccl7TdVXv1geqJvH24Kqh0iMo5VnWNDvvKB3g==", "dev": true, "requires": { "@architect/create": "4.0.3", - "@architect/deploy": "4.0.6", + "@architect/deploy": "4.0.7", "@architect/destroy": "3.0.2", "@architect/env": "3.0.1", "@architect/hydrate": "3.0.2", @@ -38,20 +38,12 @@ "chalk": "4.1.2", "lambda-runtimes": "~1.1.1", "minimist": "~1.2.6" - }, - "dependencies": { - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - } } }, "@architect/deploy": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.6.tgz", - "integrity": "sha512-N5kInhoXSaVduUKcPwnE0SF/smNH3PqlorcO1Uuj0TW0ExvrdWt253d8PDv/wdg0hyc41s4/fxdaRajsxPnS2Q==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.7.tgz", + "integrity": "sha512-XJv781pKMm7wrQ22qht8D27pYv9AO3YQy3VWpQRcySDR11FncAfdKZUEzyDYJLJhn8tBdklt1ZseH0q5kwjR4Q==", "dev": true, "requires": { "@architect/create": "~4.0.3", @@ -71,14 +63,6 @@ "run-waterfall": "~1.1.7", "zip-dir": "~2.0.0", "zipit": "~2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - } } }, "@architect/destroy": { @@ -93,14 +77,6 @@ "minimist": "~1.2.6", "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7" - }, - "dependencies": { - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - } } }, "@architect/env": { @@ -161,14 +137,6 @@ "minimist": "~1.2.6", "run-series": "~1.1.9", "symlink-or-copy": "~1.3.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - } } }, "@architect/inventory": { @@ -196,14 +164,6 @@ "run-parallel": "~1.2.0", "run-waterfall": "~1.1.7", "strftime": "~0.10.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - } } }, "@architect/package": { @@ -258,14 +218,6 @@ "tree-kill": "~1.2.2", "update-notifier": "~5.1.0", "ws": "~8.5.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - } } }, "@architect/spellcheck-dictionary": { @@ -2978,9 +2930,9 @@ } }, "jszip": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.8.0.tgz", - "integrity": "sha512-cnpQrXvFSLdsR9KR5/x7zdf6c3m8IhZfZzSblFEHSqBaVwD2nvJ4CuCKLyvKvwBgZm08CgfSoiTBQLm5WW9hGw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.9.1.tgz", + "integrity": "sha512-H9A60xPqJ1CuC4Ka6qxzXZeU8aNmgOeP5IFqwJbQQwtu2EUYxota3LdsiZWplF7Wgd9tkAd0mdu36nceSaPuYw==", "dev": true, "requires": { "lie": "~3.3.0", diff --git a/package.json b/package.json index 260e1c82..f193de00 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "tiny-frontmatter": "^1.0.0" }, "devDependencies": { - "@architect/architect": "^10.2.1", + "@architect/architect": "^10.2.2", "@architect/eslint-config": "^2.0.1", "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", "eslint": "^8.13.0", From 8488c4febf52b24bf3d3340661e6036a20239607 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 08:02:07 +0000 Subject: [PATCH 407/680] Bump highlight.js from 11.5.0 to 11.5.1 Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 11.5.0 to 11.5.1. - [Release notes](https://github.com/highlightjs/highlight.js/releases) - [Changelog](https://github.com/highlightjs/highlight.js/blob/11.5.1/CHANGES.md) - [Commits](https://github.com/highlightjs/highlight.js/compare/11.5.0...11.5.1) --- updated-dependencies: - dependency-name: highlight.js dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 81337a24..492498f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2340,9 +2340,9 @@ "dev": true }, "highlight.js": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.0.tgz", - "integrity": "sha512-SM6WDj5/C+VfIY8pZ6yW6Xa0Fm1tniYVYWYW1Q/DcMnISZFrC3aQAZZZFAAZtybKNrGId3p/DNbFTtcTXXgYBw==" + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz", + "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==" }, "hosted-git-info": { "version": "4.1.0", diff --git a/package.json b/package.json index f193de00..a7325ec8 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@architect/plugin-node-prune": "^2.0.2", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", "esm": "^3.2.25", - "highlight.js": "^11.5.0", + "highlight.js": "^11.5.1", "markdown-it": "^12.3.2", "markdown-it-external-anchor": "^1.0.0", "markdown-it-toc-and-anchor": "github:macdonst/markdown-it-toc-and-anchor", From b79ef9504fd5cb21a29bafea711981339bb496fd Mon Sep 17 00:00:00 2001 From: Craig Franklin Date: Thu, 14 Apr 2022 07:14:22 +1000 Subject: [PATCH 408/680] Add guide on AWS authentication via EC2 IAM role Since Architect doesn't support using an EC2 IAM role to authenticate AWS API calls, and adding support would require big changes to core functionality, adding a note to the documentation can help the occasional dev who finds themself needing using this form of authentication. Since this is principally an example of how to handle a particular form of authentication, I included it in the section on setting up AWS credentials. I made the example as simple as I could, and wrote it in JS, because that's the language I'm using, so it's the one that I've actually tested and seen work. --- .../docs/en/get-started/detailed-aws-setup.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/views/docs/en/get-started/detailed-aws-setup.md b/src/views/docs/en/get-started/detailed-aws-setup.md index f296fcd0..53670cc9 100644 --- a/src/views/docs/en/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/get-started/detailed-aws-setup.md @@ -120,6 +120,50 @@ $env:AWS_REGION='us-west-1' > If you prefer, you can also use: *Control Panel » System » Advanced System Settings » Environment Variables*. +If you're deploying from a CI/CD pipeline that runs on AWS EC2 instances and uses [IAM roles for EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) to define the pipeline's permissions, you'll need to generate temporary credentials via the AWS SDK and use them to either define the AWS env vars (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_SESSION_TOKEN`) or write a credentials file as described above. Once the credentials are in a form that Architect can read, you can call the deploy command as normal. + +Below is a basic example using the AWS JS SDK that deploys a stack to the staging environment: + +```javascript +const { exec } = require("child_process") +const AWS = require("aws-sdk") + +// Assumes that you have a 'build' script defined in package.json for building +// frontend assets. +const DEPLOY_COMMAND = "npm run build && npx arc deploy" + +const deploy = () => { + // JS-specific: you need to execute the deployment command or script in a subprocess + // in order to have access to the updated env vars. + return exec(DEPLOY_COMMAND, (error, stdout, stderr) => { + console.log(stdout) + + if (error) { + console.error(stderr) + console.error(error) + process.exit(error.code) + } + }) +} + +const deployWithAwsCredentials = (error, credentials) => { + if (error) { + console.error(error) + return process.exit(1) + } + + process.env.AWS_ACCESS_KEY_ID = + process.env.AWS_ACCESS_KEY_ID || credentials.accessKeyId + process.env.AWS_SECRET_ACCESS_KEY = + process.env.AWS_SECRET_ACCESS_KEY || credentials.secretAccessKey + process.env.AWS_SESSION_TOKEN = + process.env.AWS_SESSION_TOKEN || credentials.sessionToken + + return deploy() +} + +AWS.config.getCredentials(deployWithAwsCredentials) +``` ### Install Architect From 72b637b1f30650bbc93262f06a4f0310951de609 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 14 Apr 2022 12:38:31 -0600 Subject: [PATCH 409/680] add continuous integration guides --- package-lock.json | 2 +- src/views/docs/en/about/contribute.md | 2 +- .../docs/en/get-started/detailed-aws-setup.md | 45 ---------- .../continuous-integration/aws-ec2.md | 50 +++++++++++ .../continuous-integration/github-actions.md | 87 +++++++++++++++++++ src/views/docs/table-of-contents.js | 8 +- 6 files changed, 146 insertions(+), 48 deletions(-) create mode 100644 src/views/docs/en/guides/developer-experience/continuous-integration/aws-ec2.md create mode 100644 src/views/docs/en/guides/developer-experience/continuous-integration/github-actions.md diff --git a/package-lock.json b/package-lock.json index 492498f3..748fdd0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -221,7 +221,7 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#503a9fdb0fc477f7725a3f749458c12eb323f500", + "version": "git+https://github.com/architect/spellcheck-dictionary.git#1b60fdeff5a0025370820b0e297cdc0be08099f9", "from": "git+https://github.com/architect/spellcheck-dictionary.git", "dev": true }, diff --git a/src/views/docs/en/about/contribute.md b/src/views/docs/en/about/contribute.md index 183c3287..6119f6ee 100644 --- a/src/views/docs/en/about/contribute.md +++ b/src/views/docs/en/about/contribute.md @@ -59,7 +59,7 @@ It is also worthwhile to take a look at Architect's various supported plugins an ## Architect releases -- Architect and its constituent libraries follow [SemVer](https://SemVer.org/), taking into consideration [authortime, deploytime, and runtime lifecycle stages](https://github.com/architect/architect/issues/938) +- Architect and its constituent libraries follow [SemVer](https://SemVer.org/), taking into consideration [author-time, deploy-time, and runtime lifecycle stages](https://github.com/architect/architect/issues/938) - Architect (`@architect/architect`) releases are as deterministic as the `package.json` format allows; this is enforced by the following build dependency requirements: - All first-order `@architect/architect` dependencies are version-pinned - All second order `@architect/*` dependencies must use SemVer `~` diff --git a/src/views/docs/en/get-started/detailed-aws-setup.md b/src/views/docs/en/get-started/detailed-aws-setup.md index 53670cc9..9d507ba3 100644 --- a/src/views/docs/en/get-started/detailed-aws-setup.md +++ b/src/views/docs/en/get-started/detailed-aws-setup.md @@ -120,51 +120,6 @@ $env:AWS_REGION='us-west-1' > If you prefer, you can also use: *Control Panel » System » Advanced System Settings » Environment Variables*. -If you're deploying from a CI/CD pipeline that runs on AWS EC2 instances and uses [IAM roles for EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) to define the pipeline's permissions, you'll need to generate temporary credentials via the AWS SDK and use them to either define the AWS env vars (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_SESSION_TOKEN`) or write a credentials file as described above. Once the credentials are in a form that Architect can read, you can call the deploy command as normal. - -Below is a basic example using the AWS JS SDK that deploys a stack to the staging environment: - -```javascript -const { exec } = require("child_process") -const AWS = require("aws-sdk") - -// Assumes that you have a 'build' script defined in package.json for building -// frontend assets. -const DEPLOY_COMMAND = "npm run build && npx arc deploy" - -const deploy = () => { - // JS-specific: you need to execute the deployment command or script in a subprocess - // in order to have access to the updated env vars. - return exec(DEPLOY_COMMAND, (error, stdout, stderr) => { - console.log(stdout) - - if (error) { - console.error(stderr) - console.error(error) - process.exit(error.code) - } - }) -} - -const deployWithAwsCredentials = (error, credentials) => { - if (error) { - console.error(error) - return process.exit(1) - } - - process.env.AWS_ACCESS_KEY_ID = - process.env.AWS_ACCESS_KEY_ID || credentials.accessKeyId - process.env.AWS_SECRET_ACCESS_KEY = - process.env.AWS_SECRET_ACCESS_KEY || credentials.secretAccessKey - process.env.AWS_SESSION_TOKEN = - process.env.AWS_SESSION_TOKEN || credentials.sessionToken - - return deploy() -} - -AWS.config.getCredentials(deployWithAwsCredentials) -``` - ### Install Architect The following command uses `npm`, the package manager for Node.js. diff --git a/src/views/docs/en/guides/developer-experience/continuous-integration/aws-ec2.md b/src/views/docs/en/guides/developer-experience/continuous-integration/aws-ec2.md new file mode 100644 index 00000000..115a4ed7 --- /dev/null +++ b/src/views/docs/en/guides/developer-experience/continuous-integration/aws-ec2.md @@ -0,0 +1,50 @@ +--- +title: Deploying from an EC2 instance +category: Continuous integration +description: Setting up Architect project deployment from EC2 with proper IAM roles. +--- + +If you're deploying from a CI/CD pipeline that runs on AWS EC2 instances and uses [IAM roles for EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) to define the pipeline's permissions, you'll need to generate temporary credentials via the AWS SDK and use them to either define the AWS env vars (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_SESSION_TOKEN`). Once the credentials are in a form that Architect can read, you can call the deploy command as normal. + +Below is a basic example using the AWS JavaScript SDK that deploys a stack to the staging environment: + +```javascript +const { exec } = require('child_process') +const AWS = require('aws-sdk') + +// Assumes that you have a 'build' script defined in package.json for building +// frontend assets. +const DEPLOY_COMMAND = 'npm run build && npx arc deploy' + +const deploy = () => { + // JS-specific: you need to execute the deployment command or script in a subprocess + // in order to have access to the updated env vars. + return exec(DEPLOY_COMMAND, (error, stdout, stderr) => { + console.log(stdout) + + if (error) { + console.error(stderr) + console.error(error) + process.exit(error.code) + } + }) +} + +const deployWithAwsCredentials = (error, credentials) => { + if (error) { + console.error(error) + return process.exit(1) + } + + process.env.AWS_ACCESS_KEY_ID = + process.env.AWS_ACCESS_KEY_ID || credentials.accessKeyId + process.env.AWS_SECRET_ACCESS_KEY = + process.env.AWS_SECRET_ACCESS_KEY || credentials.secretAccessKey + process.env.AWS_SESSION_TOKEN = + process.env.AWS_SESSION_TOKEN || credentials.sessionToken + + return deploy() +} + +AWS.config.getCredentials(deployWithAwsCredentials) +``` diff --git a/src/views/docs/en/guides/developer-experience/continuous-integration/github-actions.md b/src/views/docs/en/guides/developer-experience/continuous-integration/github-actions.md new file mode 100644 index 00000000..45484e02 --- /dev/null +++ b/src/views/docs/en/guides/developer-experience/continuous-integration/github-actions.md @@ -0,0 +1,87 @@ +--- +title: Deploying from GitHub Actions +category: Continuous integration +description: Deploy an Architect project from GitHub Actions. +--- + +Deploy an Architect project from GitHub Actions. This particular example (inspired by [the Remix team's implementation](https://github.com/remix-run/grunge-stack/blob/bc9270eb29eda1a806d6b4c773ebcf84f216e2ab/.github/workflows/deploy.yml)) will deploy commits to the `dev` branch to staging and commits to `main` to production. Extract or add steps as needed for your pipeline. + +Set up this action by adding to your project's repository in `./.github/workflows/deploy.yml`. + +> 🔑 Required: Set your project's `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` in [your GitHub repository's secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). + + +## Action YAML template + +```yaml +name: Deploy +on: + push: + branches: + - main + - dev + pull_request: {} + +defaults: + run: + shell: bash + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Cancel previous runs + uses: styfle/cancel-workflow-action@0.9.1 + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Install dependencies + uses: bahmutov/npm-install@v1 + # - name: Build + # run: npm run build + - name: Run tests + run: npm test + + deploy: + needs: [test] + runs-on: ubuntu-latest + steps: + - name: Cancel previous uns + uses: styfle/cancel-workflow-action@0.9.1 + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Env report + run: | + echo "Event name: ${{ github.event_name }}" + echo "Git ref: ${{ github.ref }}" + echo "GH actor: ${{ github.actor }}" + echo "SHA: ${{ github.sha }}" + VER=`node --version`; echo "Node ver: $VER" + VER=`npm --version`; echo "npm ver: $VER" + - name: Install dependencies + uses: bahmutov/npm-install@v1 + # - name: Build + # run: npm run build + - name: Staging deploy + if: github.ref == 'refs/heads/dev' + run: arc deploy --staging -v --prune + env: + CI: true + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - name: Production deploy + if: github.ref == 'refs/heads/main' + run: arc deploy --production -v --prune + env: + CI: true + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} +``` diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.js index b51c6660..5616d752 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.js @@ -17,7 +17,13 @@ let Guides = [ 'Logging & monitoring', 'Using ESM', 'Using TypeScript', - 'Customizing CloudFormation' + 'Customizing CloudFormation', + { + 'Continuous integration': [ + 'GitHub Actions', + 'AWS EC2', + ] + } ], 'Frontend': [ 'Sessions', From 08501f4e32a40ceee8c904dd64a566c654173f19 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 14 Apr 2022 12:56:10 -0600 Subject: [PATCH 410/680] 3.7.10 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 748fdd0f..87b43951 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.9", + "version": "3.7.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a7325ec8..8b31ad2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.9", + "version": "3.7.10", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From 28a4950e8495714e325b0653bc9aaad4575587be Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 14 Apr 2022 19:16:01 -0600 Subject: [PATCH 411/680] use arc.static for meta tag image directives --- src/views/modules/document/head.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/views/modules/document/head.js b/src/views/modules/document/head.js index a1c68782..bf278a65 100644 --- a/src/views/modules/document/head.js +++ b/src/views/modules/document/head.js @@ -17,13 +17,13 @@ export default function Head (props = {}) { - + ${stripCode(fullTitle)} - + @@ -31,12 +31,12 @@ export default function Head (props = {}) { - + - + From 0fb253145e1a1af3def3ee60b6062093f014586e Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 14 Apr 2022 19:22:16 -0600 Subject: [PATCH 412/680] npm audit fix async package --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87b43951..6b2cbbad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1450,9 +1450,9 @@ }, "dependencies": { "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" From 1b56a14c0380030df10ef664ac4b18c9fce3a1bd Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Thu, 14 Apr 2022 19:22:23 -0600 Subject: [PATCH 413/680] 3.7.11 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b2cbbad..9d2967e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.10", + "version": "3.7.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8b31ad2e..280e8dfe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.10", + "version": "3.7.11", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From c4c11edab6ab531906176a3f9a0654f168af20c1 Mon Sep 17 00:00:00 2001 From: macdonst Date: Mon, 18 Apr 2022 15:35:34 -0400 Subject: [PATCH 414/680] Use gh composite actions Signed-off-by: macdonst --- .github/workflows/build.yml | 82 ++++++------------------------------- 1 file changed, 13 insertions(+), 69 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8d3034bb..20246971 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,55 +3,16 @@ name: Node CI # Push tests pushes; PR tests merges on: [ push, pull_request ] -defaults: - run: - shell: bash - jobs: - # Test the build build: # Setup - runs-on: ${{ matrix.os }} - strategy: - matrix: - node-version: [ 14.x ] - os: [ ubuntu-latest ] + runs-on: ubuntu-latest # Go steps: - - name: Check out repo - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - - name: Env - run: | - echo "Event name: ${{ github.event_name }}" - echo "Git ref: ${{ github.ref }}" - echo "GH actor: ${{ github.actor }}" - echo "SHA: ${{ github.sha }}" - VER=`node --version`; echo "Node ver: $VER" - VER=`npm --version`; echo "npm ver: $VER" - - - name: Install - run: npm install - - - name: Vendor dist files - run: npm run dist - - - name: Hydrate - run: npx arc hydrate - env: - CI: true - - - name: Test - run: npm test - env: - CI: true + - name: Build App + uses: architect/action-build@v3 - name: Notify uses: sarisia/actions-status-discord@v1 @@ -72,35 +33,18 @@ jobs: # Go steps: - - name: Check out repo - uses: actions/checkout@v2 + # Setup + needs: build + if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest - - name: Set up Node.js - uses: actions/setup-node@v2 + # Go + steps: + - name: Deploy app + uses: architect/action-deploy@v1 with: - node-version: 14 - - - name: Install - run: npm i - - - name: Vendor dist files - run: npm run dist - - - name: Staging Deploy - if: github.ref == 'refs/heads/main' - run: npx arc deploy --staging - env: - CI: true - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - - name: Production Deploy - if: startsWith(github.ref, 'refs/tags/v') - run: npx arc deploy --production - env: - CI: true - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws_access_key_id: ${{secrets.AWS_ACCESS_KEY_ID}} + aws_secret_access_key: ${{secrets.AWS_SECRET_ACCESS_KEY}} - name: Notify uses: sarisia/actions-status-discord@v1 From 4cdf511df2decfe58764b13b7cb704695ea0f490 Mon Sep 17 00:00:00 2001 From: macdonst Date: Mon, 18 Apr 2022 15:38:45 -0400 Subject: [PATCH 415/680] FIx syntax error Signed-off-by: macdonst --- .github/workflows/build.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20246971..a613b626 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,13 +31,6 @@ jobs: if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest - # Go - steps: - # Setup - needs: build - if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') - runs-on: ubuntu-latest - # Go steps: - name: Deploy app From 73d281c5575fb375adea46e75d1376cb49a2e95d Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 18 Apr 2022 14:02:41 -0600 Subject: [PATCH 416/680] Update github-actions.md (#547) --- scripts/link-checker.mjs | 1 + .../continuous-integration/github-actions.md | 80 ++++++++++++++----- 2 files changed, 62 insertions(+), 19 deletions(-) diff --git a/scripts/link-checker.mjs b/scripts/link-checker.mjs index 09970af0..14559591 100644 --- a/scripts/link-checker.mjs +++ b/scripts/link-checker.mjs @@ -23,6 +23,7 @@ test('find broken links', async (t) => { path: root, recurse: true, linksToSkip: [ + 'https://arc.codes/_static/arc.codes.png', // final asset is fingerprinted 'https://www.godaddy.com', // GoDaddy 403s crawlers 'https://github.com/architect/arc.codes/edit/' // skip all the "Edit on GitHub" links ], diff --git a/src/views/docs/en/guides/developer-experience/continuous-integration/github-actions.md b/src/views/docs/en/guides/developer-experience/continuous-integration/github-actions.md index 45484e02..df37e293 100644 --- a/src/views/docs/en/guides/developer-experience/continuous-integration/github-actions.md +++ b/src/views/docs/en/guides/developer-experience/continuous-integration/github-actions.md @@ -4,17 +4,58 @@ category: Continuous integration description: Deploy an Architect project from GitHub Actions. --- -Deploy an Architect project from GitHub Actions. This particular example (inspired by [the Remix team's implementation](https://github.com/remix-run/grunge-stack/blob/bc9270eb29eda1a806d6b4c773ebcf84f216e2ab/.github/workflows/deploy.yml)) will deploy commits to the `dev` branch to staging and commits to `main` to production. Extract or add steps as needed for your pipeline. +Architect projects can be tested and deployed from GitHub Actions. -Set up this action by adding to your project's repository in `./.github/workflows/deploy.yml`. +## Architect-provided actions -> 🔑 Required: Set your project's `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` in [your GitHub repository's secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). - +Architect has created [`architect/action-build`](https://github.com/architect/action-build) and [`architect/action-deploy`](https://github.com/architect/action-deploy) for GitHub Actions. These can be included as a part of your project's workflows. -## Action YAML template +> 🔑 Required: `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` must be set in [your GitHub repository or organization secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). + +The deploy action follows a standard pattern where commits to the `main` branch are deployed to a staging environment and git tags that begin with `v` are deployed to production. + +This allows a workflow where a PR is merged into `main` and automatically promoted to staging. Then a git tag is created (like with `npm version patch|minor|major`) to deploy to production. It is helpful to ["follow tags" when git pushing](https://git-scm.com/docs/git-push#Documentation/git-push.txt---follow-tags). + +### Usage example + +```yaml +# ./.github/workflows/build-deploy.yml +name: Build and deploy + +on: [ push, pull_request ] + +jobs: + # Build and test + build: + runs-on: ubuntu-latest + steps: + - name: Build App + uses: architect/action-build@v3 + + # Deploy main branch to staging and git tags to production + deploy: + needs: build + if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + + steps: + - name: Deploy app + uses: architect/action-deploy@v1 + with: + aws_access_key_id: ${{secrets.AWS_ACCESS_KEY_ID}} + aws_secret_access_key: ${{secrets.AWS_SECRET_ACCESS_KEY}} +``` + +## Custom action sample + +The following example is similar to the Architect actions but will deploy commits to the `dev` branch to staging and commits to `main` to production. Extract or add steps as needed for your pipeline. + +### Action YAML template ```yaml -name: Deploy +# ./.github/workflows/test-deploy.yml +name: Test and deploy + on: push: branches: @@ -22,10 +63,6 @@ on: - dev pull_request: {} -defaults: - run: - shell: bash - jobs: test: name: Test @@ -38,16 +75,17 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 14 - name: Install dependencies uses: bahmutov/npm-install@v1 - # - name: Build - # run: npm run build + - name: Arc hydrate + run: arc hydrate - name: Run tests run: npm test deploy: - needs: [test] + name: Deploy + needs: test runs-on: ubuntu-latest steps: - name: Cancel previous uns @@ -57,7 +95,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 14 - name: Env report run: | echo "Event name: ${{ github.event_name }}" @@ -68,20 +106,24 @@ jobs: VER=`npm --version`; echo "npm ver: $VER" - name: Install dependencies uses: bahmutov/npm-install@v1 - # - name: Build - # run: npm run build + - name: Arc hydrate + run: arc hydrate - name: Staging deploy if: github.ref == 'refs/heads/dev' run: arc deploy --staging -v --prune env: - CI: true AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - name: Production deploy if: github.ref == 'refs/heads/main' run: arc deploy --production -v --prune env: - CI: true AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} ``` + + From b71c39d4dd9975b2ff5cd6fe0eb016ef885e6373 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 18 Apr 2022 14:04:04 -0600 Subject: [PATCH 417/680] 3.7.12 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d2967e4..e0c7fbf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.11", + "version": "3.7.12", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 280e8dfe..f30d1436 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@architect/arc.codes", - "version": "3.7.11", + "version": "3.7.12", "repository": { "type": "git", "url": "https://github.com/architect/arc.codes" From f2c192e3dc19bfae91ed0326069a0268464b8222 Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 18 Apr 2022 19:20:23 -0600 Subject: [PATCH 418/680] use light/dark arc logo in readme --- readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 5bb5d082..b09c10e9 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,5 @@ -[](https://www.npmjs.com/package/@architect/architect) +![Architect logo](https://github.com/architect/assets.arc.codes/raw/main/public/architect-logo-light-500b%402x.png#gh-dark-mode-only) +![Architect logo](https://github.com/architect/assets.arc.codes/raw/main/public/architect-logo-500b%402x.png#gh-light-mode-only) ## [`https://arc.codes`](https://arc.codes) From b0a54fee63dfa4f33ace41bb0aee48bc981d12ba Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Wed, 27 Apr 2022 16:23:59 -0600 Subject: [PATCH 419/680] ESM + arcdown (#553) --- .eslintignore | 1 - .github/workflows/link-checker.yaml | 61 +-- .npmrc | 1 + package-lock.json | 462 +++++++++--------- package.json | 47 +- prefs.arc | 4 - public/components/arc-tab.js | 28 +- public/components/arc-viewer.js | 24 +- scripts/dist.sh | 12 - scripts/highlight/index.js | 19 - src/http/any-catchall/index.js | 45 -- src/http/any-catchall/index.mjs | 42 ++ src/http/get-api-package/index.js | 27 - src/http/get-api-package/index.mjs | 26 + .../get-docs-000lang-catchall/highlighter.js | 13 - src/http/get-docs-000lang-catchall/index.js | 98 ---- src/http/get-docs-000lang-catchall/index.mjs | 103 ++++ ...appings.js => markdown-class-mappings.mjs} | 2 +- .../markdown-class.js | 32 -- .../get-docs-000lang-catchall/renderer.js | 43 -- src/plugins/spellcheck.js | 19 +- ...und-response.js => not-found-response.mjs} | 2 +- .../{redirect-map.js => redirect-map.mjs} | 19 +- ...e-of-contents.js => table-of-contents.mjs} | 12 +- src/views/modules/.eslintrc.js | 6 - .../components/{algolia.js => algolia.mjs} | 0 .../components/{banner.js => banner.mjs} | 0 .../{discord-link.js => discord-link.mjs} | 4 +- ...cument-outline.js => document-outline.mjs} | 8 +- .../{edit-link.js => edit-link.mjs} | 0 .../{github-link.js => github-link.mjs} | 4 +- .../modules/components/{icon.js => icon.mjs} | 2 +- .../modules/components/{logo.js => logo.mjs} | 2 +- .../{not-found.js => not-found.mjs} | 0 .../components/{search.js => search.mjs} | 2 +- .../components/{sidebar.js => sidebar.mjs} | 41 +- .../{theme-button.js => theme-button.mjs} | 4 +- src/views/modules/document/{ga.js => ga.mjs} | 8 +- .../modules/document/{head.js => head.mjs} | 9 +- .../modules/document/{html.js => html.mjs} | 34 +- .../document/{script.js => script.mjs} | 2 +- .../modules/document/{state.js => state.mjs} | 0 .../document/{symbols.js => symbols.mjs} | 0 .../document/{top-nav.js => top-nav.mjs} | 12 +- .../helpers/{capitalize.js => capitalize.mjs} | 0 .../modules/helpers/{list.js => list.mjs} | 12 +- .../helpers/{slugify.js => slugify.mjs} | 0 ...rect-map-test.js => redirect-map-test.mjs} | 10 +- test/backend/renderer-test.js | 50 -- test/backend/sandbox-http-test.js | 23 - test/backend/sandbox-http-test.mjs | 23 + test/frontend/helpers/strip.js | 3 - test/frontend/helpers/strip.mjs | 3 + .../{sidebar-test.js => sidebar-test.mjs} | 115 +++-- test/frontend/slugify-test.js | 10 - test/frontend/slugify-test.mjs | 10 + {scripts => test}/link-checker.mjs | 3 +- 57 files changed, 669 insertions(+), 873 deletions(-) delete mode 100644 .eslintignore create mode 100644 .npmrc delete mode 100755 scripts/dist.sh delete mode 100644 scripts/highlight/index.js delete mode 100644 src/http/any-catchall/index.js create mode 100644 src/http/any-catchall/index.mjs delete mode 100644 src/http/get-api-package/index.js create mode 100644 src/http/get-api-package/index.mjs delete mode 100644 src/http/get-docs-000lang-catchall/highlighter.js delete mode 100644 src/http/get-docs-000lang-catchall/index.js create mode 100644 src/http/get-docs-000lang-catchall/index.mjs rename src/http/get-docs-000lang-catchall/{markdown-class-mappings.js => markdown-class-mappings.mjs} (98%) delete mode 100644 src/http/get-docs-000lang-catchall/markdown-class.js delete mode 100644 src/http/get-docs-000lang-catchall/renderer.js rename src/shared/{not-found-response.js => not-found-response.mjs} (91%) rename src/shared/{redirect-map.js => redirect-map.mjs} (98%) rename src/views/docs/{table-of-contents.js => table-of-contents.mjs} (92%) delete mode 100644 src/views/modules/.eslintrc.js rename src/views/modules/components/{algolia.js => algolia.mjs} (100%) rename src/views/modules/components/{banner.js => banner.mjs} (100%) rename src/views/modules/components/{discord-link.js => discord-link.mjs} (84%) rename src/views/modules/components/{document-outline.js => document-outline.mjs} (71%) rename src/views/modules/components/{edit-link.js => edit-link.mjs} (100%) rename src/views/modules/components/{github-link.js => github-link.mjs} (85%) rename src/views/modules/components/{icon.js => icon.mjs} (81%) rename src/views/modules/components/{logo.js => logo.mjs} (99%) rename src/views/modules/components/{not-found.js => not-found.mjs} (100%) rename src/views/modules/components/{search.js => search.mjs} (86%) rename src/views/modules/components/{sidebar.js => sidebar.mjs} (73%) rename src/views/modules/components/{theme-button.js => theme-button.mjs} (85%) rename src/views/modules/document/{ga.js => ga.mjs} (75%) rename src/views/modules/document/{head.js => head.mjs} (91%) rename src/views/modules/document/{html.js => html.mjs} (67%) rename src/views/modules/document/{script.js => script.mjs} (89%) rename src/views/modules/document/{state.js => state.mjs} (100%) rename src/views/modules/document/{symbols.js => symbols.mjs} (100%) rename src/views/modules/document/{top-nav.js => top-nav.mjs} (78%) rename src/views/modules/helpers/{capitalize.js => capitalize.mjs} (100%) rename src/views/modules/helpers/{list.js => list.mjs} (75%) rename src/views/modules/helpers/{slugify.js => slugify.mjs} (100%) rename test/backend/{redirect-map-test.js => redirect-map-test.mjs} (86%) delete mode 100644 test/backend/renderer-test.js delete mode 100644 test/backend/sandbox-http-test.js create mode 100644 test/backend/sandbox-http-test.mjs delete mode 100644 test/frontend/helpers/strip.js create mode 100644 test/frontend/helpers/strip.mjs rename test/frontend/{sidebar-test.js => sidebar-test.mjs} (68%) delete mode 100644 test/frontend/slugify-test.js create mode 100644 test/frontend/slugify-test.mjs rename {scripts => test}/link-checker.mjs (92%) diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 1a862348..00000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -src/http/get-docs-000lang-catchall/highlight/**/* diff --git a/.github/workflows/link-checker.yaml b/.github/workflows/link-checker.yaml index 2dca2bfc..c86f0286 100644 --- a/.github/workflows/link-checker.yaml +++ b/.github/workflows/link-checker.yaml @@ -1,61 +1,16 @@ name: "Arc.codes Link Checker" - on: [ pull_request ] - defaults: run: shell: bash - jobs: - build: - # Setup - runs-on: ${{ matrix.os }} - strategy: - matrix: - node-version: [ 14.x ] - os: [ ubuntu-latest ] - - # Go + linkchecker: + runs-on: ubuntu-latest steps: - - name: Check out repo - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - node-version: ${{ matrix.node-version }} - - - name: Env - run: | - echo "Event name: ${{ github.event_name }}" - echo "Git ref: ${{ github.ref }}" - echo "GH actor: ${{ github.actor }}" - echo "SHA: ${{ github.sha }}" - VER=`node --version`; echo "Node ver: $VER" - VER=`npm --version`; echo "npm ver: $VER" - - - name: Install - run: npm install - - - name: Vendor dist files - run: npm run dist - - - name: Hydrate - run: npx arc hydrate - env: - CI: true - - - name: check links - run: npm run link-checker - env: - CI: true - - - name: Notify - uses: sarisia/actions-status-discord@v1 - # Only fire alert once - if: github.ref == 'refs/heads/main' && failure() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK }} - title: "link checker" - color: 0x222222 - username: GitHub Actions + node-version: '14' + - run: npm i + - run: npx arc hydrate + - run: npm run link-checker diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/package-lock.json b/package-lock.json index e0c7fbf4..aa141faa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,18 +5,18 @@ "requires": true, "dependencies": { "@architect/architect": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.2.2.tgz", - "integrity": "sha512-vBSSgCKb2ADZZb0cHorWfduSPW7EOTcIoGVTbuMK9vhAKBsg9ccl7TdVXv1geqJvH24Kqh0iMo5VnWNDvvKB3g==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@architect/architect/-/architect-10.3.0.tgz", + "integrity": "sha512-dz27XAmTstj+/7K4wDXxnfQZwaSotvHS07PTN131V5m6RSMhPqmpEdLIa8F/K5epXekBrlrp29fMn1i47+rUxg==", "dev": true, "requires": { "@architect/create": "4.0.3", - "@architect/deploy": "4.0.7", + "@architect/deploy": "4.1.0", "@architect/destroy": "3.0.2", "@architect/env": "3.0.1", "@architect/hydrate": "3.0.2", "@architect/logs": "4.0.1", - "@architect/sandbox": "5.2.2", + "@architect/sandbox": "5.2.3", "aws-sdk": "2.1001.0", "chalk": "4.1.2", "update-notifier": "5.1.0" @@ -41,9 +41,9 @@ } }, "@architect/deploy": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.0.7.tgz", - "integrity": "sha512-XJv781pKMm7wrQ22qht8D27pYv9AO3YQy3VWpQRcySDR11FncAfdKZUEzyDYJLJhn8tBdklt1ZseH0q5kwjR4Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@architect/deploy/-/deploy-4.1.0.tgz", + "integrity": "sha512-aaYRm/MnyO9lGQp/PaSiwSR4co8/037ZOsnnG1j/qMF/kJYw0DSt94vJoGUabfEHkiWdswyuHPS5gh/51HjFwA==", "dev": true, "requires": { "@architect/create": "~4.0.3", @@ -189,9 +189,9 @@ } }, "@architect/sandbox": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.2.2.tgz", - "integrity": "sha512-j/k5IuYRFv+UxaeF6TI7P+7pdx7L6FbDvGwQYWdc+Cvz7k/ly2Yih+VmfP0bs3/g0dqIOgBj0eo6mVODwFqq2g==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@architect/sandbox/-/sandbox-5.2.3.tgz", + "integrity": "sha512-Xb90Au93mSiYW+eIu10Ib22btKdpkxrHhGhVI9m3vQZnwh4vfy16EpdYjveSNCyf8zNpbsdjZ14qYJZ2ZPHgrw==", "dev": true, "requires": { "@architect/asap": "~5.0.1", @@ -221,8 +221,8 @@ } }, "@architect/spellcheck-dictionary": { - "version": "git+https://github.com/architect/spellcheck-dictionary.git#1b60fdeff5a0025370820b0e297cdc0be08099f9", - "from": "git+https://github.com/architect/spellcheck-dictionary.git", + "version": "github:architect/spellcheck-dictionary#503a9fdb0fc477f7725a3f749458c12eb323f500", + "from": "github:architect/spellcheck-dictionary#v0.1.7", "dev": true }, "@architect/syntaxes": { @@ -230,9 +230,9 @@ "from": "github:architect/syntaxes#v1.2.1" }, "@architect/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-oKGTcGDdB5NggePEJZJURButbAjeKuP2Ea+CS2iHE6QfQ8vBzn5Ps6Rtix36kWqXpArNHNAaClz3S2aCZteMJg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@architect/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-Dr1+zuG0EZzqQuv+BhR7NRAIMsGSVB3GuGuR5znLTzJMvFlrsV/LpLlwAjFIa9POVWBpNQodt6Y5p+TpR5FaUA==", "requires": { "chalk": "4.1.2", "glob": "~7.2.0", @@ -259,9 +259,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -334,9 +334,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", + "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -350,12 +350,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -365,15 +359,6 @@ "ms": "2.1.2" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -567,9 +552,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -634,15 +619,24 @@ "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, + "arcdown": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/arcdown/-/arcdown-0.1.1.tgz", + "integrity": "sha512-+8CITCa2bmAuS28lquloryIrDhlfxJiWMtbbmwlWdr7qQg6ybKS5XQPX6vQ02RPIX3TvO44QeMRYnPnU0OPaeA==", "requires": { - "sprintf-js": "~1.0.2" + "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", + "highlight.js": "^11.5.1", + "markdown-it": "^13.0.0", + "markdown-it-external-anchor": "^1.0.0", + "markdown-it-toc-and-anchor": "^4.2.0", + "tiny-frontmatter": "^1.0.0" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "array-back": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", @@ -693,14 +687,15 @@ } }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "arrify": { @@ -1268,12 +1263,13 @@ } }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "defined": { @@ -1304,21 +1300,21 @@ "dev": true }, "dictionary-en-au": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.3.0.tgz", - "integrity": "sha512-KoEotpXPCyCgZ5DHlexHyzFfNwPnv9VupeCrp6r+JrtEkycPmZYbQiXF+cXz9NJr1gXy0AMEpzZ8UfxF40+8OQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/dictionary-en-au/-/dictionary-en-au-2.4.0.tgz", + "integrity": "sha512-SEETr3rqt26/Umc43gemwaH/ez4gPv7I4alifu/QLi8uxiCm6a7cn3wKb22HNB5l6j/R7/Sfkq9NTKk/QRVUHw==", "dev": true }, "dictionary-en-ca": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.3.0.tgz", - "integrity": "sha512-5p6B2+GLByVz3Gvb42Y5hTdFBNxJhgG7XRVM74J7hcp+DvtAfOrufTZFfkux9t0qWOjORZoDCmDI6uKiX8qeuQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/dictionary-en-ca/-/dictionary-en-ca-2.4.0.tgz", + "integrity": "sha512-uDoOe7/dz1XD3niVpOroSo3Pas7cdsAp+NSwfan30MGzzeXaD04lQuTRDqHpsXuP8fq3U7f9v8Iaiyk5q/kgzw==", "dev": true }, "dictionary-en-gb": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.3.0.tgz", - "integrity": "sha512-P/J2VQp/hDsMTfJhmIYPUBxZqezWuDaUzSgb6oW7JLpUV2So9jCXbR5TaUYXwfO50ZXPYEzQqQHPQK3pKcs7Rg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/dictionary-en-gb/-/dictionary-en-gb-2.4.0.tgz", + "integrity": "sha512-zwc7e6CM/+Em+v74a5/ia6663nwR9vvtEayaX5WkgvHD99al1qm/RbcdLludqX3mggYxXXFN1zN5hzyREW/DXg==", "dev": true }, "dictionary-en-us": { @@ -1328,15 +1324,15 @@ "dev": true }, "dictionary-en-za": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.0.4.tgz", - "integrity": "sha512-EgI61DvQsrnIFBmmCz7GB9P/wkCnKnZgKRXyYpbkZomnY0I4vDfNZtjaX81lwb9s+eudP9QJ+8sMzK7eoUapEg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dictionary-en-za/-/dictionary-en-za-2.2.0.tgz", + "integrity": "sha512-YFod3pshfaecqCe221rczW5lVWn4ZhfFH6E395DN1bEbL4dUndGm9Bn/zxMOU2w9imYKwptYalO23hetwUx+OA==", "dev": true }, "dictionary-vi": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.1.3.tgz", - "integrity": "sha512-fB4WiFGNDXQ0qtRiOz+ZZ5uWrpxZLxw35fU0EXxWouZwoiCnRex5nE8VdhGSzn6SG+JEDiUOXoxNu4l7LKcXQA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dictionary-vi/-/dictionary-vi-2.2.0.tgz", + "integrity": "sha512-WDCaSzHMtayCIEa2hPq0rL8ds603SKNzMzNXU0kbLM7kzXoaXaKeHgPXJHKjKMxxnozKLMsg+rES7hC6Lxe7iA==", "dev": true }, "diff": { @@ -1364,26 +1360,34 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } } }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { "domelementtype": "^2.2.0" @@ -1500,9 +1504,9 @@ } }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" }, "errno": { "version": "0.1.8", @@ -1523,9 +1527,9 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", + "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -1534,15 +1538,15 @@ "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -1574,6 +1578,15 @@ } } }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -1604,12 +1617,12 @@ "dev": true }, "eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", + "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.1", + "@eslint/eslintrc": "^1.2.2", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -1646,12 +1659,6 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1679,15 +1686,6 @@ "is-glob": "^4.0.3" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1791,9 +1789,9 @@ } }, "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -1801,14 +1799,14 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" } }, "eslint-scope": { @@ -1844,11 +1842,6 @@ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" - }, "espree": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", @@ -2133,6 +2126,12 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gar": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", @@ -2140,16 +2139,16 @@ "dev": true }, "gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.3.tgz", + "integrity": "sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==", "dev": true, "requires": { "abort-controller": "^3.0.0", "extend": "^3.0.2", "https-proxy-agent": "^5.0.0", "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" + "node-fetch": "^2.6.7" } }, "gemoji": { @@ -2278,9 +2277,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "hard-rejection": { "version": "2.1.0", @@ -2298,9 +2297,9 @@ } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-dynamic-import": { @@ -2318,10 +2317,19 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-tostringtag": { @@ -2363,14 +2371,6 @@ "domhandler": "^4.2.2", "domutils": "^2.8.0", "entities": "^3.0.1" - }, - "dependencies": { - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true - } } }, "http-cache-semantics": { @@ -2404,9 +2404,9 @@ } }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", @@ -2414,9 +2414,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -2595,9 +2595,9 @@ } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { "has": "^1.0.3" @@ -2680,9 +2680,9 @@ "dev": true }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -2723,10 +2723,13 @@ "dev": true }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "is-stream": { "version": "2.0.1", @@ -2827,13 +2830,12 @@ "dev": true }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "json-buffer": { @@ -3125,9 +3127,9 @@ "dev": true }, "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.0.tgz", + "integrity": "sha512-QAxkXyzT/TXgwGyY4rTgC95Ex6/lZ5/lYTV9nug6eJt93BCBQGOE47D/g2+/m5J1MrVLr2ot97OXkBZ9bBpR4A==", "requires": { "uc.micro": "^1.0.1" } @@ -3152,9 +3154,9 @@ }, "dependencies": { "chalk": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.0.tgz", - "integrity": "sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", "dev": true }, "mime": { @@ -3292,22 +3294,15 @@ "dev": true }, "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.0.tgz", + "integrity": "sha512-WArlIpVFvVwb8t3wgJuOsbMLhNWlzuQM7H2qXmuUEnBtXRqKjLjwFUMbZOyJgHygVZSjvcLR4EcXcRilqMavrA==", "requires": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - } } }, "markdown-it-external-anchor": { @@ -3316,16 +3311,18 @@ "integrity": "sha512-d6Jb+kLciiv7uueM8q46k6szwr+B8QYg5ppiHVvfaS6hTx1KHpKwYDivmPAcNJYx0wUPEmRre9RgEnM5oHcdMw==" }, "markdown-it-toc-and-anchor": { - "version": "github:macdonst/markdown-it-toc-and-anchor#d4a6b9b21d2d560f4b7b91bdaec9fa23df41edf8", - "from": "github:macdonst/markdown-it-toc-and-anchor", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz", + "integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==", "requires": { - "clone": "^2.1.0" + "clone": "^2.1.0", + "uslug": "^1.0.4" } }, "marked": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", - "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz", + "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==", "dev": true }, "mdast-util-from-markdown": { @@ -3540,9 +3537,9 @@ "dev": true }, "minimatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.1.tgz", - "integrity": "sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -3580,14 +3577,6 @@ "dev": true, "requires": { "minimist": "^1.2.6" - }, - "dependencies": { - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - } } }, "ms": { @@ -4160,13 +4149,14 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, "regexpp": { @@ -4536,9 +4526,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -4691,9 +4681,9 @@ "dev": true }, "spellchecker-cli": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.9.1.tgz", - "integrity": "sha512-znlZFx1u3ZVS8dMdZWLPN2feXxrvP8kZin8Wtxfsq2wRAHKnDRb58TpqXoKEA+YGIpLZy8hboPTr3KZw/wUcTw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-4.10.0.tgz", + "integrity": "sha512-08PNELfqhcFD4NAT3ZpyrRPtVfykEvIylYicvJh8FKKoovunfXdNBqk9wYGc04olSfPPH9qrVUcoDxhUvQ04Xg==", "dev": true, "requires": { "app-root-path": "^3.0.0", @@ -4737,6 +4727,15 @@ "color-convert": "^1.9.0" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -4786,6 +4785,16 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -4842,14 +4851,14 @@ } }, "string.prototype.trim": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz", - "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz", + "integrity": "sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string.prototype.trimend": { @@ -5026,12 +5035,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true } } }, @@ -5214,14 +5217,14 @@ "dev": true }, "tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, @@ -5398,6 +5401,11 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -5462,6 +5470,14 @@ "prepend-http": "^2.0.0" } }, + "uslug": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", + "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=", + "requires": { + "unorm": ">= 1.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index f30d1436..b3922f66 100644 --- a/package.json +++ b/package.json @@ -6,43 +6,50 @@ "url": "https://github.com/architect/arc.codes" }, "license": "Apache-2.0", + "engines": { + "node": ">=14.0.0 <15", + "npm": ">=6.0.0 <7" + }, "scripts": { - "dist": "./scripts/dist.sh", "spellcheck": "npx spellchecker --config ./scripts/spellcheckerrc.json", - "link-checker": "node ./scripts/link-checker.mjs | tap-arc", - "lint": "eslint src --fix", - "start": "sandbox", - "test:unit:frontend": "tape -r esm 'test/frontend/**/*.js' | tap-arc", - "test:unit:backend": "tape 'test/backend/**/*.js' | tap-arc", - "test": "npm run spellcheck && npm run lint && npm run test:unit:frontend && npm run test:unit:backend" + "link-checker": "node ./test/link-checker.mjs | tap-arc", + "lint": "npx eslint src --fix", + "start": "npx arc sandbox", + "tape": "npx tape 'test/**/*-test.mjs' | tap-arc", + "test": "npm run spellcheck && npm run lint && npm run tape" }, "dependencies": { "@architect/asap": "^5.0.1", - "@architect/functions": "^5.0.5", + "@architect/functions": "~5.0.5", "@architect/inventory": "^3.1.0", "@architect/package": "^8.1.0", "@architect/plugin-node-prune": "^2.0.2", "@architect/syntaxes": "github:architect/syntaxes#v1.2.1", - "esm": "^3.2.25", - "highlight.js": "^11.5.1", - "markdown-it": "^12.3.2", - "markdown-it-external-anchor": "^1.0.0", - "markdown-it-toc-and-anchor": "github:macdonst/markdown-it-toc-and-anchor", - "slugify": "^1.6.5", - "tiny-frontmatter": "^1.0.0" + "arcdown": "^0.1.1", + "slugify": "^1.6.5" }, "devDependencies": { - "@architect/architect": "^10.2.2", + "@architect/architect": "^10.3.0", "@architect/eslint-config": "^2.0.1", - "@architect/spellcheck-dictionary": "git+https://github.com/architect/spellcheck-dictionary.git", - "eslint": "^8.13.0", + "@architect/spellcheck-dictionary": "github:architect/spellcheck-dictionary#v0.1.7", + "eslint": "^8.14.0", "linkinator": "^3.0.3", - "spellchecker-cli": "^4.9.1", + "spellchecker-cli": "^4.10.0", "tap-arc": "^0.3.4", "tape": "^5.5.3", "tiny-json-http": "^7.4.2" }, "eslintConfig": { - "extends": "@architect/eslint-config" + "parserOptions": { + "sourceType": "module" + }, + "extends": "@architect/eslint-config", + "rules": { + "import/no-commonjs": "error", + "import/extensions": [ + "error", + "ignorePackages" + ] + } } } diff --git a/prefs.arc b/prefs.arc index e80790a1..9e11c0d8 100644 --- a/prefs.arc +++ b/prefs.arc @@ -1,6 +1,2 @@ -# Just here to ensure grammar dist files are vendored at startup! -@sandbox-startup -./scripts/dist.sh - @sandbox livereload true diff --git a/public/components/arc-tab.js b/public/components/arc-tab.js index 1eb0fb13..b12a523d 100644 --- a/public/components/arc-tab.js +++ b/public/components/arc-tab.js @@ -1,5 +1,7 @@ +/* eslint-env browser */ +// eslint-disable-next-line fp/no-class class ArcTab extends HTMLElement { - constructor() { + constructor () { super() const template = document.createElement('template') this.template = this.template.bind(this) @@ -10,18 +12,18 @@ class ArcTab extends HTMLElement { this.content = this.querySelector('[slot=content]') } - template() { + template () { return ` - + ` } - connectedCallback() { + connectedCallback () { this.updateStyles() } - set active(value) { + set active (value) { const isActive = Boolean(value) if (isActive) { this.setAttribute('active', '') @@ -31,34 +33,34 @@ class ArcTab extends HTMLElement { } } - set label(value) { + set label (value) { this.setAttribute('label', value) } - get label() { + get label () { return this.getAttribute('label') } - get active() { + get active () { return this.hasAttribute('active') } - static get observedAttributes() { + static get observedAttributes () { return [ 'active' ] } - attributeChangedCallback(name, o, n) { - if(name === 'active') { + attributeChangedCallback (name, o, n) { + if (name === 'active') { if (o !== n) { this.updateStyles() } } } - updateStyles() { - if(this.hasAttribute('active')) { + updateStyles () { + if (this.hasAttribute('active')) { this.content.classList.remove('hidden') } else { diff --git a/public/components/arc-viewer.js b/public/components/arc-viewer.js index a24aae51..44c51798 100644 --- a/public/components/arc-viewer.js +++ b/public/components/arc-viewer.js @@ -1,5 +1,7 @@ +/* eslint-env browser */ +// eslint-disable-next-line fp/no-class class ArcViewer extends HTMLElement { - constructor() { + constructor () { super() this.labels = [] this.tabs @@ -18,28 +20,28 @@ class ArcViewer extends HTMLElement { this.createTabBar() } - template() { + template () { return ` ` } - clickHandler(e) { + clickHandler (e) { let target = e.target let label = target.dataset.label - //remove active from all buttons + // remove active from all buttons let btns = this.shadowRoot.querySelectorAll('.arc--tab-btn') btns.forEach(b => b.classList.remove('active')) - //add active to the target btn + // add active to the target btn target.classList.add('active') this.updateTabs(label) } - connectedCallback() { + connectedCallback () { } - createTabBar() { + createTabBar () { let fragment = new DocumentFragment() this.labels.forEach(l => { let btn = document.createElement('button') @@ -70,9 +72,9 @@ class ArcViewer extends HTMLElement { this.shadowRoot.prepend(fragment) } - initTabs(str='') { + initTabs (str = '') { this.tabs = this.getElementsByTagName('arc-tab') - for( let tab of this.tabs ) { + for ( let tab of this.tabs ) { let label = tab.getAttribute('label') if (str === label) { tab.setAttribute('active', '') @@ -81,8 +83,8 @@ class ArcViewer extends HTMLElement { } } - updateTabs(str='') { - for( let tab of this.tabs ) { + updateTabs (str = '') { + for ( let tab of this.tabs ) { let label = tab.label tab.active = str === label } diff --git a/scripts/dist.sh b/scripts/dist.sh deleted file mode 100755 index 9d16082a..00000000 --- a/scripts/dist.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -echo "Copying Architect Highlight.js files & grammars from node_modules to get-docs-000lang-catchall/highlight/..." -mkdir src/http/get-docs-000lang-catchall/highlight &> /dev/null -mkdir src/http/get-docs-000lang-catchall/highlight/languages &> /dev/null -for lang in bash javascript json powershell python ruby yaml -do - cp node_modules/highlight.js/lib/languages/$lang.js src/http/get-docs-000lang-catchall/highlight/languages/ -done -cp node_modules/highlight.js/lib/core.js src/http/get-docs-000lang-catchall/highlight/ -cp node_modules/@architect/syntaxes/arc-hljs-grammar.js src/http/get-docs-000lang-catchall/highlight/languages/arc.js -cp scripts/highlight/index.js src/http/get-docs-000lang-catchall/highlight/ -echo "Done." diff --git a/scripts/highlight/index.js b/scripts/highlight/index.js deleted file mode 100644 index 2f5ca70f..00000000 --- a/scripts/highlight/index.js +++ /dev/null @@ -1,19 +0,0 @@ -var hljs = require('./core') - -// Shells -hljs.registerLanguage('bash', require('./languages/bash')) -hljs.registerLanguage('powershell', require('./languages/powershell')) - -// Languages -hljs.registerLanguage('ruby', require('./languages/ruby')) -hljs.registerLanguage('javascript', require('./languages/javascript')) -hljs.registerLanguage('python', require('./languages/python')) - -// Formats -hljs.registerLanguage('arc', require('./languages/arc')) -hljs.registerLanguage('json', require('./languages/json')) -hljs.registerLanguage('yaml', require('./languages/yaml')) - -hljs.HighlightJS = hljs -hljs.default = hljs -module.exports = hljs diff --git a/src/http/any-catchall/index.js b/src/http/any-catchall/index.js deleted file mode 100644 index 17188649..00000000 --- a/src/http/any-catchall/index.js +++ /dev/null @@ -1,45 +0,0 @@ -// eslint-disable-next-line -require = require('esm')(module) - -const { http } = require('@architect/functions') -const asap = require('@architect/asap') -const { redirect: redirectMiddleware } = require('@architect/shared/redirect-map') -const notFoundResponse = require('@architect/shared/not-found-response') -const toc = require('@architect/views/docs/table-of-contents') -const Html = require('@architect/views/modules/document/html.js').default -const NotFound = require('@architect/views/modules/components/not-found.js').default -const algolia = require('@architect/views/modules/components/algolia.js').default - -// middleware proxy s3 assets -const staticProxy = asap({ - alias: { '/playground': '/playground.html' }, - passthru: true, - spa: false -}) - -function robots (req) { - if (req.path === '/robots.txt') { - let headers = { 'content-type': 'text/plain; charset=utf8' } - let allow = 'User-agent: *\nDisallow: ' - let disallow = 'User-agent: *\nDisallow: /' - if (process.env.ARC_ENV === 'production') return { headers, body: allow } - return { headers, body: disallow } - } -} - -async function notFound (req) { - const term = req.path - - return { - ...notFoundResponse, - body: Html({ - active: term, - children: NotFound({ term }), - scripts: [ '/index.js' ], - thirdparty: algolia, - toc - }) - } -} - -exports.handler = http.async(redirectMiddleware, robots, staticProxy, notFound) diff --git a/src/http/any-catchall/index.mjs b/src/http/any-catchall/index.mjs new file mode 100644 index 00000000..2039c189 --- /dev/null +++ b/src/http/any-catchall/index.mjs @@ -0,0 +1,42 @@ +import arc from '@architect/functions' +import asap from '@architect/asap' +import { redirect as redirectMiddleware } from '@architect/shared/redirect-map.mjs' +import notFoundResponse from '@architect/shared/not-found-response.mjs' +import toc from '@architect/views/docs/table-of-contents.mjs' +import Html from '@architect/views/modules/document/html.mjs' +import NotFound from '@architect/views/modules/components/not-found.mjs' +import algolia from '@architect/views/modules/components/algolia.mjs' + +// middleware proxy s3 assets +const staticProxy = asap({ + alias: { '/playground': '/playground.html' }, + passthru: true, + spa: false +}) + +async function robots (req) { + if (req.path === '/robots.txt') { + const headers = { 'content-type': 'text/plain; charset=utf8' } + const allow = 'User-agent: *\nDisallow: ' + const disallow = 'User-agent: *\nDisallow: /' + if (process.env.ARC_ENV === 'production') return { headers, body: allow } + return { headers, body: disallow } + } +} + +async function notFound (req) { + const term = req.path + + return { + ...notFoundResponse, + body: Html({ + active: term, + html: NotFound({ term }), + scripts: [ '/index.js' ], + thirdparty: algolia, + toc + }) + } +} + +export const handler = arc.http.async(redirectMiddleware, robots, staticProxy, notFound) diff --git a/src/http/get-api-package/index.js b/src/http/get-api-package/index.js deleted file mode 100644 index 5a89a232..00000000 --- a/src/http/get-api-package/index.js +++ /dev/null @@ -1,27 +0,0 @@ -const inventory = require('@architect/inventory') -const pkg = require('@architect/package') - -// serialize ?arc=base64arcfile into cloudformation -exports.handler = async function http (req) { - let statusCode = 200 - let body - - try { - let rawArc = Buffer.from(req.queryStringParameters.arc, 'base64').toString() - let inv = await inventory({ rawArc, deployStage: 'staging' }) - body = JSON.stringify(pkg(inv)) - } - catch (e) { - statusCode = 500 - body = JSON.stringify({ - name: e.name, - message: e.message, - stack: e.stack - }) - } - - return { - statusCode, - body - } -} diff --git a/src/http/get-api-package/index.mjs b/src/http/get-api-package/index.mjs new file mode 100644 index 00000000..98773237 --- /dev/null +++ b/src/http/get-api-package/index.mjs @@ -0,0 +1,26 @@ +import inventory from '@architect/inventory' +import pkg from '@architect/package' + +export async function handler (req) { + let statusCode = 200 + let body + + try { + const rawArc = Buffer.from(req.queryStringParameters.arc, 'base64').toString() + const inv = await inventory({ rawArc, deployStage: 'staging' }) + body = JSON.stringify(pkg(inv)) + } + catch (e) { + statusCode = 500 + body = JSON.stringify({ + name: e.name, + message: e.message, + stack: e.stack + }) + } + + return { + statusCode, + body + } +} diff --git a/src/http/get-docs-000lang-catchall/highlighter.js b/src/http/get-docs-000lang-catchall/highlighter.js deleted file mode 100644 index 77fb212c..00000000 --- a/src/http/get-docs-000lang-catchall/highlighter.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function (hljs, escapeHtml, str, lang) { - if (lang && hljs.getLanguage(lang)) { - try { - return `
    ${hljs.highlight(str, { language: lang, ignoreIllegals: true }).value}
    ` - } - catch (error) { - console.log(`Highlighter unsupported language: ${lang}`) - return '' - } - } - - return `
    ${escapeHtml(str)}
    ` -} diff --git a/src/http/get-docs-000lang-catchall/index.js b/src/http/get-docs-000lang-catchall/index.js deleted file mode 100644 index 4ebdac11..00000000 --- a/src/http/get-docs-000lang-catchall/index.js +++ /dev/null @@ -1,98 +0,0 @@ -// eslint-disable-next-line -require = require('esm')(module) - -const { readFile } = require('fs/promises') -const { join } = require('path') -const { http } = require('@architect/functions') -const render = require('./renderer') -const { redirect: redirectMiddleware } = require('@architect/shared/redirect-map') -const algolia = require('@architect/views/modules/components/algolia.js').default -const Html = require('@architect/views/modules/document/html.js').default -const NotFound = require('@architect/views/modules/components/not-found.js').default -const notFoundResponse = require('@architect/shared/not-found-response') -const toc = require('@architect/views/docs/table-of-contents') - -const cache = {} // cheap warm cache - -async function handler (req) { - let { path, pathParameters } = req - let { lang, proxy } = pathParameters - let parts = proxy.split('/') - let docName = parts.pop() - - if (docName === 'playground') - return { statusCode: 303, headers: { location: '/playground' } } - - let doc = `${docName}.md` - let activePath = join( - 'docs', - lang, - ...parts, - docName - ) - let active = `/${activePath}` // Add leading slash to match anchor href - let editURL = 'https://github.com/architect/arc.codes/edit/main/src/views/docs/' - editURL += join(lang, ...parts, doc) - - let filePath = join( - __dirname, - 'node_modules', - '@architect', - 'views', - 'docs', - lang, - ...parts, - doc - ) - - try { - let body, file - if (cache[filePath]) { - body = cache[filePath] - } - else { - file = await readFile(filePath, 'utf8') - body = cache[filePath] = Html({ - ...render(file), - active, - editURL, - lang, - path, - scripts: [ - '/index.js', - '/components/arc-viewer.js', - '/components/arc-tab.js' - ], - thirdparty: algolia(lang), - toc, - }) - } - - return { - statusCode: 200, - headers: { - 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', - 'content-type': 'text/html; charset=utf8' - }, - body - } - } - catch (error) { - // TODO: Load category "index" landing if available - console.error(error) - return { - ...notFoundResponse, - body: Html({ - active, - children: NotFound({ term: docName, error }), - lang, - scripts: [ '/index.js' ], - state: { notFoundTerm: docName }, - thirdparty: algolia(lang), - toc - }) - } - } -} - -exports.handler = http.async(redirectMiddleware, handler) diff --git a/src/http/get-docs-000lang-catchall/index.mjs b/src/http/get-docs-000lang-catchall/index.mjs new file mode 100644 index 00000000..40efe682 --- /dev/null +++ b/src/http/get-docs-000lang-catchall/index.mjs @@ -0,0 +1,103 @@ +import { readFileSync } from 'fs' +import { join } from 'path' +import arc from '@architect/functions' +import render from 'arcdown' +import { redirect as redirectMiddleware } from '@architect/shared/redirect-map.mjs' +import notFoundResponse from '@architect/shared/not-found-response.mjs' +import algolia from '@architect/views/modules/components/algolia.mjs' +import Html from '@architect/views/modules/document/html.mjs' +import NotFound from '@architect/views/modules/components/not-found.mjs' +import toc from '@architect/views/docs/table-of-contents.mjs' +import classMap from './markdown-class-mappings.mjs' + +const cache = {} // cheap warm cache + +async function handler (req) { + const { path, pathParameters } = req + const { lang, proxy } = pathParameters + const parts = proxy.split('/') + const docName = parts.pop() + + if (docName === 'playground') + return { statusCode: 303, headers: { location: '/playground' } } + + const doc = `${docName}.md` + const activePath = join( + 'docs', + lang, + ...parts, + docName + ) + const active = `/${activePath}` // Add leading slash to match anchor href + let editURL = 'https://github.com/architect/arc.codes/edit/main/src/views/docs/' + editURL += join(lang, ...parts, doc) + + const filePath = join( + new URL('.', import.meta.url).pathname, + 'node_modules', + '@architect', + 'views', + 'docs', + lang, + ...parts, + doc + ) + + try { + let body + + if (cache[filePath]) { + body = cache[filePath] + } + else { + const file = readFileSync(filePath, 'utf8') + const renderOptions = { + hljs: { classString: 'hljs mb0 mb1-lg relative' }, + pluginOverrides: { markdownItClass: classMap }, + } + const result = await render(file, renderOptions) + body = cache[filePath] = Html({ + ...result, + active, + editURL, + lang, + path, + scripts: [ + '/index.js', + '/components/arc-viewer.js', + '/components/arc-tab.js' + ], + thirdparty: algolia(lang), + toc, + }) + } + + return { + statusCode: 200, + headers: { + 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', + 'content-type': 'text/html; charset=utf8' + }, + body + } + } + catch (error) { + // TODO: Load category "index" landing if available + console.error(error) + return { + ...notFoundResponse, + body: Html({ + active, + html: NotFound({ term: docName, error }), + lang, + scripts: [ '/index.js' ], + state: { notFoundTerm: docName }, + thirdparty: algolia(lang), + toc + }) + } + } +} + +const _handler = arc.http.async(redirectMiddleware, handler) +export { _handler as handler } diff --git a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js b/src/http/get-docs-000lang-catchall/markdown-class-mappings.mjs similarity index 98% rename from src/http/get-docs-000lang-catchall/markdown-class-mappings.js rename to src/http/get-docs-000lang-catchall/markdown-class-mappings.mjs index d5c0d7f4..d5b34fe1 100644 --- a/src/http/get-docs-000lang-catchall/markdown-class-mappings.js +++ b/src/http/get-docs-000lang-catchall/markdown-class-mappings.mjs @@ -1,4 +1,4 @@ -module.exports = { +export default { h1: [ 'mb2', 'font-semibold', diff --git a/src/http/get-docs-000lang-catchall/markdown-class.js b/src/http/get-docs-000lang-catchall/markdown-class.js deleted file mode 100644 index 156c6f1a..00000000 --- a/src/http/get-docs-000lang-catchall/markdown-class.js +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2018 Hiroshi Okada - -let mapping = {} - -const splitWithSpace = s => (s ? s.split(' ') : []) - -const toArray = a => (Array.isArray(a) ? a : [ a ]) - -function parseTokens (tokens) { - tokens.forEach(token => { - if (mapping[token.tag] && /(_open$|image)/.test(token.type) || token.type === 'hr') { - const orig = splitWithSpace(token.attrGet('class')) - const addition = toArray(mapping[token.tag]) - token.attrSet('class', [ ...orig, ...addition ].join(' ')) - } - if (token.children) { - parseTokens(token.children) - } - }) -} - - -function parseState (state) { - parseTokens(state.tokens) -} - -function markdownitTagToClass (md, _mapping) { - mapping = _mapping || {} - md.core.ruler.push('markdownit-tag-to-class', parseState) -} - -module.exports = markdownitTagToClass diff --git a/src/http/get-docs-000lang-catchall/renderer.js b/src/http/get-docs-000lang-catchall/renderer.js deleted file mode 100644 index 260bd19f..00000000 --- a/src/http/get-docs-000lang-catchall/renderer.js +++ /dev/null @@ -1,43 +0,0 @@ -const { escape } = require('querystring') -const frontmatter = require('tiny-frontmatter') -const Markdown = require('markdown-it') -const markdownClass = require('./markdown-class') -const markdownExternalAnchor = require('markdown-it-external-anchor') -const markdownToC = require('markdown-it-toc-and-anchor').default - -const classMapping = require('./markdown-class-mappings') -const { escapeHtml } = Markdown().utils -const hljs = require('./highlight') -const highlight = require('./highlighter').bind(null, hljs, escapeHtml) - -// reproduces the slugify algorithm used in markdown-it-external-anchor -const slugify = (s) => escape(String(s).trim().toLowerCase().replace(/\s+/g, '-').replace(/\(\)/g, '')) - -module.exports = function (fileContents) { - let docOutline = '' - const markdown = new Markdown({ - linkify: true, - html: true, - typographer: true, - highlight - }) - .use(markdownClass, classMapping) - .use(markdownExternalAnchor) - .use(markdownToC, { - anchorLink: false, - slugify, - tocClassName: 'pageToC', - tocFirstLevel: 2, - tocLastLevel: 6, - tocCallback: (tocMarkdown, tocArray, tocHtml) => { docOutline = tocHtml } - }) - const { attributes, body } = frontmatter(fileContents) - const children = markdown.render(body) - - return { - ...attributes, - children, - docOutline, - titleSlug: slugify(attributes.title), - } -} diff --git a/src/plugins/spellcheck.js b/src/plugins/spellcheck.js index 4d9b22bc..71a697e4 100644 --- a/src/plugins/spellcheck.js +++ b/src/plugins/spellcheck.js @@ -1,8 +1,9 @@ -let { updater } = require('@architect/utils') -let { spawn } = require('child_process') -let pkg = require('../../package.json') -let cmd = pkg.scripts.spellcheck.split(' ') -let update = updater('Spelling') +/* eslint-disable import/no-commonjs */ +const { updater } = require('@architect/utils') +const { spawn } = require('child_process') +const pkg = require('../../package.json') +const cmd = pkg.scripts.spellcheck.split(' ') +const update = updater('Spelling') module.exports = { sandbox: { @@ -10,11 +11,11 @@ module.exports = { if (!filename.endsWith('.md')) return return new Promise((res) => { update.start('Checking spelling') - let start = Date.now() - let done = () => update.done(`Checked spelling in ${(Date.now() - start) / 1000} seconds`) - let spell = spawn(cmd[0], cmd.slice(1)) + const start = Date.now() + const done = () => update.done(`Checked spelling in ${(Date.now() - start) / 1000} seconds`) + const spell = spawn(cmd[0], cmd.slice(1)) let found = false - let log = data => { + const log = data => { if (!found) { done() update.warn(`Found spelling or grammar error(s):`) diff --git a/src/shared/not-found-response.js b/src/shared/not-found-response.mjs similarity index 91% rename from src/shared/not-found-response.js rename to src/shared/not-found-response.mjs index 7851ae9c..9bf97fce 100644 --- a/src/shared/not-found-response.js +++ b/src/shared/not-found-response.mjs @@ -1,4 +1,4 @@ -module.exports = { +export default { statusCode: 404, headers: { 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', diff --git a/src/shared/redirect-map.js b/src/shared/redirect-map.mjs similarity index 98% rename from src/shared/redirect-map.js rename to src/shared/redirect-map.mjs index dc4655ae..01abab25 100644 --- a/src/shared/redirect-map.js +++ b/src/shared/redirect-map.mjs @@ -1,7 +1,7 @@ -const currentRoot = '/docs/en/get-started/quickstart' +export const currentRoot = '/docs/en/get-started/quickstart' // these are soft redirects, not forever/canonical -const tempRedirects = { +export const tempRedirects = { // tmp until marketing landing page work done '/': currentRoot, @@ -53,7 +53,7 @@ const tempRedirects = { } // redirect known v5/6 arc urls to v8 and then to v9 -const permanentRedirects = { +export const permanentRedirects = { '/examples': '/docs/en/guides/examples', '/docs/en/guides/extend/custom-cloudformation': '/docs/en/guides/developer-experience/customizing-cloudformation', @@ -255,13 +255,13 @@ const permanentRedirects = { '/reference/data-delete': '/docs/en/reference/runtime-helpers/node.js#arc.tables', } -async function redirect (req) { +export async function redirect (req) { const reqPath = req.requestContext.http.path const isGet = req.requestContext.http.method.toLowerCase() === 'get' if (isGet && (tempRedirects[reqPath] || permanentRedirects[reqPath])) { - let env = process.env.ARC_ENV - let url = (stage, path) => `https://${stage}arc.codes${path}` + const env = process.env.ARC_ENV + const url = (stage, path) => `https://${stage}arc.codes${path}` let location = tempRedirects[reqPath] || permanentRedirects[reqPath] if (env === 'staging') location = url('staging.', location) @@ -276,10 +276,3 @@ async function redirect (req) { } return } - -module.exports = { - currentRoot, - tempRedirects, - permanentRedirects, - redirect -} diff --git a/src/views/docs/table-of-contents.js b/src/views/docs/table-of-contents.mjs similarity index 92% rename from src/views/docs/table-of-contents.js rename to src/views/docs/table-of-contents.mjs index 5616d752..6b685157 100644 --- a/src/views/docs/table-of-contents.js +++ b/src/views/docs/table-of-contents.mjs @@ -1,4 +1,4 @@ -let GetStarted = [ +const GetStarted = [ 'Why Architect', 'Quickstart', 'Project manifest', @@ -6,7 +6,7 @@ let GetStarted = [ 'Detailed AWS setup', ] -let Guides = [ +const Guides = [ { 'Developer experience': [ 'Local development', @@ -53,7 +53,7 @@ let Guides = [ 'Examples', ] -let Reference = [ { +const Reference = [ { 'Project manifest': [ '@app', '@aws', @@ -92,7 +92,7 @@ let Reference = [ { ], } ] -let About = [ +const About = [ 'Mission', 'Community', 'Contribute', @@ -101,8 +101,8 @@ let About = [ 'Ejecting from Architect' ] -module.exports = { - 'Get started': GetStarted, +export default { + 'Get Started': GetStarted, Guides, Reference, About, diff --git a/src/views/modules/.eslintrc.js b/src/views/modules/.eslintrc.js deleted file mode 100644 index cc593e88..00000000 --- a/src/views/modules/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -// eslint-disable-next-line -module.exports = { - parserOptions: { - sourceType: 'module' - } -} diff --git a/src/views/modules/components/algolia.js b/src/views/modules/components/algolia.mjs similarity index 100% rename from src/views/modules/components/algolia.js rename to src/views/modules/components/algolia.mjs diff --git a/src/views/modules/components/banner.js b/src/views/modules/components/banner.mjs similarity index 100% rename from src/views/modules/components/banner.js rename to src/views/modules/components/banner.mjs diff --git a/src/views/modules/components/discord-link.js b/src/views/modules/components/discord-link.mjs similarity index 84% rename from src/views/modules/components/discord-link.js rename to src/views/modules/components/discord-link.mjs index e91041c1..e2e8cc14 100644 --- a/src/views/modules/components/discord-link.js +++ b/src/views/modules/components/discord-link.mjs @@ -1,7 +1,7 @@ -import Icon from './icon.js' +import Icon from './icon.mjs' export default function DiscordLink (state = {}) { - let { classes } = state + const { classes } = state return ` ↑ ${title} - ${docOutline.replace(/class="mb1"/g, 'class="list-none"')} + ${tocHtml.replace(/class="mb1"/g, 'class="list-none"')} ` diff --git a/src/views/modules/components/edit-link.js b/src/views/modules/components/edit-link.mjs similarity index 100% rename from src/views/modules/components/edit-link.js rename to src/views/modules/components/edit-link.mjs diff --git a/src/views/modules/components/github-link.js b/src/views/modules/components/github-link.mjs similarity index 85% rename from src/views/modules/components/github-link.js rename to src/views/modules/components/github-link.mjs index 8a36b141..7152d296 100644 --- a/src/views/modules/components/github-link.js +++ b/src/views/modules/components/github-link.mjs @@ -1,7 +1,7 @@ -import Icon from './icon.js' +import Icon from './icon.mjs' export default function GithubLink (state = {}) { - let { classes } = state + const { classes } = state return ` diff --git a/src/views/modules/components/logo.js b/src/views/modules/components/logo.mjs similarity index 99% rename from src/views/modules/components/logo.js rename to src/views/modules/components/logo.mjs index e14a6acd..9eea98a0 100644 --- a/src/views/modules/components/logo.js +++ b/src/views/modules/components/logo.mjs @@ -1,5 +1,5 @@ export default function Logo (props = {}) { - let { classes } = props + const { classes } = props return `
    slugify(part)) .join('/') - let href = `/${uri}` - let isActive = active === href - let activeClass = isActive ? 'active' : '' - let text = isActive ? `→ ${name}` : name + const href = `/${uri}` + const isActive = active === href + const activeClass = isActive ? 'active' : '' + const text = isActive ? `→ ${name}` : name return ` ${text} @@ -55,7 +55,7 @@ function Anchor (state = {}) { } function Heading3 (state = {}) { - let { name } = state + const { name } = state return `

    - ${children} + ${html} ${EditLink({ editURL })}

    diff --git a/src/views/modules/document/script.js b/src/views/modules/document/script.mjs similarity index 89% rename from src/views/modules/document/script.js rename to src/views/modules/document/script.mjs index a41714b8..18eb73f9 100644 --- a/src/views/modules/document/script.js +++ b/src/views/modules/document/script.mjs @@ -2,7 +2,7 @@ import arc from '@architect/functions' export default function Script (props) { props = props || {} - let src = props.src + const src = props.src return src ? ` ` diff --git a/src/views/modules/document/state.js b/src/views/modules/document/state.mjs similarity index 100% rename from src/views/modules/document/state.js rename to src/views/modules/document/state.mjs diff --git a/src/views/modules/document/symbols.js b/src/views/modules/document/symbols.mjs similarity index 100% rename from src/views/modules/document/symbols.js rename to src/views/modules/document/symbols.mjs diff --git a/src/views/modules/document/top-nav.js b/src/views/modules/document/top-nav.mjs similarity index 78% rename from src/views/modules/document/top-nav.js rename to src/views/modules/document/top-nav.mjs index 41753d9c..8a3d6923 100644 --- a/src/views/modules/document/top-nav.js +++ b/src/views/modules/document/top-nav.mjs @@ -1,9 +1,9 @@ -import Logo from '../components/logo.js' -import Icon from '../components/icon.js' -import Search from '../components/search.js' -import GithubLink from '../components/github-link.js' -import DiscordLink from '../components/discord-link.js' -import ThemeButton from '../components/theme-button.js' +import Logo from '../components/logo.mjs' +import Icon from '../components/icon.mjs' +import Search from '../components/search.mjs' +import GithubLink from '../components/github-link.mjs' +import DiscordLink from '../components/discord-link.mjs' +import ThemeButton from '../components/theme-button.mjs' export default function TopNav () { return ` diff --git a/src/views/modules/helpers/capitalize.js b/src/views/modules/helpers/capitalize.mjs similarity index 100% rename from src/views/modules/helpers/capitalize.js rename to src/views/modules/helpers/capitalize.mjs diff --git a/src/views/modules/helpers/list.js b/src/views/modules/helpers/list.mjs similarity index 75% rename from src/views/modules/helpers/list.js rename to src/views/modules/helpers/list.mjs index 8b2691ff..cf2837ca 100644 --- a/src/views/modules/helpers/list.js +++ b/src/views/modules/helpers/list.mjs @@ -1,7 +1,7 @@ export default function listFromObject ({ data = {}, map = {}, path = [], active = null }) { - let depth = 0 - let { list, item } = map - let children = itemsFromObject({ data, list, item, depth, path, active }) + const depth = 0 + const { list, item } = map + const children = itemsFromObject({ data, list, item, depth, path, active }) return list({ children }) @@ -10,7 +10,7 @@ export default function listFromObject ({ data = {}, map = {}, path = [], active function itemsFromObject ({ data = {}, list, item, depth, path, active }) { depth = depth + 1 return Object.keys(data).map(child => { - let children = data[child] + const children = data[child] return item({ child, children: ` @@ -24,8 +24,8 @@ function itemsFromObject ({ data = {}, list, item, depth, path, active }) { } function listFromArray ({ children = [], list, item, depth, path, active }) { - let gi = getItem.bind(null, list, item, depth, path, active) - let kids = children.map(gi).join('') + const gi = getItem.bind(null, list, item, depth, path, active) + const kids = children.map(gi).join('') return list({ children: kids }) } diff --git a/src/views/modules/helpers/slugify.js b/src/views/modules/helpers/slugify.mjs similarity index 100% rename from src/views/modules/helpers/slugify.js rename to src/views/modules/helpers/slugify.mjs diff --git a/test/backend/redirect-map-test.js b/test/backend/redirect-map-test.mjs similarity index 86% rename from test/backend/redirect-map-test.js rename to test/backend/redirect-map-test.mjs index 61c427bd..add7f6de 100644 --- a/test/backend/redirect-map-test.js +++ b/test/backend/redirect-map-test.mjs @@ -1,7 +1,7 @@ -const { stat } = require('fs/promises') -const path = require('path') -const test = require('tape') -const { redirect, tempRedirects, permanentRedirects } = require('../../src/shared/redirect-map') +import { stat } from 'fs/promises' +import { join } from 'path' +import test from 'tape' +import { redirect, tempRedirects, permanentRedirects } from '../../src/shared/redirect-map.mjs' test('redirect map middleware', async t => { t.plan(5) @@ -71,7 +71,7 @@ test('all redirect destinations exist', async t => { for (const destination of destinations) { const filePath = destination.split('#')[0] + '.md' try { - await stat(path.join(__dirname, '../../src/views', filePath)) + await stat(join(new URL('.', import.meta.url).pathname, '../../src/views', filePath)) } catch (error) { t.fail(error) diff --git a/test/backend/renderer-test.js b/test/backend/renderer-test.js deleted file mode 100644 index 53fa57c8..00000000 --- a/test/backend/renderer-test.js +++ /dev/null @@ -1,50 +0,0 @@ -const test = require('tape') -const render = require('../../src/http/get-docs-000lang-catchall/renderer') - -const TITLE = 'Test Doc' -const TITLE_SLUG = 'test-doc' -const CATEGORY = 'Testing' -const DESCRIPTION = 'Make sure we get Markdown' -const file = ` ---- -title: ${TITLE} -category: ${CATEGORY} -description: ${DESCRIPTION} ---- - -> Architect is a simple tool to build and deliver powerful cloud function-based web apps and APIs - -## Create a new project - -\`\`\`arc -@app - -@http -get / -\`\`\` - -## Deploy to AWS - -[AWS is great](https://aws.amazon.com/) - -### $ubsection 2.1? - -## Section 3 -`.trim() - -test('custom Markdown renderer', (t) => { - const result = render(file) - - t.equal(result.title, TITLE, 'title attribute is present') - t.equal(result.category, CATEGORY, 'category attribute is present') - t.equal(result.description, DESCRIPTION, 'description attribute is present') - t.equal(result.titleSlug, TITLE_SLUG, 'titleSlug attribute is generated') - t.ok(typeof result.docOutline === 'string', 'docOutline is a string of HTML') - t.ok(typeof result.children === 'string', 'children is a string of HTML') - t.ok(result.children.indexOf('id="create-a-new-project"') > 0, 'Headings are linkified') - t.ok(result.children.indexOf('id="%24ubsection-2.1%3F"') > 0, 'Complex headings are linkified') - t.ok(result.children.indexOf('target="_blank">AWS is great') > 0, 'External link targets = blank') - t.ok(result.children.indexOf('