From 6491a6bd42aba47f628db2d489f0713ebbe034a1 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 10 Jul 2023 12:26:55 +0900 Subject: [PATCH 001/144] Website v3 using Nextra --- docs/_meta.json | 35 + docs/case-studies.md | 4 +- docs/community.md | 4 +- docs/default/_meta.json | 7 + docs/{runtimes => default}/console.md | 4 +- docs/{web-apps => default}/cron.md | 2 +- docs/{ => default}/first-steps.md | 4 +- docs/{runtimes/http.md => default/index.md} | 2 +- .../website-assets.md} | 6 +- docs/docker.mdx | 117 + docs/environment/custom-domains.md | 2 +- docs/environment/database-planetscale.md | 10 +- docs/environment/logs.md | 2 +- docs/environment/performances.md | 4 +- docs/environment/variables.md | 2 +- docs/frameworks/laravel.md | 443 -- docs/function/handlers.md | 2 +- docs/{README.md => index.md} | 4 +- docs/installation.md | 59 - docs/laravel/_meta.json | 8 + docs/laravel/assets.md | 66 + docs/laravel/caching.mdx | 30 + docs/laravel/file-storage.mdx | 107 + docs/laravel/getting-started.mdx | 86 + docs/laravel/maintenance-mode.mdx | 23 + docs/laravel/octane.md | 44 + docs/laravel/passport.mdx | 55 + docs/laravel/queues.mdx | 66 + ...l-development.md => local-development.mdx} | 125 +- docs/news/README.md | 31 - docs/runtimes/README.md | 6 +- docs/runtimes/function.md | 4 +- docs/setup.mdx | 56 + docs/setup/_meta.json | 5 + .../aws-keys-step-1.png | Bin .../aws-keys-step-2.png | Bin .../aws-keys-step-3.png | Bin .../aws-keys-step-4.png | Bin .../aws-keys-step-5.png | Bin .../aws-keys-step-6.png | Bin docs/{installation => setup}/aws-keys.md | 17 +- docs/symfony/_meta.json | 6 + docs/symfony/assets.mdx | 72 + .../getting-started.mdx} | 150 +- docs/upgrading/v2.md | 2 +- docs/web-apps/docker.md | 107 - website/.gitignore | 1 + website/Makefile | 17 + website/next.config.js | 25 + website/package-lock.json | 6869 ++++++++++++----- website/package.json | 16 +- website/src/pages/_meta.json | 26 + website/src/pages/index.mdx | 3 + .../src/pages}/news/01-bref-1.0.md | 8 +- .../src/pages}/news/01/doc-menu.png | Bin .../src/pages}/news/01/executions.png | Bin .../src/pages}/news/02-bref-2.0.md | 22 +- .../src/pages}/news/02/executions.png | Bin {docs => website/src/pages}/news/02/logo.png | Bin .../src/pages}/news/02/social-card.png | Bin website/template/default.twig | 4 +- website/template/home.twig | 4 +- website/template/news-article.twig | 2 +- website/template/news.twig | 2 +- website/theme.config.jsx | 10 + 65 files changed, 5804 insertions(+), 2984 deletions(-) create mode 100644 docs/_meta.json create mode 100644 docs/default/_meta.json rename docs/{runtimes => default}/console.md (96%) rename docs/{web-apps => default}/cron.md (94%) rename docs/{ => default}/first-steps.md (96%) rename docs/{runtimes/http.md => default/index.md} (99%) rename docs/{websites.md => default/website-assets.md} (96%) create mode 100644 docs/docker.mdx delete mode 100644 docs/frameworks/laravel.md rename docs/{README.md => index.md} (98%) delete mode 100644 docs/installation.md create mode 100644 docs/laravel/_meta.json create mode 100644 docs/laravel/assets.md create mode 100644 docs/laravel/caching.mdx create mode 100644 docs/laravel/file-storage.mdx create mode 100644 docs/laravel/getting-started.mdx create mode 100644 docs/laravel/maintenance-mode.mdx create mode 100644 docs/laravel/octane.md create mode 100644 docs/laravel/passport.mdx create mode 100644 docs/laravel/queues.mdx rename docs/{web-apps/local-development.md => local-development.mdx} (60%) delete mode 100644 docs/news/README.md create mode 100644 docs/setup.mdx create mode 100644 docs/setup/_meta.json rename docs/{installation => setup}/aws-keys-step-1.png (100%) rename docs/{installation => setup}/aws-keys-step-2.png (100%) rename docs/{installation => setup}/aws-keys-step-3.png (100%) rename docs/{installation => setup}/aws-keys-step-4.png (100%) rename docs/{installation => setup}/aws-keys-step-5.png (100%) rename docs/{installation => setup}/aws-keys-step-6.png (100%) rename docs/{installation => setup}/aws-keys.md (82%) create mode 100644 docs/symfony/_meta.json create mode 100644 docs/symfony/assets.mdx rename docs/{frameworks/symfony.md => symfony/getting-started.mdx} (55%) delete mode 100644 docs/web-apps/docker.md create mode 100644 website/.gitignore create mode 100644 website/Makefile create mode 100644 website/next.config.js create mode 100644 website/src/pages/_meta.json create mode 100644 website/src/pages/index.mdx rename {docs => website/src/pages}/news/01-bref-1.0.md (97%) rename {docs => website/src/pages}/news/01/doc-menu.png (100%) rename {docs => website/src/pages}/news/01/executions.png (100%) rename {docs => website/src/pages}/news/02-bref-2.0.md (94%) rename {docs => website/src/pages}/news/02/executions.png (100%) rename {docs => website/src/pages}/news/02/logo.png (100%) rename {docs => website/src/pages}/news/02/social-card.png (100%) create mode 100644 website/theme.config.jsx diff --git a/docs/_meta.json b/docs/_meta.json new file mode 100644 index 000000000..b01c7f77b --- /dev/null +++ b/docs/_meta.json @@ -0,0 +1,35 @@ +{ + "index": "What is Bref and serverless?", + "-- Getting started": { + "type": "separator", + "title": "Getting started" + }, + "setup": "", + "laravel": "Laravel", + "symfony": "Symfony", + "default": "Other frameworks", + "-- Workflow": { + "type": "separator", + "title": "Workflow" + }, + "deploy": "", + "local-development": "", + "monitoring": "", + "docker": "Deploying with Docker", + "-- Learn more": { + "type": "separator", + "title": "Learn more" + }, + "environment": "Environment", + "upgrading": "Upgrading", + "-- Learning": { + "type": "separator", + "title": "Learning" + }, + "course": { + "title": "Course", + "href": "https://serverless-visually-explained.com/?ref=bref-menu" + }, + "case-studies": "", + "community": "" +} \ No newline at end of file diff --git a/docs/case-studies.md b/docs/case-studies.md index 90890eb47..900385fec 100644 --- a/docs/case-studies.md +++ b/docs/case-studies.md @@ -1,9 +1,9 @@ --- -title: Case studies -current_menu: case-studies introduction: A collection of case studies of serverless PHP applications built using Bref. Learn about performance, costs and migrations from existing projects. --- +# Case studies + This page collects case studies of serverless PHP applications built with or migrated to Bref. These help learn for real use cases about costs, performance and migration efforts. diff --git a/docs/community.md b/docs/community.md index da50de736..0ff02c9f7 100644 --- a/docs/community.md +++ b/docs/community.md @@ -1,9 +1,9 @@ --- -title: Community -current_menu: community introduction: A collection of links to places where to discuss and learn about Bref. --- +# Community + To report bugs you can head over to the [GitHub Bref repository](https://github.com/brefphp/bref). For support and general discussions, [open a GitHub discussion](https://github.com/brefphp/bref/discussions). diff --git a/docs/default/_meta.json b/docs/default/_meta.json new file mode 100644 index 000000000..a9eb218b4 --- /dev/null +++ b/docs/default/_meta.json @@ -0,0 +1,7 @@ +{ + "first-steps": "", + "index": "Web apps on AWS Lambda", + "website-assets": "Website assets", + "console": "Console commands", + "cron": "Cron commands", +} \ No newline at end of file diff --git a/docs/runtimes/console.md b/docs/default/console.md similarity index 96% rename from docs/runtimes/console.md rename to docs/default/console.md index ff205ce5a..c36ed084d 100644 --- a/docs/runtimes/console.md +++ b/docs/default/console.md @@ -30,7 +30,7 @@ functions: runtime: php-81-console ``` -Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-81` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](./README.md)). +Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-81` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](../runtimes/README.md)). ## Usage @@ -99,7 +99,7 @@ aws lambda invoke \ The [Bref Dashboard](https://dashboard.bref.sh/?ref=bref) also provides a convenient way to run commands via a terminal: -[![Bref Dashboard terminal for Laravel](./dashboard-terminal.png)](https://dashboard.bref.sh/?ref=bref) +[![Bref Dashboard terminal for Laravel](../runtimes/dashboard-terminal.png)](https://dashboard.bref.sh/?ref=bref) Functions using the "console" runtime are automatically detected, and colors are enabled by default for Laravel Artisan and Symfony Console. diff --git a/docs/web-apps/cron.md b/docs/default/cron.md similarity index 94% rename from docs/web-apps/cron.md rename to docs/default/cron.md index bdbaf2cbe..61dcc6caa 100644 --- a/docs/web-apps/cron.md +++ b/docs/default/cron.md @@ -10,7 +10,7 @@ next: title: Local development for web apps --- -AWS Lambda lets us run [console commands](/docs/runtimes/console.md) as cron tasks using the `schedule` event: +AWS Lambda lets us run [console commands](/docs/web-apps/console.md) as cron tasks using the `schedule` event: ```yaml functions: diff --git a/docs/first-steps.md b/docs/default/first-steps.md similarity index 96% rename from docs/first-steps.md rename to docs/default/first-steps.md index 8290229c2..bdac7d219 100644 --- a/docs/first-steps.md +++ b/docs/default/first-steps.md @@ -12,7 +12,7 @@ next: This guide will help you deploy your first PHP application on AWS Lambda. For simplicity, we will not be using a PHP framework yet. -Before getting started make sure you have [installed Bref and the required tools](installation.md) first. +Before getting started make sure you have [installed Bref and the required tools](../setup.mdx) first. ## Initializing the project @@ -55,7 +55,7 @@ Open this URL and you should see your application: `index.php` is running on Lam 🎉 congrats on creating your first serverless application! -To learn more about deployments, head over the [Deployment guide](deploy.md). +To learn more about deployments, head over the [Deployment guide](../deploy.md). ## What's next? diff --git a/docs/runtimes/http.md b/docs/default/index.md similarity index 99% rename from docs/runtimes/http.md rename to docs/default/index.md index 0258751cf..19e9460d3 100644 --- a/docs/runtimes/http.md +++ b/docs/default/index.md @@ -80,7 +80,7 @@ The simplest API Gateway configuration is to send all incoming requests to our a Lambda and API Gateway are only used for executing code. Serving assets via PHP does not make sense as this would be a waste of resources and money. -Deploying a website and serving assets (e.g. CSS, JavaScript, images) is covered in [the "Website assets" documentation](/docs/websites.md). +Deploying a website and serving assets (e.g. CSS, JavaScript, images) is covered in [the "Website assets" documentation](/docs/web-apps/website-assets.md). In some cases however, you will need to serve images (or other assets) via PHP. One example would be if you served generated images via PHP. In those cases, you need to read the [Binary requests and responses](#binary-requests-and-responses) section below. diff --git a/docs/websites.md b/docs/default/website-assets.md similarity index 96% rename from docs/websites.md rename to docs/default/website-assets.md index dec0c5c90..91da39856 100644 --- a/docs/websites.md +++ b/docs/default/website-assets.md @@ -10,16 +10,16 @@ next: title: Console commands --- -> Before reading this article we assume that you have read [Bref's introduction](/docs/first-steps.md) and that you are familiar with [Bref's HTTP runtime](/docs/runtimes/http.md). +> Before reading this article we assume that you have read [Bref's introduction](/docs/default/first-steps.md) and that you are familiar with [Bref's HTTP runtime](/docs/web-apps/index.md). ## Architectures Websites usually contain 2 parts: -- PHP code, running on [AWS Lambda + API Gateway with the HTTP runtime](/docs/runtimes/http.md) +- PHP code, running on [AWS Lambda + API Gateway with the HTTP runtime](/docs/web-apps/index.md) - static assets (CSS, JS…), [hosted on AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html) -![](websites/cloudfront.svg) +![](../websites/cloudfront.svg) [CloudFront](https://aws.amazon.com/cloudfront/) (the AWS CDN) serves as an HTTP/HTTPS proxy. diff --git a/docs/docker.mdx b/docs/docker.mdx new file mode 100644 index 000000000..401260dfc --- /dev/null +++ b/docs/docker.mdx @@ -0,0 +1,117 @@ +import { Callout } from 'nextra/components'; + +# Deploying with Docker + +By default, Bref deploys to AWS Lambda using zip archives, which Lambda will run in an Amazon Linux environment. This is how AWS Lambda works out of the box, and it works great. + +However, AWS Lambda also supports **deploying and running Docker container images**. + +We recommend Docker **as a last resort**, as it is less practical and usually comes with slightly worse cold starts. Yes, Docker is great and probably sounds familiar, but is often not worth it on Lambda. + +You should consider deploying using Docker when: + +- Your code size is [larger than the 250MB limit when unzipped](environment/storage.md) +- You reached the limit of 5 Lambda layers (e.g. for extra PHP extensions) +- You need custom binaries/resources installed locally (e.g. mysqldump, wkhtmltopdf) + + + This documentation page assumes that you have familiarized yourself with Bref first. + + +## Docker Image + +Bref helps you deploy using Docker images by offering base images that work on AWS Lambda. Here is an example of a Dockerfile you can use: + +```dockerfile filename="Dockerfile" +FROM bref/php-81-fpm:2 + +# Copy the source code in the image +COPY . /var/task + +# Configure the handler file (the entrypoint that receives all HTTP requests) +CMD ["public/index.php"] +``` + +The `CMD` instruction let us specify the entrypoint that will handle all requests. This is the equivalent of the `handler` in the `serverless.yml` file. + + + Always specify the major version of the Bref image you want to use. That avoids breaking changes when a new major version is released. + + For example `bref/php-81-fpm:2` points to Bref v2. + + +Bref offers the following base images: + +- `bref/php-xx-fpm:2`: PHP-FPM to run HTTP applications +- `bref/php-xx-console:2`: to run PHP CLI commands +- `bref/php-xx:2`: to run [PHP functions](../functions/README.md) + +### Extra PHP extensions + +You can enable additional PHP extensions by pulling them from [Bref Extra Extensions](https://github.com/brefphp/extra-php-extensions): + +```dockerfile filename="Dockerfile" {3-4} +FROM bref/php-81-fpm:2 + +COPY --from=bref/extra-redis-php-81:1 /opt /opt +COPY --from=bref/extra-gmp-php-81:1 /opt /opt + +COPY . /var/task + +CMD ["public/index.php"] +``` + + + Like the Bref images, always specify the major version of the Bref Extra Extensions images: `bref/extra-*:1` points to Bref Extra Extensions v1. + + Note that Bref v2 is compatible with Bref Extra Extensions v1 (yes that's confusing, sorry about that, we will fix that in Bref v3 to have matching versions). + + +## Deployment + +The Serverless Framework supports deploying Docker images to Lambda: + +```yml filename="serverless.yml" {5-9,13-14} +service: bref-with-docker + +provider: + name: aws + ecr: + images: + hello-world: + # Path to the `Dockerfile` file + path: ./ + +functions: + hello: + image: + name: hello-world + events: + - httpApi: '*' +``` + +Instead of having a `handler` and a `runtime`, we'll declare an `image`. In the `provider` block, we'll declare the Docker images that we want to build and deploy. + +When running `serverless deploy`, the CLI will: + +- Build the Docker images according to their specified `path` +- Create an AWS ECR repository called `serverless-{service}-{env}` +- Authenticate against your ECR account +- Push the newly built Docker image +- Deploy the Lambda function pointing to the Docker image + +Note that you can create multiple images in the same `serverless.yml` file. For example, you can have one image for the HTTP handler and another image for a worker. + +## Filesystem + +Like with non-Docker deployments, the filesystem for Docker on AWS Lambda is also readonly with a limited disk space under `/tmp` for read/write. + +The `/tmp` folder will always be empty on cold starts. Avoid writing content to `/tmp` in your Dockerfile because that content will **not be available** for your Lambda function. + +[Read more about file storage in Lambda](../environment/storage.md). + +## Docker Registry + +AWS Lambda only support AWS ECR as the source location for Docker images. + +AWS Lambda will use the image digest as the unique identifier. This means that even if you overwrite the exact same tag on ECR, your lambda will still run the previous image code until you actually redeploy using the new image. diff --git a/docs/environment/custom-domains.md b/docs/environment/custom-domains.md index bd41478b8..0e619f0b0 100644 --- a/docs/environment/custom-domains.md +++ b/docs/environment/custom-domains.md @@ -47,7 +47,7 @@ After waiting for the DNS change to propagate (sometimes up to several hours) yo ## Custom domains for static files on S3 -Some applications serve static files hosted on AWS S3. You can read the [Websites](/docs/websites.md) documentation to learn more. +Some applications serve static files hosted on AWS S3. You can read the [Websites](/docs/web-apps/website-assets.md) documentation to learn more. If you want to host a fully static website with HTML files or a Single Page Application (eg. built with Vue, React or Angular) you may be interested in the Static Website construct of the Lift plugin. diff --git a/docs/environment/database-planetscale.md b/docs/environment/database-planetscale.md index ccd0284e4..8fd08eb2f 100644 --- a/docs/environment/database-planetscale.md +++ b/docs/environment/database-planetscale.md @@ -51,7 +51,7 @@ In Bref, the file is located here: `/opt/bref/ssl/cert.pem`. ## Laravel -_This guide assumes you have already set up a Laravel application by following [the Bref documentation for Laravel](../frameworks/laravel.md)._ +_This guide assumes you have already set up a Laravel application by following [the Bref documentation for Laravel](../laravel/getting-started.mdx)._ To configure Laravel to use the PlanetScale database, you need to set it up via environment variables. @@ -102,7 +102,7 @@ That's it! Our database is ready to use. ## Symfony -_This guide assumes you have already set up a Symfony application by following [the Bref documentation for Symfony](../frameworks/symfony.md)._ +_This guide assumes you have already set up a Symfony application by following [the Bref documentation for Symfony](../symfony/getting-started.mdx)._ First, make sure you have installed Doctrine, or [follow these docs to do so](https://symfony.com/doc/current/doctrine.html#installing-doctrine). @@ -220,7 +220,7 @@ If the production branch has the "Safe Migrations" feature **disabled**, you can This strategy implies either: -- accepting downtime on deployment, for example by using [Laravel's maintenance mode](../frameworks/laravel.md#maintenance-mode) (put the app offline, deploy, run migrations, then put the app back online) +- accepting downtime on deployment, for example by using [Laravel's maintenance mode](../laravel/getting-started.mdx#maintenance-mode) (put the app offline, deploy, run migrations, then put the app back online) - or always writing backward-compatible DB migrations This option works well for applications with low traffic or in early development. For high-traffic applications, using "Safe Migrations" is recommended instead. @@ -293,8 +293,8 @@ Now that the environments are set up, you can apply the following workflow for D 1. Deploy your code changes and migrations in the development stage. 1. Apply DB migrations in the **development** environment (drop a column, add a table, etc.): - - If you use Laravel, run DB migrations [via the `artisan` function](../frameworks/laravel.md#laravel-artisan): `serverless bref:cli --stage=dev --args="migrate"` - - If you use Symfony, run DB migrations [via the `console` function](../frameworks/symfony.md#console): `serverless bref:cli --stage=dev --args="doctrine:migrations:migrate"` + - If you use Laravel, run DB migrations [via the `artisan` function](../laravel/getting-started.mdx#laravel-artisan): `serverless bref:cli --stage=dev --args="migrate"` + - If you use Symfony, run DB migrations [via the `console` function](../symfony/getting-started.mdx#console): `serverless bref:cli --stage=dev --args="doctrine:migrations:migrate"` - If you don't use any framework, run DB queries [via the `pscale` CLI](https://planetscale.com/docs/reference/planetscale-cli). 1. Test changes in the development environment to make sure everything works correctly. 1. Create a deploy request. diff --git a/docs/environment/logs.md b/docs/environment/logs.md index cae2783dd..99d95e69a 100644 --- a/docs/environment/logs.md +++ b/docs/environment/logs.md @@ -26,7 +26,7 @@ That means that you don't have to configure anything to log errors, warnings or Your application can write logs to CloudWatch: -- [Bref for web apps](/docs/runtimes/http.md): write logs to `stderr` +- [Bref for web apps](/docs/web-apps/index.md): write logs to `stderr` - [Bref for event-driven functions](/docs/runtimes/function.md): write logs to `stdout` (using `echo` for example) or `stderr` For example with [Monolog](https://github.com/Seldaek/monolog): diff --git a/docs/environment/performances.md b/docs/environment/performances.md index c23204e9e..a829bb679 100644 --- a/docs/environment/performances.md +++ b/docs/environment/performances.md @@ -49,7 +49,7 @@ In general, **use smaller and slower lambdas only when speed is not important at ### Bref for web apps -The [FPM runtime for web apps](/docs/runtimes/http.md) **does not add overhead to response times**. +The [FPM runtime for web apps](/docs/web-apps/index.md) **does not add overhead to response times**. Here are execution times for an empty PHP application: @@ -104,7 +104,7 @@ On a website with low to medium traffic, you can expect cold starts to happen fo ### Optimizing cold starts -On small websites, cold starts can be avoided by pinging the application regularly. This keeps the lambda instances warm. [Pingdom](https://www.pingdom.com/) or similar services can be used, but you can also [an automatic ping via `serverless.yml`](/docs/runtimes/http.md#cold-starts). +On small websites, cold starts can be avoided by pinging the application regularly. This keeps the lambda instances warm. [Pingdom](https://www.pingdom.com/) or similar services can be used, but you can also [an automatic ping via `serverless.yml`](/docs/web-apps/index.md#cold-starts). While the memory size has no impact, the codebase size can increase the cold start duration. When deploying, remember to exclude assets, images, tests and any extra file in `serverless.yml`: diff --git a/docs/environment/variables.md b/docs/environment/variables.md index 19ed4d31a..a4090296b 100644 --- a/docs/environment/variables.md +++ b/docs/environment/variables.md @@ -138,7 +138,7 @@ SSM is good enough for most projects. ## Local development -When [developing locally using `serverless bref:local`](/docs/local-development.md), you can set environment variables using bash: +When [developing locally using `serverless bref:local`](/docs/local-development.mdx), you can set environment variables using bash: ```bash VAR1=val1 VAR2=val2 serverless bref:local -f diff --git a/docs/frameworks/laravel.md b/docs/frameworks/laravel.md deleted file mode 100644 index df3a30b6a..000000000 --- a/docs/frameworks/laravel.md +++ /dev/null @@ -1,443 +0,0 @@ ---- -title: Serverless Laravel applications -current_menu: laravel -introduction: Learn how to deploy serverless Laravel applications on AWS Lambda using Bref. ---- - -This guide helps you run Laravel applications on AWS Lambda using Bref. These instructions are kept up to date to target the latest Laravel version. - -A demo application is available on GitHub at [github.com/brefphp/examples](https://github.com/brefphp/examples). - -## Setup - -First, make sure you have followed the [Installation guide](../installation.md) to create an AWS account and install the necessary tools. - -Next, in an existing Laravel project, install Bref and the [Laravel-Bref package](https://github.com/brefphp/laravel-bridge). - -``` -composer require bref/bref bref/laravel-bridge --update-with-dependencies -``` - -Then let's create a [`serverless.yml` configuration file](https://bref.sh/docs/environment/serverless-yml.html): - -``` -php artisan vendor:publish --tag=serverless-config -``` - -### How it works - -By default, the Laravel-Bref package will automatically configure Laravel to work on AWS Lambda. - -If you are curious, the package will automatically: - -- enable the `stderr` log driver, to send logs to CloudWatch ([read more about logs](../environment/logs.md)) -- enable the [`cookie` session driver](https://laravel.com/docs/session#configuration) (if you prefer, you can configure sessions to be stored in database, DynamoDB or Redis) -- move the storage directory to `/tmp` (because the default storage directory is read-only on Lambda) -- adjust a few more settings ([have a look at the `BrefServiceProvider` for details](https://github.com/brefphp/laravel-bridge/blob/master/src/BrefServiceProvider.php)) - -## Deployment - -We do not want to deploy "dev" caches that were generated on our machine (because paths will be different on AWS Lambda). Let's clear them before deploying: - -```bash -php artisan config:clear -``` - -When running in AWS Lambda, the Laravel application will automatically cache its configuration when booting. You don't need to run `php artisan config:cache` before deploying. - -Let's deploy now: - -```bash -serverless deploy -``` - -When finished, the `deploy` command will show the URL of the application. - -### Deploying for production - -At the moment, we deployed our local installation to Lambda. When deploying for production, we probably don't want to deploy: - -- development dependencies, -- our local `.env` file, -- or any other dev artifact. - -Follow [the deployment guide](/docs/deploy.md#deploying-for-production) for more details. - -## Troubleshooting - -In case your application is showing a blank page after being deployed, [have a look at the logs](../environment/logs.md). - -## Laravel Artisan - -As you may have noticed, we define a function named "artisan" in `serverless.yml`. That function is using the [Console runtime](/docs/runtimes/console.md), which lets us run Laravel Artisan on AWS Lambda. - -For example, to execute an `artisan` command on Lambda for the above configuration, run the below command. - -```sh -serverless bref:cli --args="" -``` - -For more details follow [the "Console" guide](/docs/runtimes/console.md). - -## Assets - -To deploy Laravel websites, assets need to be served from AWS S3. The easiest approach is to use the [Server-side website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). - -This will deploy a Cloudfront distribution that will act as a proxy: it will serve static files directly from S3 and will forward everything else to Lambda. This is very close to how traditional web servers like Apache or Nginx work, which means your application doesn't need to change! For more details, read [the official documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md#how-it-works). - -First install the plugin: - -```bash -serverless plugin install -n serverless-lift -``` - -Then add this configuration to your `serverless.yml` file: - -```yaml -service: laravel -provider: - # ... - -functions: - # ... - -plugins: - - ./vendor/bref/bref - - serverless-lift - -constructs: - website: - type: server-side-website - assets: - '/js/*': public/js - '/css/*': public/css - '/favicon.ico': public/favicon.ico - '/robots.txt': public/robots.txt - # add here any file or directory that needs to be served from S3 -``` - -Before deploying, compile your assets: - -```bash -npm run prod -``` - -Now deploy your website using `serverless deploy`. Lift will create all required resources and take care of -uploading your assets to S3 automatically. - -For more details, see the [Websites section](/docs/websites.md) of this documentation and the official [Lift documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). - -### Assets in templates - -Assets referenced in templates should be via the `asset()` helper: - -```html - -``` - -If your templates reference some assets via direct path, you should edit them to use the `asset()` helper: - -```html -- -+ -``` - -## File storage on S3 - -Laravel has a [filesystem abstraction](https://laravel.com/docs/filesystem) that lets us easily change where files are stored. When running on Lambda, you will need to use the `s3` adapter to store files on AWS S3. - -To do this, set `FILESYSTEM_DISK: s3` either in `serverless.yml` or your production `.env` file. We can also create an S3 bucket via `serverless.yml` directly: - -```yaml -# ... -provider: - # ... - environment: - # environment variable for Laravel - FILESYSTEM_DISK: s3 - AWS_BUCKET: !Ref Storage - iam: - role: - statements: - # Allow Lambda to read and write files in the S3 buckets - - Effect: Allow - Action: s3:* - Resource: - - !Sub '${Storage.Arn}' # the storage bucket - - !Sub '${Storage.Arn}/*' # and everything inside - -resources: - Resources: - # Create our S3 storage bucket using CloudFormation - Storage: - Type: AWS::S3::Bucket -``` - -That's it! The AWS credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN) are set automatically in AWS Lambda, you don't have to define them. - -### Public files - -Laravel has a [special disk called `public`](https://laravel.com/docs/filesystem#the-public-disk): this disk stores files that we want to make public, like uploaded photos, generated PDF files, etc. - -Again, those files cannot be stored on Lambda, i.e. they cannot be stored in the default `storage/app/public` directory. You need to store those files on S3. - -> Do not run `php artisan storage:link` in AWS Lambda: it is now useless, and it will fail because the filesystem is read-only in Lambda. - -To store public files on S3, you could replace the disk in the code: - -```diff -- Storage::disk('public')->put('avatars/1', $fileContents); -+ Storage::disk('s3')->put('avatars/1', $fileContents); -``` - -but doing this will not let your application work locally. A better solution, but more complex, involves making the `public` disk configurable. Let's change the configuration in `config/filesystems.php`: - -```diff - /* - |-------------------------------------------------------------------------- - | Default Public Filesystem Disk - |-------------------------------------------------------------------------- - */ - -+ 'public' => env('FILESYSTEM_DISK', 'public_local'), - - ... - - 'disks' => [ - - 'local' => [ - 'driver' => 'local', - 'root' => storage_path('app'), - ], - -- 'public' => [ -+ 'public_local' => [ - 'driver' => 'local', - 'root' => storage_path('app/public'), - 'url' => env('APP_URL').'/storage', - 'visibility' => 'public', - ], - - 's3' => [ - 'driver' => 's3', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'token' => env('AWS_SESSION_TOKEN'), - 'region' => env('AWS_DEFAULT_REGION'), - 'bucket' => env('AWS_BUCKET'), - 'url' => env('AWS_URL'), - ], - -+ 's3_public' => [ -+ 'driver' => 's3', -+ 'key' => env('AWS_ACCESS_KEY_ID'), -+ 'secret' => env('AWS_SECRET_ACCESS_KEY'), -+ 'token' => env('AWS_SESSION_TOKEN'), -+ 'region' => env('AWS_DEFAULT_REGION'), -+ 'bucket' => env('AWS_PUBLIC_BUCKET'), -+ 'url' => env('AWS_URL'), -+ ], - - ], -``` - -You can now configure the `public` disk to use S3 by changing `serverless.yml` or your production `.env`: - -```dotenv -FILESYSTEM_DISK=s3 -FILESYSTEM_DISK_PUBLIC=s3 -``` - -## Laravel Queues - -To run Laravel Queues on AWS Lambda using [Amazon SQS](https://aws.amazon.com/sqs/), we don't want to run the `php artisan queue:work` command. Instead, we create a function that is invoked immediately when there are new jobs to process. - -To create the SQS queue (and the permissions for the Lambda functions to read/write to it), we can either do that manually, or use `serverless.yml`. - -To make things simpler, we will use the [Serverless Lift](https://github.com/getlift/lift) plugin to create and configure the SQS queue. - -First install the Lift plugin: - -```bash -serverless plugin install -n serverless-lift -``` - -Then use the Queue construct in `serverless.yml`: - -```yml -provider: - # ... - environment: - # ... - QUEUE_CONNECTION: sqs - SQS_QUEUE: ${construct:jobs.queueUrl} - -functions: - # ... - -constructs: - jobs: - type: queue - worker: - handler: Bref\LaravelBridge\Queue\QueueHandler - runtime: php-81 - timeout: 60 # seconds -``` - -We define Laravel environment variables in `provider.environment` (this could also be done in the deployed `.env` file): - -- `QUEUE_CONNECTION: sqs` enables the SQS queue connection -- `SQS_QUEUE: ${construct:jobs.queueUrl}` passes the URL of the created SQS queue - -If you want to create the SQS queue manually, you will need to set these variables. AWS credentials (`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`) are automatically set up with the appropriate permissions for Laravel to use the SQS queue. - -That's it! Anytime a job is pushed to Laravel Queues, it will be sent to SQS, and SQS will invoke our "worker" function so that it is processed. - -> **Note**: -> -> In the example above, we set the full SQS queue URL in the `SQS_QUEUE` variable. -> -If you only set the queue name (which is also valid), you need to set the `SQS_PREFIX` environment variable too. For example: `SQS_PREFIX: "https://sqs.${aws:region}.amazonaws.com/${aws:accountId}"`. - -### How it works - -When integrated with AWS Lambda, SQS has a built-in retry mechanism and storage for failed messages. These features work slightly differently than Laravel Queues. The "Bref for Laravel" integration does **not** use these SQS features. - -Instead, "Bref for Laravel" makes all the feature of Laravel Queues work out of the box, just like on any server. Read more in [the Laravel Queues documentation](https://laravel.com/docs/latest/queues). - -> **Note:** the "Bref-Laravel bridge" v1 used to do the opposite. We changed that behavior in Bref v2 in order to make the experience smoother for Laravel users. - -## Laravel Octane - -To run the HTTP application with [Laravel Octane](https://laravel.com/docs/10.x/octane) instead of PHP-FPM, change the following options in the `web` function: - -```yml -functions: - web: - handler: Bref\LaravelBridge\Http\OctaneHandler - runtime: php-81 - environment: - BREF_LOOP_MAX: 250 - # ... -``` - -Keep the following details in mind: - -- Laravel Octane does not need Swoole or RoadRunner on AWS Lambda, so it is not possible to use Swoole-specific features. -- Octane keeps Laravel booted in a long-running process, [beware of memory leaks](https://laravel.com/docs/10.x/octane#managing-memory-leaks). -- `BREF_LOOP_MAX` specifies the number of HTTP requests handled before the PHP process is restarted (and the memory is cleared). - -### Persistent database connections - -You can keep database connections persistent across requests to make your application even faster. To do so, set the `OCTANE_PERSIST_DATABASE_SESSIONS` environment variable: - -```yml -functions: - web: - handler: Bref\LaravelBridge\Http\OctaneHandler - runtime: php-81 - environment: - BREF_LOOP_MAX: 250 - OCTANE_PERSIST_DATABASE_SESSIONS: 1 - # ... -``` - -Note that if you are using PostgreSQL (9.6 or newer), you need to set [`idle_in_transaction_session_timeout`](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-IDLE-IN-TRANSACTION-SESSION-TIMEOUT) either in your RDS database's parameter group, or on a specific database itself. - -```sql -ALTER DATABASE SET idle_in_transaction_session_timeout = '10000' -- 10 seconds in ms -``` - -## Caching - -By default, the Bref bridge will move Laravel's storage and cache directories to `/tmp`. This is because all the filesystem except `/tmp` is read-only. - -Note that the `/tmp` directory isn't shared across Lambda instances. If you Lambda function scales up, the cache will be empty in new instances (or after a deployment). - -If you want the cache to be shared across all Lambda instances, for example if your application caches a lot of data or if you use it for locking mechanisms (like API rate limiting), you can instead use Redis or DynamoDB. - -DynamoDB is the easiest to set up and is "pay per use". Redis is a bit more complex as it requires a VPC and managing instances, but offers slightly faster response times. - -### Using DynamoDB - -To use DynamoDB as a cache store, change this configuration in `config/cache.php`: - -```diff - # config/cache.php - 'dynamodb' => [ - 'driver' => 'dynamodb', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), - 'endpoint' => env('DYNAMODB_ENDPOINT'), -+ 'attributes' => [ -+ 'key' => 'id', -+ 'expiration' => 'ttl', -+ ] - ], -``` - -Then follow [this section of the documentation](/docs/environment/storage.md#deploying-dynamodb-tables) to deploy your DynamoDB table using the Serverless Framework. - -## Maintenance mode - -Similar to the `php artisan down` command, you may put your app into maintenance mode. All that's required is setting the `MAINTENANCE_MODE` environment variable: - -```yml -provider: - environment: - MAINTENANCE_MODE: ${param:maintenance, null} -``` - -You can then deploy: - -```bash -# Full deployment (goes through CloudFormation): -serverless deploy --param="maintenance=1" - -# Or quick update of the functions config only: -serverless deploy function --function=web --update-config --param="maintenance=1" -serverless deploy function --function=artisan --update-config --param="maintenance=1" -serverless deploy function --function= --update-config --param="maintenance=1" -``` - -To take your app out of maintenance mode, redeploy without the `--param="maintenance=1"` option. - -## Laravel Passport - -Laravel Passport has a `passport:install` command. However, this command cannot be run in Lambda because it needs to write files to the `storage/` directory. - -Instead, here is what you need to do: - -- Run `php artisan passport:keys` locally to generate key files. - - This command will generate the `storage/oauth-private.key` and `storage/oauth-public.key` files, which need to be deployed. - - Depending on how you deploy your application (from your machine, or from CI), you may want to whitelist them in `serverless.yml`: - - ```yaml - package: - patterns: - - ... - # Exclude the 'storage' directory - - '!storage/**' - # Except the public and private keys required by Laravel Passport - - 'storage/oauth-private.key' - - 'storage/oauth-public.key' - ``` - -- You can now deploy the application: - - ```yaml - serverless deploy - ``` - -- Finally, you can create the tokens (which is the second part of the `passport:install` command): - - ```bash - serverless bref:cli --args="passport:client --personal --name 'Laravel Personal Access Client'" - serverless bref:cli --args="passport:client --password --name 'Laravel Personal Access Client'" - ``` - -All these steps were replacements of running the `passport:install` command [from the Passport documentation](https://laravel.com/docs/passport#installation). diff --git a/docs/function/handlers.md b/docs/function/handlers.md index 891c4168e..f53aece15 100644 --- a/docs/function/handlers.md +++ b/docs/function/handlers.md @@ -191,7 +191,7 @@ Read more: ## API Gateway HTTP events -**Reminder:** to create HTTP applications, it is possible to use the more traditional "[Bref for web apps](/docs/runtimes/http.md)" runtime, which runs with PHP-FPM. +**Reminder:** to create HTTP applications, it is possible to use the more traditional "[Bref for web apps](/docs/web-apps/index.md)" runtime, which runs with PHP-FPM. That being said, it is possible to handle HTTP events from API Gateway with a simple PHP class, like other handlers detailed in this page. diff --git a/docs/README.md b/docs/index.md similarity index 98% rename from docs/README.md rename to docs/index.md index 31e20fa59..691d35453 100644 --- a/docs/README.md +++ b/docs/index.md @@ -175,7 +175,7 @@ This matrix will be updated as Bref and AWS services evolve over time. - **Website** - Websites can run on AWS Lambda. Assets can be stored in S3 and served via Cloudfront. This is documented in the ["Websites" documentation](/docs/websites.md). Performance is as good as any server. + Websites can run on AWS Lambda. Assets can be stored in S3 and served via Cloudfront. This is documented in the ["Websites" documentation](/docs/web-apps/website-assets.md). Performance is as good as any server. - **Legacy application** @@ -185,4 +185,4 @@ This matrix will be updated as Bref and AWS services evolve over time. ## Getting started -Get started with Bref by reading the [installation documentation](installation.md). +Get started with Bref by reading the [installation documentation](setup.mdx). diff --git a/docs/installation.md b/docs/installation.md deleted file mode 100644 index 4c6d02096..000000000 --- a/docs/installation.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Installation -current_menu: installation -introduction: How to install Bref and the required tools. -previous: - link: /docs/ - title: What is Bref and serverless? -next: - link: /docs/first-steps.html - title: First steps ---- - -To set up Bref correctly please complete all the sections below. - -## AWS account - -You will need an AWS account. To create one, go to [aws.amazon.com](https://aws.amazon.com/) and click *Sign up*. - -AWS has a generous free tier that will usually allow you to deploy your first test applications for free. - -## Serverless - -Bref relies on the [Serverless framework](https://serverless.com/) and AWS access keys to deploy applications. You will need to: - -- install the `serverless` command ([more details here](https://serverless.com/framework/docs/providers/aws/guide/quick-start/)): - - ```bash - npm install -g serverless - ``` - - _Bref is compatible with Serverless Framework v3 (current version)._ - -- [create AWS access keys](/docs/installation/aws-keys.md) - -- setup those keys by running: - - ```bash - serverless config credentials --provider aws --key --secret - ``` - - If you already use the `aws` CLI command, or if you want to use environment variables instead (for example for a shared server like a CI) you can [read the full guide](https://serverless.com/framework/docs/providers/aws/guide/credentials#using-aws-access-keys). - -## Bref - -Install Bref in your project using [Composer](https://getcomposer.org/): - -``` -composer require bref/bref -``` - -> Make sure that the version of Bref that was installed is 2.0 or greater. - -> To run the latest version of Bref you must have PHP 8.0 or greater! If you are using PHP 7.4 or less, an outdated version of Bref will be installed instead. - -The `bref` command line tool can now be used by running `vendor/bin/bref` in your project. - -## What's next? - -Read the [first steps](/docs/first-steps.md) guide to create and deploy your first serverless application using Bref. diff --git a/docs/laravel/_meta.json b/docs/laravel/_meta.json new file mode 100644 index 000000000..f7e6f1f77 --- /dev/null +++ b/docs/laravel/_meta.json @@ -0,0 +1,8 @@ +{ + "getting-started": "Getting started", + "assets": "Assets", + "file-storage": "", + "queues": "Laravel Queues", + "octane": "Laravel Octane", + "passport": "Laravel Passport" +} \ No newline at end of file diff --git a/docs/laravel/assets.md b/docs/laravel/assets.md new file mode 100644 index 000000000..190e46e61 --- /dev/null +++ b/docs/laravel/assets.md @@ -0,0 +1,66 @@ +--- +introduction: Deploy assets for serverless Laravel applications on AWS Lambda using Bref. +--- + +# Assets + +To deploy Laravel websites, assets need to be served from AWS S3. The easiest approach is to use the [Server-side website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). + +This will deploy a CloudFront distribution (CDN) that will act as a proxy: it will serve static files directly from S3 and will forward everything else to Lambda. This is very close to how traditional web servers like Apache or Nginx work, which means your application doesn't need to change! For more details, read [the official documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md#how-it-works). + +First install the plugin: + +```bash +serverless plugin install -n serverless-lift +``` + +Then add this configuration to your `serverless.yml` file: + +```yml filename="serverless.yml" {10,12-20} +service: laravel +provider: + # ... + +functions: + # ... + +plugins: + - ./vendor/bref/bref + - serverless-lift + +constructs: + website: + type: server-side-website + assets: + '/js/*': public/js + '/css/*': public/css + '/favicon.ico': public/favicon.ico + '/robots.txt': public/robots.txt + # add here any file or directory that needs to be served from S3 +``` + +Before deploying, compile your assets: + +```bash +npm run prod +``` + +Now deploy your website using `serverless deploy`. Lift will create all required resources and take care of uploading your assets to S3 automatically. + +TODO +For more details, see the [Websites section](../web-apps/website-assets.md) of this documentation and the official [Lift documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). + +### Assets in templates + +Assets referenced in templates should be via the `asset()` helper: + +```html + +``` + +If your templates reference some assets via direct path, you should edit them to use the `asset()` helper: + +```html +- ++ +``` diff --git a/docs/laravel/caching.mdx b/docs/laravel/caching.mdx new file mode 100644 index 000000000..b0cadf472 --- /dev/null +++ b/docs/laravel/caching.mdx @@ -0,0 +1,30 @@ +# Caching + +By default, the Bref bridge will move Laravel's storage and cache directories to `/tmp`. This is because all the filesystem except `/tmp` is read-only. + +Note that the `/tmp` directory isn't shared across Lambda instances. If you Lambda function scales up, the cache will be empty in new instances (or after a deployment). + +If you want the cache to be shared across all Lambda instances, for example if your application caches a lot of data or if you use it for locking mechanisms (like API rate limiting), you can instead use Redis or DynamoDB. + +DynamoDB is the easiest to set up and is "pay per use". Redis is a bit more complex as it requires a VPC and managing instances, but offers slightly faster response times. + +## DynamoDB Cache + +To use DynamoDB as a cache store, set the following lines in `config/cache.php`: + +```yml filename="config/cache.php" {8-11} + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + 'attributes' => [ + 'key' => 'id', + 'expiration' => 'ttl', + ] + ], +``` + +Then follow [this section of the documentation](/docs/environment/storage.md#deploying-dynamodb-tables) to deploy your DynamoDB table using the Serverless Framework. diff --git a/docs/laravel/file-storage.mdx b/docs/laravel/file-storage.mdx new file mode 100644 index 000000000..f519c3d68 --- /dev/null +++ b/docs/laravel/file-storage.mdx @@ -0,0 +1,107 @@ +# File storage + +Laravel has a [filesystem abstraction](https://laravel.com/docs/filesystem) that lets us easily change where files are stored. + +When running on Lambda, you will need to use the **`s3` adapter** to store files on AWS S3. + +To do this, set `FILESYSTEM_DISK: s3` either in `serverless.yml` or your production `.env` file. We can also create an S3 bucket via `serverless.yml` directly: + +```yaml filename="serverless.yml" +# ... +provider: + # ... + environment: + # environment variable for Laravel + FILESYSTEM_DISK: s3 + AWS_BUCKET: !Ref Storage + iam: + role: + statements: + # Allow Lambda to read and write files in the S3 buckets + - Effect: Allow + Action: s3:* + Resource: + - !Sub '${Storage.Arn}' # the storage bucket + - !Sub '${Storage.Arn}/*' # and everything inside + +resources: + Resources: + # Create our S3 storage bucket using CloudFormation + Storage: + Type: AWS::S3::Bucket +``` + +That's it! The AWS credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN) are set automatically in AWS Lambda, you don't have to define them. + +### Public files + +Laravel has a [special disk called `public`](https://laravel.com/docs/filesystem#the-public-disk): this disk stores files that we want to make public, like uploaded photos, generated PDF files, etc. + +Again, those files cannot be stored on Lambda, i.e. they cannot be stored in the default `storage/app/public` directory. You need to store those files on S3. + +> Do not run `php artisan storage:link` in AWS Lambda: it is now useless, and it will fail because the filesystem is read-only in Lambda. + +To store public files on S3, you could replace the disk in the code: + +```diff +- Storage::disk('public')->put('avatars/1', $fileContents); ++ Storage::disk('s3')->put('avatars/1', $fileContents); +``` + +but doing this will not let your application work locally. A better solution, but more complex, involves making the `public` disk configurable. Let's change the configuration in `config/filesystems.php`: + +```diff + /* + |-------------------------------------------------------------------------- + | Default Public Filesystem Disk + |-------------------------------------------------------------------------- + */ + ++ 'public' => env('FILESYSTEM_DISK', 'public_local'), + + ... + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + +- 'public' => [ ++ 'public_local' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'token' => env('AWS_SESSION_TOKEN'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + ], + ++ 's3_public' => [ ++ 'driver' => 's3', ++ 'key' => env('AWS_ACCESS_KEY_ID'), ++ 'secret' => env('AWS_SECRET_ACCESS_KEY'), ++ 'token' => env('AWS_SESSION_TOKEN'), ++ 'region' => env('AWS_DEFAULT_REGION'), ++ 'bucket' => env('AWS_PUBLIC_BUCKET'), ++ 'url' => env('AWS_URL'), ++ ], + + ], +``` + +You can now configure the `public` disk to use S3 by changing `serverless.yml` or your production `.env`: + +```dotenv +FILESYSTEM_DISK=s3 +FILESYSTEM_DISK_PUBLIC=s3 +``` diff --git a/docs/laravel/getting-started.mdx b/docs/laravel/getting-started.mdx new file mode 100644 index 000000000..9c62f5141 --- /dev/null +++ b/docs/laravel/getting-started.mdx @@ -0,0 +1,86 @@ +import { Callout } from 'nextra/components'; + +export const introduction = 'Run Laravel serverless on AWS Lambda using Bref.'; + +# Serverless Laravel - Getting started + +This guide helps you run Laravel applications on AWS Lambda using Bref. These instructions are kept up to date to target the latest Laravel version. + + + A demo application is available on GitHub at [github.com/brefphp/examples](https://github.com/brefphp/examples). + + +## Setup + +First, **follow the [Setup guide](../setup.md)** to create an AWS account and install the necessary tools. + +Next, in an existing Laravel project, install Bref and the [Laravel-Bref package](https://github.com/brefphp/laravel-bridge). + +```bash +composer require bref/bref bref/laravel-bridge --update-with-dependencies +``` + +Then let's create a [`serverless.yml` configuration file](https://bref.sh/docs/environment/serverless-yml.html): + +```bash +php artisan vendor:publish --tag=serverless-config +``` + +### How it works + +By default, the Laravel-Bref package will automatically configure Laravel to work on AWS Lambda. + +If you are curious, the package will automatically: + +- enable the `stderr` log driver, to send logs to CloudWatch ([read more about logs](../environment/logs.md)) +- enable the [`cookie` session driver](https://laravel.com/docs/session#configuration) (if you prefer, you can configure sessions to be stored in database, DynamoDB or Redis) +- move the storage directory to `/tmp` (because the default storage directory is read-only on Lambda) +- adjust a few more settings ([have a look at the `BrefServiceProvider` for details](https://github.com/brefphp/laravel-bridge/blob/master/src/BrefServiceProvider.php)) + +## Deployment + +We do not want to deploy "dev" caches that were generated on our machine (because paths will be different on AWS Lambda). Let's clear them before deploying: + +```bash +php artisan config:clear +``` + +When running in AWS Lambda, the Laravel application will automatically cache its configuration when booting. You don't need to run `php artisan config:cache` before deploying. + +Let's deploy now: + +```bash +serverless deploy +``` + +When finished, the `deploy` command will show the URL of the application. + +### Deploying for production + +At the moment, we deployed our local codebase to Lambda. When deploying for production, we probably don't want to deploy: + +- development dependencies, +- our local `.env` file, +- or any other dev artifact. + +Follow [the deployment guide](/docs/deploy.md#deploying-for-production) for more details. + +TODO + +## Troubleshooting + +In case your application is showing a blank page after being deployed, [have a look at the logs](../environment/logs.md). + +## Laravel Artisan + +As you may have noticed, we define a function named "artisan" in `serverless.yml`. That function is using the [Console runtime](/docs/web-apps/console.md), which lets us run Laravel Artisan on AWS Lambda. + +For example, to execute an `artisan` command on Lambda, run the command below: + +```bash +serverless bref:cli --args="" +``` + +For more details follow [the "Console" guide](/docs/web-apps/console.md). + +TODO diff --git a/docs/laravel/maintenance-mode.mdx b/docs/laravel/maintenance-mode.mdx new file mode 100644 index 000000000..d4bc50cee --- /dev/null +++ b/docs/laravel/maintenance-mode.mdx @@ -0,0 +1,23 @@ +# Maintenance mode + +Similar to the `php artisan down` command, you may put your app into maintenance mode. All that's required is setting the `MAINTENANCE_MODE` environment variable: + +```yml filename="serverless.yml" +provider: + environment: + MAINTENANCE_MODE: ${param:maintenance, null} +``` + +You can then deploy: + +```bash +# Full deployment (goes through CloudFormation): +serverless deploy --param="maintenance=1" + +# Or quick update of the functions config only: +serverless deploy function --function=web --update-config --param="maintenance=1" +serverless deploy function --function=artisan --update-config --param="maintenance=1" +serverless deploy function --function= --update-config --param="maintenance=1" +``` + +To take your app out of maintenance mode, redeploy without the `--param="maintenance=1"` option. diff --git a/docs/laravel/octane.md b/docs/laravel/octane.md new file mode 100644 index 000000000..7879ab252 --- /dev/null +++ b/docs/laravel/octane.md @@ -0,0 +1,44 @@ +--- +introduction: Run Laravel with Octane on AWS Lambda using Bref. +--- + +# Laravel Octane + +To run the HTTP application with [Laravel Octane](https://laravel.com/docs/10.x/octane) instead of PHP-FPM, change the following options in the `web` function: + +```yml +functions: + web: + handler: Bref\LaravelBridge\Http\OctaneHandler + runtime: php-81 + environment: + BREF_LOOP_MAX: 250 + # ... +``` + +Keep the following details in mind: + +- Laravel Octane does not need Swoole or RoadRunner on AWS Lambda, so it is not possible to use Swoole-specific features. +- Octane keeps Laravel booted in a long-running process, [beware of memory leaks](https://laravel.com/docs/10.x/octane#managing-memory-leaks). +- `BREF_LOOP_MAX` specifies the number of HTTP requests handled before the PHP process is restarted (and the memory is cleared). + +### Persistent database connections + +You can keep database connections persistent across requests to make your application even faster. To do so, set the `OCTANE_PERSIST_DATABASE_SESSIONS` environment variable: + +```yml +functions: + web: + handler: Bref\LaravelBridge\Http\OctaneHandler + runtime: php-81 + environment: + BREF_LOOP_MAX: 250 + OCTANE_PERSIST_DATABASE_SESSIONS: 1 + # ... +``` + +Note that if you are using PostgreSQL (9.6 or newer), you need to set [`idle_in_transaction_session_timeout`](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-IDLE-IN-TRANSACTION-SESSION-TIMEOUT) either in your RDS database's parameter group, or on a specific database itself. + +```sql +ALTER DATABASE SET idle_in_transaction_session_timeout = '10000' -- 10 seconds in ms +``` diff --git a/docs/laravel/passport.mdx b/docs/laravel/passport.mdx new file mode 100644 index 000000000..1b4c44c97 --- /dev/null +++ b/docs/laravel/passport.mdx @@ -0,0 +1,55 @@ +import { Steps } from 'nextra/components'; + +export const introduction = 'Laravel Passport on AWS Lambda with Bref'; + +# Laravel Passport + +Laravel Passport has a `passport:install` command. However, this command cannot be run in Lambda because it needs to write files to the `storage/` directory. + +Instead, here is what you need to do: + + + + ### Generate keys locally + + Run the following command on your machine to generate key files: + + ```bash + php artisan passport:keys + ``` + + This will generate the `storage/oauth-private.key` and `storage/oauth-public.key` files, which need to be deployed. + + Depending on how you deploy your application (from your machine, or from CI), you may want to whitelist them in `serverless.yml`: + + ```yaml + package: + patterns: + - ... + # Exclude the 'storage' directory + - '!storage/**' + # Except the public and private keys required by Laravel Passport + - 'storage/oauth-private.key' + - 'storage/oauth-public.key' + ``` + + ### Deploy + + You can now redeploy the application: + + ```yaml + serverless deploy + ``` + + ### Create tokens + + Finally, you can create the tokens (which is the second part of the `passport:install` command): + + ```bash + serverless bref:cli --args="passport:client --personal --name 'Laravel Personal Access Client'" + serverless bref:cli --args="passport:client --password --name 'Laravel Personal Access Client'" + ``` + + + +All these steps were replacements of running the `passport:install` command [from the Passport documentation](https://laravel.com/docs/passport#installation). diff --git a/docs/laravel/queues.mdx b/docs/laravel/queues.mdx new file mode 100644 index 000000000..c9ec09730 --- /dev/null +++ b/docs/laravel/queues.mdx @@ -0,0 +1,66 @@ +import { Callout } from 'nextra/components'; + +export const introduction = 'Run Laravel Queues on AWS Lambda and SQS using Bref.'; + +# Laravel Queues + + + A demo application is available on GitHub at [github.com/brefphp/examples](https://github.com/brefphp/examples). + + +To run Laravel Queues on AWS Lambda using [Amazon SQS](https://aws.amazon.com/sqs/), we don't want to run the `php artisan queue:work` command. Instead, we create a Lambda function that is invoked immediately when there are new jobs to process. + +To create the SQS queue (and the permissions for the Lambda functions to read/write to it), we can either do that manually, or use `serverless.yml`. + +To make things simpler, we will use the [Serverless Lift](https://github.com/getlift/lift) plugin to create and configure the SQS queue. + +First install the Lift plugin: + +```bash +serverless plugin install -n serverless-lift +``` + +Then use the Queue construct in `serverless.yml`: + +```yml +provider: + # ... + environment: + # ... + QUEUE_CONNECTION: sqs + SQS_QUEUE: ${construct:jobs.queueUrl} + +functions: + # ... + +constructs: + jobs: + type: queue + worker: + handler: Bref\LaravelBridge\Queue\QueueHandler + runtime: php-81 + timeout: 60 # seconds +``` + +We define Laravel environment variables in `provider.environment` (this could also be done in the deployed `.env` file): + +- `QUEUE_CONNECTION: sqs` enables the SQS queue connection +- `SQS_QUEUE: ${construct:jobs.queueUrl}` passes the URL of the created SQS queue + +If you want to create the SQS queue manually, you will need to set these variables. AWS credentials (`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`) are automatically set up with the appropriate permissions for Laravel to use the SQS queue. + +That's it! Anytime a job is pushed to Laravel Queues, it will be sent to SQS, and SQS will invoke our "worker" function so that it is processed. + +> **Note**: +> +> In the example above, we set the full SQS queue URL in the `SQS_QUEUE` variable. +> +If you only set the queue name (which is also valid), you need to set the `SQS_PREFIX` environment variable too. For example: `SQS_PREFIX: "https://sqs.${aws:region}.amazonaws.com/${aws:accountId}"`. + +### How it works + +When integrated with AWS Lambda, SQS has a built-in retry mechanism and storage for failed messages. These features work slightly differently than Laravel Queues. The "Bref for Laravel" integration does **not** use these SQS features. + +Instead, "Bref for Laravel" makes all the feature of Laravel Queues work out of the box, just like on any server. Read more in [the Laravel Queues documentation](https://laravel.com/docs/latest/queues). + +> **Note:** the "Bref-Laravel bridge" v1 used to do the opposite. We changed that behavior in Bref v2 in order to make the experience smoother for Laravel users. diff --git a/docs/web-apps/local-development.md b/docs/local-development.mdx similarity index 60% rename from docs/web-apps/local-development.md rename to docs/local-development.mdx index 4bbdace59..9d6e3e7d2 100644 --- a/docs/web-apps/local-development.md +++ b/docs/local-development.mdx @@ -1,13 +1,6 @@ ---- -title: Local development for web apps -current_menu: web-local-development -previous: - link: /docs/web-apps/cron.html - title: Cron commands -next: - link: /docs/web-apps/docker.html - title: Docker ---- +import { Tabs, Tab } from 'nextra/components'; + +# Local development It is possible to run **web applications** locally. @@ -15,23 +8,34 @@ It is possible to run **web applications** locally. ## The simple way -To keep things simple, you can run your PHP application like you did without Bref. For example with your favorite framework: +To keep things simple, you can run your applications locally like you did without Bref. -- Laravel via `php artisan serve` or [Homestead](https://laravel.com/docs/homestead) or [Laravel Valet](https://laravel.com/docs/valet) -- Symfony via `symfony server:start` ([documentation](https://symfony.com/doc/current/setup/symfony_server.html)) + + + With **Laravel**, run HTTP applications locally using `php artisan serve`, [Laravel Valet](https://laravel.com/docs/valet), or [Laravel Sail](https://laravel.com/docs/10.x/sail). -If you are not using any framework, you can use PHP's built-in server: + You can test CLI commands locally by running them in your terminal using `php artisan my-command`. + + + With **Symfony**, run HTTP applications locally using `symfony server:start` ([documentation](https://symfony.com/doc/current/setup/symfony_server.html)). -```bash -php -S localhost:8000 -# The application is now available at http://localhost:8000/ -``` + You can test CLI commands locally by running them in your terminal using `bin/console my-command`. + + + Run your HTTP applications locally via your preferred method to run PHP: Apache, WAMP, or even the built-in PHP server: + + ```bash + php -S localhost:8000 + # The application is now available at http://localhost:8000/ + ``` + + ## Docker -In order to run the application locally in an environment closer to production, you can use the [Bref Docker images](https://hub.docker.com/u/bref). For example, create the following `docker-compose.yml`: +In order to run the application locally in an environment closer to production, you can run your application using the [Bref Docker images](https://hub.docker.com/u/bref). For example, create the following `docker-compose.yml`: -```yaml +```yml filename="docker-compose.yml" version: "3.5" services: @@ -42,9 +46,17 @@ services: - .:/var/task environment: HANDLER: public/index.php + # Assets will be served from this directory + DOCUMENT_ROOT: public ``` -After running `docker-compose up`, the application will be available at [http://localhost:8000/](http://localhost:8000/). +You can then run: + +```bash +docker-compose up +``` + +The application will be available at [http://localhost:8000/](http://localhost:8000/). The `HANDLER` environment variable lets you define which PHP file will be handling all HTTP requests. This should be the same handler that you have defined in `serverless.yml` for your HTTP function. @@ -56,15 +68,15 @@ The code will be mounted in `/var/task`, just like in Lambda. But in Lambda, `/v When developing locally, it is common to regenerate cache files on the fly (for example Symfony or Laravel cache). You have 2 options: -- mount the whole codebase as writable: +- either mount the whole codebase as writable (per the example above): - ```yaml + ```yaml filename="docker-compose.yml" volumes: - .:/var/task ``` -- mount a specific cache directory as writable (better): +- or mount a specific cache directory as writable (better): - ```yaml + ```yaml filename="docker-compose.yml" {3} volumes: - .:/var/task:ro - ./storage:/var/task/storage @@ -74,23 +86,31 @@ When developing locally, it is common to regenerate cache files on the fly (for If you want to serve assets locally, you can define a `DOCUMENT_ROOT` environment variable: -```yaml -version: "3.5" - +```yaml {6,7} filename="docker-compose.yml" services: app: - image: bref/php-81-fpm-dev:2 - ports: [ '8000:8000' ] - volumes: - - .:/var/task + # ... environment: HANDLER: public/index.php + # Assets will be served from this directory DOCUMENT_ROOT: public ``` In the example above, a `public/assets/style.css` file will be accessible at `http://localhost:8000/assets/style.css`. -> Be aware that serving assets in production will not work like this out of the box. You will need [to use a S3 bucket](/docs/runtimes/http.md#assets). +> Be aware that serving assets in production will not work like this out of the box. You will need [to use a S3 bucket](/docs/web-apps/index.md#assets). + +### Console commands + +You can run console commands in Docker via: + +```bash +# Laravel (artisan) +docker-compose run app php artisan ... + +# Symfony (bin/console) +docker-compose run app php bin/console ... +``` ### Xdebug @@ -98,7 +118,7 @@ The development container (`bref/php--fpm-dev`) comes with Xdebug pre-i To enable it, create a `php/conf.dev.d/php.ini` file in your project containing: -```ini +```ini filename="php/conf.dev.d/php.ini" zend_extension=xdebug.so ``` @@ -110,7 +130,7 @@ Docker for Mac uses a virtual machine for running docker. That means you need to Edit the `php/conf.dev.d/php.ini` file: -```ini +```ini filename="php/conf.dev.d/php.ini" {3-6} zend_extension=xdebug.so [xdebug] @@ -123,7 +143,7 @@ xdebug.remote_host = 'host.docker.internal' The development container (`bref/php--fpm-dev`) comes with the [blackfire](https://www.blackfire.io/) extension. When using docker compose, you can add the following service for the blackfire agent: -```yaml +```yml filename="docker-compose.yml" services: blackfire: image: blackfire/blackfire @@ -134,40 +154,9 @@ services: In order to enable the probe you can create a folder `php/conf.dev.d` in your project and include an ini file enabling blackfire: -```ini +```ini filename="php/conf.dev.d/php.ini" extension=blackfire blackfire.agent_socket=tcp://blackfire:8707 ``` For more details about using blackfire in a docker environment see the [blackfire docs](https://blackfire.io/docs/integrations/docker) - -## Console applications - -Console applications can be tested just like before: by running the command in your terminal. - -For example with Symfony you can run `bin/console ` , or with Laravel run `php artisan `. - -If you want to run your console in an environment close to production, you can use the Bref Docker dev images documented above. For example, if you have a `docker-compose.yml` file like this: - -```yaml -version: "3.5" - -services: - app: - image: bref/php-81-fpm-dev:2 - ports: [ '8000:8000' ] - volumes: - - .:/var/task - environment: - HANDLER: public/index.php -``` - -Then CLI commands can be run in Docker via: - -```bash -# Symfony (bin/console) -docker-compose run app php bin/console - -# Laravel (artisan) -docker-compose run app php artisan -``` diff --git a/docs/news/README.md b/docs/news/README.md deleted file mode 100644 index 77549005c..000000000 --- a/docs/news/README.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Latest news -introduction: Bref-related news. -layout: news ---- - -## [Bref 2.0 is released 🎉](02-bref-2.0.md) - -The work on what would be Bref 2.0 started in October 2021, about 1.5 year ago. We went through many different strategies, experiments, rewrites, over **700 commits** to finally land with the stable release. - -So far, Bref has been installed more than 2 million times and powers more than **10 billion Lambda executions** (aka requests) every month. - -That's [1 in every 1000 AWS Lambda executions](https://twitter.com/matthieunapoli/status/1603032544424894464)! - -Today, we celebrate these achievements, the ongoing work and **the release of Bref 2.0** 🎉 - -Let's dive in what's new in v2 👇 - -[▶ Read more](02-bref-2.0.md) - -## [Bref 1.0 is released 🎉](01-bref-1.0.md) - -Bref started in November 2017, 3 years ago. Back then, running PHP on AWS Lambda was experimental at best. - -Over the years, as the Bref community grew, as AWS features landed, and as contributors worked, creating serverless PHP applications has become a reality. Bref 0.2 has seen 37 releases. Bref 0.5 has 33. In total, we've released 89 versions since the project started. - -Needless to say **Bref is stable** and has been for a long time. - -Today, we're finally releasing **Bref 1.0**! - -[▶ Read more](01-bref-1.0.md) diff --git a/docs/runtimes/README.md b/docs/runtimes/README.md index 813968d9c..004822412 100644 --- a/docs/runtimes/README.md +++ b/docs/runtimes/README.md @@ -33,7 +33,7 @@ This runtime uses PHP-FPM to run **web applications** on AWS Lambda. It's **the easiest to start with**: it works like traditional PHP hosting and is compatible with Symfony and Laravel. -[Get started with the FPM runtime in "Bref for web apps"](/docs/runtimes/http.md). +[Get started with the FPM runtime in "Bref for web apps"](/docs/web-apps/index.md). ### Event-driven functions @@ -57,7 +57,7 @@ This runtime lets you run CLI console commands on Lambda. For example, we can run the [Symfony Console](https://symfony.com/doc/master/components/console.html) or [Laravel Artisan](https://laravel.com/docs/artisan). -[Read more about the `console` runtime here](/docs/runtimes/console.md). +[Read more about the `console` runtime here](/docs/web-apps/console.md). ## Usage @@ -186,7 +186,7 @@ Bref ARM layers are the same as the x86 layers, but with the `arm-` prefix in th > > You can skip it for now if you just want to get started with Bref. > -> ▶ [**Get started with web apps**](/docs/runtimes/http.md). +> ▶ [**Get started with web apps**](/docs/web-apps/index.md). Bref runtimes are distributed as [AWS Lambda layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html). While Bref provides a Serverless plugin to simplify how to use them, you can use the layers directly. diff --git a/docs/runtimes/function.md b/docs/runtimes/function.md index 627a74d34..a73d3fc01 100644 --- a/docs/runtimes/function.md +++ b/docs/runtimes/function.md @@ -33,7 +33,7 @@ exports.myHandler = async function (event, context) { Writing functions is very useful to process events and data from other AWS services. For example, this is perfect to implement **asynchronous workers, event handling, file processing**, etc. -If you are looking to create HTTP applications, have a look at [Bref for web apps](/docs/runtimes/http.md). +If you are looking to create HTTP applications, have a look at [Bref for web apps](/docs/web-apps/index.md). ## The function @@ -97,7 +97,7 @@ The runtime to use is `php-XX`. To learn more check out [the runtimes documentat A PHP function must be invoked via the AWS Lambda API, either manually or by integrating with other AWS services. -> If you instead want to write a classic **HTTP application** read [Bref for web apps](/docs/runtimes/http.md). +> If you instead want to write a classic **HTTP application** read [Bref for web apps](/docs/web-apps/index.md). ### CLI diff --git a/docs/setup.mdx b/docs/setup.mdx new file mode 100644 index 000000000..c42c5a150 --- /dev/null +++ b/docs/setup.mdx @@ -0,0 +1,56 @@ +import { Steps } from 'nextra/components'; +import { Callout } from 'nextra/components'; +import { Cards, Card } from 'nextra/components' + +export const introduction = 'Getting ready to use Bref.'; + +# Setup + +To use Bref, you will need an AWS account and the `serverless` CLI. Let's get started: + + + + ### AWS account + + Bref deploys your applications to your AWS account. To create one, **go to [aws.amazon.com](https://aws.amazon.com/) and click *Sign up***. + + AWS has a generous free tier that will usually allow you to deploy your first serverless applications for free. + + ### Serverless CLI + + Bref relies on the [Serverless framework](https://serverless.com/) and AWS access keys to deploy applications. You will need to: + + - Install the `serverless` command ([more details here](https://serverless.com/framework/docs/providers/aws/guide/quick-start/)): + + ```bash + npm install -g serverless + ``` + + Bref is compatible with Serverless Framework v3 (current version). + + - [Create AWS access keys](/docs/setup/aws-keys.md) + + - Set up those keys by running: + + ```bash + serverless config credentials --provider aws --key "key" --secret "secret" + ``` + + If you already use the `aws` CLI command, or if you want to use environment variables instead (for example for a shared server like a CI) you can [read the full guide](https://serverless.com/framework/docs/providers/aws/guide/credentials#using-aws-access-keys). + + + +## What's next? + +That's it, you're ready to use Bref! + + + + + + + + + Bref is compatible with PHP 8.0 or greater. + If you are using PHP 7.4, Bref v1 (previous major version) will be installed instead. + diff --git a/docs/setup/_meta.json b/docs/setup/_meta.json new file mode 100644 index 000000000..a23aa8948 --- /dev/null +++ b/docs/setup/_meta.json @@ -0,0 +1,5 @@ +{ + "aws-keys": { + "display": "hidden" + } +} \ No newline at end of file diff --git a/docs/installation/aws-keys-step-1.png b/docs/setup/aws-keys-step-1.png similarity index 100% rename from docs/installation/aws-keys-step-1.png rename to docs/setup/aws-keys-step-1.png diff --git a/docs/installation/aws-keys-step-2.png b/docs/setup/aws-keys-step-2.png similarity index 100% rename from docs/installation/aws-keys-step-2.png rename to docs/setup/aws-keys-step-2.png diff --git a/docs/installation/aws-keys-step-3.png b/docs/setup/aws-keys-step-3.png similarity index 100% rename from docs/installation/aws-keys-step-3.png rename to docs/setup/aws-keys-step-3.png diff --git a/docs/installation/aws-keys-step-4.png b/docs/setup/aws-keys-step-4.png similarity index 100% rename from docs/installation/aws-keys-step-4.png rename to docs/setup/aws-keys-step-4.png diff --git a/docs/installation/aws-keys-step-5.png b/docs/setup/aws-keys-step-5.png similarity index 100% rename from docs/installation/aws-keys-step-5.png rename to docs/setup/aws-keys-step-5.png diff --git a/docs/installation/aws-keys-step-6.png b/docs/setup/aws-keys-step-6.png similarity index 100% rename from docs/installation/aws-keys-step-6.png rename to docs/setup/aws-keys-step-6.png diff --git a/docs/installation/aws-keys.md b/docs/setup/aws-keys.md similarity index 82% rename from docs/installation/aws-keys.md rename to docs/setup/aws-keys.md index 597c4833f..6dafa5203 100644 --- a/docs/installation/aws-keys.md +++ b/docs/setup/aws-keys.md @@ -1,19 +1,20 @@ --- -title: Creating AWS access keys introduction: How to create AWS access keys for Bref. --- +# Creating AWS access keys + To create AWS access key for Bref and the `serverless` CLI tool follow these steps: 1. In the AWS dashboard, go into IAM and create a new user: [**click here** for a direct link](https://us-east-1.console.aws.amazon.com/iamv2/home#/users/create). 1. Set a user name (for example "bref-cli") and move to the next screen. - ![](aws-keys-step-1.png) + ![](./aws-keys-step-1.png) 1. Click **Attach policies directly**, search for **AdministratorAccess** and select it. - ![](aws-keys-step-2.png) + ![](./aws-keys-step-2.png) > **Warning**: the "AdministratorAccess" policy grants full access to your AWS account. This is simpler when starting with AWS and Bref. However, it is recommended to restrict permissions further eventually. > @@ -23,18 +24,18 @@ To create AWS access key for Bref and the `serverless` CLI tool follow these ste 1. Once your user is created, select it and go to **Security credentials**. - ![](aws-keys-step-3.png) + ![](./aws-keys-step-3.png) 1. Scroll down to **Access Keys** and click on **Create access key**. - ![](aws-keys-step-4.png) + ![](./aws-keys-step-4.png) 1. Then select **Command Line Interface**. - ![](aws-keys-step-5.png) + ![](./aws-keys-step-5.png) 1. Add a description to your access keys and click on **Create access key**. - ![](aws-keys-step-6.png) + ![](./aws-keys-step-6.png) -[< Back to the installation guide](/docs/installation.md) +[< Back to the installation guide](/docs/setup.mdx) diff --git a/docs/symfony/_meta.json b/docs/symfony/_meta.json new file mode 100644 index 000000000..10d7eec57 --- /dev/null +++ b/docs/symfony/_meta.json @@ -0,0 +1,6 @@ +{ + "getting-started": "Getting started", + "assets": "Assets", + "file-storage": "", + "messenger": "Symfony Messenger" +} \ No newline at end of file diff --git a/docs/symfony/assets.mdx b/docs/symfony/assets.mdx new file mode 100644 index 000000000..7d797182a --- /dev/null +++ b/docs/symfony/assets.mdx @@ -0,0 +1,72 @@ +import { Callout } from 'nextra/components'; + +export const introduction = 'Run Symfony serverless on AWS Lambda using Bref.'; + +# Symfony assets + +To deploy Symfony websites, assets need to be served from AWS S3. The easiest approach is to use the [Server-side website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). + +This will deploy a CloudFront distribution (CDN) that will act as a proxy: it will serve static files directly from S3 and will forward everything else to Lambda. This is very close to how traditional web servers like Apache or Nginx work, which means your application doesn't need to change! For more details, read [the official documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md#how-it-works). + +First install the plugin + +```bash +serverless plugin install -n serverless-lift +``` + +Then add this configuration to your `serverless.yml` file. + +```yml filename="serverless.yml" {10,12-20} +service: symfony +provider: + # ... + +functions: + # ... + +plugins: + - ./vendor/bref/bref + - serverless-lift + +constructs: + website: + type: server-side-website + assets: + '/bundles/*': public/bundles + '/build/*': public/build + '/favicon.ico': public/favicon.ico + '/robots.txt': public/robots.txt + # add here any file or directory that needs to be served from S3 +``` + +Because this construct sets the `X-Forwarded-Host` header by default, you should add it in your `trusted_headers` config, otherwise Symfony might generate wrong URLs. + +```yml filename="config/packages/framework.yaml" /, 'x-forwarded-host'/ + trusted_headers: [ 'x-forwarded-for', 'x-forwarded-proto', 'x-forwarded-port', 'x-forwarded-host' ] +``` + +Before deploying, compile your assets: + +```bash +php bin/console assets:install --env prod +# if using Webpack Encore, additionally run +yarn encore production +``` + +Now deploy your website using `serverless deploy`. Lift will create all required resources and take care of uploading your assets to S3 automatically. + +TODO +For more details, see the [Websites section](../web-apps/website-assets.md) of this documentation and the official [Lift documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). + + + If you are not using Flex, update `serverless.yml` to exclude assets from the deployment ([see the recipe](https://github.com/symfony/recipes-contrib/blob/master/bref/symfony-bridge/0.1/serverless.yaml#L35)) + + +## Assets in templates + +For the above configuration to work, assets must be referenced in Twig templates via the `asset()` helper as [recommended by Symfony](https://symfony.com/doc/current/templates.html#linking-to-css-javascript-and-image-assets): + +```diff +- ++ +``` diff --git a/docs/frameworks/symfony.md b/docs/symfony/getting-started.mdx similarity index 55% rename from docs/frameworks/symfony.md rename to docs/symfony/getting-started.mdx index 07dd65386..84868f988 100644 --- a/docs/frameworks/symfony.md +++ b/docs/symfony/getting-started.mdx @@ -1,40 +1,38 @@ ---- -title: Serverless Symfony applications -current_menu: symfony -introduction: Learn how to deploy serverless Symfony applications on AWS Lambda using Bref. ---- +import { Callout } from 'nextra/components'; -This guide helps you run Symfony applications on AWS Lambda using Bref. These instructions are kept up-to-date to be compatible with the latest Symfony version. +export const introduction = 'Run Symfony serverless on AWS Lambda using Bref.'; -Multiple demo applications are available on GitHub at [github.com/brefphp/examples/Symfony](https://github.com/brefphp/examples/tree/master/Symfony). +# Serverless Symfony - Getting started + +This guide helps you run Symfony applications on AWS Lambda using Bref. These instructions are kept up to date to target the latest Symfony version. + + + A demo application is available on GitHub at [github.com/brefphp/examples](https://github.com/brefphp/examples). + ## Setup -First, **follow the [Installation guide](../installation.md)** to create an AWS account and install the necessary tools. +First, **follow the [Setup guide](../setup.md)** to create an AWS account and install the necessary tools. Next, in an existing Symfony project, install Bref and the [Symfony Bridge package](https://github.com/brefphp/symfony-bridge). -``` -composer require bref/bref bref/symfony-bridge +```bash +composer require bref/bref bref/symfony-bridge --update-with-dependencies ``` -If you are using [Symfony Flex](https://flex.symfony.com/), it will automatically run -the [bref/symfony-bridge recipe](https://github.com/symfony/recipes-contrib/tree/master/bref/symfony-bridge/0.1) which will perform the following tasks: +If you are using [Symfony Flex](https://flex.symfony.com/), it will automatically run the [bref/symfony-bridge recipe](https://github.com/symfony/recipes-contrib/tree/master/bref/symfony-bridge/0.1) which will perform the following tasks: - Create a `serverless.yml` configuration file optimized for Symfony. - Add the `.serverless` folder to the `.gitignore` file. -> Otherwise, you can create the `serverless.yml` file manually at the root of the project. Take a look -at the [default configuration](https://github.com/symfony/recipes-contrib/blob/master/bref/symfony-bridge/0.1/serverless.yaml) provided by the recipe. +Otherwise, you can create the `serverless.yml` file manually at the root of the project. Take a look at the [default configuration](https://github.com/symfony/recipes-contrib/blob/master/bref/symfony-bridge/0.1/serverless.yaml) provided by the recipe. You still have a few modifications to do on the application to make it compatible with AWS Lambda. Since [the filesystem is readonly](/docs/environment/storage.md) except for `/tmp` we need to customize where the cache and logs are stored in the `src/Kernel.php` file. This is automatically done by the bridge, you just need to use the `BrefKernel` class instead of the default `BaseKernel`: -```diff -// src/Kernel.php - +```diff filename="src/Kernel.php" namespace App; + use Bref\SymfonyBridge\BrefKernel; @@ -51,22 +49,50 @@ use Symfony\Component\Routing\RouteCollectionBuilder; // ... ``` -## Deploy +## Deployment + +Let's deploy the application to AWS Lambda: + +```bash +serverless deploy +``` + +When finished, the `deploy` command will show the URL of the application. + +### Deploying for production + +At the moment, we deployed our local codebase to Lambda. When deploying for production, we probably don't want to deploy: + +- development dependencies, +- our local `.env` files, +- or any other dev artifact. -The application is now ready to be deployed. Follow [the deployment guide](/docs/deploy.md). +Follow [the deployment guide](/docs/deploy.md#deploying-for-production) for more details. -For better performance in production, warmup the Symfony cache before deploying: +Note as well that for better performance in production, you can warmup the Symfony cache before deploying: ```bash php bin/console cache:warmup --env=prod ``` -## Console +## Troubleshooting -As you may have noticed, we define a function of type "console" in `serverless.yml`. That function is using the [Console runtime](/docs/runtimes/console.md), +In case your application is showing a blank page after being deployed, [have a look at the logs](../environment/logs.md). + +## Symfony Console + +As you may have noticed, we define a function named "console" in `serverless.yml`. That function is using the [Console runtime](/docs/web-apps/console.md), which lets us run the Symfony Console on AWS Lambda. -To use it follow [the "Console" guide](/docs/runtimes/console.md). +For example, to execute an `bin/console` command on Lambda, run the command below: + +```bash +serverless bref:cli --args="" +``` + +For more details follow [the "Console" guide](/docs/web-apps/console.md). + +TODO ## Logs @@ -136,84 +162,6 @@ calling `Request::getClientIp()`. If you really need this, you will need to whitelist [every CloudFront IP](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html) in `trusted_proxies`. -## Assets - -To deploy Symfony websites, assets need to be served from AWS S3. The easiest approach is to use the -Server-side website construct of the Lift plugin. - -This will deploy a Cloudfront distribution that will act as a proxy: it will serve -static files directly from S3 and will forward everything else to Lambda. This is very close -to how traditional web servers like Apache or Nginx work, which means your application doesn't need to change! -For more details, see the official documentation. - -First install the plugin - -```bash -serverless plugin install -n serverless-lift -``` - -Then add this configuration to your `serverless.yml` file. - -```yaml -... -service: symfony - -provider: - ... - -plugins: - - ./vendor/bref/bref - - serverless-lift - -functions: - ... - -constructs: - website: - type: server-side-website - assets: - '/bundles/*': public/bundles - '/build/*': public/build - '/favicon.ico': public/favicon.ico - '/robots.txt': public/robots.txt - # add here any file or directory that needs to be served from S3 -``` - -Because this construct sets the `X-Forwarded-Host` header by default, you should add it in your `trusted_headers` config, otherwise Symfony -might generate wrong URLs. - -```diff -# config/packages/framework.yaml - -- trusted_headers: [ 'x-forwarded-for', 'x-forwarded-proto', 'x-forwarded-port' ] -+ trusted_headers: [ 'x-forwarded-for', 'x-forwarded-proto', 'x-forwarded-port', 'x-forwarded-host' ] -``` - -Then, you can compile assets for production in the `public` directory - -```bash -php bin/console assets:install --env prod -# if using Webpack Encore, additionally run -yarn encore production -``` - -Now run `serverless deploy`, Lift will automatically create the S3 bucket, a Cloudfront distribution and -upload all specified files and directories to the bucket. - -> If you are not using Flex, update the `serverless.yml` file to exclude assets from the deployment ([see the recipe](https://github.com/symfony/recipes-contrib/blob/master/bref/symfony-bridge/0.1/serverless.yaml#L35)) - -For more details, see the [Websites section](/docs/websites.md) of this documentation -and the official Lift documentation. - -### Assets in templates - -For the above configuration to work, assets must be referenced in templates via the `asset()` helper as [recommended by Symfony](https://symfony.com/doc/current/templates.html#linking-to-css-javascript-and-image-assets): - -```diff -- -+ -``` - ## Symfony Messenger It is possible to run Symfony Messenger workers on AWS Lambda. diff --git a/docs/upgrading/v2.md b/docs/upgrading/v2.md index ddc0fe3f5..0e8053447 100644 --- a/docs/upgrading/v2.md +++ b/docs/upgrading/v2.md @@ -67,7 +67,7 @@ The following commands of `vendor/bin/bref` have changed: serverless bref:cli --args="migrate --force" ``` - No need to provide the function name or the region anymore. Read [the Console documentation](../runtimes/console.md#usage) to learn more. You will also find alternatives if you don't use the `serverless` CLI. + No need to provide the function name or the region anymore. Read [the Console documentation](../web-apps/console.md#usage) to learn more. You will also find alternatives if you don't use the `serverless` CLI. - `vendor/bin/bref local` is replaced by the simpler `serverless bref:local`. diff --git a/docs/web-apps/docker.md b/docs/web-apps/docker.md deleted file mode 100644 index 4e544a0c8..000000000 --- a/docs/web-apps/docker.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Docker -current_menu: web-docker -previous: - link: local-development.html - title: Local development for web apps ---- - -AWS Lambda supports running a Docker image, instead of running your application in the default Linux environment. We recommend Docker **as a last resort**, as it is less practical and usually comes with slightly worse cold starts. Yes, Docker is great and probably sounds familiar, but is often not worth it on Lambda. - -You should consider deploying using Docker when: - -- Your Lambda Function is [larger than 250MB when unzipped](../environment/storage.md) -- You reached the limit of 5 Lambda layers (e.g. for extra PHP extensions) -- You need resources installed locally (e.g. mysqldump) - -> Note: this documentation page assumes that you have read about [web apps on Lambda](../runtimes/http.md) first. - -## Docker Image - -Bref helps you deploy to AWS Lambda using Docker by offering -out-of-the-box base images that are package for the Lambda environment. -Here is an example of a Docker image - -```Dockerfile -FROM bref/php-80-fpm:2 - -COPY . /var/task - -# Configure the handler file (the entrypoint that receives all HTTP requests) -CMD ["public/index.php"] -``` - -This Dockerfile outlines the 3 key aspects of Docker on Lambda: - -- Base image compatible with Lambda Runtime -- Source code placed under `/var/task` -- CMD pointing to the entrypoint that will handle requests - -You may also enable PHP extensions by pulling them from -[Bref Extensions](https://github.com/brefphp/extra-php-extensions) - -```Dockerfile -FROM bref/php-80-fpm:2 - -COPY --from=bref/extra-redis-php-80:1 /opt /opt -COPY --from=bref/extra-gmp-php-80:1 /opt /opt - -COPY . /var/task - -CMD ["public/index.php"] -``` - -## Deployment - -The Serverless Framework supports deploying Docker images to Lambda: - -```yaml -service: bref-with-docker - -provider: - name: aws - ecr: - images: - hello-world: - path: ./ - -functions: - hello: - image: - name: hello-world - events: - - httpApi: '*' -``` - -Instead of having a `handler` and a `runtime`, we'll declare an -`image`. In the `provider` block, we'll declare Docker images -that we want to build and deploy. - -When running `serverless deploy`, the framework will: - -- Build the Docker images according to their specified `path` -- Create an ECR Repository called `serverless-{service}-{env}` -- Authenticate against your ECR Account -- Push the newly built Docker Image -- Deploy the Lambda Function pointing to the Docker Image - -When the deployment finishes, your lambda is ready to be -invoked from your API Gateway address. - -## Filesystem - -The filesystem for Docker on AWS Lambda is also readonly with -a limited disk space under `/tmp` for read/write. This folder -will always be empty when a new cold start happens. Avoid -writing content to `/tmp` in your Dockerfile because that -content will **not be available** for your Lambda function. - -[Read more about file storage in Lambda](../environment/storage.md). - -## Docker Registry - -AWS Lambda only support AWS ECR as the source location for -Docker images. The Lambda service will use the image digest -as the unique identifier. This means that even if you overwrite -the exact same tag on ECR, your lambda will still run the previous -image code until you actually redeploy using the new image. diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 000000000..adf35b3a8 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1 @@ +src/pages/docs diff --git a/website/Makefile b/website/Makefile new file mode 100644 index 000000000..56a72f089 --- /dev/null +++ b/website/Makefile @@ -0,0 +1,17 @@ +website-preview: node_modules + $(MAKE) website-preview-parallel-jobs -j2 +website-preview-parallel-jobs: website-live-sync-doc-files website-next-dev +website-live-sync-doc-files: + npx sync-directory ../docs src/pages/docs --deleteOrphaned --watch +website-next-dev: + npm run dev + +# Generate and deploy the production version of the website using http://couscous.io +website: node_modules src/pages/docs + npm run build + +src/pages/docs: + cp -r ../docs src/pages/docs + +node_modules: + npm install diff --git a/website/next.config.js b/website/next.config.js new file mode 100644 index 000000000..6a27f583b --- /dev/null +++ b/website/next.config.js @@ -0,0 +1,25 @@ +const withNextra = require('nextra')({ + theme: 'nextra-theme-docs', + themeConfig: './theme.config.jsx', + // Show the copy button on all code blocks + // https://nextra.site/docs/guide/syntax-highlighting#copy-button + defaultShowCopyCode: true, +}) + +module.exports = withNextra({ + // Redirect old .html links + async redirects() { + return [ + { + source: '/docs/:path*.html', + destination: '/docs/:path*', + // TODO enable permanent redirect when all pages are migrated + permanent: false, + // permanent: true, + }, + ] + }, +}) + +// If you have other Next.js configurations, you can pass them as the parameter: +// module.exports = withNextra({ /* other next.js config */ }) diff --git a/website/package-lock.json b/website/package-lock.json index d44732fe1..a91efe894 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -1,2655 +1,5298 @@ { "name": "website", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { - "devDependencies": { - "tailwindcss": "^2.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "next": "^13.4.9", + "nextra": "^2.8.0", + "nextra-theme-docs": "^2.8.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwindcss": "^3.2.4" }, - "engines": { - "node": ">=6.9.0" + "devDependencies": { + "sync-directory": "^6.0.4" } }, - "node_modules/@babel/helper-validator-identifier": { - "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, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "engines": { - "node": ">=6.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@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==", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "regenerator-runtime": "^0.13.11" }, "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/@braintree/sanitize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" }, - "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, + "node_modules/@headlessui/react": { + "version": "1.7.15", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", + "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "client-only": "^0.0.1" }, "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/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" + "node": ">=10" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" } }, - "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, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">= 8" + "node": ">=6.0.0" } }, - "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, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { - "node": ">= 8" + "node": ">=6.0.0" } }, - "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" - }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { - "node": ">= 8" + "node": ">=6.0.0" } }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@mdx-js/mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", + "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@types/estree-jsx": "^1.0.0", + "@types/mdx": "^2.0.0", + "estree-util-build-jsx": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-util-to-js": "^1.1.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^2.0.0", + "markdown-extensions": "^1.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^2.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "unified": "^10.0.0", + "unist-util-position-from-estree": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, + "node_modules/@mdx-js/mdx/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" }, - "engines": { - "node": ">= 8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", - "dev": true, - "peer": true, + "node_modules/@mdx-js/react": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz", + "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==", "dependencies": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "@types/mdx": "^2.0.0", + "@types/react": ">=16" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://opencollective.com/unified" }, "peerDependencies": { - "postcss": "^8.1.0" + "react": ">=16" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/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, + "node_modules/@napi-rs/simple-git": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.8.tgz", + "integrity": "sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==", "engines": { - "node": ">=8" + "node": ">= 10" + }, + "optionalDependencies": { + "@napi-rs/simple-git-android-arm-eabi": "0.1.8", + "@napi-rs/simple-git-android-arm64": "0.1.8", + "@napi-rs/simple-git-darwin-arm64": "0.1.8", + "@napi-rs/simple-git-darwin-x64": "0.1.8", + "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.8", + "@napi-rs/simple-git-linux-arm64-gnu": "0.1.8", + "@napi-rs/simple-git-linux-arm64-musl": "0.1.8", + "@napi-rs/simple-git-linux-x64-gnu": "0.1.8", + "@napi-rs/simple-git-linux-x64-musl": "0.1.8", + "@napi-rs/simple-git-win32-arm64-msvc": "0.1.8", + "@napi-rs/simple-git-win32-x64-msvc": "0.1.8" + } + }, + "node_modules/@napi-rs/simple-git-android-arm-eabi": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz", + "integrity": "sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/@napi-rs/simple-git-android-arm64": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz", + "integrity": "sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" } }, - "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" - }, + "node_modules/@napi-rs/simple-git-darwin-arm64": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz", + "integrity": "sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, + "node_modules/@napi-rs/simple-git-darwin-x64": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz", + "integrity": "sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "node": ">= 10" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, + "node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz", + "integrity": "sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">= 10" } }, - "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, + "node_modules/@napi-rs/simple-git-linux-arm64-gnu": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz", + "integrity": "sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, + "node_modules/@napi-rs/simple-git-linux-arm64-musl": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz", + "integrity": "sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 6" + "node": ">= 10" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001307", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001307.tgz", - "integrity": "sha512-+MXEMczJ4FuxJAUp0jvAl6Df0NI/OfW1RWEE61eSmzS7hw6lz4IKutbhbXendwq8BljfFuHtu26VWsg4afQ7Ng==", - "dev": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "node_modules/@napi-rs/simple-git-linux-x64-gnu": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz", + "integrity": "sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/@napi-rs/simple-git-linux-x64-musl": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz", + "integrity": "sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 10" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } + "node_modules/@napi-rs/simple-git-win32-arm64-msvc": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz", + "integrity": "sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">= 10" } }, - "node_modules/chokidar/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" - }, + "node_modules/@napi-rs/simple-git-win32-x64-msvc": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz", + "integrity": "sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 6" + "node": ">= 10" } }, - "node_modules/color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.0.tgz", - "integrity": "sha512-hHTcrbvEnGjC7WBMk6ibQWFVDgEFTVmjrz2Q5HlU6ltwxv0JJN2Z8I7uRbWeQLF04dikxs8zgyZkazRJvSMtyQ==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "node_modules/@next/env": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.9.tgz", + "integrity": "sha512-vuDRK05BOKfmoBYLNi2cujG2jrYbEod/ubSSyqgmEx9n/W3eZaJQdRNhTfumO+qmq/QTzLurW487n/PM/fHOkw==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.9.tgz", + "integrity": "sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.9.tgz", + "integrity": "sha512-aSfF1fhv28N2e7vrDZ6zOQ+IIthocfaxuMWGReB5GDriF0caTqtHttAvzOMgJgXQtQx6XhyaJMozLTSEXeNN+A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=7.0.0" + "node": ">= 10" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.9.tgz", + "integrity": "sha512-JhKoX5ECzYoTVyIy/7KykeO4Z2lVKq7HGQqvAH+Ip9UFn1MOJkOnkPRB7v4nmzqAoY+Je05Aj5wNABR1N18DMg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.9.tgz", + "integrity": "sha512-OOn6zZBIVkm/4j5gkPdGn4yqQt+gmXaLaSjRSO434WplV8vo2YaBNbSHaTM9wJpZTHVDYyjzuIYVEzy9/5RVZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.9.tgz", + "integrity": "sha512-iA+fJXFPpW0SwGmx/pivVU+2t4zQHNOOAr5T378PfxPHY6JtjV6/0s1vlAJUdIHeVpX98CLp9k5VuKgxiRHUpg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 12" + "node": ">= 10" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.9.tgz", + "integrity": "sha512-rlNf2WUtMM+GAQrZ9gMNdSapkVi3koSW3a+dmBVp42lfugWVvnyzca/xJlN48/7AGx8qu62WyO0ya1ikgOxh6A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.9.tgz", + "integrity": "sha512-5T9ybSugXP77nw03vlgKZxD99AFTHaX8eT1ayKYYnGO9nmYhJjRPxcjU5FyYI+TdkQgEpIcH7p/guPLPR0EbKA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" + "node": ">= 10" } }, - "node_modules/css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.9.tgz", + "integrity": "sha512-ojZTCt1lP2ucgpoiFgrFj07uq4CZsq4crVXpLGgQfoFq00jPKRPgesuGPaz8lg1yLfvafkU3Jd1i8snKwYR3LA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "*" + "node": ">= 10" } }, - "node_modules/css-unit-converter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", - "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", - "dev": true + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.9.tgz", + "integrity": "sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" + "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": ">=4" + "node": ">= 8" } }, - "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/@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/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, + "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": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 8" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "node_modules/@swc/helpers": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "dependencies": { + "tslib": "^2.4.0" + } }, - "node_modules/electron-to-chromium": { - "version": "1.4.65", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.65.tgz", - "integrity": "sha512-0/d8Skk8sW3FxXP0Dd6MnBlrwx7Qo9cqQec3BlIAlvKnrmS3pHsIbaroEi+nd0kZkGpQ6apMEre7xndzjlEnLw==", - "dev": true, - "peer": true + "node_modules/@theguild/remark-mermaid": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@theguild/remark-mermaid/-/remark-mermaid-0.0.3.tgz", + "integrity": "sha512-fccVR6o4UPUztrBjdUhM4ahwx+X7YHhoxsUoXv2vI07vz4dq+I03Ot0SjuZzDA/H7engxcb8ZxzCUEkZgGr/2g==", + "dependencies": { + "mermaid": "^10.2.2", + "unist-util-visit": "^4.1.2" + }, + "peerDependencies": { + "react": "^18.2.0" + } }, - "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, + "node_modules/@theguild/remark-mermaid/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", "dependencies": { - "is-arrayish": "^0.2.1" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" } }, - "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/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "*" } }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "@types/estree": "*" } }, - "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, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@types/unist": "*" } }, - "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, + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + }, + "node_modules/@types/katex": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz", + "integrity": "sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", "dependencies": { - "reusify": "^1.0.4" + "@types/unist": "*" } }, - "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, + "node_modules/@types/mdx": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.5.tgz", + "integrity": "sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", "dependencies": { - "to-regex-range": "^5.0.1" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "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/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "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/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, + "node_modules/ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==" + }, + "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": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 8" } }, - "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/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "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/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "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": "*" - }, + "sprintf-js": "~1.0.2" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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" - }, + "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/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "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, + "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": { - "function-bind": "^1.1.1" + "fill-range": "^7.0.1" }, "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">=10.16.0" } }, - "node_modules/hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, - "node_modules/hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } }, - "node_modules/hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true + "node_modules/caniuse-lite": { + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "node_modules/html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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, + "node_modules/chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "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/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/is-binary-path": { + "node_modules/character-entities-html4": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "dependencies": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/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==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "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, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "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, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clipboardy": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.2.tgz", + "integrity": "sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==", "dependencies": { - "is-extglob": "^2.1.1" + "arch": "^2.1.0", + "execa": "^0.8.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "engines": { - "node": ">=0.12.0" + "node": ">=6" } }, - "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/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/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, + "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": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "color-name": "1.1.3" } }, - "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } }, - "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/compute-scroll-into-view": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz", + "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==" }, - "node_modules/lodash.topath": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", - "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", - "dev": true + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "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/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" } }, - "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, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=8.6" + "node": ">=4" } }, - "node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/cytoscape": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", + "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", "dependencies": { - "brace-expansion": "^1.1.7" + "heap": "^0.2.6", + "lodash": "^4.17.21" }, "engines": { - "node": "*" + "node": ">=0.10" } }, - "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/modern-normalize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", - "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "cytoscape": "^3.2.0" } }, - "node_modules/nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dependencies": { + "cose-base": "^2.2.0" }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "peerDependencies": { + "cytoscape": "^3.2.0" } }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", "dependencies": { - "lodash": "^4.17.21" + "layout-base": "^2.0.0" } }, - "node_modules/node-releases": { + "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true, - "peer": true + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true, - "peer": true, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "dev": true, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "dependencies": { - "wrappy": "1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" } }, - "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, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "dependencies": { - "callsites": "^3.0.0" + "d3-path": "1 - 3" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "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, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "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" + "d3-array": "^3.2.0" }, "engines": { - "node": ">=8" + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=12" } }, - "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=", - "dev": true, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "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/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } }, - "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, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "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/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=12" } }, - "node_modules/postcss": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", - "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", - "dev": true, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "dependencies": { - "nanoid": "^3.2.0", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "d3-dsv": "1 - 3" }, "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=12" } }, - "node_modules/postcss-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", - "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", - "dev": true, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "dependencies": { - "camelcase-css": "^2.0.1", - "postcss": "^8.1.6" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=12" } }, - "node_modules/postcss-load-config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", - "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" - }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } + "node": ">=12" } }, - "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "dependencies": { - "postcss-selector-parser": "^6.0.6" + "d3-array": "2.5.0 - 3" }, "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "node": ">=12" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", - "dev": true, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "d3-color": "1 - 3" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/purgecss": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.1.3.tgz", - "integrity": "sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==", - "dev": true, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dependencies": { - "commander": "^8.0.0", - "glob": "^7.1.7", - "postcss": "^8.3.5", - "postcss-selector-parser": "^6.0.6" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" }, - "bin": { - "purgecss": "bin/purgecss.js" + "engines": { + "node": ">=12" } }, - "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==", - "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/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/quick-lru": { - "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, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "engines": { - "node": ">=10" + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=12" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dependencies": { - "picomatch": "^2.2.1" + "d3-array": "2 - 3" }, "engines": { - "node": ">=8.10.0" + "node": ">=12" } }, - "node_modules/reduce-css-calc": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", - "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", - "dev": true, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dependencies": { - "css-unit-converter": "^1.1.1", - "postcss-value-parser": "^3.3.0" + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/reduce-css-calc/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "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, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "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/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" } }, - "node_modules/rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "node_modules/rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" }, - "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, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "glob": "^7.1.3" + "ms": "2.1.2" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", - "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/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "dependencies": { - "queue-microtask": "^1.2.2" + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", "dependencies": { - "is-arrayish": "^0.3.1" + "robust-predicates": "^3.0.0" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "engines": { - "node": ">=8" + "node": ">=0.3.1" } }, - "node_modules/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, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dompurify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.3.tgz", + "integrity": "sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==" + }, + "node_modules/elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { - "node": ">= 0.4" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/tailwindcss": { - "version": "2.2.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", - "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", - "dev": true, - "dependencies": { - "arg": "^5.0.1", - "bytes": "^3.0.0", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "color": "^4.0.1", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.7", - "fs-extra": "^10.0.0", - "glob-parent": "^6.0.1", - "html-tags": "^3.1.0", - "is-color-stop": "^1.1.0", - "is-glob": "^4.0.1", - "lodash": "^4.17.21", - "lodash.topath": "^4.5.2", - "modern-normalize": "^1.1.0", - "node-emoji": "^1.11.0", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss-js": "^3.0.3", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.6", - "postcss-value-parser": "^4.1.0", - "pretty-hrtime": "^1.0.3", - "purgecss": "^4.0.3", - "quick-lru": "^5.1.1", - "reduce-css-calc": "^2.1.8", - "resolve": "^1.20.0", - "tmp": "^0.2.1" + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "autoprefixer": "^10.0.2", - "postcss": "^8.0.9" + "node": ">=4" } }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, + "node_modules/estree-util-attach-comments": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz", + "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==", "dependencies": { - "rimraf": "^3.0.0" + "@types/estree": "^1.0.0" }, - "engines": { - "node": ">=8.17.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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, + "node_modules/estree-util-build-jsx": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", + "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==", "dependencies": { - "is-number": "^7.0.0" + "@types/estree-jsx": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-walker": "^3.0.0" }, - "engines": { - "node": ">=8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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/estree-util-is-identifier-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", + "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "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/estree-util-to-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz", + "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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, + "node_modules/estree-util-value-to-estree": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz", + "integrity": "sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==", + "dependencies": { + "is-plain-obj": "^3.0.0" + }, "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "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.7" + "node": ">=12.0.0" } }, - "@babel/helper-validator-identifier": { - "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 + "node_modules/estree-util-visit": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", + "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.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 - }, - "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" - } - } + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" } }, - "@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" + "node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "@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 + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "@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" + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/flexsearch": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.31.tgz", + "integrity": "sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==" + }, + "node_modules/focus-visible": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz", + "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", "dev": true }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "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-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hash-obj/-/hash-obj-4.0.0.tgz", + "integrity": "sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==", + "dependencies": { + "is-obj": "^3.0.0", + "sort-keys": "^5.0.0", + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hast-util-from-dom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz", + "integrity": "sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==", + "dependencies": { + "hastscript": "^7.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz", + "integrity": "sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^7.0.0", + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz", + "integrity": "sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-dom": "^4.0.0", + "hast-util-from-html": "^1.0.0", + "unist-util-remove-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", + "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", + "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "estree-util-attach-comments": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "unist-util-position": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", + "integrity": "sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unist-util-find-after": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/intersection-observer": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz", + "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==" + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-reference": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", + "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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": "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/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "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==" + }, + "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-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/markdown-extensions": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", + "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz", + "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", + "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", + "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", + "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "mdast-util-from-markdown": "^1.1.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", + "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/mermaid": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.2.4.tgz", + "integrity": "sha512-zHGjEI7lBvWZX+PQYmlhSA2p40OzW6QbGodTCSzDeVpqaTnyAC+2sRGqrpXO+uQk3CnoeClHQPraQUMStdqy2g==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.2", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "3.0.3", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz", + "integrity": "sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==", + "dependencies": { + "@types/katex": "^0.16.0", + "katex": "^0.16.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math/node_modules/@types/katex": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.0.tgz", + "integrity": "sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", + "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", + "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", + "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", + "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", + "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", + "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", + "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^2.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.9.tgz", + "integrity": "sha512-vtefFm/BWIi/eWOqf1GsmKG3cjKw1k3LjuefKRcL3iiLl3zWzFdPG3as6xtxrGO6gwTzzaO1ktL4oiHt/uvTjA==", + "dependencies": { + "@next/env": "13.4.9", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0", + "zod": "3.21.4" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.8.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.4.9", + "@next/swc-darwin-x64": "13.4.9", + "@next/swc-linux-arm64-gnu": "13.4.9", + "@next/swc-linux-arm64-musl": "13.4.9", + "@next/swc-linux-x64-gnu": "13.4.9", + "@next/swc-linux-x64-musl": "13.4.9", + "@next/swc-win32-arm64-msvc": "13.4.9", + "@next/swc-win32-ia32-msvc": "13.4.9", + "@next/swc-win32-x64-msvc": "13.4.9" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "fibers": ">= 3.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-mdx-remote": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz", + "integrity": "sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==", + "dependencies": { + "@mdx-js/mdx": "^2.2.1", + "@mdx-js/react": "^2.2.1", + "vfile": "^5.3.0", + "vfile-matter": "^3.0.1" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "peerDependencies": { + "react": ">=16.x <=18.x", + "react-dom": ">=16.x <=18.x" + } + }, + "node_modules/next-seo": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-6.1.0.tgz", + "integrity": "sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA==", + "peerDependencies": { + "next": "^8.1.1-canary.54 || >=9.0.0", + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "peerDependencies": { + "next": "*", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/nextra": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/nextra/-/nextra-2.9.0.tgz", + "integrity": "sha512-GwYFwuS0UzCXAUVvs9sVAFe4AQeZ0VACbqW8rzw2goxHvpTXAWbIdXShPGz+MEPB8aAckfHy1p39XbfcVU3cRA==", + "dependencies": { + "@headlessui/react": "^1.7.10", + "@mdx-js/mdx": "^2.3.0", + "@mdx-js/react": "^2.3.0", + "@napi-rs/simple-git": "^0.1.8", + "@theguild/remark-mermaid": "^0.0.3", + "clsx": "^1.2.1", + "github-slugger": "^2.0.0", + "graceful-fs": "^4.2.11", + "gray-matter": "^4.0.3", + "katex": "^0.16.7", + "lodash.get": "^4.4.2", + "next-mdx-remote": "^4.2.1", + "p-limit": "^3.1.0", + "rehype-katex": "^6.0.3", + "rehype-pretty-code": "0.9.11", + "remark-gfm": "^3.0.1", + "remark-math": "^5.1.1", + "remark-reading-time": "^2.0.1", + "shiki": "^0.14.2", + "slash": "^3.0.0", + "title": "^3.5.3", + "unist-util-remove": "^4.0.0", + "unist-util-visit": "^5.0.0", + "zod": "^3.20.2" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "next": ">=9.5.3", + "react": ">=16.13.1", + "react-dom": ">=16.13.1" + } + }, + "node_modules/nextra-theme-docs": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/nextra-theme-docs/-/nextra-theme-docs-2.9.0.tgz", + "integrity": "sha512-Gbjx5atl63JKWOEV2hAefP4X0wmJoLtFX4NekvNu9Y9fAdvtFdW0O2p0f8ISMS1JJgAl1ZmXm411J7rHnRnhmg==", + "dependencies": { + "@headlessui/react": "^1.7.10", + "@popperjs/core": "^2.11.6", + "clsx": "^1.2.1", + "flexsearch": "^0.7.21", + "focus-visible": "^5.2.0", + "git-url-parse": "^13.1.0", + "intersection-observer": "^0.12.2", + "match-sorter": "^6.3.1", + "next-seo": "^6.0.0", + "next-themes": "^0.2.1", + "scroll-into-view-if-needed": "^3.0.0", + "zod": "^3.20.2" + }, + "peerDependencies": { + "next": ">=9.5.3", + "nextra": "2.9.0", + "react": ">=16.13.1", + "react-dom": ">=16.13.1" + } + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "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/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "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/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdir-enhanced": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz", + "integrity": "sha512-oncAoS9LLjy/+DeZfSAdZBI/iFJGcPCOp44RPFI6FIMHuxt5CC5P0cUZ9mET+EZB9ONhcEvAids/lVRkj0sTHw==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "es6-promise": "^4.1.0", + "glob-to-regexp": "^0.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/rehype-katex": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-6.0.3.tgz", + "integrity": "sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/katex": "^0.14.0", + "hast-util-from-html-isomorphic": "^1.0.0", + "hast-util-to-text": "^3.1.0", + "katex": "^0.16.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-katex/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "node_modules/rehype-pretty-code": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.9.11.tgz", + "integrity": "sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==", + "dependencies": { + "@types/hast": "^2.0.0", + "hash-obj": "^4.0.0", + "parse-numeric-range": "^1.3.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "shiki": "*" } }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" + "node_modules/remark-math": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz", + "integrity": "sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-math": "^2.0.0", + "micromark-extension-math": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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" + "node_modules/remark-mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", + "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", - "dev": true + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", - "dev": true, - "peer": true, - "requires": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "node_modules/remark-reading-time": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-reading-time/-/remark-reading-time-2.0.1.tgz", + "integrity": "sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==", + "dependencies": { + "estree-util-is-identifier-name": "^2.0.0", + "estree-util-value-to-estree": "^1.3.0", + "reading-time": "^1.3.0", + "unist-util-visit": "^3.1.0" } }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "node_modules/remark-reading-time/node_modules/unist-util-visit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", + "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "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 + "node_modules/remark-reading-time/node_modules/unist-util-visit-parents": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", + "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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" + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "peer": true, - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^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" } }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "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" + } }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, - "caniuse-lite": { - "version": "1.0.30001307", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001307.tgz", - "integrity": "sha512-+MXEMczJ4FuxJAUp0jvAl6Df0NI/OfW1RWEE61eSmzS7hw6lz4IKutbhbXendwq8BljfFuHtu26VWsg4afQ7Ng==", - "dev": true, - "peer": true + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "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/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" } }, - "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" - }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz", + "integrity": "sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==", "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" - } - } + "compute-scroll-into-view": "^3.0.2" } }, - "color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.0.tgz", - "integrity": "sha512-hHTcrbvEnGjC7WBMk6ibQWFVDgEFTVmjrz2Q5HlU6ltwxv0JJN2Z8I7uRbWeQLF04dikxs8zgyZkazRJvSMtyQ==", - "dev": true, - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } }, - "color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "node_modules/shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" } }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true + "node_modules/sort-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.0.0.tgz", + "integrity": "sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==", + "dependencies": { + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "css-unit-converter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", - "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", - "dev": true + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } }, - "electron-to-chromium": { - "version": "1.4.65", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.65.tgz", - "integrity": "sha512-0/d8Skk8sW3FxXP0Dd6MnBlrwx7Qo9cqQec3BlIAlvKnrmS3pHsIbaroEi+nd0kZkGpQ6apMEre7xndzjlEnLw==", - "dev": true, - "peer": true + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "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" + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.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=", - "dev": true + "node_modules/style-to-object": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "dependencies": { + "inline-style-parser": "0.1.1" + } }, - "fast-glob": { - "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", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "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" - } + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": 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" - } + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" }, - "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" + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" } }, - "fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", - "dev": true, - "peer": true + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } }, - "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" + "node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "fs.realpath": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/sync-directory": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/sync-directory/-/sync-directory-6.0.4.tgz", + "integrity": "sha512-q+icVGkhOBu7i1M5J/bbs0kh2d64UpnVyMOKqw1bBqpYtr1zIPbW3ZcOZiG3U/dzPl1dCmEm3T6J8nvuq9dYsw==", "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "dependencies": { + "chokidar": "^3.3.1", + "commander": "^6.2.0", + "fs-extra": "^7.0.1", + "is-absolute": "^1.0.0", + "readdir-enhanced": "^1.5.2" + }, + "bin": { + "syncdir": "cmd.js" + } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/sync-directory/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, - "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" + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" } }, - "glob-parent": { + "node_modules/tailwindcss/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, - "requires": { + "dependencies": { "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true + "node_modules/tailwindcss/node_modules/postcss": { + "version": "8.4.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz", + "integrity": "sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, - "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" + "node_modules/tailwindcss/node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true + "node_modules/title": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/title/-/title-3.5.3.tgz", + "integrity": "sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==", + "dependencies": { + "arg": "1.0.0", + "chalk": "2.3.0", + "clipboardy": "1.2.2", + "titleize": "1.0.0" + }, + "bin": { + "title": "bin/title.js" + } }, - "hsla-regex": { + "node_modules/title/node_modules/arg": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", - "dev": true + "resolved": "https://registry.npmjs.org/arg/-/arg-1.0.0.tgz", + "integrity": "sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==" }, - "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" + "node_modules/titleize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.0.tgz", + "integrity": "sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==", + "engines": { + "node": ">=0.10.0" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "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" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "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-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" + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "has": "^1.0.3" + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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-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" + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" } }, - "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 - }, - "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/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, - "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/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, - "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" + "node_modules/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", - "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 - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.topath": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", - "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", - "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 - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "engines": { + "node": ">=0.10.0" } }, - "minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "modern-normalize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", - "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", - "dev": true - }, - "nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", - "dev": true + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" + "node_modules/unist-util-find-after": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz", + "integrity": "sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node-releases": { + "node_modules/unist-util-generated": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true, - "peer": true - }, - "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 + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true, - "peer": true + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "dev": true + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" + "node_modules/unist-util-position-from-estree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", + "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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" + "node_modules/unist-util-remove": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-4.0.0.tgz", + "integrity": "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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" + "node_modules/unist-util-remove-position": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", + "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "node_modules/unist-util-remove-position/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "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/unist-util-remove/node_modules/@types/unist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz", + "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==" }, - "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 + "node_modules/unist-util-remove/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "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/unist-util-remove/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "postcss": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", - "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", - "dev": true, - "requires": { - "nanoid": "^3.2.0", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "postcss-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", - "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1", - "postcss": "^8.1.6" + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "postcss-load-config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", - "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" + "node_modules/unist-util-visit/node_modules/@types/unist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz", + "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==" + }, + "node_modules/unist-util-visit/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.6" + "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "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, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "engines": { + "node": ">= 4.0.0" } }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "purgecss": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.1.3.tgz", - "integrity": "sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==", - "dev": true, - "requires": { - "commander": "^8.0.0", - "glob": "^7.1.7", - "postcss": "^8.3.5", - "postcss-selector-parser": "^6.0.6" + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } }, - "quick-lru": { - "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 + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" + "node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "reduce-css-calc": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", - "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", - "dev": true, - "requires": { - "css-unit-converter": "^1.1.1", - "postcss-value-parser": "^3.3.0" + "node_modules/vfile-matter": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz", + "integrity": "sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==", + "dependencies": { + "@types/js-yaml": "^4.0.0", + "is-buffer": "^2.0.0", + "js-yaml": "^4.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter/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/vfile-matter/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": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "resolve": { - "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.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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 + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true + "node_modules/watchpack/node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, - "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" + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "run-parallel": { + "node_modules/web-worker": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "source-map-js": { + "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "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 + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, - "tailwindcss": { - "version": "2.2.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", - "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", - "dev": true, - "requires": { - "arg": "^5.0.1", - "bytes": "^3.0.0", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "color": "^4.0.1", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.7", - "fs-extra": "^10.0.0", - "glob-parent": "^6.0.1", - "html-tags": "^3.1.0", - "is-color-stop": "^1.1.0", - "is-glob": "^4.0.1", - "lodash": "^4.17.21", - "lodash.topath": "^4.5.2", - "modern-normalize": "^1.1.0", - "node-emoji": "^1.11.0", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss-js": "^3.0.3", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.6", - "postcss-value-parser": "^4.1.0", - "pretty-hrtime": "^1.0.3", - "purgecss": "^4.0.3", - "quick-lru": "^5.1.1", - "reduce-css-calc": "^2.1.8", - "resolve": "^1.20.0", - "tmp": "^0.2.1" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" } }, - "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" + "node_modules/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "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 + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/website/package.json b/website/package.json index 538d960cd..b39ce7d54 100644 --- a/website/package.json +++ b/website/package.json @@ -1,5 +1,19 @@ { + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "next": "^13.4.9", + "nextra": "^2.8.0", + "nextra-theme-docs": "^2.8.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwindcss": "^3.2.4" + }, "devDependencies": { - "tailwindcss": "^2.0" + "sync-directory": "^6.0.4" } } diff --git a/website/src/pages/_meta.json b/website/src/pages/_meta.json new file mode 100644 index 000000000..1b969d71f --- /dev/null +++ b/website/src/pages/_meta.json @@ -0,0 +1,26 @@ +{ + "index": { + "type": "page", + "title": "Bref", + "display": "hidden", + "theme": { + "layout": "raw" + } + }, + "docs": { + "type": "page", + "title": "Documentation" + }, + "news": { + "title": "News", + "type": "page", + "theme": { + "typesetting": "article" + } + }, + "dashboard": { + "title": "Dashboard", + "type": "page", + "href": "https://dashboard.bref.sh/" + } +} \ No newline at end of file diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx new file mode 100644 index 000000000..f4f73a85d --- /dev/null +++ b/website/src/pages/index.mdx @@ -0,0 +1,3 @@ +# Hello world + +Welcome to Bref. diff --git a/docs/news/01-bref-1.0.md b/website/src/pages/news/01-bref-1.0.md similarity index 97% rename from docs/news/01-bref-1.0.md rename to website/src/pages/news/01-bref-1.0.md index 7738dd06b..8b764a5a8 100644 --- a/docs/news/01-bref-1.0.md +++ b/website/src/pages/news/01-bref-1.0.md @@ -27,7 +27,7 @@ Thanks to [Bref ping](/docs/runtimes/#bref-ping), we have an anonymous estimate It illustrates clearly that Bref is getting traction and is used in production, at scale: -![](01/executions.png) +![](./01/executions.png) Since we passed 1 billion monthly invocations, I want to celebrate with you this fantastic milestone and thank you for being a part of Bref's community. @@ -109,7 +109,7 @@ New users now start with the _FPM_ runtime. Don't worry about FaaS and functions… Start by running **PHP as usual** on a cheap and scalable host. Then, **once you've had your first success**, you can look into the "Function runtime" and its power. -Check out [the "First steps" guide and see how simple it is!](/docs/first-steps.md). +Check out [the "First steps" guide and see how simple it is!](/docs/default/first-steps.md). ### Clarity for current users @@ -117,12 +117,12 @@ A common source of errors and confusion was the two runtimes: "FPM" and "Functio To solve that, we clarified the wording and the structure of the documentation: -- [**Bref for web apps**](/docs/runtimes/http.md) lets you run Laravel, Symfony, etc. on Lambda like on any server, using PHP-FPM (aka the "FPM" runtime), +- [**Bref for web apps**](/docs/web-apps/index.md) lets you run Laravel, Symfony, etc. on Lambda like on any server, using PHP-FPM (aka the "FPM" runtime), - [**Bref for event-driven functions**](/docs/runtimes/function.md) lets you handle native AWS Lambda events (aka the "Function" runtime). *Bref for web apps* is the default runtime (see the "onboarding" section above), so if you're not sure: go with this one. -[![](01/doc-menu.png)](/docs/runtimes/) +[![](./01/doc-menu.png)](/docs/runtimes/) ### More for expert users diff --git a/docs/news/01/doc-menu.png b/website/src/pages/news/01/doc-menu.png similarity index 100% rename from docs/news/01/doc-menu.png rename to website/src/pages/news/01/doc-menu.png diff --git a/docs/news/01/executions.png b/website/src/pages/news/01/executions.png similarity index 100% rename from docs/news/01/executions.png rename to website/src/pages/news/01/executions.png diff --git a/docs/news/02-bref-2.0.md b/website/src/pages/news/02-bref-2.0.md similarity index 94% rename from docs/news/02-bref-2.0.md rename to website/src/pages/news/02-bref-2.0.md index bef9f157d..8b4aac1c8 100644 --- a/docs/news/02-bref-2.0.md +++ b/website/src/pages/news/02-bref-2.0.md @@ -14,7 +14,7 @@ So far, Bref has been installed more than 2 million times and powers more than * That's [1 in every 1000 AWS Lambda executions](https://twitter.com/matthieunapoli/status/1603032544424894464)! -![](02/executions.png) +![](./02/executions.png) Today, we celebrate these achievements, the ongoing work, and **the release of Bref 2.0** 🎉 @@ -132,7 +132,7 @@ _Note that it is possible to stay on the 1.x version of the Laravel bridge._ Let's take the opportunity to send huge thanks to Till and George for building such an excellent integration, and for joining the Bref organization on GitHub 💙 -If you want to get started with Laravel on Bref, [check out the documentation](../frameworks/laravel.md). +If you want to get started with Laravel on Bref, [check out the documentation](../docs/frameworks/laravel.md). ## ARM/Graviton support @@ -199,7 +199,7 @@ Here are the commands that have changed: serverless bref:cli --args="migrate --force" ``` - No need to provide the function name or the region anymore. Read [the Console documentation](../runtimes/console.md#usage) to learn more. You will also find alternatives if you don't use the `serverless` CLI. + No need to provide the function name or the region anymore. Read [the Console documentation](../docs/runtimes/console.md#usage) to learn more. You will also find alternatives if you don't use the `serverless` CLI. - `vendor/bin/bref local` is replaced by the simpler `serverless bref:local`. @@ -213,7 +213,7 @@ Here are the commands that have changed: No need to provide the handler file name anymore, we directly use the function name. The new `serverless bref:local` command has similar arguments as `serverless invoke`. - Read [the Local Development documentation](../function/local-development.md) to learn more. You will also find alternatives if you don't use the `serverless` CLI. + Read [the Local Development documentation](../docs/function/local-development.md) to learn more. You will also find alternatives if you don't use the `serverless` CLI. - `vendor/bin/bref layers` is replaced by the simpler `serverless layers`. @@ -251,7 +251,7 @@ In the example above, `GITHUB_TOKEN` will be deployed with the string `bref-ssm: This offers a more secure solution for teams that prefer to keep secrets as tight as possible. -Read more about this new feature and secrets in general in the [Secrets documentation](../environment/variables.md#at-runtime). +Read more about this new feature and secrets in general in the [Secrets documentation](../docs/environment/variables.md#at-runtime). ## Simpler `docker-compose.yml` for local development @@ -300,7 +300,7 @@ services: DOCUMENT_ROOT: public ``` -The `bref/php-XX-fpm-dev` images can now run HTTP applications, console commands as well as event-driven functions too. Read more in [web app local development](../web-apps/local-development.md). +The `bref/php-XX-fpm-dev` images can now run HTTP applications, console commands as well as event-driven functions too. Read more in [web app local development](../docs/web-apps/local-development.md). The `bref/fpm-dev-gateway` image is no longer needed, and code running in `bref/php-XX-fpm-dev` now runs in an environment even closer to production. @@ -385,25 +385,25 @@ Thank you all! Hope you enjoy Bref v2! -There is a complete [**v2 Upgrade Guide**](../upgrading/v2.md) that you can follow. +There is a complete [**v2 Upgrade Guide**](../docs/upgrading/v2.md) that you can follow. -Head to the docs to [**get started with Bref**](../), or check out the documentation for [Laravel](../frameworks/laravel.md) or [Symfony](../frameworks/symfony.md). +Head to the docs to [**get started with Bref**](../), or check out the documentation for [Laravel](../docs/frameworks/laravel.md) or [Symfony](../docs/frameworks/symfony.md). You can also join the community [in Slack](/docs/community.md), post details about your project in [Built with Bref](https://github.com/brefphp/bref/issues/267), or share your experience online and mention [@brefphp](https://twitter.com/brefphp) on Twitter. If you enjoy teasers, here is a preview of a redesign coming soon to Bref: -
+
## One more thing I launched the [**Bref Dashboard**](https://dashboard.bref.sh/) ✨ in January. It helps you monitor and debug Bref applications: -[![Bref Dashboard](../monitoring/bref-dashboard.png)](https://dashboard.bref.sh/?ref=bref) +[![Bref Dashboard](../docs/monitoring/bref-dashboard.png)](https://dashboard.bref.sh/?ref=bref) And if you need support or help going serverless, check out the [Support Plans](/#ecosystem). diff --git a/docs/news/02/executions.png b/website/src/pages/news/02/executions.png similarity index 100% rename from docs/news/02/executions.png rename to website/src/pages/news/02/executions.png diff --git a/docs/news/02/logo.png b/website/src/pages/news/02/logo.png similarity index 100% rename from docs/news/02/logo.png rename to website/src/pages/news/02/logo.png diff --git a/docs/news/02/social-card.png b/website/src/pages/news/02/social-card.png similarity index 100% rename from docs/news/02/social-card.png rename to website/src/pages/news/02/social-card.png diff --git a/website/template/default.twig b/website/template/default.twig index b0f1e5747..1ae5940a8 100644 --- a/website/template/default.twig +++ b/website/template/default.twig @@ -15,7 +15,7 @@ class="hidden lg:inline-block text-blue-100 hover:text-white px-4 py-2 sm:mr-4"> Docs - @@ -52,7 +52,7 @@ Home
  • - News + News
  • Support diff --git a/website/template/home.twig b/website/template/home.twig index 7c2c4df41..907a7b993 100644 --- a/website/template/home.twig +++ b/website/template/home.twig @@ -26,7 +26,7 @@ class="inline-block text-blue-100 hover:text-white px-2 sm:px-4 py-2 mr-2 sm:mr-4"> Docs - News @@ -160,7 +160,7 @@

    - + 10 billion requests and jobs served using Bref every month

    diff --git a/website/template/news-article.twig b/website/template/news-article.twig index 00171bb21..af24f9292 100644 --- a/website/template/news-article.twig +++ b/website/template/news-article.twig @@ -20,7 +20,7 @@
    - +
    {{ content|raw }} diff --git a/website/template/news.twig b/website/template/news.twig index 27e93d9a3..a8d625961 100644 --- a/website/template/news.twig +++ b/website/template/news.twig @@ -15,7 +15,7 @@ class="inline-block text-blue-100 hover:text-white px-4 py-2 sm:mr-4"> Docs - News diff --git a/website/theme.config.jsx b/website/theme.config.jsx new file mode 100644 index 000000000..f85084e5d --- /dev/null +++ b/website/theme.config.jsx @@ -0,0 +1,10 @@ +// https://nextra.site/docs/docs-theme/theme-configuration +export default { + logo: bref, + project: { + link: 'https://github.com/brefphp/bref' + }, + sidebar: { + defaultMenuCollapseLevel: 1, + } +} From af5f68f49d56abef9ad42abd47120784d5564f34 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 10 Jul 2023 12:47:01 +0900 Subject: [PATCH 002/144] Deploy to Vercel --- docs/default/_meta.json | 2 +- docs/environment/custom-domains.md | 2 +- website/.gitignore | 2 ++ website/Makefile | 13 +++++++------ 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/default/_meta.json b/docs/default/_meta.json index a9eb218b4..1eedb9230 100644 --- a/docs/default/_meta.json +++ b/docs/default/_meta.json @@ -3,5 +3,5 @@ "index": "Web apps on AWS Lambda", "website-assets": "Website assets", "console": "Console commands", - "cron": "Cron commands", + "cron": "Cron commands" } \ No newline at end of file diff --git a/docs/environment/custom-domains.md b/docs/environment/custom-domains.md index 0e619f0b0..6474b5b36 100644 --- a/docs/environment/custom-domains.md +++ b/docs/environment/custom-domains.md @@ -33,7 +33,7 @@ After validating the domain and the certificate we can now link the custom domai - edit the domain that was created - click "Configure API mappings" to add an "API mapping": select your application and the `$default` stage (or `dev` in some cases), for example: - ![](custom-domains-path-mapping.png) + ![](./custom-domains-path-mapping.png) - after saving the "API mappings", find the `API Gateway domain name` in the "Configurations" tab - create a CNAME entry in your DNS to point your domain name to this domain diff --git a/website/.gitignore b/website/.gitignore index adf35b3a8..ed3513cc8 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -1 +1,3 @@ src/pages/docs +.next +.vercel diff --git a/website/Makefile b/website/Makefile index 56a72f089..9e7048247 100644 --- a/website/Makefile +++ b/website/Makefile @@ -1,14 +1,15 @@ -website-preview: node_modules - $(MAKE) website-preview-parallel-jobs -j2 -website-preview-parallel-jobs: website-live-sync-doc-files website-next-dev -website-live-sync-doc-files: +preview: node_modules + $(MAKE) preview-parallel-jobs -j2 +preview-parallel-jobs: live-sync-doc-files next-dev +live-sync-doc-files: npx sync-directory ../docs src/pages/docs --deleteOrphaned --watch -website-next-dev: +next-dev: npm run dev -# Generate and deploy the production version of the website using http://couscous.io +# Generate and deploy the production version of the website website: node_modules src/pages/docs npm run build + vercel deploy --prod src/pages/docs: cp -r ../docs src/pages/docs From a71ece653b8b1d9c1caef72faad63f5cc495da74 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 10 Jul 2023 14:41:24 +0900 Subject: [PATCH 003/144] Symfony documentation --- docs/laravel/caching.mdx | 2 +- docs/laravel/queues.mdx | 4 +- docs/symfony/_meta.json | 4 +- docs/symfony/caching.mdx | 23 ++ docs/symfony/getting-started.mdx | 74 ++---- docs/symfony/messenger.mdx | 384 +++++++++++++++++++++++++++++++ 6 files changed, 427 insertions(+), 64 deletions(-) create mode 100644 docs/symfony/caching.mdx create mode 100644 docs/symfony/messenger.mdx diff --git a/docs/laravel/caching.mdx b/docs/laravel/caching.mdx index b0cadf472..2c2f78746 100644 --- a/docs/laravel/caching.mdx +++ b/docs/laravel/caching.mdx @@ -2,7 +2,7 @@ By default, the Bref bridge will move Laravel's storage and cache directories to `/tmp`. This is because all the filesystem except `/tmp` is read-only. -Note that the `/tmp` directory isn't shared across Lambda instances. If you Lambda function scales up, the cache will be empty in new instances (or after a deployment). +However, the `/tmp` directory isn't shared across Lambda instances. If you Lambda function scales up or is redeployed, the cache will be empty in new instances. If you want the cache to be shared across all Lambda instances, for example if your application caches a lot of data or if you use it for locking mechanisms (like API rate limiting), you can instead use Redis or DynamoDB. diff --git a/docs/laravel/queues.mdx b/docs/laravel/queues.mdx index c9ec09730..8583119f4 100644 --- a/docs/laravel/queues.mdx +++ b/docs/laravel/queues.mdx @@ -20,9 +20,9 @@ First install the Lift plugin: serverless plugin install -n serverless-lift ``` -Then use the Queue construct in `serverless.yml`: +Then use [the Queue construct](https://github.com/getlift/lift/blob/master/docs/queue.md) in `serverless.yml`: -```yml +```yml filename="serverless.yml" provider: # ... environment: diff --git a/docs/symfony/_meta.json b/docs/symfony/_meta.json index 10d7eec57..747288829 100644 --- a/docs/symfony/_meta.json +++ b/docs/symfony/_meta.json @@ -1,6 +1,6 @@ { "getting-started": "Getting started", "assets": "Assets", - "file-storage": "", - "messenger": "Symfony Messenger" + "messenger": "Symfony Messenger", + "caching": "" } \ No newline at end of file diff --git a/docs/symfony/caching.mdx b/docs/symfony/caching.mdx new file mode 100644 index 000000000..bd872b370 --- /dev/null +++ b/docs/symfony/caching.mdx @@ -0,0 +1,23 @@ +import { Callout } from 'nextra/components'; + +# Caching + +As explained in the [Storage documentation](../environment/storage.md), the filesystem is readonly on AWS Lambda except for `/tmp`. + +However, the `/tmp` directory isn't shared across Lambda instances. If you Lambda function scales up or is redeployed, the cache will be empty in new instances. + +If you want the cache to be shared across all Lambda instances, for example if your application caches a lot of data or if you use it for locking mechanisms (like API rate limiting), you can instead use Redis or DynamoDB. + +DynamoDB is the easiest to set up and is "pay per use". Redis is a bit more complex as it requires a VPC and managing instances, but offers slightly faster response times. + +## DynamoDB Cache + +A Symfony bundle is available to use AWS DynamoDB as cache store: [rikudou/psr6-dynamo-db-bundle](https://github.com/RikudouSage/DynamoDbCachePsr6Bundle). Install the bundle with: + +```bash +composer require rikudou/psr6-dynamo-db-bundle +``` + +Thanks to Symfony Flex, the bundle comes pre-configured to run in Lambda. + +Now, you can follow [this section of the documentation](../environment/storage.md#deploying-dynamodb-tables) to deploy your DynamoDB table using the Serverless Framework. diff --git a/docs/symfony/getting-started.mdx b/docs/symfony/getting-started.mdx index 84868f988..763860158 100644 --- a/docs/symfony/getting-started.mdx +++ b/docs/symfony/getting-started.mdx @@ -96,13 +96,11 @@ TODO ## Logs -By default, Symfony logs in `stderr`. That is great because Bref [automatically forwards `stderr` to AWS CloudWatch](/docs/environment/logs.md). +By default, Symfony logs to `stderr`. That is great because Bref [automatically forwards `stderr` to AWS CloudWatch](/docs/environment/logs.md). -However, if the application is using Monolog you need to configure it to log into `stderr` as well: - -```yaml -# config/packages/prod/monolog.yaml +However, if your application is using Monolog, you need to configure it to log to `stderr` as well: +```yml filename="config/packages/prod/monolog.yaml" {6} monolog: handlers: # ... @@ -111,35 +109,15 @@ monolog: path: php://stderr ``` -## Environment variables - -Since Symfony 4, the production parameters are configured through environment variables. You can define them in `serverless.yml`. - -```yaml -# serverless.yml - -provider: - environment: - APP_ENV: prod -``` - -The secrets (e.g. database passwords) must however not be committed in this file. - -To learn more about all this, read the [environment variables documentation](/docs/environment/variables.md). - ## Trust API Gateway -When hosting your site on Lambda, API Gateway will act as a proxy between the client and your function. - -By default, Symfony doesn't trust proxies for security reasons, but it's safe to do it when using API Gateway and Lambda. +When hosting a website on Lambda, API Gateway acts as a proxy between the client and your Lambda function. -This is needed because otherwise, Symfony will not be able to generate URLs properly. +By default, Symfony doesn't trust proxies for security reasons, but it's safe to do it when using API Gateway and Lambda. This is needed because otherwise, Symfony will not be able to generate URLs properly. -You should add the following lines to `config/packages/framework.yaml` - -```yaml -# config/packages/framework.yaml +Add the following lines to `config/packages/framework.yaml`: +```yml filename="config/packages/framework.yaml" {2-5} framework: # trust the remote address because API Gateway has no fixed IP or CIDR range that we can target trusted_proxies: '127.0.0.1' @@ -149,47 +127,25 @@ framework: Note that API Gateway doesn't set the `X-Forwarded-Host` header, so we don't trust it by default. You should only whitelist this header if you set it manually, for example in your CloudFront configuration (this is done automatically -in [the Cloudfront distribution deployed by Lift](#assets)). - -> Be careful with these settings if your app will not be executed only in a Lambda environment. +in [the Cloudfront distribution deployed by Lift](./assets.mdx)). You can get more details in the [Symfony documentation](https://symfony.com/doc/current/deployment/proxies.html). + + Be careful with these settings if your app is also executed outside a Lambda environment (for example on a public server). + + ### Getting the user IP -**When using CloudFront** on top of API Gateway, you will not be able to retrieve the client IP address, and you will instead get one of Cloudfront's IP when +**When using CloudFront** on top of API Gateway, you will not be able to retrieve the client IP address, and you will instead get one of CloudFront's IP when calling `Request::getClientIp()`. If you really need this, you will need to whitelist [every CloudFront IP](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html) in `trusted_proxies`. -## Symfony Messenger - -It is possible to run Symfony Messenger workers on AWS Lambda. - -A dedicated Bref package is available for this: [bref/symfony-messenger](https://github.com/brefphp/symfony-messenger). - -## Caching - -As mentioned above the filesystem is readonly, so if you need a persistent cache it must be stored somewhere else (such as Redis, an RDBMS, or DynamoDB). - -### Using DynamoDB for cache - -A Symfony bundle is available to use AWS DynamoDB as cache store: [rikudou/psr6-dynamo-db-bundle](https://github.com/RikudouSage/DynamoDbCachePsr6Bundle) - -First install the bundle - -```bash -composer require rikudou/psr6-dynamo-db-bundle -``` - -Thanks to Symfony Flex, the bundle comes pre-configured to run in Lambda. - -Now, you can follow [this section of the documentation](/docs/environment/storage.md#deploying-dynamodb-tables) to deploy your DynamoDB table using the Serverless Framework. - -## The `kernel.terminate` Event +## The `kernel.terminate` event The [`kernel.terminate` event](https://symfony.com/doc/current/components/http_kernel.html#component-http-kernel-kernel-terminate) runs **synchronously** on Lambda. That means that if you use this event, its listeners will be executed **before** the Lambda function returns its response. That will add latency to your response. -To run asynchronous tasks, use the [Messenger component](#symfony-messenger) instead. +To run asynchronous tasks, use the [Symfony Messenger](./messenger.mdx) instead. diff --git a/docs/symfony/messenger.mdx b/docs/symfony/messenger.mdx new file mode 100644 index 000000000..1fb2c9038 --- /dev/null +++ b/docs/symfony/messenger.mdx @@ -0,0 +1,384 @@ +import { Callout } from 'nextra/components'; + +export const introduction = 'Run Symfony Messenger on AWS Lambda with SQS using Bref.'; + +# Symfony Messenger + +Symfony Messenger messages can be dispatched to **SQS, SNS, or EventBridge**, while workers handle those messages on AWS Lambda. + +## Installation + +This guide assumes that: + +- Symfony and [Symfony Messenger are installed](https://symfony.com/doc/current/messenger.html#installation) +- Bref is [installed and set up with Symfony](./getting-started.mdx) + +First, install the Bref-Symfony messenger integration: + +```bash +composer require bref/symfony-messenger +``` + +Next, register the bundle in `config/bundles.php`: + +```php filename="config/bundles.php" {3} +return [ + // ... + Bref\Symfony\Messenger\BrefMessengerBundle::class => ['all' => true], +]; +``` + +SQS, SNS, and EventBridge can now be used with Symfony Messenger. + +## Usage + +Symfony Messenger dispatches messages. To create a message, follow the [Symfony Messenger documentation](https://symfony.com/doc/current/messenger.html#creating-a-message-handler). + +To configure **where** messages are dispatched, all the examples in this documentation are based on [the example from the Symfony documentation](https://symfony.com/doc/current/messenger.html#transports-async-queued-messages): + +```yml filename="config/packages/messenger.yaml" +framework: + messenger: + transports: + async: '%env(MESSENGER_TRANSPORT_DSN)%' + routing: + 'App\Message\MyMessage': async +``` + +## SQS + +The [SQS](https://aws.amazon.com/sqs/) service is a queue that is similar to RabbitMQ. To use it, set its URL in the environment variable `MESSENGER_TRANSPORT_DSN`: + +```yml filename="serverless.yml" {4} +provider: + name: aws + environment: + MESSENGER_TRANSPORT_DSN: https://sqs.us-east-1.amazonaws.com/123456789/my-queue +``` + +The implementation uses the SQS transport provided by [Symfony Amazon SQS Messenger](https://symfony.com/doc/current/messenger.html#amazon-sqs), so all its features are supported. If you already use that transport, the transition to AWS Lambda should not require any change for dispatching messages. + +However, instead of creating the SQS queue and the worker manually, you can use the [Serverless Lift](https://github.com/getlift/lift) plugin. + +First install the Lift plugin: + +```bash +serverless plugin install -n serverless-lift +``` + +Then use [the Queue construct](https://github.com/getlift/lift/blob/master/docs/queue.md) in `serverless.yml` to create a queue and a worker: + +```yml filename="serverless.yml" +provider: + # ... + environment: + # ... + MESSENGER_TRANSPORT_DSN: ${construct:jobs.queueUrl} + +functions: + # ... + +constructs: + jobs: + type: queue + worker: + handler: bin/consumer.php + runtime: php-81 + timeout: 60 # in seconds +``` + +You will want to disable `auto_setup` to avoid extra SQS requests and permission issues. + +```yml filename="config/packages/messenger.yaml" {6-7} +framework: + messenger: + transports: + async: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + auto_setup: false +``` + +With that configuration, anytime a message is pushed to Symfony Messenger, it will be sent to SQS, and SQS will invoke our "worker" Lambda function so that it is processed. + + + With Lift, AWS credentials (`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`) are automatically set up with the appropriate permissions for Messenger to use the SQS queue. + + +We now need to create the handler script (`bin/consumer.php`): + +```php filename="bin/consumer.php" +bootEnv(dirname(__DIR__).'/.env'); + +$kernel = new \App\Kernel($_SERVER['APP_ENV'], (bool)$_SERVER['APP_DEBUG']); +$kernel->boot(); + +// Return the Bref consumer service +return $kernel->getContainer()->get(SqsConsumer::class); +``` + +Finally, register and configure the `SqsConsumer` service: + +```yml filename="config/services.yaml" +services: + Bref\Symfony\Messenger\Service\Sqs\SqsConsumer: + public: true + autowire: true + arguments: + # Pass the transport name used in config/packages/messenger.yaml + $transportName: 'async' + $partialBatchFailure: true +``` + +### Error handling + +AWS Lambda has error handling mechanisms (retrying and handling failed messages). Because of that, this package does not integrate Symfony Messenger's retry mechanism. Instead, it works with Lambda's retry mechanism. + +With the default Lift configuration, failed messages will be retried 3 times. You can configure this, [learn more](https://github.com/getlift/lift/blob/master/docs/queue.md#retries). + +When using SNS and EventBridge, messages will be retried by default 2 times. + +### FIFO queue + +[FIFO queues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html) guarantee +exactly once delivery, and have a mandatory queue name suffix `.fifo`. + +With Lift, [set `fifo: true`](https://github.com/getlift/lift/blob/master/docs/queue.md#fifo-first-in-first-out) to enable it: + +```yml filename="serverless.yml" {4} +constructs: + my-queue: + # ... + fifo: true +``` + +[Symfony Amazon SQS Messenger](https://symfony.com/doc/current/messenger.html#amazon-sqs) will automatically calculate/set +the `MessageGroupId` and `MessageDeduplicationId` parameters required for FIFO queues, but you can set them explicitly: + +```php +use Symfony\Component\Messenger\MessageBus; +use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsFifoStamp; + +/* @var MessageBus $messageBus */ +$messageBus->dispatch(new MyAsyncMessage(), [ + new AmazonSqsFifoStamp('my-group-message-id', 'my-deduplication-id'), +]); +``` +Everything else is identical to the normal SQS queue. + +## SNS + +AWS [SNS](https://aws.amazon.com/sns) is "notification" instead of "queues". Messages may not arrive in the same order as sent, and they might arrive all at once. To use it, create an SNS topic and set it as the DSN: + +```dotenv +MESSENGER_TRANSPORT_DSN=sns://arn:aws:sns:us-east-1:1234567890:foobar +``` + +That's it, messages will be dispatched to that topic. + + + When running Symfony on AWS Lambda, it is not necessary to configure credentials. The AWS client will read them [from environment variables](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime) automatically. + + +To consume messages from SNS: + +1. Create the function that will be invoked by SNS in `serverless.yml`: + +```yml filename="serverless.yml" +functions: + worker: + handler: bin/consumer.php + timeout: 20 # in seconds + runtime: php-81 + events: + # Read more at https://www.serverless.com/framework/docs/providers/aws/events/sns/ + - sns: + arn: arn:aws:sns:us-east-1:1234567890:my_sns_topic +``` + +2. Create the handler script (for example `bin/consumer.php`): + +```php filename="bin/consumer.php" +bootEnv(dirname(__DIR__).'/.env'); + +$kernel = new \App\Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$kernel->boot(); + +// Return the Bref consumer service +return $kernel->getContainer()->get(SnsConsumer::class); +``` + +3. Register and configure the `SnsConsumer` service: + +```yml filename="config/services.yaml" +services: + Bref\Symfony\Messenger\Service\Sns\SnsConsumer: + public: true + autowire: true + arguments: + # Pass the transport name used in config/packages/messenger.yaml + $transportName: 'async' +``` + +Now, anytime a message is dispatched to SNS, the Lambda function will be called. The Bref consumer class will put back the message into Symfony Messenger to be processed. + +### Error handling + +AWS Lambda has error handling mechanisms (retrying and handling failed messages). Because of that, this package does not integrate Symfony Messenger's retry mechanism. Instead, it works with Lambda's retry mechanism. + +By default, Lambda will retry failed messages 2 times. + +## EventBridge + +AWS [EventBridge](https://aws.amazon.com/eventbridge/) is a message routing service. It is similar to SNS, but more powerful for communication between microservices. + +To use it, configure the DSN like so: + +```dotenv +# "myapp" is the EventBridge "source", i.e. a namespace for your application's messages +# This source name will be reused in `serverless.yml` later. +MESSENGER_TRANSPORT_DSN=eventbridge://myapp +``` +Optionally you can add set the [EventBusName](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEventsRequestEntry.html#eventbridge-Type-PutEventsRequestEntry-EventBusName) via a `event_bus_name` query parameter, either the name or the ARN: + +```dotenv +MESSENGER_TRANSPORT_DSN=eventbridge://myapp?event_bus_name=custom-bus +MESSENGER_TRANSPORT_DSN=eventbridge://myapp?event_bus_name=arn:aws:events:us-east-1:123456780912:event-bus/custom-bus +``` + +That's it, messages will be dispatched to EventBridge. + + + When running Symfony on AWS Lambda, it is not necessary to configure credentials. The AWS client will read them [from environment variables](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime) automatically. + + +To consume messages from EventBridge: + +1. Create the function that will be invoked by EventBridge in `serverless.yml`: + +```yml filename="serverless.yml" +functions: + worker: + handler: bin/consumer.php + timeout: 20 # in seconds + runtime: php-81 + events: + # Read more at https://www.serverless.com/framework/docs/providers/aws/events/event-bridge/ + - eventBridge: + # In case of you change bus name in config/packages/messenger.yaml (i.e eventbridge://myapp?event_bus_name=custom-bus) you need to set bus name like below + # eventBus: custom-bus + # This filters events we listen to: only events from the "myapp" source. + # This should be the same source defined in config/packages/messenger.yaml + pattern: + source: + - myapp +``` + +2. Create the handler script (for example `bin/consumer.php`): + +```php filename="bin/consumer.php" +bootEnv(dirname(__DIR__).'/.env'); + +$kernel = new \App\Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$kernel->boot(); + +// Return the Bref consumer service +return $kernel->getContainer()->get(EventBridgeConsumer::class); +``` + +3. Register and configure the `EventBridgeConsumer` service: + +```yml filename="config/services.yaml" +services: + Bref\Symfony\Messenger\Service\EventBridge\EventBridgeConsumer: + public: true + autowire: true + arguments: + # Pass the transport name used in config/packages/messenger.yaml + $transportName: 'async' + # Optionnally, if you have different buses in config/packages/messenger.yaml, set $bus like below: + # $bus: '@event.bus' +``` + +Now, anytime a message is dispatched to EventBridge for that source, the Lambda function will be called. The Bref consumer class will put back the message into Symfony Messenger to be processed. + +### Error handling + +AWS Lambda has error handling mechanisms (retrying and handling failed messages). Because of that, this package does not integrate Symfony Messenger's retry mechanism. Instead, it works with Lambda's retry mechanism. + +By default, Lambda will retry failed messages 2 times. + +## Configuration + +### Configuring AWS clients + +By default, AWS clients (SQS, SNS, EventBridge) are preconfigured to work on AWS Lambda (thanks to [environment variables populated by AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime)). + +However, it is possible customize the AWS clients, for example to use them outside of AWS Lambda (locally, on EC2…) or to mock them in tests. These clients are registered as Symfony services under the keys: + +- `bref.messenger.sqs_client` +- `bref.messenger.sns_client` +- `bref.messenger.eventbridge_client` + +For example to customize the SQS client: + +```yml +services: + bref.messenger.sqs_client: + class: AsyncAws\Sqs\SqsClient + public: true # the AWS clients must be public + arguments: + # Apply your own config here + - + region: us-east-1 +``` + +### Disabling transports + +By default, this package registers Symfony Messenger transports for SQS, SNS and EventBridge. + +If you want to disable some transports (for example in case of conflict), you can remove `BrefMessengerBundle` from `config/bundles.php` and reconfigure the transports you want in your application's config. Take a look at [`Resources/config/services.yaml`](Resources/config/services.yaml) to copy the part that you want. + +### Customizing the serializer + +If you want to change how messages are serialized, for example to use [Happyr message serializer](https://github.com/Happyr/message-serializer), you need to add the serializer on both the transport and the consumer. For example: + +```yaml +# config/packages/messenger.yaml +framework: + messenger: + transports: + async: + dsn: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue' + serializer: 'Happyr\MessageSerializer\Serializer' + +# config/services.yaml +services: + Bref\Symfony\Messenger\Service\Sqs\SqsConsumer: + public: true + autowire: true + arguments: + $transportName: 'async' + $serializer: '@Happyr\MessageSerializer\Serializer' +``` From d54a4e5cf13818b549fba5fea948cff28dda345a Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 11 Jul 2023 00:06:25 +0900 Subject: [PATCH 004/144] Custom CSS and font --- website/package-lock.json | 322 +++++++++++++++++++++++++++++++------ website/package.json | 8 +- website/postcss.config.js | 6 + website/src/pages/_app.jsx | 5 + website/styles/main.css | 7 + website/tailwind.config.js | 73 +-------- website/theme.config.jsx | 26 +++ 7 files changed, 328 insertions(+), 119 deletions(-) create mode 100644 website/postcss.config.js create mode 100644 website/src/pages/_app.jsx create mode 100644 website/styles/main.css diff --git a/website/package-lock.json b/website/package-lock.json index a91efe894..eb657d599 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,17 +9,20 @@ "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", "react": "^18.2.0", - "react-dom": "^18.2.0", - "tailwindcss": "^3.2.4" + "react-dom": "^18.2.0" }, "devDependencies": { - "sync-directory": "^6.0.4" + "autoprefixer": "^10.4.14", + "postcss": "^8.4.25", + "sync-directory": "^6.0.4", + "tailwindcss": "^3.3.2" } }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, "engines": { "node": ">=10" }, @@ -62,6 +65,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -75,6 +79,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -83,6 +88,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -90,12 +96,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -104,7 +112,8 @@ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true }, "node_modules/@mdx-js/mdx": { "version": "2.3.0", @@ -498,6 +507,7 @@ "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" @@ -510,6 +520,7 @@ "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" } @@ -518,6 +529,7 @@ "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" @@ -697,12 +709,14 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -733,7 +747,8 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true }, "node_modules/argparse": { "version": "1.0.10", @@ -751,6 +766,39 @@ "astring": "bin/astring" } }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -763,12 +811,14 @@ "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==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, "engines": { "node": ">=8" } @@ -777,6 +827,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -786,6 +837,7 @@ "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" }, @@ -793,6 +845,38 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -814,6 +898,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, "engines": { "node": ">= 6" } @@ -907,6 +992,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, "funding": [ { "type": "individual", @@ -992,7 +1078,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/cose-base": { "version": "1.0.3", @@ -1016,6 +1103,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -1514,7 +1602,8 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true }, "node_modules/diff": { "version": "5.1.0", @@ -1527,13 +1616,20 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true }, "node_modules/dompurify": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.3.tgz", "integrity": "sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==" }, + "node_modules/electron-to-chromium": { + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "dev": true + }, "node_modules/elkjs": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", @@ -1556,6 +1652,15 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -1697,6 +1802,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1712,6 +1818,7 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -1720,6 +1827,7 @@ "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" }, @@ -1737,6 +1845,19 @@ "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz", "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -1754,12 +1875,14 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -1772,7 +1895,8 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "node_modules/get-stream": { "version": "3.0.0", @@ -1808,6 +1932,7 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1827,6 +1952,7 @@ "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" }, @@ -1863,6 +1989,7 @@ "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" }, @@ -2067,6 +2194,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2075,7 +2203,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/inline-style-parser": { "version": "0.1.1", @@ -2134,6 +2263,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2167,6 +2297,7 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -2195,6 +2326,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2203,6 +2335,7 @@ "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" }, @@ -2223,6 +2356,7 @@ "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" } @@ -2315,6 +2449,7 @@ "version": "1.19.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -2395,6 +2530,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, "engines": { "node": ">=10" } @@ -2402,7 +2538,8 @@ "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==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/lodash": { "version": "4.17.21", @@ -2808,6 +2945,7 @@ "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" } @@ -3545,6 +3683,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -3557,6 +3696,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3581,6 +3721,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -3693,6 +3834,29 @@ "react-dom": "*" } }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/nextra": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/nextra/-/nextra-2.9.0.tgz", @@ -3757,6 +3921,12 @@ "react-dom": ">=16.13.1" } }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", @@ -3766,6 +3936,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3785,6 +3965,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3793,6 +3974,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, "engines": { "node": ">= 6" } @@ -3801,6 +3983,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -3882,6 +4065,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3897,7 +4081,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==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/periscopic": { "version": "3.1.0", @@ -3918,6 +4103,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -3929,6 +4115,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3937,14 +4124,16 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, "engines": { "node": ">= 6" } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz", + "integrity": "sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==", + "dev": true, "funding": [ { "type": "opencollective", @@ -3953,10 +4142,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -3968,6 +4161,7 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -3984,6 +4178,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, "dependencies": { "lilconfig": "^2.0.5", "yaml": "^2.1.1" @@ -4012,6 +4207,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -4030,6 +4226,7 @@ "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -4041,7 +4238,8 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/property-information": { "version": "6.2.0", @@ -4066,6 +4264,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -4108,6 +4307,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -4127,6 +4327,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -4310,6 +4511,7 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -4326,6 +4528,7 @@ "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" @@ -4340,6 +4543,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -4581,6 +4785,7 @@ "version": "3.32.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -4602,6 +4807,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, "engines": { "node": ">= 6" } @@ -4621,6 +4827,7 @@ "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, "engines": { "node": ">= 0.4" }, @@ -4657,6 +4864,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -4694,6 +4902,7 @@ "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" }, @@ -4701,37 +4910,11 @@ "node": ">=10.13.0" } }, - "node_modules/tailwindcss/node_modules/postcss": { - "version": "8.4.25", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz", - "integrity": "sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/tailwindcss/node_modules/postcss-js": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -4750,6 +4933,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -4758,6 +4942,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -4796,6 +4981,7 @@ "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" }, @@ -4832,7 +5018,8 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true }, "node_modules/tslib": { "version": "2.6.0", @@ -5095,10 +5282,41 @@ "node": ">= 4.0.0" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/uuid": { "version": "9.0.0", @@ -5251,7 +5469,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/yallist": { "version": "2.1.2", @@ -5262,6 +5481,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, "engines": { "node": ">= 14" } diff --git a/website/package.json b/website/package.json index b39ce7d54..7cfceef47 100644 --- a/website/package.json +++ b/website/package.json @@ -10,10 +10,12 @@ "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", "react": "^18.2.0", - "react-dom": "^18.2.0", - "tailwindcss": "^3.2.4" + "react-dom": "^18.2.0" }, "devDependencies": { - "sync-directory": "^6.0.4" + "autoprefixer": "^10.4.14", + "postcss": "^8.4.25", + "sync-directory": "^6.0.4", + "tailwindcss": "^3.3.2" } } diff --git a/website/postcss.config.js b/website/postcss.config.js new file mode 100644 index 000000000..33ad091d2 --- /dev/null +++ b/website/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/website/src/pages/_app.jsx b/website/src/pages/_app.jsx new file mode 100644 index 000000000..39b53900c --- /dev/null +++ b/website/src/pages/_app.jsx @@ -0,0 +1,5 @@ +import '../../styles/main.css'; + +export default function MyApp({ Component, pageProps }) { + return +} diff --git a/website/styles/main.css b/website/styles/main.css new file mode 100644 index 000000000..ccc6c704f --- /dev/null +++ b/website/styles/main.css @@ -0,0 +1,7 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + font-family: "Inter var", system-ui, sans-serif; +} diff --git a/website/tailwind.config.js b/website/tailwind.config.js index 727e53ba3..1cb95e792 100644 --- a/website/tailwind.config.js +++ b/website/tailwind.config.js @@ -1,44 +1,18 @@ -const colors = require('tailwindcss/colors') +const defaultTheme = require('tailwindcss/defaultTheme'); +/** @type {import('tailwindcss').Config} */ module.exports = { - purge: [ - './template/**/*.twig', - './template/**/*.css', - './template/**/*.js', - '../docs/**/*.md', + content: [ + './*.{js,ts,jsx,tsx,md,mdx}', + './src/**/*.{js,ts,jsx,tsx,md,mdx}', ], + darkMode: 'class', theme: { fontFamily: { - 'sans': ['Open Sans', 'system-ui', 'BlinkMacSystemFont', '-apple-system', 'Helvetica Neue', 'sans-serif'], - 'title': ['Poppins', 'system-ui', 'BlinkMacSystemFont', '-apple-system', 'Helvetica Neue', 'sans-serif'], - 'bref': ['Dosis', 'Helvetica Neue', 'sans-serif'], - 'mono': ['Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'], - }, - fontWeight: { - // 'hairline': 100, - // 'thin': 200, - 'light': 300, - 'normal': 400, - // 'medium': 500, - 'semibold': 600, - 'bold': 700, - // 'extrabold': 800, - // 'black': 900, + sans: ['"Inter var"', ...defaultTheme.fontFamily.sans], }, extend: { colors: { - orange: colors.orange, - gray: { - 100: '#f7fafc', - 200: '#edf2f7', - 300: '#e2e8f0', - 400: '#cbd5e0', - 500: '#a0aec0', - 600: '#718096', - 700: '#4a5568', - 800: '#2d3748', - 900: '#1a202c', - }, blue: { 900: '#25516A', 800: '#266488', @@ -50,38 +24,7 @@ module.exports = { 200: '#BBE4FB', 100: '#EBF8FF', }, - 'green': { - 50: '#F2FCF9', - 100: '#E6F8F4', - 200: '#BFEEE3', - 300: '#99E3D1', - 400: '#4DCFAF', - 500: '#00BA8D', - 600: '#00A77F', - 700: '#007055', - 800: '#00543F', - 900: '#00382A', - }, - 'red': { - 50: '#FFF8F7', - 100: '#FFF1F0', - 200: '#FFDDD9', - 300: '#FFC8C2', - 400: '#FF9F94', - 500: '#FF7666', - 600: '#E66A5C', - 700: '#99473D', - 800: '#73352E', - 900: '#4D231F', - }, }, - fontSize: { - '40px': ['40px', '60px'], - }, - maxWidth: { - '700px': '700px', - }, - } + }, }, - variants: {}, }; diff --git a/website/theme.config.jsx b/website/theme.config.jsx index f85084e5d..eefc8172a 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -4,7 +4,33 @@ export default { project: { link: 'https://github.com/brefphp/bref' }, + chat: { + link: 'https://twitter.com/brefphp', + icon: ( + + + + ) + }, + primaryHue: 202, sidebar: { defaultMenuCollapseLevel: 1, + }, + head: ( + <> + + + ), + components: { + // https://github.com/shuding/nextra/blob/main/packages/nextra-theme-docs/src/mdx-components.tsx + h1: props => ( +

    + ), } } From 5bc0d2dece357ef6b431579f9e431ea665a751a8 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 12 Jul 2023 12:38:39 +0900 Subject: [PATCH 005/144] Docs: Deployment --- docs/_meta.json | 2 +- docs/default/first-steps.md | 2 +- docs/{deploy.md => deploy.mdx} | 54 +++++++++++++++----- docs/environment/database-planetscale.md | 2 +- docs/environment/serverless-yml.md | 2 +- docs/setup.mdx | 13 +++-- website/src/components/icons/LaravelIcon.jsx | 6 +++ website/src/components/icons/SymfonyIcon.jsx | 8 +++ 8 files changed, 66 insertions(+), 23 deletions(-) rename docs/{deploy.md => deploy.mdx} (53%) create mode 100644 website/src/components/icons/LaravelIcon.jsx create mode 100644 website/src/components/icons/SymfonyIcon.jsx diff --git a/docs/_meta.json b/docs/_meta.json index b01c7f77b..6c7b7bbb5 100644 --- a/docs/_meta.json +++ b/docs/_meta.json @@ -12,7 +12,7 @@ "type": "separator", "title": "Workflow" }, - "deploy": "", + "deploy": "Deployment", "local-development": "", "monitoring": "", "docker": "Deploying with Docker", diff --git a/docs/default/first-steps.md b/docs/default/first-steps.md index bdac7d219..e466de161 100644 --- a/docs/default/first-steps.md +++ b/docs/default/first-steps.md @@ -55,7 +55,7 @@ Open this URL and you should see your application: `index.php` is running on Lam 🎉 congrats on creating your first serverless application! -To learn more about deployments, head over the [Deployment guide](../deploy.md). +To learn more about deployments, head over the [Deployment guide](../deploy.mdx). ## What's next? diff --git a/docs/deploy.md b/docs/deploy.mdx similarity index 53% rename from docs/deploy.md rename to docs/deploy.mdx index 35af31ee2..6dde9bb39 100644 --- a/docs/deploy.md +++ b/docs/deploy.mdx @@ -1,21 +1,24 @@ ---- -title: Deployment -current_menu: deploy ---- +import { Callout } from 'nextra/components'; -Bref recommends using [the Serverless framework](https://serverless.com/) to deploy your serverless application. This page will show you how. +# Deployment + +Bref is designed out of the box to deploy using [the Serverless Framework](https://serverless.com/). + +Bref can also work with any other deployment tool: Terraform, CloudFormation, SAM, [AWS CDK](https://github.com/brefphp/constructs), Pulumi… However, the documentation and user experience is optimized for Serverless Framework. ## Deploying manually -To deploy an application configured with `serverless.yml` to AWS, run: +To deploy to AWS an application configured with `serverless.yml`, run: ```bash serverless deploy ``` -> A `.serverless/` directory will be created. You can add it to `.gitignore`. -> -> Want to get an overview of your deployed application? Check out the [Bref Dashboard](https://dashboard.bref.sh/?ref=bref). +A `.serverless/` directory will be created. You can add it to `.gitignore`. + + + Want to get an overview of your deployed application? Check out the [Bref Dashboard](https://dashboard.bref.sh/?ref=bref). + ## Deploying for production @@ -57,7 +60,7 @@ It is possible to deploy different stages in different AWS accounts (to lock dow ## Automating deployments -If you are using Gitlab CI, Travis CI, CircleCI or any tool of the sort you will want to automate the deployment to something like this: +If you are using GitHub Actions, Gitlab CI, CircleCI, or any tool of the sort you will want to automate the deployment to something like this: ```bash # Install Composer dependencies optimized for production @@ -87,7 +90,11 @@ provider: ... ``` -> If you are a first time user, using the `us-east-1` region (the default region) is recommended for the first projects. It simplifies commands and avoids a lot of mistakes when discovering AWS. + + If you are a first time user, using the `us-east-1` region (the default region) is recommended for the first projects. It simplifies commands and avoids a lot of mistakes when discovering AWS. + + I mean really… I can't count how many times a command failed or an AWS page looked empty because I was in the wrong region. + ## Deletion @@ -97,23 +104,42 @@ To delete the whole application you can run: serverless remove ``` +Note that this command, like `serverless deploy`, is for a specific stage. If you want to delete all stages you will have to run the command once per stage. + ## How it works ### CloudFormation stacks -The `serverless deploy` command will deploy everything via a **[CloudFormation](https://aws.amazon.com/cloudformation/) stack**. A stack is nothing more than a bunch of things that compose an application: +The `serverless deploy` command will deploy everything via a **[CloudFormation](https://aws.amazon.com/cloudformation/) stack**. A "stack" is nothing more than a bunch of things that compose an application: - lambda functions - S3 buckets - databases +- etc. Stacks make it easy to group those resources together: the whole stack is updated at once on deployments, and if you delete the stack all the resources inside are deleted together too. Clean and simple. -All of this is great except CloudFormation configuration is complex. This is where *Serverless* helps. +All of this is great except CloudFormation configuration is complex. This is where Serverless Framework helps. + +### Zero-downtime deployments + +CloudFormation deploys using the [blue/green deployment strategy](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html). + +This means that when you deploy, a new version of your code is deployed alongside the old one. Once the new version is ready, the traffic switches to the new version. If the deployment fails at any point, the traffic stays on the old version. + +#### Limits to blue/green deployment + +As soon as you introduce **asynchronous behaviors** (e.g. background jobs with SQS, event-driven microservices…) you may have in-flight messages (SQS jobs, EventBridge events…) created by the old version of your code that will be processed by the new version of your code. + +Code that handles asynchronous events must be able to handle messages created by older versions of the code. + +#### Database migrations + +Zero-downtime deployments mean that database migrations must run when code is running in production. That means either before or after the deployment (traffic switch) happens, and having a DB migration strategy compatible with that. ### `serverless.yml` -The *Serverless* framework offers a simple configuration format. This is what you are using if you use Bref. That configuration is written in your project in a `serverless.yml` file. +Serverless Framework offers a simple configuration format. This is what you are using if you use Bref. That configuration is written in your project in a `serverless.yml` file. You can [learn more about that configuration format here](environment/serverless-yml.md). diff --git a/docs/environment/database-planetscale.md b/docs/environment/database-planetscale.md index 8fd08eb2f..c2f016361 100644 --- a/docs/environment/database-planetscale.md +++ b/docs/environment/database-planetscale.md @@ -250,7 +250,7 @@ To deploy DB migrations in production, you can work with two environments: - A **production** environment: our application deployed in the `prod` stage and configured to use the `production` PlanetScale branch. - A **dev** environment: our application deployed in the `dev` stage and configured to use the `development` PlanetScale branch. -You can [deploy our applications to different stages](../deploy.md#stages) via the `--stage` option. Each stage is completely isolated from the others. +You can [deploy our applications to different stages](../deploy.mdx#stages) via the `--stage` option. Each stage is completely isolated from the others. ```bash # Deploy the "dev" environment: diff --git a/docs/environment/serverless-yml.md b/docs/environment/serverless-yml.md index 6e43f952a..c4530a930 100644 --- a/docs/environment/serverless-yml.md +++ b/docs/environment/serverless-yml.md @@ -40,7 +40,7 @@ service: app The [service](https://serverless.com/framework/docs/providers/aws/guide/services/) is simply the name of your project. -Since Serverless lets us deploy a project in [multiple stages](../deploy.md#stages) (prod, dev, staging…), CloudFormation stacks will contain both the service name and the stage: `app-prod`, `app-dev`, etc. +Since Serverless lets us deploy a project in [multiple stages](../deploy.mdx#stages) (prod, dev, staging…), CloudFormation stacks will contain both the service name and the stage: `app-prod`, `app-dev`, etc. ## Provider diff --git a/docs/setup.mdx b/docs/setup.mdx index c42c5a150..2c6c88378 100644 --- a/docs/setup.mdx +++ b/docs/setup.mdx @@ -1,6 +1,9 @@ import { Steps } from 'nextra/components'; import { Callout } from 'nextra/components'; -import { Cards, Card } from 'nextra/components' +import { Cards, Card } from 'nextra/components'; +// Path relative to the copy in the `website/` folder +import { LaravelIcon } from '../../components/icons/LaravelIcon'; +import { SymfonyIcon } from '../../components/icons/SymfonyIcon'; export const introduction = 'Getting ready to use Bref.'; @@ -44,10 +47,10 @@ To use Bref, you will need an AWS account and the `serverless` CLI. Let's get st That's it, you're ready to use Bref! - - - - + + } title="Get started with Laravel" arrow="true" href="/docs/laravel/getting-started" /> + } title="Get started with Symfony" arrow="true" href="/docs/symfony/getting-started" /> + diff --git a/website/src/components/icons/LaravelIcon.jsx b/website/src/components/icons/LaravelIcon.jsx new file mode 100644 index 000000000..ebb06bdcf --- /dev/null +++ b/website/src/components/icons/LaravelIcon.jsx @@ -0,0 +1,6 @@ +export function LaravelIcon() { + return Laravel + + +} diff --git a/website/src/components/icons/SymfonyIcon.jsx b/website/src/components/icons/SymfonyIcon.jsx new file mode 100644 index 000000000..0aee8d3ab --- /dev/null +++ b/website/src/components/icons/SymfonyIcon.jsx @@ -0,0 +1,8 @@ +export function SymfonyIcon() { + return + + + + + +} From 9c5f0751f13915c089b7dc073052f745c33a99b9 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 12 Jul 2023 12:46:59 +0900 Subject: [PATCH 006/144] Fix deploy on Netlify --- website/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/website/Makefile b/website/Makefile index 9e7048247..6b949f302 100644 --- a/website/Makefile +++ b/website/Makefile @@ -9,7 +9,6 @@ next-dev: # Generate and deploy the production version of the website website: node_modules src/pages/docs npm run build - vercel deploy --prod src/pages/docs: cp -r ../docs src/pages/docs From 043ff7096cdf354f967a99e8095d49da179dc0f6 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 12 Jul 2023 22:15:04 +0900 Subject: [PATCH 007/144] Docs improvements --- docs/index.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/docs/index.md b/docs/index.md index 691d35453..5bfc2f7f2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,12 +1,9 @@ --- -title: What is Bref and serverless? -current_menu: what-is-bref introduction: An introduction to what serverless and Bref can offer for PHP applications. -next: - link: /docs/installation.html - title: Installation --- +# What is Bref and serverless? + Serverless means using cloud services that manage the servers for us. ## Why serverless? @@ -20,7 +17,7 @@ When running PHP on a server, we must: When running PHP serverless: - We do not need to set up servers, the cloud provider takes care of that. -- We pay only for what we use. +- We pay only for what we use (per request). - Our application scales automatically. **Serverless provides more scalable, affordable and reliable architectures for less effort.** @@ -31,9 +28,7 @@ FaaS is a way to run code where the hosting provider takes care of setting up ev ## Why Bref? -

    Bref aims to make running PHP applications simple. -

    To reach that goal, Bref takes advantage of serverless technologies. However, while serverless is promising, there are many choices to make, tools to build and best practices to figure out. From 250257ac9c1f05e576f29c6e9f469f949336341d Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 14 Jul 2023 21:13:34 +0900 Subject: [PATCH 008/144] Docs: upgrading --- docs/monitoring.md | 5 +---- docs/upgrading/_meta.json | 3 +++ docs/upgrading/v2.md | 4 ++-- website/package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 docs/upgrading/_meta.json diff --git a/docs/monitoring.md b/docs/monitoring.md index 0bdfa8898..e3d928e2d 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -1,7 +1,4 @@ ---- -title: Monitoring -current_menu: monitoring ---- +# Monitoring By default, AWS Lambda publishes all logs and general metrics (HTTP response time, code execution duration, etc.) to AWS CloudWatch. diff --git a/docs/upgrading/_meta.json b/docs/upgrading/_meta.json new file mode 100644 index 000000000..1a03b074b --- /dev/null +++ b/docs/upgrading/_meta.json @@ -0,0 +1,3 @@ +{ + "v2": "From 1.x to 2.0" +} \ No newline at end of file diff --git a/docs/upgrading/v2.md b/docs/upgrading/v2.md index 0e8053447..9bbd63213 100644 --- a/docs/upgrading/v2.md +++ b/docs/upgrading/v2.md @@ -1,9 +1,9 @@ --- -title: Upgrading to Bref 2.0 -current_menu: upgrading introduction: Upgrading guide to go from Bref 1.x to Bref 2.0. --- +# Upgrading to Bref 2.0 + ## Updating dependencies ### PHP 8 required diff --git a/website/package.json b/website/package.json index 7cfceef47..bcdff7fcd 100644 --- a/website/package.json +++ b/website/package.json @@ -1,6 +1,6 @@ { "scripts": { - "dev": "next dev", + "dev": "next dev -p 8000", "build": "next build", "start": "next start", "lint": "next lint" From aff7b9d8095bdbc3e8570315c3fd1acb261e4d74 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 18 Jul 2023 14:05:43 +0900 Subject: [PATCH 009/144] Docs: add use cases --- docs/_meta.json | 7 + docs/aws-cdk.mdx | 34 +++ docs/default/_meta.json | 2 +- docs/default/console.md | 2 +- docs/default/first-steps.md | 62 ------ docs/default/getting-started.mdx | 66 ++++++ docs/default/index.md | 26 +-- docs/default/website-assets.md | 2 +- docs/function/handlers.md | 306 -------------------------- docs/lambda-runtimes.mdx | 174 +++++++++++++++ docs/runtimes-details.mdx | 138 ++++++++++++ docs/runtimes/README.md | 289 ------------------------ docs/runtimes/function.md | 2 +- docs/use-cases/_meta.json | 11 + docs/use-cases/dynamodb.mdx | 25 +++ docs/use-cases/eventbridge.mdx | 96 ++++++++ docs/use-cases/eventbridge.png | Bin 0 -> 33138 bytes docs/use-cases/http.mdx | 23 ++ docs/use-cases/kafka.mdx | 21 ++ docs/use-cases/kinesis.mdx | 23 ++ docs/use-cases/s3.mdx | 89 ++++++++ docs/use-cases/sns.mdx | 23 ++ docs/use-cases/sqs.mdx | 150 +++++++++++++ docs/use-cases/websockets.mdx | 45 ++++ website/src/pages/news/01-bref-1.0.md | 2 +- website/styles/main.css | 20 ++ website/theme.config.jsx | 10 + 27 files changed, 961 insertions(+), 687 deletions(-) create mode 100644 docs/aws-cdk.mdx delete mode 100644 docs/default/first-steps.md create mode 100644 docs/default/getting-started.mdx create mode 100644 docs/lambda-runtimes.mdx create mode 100644 docs/runtimes-details.mdx delete mode 100644 docs/runtimes/README.md create mode 100644 docs/use-cases/_meta.json create mode 100644 docs/use-cases/dynamodb.mdx create mode 100644 docs/use-cases/eventbridge.mdx create mode 100644 docs/use-cases/eventbridge.png create mode 100644 docs/use-cases/http.mdx create mode 100644 docs/use-cases/kafka.mdx create mode 100644 docs/use-cases/kinesis.mdx create mode 100644 docs/use-cases/s3.mdx create mode 100644 docs/use-cases/sns.mdx create mode 100644 docs/use-cases/sqs.mdx create mode 100644 docs/use-cases/websockets.mdx diff --git a/docs/_meta.json b/docs/_meta.json index 6c7b7bbb5..5e707aca0 100644 --- a/docs/_meta.json +++ b/docs/_meta.json @@ -8,6 +8,12 @@ "laravel": "Laravel", "symfony": "Symfony", "default": "Other frameworks", + "-- How it works": { + "type": "separator", + "title": "How it works" + }, + "lambda-runtimes": "PHP runtimes for AWS Lambda", + "runtimes-details": "Runtimes in details", "-- Workflow": { "type": "separator", "title": "Workflow" @@ -21,6 +27,7 @@ "title": "Learn more" }, "environment": "Environment", + "use-cases": "Use cases", "upgrading": "Upgrading", "-- Learning": { "type": "separator", diff --git a/docs/aws-cdk.mdx b/docs/aws-cdk.mdx new file mode 100644 index 000000000..c0aefa534 --- /dev/null +++ b/docs/aws-cdk.mdx @@ -0,0 +1,34 @@ +import { RemoteContent } from 'nextra/data' +import { buildDynamicMDX, buildDynamicMeta } from 'nextra/remote' + +export const getStaticProps = async ({ params }) => { + const token = process.env.GITHUB_TEST_REMOTE_MDX + const res = await fetch( + 'https://api.github.com/repos/brefphp/constructs/contents/README.md', + { + headers: { + Accept: 'application/vnd.github+json', + 'X-GitHub-Api-Version': '2022-11-28', + ...(token && { Authorization: `Bearer ${token}` }) + } + } + ) + const page = await res.json() + if (!page.content) { + throw new Error( + `Error while fetch data from GitHub.\n${JSON.stringify(page, null, 4)}` + ) + } + const content = Buffer.from(page.content, 'base64').toString('utf8'); + return { + props: { + ...(await buildDynamicMDX(content, { + defaultShowCopyCode: true + })), + ...(await buildDynamicMeta()) + }, + revalidate: 10 + } +} + + diff --git a/docs/default/_meta.json b/docs/default/_meta.json index 1eedb9230..85cb7a7c8 100644 --- a/docs/default/_meta.json +++ b/docs/default/_meta.json @@ -1,5 +1,5 @@ { - "first-steps": "", + "getting-started": "", "index": "Web apps on AWS Lambda", "website-assets": "Website assets", "console": "Console commands", diff --git a/docs/default/console.md b/docs/default/console.md index c36ed084d..8d49cd714 100644 --- a/docs/default/console.md +++ b/docs/default/console.md @@ -30,7 +30,7 @@ functions: runtime: php-81-console ``` -Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-81` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](../runtimes/README.md)). +Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-81` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](../lambda-runtimes.mdx)). ## Usage diff --git a/docs/default/first-steps.md b/docs/default/first-steps.md deleted file mode 100644 index e466de161..000000000 --- a/docs/default/first-steps.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: First steps -current_menu: first-steps -introduction: First steps to discover Bref and deploy your first PHP application on AWS Lambda. -previous: - link: /docs/installation.html - title: Installation -next: - link: /docs/runtimes/ - title: What are runtimes? ---- - -This guide will help you deploy your first PHP application on AWS Lambda. For simplicity, we will not be using a PHP framework yet. - -Before getting started make sure you have [installed Bref and the required tools](../setup.mdx) first. - -## Initializing the project - -Starting in an empty directory, install Bref using Composer: - -``` -composer require bref/bref -``` - -> Make sure that the version of Bref that was installed is 1.0 or greater. - -Then let's start by initializing the project by running: - -``` -vendor/bin/bref init -``` - -Accept all the defaults by pressing "Enter". The following files will be created in your project: - -- `index.php` contains the code of your application -- `serverless.yml` contains the configuration for deploying on AWS - -You are free to edit the code in `index.php`, but for now let's keep it simple: we want to run `index.php` on Lambda first. - -## Deployment - -To deploy, let's run: - -```bash -serverless deploy -``` - -Once the command finishes, it should print a URL like this one: - -```sh -https://3pjp2yiw97.execute-api.us-east-1.amazonaws.com -``` - -Open this URL and you should see your application: `index.php` is running on Lambda! - -🎉 congrats on creating your first serverless application! - -To learn more about deployments, head over the [Deployment guide](../deploy.mdx). - -## What's next? - -Now that you have deployed a simple PHP web app, you can [learn more about runtimes](/docs/runtimes/). That will help you deploy HTTP and console applications. diff --git a/docs/default/getting-started.mdx b/docs/default/getting-started.mdx new file mode 100644 index 000000000..1caddc63d --- /dev/null +++ b/docs/default/getting-started.mdx @@ -0,0 +1,66 @@ +import { Cards, Card } from 'nextra/components'; +// Path relative to the copy in the `website/` folder +import { LaravelIcon } from '../../../components/icons/LaravelIcon'; +import { SymfonyIcon } from '../../../components/icons/SymfonyIcon'; + +export const introduction = 'Run PHP serverless on AWS Lambda using Bref.'; + +# Getting started - Bref with any framework + +This guide will help you deploy your first PHP application on AWS Lambda. The instructions below can be adapted to work with any framework. + +If you are using Laravel or Symfony, check out the dedicated guides instead: + + + } title="Get started with Laravel" arrow="true" href="/docs/laravel/getting-started" /> + } title="Get started with Symfony" arrow="true" href="/docs/symfony/getting-started" /> + + +## Setup + +First, **follow the [Setup guide](../setup.mdx)** to create an AWS account and install the necessary tools. + +Next, in an empty directory, install Bref using Composer: + +```bash +composer require bref/bref +``` + +Make sure that the version of Bref that was installed is 1.0 or greater. + +Then let's start by initializing a new project by running: + +```bash +vendor/bin/bref init +``` + +Accept all the defaults by pressing "Enter". The following files will be created in your project: + +- `index.php` contains the code of your application +- `serverless.yml` contains the configuration for deploying on AWS + +You are free to edit the code in `index.php`. If you want to deploy an existing application, you can delete `index.php` and edit `serverless.yml` to point to your existing index file (for example it may be another file like `public/index.php`). + +## Deployment + +To deploy, let's run: + +```bash +serverless deploy +``` + +Once the command finishes, it should print a URL like this one: + +```sh +https://3pjp2yiw97.execute-api.us-east-1.amazonaws.com +``` + +Open this URL and you should see your application: `index.php` is running on Lambda! + +🎉 congrats on creating your first serverless application! + +To learn more about deployments, head over the [Deployment guide](../deploy.mdx). + +## Troubleshooting + +In case your application is showing a blank page after being deployed, [have a look at the logs](../environment/logs.md). diff --git a/docs/default/index.md b/docs/default/index.md index 19e9460d3..a4790bbd9 100644 --- a/docs/default/index.md +++ b/docs/default/index.md @@ -63,7 +63,7 @@ functions: runtime: php-81-fpm ``` -To learn more check out [the runtimes documentation](/docs/runtimes/README.md). +To learn more check out [the runtimes documentation](/docs/lambda-runtimes.mdx). ## Routing @@ -84,30 +84,6 @@ Deploying a website and serving assets (e.g. CSS, JavaScript, images) is covered In some cases however, you will need to serve images (or other assets) via PHP. One example would be if you served generated images via PHP. In those cases, you need to read the [Binary requests and responses](#binary-requests-and-responses) section below. -## Binary requests and responses - -By default API Gateway **does not support binary HTTP requests or responses** like -images, PDF, binary files… To achieve this, you need to enable the option for binary -media types in `serverless.yml` as well as define the `BREF_BINARY_RESPONSES` environment -variable: - -```yaml -provider: - # ... - apiGateway: - binaryMediaTypes: - - '*/*' - environment: - BREF_BINARY_RESPONSES: '1' -``` - -This will make API Gateway support binary file uploads and downloads, and Bref will -automatically encode responses to base64 (which is what API Gateway now expects). - -Be aware that the max upload and download size is 6MB. -For larger files, use AWS S3. -An example is available in [Serverless Visually Explained](https://serverless-visually-explained.com/). - ## Context access ### Lambda context diff --git a/docs/default/website-assets.md b/docs/default/website-assets.md index 91da39856..0888c13d1 100644 --- a/docs/default/website-assets.md +++ b/docs/default/website-assets.md @@ -10,7 +10,7 @@ next: title: Console commands --- -> Before reading this article we assume that you have read [Bref's introduction](/docs/default/first-steps.md) and that you are familiar with [Bref's HTTP runtime](/docs/web-apps/index.md). +> Before reading this article we assume that you have read [Bref's introduction](/docs/default/getting-started.mdx) and that you are familiar with [Bref's HTTP runtime](/docs/web-apps/index.md). ## Architectures diff --git a/docs/function/handlers.md b/docs/function/handlers.md index f53aece15..a67ed8172 100644 --- a/docs/function/handlers.md +++ b/docs/function/handlers.md @@ -67,128 +67,6 @@ functions: All the examples in this page will mix the class and the `return` for simplicity. -## S3 events - -`S3Handler` instances handle [Amazon S3 events](https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html): - -```php -getRecords()[0]->getBucket()->getName(); - $fileName = $event->getRecords()[0]->getObject()->getKey(); - - // do something with the file - } -} - -return new Handler(); -``` - -For example, the class can be called whenever a new file is uploaded to S3: - -```yaml -# ... - -functions: - resizeImage: - handler: handler.php - events: - - s3: photos -``` - -[Full reference of S3 in `serverless.yml`](https://www.serverless.com/framework/docs/providers/aws/events/s3/). - -## SQS events - -`SqsHandler` instances handle [SQS events](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html): - -```php -getRecords() as $record) { - // We can retrieve the message body of each record via `->getBody()` - $body = $record->getBody(); - - // do something - } - } -} - -return new Handler(); -``` - -### Partial Batch Response - -While handling a batch of records, you can mark it as partially successful to reprocess only the failed records. - -In your function declaration in `serverless.yml`, set `functionResponseType` to `ReportBatchItemFailures` to let your function return a partial success result if one or more messages in the batch have failed. - -```yaml -functions: - worker: - handler: handler.php - events: - - sqs: - arn: arn:aws:sqs:eu-west-1:111111111111:queue-name - batchSize: 100 - functionResponseType: ReportBatchItemFailures -``` - -In your PHP code, you can now use the `markAsFailed` method: - -```php - public function handleSqs(SqsEvent $event, Context $context): void - { - foreach ($event->getRecords() as $record) { - // do something - - // if something went wrong, mark the record as failed - $this->markAsFailed($record); - } - } -``` - -### Lift Queue Construct - -It is possible to deploy a preconfigured SQS queue in `serverless.yml` using the `Queue` feature of the Lift plugin. For example: - -```yaml -# serverless.yml -# ... - -constructs: - my-queue: - type: queue - worker: - handler: handler.php -``` - -Read more: - -- Deploying SQS queues with Lift -- [Full reference of SQS in `serverless.yml`](https://www.serverless.com/framework/docs/providers/aws/events/sqs/) -- Learn more about SQS and workers in [Serverless Visually Explained](https://serverless-visually-explained.com/) - ## API Gateway HTTP events **Reminder:** to create HTTP applications, it is possible to use the more traditional "[Bref for web apps](/docs/web-apps/index.md)" runtime, which runs with PHP-FPM. @@ -272,187 +150,3 @@ If you're looking for the request context array, for example when using a [Lambd ```php $requestContext = $request->getAttribute('lambda-event')->getRequestContext(); ``` - -## Websocket events - -`WebsocketHandler` instances handle Websocket events: - -```php -getRouteKey(); - $eventType = $event->getEventType(); - $body = $event->getBody(); - - return new HttpResponse('ok'); - } -} - -return new Handler(); -``` - -[Full reference for Websockets in `serverless.yml`](https://www.serverless.com/framework/docs/providers/aws/events/websocket/). - -A complete WebSocket example is available in [Serverless Visually Explained](https://serverless-visually-explained.com/). - -## EventBridge events - -`EventBridgeHandler` instances handle EventBridge events: - -```php -getDetail()` - $message = $event->getDetail(); - - // do something - } -} - -return new Handler(); -``` - -You can read more about messaging with EventBridge in [Serverless Visually Explained](https://serverless-visually-explained.com/). - -[Full reference of EventBridge in `serverless.yml`](https://www.serverless.com/framework/docs/providers/aws/events/event-bridge/). - -## SNS events - -`SnsHandler` instances handle [SNS events](https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html): - -```php -getRecords() as $record) { - $message = $record->getMessage(); - - // do something - } - } -} - -return new Handler(); -``` - -[Full reference of SNS in `serverless.yml`](https://www.serverless.com/framework/docs/providers/aws/events/sns/). - -## DynamoDB events - -`DynamoDbHandler` instances handle [DynamoDB events](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html): - -```php -getRecords() as $record) { - $keys = $record->getKeys(); - $old = $record->getOldImage(); - $new = $record->getNewImage(); - - // do something - } - } -} - -return new Handler(); -``` - -[Full reference of DynamoDB in `serverless.yml`](https://www.serverless.com/framework/docs/providers/aws/events/streams/). - -## Kinesis events - -`KinesisHandler` instances handle [Kinesis events](https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html): - -```php -getRecords() as $record) { - $data = $record->getData(); - - // do something - } - } -} - -return new Handler(); -``` - -[Full reference of Kinesis in `serverless.yml`](https://www.serverless.com/framework/docs/providers/aws/events/streams/). - -## Kafka events - -`KafkaHandler` instances handle [Kafka events](https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html): - -```php -getRecords() as $record) { - $data = $record->getValue(); - - // do something - } - } -} - -return new Handler(); -``` diff --git a/docs/lambda-runtimes.mdx b/docs/lambda-runtimes.mdx new file mode 100644 index 000000000..8af4d218b --- /dev/null +++ b/docs/lambda-runtimes.mdx @@ -0,0 +1,174 @@ +export const introduction = 'Bref provides runtimes to bring support for PHP on AWS Lambda.'; + +# PHP runtimes for AWS Lambda + +There is no built-in support for PHP on AWS Lambda. Instead, we can use 3rd party runtimes via [AWS Lambda *custom runtimes*](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html). + +**Bref provides open-source runtimes to run PHP on Lambda**. These PHP runtimes are distributed as AWS Lambda layers and Docker images. + +## Bref runtimes + +Bref provides 3 PHP runtimes: + +- The "FPM" runtime, to run **web applications**. +- The "function" runtime, to run **event-driven functions**. +- The "console" runtime, to run **CLI commands**. + +These runtimes are used by the Laravel & Symfony framework integrations to run web applications, console/artisan commands, queues, and more. + +The runtimes are available as AWS Lambda layers that you can use (explained below). They are also published as Docker images so that you can run your applications locally (more on that later). + +### Web apps + +Name: `php-82-fpm`, `php-81-fpm`, and `php-80-fpm`. + +This runtime uses PHP-FPM to run **web applications** on AWS Lambda. + +It's **the easiest to start with**: it works like traditional PHP hosting and is compatible with Symfony and Laravel. + +[Get started with the FPM runtime in "Bref for web apps"](/docs/web-apps/index.md). + +### Event-driven functions + +Name: `php-82`, `php-81`, and `php-80`. + +AWS Lambda was initially created to run _functions_ (yes, functions of code) in the cloud. + +The Bref "function" runtime lets you create Lambda functions in PHP like with any other language. + +This runtime works great to create **event-driven micro-services**. + +_Note: if you are getting started, we highly recommend using the FPM runtime instead. It's "PHP as usual" (like on any server), with all the benefits of serverless (simplicity, scaling, etc.)._ + +[Get started with the Function runtime in "Bref for event-driven functions"](/docs/runtimes/function.md). + +### Console + +Name: `php-82-console`, `php-81-console`, and `php-80-console`. + +This runtime lets you run CLI console commands on Lambda. + +For example, we can run the [Symfony Console](https://symfony.com/doc/master/components/console.html) or [Laravel Artisan](https://laravel.com/docs/artisan). + +[Read more about the `console` runtime here](/docs/web-apps/console.md). + +## Usage + +To use a runtime, set it on each function in `serverless.yml`: + +```yaml +service: app +provider: + name: aws +plugins: + - ./vendor/bref/bref +functions: + hello: + # ... + runtime: php-81 + # or: + runtime: php-81-fpm + # or: + runtime: php-81-console +``` + +Bref currently provides runtimes for PHP 8.0, 8.1 and 8.2: + +- `php-82` +- `php-81` +- `php-80` +- `php-82-fpm` +- `php-81-fpm` +- `php-80-fpm` +- `php-82-console` +- `php-81-console` +- `php-80-console` + +> `php-80` means PHP 8.0.\*. It is not possible to require a specific "patch" version. The latest Bref versions always aim to support the latest PHP versions, so upgrade frequently to keep PHP up to date. + +### ARM runtimes + +It is possible to run AWS Lambda functions on [ARM-based AWS Graviton processors](https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/). This is usually considered a way to reduce costs and improve performance. + +You can deploy to ARM by using the `arm64` architecture: + +```diff +functions: + api: + handler: public/index.php + runtime: php-81-fpm ++ architecture: arm64 +``` + +The Bref plugin will detect that change and automatically use the Bref ARM Lambda layers. + +### The Bref plugin for serverless.yml + +Make sure to always include the Bref plugin in your `serverless.yml` config: + +```yaml +plugins: + - ./vendor/bref/bref +``` + +This plugin is what makes `runtime: php-81` work (as well as other utilities). It is explained in more details in the section below. + +### AWS Lambda layers + +The `runtime: php-xxx` runtimes we use in `serverless.yml` are not _real_ AWS Lambda runtimes. Indeed, PHP is not supported natively on AWS Lambda. + +What the Bref plugin for `serverless.yml` (the one we include with `./vendor/bref/bref`) does is it automatically turns this: + +```yaml +functions: + hello: + # ... + runtime: php-81 +``` + +into this: + +```yaml +functions: + hello: + # ... + runtime: provided.al2 + layers: + - 'arn:aws:lambda:us-east-1:534081306603:layer:php-81:21' +``` + +☝️ `provided.al2` [is the generic Linux environment for custom runtimes](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html#runtimes-custom-use), and the `layers` config points to Bref's AWS Lambda layers. + +Thanks to the Bref plugin, our `serverless.yml` is simpler. It also automatically adapts to the AWS region in use, and automatically points to the correct layer version. You will learn more about "layers" below in this page. + +If you want to reference AWS Lambda layers directly (instead of using the simpler `runtime: php-81` syntax), the Bref plugin also provides simple `serverless.yml` variables. These were the default in Bref v1.x, so you may find this older syntax on tutorials and blog posts: + +```yaml +service: app +provider: + name: aws + runtime: provided.al2 +plugins: + - ./vendor/bref/bref +functions: + hello: + # ... + layers: + - ${bref:layer.php-80} + # or: + - ${bref:layer.php-80-fpm} +``` + +The `${...}` notation is the [syntax to use variables](https://serverless.com/framework/docs/providers/aws/guide/variables/) in `serverless.yml`. The Bref plugin provides the following variables: + +- `${bref:layer.php-82}` +- `${bref:layer.php-81}` +- `${bref:layer.php-80}` +- `${bref:layer.php-82-fpm}` +- `${bref:layer.php-81-fpm}` +- `${bref:layer.php-80-fpm}` +- `${bref:layer.console}` + +Bref ARM layers are the same as the x86 layers, but with the `arm-` prefix in their name, for example `${bref:layer.arm-php-82}`. The only exception is `${bref:layer.console}` (this is the same layer for both x86 and ARM). + +> **Note**: to be clear, it is easier and recommended to use the `runtime: php-xxx` option instead of setting `layers` directly. diff --git a/docs/runtimes-details.mdx b/docs/runtimes-details.mdx new file mode 100644 index 000000000..b06e3b3b7 --- /dev/null +++ b/docs/runtimes-details.mdx @@ -0,0 +1,138 @@ +import { Callout } from 'nextra/components'; + +# Runtimes in details + + + This section is only useful if you want to learn more, or if you want to use Bref with another deployment tool than Serverless Framework. + + You can skip it for now if you just want to get started with Bref. + + +## AWS Lambda layers + +Bref runtimes are distributed as [AWS Lambda layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html). While Bref provides a Serverless plugin to simplify how to use them, you can use the layers directly. + +The layer names (aka "[ARN](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)") follow this pattern: + +``` +arn:aws:lambda::534081306603:layer:: +``` + +For example: +``` +arn:aws:lambda:us-east-1:534081306603:layer:php-80:21 +``` + +You can use layers via their full ARN, for example in `serverless.yml`: + +```yml filename="serverless.yml" {9} +service: app +provider: + name: aws +functions: + hello: + # ... + runtime: provided.al2 + layers: + - 'arn:aws:lambda:us-east-1:534081306603:layer:php-80:21' +``` + +Or if you are using [SAM's `template.yaml`](https://aws.amazon.com/serverless/sam/): + +```yml filename="template.yml" +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Resources: + Hello: + Type: AWS::Serverless::Function + Properties: + # ... + Runtime: provided.al2 + Layers: + - 'arn:aws:lambda:us-east-1:534081306603:layer:php-80:21' +``` + +Bref layers work with AWS Lambda regardless of the tool you use to deploy your application: Serverless, SAM, CloudFormation, Terraform, AWS CDK, etc. + + + Remember: the layer ARN contains a region. **You need to use the same region as the rest of your application** else Lambda will not find the layer. + + +## Layer versions + +All the layer/runtime versions can be found at [**runtimes.bref.sh**](https://runtimes.bref.sh/). + +Here are the latest versions: + + + +You can also find the appropriate ARN/version for your current Bref version by running: + +```bash +serverless bref:layers +``` + + + If you use a layer ARN directly, you will need to update the ARN regularly (the `version` part). + + +### Layers NPM package + +You can use [the `@bref.sh/layers.js` NPM package](https://github.com/brefphp/layers.js) to get up-to-date layer ARNs in Node applications, for example with the AWS CDK. + +## Telemetry ping + +Bref layers send an anonymous ping to estimate the total number of Lambda invocations powered by Bref. That statistic is useful in two ways: + +- to provide new users an idea on how much Bref is used in production +- to communicate to AWS how much Bref is used and push for better PHP integration with AWS Lambda tooling + +We consider this to be beneficial both to the Bref project (to get more users and more consideration from AWS) and for Bref users (more users means a larger community, a stronger and more active project, as well as more features from AWS). + +So far, knowing the number of Bref invocations has helped Bref grow, be recognized by AWS, and opened a lot of doors. + +### Data + +On the month of the Bref 1.0 release, [Bref was powering 1 billion invocations per month](../../news/01-bref-1.0.md#1-billion-executions-per-month). + +On the month of the Bref 2.0 release, [Bref was powering 10 billion invocations per month](../../news/02-bref-2.0.md). + +### What is sent + +The data sent in the ping is completely anonymous. It does not contain any identifiable data about anything (the project, users, etc.). + +**The only data it contains is:** "A Bref invocation happened with the layer XYZ" (where XYZ is the name of the Bref layer, like "function", "fpm" or "console"). + +Here is an example payload: + +``` +Invocations_100:1|c\nLayer_fpm_100:1|c +``` + +Anyone can inspect the code and the data sent by checking the [`Bref\Runtime\LambdaRuntime::ping()` function](https://github.com/brefphp/bref/blob/master/src/Runtime/LambdaRuntime.php#L374). + +### How is it sent + +The data is sent via the [statsd](https://github.com/statsd/statsd) protocol, over [UDP](https://en.wikipedia.org/wiki/User_Datagram_Protocol). + +Unlike TCP, UDP does not check that the message correctly arrived to the server. +It doesn't even establish a connection. That means that **UDP is extremely fast**: +the data is sent over the network and the code moves on to the next line. +When actually sending data, the overhead of that ping takes about 150 micro-seconds. + +However, this function actually sends data every 100 invocation, because we don't +need to measure *all* invocations. We only need an approximation. +That means that 99% of the time, no data is sent, and the function takes 30 micro-seconds. +If we average all executions, the overhead of that ping is about **31 micro-seconds**. + +Given that it is much much less than even 1 milli-second, we consider that overhead negligible. + +### Disabling + +The ping can be disabled by setting a `BREF_PING_DISABLE` environment variable to `1`. + + + If your company policy requires disabling the ping, it would be extremely beneficial to the project (and transitively to your company) to report privately a rough number of invocations. You can send me a direct email at [matthieu@bref.sh](mailto:matthieu@bref.sh). + + Such data is collected privately and is not shared publicly on its own. I include it in the total number of invocations that I share publicly. + diff --git a/docs/runtimes/README.md b/docs/runtimes/README.md deleted file mode 100644 index 004822412..000000000 --- a/docs/runtimes/README.md +++ /dev/null @@ -1,289 +0,0 @@ ---- -title: PHP runtimes for AWS Lambda -current_menu: runtimes-introduction -introduction: Bref provides runtimes to bring support for PHP on AWS Lambda. -previous: - link: /docs/first-steps.html - title: First steps -next: - link: /docs/runtimes/http.html - title: Web apps on AWS Lambda ---- - -There is no built-in support for PHP on AWS Lambda. Instead, we can use 3rd party runtimes via [AWS Lambda *layers*](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html). - -**Bref provides open-source runtimes to run PHP on Lambda** (distributed as AWS Lambda layers). - -## Bref runtimes - -Bref provides 2 main runtimes: - -- The "FPM" runtime, to create **web applications**. -- The "function" runtime, to create **event-driven functions**. - -You can see in the documentation menu how these two runtimes are used for two different kinds of applications. - -These runtimes are available as AWS Lambda layers that you can use (explained below). They are also published as Docker images so that you can run your applications locally (more on that later). - -### Web apps - -Name: `php-82-fpm`, `php-81-fpm`, and `php-80-fpm`. - -This runtime uses PHP-FPM to run **web applications** on AWS Lambda. - -It's **the easiest to start with**: it works like traditional PHP hosting and is compatible with Symfony and Laravel. - -[Get started with the FPM runtime in "Bref for web apps"](/docs/web-apps/index.md). - -### Event-driven functions - -Name: `php-82`, `php-81`, and `php-80`. - -AWS Lambda was initially created to run _functions_ (yes, functions of code) in the cloud. - -The Bref "function" runtime lets you create Lambda functions in PHP like with any other language. - -This runtime works great to create **event-driven micro-services**. - -_Note: if you are getting started, we highly recommend using the FPM runtime instead. It's "PHP as usual" (like on any server), with all the benefits of serverless (simplicity, scaling, etc.)._ - -[Get started with the Function runtime in "Bref for event-driven functions"](/docs/runtimes/function.md). - -### Console - -Name: `php-82-console`, `php-81-console`, and `php-80-console`. - -This runtime lets you run CLI console commands on Lambda. - -For example, we can run the [Symfony Console](https://symfony.com/doc/master/components/console.html) or [Laravel Artisan](https://laravel.com/docs/artisan). - -[Read more about the `console` runtime here](/docs/web-apps/console.md). - -## Usage - -To use a runtime, set it on each function in `serverless.yml`: - -```yaml -service: app -provider: - name: aws -plugins: - - ./vendor/bref/bref -functions: - hello: - # ... - runtime: php-81 - # or: - runtime: php-81-fpm - # or: - runtime: php-81-console -``` - -Bref currently provides runtimes for PHP 8.0, 8.1 and 8.2: - -- `php-82` -- `php-81` -- `php-80` -- `php-82-fpm` -- `php-81-fpm` -- `php-80-fpm` -- `php-82-console` -- `php-81-console` -- `php-80-console` - -> `php-80` means PHP 8.0.\*. It is not possible to require a specific "patch" version. The latest Bref versions always aim to support the latest PHP versions, so upgrade frequently to keep PHP up to date. - -### ARM runtimes - -It is possible to run AWS Lambda functions on [ARM-based AWS Graviton processors](https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/). This is usually considered a way to reduce costs and improve performance. - -You can deploy to ARM by using the `arm64` architecture: - -```diff -functions: - api: - handler: public/index.php - runtime: php-81-fpm -+ architecture: arm64 -``` - -The Bref plugin will detect that change and automatically use the Bref ARM Lambda layers. - -### The Bref plugin for serverless.yml - -Make sure to always include the Bref plugin in your `serverless.yml` config: - -```yaml -plugins: - - ./vendor/bref/bref -``` - -This plugin is what makes `runtime: php-81` work (as well as other utilities). It is explained in more details in the section below. - -### AWS Lambda layers - -The `runtime: php-xxx` runtimes we use in `serverless.yml` are not _real_ AWS Lambda runtimes. Indeed, PHP is not supported natively on AWS Lambda. - -What the Bref plugin for `serverless.yml` (the one we include with `./vendor/bref/bref`) does is it automatically turns this: - -```yaml -functions: - hello: - # ... - runtime: php-81 -``` - -into this: - -```yaml -functions: - hello: - # ... - runtime: provided.al2 - layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-81:21' -``` - -☝️ `provided.al2` [is the generic Linux environment for custom runtimes](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html#runtimes-custom-use), and the `layers` config points to Bref's AWS Lambda layers. - -Thanks to the Bref plugin, our `serverless.yml` is simpler. It also automatically adapts to the AWS region in use, and automatically points to the correct layer version. You will learn more about "layers" below in this page. - -If you want to reference AWS Lambda layers directly (instead of using the simpler `runtime: php-81` syntax), the Bref plugin also provides simple `serverless.yml` variables. These were the default in Bref v1.x, so you may find this older syntax on tutorials and blog posts: - -```yaml -service: app -provider: - name: aws - runtime: provided.al2 -plugins: - - ./vendor/bref/bref -functions: - hello: - # ... - layers: - - ${bref:layer.php-80} - # or: - - ${bref:layer.php-80-fpm} -``` - -The `${...}` notation is the [syntax to use variables](https://serverless.com/framework/docs/providers/aws/guide/variables/) in `serverless.yml`. The Bref plugin provides the following variables: - -- `${bref:layer.php-82}` -- `${bref:layer.php-81}` -- `${bref:layer.php-80}` -- `${bref:layer.php-82-fpm}` -- `${bref:layer.php-81-fpm}` -- `${bref:layer.php-80-fpm}` -- `${bref:layer.console}` - -Bref ARM layers are the same as the x86 layers, but with the `arm-` prefix in their name, for example `${bref:layer.arm-php-82}`. The only exception is `${bref:layer.console}` (this is the same layer for both x86 and ARM). - -> **Note**: to be clear, it is easier and recommended to use the `runtime: php-xxx` option instead of setting `layers` directly. - -## Lambda layers in details - -> **Notice**: this section is only useful if you want to learn more. -> -> You can skip it for now if you just want to get started with Bref. -> -> ▶ [**Get started with web apps**](/docs/web-apps/index.md). - -Bref runtimes are distributed as [AWS Lambda layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html). While Bref provides a Serverless plugin to simplify how to use them, you can use the layers directly. - -The layer names follow this pattern: - -``` -arn:aws:lambda::534081306603:layer:: - -# For example: -arn:aws:lambda:us-east-1:534081306603:layer:php-80:21 -``` - -You can use layers via their full ARN, for example in `serverless.yml`: - -```yaml -service: app -provider: - name: aws - runtime: provided.al2 -functions: - hello: - ... - layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-80:21' -``` - -Or if you are using [SAM's `template.yaml`](https://aws.amazon.com/serverless/sam/): - -```yaml -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Resources: - Hello: - Type: AWS::Serverless::Function - Properties: - ... - Runtime: provided.al2 - Layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-80:21' -``` - -Bref layers work with AWS Lambda regardless of the tool you use to deploy your application: Serverless, SAM, CloudFormation, Terraform, AWS CDK, etc. - -> Remember: the layer ARN contains a region. **You need to use the same region as the rest of your application** else Lambda will not find the layer. - -### Layers NPM package - -You can use [the `@bref.sh/layers.js` NPM package](https://github.com/brefphp/layers.js) to get up-to-date layer ARNs in Node applications, for example with the AWS CDK. - -### Layer version (``) - -The latest of runtime versions can be found at [**runtimes.bref.sh**](https://runtimes.bref.sh/). - -Here are the latest versions: - - - -You can also find the appropriate ARN/version for your current Bref version by running: - -```bash -serverless bref:layers -``` - -**Watch out:** if you use the layer ARN directly, you may need to update the ARN (the `` part) when you update Bref. Follow the Bref release notes closely. - -### Bref ping - -Bref layers send a ping to estimate the total number of Lambda invocations powered by Bref. That statistic is useful in two ways: - -- to provide new users an idea on how much Bref is used in production -- to communicate to AWS how much Bref is used and push for better PHP integration with AWS Lambda tooling - -We consider this to be beneficial both to the Bref project (by getting more users and more consideration from AWS) and for Bref users (more users means a larger community, a stronger and more active project, as well as more features from AWS). - -#### What is sent - -The data sent in the ping is completely anonymous. It does not contain any identifiable data about anything (the project, users, etc.). - -**The only data it contains is:** "A Bref invocation happened with the layer XYZ" (where XYZ is the name of the Bref layer, like "function", "fpm" or "console"). - -Anyone can inspect the code and the data sent by checking the [`Bref\Runtime\LambdaRuntime::ping()` function](https://github.com/brefphp/bref/blob/master/src/Runtime/LambdaRuntime.php#L374). - -#### How is it sent - -The data is sent via the [statsd](https://github.com/statsd/statsd) protocol, over [UDP](https://en.wikipedia.org/wiki/User_Datagram_Protocol). - -Unlike TCP, UDP does not check that the message correctly arrived to the server. -It doesn't even establish a connection. That means that UDP is extremely fast: -the data is sent over the network and the code moves on to the next line. -When actually sending data, the overhead of that ping takes about 150 micro-seconds. - -However, this function actually sends data every 100 invocation, because we don't -need to measure *all* invocations. We only need an approximation. -That means that 99% of the time, no data is sent, and the function takes 30 micro-seconds. -If we average all executions, the overhead of that ping is about 31 micro-seconds. -Given that it is much much less than even 1 milli-second, we consider that overhead negligible. - -#### Disabling - -The ping can be disabled by setting a `BREF_PING_DISABLE` environment variable to `1`. diff --git a/docs/runtimes/function.md b/docs/runtimes/function.md index a73d3fc01..a6ab0ae13 100644 --- a/docs/runtimes/function.md +++ b/docs/runtimes/function.md @@ -91,7 +91,7 @@ functions: runtime: php-81 ``` -The runtime to use is `php-XX`. To learn more check out [the runtimes documentation](/docs/runtimes/README.md). +The runtime to use is `php-XX`. To learn more check out [the runtimes documentation](/docs/lambda-runtimes.mdx). ## Invocation diff --git a/docs/use-cases/_meta.json b/docs/use-cases/_meta.json new file mode 100644 index 000000000..bf3a58e8f --- /dev/null +++ b/docs/use-cases/_meta.json @@ -0,0 +1,11 @@ +{ + "http": "HTTP", + "s3": "S3 file processing", + "sqs": "SQS asynchronous tasks", + "eventbridge": "EventBridge event bus", + "websockets": "WebSockets", + "sns": "SNS events", + "dynamodb": "DynamoDB events", + "kinesis": "Kinesis stream processing", + "kafka": "Kafka events" +} \ No newline at end of file diff --git a/docs/use-cases/dynamodb.mdx b/docs/use-cases/dynamodb.mdx new file mode 100644 index 000000000..568374194 --- /dev/null +++ b/docs/use-cases/dynamodb.mdx @@ -0,0 +1,25 @@ +# DynamoDB events + +To handle [DynamoDB events](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html), extend the `DynamoDbHandler` class: + +```php +use Bref\Context\Context; +use Bref\Event\DynamoDb\DynamoDbEvent; +use Bref\Event\DynamoDb\DynamoDbHandler; + +class MyHandler extends DynamoDbHandler +{ + public function handleDynamoDb(DynamoDbEvent $event, Context $context): void + { + foreach ($event->getRecords() as $record) { + $keys = $record->getKeys(); + $old = $record->getOldImage(); + $new = $record->getNewImage(); + + // do something + } + } +} +``` + +Learn more about using DynamoDB in `serverless.yml` [in the Serverless Framework documentation](https://www.serverless.com/framework/docs/providers/aws/events/streams/). diff --git a/docs/use-cases/eventbridge.mdx b/docs/use-cases/eventbridge.mdx new file mode 100644 index 000000000..fa6e67f2f --- /dev/null +++ b/docs/use-cases/eventbridge.mdx @@ -0,0 +1,96 @@ +import { Tab, Tabs } from 'nextra/components'; + +# EventBridge event bus + +[EventBridge](https://aws.amazon.com/eventbridge/) is a managed event bus that is perfect for exchanging asynchronous messages between applications and microservices. + +```mermaid +graph LR; +EventBridge(EventBridge):::mermaidAwsColor; +Lambda1(Lambda A):::mermaidAwsColor -->|message| EventBridge; +EventBridge -->|message| Lambda2(Lambda B):::mermaidAwsColor; +EventBridge -->|message| Lambda3(Lambda C):::mermaidAwsColor; +``` + +To handle EventBridge events, extend the `EventBridgeHandler` class: + +```php +use Bref\Context\Context; +use Bref\Event\EventBridge\EventBridgeEvent; +use Bref\Event\EventBridge\EventBridgeHandler; + +class MyHandler extends EventBridgeHandler +{ + public function handleEventBridge(EventBridgeEvent $event, Context $context): void + { + // We can retrieve the message data via `$event->getDetail()` + $message = $event->getDetail(); + + // do something + } +} +``` + +Then, create a Lambda function that listens to EventBridge events with the handler you created: + + + + ```yml filename="serverless.yml" + functions: + # ... + events: + handler: App\MyHandler + events: + - eventBridge: + pattern: + detail-type: + - 'MyCustomEvent' + ``` + + The `App\MyHandler` class will be instantiated by Laravel's service container. + + + ```yml filename="serverless.yml" + functions: + # ... + resizeImage: + handler: App\MyHandler + events: + - eventBridge: + pattern: + detail-type: + - 'MyCustomEvent' + ``` + + The `App\MyHandler` class will be instantiated by Symfony's service container. + + + ```yml filename="serverless.yml" + functions: + # ... + resizeImage: + handler: handler.php + events: + - eventBridge: + pattern: + detail-type: + - 'MyCustomEvent' + ``` + + The file `handler.php` should return the handler instance: + + ```php filename="handler.php" + + + +You can learn more about messaging with EventBridge in [Serverless Visually Explained](https://serverless-visually-explained.com/). + +[![](./eventbridge.png)](https://serverless-visually-explained.com/) + +Learn more about all the options available for EventBridge in `serverless.yml` [in the Serverless Framework documentation](https://www.serverless.com/framework/docs/providers/aws/events/event-bridge/). diff --git a/docs/use-cases/eventbridge.png b/docs/use-cases/eventbridge.png new file mode 100644 index 0000000000000000000000000000000000000000..752be8fd2dd2ee3e3d162851c9e96aaf60d15b3a GIT binary patch literal 33138 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 Zb8^9tB?Iyo9AxBMT3k9uK6CZfe*@aHhlBtC literal 0 HcmV?d00001 diff --git a/docs/use-cases/http.mdx b/docs/use-cases/http.mdx new file mode 100644 index 000000000..c8e044ab9 --- /dev/null +++ b/docs/use-cases/http.mdx @@ -0,0 +1,23 @@ +# HTTP applications + +## Binary requests and responses + +By default API Gateway **does not support binary HTTP requests or responses** like +images, PDF, binary files… To achieve this, you need to enable the option for binary +media types in `serverless.yml` as well as define the `BREF_BINARY_RESPONSES` environment +variable: + +```yaml +provider: + # ... + apiGateway: + binaryMediaTypes: + - '*/*' + environment: + BREF_BINARY_RESPONSES: '1' +``` + +This will make API Gateway support binary file uploads and downloads, and Bref will +automatically encode responses to base64 (which is what API Gateway now expects). + +Be aware that the max upload and download size is 6MB. For larger files, use AWS S3. An example is available in [Serverless Visually Explained](https://serverless-visually-explained.com/). diff --git a/docs/use-cases/kafka.mdx b/docs/use-cases/kafka.mdx new file mode 100644 index 000000000..ebb835226 --- /dev/null +++ b/docs/use-cases/kafka.mdx @@ -0,0 +1,21 @@ +# Kafka events + +To handle [Kafka events](https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html), extend the `KafkaHandler` class: + +```php +use Bref\Context\Context; +use Bref\Event\Kafka\KafkaEvent; +use Bref\Event\Kafka\KafkaEventHandler; + +class Handler extends KafkaEvent +{ + public function handleKafka(KafkaEvent $event, Context $context): void + { + foreach ($event->getRecords() as $record) { + $data = $record->getValue(); + + // do something + } + } +} +``` diff --git a/docs/use-cases/kinesis.mdx b/docs/use-cases/kinesis.mdx new file mode 100644 index 000000000..adc3be70f --- /dev/null +++ b/docs/use-cases/kinesis.mdx @@ -0,0 +1,23 @@ +# Kinesis stream processing + +To handle [Kinesis events](https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html), extend the `KinesisHandler` class: + +```php +use Bref\Context\Context; +use Bref\Event\Kinesis\KinesisEvent; +use Bref\Event\Kinesis\KinesisHandler; + +class Handler extends KinesisHandler +{ + public function handleKinesis(KinesisEvent $event, Context $context): void + { + foreach ($event->getRecords() as $record) { + $data = $record->getData(); + + // do something + } + } +} +``` + +Learn more about using WebSockets in `serverless.yml` [in the Serverless Framework documentation](https://www.serverless.com/framework/docs/providers/aws/events/streams/). diff --git a/docs/use-cases/s3.mdx b/docs/use-cases/s3.mdx new file mode 100644 index 000000000..c16d49c95 --- /dev/null +++ b/docs/use-cases/s3.mdx @@ -0,0 +1,89 @@ +import { Callout, Tab, Tabs } from 'nextra/components'; + +# S3 file processing + +[S3 can trigger Lambda functions](https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html) whenever a file is added, modified, or deleted in an S3 bucket. + +```mermaid +graph LR; +START:::mermaidHidden -->|file| S3(S3):::mermaidAwsColor; +S3 --> Lambda(Lambda):::mermaidAwsColor; +``` + +This can be used to process files, for example to resize images, generate thumbnails, convert videos, after they are uploaded to S3. + +To handle S3 events, extend the `S3Handler` class: + +```php +use Bref\Context\Context; +use Bref\Event\S3\S3Event; +use Bref\Event\S3\S3Handler; + +class MyHandler extends S3Handler +{ + public function handleS3(S3Event $event, Context $context): void + { + $bucketName = $event->getRecords()[0]->getBucket()->getName(); + $fileName = $event->getRecords()[0]->getObject()->getKey(); + + // do something with the file + } +} +``` + +Then, create a Lambda function that listens to S3 events with the handler you created: + + + + ```yml filename="serverless.yml" + functions: + # ... + resizeImage: + handler: App\MyHandler + events: + - s3: photos + ``` + + The `App\MyHandler` class will be instantiated by Laravel's service container. + + + ```yml filename="serverless.yml" + functions: + # ... + resizeImage: + handler: App\MyHandler + events: + - s3: photos + ``` + + The `App\MyHandler` class will be instantiated by Symfony's service container. + + + ```yml filename="serverless.yml" + functions: + # ... + resizeImage: + handler: handler.php + events: + - s3: photos + ``` + + The file `handler.php` should return the handler instance: + + ```php filename="handler.php" + + + +The S3 bucket will automatically be created on deployment. You can listen to an existing S3 bucket via [the `existing: true` option](https://www.serverless.com/framework/docs/providers/aws/events/s3/#using-existing-buckets). + +Learn more about all the options available for S3 in `serverless.yml` [in the Serverless Framework documentation](https://www.serverless.com/framework/docs/providers/aws/events/s3/). + + + Watch out for recursive triggers: if your Lambda function writes files to the same S3 bucket, it will trigger itself again. You can avoid this by using a different bucket for the output files, or by using a prefix for the output files. + diff --git a/docs/use-cases/sns.mdx b/docs/use-cases/sns.mdx new file mode 100644 index 000000000..9906563ce --- /dev/null +++ b/docs/use-cases/sns.mdx @@ -0,0 +1,23 @@ +# SNS events + +To handle SNS events, extend the `SnsHandler` class: + +```php +use Bref\Context\Context; +use Bref\Event\Sns\SnsEvent; +use Bref\Event\Sns\SnsHandler; + +class MyHandler extends SnsHandler +{ + public function handleSns(SnsEvent $event, Context $context): void + { + foreach ($event->getRecords() as $record) { + $message = $record->getMessage(); + + // do something + } + } +} +``` + +Learn more about using WebSockets in `serverless.yml` [in the Serverless Framework documentation](https://www.serverless.com/framework/docs/providers/aws/events/sns/). diff --git a/docs/use-cases/sqs.mdx b/docs/use-cases/sqs.mdx new file mode 100644 index 000000000..c008b8582 --- /dev/null +++ b/docs/use-cases/sqs.mdx @@ -0,0 +1,150 @@ +import { Callout, Tab, Tabs } from 'nextra/components'; + +# SQS asynchronous tasks + +SQS is a service (like RabbitMQ) that allows you to queue messages (aka "jobs"). It is a good fit for asynchronous tasks because it integrates natively with AWS Lambda. + +```mermaid +graph LR; +START:::mermaidHidden -->|job| SQS(SQS):::mermaidAwsColor; +SQS -->|job| Lambda(Lambda):::mermaidAwsColor; +``` + +Whenever a new message (job) is sent to SQS, Lambda is invoked with the message data. That means that there is no need to poll SQS, or run daemon/long-running processes to wait for messages. Lambda is invoked only when there are messages to process. + + + If you are using Laravel or Symfony, you should look at the Laravel Queues integration or Symfony Messenger integration instead of integrating with SQS events directly: + + - [Laravel Queues integration](/docs/laravel/queues) + - [Symfony Messenger integration](/docs/symfony/messenger) + + +## Handling SQS events + +To handle [SQS events](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html), extend the `SqsHandler` class: + +```php +use Bref\Context\Context; +use Bref\Event\Sqs\SqsEvent; +use Bref\Event\Sqs\SqsHandler; + +class MyHandler extends SqsHandler +{ + public function handleSqs(SqsEvent $event, Context $context): void + { + foreach ($event->getRecords() as $record) { + // We can retrieve the message body of each record via `->getBody()` + $body = $record->getBody(); + + // do something + } + } +} +``` + +Then, create a Lambda function that listens to SQS events with the handler you created: + + + + ```yml filename="serverless.yml" + functions: + # ... + events: + handler: App\MyHandler + events: + - sqs: + arn: arn:aws:sqs:eu-west-1:111111111111:queue-name + # process one message at a time + batchSize: 1 + ``` + + The `App\MyHandler` class will be instantiated by Laravel's service container. + + + ```yml filename="serverless.yml" + functions: + # ... + resizeImage: + handler: App\MyHandler + events: + - sqs: + arn: arn:aws:sqs:eu-west-1:111111111111:queue-name + # process one message at a time + batchSize: 1 + ``` + + The `App\MyHandler` class will be instantiated by Symfony's service container. + + + ```yml filename="serverless.yml" + functions: + # ... + resizeImage: + handler: handler.php + events: + - sqs: + arn: arn:aws:sqs:eu-west-1:111111111111:queue-name + # process one message at a time + batchSize: 1 + ``` + + The file `handler.php` should return the handler instance: + + ```php filename="handler.php" + + + +## Creating SQS queues + +It is possible to deploy a preconfigured SQS queue in `serverless.yml` using the [`Queue` feature of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/queue.md). For example: + +```yml filename="serverless.yml" +constructs: + my-queue: + type: queue + worker: + handler: handler.php +``` + +## Partial Batch Response + +While handling a batch of records, you can mark it as partially successful to reprocess only the failed records. + +In your function declaration in `serverless.yml`, set `functionResponseType` to `ReportBatchItemFailures` to let your function return a partial success result if one or more messages in the batch have failed. + +```yml filename="serverless.yml" +functions: + worker: + handler: handler.php + events: + - sqs: + arn: arn:aws:sqs:eu-west-1:111111111111:queue-name + batchSize: 10 + functionResponseType: ReportBatchItemFailures +``` + +In your PHP code, you can now use the `markAsFailed` method: + +```php + public function handleSqs(SqsEvent $event, Context $context): void + { + foreach ($event->getRecords() as $record) { + // do something + + // if something went wrong, mark the record as failed + $this->markAsFailed($record); + } + } +``` + +## Learn more + +Learn more about all the options available for SQS events in `serverless.yml` [in the Serverless Framework documentation](https://www.serverless.com/framework/docs/providers/aws/events/sqs/). + +You can also learn more about SQS, workers, scaling queues, and dealing with errors in [Serverless Visually Explained](https://serverless-visually-explained.com/). diff --git a/docs/use-cases/websockets.mdx b/docs/use-cases/websockets.mdx new file mode 100644 index 000000000..0ecdbdcc5 --- /dev/null +++ b/docs/use-cases/websockets.mdx @@ -0,0 +1,45 @@ +import { Callout, Tab, Tabs } from 'nextra/components'; + +# WebSockets + +WebSockets are great for bringing real-time updates to a web application. They allow sending events from the backend application to the frontend (JavaScript) application. + +Implementing WebSockets implies maintaining a long-lived connection between the JavaScript client and the backend. As you can imagine, that is not possible with AWS Lambda. Indeed, Lambda only runs code on events: it is impossible to run code continuously. + +API Gateway [can solve that problem](https://docs.aws.amazon.com/apigateway/latest/developerguide/websocket-api-develop.html): API Gateway maintains the long-lived WebSocket connections and invokes Lambda when an event happens (connection, disconnection, message). + +```mermaid +graph LR; +API(API Gateway):::mermaidAwsColor; +B1(Browser):::mermaidBlack -->|WebSocket connection| API; +B2(Browser):::mermaidBlack -->|WebSocket connection| API; +B3(Browser):::mermaidBlack -->|WebSocket connection| API; +API --> Lambda(Lambda):::mermaidAwsColor; +``` + +To handle WebSocket events, extend the `WebsocketHandler` class: + +```php +use Bref\Context\Context; +use Bref\Event\ApiGateway\WebsocketEvent; +use Bref\Event\ApiGateway\WebsocketHandler; +use Bref\Event\Http\HttpResponse; + +class MyHandler extends WebsocketHandler +{ + public function handleWebsocket(WebsocketEvent $event, Context $context): HttpResponse + { + $route = $event->getRouteKey(); + $eventType = $event->getEventType(); + $body = $event->getBody(); + + return new HttpResponse('ok'); + } +} +``` + +Learn more about using WebSockets in `serverless.yml` [in the Serverless Framework documentation](https://www.serverless.com/framework/docs/providers/aws/events/websocket/). + + + A complete WebSocket example is available in [Serverless Visually Explained](https://serverless-visually-explained.com/). + diff --git a/website/src/pages/news/01-bref-1.0.md b/website/src/pages/news/01-bref-1.0.md index 8b764a5a8..2ca588980 100644 --- a/website/src/pages/news/01-bref-1.0.md +++ b/website/src/pages/news/01-bref-1.0.md @@ -109,7 +109,7 @@ New users now start with the _FPM_ runtime. Don't worry about FaaS and functions… Start by running **PHP as usual** on a cheap and scalable host. Then, **once you've had your first success**, you can look into the "Function runtime" and its power. -Check out [the "First steps" guide and see how simple it is!](/docs/default/first-steps.md). +Check out [the "First steps" guide and see how simple it is!](/docs/default/getting-started.mdx). ### Clarity for current users diff --git a/website/styles/main.css b/website/styles/main.css index ccc6c704f..70e4d3027 100644 --- a/website/styles/main.css +++ b/website/styles/main.css @@ -5,3 +5,23 @@ body { font-family: "Inter var", system-ui, sans-serif; } + +.mermaidHidden { + display: none; +} +.mermaidAwsColor span { + color: #fff !important; +} +.mermaidAwsColor > rect { + fill: #FF9900 !important; + stroke: #fff !important; + stroke-width: 1px !important; +} +.mermaidBlack span { + color: #fff !important; +} +.mermaidBlack > rect { + fill: #000 !important; + stroke: #fff !important; + stroke-width: 1px !important; +} diff --git a/website/theme.config.jsx b/website/theme.config.jsx index eefc8172a..0a9c52161 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -1,9 +1,19 @@ // https://nextra.site/docs/docs-theme/theme-configuration +import { useRouter } from 'next/router'; + export default { logo: bref, project: { link: 'https://github.com/brefphp/bref' }, + useNextSeoProps() { + const { asPath } = useRouter() + if (asPath !== '/') { + return { + titleTemplate: '%s – Bref', + }; + } + }, chat: { link: 'https://twitter.com/brefphp', icon: ( From f403fc0f7686d1892b0668c9c36014824e1ce1e4 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 18 Jul 2023 14:25:25 +0900 Subject: [PATCH 010/144] Docs: local development for event-driven functions --- docs/_meta.json | 3 +- docs/deploy/_meta.json | 3 + docs/{ => deploy}/docker.mdx | 10 ++- docs/local-development.mdx | 8 ++- docs/local-development/_meta.json | 3 + .../event-driven-functions.mdx} | 63 +++++++++---------- docs/upgrading/v2.md | 2 +- website/src/pages/news/01-bref-1.0.md | 2 +- 8 files changed, 53 insertions(+), 41 deletions(-) create mode 100644 docs/deploy/_meta.json rename docs/{ => deploy}/docker.mdx (94%) create mode 100644 docs/local-development/_meta.json rename docs/{function/local-development.md => local-development/event-driven-functions.mdx} (58%) diff --git a/docs/_meta.json b/docs/_meta.json index 5e707aca0..21a9b77e5 100644 --- a/docs/_meta.json +++ b/docs/_meta.json @@ -19,9 +19,8 @@ "title": "Workflow" }, "deploy": "Deployment", - "local-development": "", + "local-development": "Local development", "monitoring": "", - "docker": "Deploying with Docker", "-- Learn more": { "type": "separator", "title": "Learn more" diff --git a/docs/deploy/_meta.json b/docs/deploy/_meta.json new file mode 100644 index 000000000..02925edb7 --- /dev/null +++ b/docs/deploy/_meta.json @@ -0,0 +1,3 @@ +{ + "docker": "Deploying Docker images" +} \ No newline at end of file diff --git a/docs/docker.mdx b/docs/deploy/docker.mdx similarity index 94% rename from docs/docker.mdx rename to docs/deploy/docker.mdx index 401260dfc..419c5e43e 100644 --- a/docs/docker.mdx +++ b/docs/deploy/docker.mdx @@ -1,6 +1,12 @@ import { Callout } from 'nextra/components'; -# Deploying with Docker +# Deploying Docker images + + + Are you starting with Bref? Deploy **without Docker first**. It's easier and faster. You can always switch to Docker later. + + [Read the "Deployment" guide](../deploy) + By default, Bref deploys to AWS Lambda using zip archives, which Lambda will run in an Amazon Linux environment. This is how AWS Lambda works out of the box, and it works great. @@ -26,7 +32,7 @@ Bref helps you deploy using Docker images by offering base images that work on A FROM bref/php-81-fpm:2 # Copy the source code in the image -COPY . /var/task +COPY .. /var/task # Configure the handler file (the entrypoint that receives all HTTP requests) CMD ["public/index.php"] diff --git a/docs/local-development.mdx b/docs/local-development.mdx index 9d6e3e7d2..a0ee3adcd 100644 --- a/docs/local-development.mdx +++ b/docs/local-development.mdx @@ -1,10 +1,12 @@ -import { Tabs, Tab } from 'nextra/components'; +import { Tabs, Tab, Callout } from 'nextra/components'; # Local development -It is possible to run **web applications** locally. +It is possible to run **web applications** (running with the FPM runtime) locally. -> To run event-driven **PHP functions** locally, see [Local development for PHP Functions](/docs/function/local-development.md) instead. + + To run **event-driven functions** locally, read [Local development for event-driven functions](./local-development/event-driven-functions.mdx) instead. + ## The simple way diff --git a/docs/local-development/_meta.json b/docs/local-development/_meta.json new file mode 100644 index 000000000..209b7d435 --- /dev/null +++ b/docs/local-development/_meta.json @@ -0,0 +1,3 @@ +{ + "event-driven-functions": "Event-driven functions" +} \ No newline at end of file diff --git a/docs/function/local-development.md b/docs/local-development/event-driven-functions.mdx similarity index 58% rename from docs/function/local-development.md rename to docs/local-development/event-driven-functions.mdx index 025046e0c..5f6f708ee 100644 --- a/docs/function/local-development.md +++ b/docs/local-development/event-driven-functions.mdx @@ -1,35 +1,30 @@ ---- -title: Local development for functions -current_menu: function-local-development -previous: - link: /docs/function/handlers.html - title: Typed handlers -next: - link: /docs/function/cron.html - title: Cron functions ---- - -It is possible to run **PHP functions** locally. - -> **Warning:** -> To run **web apps** locally, see [Local development for HTTP applications](/docs/web-apps/local-development.md) instead. +import { Callout } from 'nextra/components'; + +# Local development for functions + +It is possible to run **event-driven functions** locally. + + + To run **HTTP applications** (like Laravel or Symfony) locally, read [Local development for HTTP applications](../local-development.mdx) instead. + ## With Serverless Framework The `serverless bref:local` command invokes your [PHP functions](/docs/runtimes/function.md) locally, using PHP installed on your machine. You can provide an event if your function expects one. -> **Note:** -> The `serverless bref:local` command is a simpler alternative to the native `serverless invoke local` command, which tries to run PHP using Docker with very little success. Use `bref:local` instead of `invoke local`. + + The `serverless bref:local` command is a simpler alternative to the native `serverless invoke local` command, which tries to run PHP using Docker with very little success. Use `serverless bref:local` instead of `serverless invoke local`. + For example, given this function: -```php +```php filename="my-function.php" return function (array $event) { return 'Hello ' . ($event['name'] ?? 'world'); }; ``` -```yaml +```yml filename="serverless.yml" # ... functions: @@ -53,18 +48,14 @@ $ serverless bref:local -f hello --path=event.json Hello Jane ``` -> **Note:** On Windows PowerShell, you must escape the "double quote" char if you write JSON directly in the CLI. Example: -> ```bash -> $ serverless bref:local -f hello --data '{\"name\": \"Bill\"}' -> ``` - -The `serverless bref:local` command runs using the local PHP installation. If you prefer to use Docker, check out the "Without Serverless Framework" section below. - -## API Gateway local development - -If you build HTTP applications with [API Gateway HTTP events](handlers.md#api-gateway-http-events), `serverless bref:local` is a bit unpractical because you need to manually craft HTTP events in JSON. + + On Windows PowerShell, you must escape the "double quote" char if you write JSON directly in the CLI. Example: + ```bash + $ serverless bref:local -f hello --data '{\"name\": \"Bill\"}' + ``` + -Instead, you can use the [`bref/dev-server`](https://github.com/brefphp/dev-server) package to emulate API Gateway locally. +The `serverless bref:local` command runs using the local PHP installation. If you prefer to use **Docker**, check out the "Without Serverless Framework" section below. ## Without Serverless Framework @@ -82,6 +73,8 @@ $ vendor/bin/bref-local my-function.php '{"name": "Jane"}' Hello Jane ``` +## With Docker + If you want to run your function in Docker: ```bash @@ -91,9 +84,9 @@ $ docker run --rm -it --entrypoint= -v $(PWD):/var/task:ro bref/php-81:2 vendor/ $ docker run --rm -it -v $(PWD):/var/task:ro bref/php-81-fpm-dev:2 vendor/bin/bref-local my-function.php ``` -You can also use Docker Compose: +You can also use Docker Compose, like described in [Local development for HTTP applications](../local-development.mdx): -```yaml +```yml filename="docker-compose.yml" version: "3.5" services: app: @@ -107,3 +100,9 @@ Then run functions: ```bash $ docker-compose run app vendor/bin/bref-local my-function.php ``` + +## API Gateway local development + +If you build HTTP applications with [API Gateway HTTP events](../function/handlers.md#api-gateway-http-events), `serverless bref:local` is a bit unpractical because you need to manually craft HTTP events in JSON. + +Instead, you can use the [`bref/dev-server`](https://github.com/brefphp/dev-server) package to emulate API Gateway locally. diff --git a/docs/upgrading/v2.md b/docs/upgrading/v2.md index 9bbd63213..a295285be 100644 --- a/docs/upgrading/v2.md +++ b/docs/upgrading/v2.md @@ -81,7 +81,7 @@ The following commands of `vendor/bin/bref` have changed: No need to provide the handler file name anymore, we directly use the function name. The new `serverless bref:local` command has similar arguments as `serverless invoke`. - Read [the Local Development documentation](../function/local-development.md) to learn more. You will also find alternatives if you don't use the `serverless` CLI. + Read [the Local Development documentation](../local-development/event-driven-functions.mdx) to learn more. You will also find alternatives if you don't use the `serverless` CLI. - `vendor/bin/bref layers` is replaced by the simpler `serverless bref:layers`. diff --git a/website/src/pages/news/01-bref-1.0.md b/website/src/pages/news/01-bref-1.0.md index 2ca588980..397765713 100644 --- a/website/src/pages/news/01-bref-1.0.md +++ b/website/src/pages/news/01-bref-1.0.md @@ -175,7 +175,7 @@ Hello Jane What's awesome is that you decide if you want to use Docker or not (with the Bref images). You can skip Docker for best performances and ease of use, or use Docker to run in an environment that replicates production. -Read more in the documentation: [Local development for functions](/docs/function/local-development.md). +Read more in the documentation: [Local development for functions](/docs/local-development/event-driven-functions.mdx). ## API Gateway v2 From 5780a6310f480ad4b2d413546219011a57553baa Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 18 Jul 2023 15:00:13 +0900 Subject: [PATCH 011/144] Docs: cron --- docs/default/cron.md | 33 ------ docs/function/cron.md | 47 -------- docs/use-cases/_meta.json | 1 + docs/use-cases/cron.mdx | 241 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 242 insertions(+), 80 deletions(-) delete mode 100644 docs/default/cron.md delete mode 100644 docs/function/cron.md create mode 100644 docs/use-cases/cron.mdx diff --git a/docs/default/cron.md b/docs/default/cron.md deleted file mode 100644 index 61dcc6caa..000000000 --- a/docs/default/cron.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: CLI cron tasks on AWS Lambda -current_menu: web-cron -introduction: Learn how to create CLI serverless cron tasks with PHP on AWS Lambda. -previous: - link: /docs/runtimes/console.html - title: Console commands -next: - link: /docs/web-apps/local-development.html - title: Local development for web apps ---- - -AWS Lambda lets us run [console commands](/docs/web-apps/console.md) as cron tasks using the `schedule` event: - -```yaml -functions: - cron: - handler: bin/console # or 'artisan' for Laravel - runtime: php-81-console - events: - - schedule: - rate: rate(1 hour) - input: '"list --verbose"' -``` - -The example above will run the `bin/console list --verbose` command every hour in AWS Lambda. - -Note that the command **is a double quoted string**: `'"command"'`. -Why? The `input` value needs to be valid JSON, which means that it needs to be a JSON string, stored in a YAML string. - -Read more about the `schedule` feature in the [Serverless documentation](https://www.serverless.com/framework/docs/providers/aws/events/schedule/). - -> If you are interested in **cron functions** instead, read the [Cron functions](/docs/function/cron.html) documentation. diff --git a/docs/function/cron.md b/docs/function/cron.md deleted file mode 100644 index 8404b3118..000000000 --- a/docs/function/cron.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Cron functions on AWS Lambda -current_menu: cron-function -introduction: Learn how to create serverless cron functions with PHP on AWS Lambda. -previous: - link: /docs/function/local-development.html - title: Local development ---- - -AWS Lambda lets us run [PHP functions](/docs/runtimes/function.md) as cron tasks using the `schedule` event: - -```yaml -functions: - console: - handler: function.php - runtime: php-81 - events: - - schedule: rate(1 hour) -``` - -The example above will run the function returned by `function.php` every hour in AWS Lambda. For example: - -```php - If you are interested in **cron CLI commands** instead, read the [Cron commands](/docs/web-apps/cron.html) documentation. diff --git a/docs/use-cases/_meta.json b/docs/use-cases/_meta.json index bf3a58e8f..dfc8af8e5 100644 --- a/docs/use-cases/_meta.json +++ b/docs/use-cases/_meta.json @@ -1,5 +1,6 @@ { "http": "HTTP", + "cron": "Cron tasks", "s3": "S3 file processing", "sqs": "SQS asynchronous tasks", "eventbridge": "EventBridge event bus", diff --git a/docs/use-cases/cron.mdx b/docs/use-cases/cron.mdx new file mode 100644 index 000000000..8ccc3bc53 --- /dev/null +++ b/docs/use-cases/cron.mdx @@ -0,0 +1,241 @@ +import { Tab, Tabs } from 'nextra/components'; +export const introduction = 'Learn how to create serverless cron functions with PHP on AWS Lambda.'; + +# Cron tasks on AWS Lambda + +A Lambda function can be invoked on a schedule using the `schedule` event. This is useful for running cron tasks, such as sending emails or cleaning up data. For example: + +```yml filename="serverless.yml" {5-8} +functions: + cron: + # ... + events: + # the schedule can be defined as a rate + - schedule: rate(1 hour) + # or as a cron expression + - schedule: cron(0 12 * * ? *) +``` + +## CLI commands + +Cron events can be used to run CLI commands with the [Console runtime](../runtimes/console.md). + +In that case, use the `php-xx-console` runtime (for example `php-81-console`). + +This is usually best when coupled with a framework like Laravel or Symfony, or when porting an existing cron task to AWS Lambda. + + + + ```yml filename="serverless.yml" + functions: + # ... + cron: + handler: artisan + runtime: php-81-console + events: + - schedule: + rate: rate(1 hour) + # The command needs to be passed as a JSON string + # (that is why it's quoted twice: '"..."') + input: '"my-command --option=value"' + ``` + + The configuration above will run `php artisan my-command --option=value` every hour in the Lambda function named "cron". + + Note that Laravel already provides a [scheduler](https://laravel.com/docs/scheduling) that can be used instead of the `schedule` event. If you want to use it instead, run the `artisan schedule:run` command every minute: + + ```yml filename="serverless.yml" + functions: + # ... + artisan: + handler: artisan + runtime: php-81-console + events: + - schedule: + rate: rate(1 minute) + input: '"schedule:run"' + ``` + + + ```yml filename="serverless.yml" + functions: + # ... + cron: + handler: bin/console + runtime: php-81-console + events: + - schedule: + rate: rate(1 hour) + # The command needs to be passed as a JSON string + # (that is why it's quoted twice: '"..."') + input: '"my-command --option=value"' + ``` + + The configuration above will run `bin/console my-command --option=value` every hour in the Lambda function named "cron". + + + ```yml filename="serverless.yml" + functions: + # ... + cron: + handler: my-script.php + runtime: php-81-console + events: + - schedule: + rate: rate(1 hour) + ``` + + The configuration above will run `php my-script.php` every hour in the Lambda function named "cron". + + If you need to pass CLI options to the script, use the `input` option: + + ```yml filename="serverless.yml" {9-11} + functions: + # ... + cron: + handler: my-script.php + runtime: php-81-console + events: + - schedule: + rate: rate(1 hour) + # The command needs to be passed as a JSON string + # (that is why it's quoted twice: '"..."') + input: '"my-command --option=value"' + ``` + + The configuration above will run `php my-script.php my-command --option=value` every hour in the Lambda function named "cron". + + + +Read more about the options for the `schedule` event in the [Serverless documentation](https://www.serverless.com/framework/docs/providers/aws/events/schedule/). + +## Cron functions + +On top of running CLI cron tasks with the `php-xx-console` runtime, we can also run **event-driven functions** (using the [PHP function runtime](/docs/runtimes/function.md)) as cron tasks. + + + + ```yml filename="serverless.yml" + functions: + # ... + cron: + handler: App\MyCronHandler + runtime: php-81 + events: + - schedule: + rate: rate(1 hour) + ``` + + The handler can be a class implementing the `Handler` interface: + + ```php + namespace App; + + use Bref\Context\Context; + + class MyCronHandler implements \Bref\Event\Handler + { + public function handle($event, Context $context): void + { + echo 'Hello ' . $event['name'] ?? 'world'; + } + } + ``` + + The configuration above will run `MyCronHandler::handle()` every hour. + + It is possible to provide data inside the `$event` variable via the `input` option: + + ```yml filename="serverless.yml" {6-8} + functions: + cron: + events: + - schedule: + rate: rate(1 hour) + input: + foo: bar + hello: world + ``` + + + ```yml filename="serverless.yml" + functions: + # ... + cron: + handler: App\MyCronHandler + runtime: php-81 + events: + - schedule: + rate: rate(1 hour) + ``` + + The handler can be a class implementing the `Handler` interface: + + ```php + namespace App; + + use Bref\Context\Context; + + class MyCronHandler implements \Bref\Event\Handler + { + public function handle($event, Context $context): void + { + echo 'Hello ' . $event['name'] ?? 'world'; + } + } + ``` + + The configuration above will run `MyCronHandler::handle()` every hour. + + It is possible to provide data inside the `$event` variable via the `input` option: + + ```yml filename="serverless.yml" {6-8} + functions: + cron: + events: + - schedule: + rate: rate(1 hour) + input: + foo: bar + hello: world + ``` + + + ```yml filename="serverless.yml" + functions: + # ... + cron: + handler: function.php + runtime: php-81-console + events: + - schedule: + rate: rate(1 hour) + ``` + + The example above will run the function returned by `function.php` every hour in AWS Lambda. For example: + + ```php + + + +Read more about the options for the `schedule` event in the [Serverless documentation](https://www.serverless.com/framework/docs/providers/aws/events/schedule/). From 3897ee3219fdf2c30a21e55782bd6c9c41e17429 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 18 Jul 2023 15:02:20 +0900 Subject: [PATCH 012/144] Docs: docker --- docs/deploy/docker.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy/docker.mdx b/docs/deploy/docker.mdx index 419c5e43e..0af975a56 100644 --- a/docs/deploy/docker.mdx +++ b/docs/deploy/docker.mdx @@ -2,7 +2,7 @@ import { Callout } from 'nextra/components'; # Deploying Docker images - + Are you starting with Bref? Deploy **without Docker first**. It's easier and faster. You can always switch to Docker later. [Read the "Deployment" guide](../deploy) From 0c5ffe07540e63c622c58abb9c2d2d3542676c88 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 18 Jul 2023 21:27:32 +0900 Subject: [PATCH 013/144] Docs: runtimes --- docs/_meta.json | 3 +-- docs/default/console.md | 2 +- docs/{lambda-runtimes.mdx => runtimes.mdx} | 0 docs/runtimes/_meta.json | 5 +++++ docs/runtimes/function.md | 2 +- docs/{ => runtimes}/runtimes-details.mdx | 0 docs/{default/index.md => runtimes/web-apps.mdx} | 16 ++++------------ 7 files changed, 12 insertions(+), 16 deletions(-) rename docs/{lambda-runtimes.mdx => runtimes.mdx} (100%) create mode 100644 docs/runtimes/_meta.json rename docs/{ => runtimes}/runtimes-details.mdx (100%) rename docs/{default/index.md => runtimes/web-apps.mdx} (91%) diff --git a/docs/_meta.json b/docs/_meta.json index 21a9b77e5..016525ca2 100644 --- a/docs/_meta.json +++ b/docs/_meta.json @@ -12,8 +12,7 @@ "type": "separator", "title": "How it works" }, - "lambda-runtimes": "PHP runtimes for AWS Lambda", - "runtimes-details": "Runtimes in details", + "runtimes": "PHP runtimes for AWS Lambda", "-- Workflow": { "type": "separator", "title": "Workflow" diff --git a/docs/default/console.md b/docs/default/console.md index 8d49cd714..dd21e240a 100644 --- a/docs/default/console.md +++ b/docs/default/console.md @@ -30,7 +30,7 @@ functions: runtime: php-81-console ``` -Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-81` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](../lambda-runtimes.mdx)). +Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-81` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](../runtimes.mdx)). ## Usage diff --git a/docs/lambda-runtimes.mdx b/docs/runtimes.mdx similarity index 100% rename from docs/lambda-runtimes.mdx rename to docs/runtimes.mdx diff --git a/docs/runtimes/_meta.json b/docs/runtimes/_meta.json new file mode 100644 index 000000000..8c09c4313 --- /dev/null +++ b/docs/runtimes/_meta.json @@ -0,0 +1,5 @@ +{ + "web-apps": "Web applications", + "function": "Event-driven functions", + "runtimes-details": "Runtimes in details" +} \ No newline at end of file diff --git a/docs/runtimes/function.md b/docs/runtimes/function.md index a6ab0ae13..05669faf6 100644 --- a/docs/runtimes/function.md +++ b/docs/runtimes/function.md @@ -91,7 +91,7 @@ functions: runtime: php-81 ``` -The runtime to use is `php-XX`. To learn more check out [the runtimes documentation](/docs/lambda-runtimes.mdx). +The runtime to use is `php-XX`. To learn more check out [the runtimes documentation](/docs/runtimes.mdx). ## Invocation diff --git a/docs/runtimes-details.mdx b/docs/runtimes/runtimes-details.mdx similarity index 100% rename from docs/runtimes-details.mdx rename to docs/runtimes/runtimes-details.mdx diff --git a/docs/default/index.md b/docs/runtimes/web-apps.mdx similarity index 91% rename from docs/default/index.md rename to docs/runtimes/web-apps.mdx index a4790bbd9..b4e8a4155 100644 --- a/docs/default/index.md +++ b/docs/runtimes/web-apps.mdx @@ -1,14 +1,6 @@ ---- -title: Web applications on AWS Lambda -current_menu: web-apps -introduction: Learn how to run serverless HTTP applications with PHP on AWS Lambda using Bref. -previous: - link: /docs/runtimes/ - title: PHP runtimes for AWS Lambda -next: - link: /docs/websites.html - title: Website assets ---- +export const introduction = 'Learn how to run serverless HTTP applications with PHP on AWS Lambda using Bref.'; + +# Web applications on AWS Lambda To run HTTP APIs and websites on AWS Lambda, Bref runs your code **using PHP-FPM**. That means PHP applications can run on Lambda just like on any other PHP hosting platform. @@ -63,7 +55,7 @@ functions: runtime: php-81-fpm ``` -To learn more check out [the runtimes documentation](/docs/lambda-runtimes.mdx). +To learn more check out [the runtimes documentation](/docs/runtimes.mdx). ## Routing From 2f565187391ad47019617acc6208e6f432b94721 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 18 Jul 2023 22:35:30 +0900 Subject: [PATCH 014/144] Website home --- website/package-lock.json | 9 ++ website/package.json | 1 + .../src/components/icons/LaravelFullIcon.jsx | 5 + .../src/components/icons/SymfonyFullIcon.jsx | 10 ++ website/src/pages/index.mdx | 92 ++++++++++++++++++- website/src/pages/index.module.css | 13 +++ 6 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 website/src/components/icons/LaravelFullIcon.jsx create mode 100644 website/src/components/icons/SymfonyFullIcon.jsx create mode 100644 website/src/pages/index.module.css diff --git a/website/package-lock.json b/website/package-lock.json index eb657d599..00cd16f7f 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "dependencies": { + "@heroicons/react": "^2.0.18", "next": "^13.4.9", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", @@ -61,6 +62,14 @@ "react-dom": "^16 || ^17 || ^18" } }, + "node_modules/@heroicons/react": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz", + "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==", + "peerDependencies": { + "react": ">= 16" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", diff --git a/website/package.json b/website/package.json index bcdff7fcd..7063d1604 100644 --- a/website/package.json +++ b/website/package.json @@ -6,6 +6,7 @@ "lint": "next lint" }, "dependencies": { + "@heroicons/react": "^2.0.18", "next": "^13.4.9", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", diff --git a/website/src/components/icons/LaravelFullIcon.jsx b/website/src/components/icons/LaravelFullIcon.jsx new file mode 100644 index 000000000..875dce97b --- /dev/null +++ b/website/src/components/icons/LaravelFullIcon.jsx @@ -0,0 +1,5 @@ +export function LaravelFullIcon({children, ...props}) { + return + + +} diff --git a/website/src/components/icons/SymfonyFullIcon.jsx b/website/src/components/icons/SymfonyFullIcon.jsx new file mode 100644 index 000000000..aae6f4cbb --- /dev/null +++ b/website/src/components/icons/SymfonyFullIcon.jsx @@ -0,0 +1,10 @@ +export function SymfonyFullIcon({children, ...props}) { + return + Symfony + + + + +} diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index f4f73a85d..f5cf32aa0 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -1,3 +1,91 @@ -# Hello world +import Link from 'next/link'; +import { LaravelFullIcon } from '../components/icons/LaravelFullIcon'; +import { SymfonyFullIcon } from '../components/icons/SymfonyFullIcon'; +import styles from './index.module.css'; -Welcome to Bref. +
    +
    +
    + +
    + diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css new file mode 100644 index 000000000..7a61ddb28 --- /dev/null +++ b/website/src/pages/index.module.css @@ -0,0 +1,13 @@ +.homeCode { + --shiki-color-text: theme('colors.gray.200'); + --shiki-color-background: transparent; + --shiki-token-constant: theme('colors.blue.400'); + --shiki-token-string: theme('colors.blue.400'); + --shiki-token-comment: theme('colors.gray.300'); + --shiki-token-keyword: theme('colors.gray.200'); + --shiki-token-parameter: theme('colors.blue.400'); + --shiki-token-function: theme('colors.gray.200'); + --shiki-token-string-expression: theme('colors.blue.400'); + --shiki-token-punctuation: theme('colors.gray.300'); + --shiki-token-link: theme('colors.blue.400'); +} From f5746003a3e5129e5effdb0bdb6fe3fe04d06b96 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 19 Jul 2023 10:28:53 +0900 Subject: [PATCH 015/144] Website home --- website/src/pages/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index f5cf32aa0..c25368d3b 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -11,7 +11,7 @@ import styles from './index.module.css';

    Simple - and scalable PHP applications + and scalable PHP infrastructure

    Simplify your infrastructure and scale with ease. @@ -55,7 +55,7 @@ import styles from './index.module.css';
    + className="border-b border-r border-b-white/20 border-r-white/10 bg-white/5 px-4 py-2 text-gray-300"> serverless.yml
    From ad876d606ff631320e270168a66d0c5d8fb95b0c Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 19 Jul 2023 15:46:44 +0900 Subject: [PATCH 016/144] Docs: move custom domains --- docs/default/_meta.json | 3 +-- docs/default/website-assets.md | 4 ++-- .../http}/custom-domains-path-mapping.png | Bin .../http/custom-domains.mdx} | 8 +++----- website/src/pages/news/01-bref-1.0.md | 2 +- 5 files changed, 7 insertions(+), 10 deletions(-) rename docs/{environment => use-cases/http}/custom-domains-path-mapping.png (100%) rename docs/{environment/custom-domains.md => use-cases/http/custom-domains.mdx} (95%) diff --git a/docs/default/_meta.json b/docs/default/_meta.json index 85cb7a7c8..ac6d69f2b 100644 --- a/docs/default/_meta.json +++ b/docs/default/_meta.json @@ -2,6 +2,5 @@ "getting-started": "", "index": "Web apps on AWS Lambda", "website-assets": "Website assets", - "console": "Console commands", - "cron": "Cron commands" + "console": "Console commands" } \ No newline at end of file diff --git a/docs/default/website-assets.md b/docs/default/website-assets.md index 0888c13d1..a629a4089 100644 --- a/docs/default/website-assets.md +++ b/docs/default/website-assets.md @@ -68,9 +68,9 @@ You can access your website using the URL that Lift outputs at the end the deplo ### Setting up a domain name -Just like in the "[Custom domains](/docs/environment/custom-domains.md)" guide, you need to register your domain in **ACM** (AWS Certificate Manager) to get an HTTPS certificate. +Just like in the "[Custom domains](/docs/use-cases/http/custom-domains.mdx)" guide, you need to register your domain in **ACM** (AWS Certificate Manager) to get an HTTPS certificate. -> If you have already set up this domain as a custom domain in API Gateway (by following the [Custom domain](/docs/environment/custom-domains.md) guide), you will need to remove it before continuing. +> If you have already set up this domain as a custom domain in API Gateway (by following the [Custom domain](/docs/use-cases/http/custom-domains.mdx) guide), you will need to remove it before continuing. - open [this link](https://console.aws.amazon.com/acm/home?region=us-east-1#/wizard/) or manually go in the ACM Console and click "Request a new certificate" **in the `us-east-1` region** (CloudFront requires certificates from `us-east-1`) - add your domain name and click "Next" diff --git a/docs/environment/custom-domains-path-mapping.png b/docs/use-cases/http/custom-domains-path-mapping.png similarity index 100% rename from docs/environment/custom-domains-path-mapping.png rename to docs/use-cases/http/custom-domains-path-mapping.png diff --git a/docs/environment/custom-domains.md b/docs/use-cases/http/custom-domains.mdx similarity index 95% rename from docs/environment/custom-domains.md rename to docs/use-cases/http/custom-domains.mdx index 6474b5b36..759c6404b 100644 --- a/docs/environment/custom-domains.md +++ b/docs/use-cases/http/custom-domains.mdx @@ -1,8 +1,6 @@ ---- -title: Custom domain names -current_menu: custom-domains -introduction: Configure custom domain names for your web applications. ---- +export const introduction = 'Configure custom domain names for your web applications.'; + +# Custom domain names API Gateway generates random domain names for our applications: diff --git a/website/src/pages/news/01-bref-1.0.md b/website/src/pages/news/01-bref-1.0.md index 397765713..f1707e823 100644 --- a/website/src/pages/news/01-bref-1.0.md +++ b/website/src/pages/news/01-bref-1.0.md @@ -209,7 +209,7 @@ functions: ``` **However don't do this blindly:** this will delete your REST API to create a new HTTP API, which will break custom domains you may have set up. -Instead, you can deploy the same Lambda with both v1 and v2, [set up your domain on v2](/docs/environment/custom-domains.md), and then delete v1: +Instead, you can deploy the same Lambda with both v1 and v2, [set up your domain on v2](/docs/use-cases/http/custom-domains.mdx), and then delete v1: ```yaml functions: From 0223312faccb4a04d46d9b0198a2076e4a774d08 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 23 Jul 2023 15:40:34 +0900 Subject: [PATCH 017/144] Website home --- website/src/pages/index.mdx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index c25368d3b..7bb98ba41 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -10,14 +10,15 @@ import styles from './index.module.css';

    - Simple - and scalable PHP infrastructure + Simple + and scalable PHP with + serverless

    Simplify your infrastructure and scale with ease.
    - Bref is an open-source project that helps you go serverless on AWS with PHP. + Bref is an **open-source** project that helps you go serverless on AWS with PHP.
    Date: Sun, 23 Jul 2023 15:50:59 +0900 Subject: [PATCH 018/144] Docs: runtimes --- docs/runtimes.mdx | 49 +++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/docs/runtimes.mdx b/docs/runtimes.mdx index 8af4d218b..cea1aabc4 100644 --- a/docs/runtimes.mdx +++ b/docs/runtimes.mdx @@ -1,8 +1,9 @@ +import { Callout } from 'nextra/components'; export const introduction = 'Bref provides runtimes to bring support for PHP on AWS Lambda.'; # PHP runtimes for AWS Lambda -There is no built-in support for PHP on AWS Lambda. Instead, we can use 3rd party runtimes via [AWS Lambda *custom runtimes*](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html). +There is no native support for PHP on AWS Lambda. Instead, we can use third-party runtimes via [AWS Lambda *custom runtimes*](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html). **Bref provides open-source runtimes to run PHP on Lambda**. These PHP runtimes are distributed as AWS Lambda layers and Docker images. @@ -22,11 +23,11 @@ The runtimes are available as AWS Lambda layers that you can use (explained belo Name: `php-82-fpm`, `php-81-fpm`, and `php-80-fpm`. -This runtime uses PHP-FPM to run **web applications** on AWS Lambda. +This runtime uses PHP-FPM to run **web applications** on AWS Lambda, like on a traditional server. It's **the easiest to start with**: it works like traditional PHP hosting and is compatible with Symfony and Laravel. -[Get started with the FPM runtime in "Bref for web apps"](/docs/web-apps/index.md). +[Learn more about the FPM runtime](/docs/web-apps/index.md). ### Event-driven functions @@ -38,9 +39,11 @@ The Bref "function" runtime lets you create Lambda functions in PHP like with an This runtime works great to create **event-driven micro-services**. -_Note: if you are getting started, we highly recommend using the FPM runtime instead. It's "PHP as usual" (like on any server), with all the benefits of serverless (simplicity, scaling, etc.)._ + + If you are getting started, we highly recommend using the FPM runtime instead. It's "PHP as usual" (like on any server), with all the benefits of serverless (simplicity, scaling, etc.). + -[Get started with the Function runtime in "Bref for event-driven functions"](/docs/runtimes/function.md). +[Learn more about the Function runtime](/docs/runtimes/function.md). ### Console @@ -50,7 +53,7 @@ This runtime lets you run CLI console commands on Lambda. For example, we can run the [Symfony Console](https://symfony.com/doc/master/components/console.html) or [Laravel Artisan](https://laravel.com/docs/artisan). -[Read more about the `console` runtime here](/docs/web-apps/console.md). +[Learn more about the Console runtime](/docs/web-apps/console.md). ## Usage @@ -84,7 +87,20 @@ Bref currently provides runtimes for PHP 8.0, 8.1 and 8.2: - `php-81-console` - `php-80-console` -> `php-80` means PHP 8.0.\*. It is not possible to require a specific "patch" version. The latest Bref versions always aim to support the latest PHP versions, so upgrade frequently to keep PHP up to date. + + `php-80` means PHP 8.0.\*. It is not possible to require a specific "patch" version. The latest Bref versions always aim to support the latest PHP versions, so upgrade via Composer frequently to keep PHP up to date. + + +### The Bref plugin for serverless.yml + +Make sure to always include the Bref plugin in your `serverless.yml` config: + +```yaml +plugins: + - ./vendor/bref/bref +``` + +This plugin is what makes `runtime: php-81` work (as well as other utilities). It is explained in more details in the section below. ### ARM runtimes @@ -102,16 +118,9 @@ functions: The Bref plugin will detect that change and automatically use the Bref ARM Lambda layers. -### The Bref plugin for serverless.yml - -Make sure to always include the Bref plugin in your `serverless.yml` config: - -```yaml -plugins: - - ./vendor/bref/bref -``` - -This plugin is what makes `runtime: php-81` work (as well as other utilities). It is explained in more details in the section below. + + The `bref-extra-extensions` package is not available for ARM processors yet. + ### AWS Lambda layers @@ -139,7 +148,7 @@ functions: ☝️ `provided.al2` [is the generic Linux environment for custom runtimes](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html#runtimes-custom-use), and the `layers` config points to Bref's AWS Lambda layers. -Thanks to the Bref plugin, our `serverless.yml` is simpler. It also automatically adapts to the AWS region in use, and automatically points to the correct layer version. You will learn more about "layers" below in this page. +Thanks to the Bref plugin, our `serverless.yml` is simpler. It also automatically adapts to the AWS region in use, and automatically points to the correct layer version. You can learn more about "layers" [in this page](./runtimes/runtimes-details.mdx). If you want to reference AWS Lambda layers directly (instead of using the simpler `runtime: php-81` syntax), the Bref plugin also provides simple `serverless.yml` variables. These were the default in Bref v1.x, so you may find this older syntax on tutorials and blog posts: @@ -171,4 +180,6 @@ The `${...}` notation is the [syntax to use variables](https://serverless.com/fr Bref ARM layers are the same as the x86 layers, but with the `arm-` prefix in their name, for example `${bref:layer.arm-php-82}`. The only exception is `${bref:layer.console}` (this is the same layer for both x86 and ARM). -> **Note**: to be clear, it is easier and recommended to use the `runtime: php-xxx` option instead of setting `layers` directly. + + To be clear, it is easier and recommended to use the `runtime: php-xxx` option instead of setting `layers` directly. + From 58d3ad42a3a7865f62148162965d003fa5791105 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 23 Jul 2023 17:02:24 +0900 Subject: [PATCH 019/144] Website: companies and testimonials --- website/src/components/home/companies.jsx | 65 +++++++++ .../src/components/home/companies/bcast.svg | 1 + .../src/components/home/companies/enoptea.png | Bin 0 -> 10659 bytes .../components/home/companies/mybuilder.svg | 1 + .../components/home/companies/neural-love.svg | 3 + .../src/components/home/companies/phpstan.svg | 30 ++++ website/src/components/home/testimonials.jsx | 133 ++++++++++++++++++ .../home/testimonials/aranreeks.jpg | Bin 0 -> 30202 bytes .../src/components/home/testimonials/geeh.jpg | Bin 0 -> 36982 bytes .../src/components/home/testimonials/neil.jpg | Bin 0 -> 12155 bytes .../components/home/testimonials/nyholm.jpg | Bin 0 -> 41912 bytes .../src/components/home/testimonials/paul.jpg | Bin 0 -> 20770 bytes .../home/testimonials/robdwaller.jpg | Bin 0 -> 43378 bytes .../home/testimonials/robmartinson.jpg | Bin 0 -> 11157 bytes .../components/home/testimonials/simon.jpg | Bin 0 -> 24060 bytes .../components/home/testimonials/zmalter.jpg | Bin 0 -> 27436 bytes website/src/pages/index.mdx | 5 + 17 files changed, 238 insertions(+) create mode 100644 website/src/components/home/companies.jsx create mode 100644 website/src/components/home/companies/bcast.svg create mode 100644 website/src/components/home/companies/enoptea.png create mode 100644 website/src/components/home/companies/mybuilder.svg create mode 100644 website/src/components/home/companies/neural-love.svg create mode 100644 website/src/components/home/companies/phpstan.svg create mode 100644 website/src/components/home/testimonials.jsx create mode 100644 website/src/components/home/testimonials/aranreeks.jpg create mode 100644 website/src/components/home/testimonials/geeh.jpg create mode 100644 website/src/components/home/testimonials/neil.jpg create mode 100644 website/src/components/home/testimonials/nyholm.jpg create mode 100644 website/src/components/home/testimonials/paul.jpg create mode 100644 website/src/components/home/testimonials/robdwaller.jpg create mode 100644 website/src/components/home/testimonials/robmartinson.jpg create mode 100644 website/src/components/home/testimonials/simon.jpg create mode 100644 website/src/components/home/testimonials/zmalter.jpg diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx new file mode 100644 index 000000000..f8e438ca8 --- /dev/null +++ b/website/src/components/home/companies.jsx @@ -0,0 +1,65 @@ +import Image from 'next/image'; +import phpStanLogo from './companies/phpstan.svg'; +import bcastLogo from './companies/bcast.svg'; +import myBuilderLogo from './companies/mybuilder.svg'; +import neuralLoveLogo from './companies/neural-love.svg'; +import enopteaLogo from './companies/enoptea.png'; + +export default function Companies() { + return ( +
    +
    +

    + Used in production by +

    +
    +
    + PhpStan +
    +
    + bCast.fm +
    +
    + MyBuilder +
    +
    + neural.love +
    +
    + Enoptea +
    + + + +
    +
    +
    + ); +} diff --git a/website/src/components/home/companies/bcast.svg b/website/src/components/home/companies/bcast.svg new file mode 100644 index 000000000..a58487e56 --- /dev/null +++ b/website/src/components/home/companies/bcast.svg @@ -0,0 +1 @@ +bcast \ No newline at end of file diff --git a/website/src/components/home/companies/enoptea.png b/website/src/components/home/companies/enoptea.png new file mode 100644 index 0000000000000000000000000000000000000000..68a6501a63688bc6616efee6f92edb425ae152bf GIT binary patch literal 10659 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 a%EYtl-wjyvO41woK!$o|x((WHG5-T5G_`jC literal 0 HcmV?d00001 diff --git a/website/src/components/home/companies/mybuilder.svg b/website/src/components/home/companies/mybuilder.svg new file mode 100644 index 000000000..0ac98d60d --- /dev/null +++ b/website/src/components/home/companies/mybuilder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/src/components/home/companies/neural-love.svg b/website/src/components/home/companies/neural-love.svg new file mode 100644 index 000000000..1222f3f3f --- /dev/null +++ b/website/src/components/home/companies/neural-love.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/website/src/components/home/companies/phpstan.svg b/website/src/components/home/companies/phpstan.svg new file mode 100644 index 000000000..6fbaf5c74 --- /dev/null +++ b/website/src/components/home/companies/phpstan.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/src/components/home/testimonials.jsx b/website/src/components/home/testimonials.jsx new file mode 100644 index 000000000..b4f9650df --- /dev/null +++ b/website/src/components/home/testimonials.jsx @@ -0,0 +1,133 @@ +import Image from 'next/image'; +import neil from './testimonials/neil.jpg'; +import geeh from './testimonials/geeh.jpg'; +import paul from './testimonials/paul.jpg'; +import robdwaller from './testimonials/robdwaller.jpg'; +import aranreeks from './testimonials/aranreeks.jpg'; +import nyholm from './testimonials/nyholm.jpg'; +import zmalter from './testimonials/zmalter.jpg'; +import simon from './testimonials/simon.jpg'; +import robmartinson from './testimonials/robmartinson.jpg'; + +const testimonials = [ + { + body: 'Bref is excellent. We\'ve been running a Laravel app with it since 2020 and it\'s currently handling over 160 million requests per month without a hiccup.', + author: { + name: 'Neil Morgan', + handle: 'neil-r-morgan', + link: 'https://www.linkedin.com/in/neil-r-morgan/', + image: neil, + }, + }, + { + body: 'Every time I throw something up onto AWS Lambda in PHP using Bref I marvel at how mega-useful it is. If you haven’t checked out Bref you’re probably missing out', + author: { + name: 'Gary Hockin', + handle: 'GeeH', + link: 'https://twitter.com/GeeH/status/1335909653897752576', + image: geeh, + }, + }, + { + body: 'Bref has been a boon for running our customer\'s applications. We\'ve had a Laravel API on Bref for the last 12 months serve over 25M requests with an average response time of 50ms.', + author: { + name: 'Paul Giberson', + handle: 'HalasLabs', + link: 'https://twitter.com/HalasLabs/status/1638650910971932672', + image: paul, + }, + }, + { + body: 'There is something amazing and magical about Bref and serverless deploying stuff to the cloud.', + author: { + name: 'Rob Waller', + handle: 'RobDWaller', + link: 'https://twitter.com/RobDWaller/status/1484569852694118406', + image: robdwaller, + }, + }, + { + body: 'An incredible project and one we\'re very proud to use in production for a recent eCommerce project we launched that saw 32m Lambda invocations last month.', + author: { + name: 'Aran Reeks', + handle: 'AranReeks', + link: 'https://twitter.com/AranReeks/status/1332467843254919168', + image: aranreeks, + }, + }, + { + body: 'I’ve been running APIs and websites with bref (in prod) for over a year now. It is indeed as simple as you describe it.', + author: { + name: 'Tobias Nyholm', + handle: 'TobiasNyholm', + link: 'https://twitter.com/TobiasNyholm/status/1292027581986934785', + image: nyholm, + }, + }, + { + body: 'Just finished migrating our production from Heroku to AWS Lambda via Bref. It\'ll save us around $2k a year 🤯', + author: { + name: 'Zach Malter', + handle: 'zmalter99', + link: 'https://twitter.com/zmalter99/status/1671228229317689367', + image: zmalter, + }, + }, + { + body: 'When your production website with Symfony, API Platform and Bref handles more than 500 simultaneous connections without flinching…', + author: { + name: '$!m0n', + handle: '__si_mon', + link: 'https://twitter.com/__si_mon/status/1616778693212348416', + image: simon, + }, + }, + { + body: 'We have several serverless applications deployed in production using Bref. It’s an awesome tool.', + author: { + name: 'Rob Martinson', + handle: 'robmartinson', + link: 'https://twitter.com/robmartinson/status/1603043069972320258', + image: robmartinson, + }, + }, + // More testimonials... +] + +export default function Testimonials() { + return ( +
    +
    +

    + Happy users and community +

    +
    +
    + {testimonials.map((testimonial) => ( +
    +
    +
    +

    {`“${testimonial.body}”`}

    +
    +
    + {testimonial.author.imageUrl ? ( + {testimonial.author.name} + ) : ( + {testimonial.author.name} + )} +
    +
    {testimonial.author.name}
    + {`@${testimonial.author.handle}`} +
    +
    +
    +
    + ))} +
    +
    +
    +
    + ) +} diff --git a/website/src/components/home/testimonials/aranreeks.jpg b/website/src/components/home/testimonials/aranreeks.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4d9910e30589f1a07540e669af934c9ec06f67a GIT binary patch literal 30202 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 literal 0 HcmV?d00001 diff --git a/website/src/components/home/testimonials/geeh.jpg b/website/src/components/home/testimonials/geeh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6be1b99a44376cf22795cc8430d26669c1c27fa4 GIT binary patch literal 36982 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%0A7MhPk96Cvxr5iFwj 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 UW6H??0O9ol(Iw)alJ!6T*`snZEC2ui literal 0 HcmV?d00001 diff --git a/website/src/components/home/testimonials/neil.jpg b/website/src/components/home/testimonials/neil.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62ef2c5041b626c9390f02d1e0457d83356b2492 GIT binary patch literal 12155 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 literal 0 HcmV?d00001 diff --git a/website/src/components/home/testimonials/nyholm.jpg b/website/src/components/home/testimonials/nyholm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..35adcba007af2dcb7b951a7a6c81ddb773c0527c GIT binary patch literal 41912 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 RD=wz(dO0fxU=bb8 z9w}Ja5nQ7ebX2Sf-6CH(PKBoHGJ-d_wlax9%ErNq#VNq6|HxU=u+6>W{s~Z4*0Sj-!2n#E>7OP9IdJiiJ45=K)t6WMJ8*qf`V4t z!iU%p9QUMKxJbWWxQY`DctIX{4@aQs{+F>q{S0aUXI}!;|K1e~20;5v2!1AN0#OqR z>VMDdTwRm?Kid(6$uNM%xUd~IRX+Wa&n&4Vk51rtyj9SYn;_m74=bqmMjFM#Hd`btQEVj zyIi6oP++fh%gmC_qSq0{mz)ZEd*zS6h5Y4kJwgtZO%b=)4!ugZame-vSjVv5;5|HJ2>Z(gOVe{J=u27v^xAw^{$m!; z`|cp5Q`OS1Smq}T1Y&w)SFvju5`bEyG7T?Jb!`A&D4Adz^JMy^8nmE2jLz0% zfwpE2T-i*pFYBs|K@drrN6bRZ5E;UgCqmOM@VXyKG5Sgmcd0 zcc0{hPR(?JP`48X={NtQA8gd#KfhHC1H=U@sC!n>RWEWM1;u{IIeAHzGg$X1tzEF_ z&^E%TvX&lMM{%{$b=S%G>7=!*nFCqyLP{+9sHTPN)IFUFz+8@R0MT5F-%wSx`@Rt$ z=4J0;nA#>UP7SGqL#kN3UyXqqg>R}(%t~@tggZC7%n8v~2Zkg3Rp>DTV@QGISaO!5 z@&l@RB zQ&DHV7!f?dRut76tOIWDMUWyi?(u`Virbb+!HIczNxgHZVMqH_3oJ1KXYc?Z)OdyRG+3obBz-f7K8SMmhW)+s4JJ` zMW*8JSvB+)vZJ&wxSN!+&v7!*FAp$XSgwkFOke_w>S<)^^2czKpGYH+}_j!xlb!=?W{goY>_uR-Y=DGf0QL3oUb}+TTYcjOF&`iIwF0z#h zI)pJ*XAf?rsgT)uJ;RlMZf=BAZkb`ns~dGUfHUDfb|lGvcqQUB6T*vJA?XMAOq_9Z)ibwoPh--X%t$&SKmQ-XayE=*&A647oeA zoXQNtkTt>}P(-@!7y}kMe9Z1EM|gq1pb69NYlXh=5$y@fC=md2ZA&*D%INijMWnhr8CKc# zi<;jsmY0t8RUK96!Nq{|zjy)hoeN*dWk$j+-X0+Bv!R!&gMnhANZ*)-@gI@IItX$o zo4a2#ph{L8t7CCed10Xj+$cI` za8nCI7o=lY)gLFA=WmyY@UrF-G2KkI2@S;DkwErmmOi1lJFCi0a5aHg4;!32U<9u( z+wB&C=)cTvB7(G4-(RE>@uImfeN3XGGmsf0x! zt;#u-7l;Qs#Jf+VC*b*w6Z07L7%ArQ4IHu>$+0gs^Wp>-kW*FaC=R|d8w&8^rP8pg zG!>W?RHiGhaSIrk>J>1pPi$Pfa5)wxrLAVinyZK}e_Xp=0T-}TiuS|z3&9Y$Ww`nY zL&F{1Qld>t$}VbPfFdDYW@+9lv#F^G#Ajma$~6oO;Cw7|s(wj*%S;98RO-6-1R5EY zK=O#Oak_UcXqFim5X2w6v)Zi^p7FAEoo`TtT3GEg%2XG=rdc6&RU7>#XGTtpRbS>1 zvK#>Hn-KApjxz}mT-oMjjbfpbm9znMOF!rJzlptIakq<>R?D8hS$MH@OejzMqP;5rMoO73J?IZ*-ghAhwCEXF9#CXt7i zA-^Pc_d~Eo)Om#AEd^6#v8?<2tb78W%RQK8qj@j6Uipr{)UZYbsN4`6v+8%&aoLJe zT7ua}>3_J~21m~__HAeuxFBPA99#Y|1q`O6!r6E$9m?>V2Yo|UVI7|3E5~B(9dV^h zud~E7GkUnoU)*%oIK$h_vM>#r#tD5DepeP^vk5)cFWda?VM{bL$sQr*IgLTT1h&8M zhTv0JiyC|(Xkg(J8|AVsQGQ9tKQH21;kB^CwQR(67wrZ~VMe8OP>0v|9UHE^&9qe& zN{;JHGX^lM97=vHE^^g;O3|<70y!b%s)}-GCev&<*U(_^)bk=ZR`>BA%jOM)ZYEZ> znNi4Pv?8HO>RWad8<#vvQI2=*-Hl!2}B=2jDCS}=!xY+Oq~r`2oJ0C60;sG=;e z+l&m$03G;uFIso?eEON(G<)g_8T(`acg#hGYzsbSD9NDein-3nU983uOp!RQ=7r{6m6-sjnN$}@N~AkU@I{*uqX@vE>Mo#P8|%}|0k<|T{{X8|srxKt#IJQ;!T$hZ zu~XqI1^#8q_w}?4+Lb50z;Mb%>44pfa5BRkd;VY+wdD0M$l6%aOL(`_<_w%&Vhqu! zQCogar(mvlmwyS2Bh>&HU>L)^W4TmSk*uG3lq{fb`o5)N=@-aM&w2`p62ZQJiqIA{ z%(tu^4o{`RP#Lrmyvj4ICifwC4)1Pbj4{d+#A?38Ek*M)a^vxP9%Wv}U0i0OG0^xq z{^f5+ZLv;u8@huqmB8hv_ROh4JbNX5ZYcEXG2r3uxQI_$_TP6X`O41Oi0X)ce&>?6 zTRHp9+AtbyH!v0`KIiWlcL<=)q8P%t^)4?$96-Cx_;dD}vu0hk;!_iAICYtrayIss ztEKFk=Fe(xGLD>ccKOt^QM7x%5hmz1eL}iiWDd%RMw;DfTV>wt^XY;Ho|yjP6j92> zx(M!}>`d?=+HLW~K7n|x#|5z4#W2BGCUkivq1?8He8fARKdOC)1wdKevKvEg=JG95 z)EFvyxrKj;AXDU;(D;CUR~3fFZj;MXhv7^ z+^{Mv1%UVNHbT21wIE?%+AXNNHa7nX;}oJ?vacYYswxzg5ktG~64+?R z=eUxO$1_+Q!PL`iK`mMcXbFDKsO2?HATFa?VL6*gy_@qmYKNH74jS&)xOIlO1i;Yl ze%BDx4IfHa@@g@Y=`@IvK0UK9h8~(Um6TPImD%gKJ{6?Ezv@29G_4rhD(QJKtCUh2 z96)Iw*IYTT4UrQc?&ZN7^p~T9Bm~xL@Z8|B3tn2{Upt~)-qulmw@#QDM0FfScfm|kBEKYb3I2*1Arnn znq9`VMwT-ph=&+u$4A%#*5T9^x|wkLjReetTuR49EZ?tEidH#xy7x4Fm+CUx{{WhS z%K=X&7=fWjOBSR>rZ2Wt8f8sp#l%J!7X79a($?}#;>f92j%$qWWhPu=I00-%?}$uh znpSHhOSZ60hP+tR!G>?$MXC3})68Yqpd~Adj{Au=E_NF!^t zs9q-wxPV3SsW*_+z#u%3vMobp;(f%UbsXkc7wCi))KYj(4|lKLW0(`VrsPU1iij%L zEk8+4);?|`l?k70eZ|Uk*0UJ} zcJT8T92m;Mf^5?=KH6b$(HWQhNOxl9H0_v8!2bX-Sf$@D=47IpzL0y-oRMNWgS-gh zwab!s$Ae@jDatqLfRrw3&ovN?nXeAg#4Rs7eY0NG+t1#O=@_KB@HU$)MVea zVeKtW%_*-_onu>#uP*H=S5_z;GqgCB%_ZOPm}nZqa_7mRIop$nu7aJ`NlgR@@Zjoi zov_g}8=TJ--VQ{dwN4J#3Ob>{m1Mnb!#Vxq6)$OFekX`B)XW+jOFOqjW#A0;C@|x@ z)+WYVe`w~RZhMOg;owV4Lksqq6pdxRWrZuIJ4tfBJivE#%wL6@jnHzl3t9Z2tEhLR zeTSfmZa_aC#<@24FB`Hf*mSO@=|=0hoE8~exzw~J1w6!REuG3`NA8TnU~7gP#@e1C6LhNMa|-PhE2CpAN|r|>)X|5oCJ3?NO!MAD zGX{L6G{i`54r!YXs9fUe%`m$79&Qm>4k>}lvnfhb?K3MT$X5izNdq=7cP<6_nI^rE z%7O4j%TaBZ&#g+5pPKz(M(Ma@B>-r6>%rFiY zt<NWRK4u)1;lwwSyk=jfz}&c=nE6~mwJbpw{)=V`9957jS)k&) zN)d7?4mRl3!UoHEo#G98{7!;boxu*Crxh9eMBH1>h%St;A4v2 zx|aNm^p^UpS!XzdPtfM5{gRy-U7G4@hn=W(LEuahc_zerKycGB1P)ujY0Chs`bsia zZcoHlVFWlJI^m9&976qh==iFZJJW>*k@Yl&kIY63g=aH0VpAK7Rx7gXwTLqC-Fm_s zmGE4415RdEfiPSX0LsX!qK8RKX1pHb4LYVuaF&X6MvN?^Mu8S!Qh7AXxTlKo6jds` zWq-WQm9m>u&C5pdxljZ-(|i+E10s=F;IMMHDBTwcW}hH;!5rr507_fSh#y z42RwT_Ng2Fl7n$J$o~Myn3cG6yKzo3!y6{EMUDH!A|UvRi{B}2v>&apq?MaqGV5zk z4a7sJ8_|Z27c{=Wh3^Kcj5k)11`CZTH!m)jisNw(rk!r;B!DgA{{XqKi`lIDhhVdk zT6y9xTVcGT$ANXT;i$!BM{0r!tgqU7?0z72GI=@T?Mu&~SuH*y`b^u=-re=Vsl^3M*-xN-3v?eZU3AV&D&R zGbYg&fPVKbE6Lp^mKSNv5Zm(+=KXCMXT~NezZ!v3xGzO*mDgp3OATX`zh{6|$Endi z_Db2p?8m2xb}$xq)?z(C9&2CBZZa^K8$^h3ysKF9zM(L*texWOJ_|!mtN5L{Nl);wCkU`S%Wv6E3E+?O42FU9 z9+*?-*n*XAIL%xhaGO%gkKY%BTGHQ3Ov^_$37&&<+!Rp^*18+n9 z_?T;d)0s%>$fl(VhhCjahn1+2z59I$*V#_m7rl4JY(%side=$4y73j}Z4x}D=&fA8szO4!)wr7<&Ze+L*Sj1MAXj_OCJkkQkR$1HwcFODmJhK-}%n6Ch zXW=D;u`HHMzEfzFQT)>zb<#AmKBjq_#Lp3rH1#gIjOyW5sC>b3`9uDQ<23ggYNrI| ze`!ENXUqU@z#6HYi_W4fVvk+US#O2`O7zXetFJ4jBhO6QfGS77j4xBQ9DMf-aP%ch z>Q&bW0?s0_)L6Mkm@(D2dGV-xJ3??&t4Q6aK$j>9uW;r#eK!)}Fbkv1VxgN&~)O)Axy0d4XBnPEJaoUgx9)v(bf zE^j0U12GiqscMd+apM}Ef^IPSgDl8CW`s|zMK(@Eei?wP*#rg$a1v=|9|-$K`?>!B za}T6ud^ae#r3m<8YR#M4`~_&)O<@w>QMN0Ooj^;f5nNn@rE=>DeEl zAE78KTuv*RA^cp=5wbB*T}_YQ6VhrY`b!!6mo9~Ye(+MTS6Xglv8WK1?4ohHKWqC> z$NrOeVk;h>-c^aBW;rjSC(1Eu1ZkEhQIAuJO2OpejEsiwP^TsE!CQ->iG|6@zr4D? zF`&tLXE zDpr@3>IpNGf)w1mml*dJL}oe^@XGWPv!7Em9GVbD(2N$pD<$T8MXN_ zlOoHQK|~ms3uA|=m(i?aP+Ko|oPq{FVQ~64`rb%5-1in({R}6&0^Wb>FtArRxY3sV zgvzh6IYs-5yK=fC5J#c@ z+@fPVM+GINTr0T?0vLv?2U}Th?0)duFbp%FrAywWAZ6dWY(38Nj75o|tngvk%{?YA{pd`-r)|s~I&;BfqC- z5n?|>aLhPODs3i|T#``*X@NG5PFf#L%H1lWfaJ_KEn37j11U*yx)`0 z&>?j_>v3!7)-v%fEPkpYE?QD!7YTzJ2hpx!hsp_NIW4~CWa~I3@G6;d%Dlv$%*3M} z;t5HQTSiSI``|j=)_BU3CVoL@@3S*B(}T zN=p6U6_&RJsaW?=8*DA6kF+a;gh9d&*)68kXS~cNxS`*oX0x0o95n|Z*AV>&qXQ~z zm6Ww*%BlE`;z10vs#Foq=;;}AkD=H8AD}dpcMZTqVZ<;@!55}DDj75!uvR+aWEvos z8(Eo?6HLLJnsF~{zv5)&Ubk>wYZ#(F4l6v67R;iCxR|WPJIB$=9J!Q5f2hXY{S-xM zp%!7t;;{Ic0hd28&BmZ&su0)yHD}QO0O0y*6$w~##5d>`rWKg7wGjg?&;Qy03_A9fJTM$#t zWkC}WtGZ~x`*tRV^Db2$vo3*3?sQVli-mKq_RYBmzA$}41mA2jaf1`o3+4O=eWH3;oQ}h928OWC8Zv7p9Tv(x3C8GQ!Frt}keU&*)M+Q@|Jt zb=`rRL0TyJ9!;8&kl0!rmQ+HVmr2!g0@B&A#4Ez~G1C6jKLcTaJo^jQt zxbF5o`C5PIo!JT4y}S?Tq&K>Wi#C95KHMu(v+TSL*hI(rFLeFUO*=%V{Pbu94CVg- z7o9md3Io@m+Cmh%)Bu|=v z<$;op&!&d>XaB?iCJ_Mv0RRF50s#XB0RR91000315g{=UK_F3KFmZvAp~2Dc@&DQY z2mu2D0Y4D@qXWZWv*s3J@4=0|jbvE?a2^ zMn}?74Q|&6ZlE`(j_v*Iw3!Ei<|lM+AaQ9fb89Ty;9xLFG7EAQc!ktKvLhAhRKpnA zCmsI)7JRns>z}&-bo@x-b!qD7+;iOF)IV~JhE!_IgKWu&MliWscVvKtEmYwG7zdWY z&RtpTv3b7)ZHrG<$b2wbT#+i)_d%01+#}4m^#E92q+^38=(7vCF6{kDEs_>dfE`*M ztn&jlPq>EB8G0Z1^x^>K?zDXAQduX#FK`7Kb)EwjV-F zd%el(&F`xyecU4>*=z3SHShaQ6FepNWJzVdT%14R>phDL3w3N|hb-xR%Cj|HxG~iE z=b44ysc{oxE|XFBw_D%-!t~wvZlNt^aJFTs2KM;Y#w)9t8JQhnEJ5dTSFOpzJJr@( zWwzGm$vAr@Od=*7QS_aga!c`R!;#g)-Ir~WWHW=$)RCOsBkLl&XO6(`V2|3-jG@ZW zt1WZH^H3DWRr;1oCMqKC%GmZ$cKQe9_8YD zxUr1PzaB7<$R`O71ieFxUk|AoI=;oA+B{p3(`?P(0b+b*uZCkhXP%w{bbl-YEI5~Z z2HNZD8bLMFVV-?XS#nx&;i&kmJg~4Ie1EA|u((T*Y`erBzW)FdyZ7*Z4b$Lr@$2Nf zOh1+0l07&1xR-y40Pr{u``^j(vAOs&$4`O89R9z|@L60O%v1MntCwfu{1(9vi>>$@ z@*rP=N*w8bPEXJ2t~2EK<39Y3OW%hh=$#*K{+i~?Eb{jZ^W-03+(8%I;r{;swEmdm z@!9X<5$h_Wf?@Ox{$JJ4(%iT|yczKN=#dx0@jhSw!~iA{0RaI400II51popA00000 z0RRypF+mVfAYpNVq3|$~vC-lG+5iXv0s#R(5M9Da$Ol*=Hqt0j+RL^_z|53#MBE*l z!fv{|oz<3W89tX_emSaCUD8l zS+M&uAj70Z;sSD47l-!h3?&ywW4cgOjF zaJKo39l9ruNSq-~QyvV(?iPE7% z=K3cFYjNg4ewG8J)5K%3pps1|VD|d3__X6W4`(l!%$ed@XlJ`@*s^J7@Yi{2kQ;do z*SC(Qam(E_cHDLgmy_mKZW~WAQ!^#57{STEFr$;pMiHZH)y@bh$iruQCvDhcl1`xq zS?Va|)M6f3+0Bi%Ws{^tK6WQ9)y#G|0pl6*r@vuPDsJJK=r8QJ(AELX6?DbFJrbg_9V6NdBZ2Z99th{Izc zWk(0zFov4hd_gS8J04>qUkhE^Sw5{05tz$Pn=EI&k_Kyi=)sJr0>J|L@pcg|*p`vR zk2cyklfN9FRHMzG8Swe|H@*HPdp)shV8fD23kk}IoUYH~7RWwhNXL`l&9grSpMz`& z;VwZdg2zz^&K!}w>2>mkC#F@$mt-G`<6f%3=U;fCLhB1gfS9|OwX zLbd^{s@Z=eUK*f4FDL;VTDka^*tleib#w9@*^IZ4TO1Z2O(Joy`C}h-Z<7dyT zBUwWvapH!A5IcN#JAtc*tEL2fG98-k=*^^5S_F%*6}0AK;km$UWNb>|qU6mMK|CIf zUR~rgd?J$7ro`>XsGvY8H)N_wq2O#r<+q;I7hglYi zVdyl?FP~Tmq`(jdxsfUEOq@UrW`~)OrFGT|cUjO|=K(g>cL|AH0BFQhb5iE=VLcgCGuwzha3?s6 z1;yQ4f%9^bE-vT?D}okRygQchq5(6UP3Iy7=MxDxje~}6K>BVVWDTmoJmNioDq2~T z0CLk8tVj}!rnCUm<51sAlJwl6djZpg)3|Uv))ijXq8t);4Rc_%Mw&NM&yeT z>?d~!;6Z{IMBoPd9m1VHI~+HV*W)}Kfw`!4nt<;VjF=I>oK;IQmpa67tAq(eF2l=@PDRjws(IEDJ4s6L z9yq=G#R@Bc{fVT)3{&SIZN+(Tv==VYJj{L3o50r#kPHO}^>O50v|06unRY7GVYUDV z!H0M%QXmkV&B@LaFr-_>yD6iBYGd208WKYJG}nFM!4!d%6x1ztsG4GU(wn2pbP999 z<1FTD2q&W6xl`yT!2%*x@fs5xyE0;;k<4cJsfZIo1`Q}SG;ZD8kB5Abho+RI$NYK{ z%N=Qp=LcNDca%VDvB;!U(}B?*Lj$4ngFr?U(LV4;V~)pu@LwhZ>j1T^2bfDh&aVagQYK3P2gd@8!M2{%a9>oN1DK4BS(2WZ6 z^q4z~5qg6(bMp4!Wf)z02^tz}xw8b_yBY_7AmbJ!8ZZJcERa`N>r~b=*_#M-d+No%qQmy0rUR=%pVg*xH(Tb zJR-q@HSz?Qv!`mibN8Wr7!X6*)^9|vKCh}$YCB|fjXdUnV1msQ@553M@I8t*X1Gmh;8mth)>%Bq7KYIZdIr7y&a`smFtf zcp$TD(;lA3)+PXm1;EtS3KE)#c_$0w8-Z@oRpdHwz{bQ7A@C~{s3M1FCIZv-n*G?c zoh{`$CELap5+PjxHbo=yCwNq!aL9(Kw2svbw{k-5fID4>^vK&{KtY_F7}ch(rra|NWn1&jCR1q#DPSl>>#l-q>_G+N{OA@O0F z=ok@R2ivRG_qM@|$(2I_8smdFF1hzH?Dm^`t39bW|M|UqX$TkHNwF`j-u43Um8x!%&vpbyt z2`@?)?-v9VTRz9L7N{DUbfD|0aYGV-^7(rI0L(-b9vs`Mn0NTMi{j2$24BgQc*R>` z01gP{92CUig$w5mwci;m7w-VtdCE;3!4DdI$K=NrM@k1o?(q9_vWXPDofQ7lIg)Ud zeF568X=ZSuPbtFx0K0O53VOO=PajIf+03?};BM5>dHrUetWKG|E534(T?c4%9F}vz zin;Nk4ywL5#1ds1_QaRO$on!d7HJ=^PB9* zEItFegTKZt0#t!cPIxmD!lqJ&&z>-ALBymCKJk2ywH-qa1H76f?Y$-2M2k?D~^jG zz=EZbIvb{eV2E-?BIpN0oaQTS-%Be51L5B?bLs`n}d{4#jJ z*bb)Id3bb9yXzGLAp>3c^{m`FgQ)X-b34luzyQw2y=&(KK__Jw<+{M}BIQ;Si2ndC zBVm!8r*?IyW7&qvW7AH|WGV!2z#Wy>{$nTDRQ1pEj-Ceo;T>@6Srpg+S3`>nOmxu0 zEgNK^2KBUp@4N&!2?&L}cl6$}&vMi^8gv9))bAMw1YdDwu|sRD2vu=v2u)~s9q%E& zS(=0HU^oM-Oh$nz9&}0t4*4~PC$x@rEC5agc061@*+vK;c1e|qChi_Vnn1U13In1m z8*X6)7f(dte60*{dE@01EIS-LXD@o-p%nP9dvUV{g$b&j{A8e|CtKD&wnv^Dr)2&y z>pelD6^{(SH|Uu$L%FP4RC{6@%=3%Fes_(aJs8X}PFLq3MaHT_C3(mi`Y{<~>6u@r z)+`BpbAYr1N)}D}kLNaw1;kSK^7%51LzgNS#XEs`!CN_j@E>dy^}GY12eV#%SN*I~ z$Wj?r>)HHQSg0F<)Eigvqr}7rmT8)79QqD4)nSZadwOsk9yJfF-cv-V>b%xFSaq2_Bea{OYte#~UQ$2SBFYGhX_fRs!hkd>Q!w+)1a z000Z~);!@*bRFdxqqzp9V}1}{8sWc8cWh(H^i{{R`@N?FKN>qqM#3MXM5xh2XK2a(P4 zpEweaE=&@g;+B5!A3wJekxAnONDM;=UyOO+zC1o_ZY&^i_0P%PGs5t1ksri=cyE_ZqXVFb>uPbV z=eM(G5x{kQoMR1yZh+x=C~LEg~jO0n{06T3P`N4Tz0Pb)&*^Rn%BIG;^`OW~)5bLSr#n4yp3+DcC zAmr`JXl9C|>BH*N-Vi@F4JJK~9t=BiOiA8f)VINKD}%H@9i9`$BXgOp<@DAGbpkEd z&fG!WAmV#++*{RP2K>MC2>r%y%a57(#7EFZfNFa0?;X9FoxT2WO>0ytUt?JuM7`NX;!!*ns9g9lSV0tunN z_c=a}?AwRNNYQC{A4h}l6+^f%kZVb3@4Rr3AS{UT2z`URlT9`M03mwseO%BJmZs{X zpB?aKvMnH*;D6e{L@4u+&7EubbCRZrh_swJaTo%kB~!Qu%Q*uIM8yEtDDLr_$X1nA z2lC?&&kz;6@xS22fX6#xDIIOUK5!?B2m$l+fK$~6t#Iqa@rgVQql$+NeO+OQ$nO2j zKVdQ{qar(Fw00w8>Yx=~R z@;+Ao0C_nYq5lAGD?9mITuS#pmMGLAszVijdQ|5c8aL(1kPEYH6jTK9gr`TR8HTq3 zB>_Cd54K<mRMX7FSw6^@gm})JH`+K<`^&r(OaaUnds<<`C2? zq#rMOummo~5Yu21bg6gB=4BB*4oCl@ct~XkU zpmf=+;nf#wdc&9>Xvuhju94lzW!0K!ymP!ciDfmdVt6FZ0W>)eW68mg)no{XW4_&* z$?gD*0nzKH)&-p|jwHJ@JzRJ)vTcjMlWrk&#B>k($?|a5TMV-^oAHL7C&oaJ*NkCS zy7I!vD#o9zP%6#BM+X&_w@ z&A2x1ePC(8iW)Rej_~XP>SS?!b(ac@c_7n>8+{oXLP2#MJR$dHU6BKEQ0bBPm(qau zEH!pI>m!lyRs~&9-)S*K16XJk0CstJ@q&9I4BZ3cn&&14;YHXSgN9|pb3|EDc@Cfc zXG2zyQ)}Scele2v^r=MfE|br!aO$fe)ExMjy8i%2QYhUGj*EuEgb#{|I4(HJP~O4L zDXMDyOqjCw{{Som8VWMMtN^-3H~v@^V1KSL-h8ER^@gdei?6KU9PQb!#v}>pzzN<< z0lekX*CL~*t#36?7J(Ofe((bZ4$I{OtBwxj5G<7ZVn9&U5$HQ_oNFamGv4P~>na#g z(?~A9^^`UM*J?jk8cINFVYus@)wA=~PZB34vbCx%*Q{m@k!qu-1m z)zTqzY=z$M>n)8$b%b@UPk51wPZnPyJbK6Wgf5RCdcx@O4H2Y|o_B~TNN;*C+zxOm z$sUsSS7{e!ZU9kpPG=$G&ia{8^kFcK4y!8QF>4AT1mx96(}9{n8yoTS%f=M9Bw6fj zy7A)zc_0m~HP8THRZXfRSI?7vFcB*w%OF#o4sni|)UpG&96293WFRDNF|Udro7O7= za)Q=1p?Wp$wpG*YLHKN!pHx&e|-is$RKqUxl){9Ud*$ zTE+hWt&L!8ZTd_=svJ_^JDjVAcn z*PLqQmWj2#c9qSsDw(3g=IiOgLAQU!#Dqlii8P06yZ-Mzr4zgZEb6cA%hFFodNQku zq4SOgIs=zE#8_*7bD0x*Zzu!dT61*6-zVoDs~{aY9KA#Z3LK}%U|WSK$SA}qcMY|Q zaxtny(ra5@@$J+Vv&<>69$qliwzd%nouKe|!%c`lfDqlb8eIUK;`$l*~3@vCl& zzpP~_J|f*to&)T~C|P0+2zI;~FFsHuV?Sr(I7s3U0Z+39PJmZ!i27kQ@2>?v3626} zlohPTugHtnW}z^|qxqpLxl7F;@ssw}x*u?6X^mfEq66&Omd{zvl(HeRzJi!w;5& zd`LJ2E8p4!`@n#WR;#I8?q9|QKAYF`oUi8$UUq>u4L50zYp&Q}Bt$)&iu-5a z$iK`QJp8*}@R_2Opagw6yU{KwvGr%;H|2+Ff)n)pzB^M)@@RwQet z33uwGQ5TFe87(21#s$gnLO9}DD7Ib-*0F>u*!_F!t zCZOI`<<|Phrsh*YT)5w?Whae7BXWRKedX-{tD^KK&;7)?JKSoPU*|T#k$9W~@i@u7 zl!)_RGY#?SHrIc6cBp{iHGkf4uOKAbzJ75-0Gy5kPsTM7dz%qI0R816nwK8ds6+f4 z#4reb23RZUZa%!_#WgIo&k;b$CP}O33P6@8_nQP$?D@c06{IFzAe@GGp_(v>k0#eN zJmA`c$n8H4YfZ&C*yax3`JCaH5K?gLsa?N};{50?$D-@+A49FP4RT@@61oRr=Y#U+ zCocZw;GK9Jb0SBAhVERXfppLaQ}+Gfi7tyDhH(SZCcGbA=O8VDbbok+G9FI68D7^& zj<{*Z3H63HD0HXJE-K|s_m`6c^#awef9`O0VzE*4>m;Z-_I<}MmfYkXl835sg~<$f zfnB~ZpQsEP@xZm9VHFDSID=~L;)sq3<;3ZG#KZIF9Jg1jWYk0IPwxPX0LLT=5I!-mZw42gO{x4$PADSSW5>D{pl56oBr=5*zM?O2ZG)LA%5@{-Z{;g&I4$# z@$rQ43=hGGCpj=$tb6e>VFkZ<-P{F_W;L4(U39p|gh3L%aO)5#*d*7z$p~XPbs)fWS`&q`&Ks(m|02}o% zM42?3^!I?ln~(^qdt?tT025M;cI^`d$Du58LG?_T^SDsS>Ye(_kcR_AHS(E%Ix143 zeur5mt3e9v4W314o#2>~M>P~4^^DJ{*8|J&=d6$RR0J3vM3;+?flr$M0MWj%bO0&f zc_)9yDNSNWeZTvMqekHHYmNKG1E{Ld=s)uZ5J)#ile||fSv4Ez=*3_YLFXp6un}pqe>m>H39|>OSAMX4*rTAX zi_7tYaaIn58}1>1xZuIHPY?{9`e77?lvLV9>i*nFmQbg|IthKZAr4-!>G8)NoP$fE zREBw?D)__<0Hp$5US`MV1@V9zheyubbt5dNTl0$A8yq4f^4wIxk|8HQw;Qw9p?sei z7?-dgd|XA1)g6cb0GPxkFU$$Yzc^k*DOcq3hgrL z{(k;4kW{D_#PO_UM4gjQUb?|85cx&^i;9$}p|{$9c~IeEiJ{{pNY=d`QS*;dXyxHm z%FqKsL!MlJ?rpf<(0hBc@sM6Ata?Iv*ZIVXqh;nUCI;8%2U^|hSqeuDdd|2x>%dbc zt*GrU*15*3yBpqKn$f*?hJxk;`7rj5QMO37$jx^?&HgY|CBWLi!P)m((g)w{&4s*J zKhN(t%fZmne=Z%=z_u3OH(!Gxp-2Tc{4zNf3f0m2zl`n-$gNOLb;sTS+v!m(=kfb- z^Ay6TH}v7(M@H|)JcS$__IOM#By4g^eQO7)E{M3qSPTK7JHp4(Ze3f0rbWcI-)Hx0l>61yZqqKXA=HvQpO)cy>W-YzW!DPTmR8?&7<3Or4 z+5T}buajwh3vbcJM9_ik-ahiF@*lwa%f{ds_?NHz#RRQbIe0OAVpQlHIW2Kv?0pmlJz)Y^Mn2Ctv@t7`0Lmf>zWx)uF~SmdI0{qY$>NZ#@1N5*AQ#mZ z5w%1$E-0;HzNDa~)9|?!3p=y~2pPyA^M!n2Rf5(buKgO`<7Z?lT+@WDYXGGijwDO$ z&TIzq0mz*1;{c*k0c~Z#wn!j$3D=Th(~5yKH;+zA2KB3({{V69 zN!ITB{{XopomkXf^Mov(aiJh|DgK#I_-knf_3Kz->xC#U zVR_)gU)D6y-`1Yn?-eDXI;0r9c)7IWRi&<;vDH%rfc|{kzvX00;=KJ}QCd`a`0<)l zR%pl-PcnQ>f3=h7Isw<~#xU#v^d_>>YQ#0u37Db>j+2r3#Sx?0c=3=Dee}M4;Gz*B zyWZ`MKP6iwe*rXfg($>SU}*5JWw_`zOSlrX)cYD}>YyL%xQ z-a6J5OHFb0gO>*&N3ig&4uKaI&nQhlcsnXuP;XXG=OBtqY!Q`hd~t+={4Jo{5F33s zH!p#@gxKeJ7u1#zX^GVed-a_0R>-1--qXKW*3sD#L|vr)9x~)5MTLla<;s%Trz5a` zubc^klB3-}tgi0rAVl4Xrag0yn|BEIA?0W99hib_zYRE>0F%0jUTeZ0d~6nqSp)Q0 z-ck6Pkk;poKRF|_A+d$fbZ;C@7UD2OoktR~Wq5SoTwpVx-bI=_!C^cpBn!dv%v280 zzj%I0$BThixlN9(lLse;@JQXcNxBKtx5wl|d###hK626mjG$}ZotZ{ktl9uduzn9& zWE-Ta{rp^Nl{79fYSWENU3%mntU%UJM_qdP$}1aZzxU@XK-AC{jr+!E=pDbtY=tzC z^Ec(jPh$Y>KNzpGz}*xrm-E&+%xF?PtI03x2)r(cYG-F24BgVQAZV`+j(3gaNC%O@ z5lwnjyQ%}<^>Y*uXxCVn6PQ-R!wMbRZ3|^Q~(2}Yp$?! zF%j%K`<7ea#sYN7o1nlM4}#>b0oa3i*Bs&&_xWVvSzd2aY*Yd@RYlq4%`Y%(Y(4D# zxDuT*_G!1>tR5g|L>-CJILkkhVR^r-9#u0Bq1tIG%GfP0JAa_4=53$1H(wCBC z7>LdepUv+%E!qul?^yGAu_g{1lVx1{^I1l%2&Gbk_qb%6=EBdfIDW_&zy)lHjSWO9e0k*TBXw4plW3Y zLrqO60Nr@inW6exN@drMPi6pFhzEg=`pwrFsvF9lJmfC|!zPQsC;jEZX{ogldDaU7wyn0fW9x{pBkpBR4k781M8jSs7`Ox%fXmkT!7Z33o zI6l7d8*wxLaCKB|>i{-`un+$LaByd6Y4g7t$FnG% ziSH_sM*uqO0Unb8OqpU~}j!1#%sQ64P)z|@^Te7Z8JN4M=i+?|yrI>ks z7ya<&p*j&O-8J*GD~qAg)>Jf2jSOg?2F?Ll(J|&CeG>IxCyq#Jdp~C9~g+ZDZ1LaYKigVHTV6n0B!dpHI862 zEgMFNH_XOgf!qhll|4T2?i~jwQu%U9K&)`o+3m(Gq#)!f?0WUXaXcPbaPz+t-F|Qy zk~SED$AjZGbV(+zzdT?89uJ%y{9z35t>)3;IeljBoqzZ*W|WEK$1rJ-*WaAxZjwk6 z8l}76Mgs&OE&9ZvBN89-#_%F0l}C>bR%xi0Z!mbnLwjR8VP=RGLk_rb3M0=ZU2f>s z!#L_+tN`uM979~&W(LlhDeBt;-Ds+3^Hmk;1{_5 zay(U9FVjC*y?zpY$#TxTsk13GKHPF)S+xRI^(yfO40Vhd+8%N0AlVx)Dw=>Gt?aM~S4God%eZ(@4O3mu1! zkLAtpD~@{3=I|qH5Xz|jFw?pU%|E<9vg4NyRg$&rX~Z%*Tw6 z7aoOP!vn&PQ!I=yLJ)YkJwf`zT(7RU59=4`LoUipQ&nsH7&gfjkGv5ik%jofG_;X) z)}1@WkC2yiF$C!eoXE)<&nc%3;{#wDgV4M^6O4hEIXKW=BFDGmEq}g5+Pkg%uqH3M z3;j9GW2=7d&tJxLYomP~kG$Bcwe`BruH=X3*_x#}!97>3ue8lY{xG@@_dFS9Q^U8$ zF5s0VUmULnDtqDH-H2gs@L9g2|pQmOy$CQ zk2*2NtLJJTw!e6~3{kTKBa~RI!3$jt;%uYRb%cP3GeZy2ZV8Z92Zd8LdKsleePVzT zgTsZ-kk1xs(wb*kMKI)X4u|6p1IqS)IEN57PtT|Eh^y$6&L1BR4w&@Kzl^OPX#z~Ai8taUD0^5fX%%Gs!P_mEEN{ISOXD))}| z*73HEUyb3E0MTL*PZ5Y5FAKuO&~A|7*H|mC>mv2uX`ahsnB$2d|t(Tx;F*8VSp z-V`yWhiTU<4f;9^YrZf;ShzRN1^Z!vHHbr-e+T~LyBeHi+?3u!0X<=QQ`wN;r4Pmr z4@vC$&5x<%2RN0`UfzxI=Lsslvzh_+bBD!V901ZiU~sw`dK&(WmQeDT)T(Gnb&Wz= zMbN;vKs#NUPu3a@KCS>Pc5+)BlBb-mSVUMvcyTL(PYHq$38@AA3AemwQnGu0(VHRG zaIYBX++pt{CY)R(s_~a90;zWR{{VdBCf#vdp_Gs7Hwbg^f6e(Zr^3{W+YU>vHu=P} zdQW&Jsk~{)ZUg{gf+Y>lj#$(yMpwhHoGf0pLhH>>*Uln=u*Ff0a6nAiF0dSToFjrs zpnq&+jy!>f?;drPl__R!{{YMsvpcD!4Ywl&4layf^G82q#9R-j3@W(t0JtdY_c}k9 z5b)jj$QzYH6HG%VbzkV?IdT!ysr{TeRp+FChdY6j5cU4|i7u5b{ATSC?~m^S5Iaqu zUF7)1M|E`kVfnZGEZv!RbubB5v2yqQKR77v9e0s7u>!kz1Gge^736W>80dj~ag3yc ze-0?@1$;T9R>fl?KTQ7sxY$}pZ@e`3k2z;}Zri@N?3Hfen*Doy?j!)N&t5+8Fnx_}H z?-wQvbmy0>QQgfoO`IwG$N9w%*jQy-?9Bk7hC(o%!&Bmq#w2U@&43Wy&b5v;yovkh z#8CMs$&Z$KZ#94>-`*OE=^h{c{{T3^AYFGbo`d@_SSUk|L;Em&592aPyk+`w9S&FM zu0b=%Q00B$yB$;4&%l1zWK#A$zxN8^>{lJ_8-E!K71z}N0LKv{vP@%roR4^NmwbsI zo_%8uj|gNQD?uhs=W8TQ~^^kkcV7#xgL z8HseatdrM`;+!}-ys*R((XMgUWV}9cHh@(2X`hU9L9qi_uaOI_p}Z1!0x|}P^kgIx zzOj+f2(+o)`of?c@fe|WXmTWV_npZAAo#>Wtw^8S#&sm?U*j%Y^4-81i^SQF3ts^w zKVgZC`WET@;`i=j6?4CX6Q@N9+$C+}w&4w|wu;NDVkJ)aYo!g9E|6 z#P*|o2fS(~4VU&?#_=)HW7gw6Q!FFQz!=2`-m+8d$_`+eD!6<-WYFsX4F|ljH`Y8H z;q0mVaO)lU!P~sk%)#r35s)X$ z{{ZH15y?JSFYR@Og9Iz!G6&-5vhDZi=PSu8>*w)ZXEm#ZD`3Bzpv_DbQNTxLEJ$BC zK}nqVfzT#L#3tA$1gf#Yq&6 zimLopUswsUDm47$C8KYH7PEr)at_(2M>unGyI7p{o5O;p=oz;~k$qw~Ho0d3sWBCh zcnWd$FUB3*Anu#@kwgy3f>UGZTrqT=kLuvgJ46ag!G%!>(ZMQN`ou7|VAtmXwdVx? z0GKp^%$N7ZFA%w^;GGBKC^RWec0at_<`33vrzaa5yOAL^iX*iD0HcnYO+`2G_PQI) z&r1&{x6ih5gYOk#rrcz2SiOrP0m+Z3yut4bBL0k^;us)AeV7kvHEXc^{{Z-(LL7k+ z*Eo4#K`J=JCMe(fW27GvWkFV`tLrA{A~9e~U1O(n-Y9`9?+CK*eBz-D#AHr$&Yfo_ zi2ne1X&y)SfM0li?^xAwM4&Bp2L5p)-K^$i0(I*Yn)<-Gz~77lIctowX;Rz>Ru28l zj>Y$tDPa#-1yBCq0`Glvd&SZhotyqc1B*OjqoH$mC^g9M18bl#54<-6{6ikRZ7c9$ z8VzEA7+!2tKj$sFyza2rF@&u9aU2BWAUIa<5#bD`&TrcMWR5*^Faowr{{WTFO?8|b zZDJwcJeWoOI043- zofMd@0OiMcC!(XN0bT@u7$G2U^PLB7eBc2!6HK^>wGYlQO3*l(xwP5X4nN%DU9zte z1xiugjxy<9p7`;AS#N;WTF|U~TMmMUoDr^&Pxsyz9*wR@=a@uvqHU&+S>@Awjto9< z_+ZDqnWJ$o-Fg&7*57kjLRcK{AMbv63_vtG4Pv>V4+6~>+pLKa`fXEh&MU;BJZBdf zEjrWx0LyB#;*Gd4HM|pR&BcT;AfI^a(%?hQ$Q3}=E-<}dqBXM<3`NqvQU3tBrLF)W8A8 z%oRKT0PBmRV(sQQ$%)WuDp~wx6}2)0#GxBlZ!>CQ9OR4TZkIy0Z%Yf^1EB_E_RuSS~Km_}O} zEx6^IF7VnkBU!y&)eZe|ln28I#U`y@Ty9J!HzjGZ;wgD>&p_hRISz*v?~k0b>y6@c zcjEvz=ez-2Kq|@OoPlba!H>e^ouRkR3G%?pO2dNd1*?x3_6BdIr}AF5OYban0E|z3 zbG$t3bWxslg@Y|y$E%4}38dZgul>OVS3%NFQ}dg`B3PWuzuqJRXF$-<%-XB>KDaQn zqDV12S)C6==Joiwa`kKMaDHRSiWRNLYdONa;Q%t_;MXT-3LJzG?oIyy^rzM~*PuHd zaI7ux?DLv8yd@^`4S4Eeh;xr^ga`gI-%&w(Y|RHZ=ZuI8uCc_OiZ{0XrxEI}!Q%%1 z0Q?zz?eTyM!8PL>p!mfNvUQ8VK5$-D?>Q6JI^e~Lj&e7HuQ)cO>fl!wT=~sB#^58d zh|u&I8j(1~fYS#dliLYsMN0_2Bn*_))a$ihpa>e{ozDYeD#EnfGdRm09iG5!^;2-n3cLu7`Gnst3!cer`&Fh zQ+qLyEG&00P0IM=6xu?wVMFbQ-YP<-U9Qvl{&0WzDFIi52rT6E^_Ek|80z(q_YOP- z=T0;c<+$A&9ECUYa=j<5XXTBg?-`Y2ar;OovYO;Ew^YsN}LZO9Z1=x}ES zf&*pNx6l6h!3C5B=fl_k05Ka^rgMILeCFji#`*d4iYg^wG`!b-`M_nOEppg6g$!OGf-<5tDhcP&;4fozI1C;fycKjiUutvE& z{{ZF%j2d+R0N=b>I5y4jhd$;MSw!$(1`XDxt8WhRZawWg>$e&(nmJr*ZjENKuM1rR z%a0cx>tC@S#Le8~UUv_&Wf^c+(HHu~%3KA3splFGH|NQM^soN_i~-U#xy`)byWrFT z#Ip_ZvDPn@!^2H&Lv1gy0Mv zbB1uq*LG<0hiA?#lGd7Wbw`{;z~ni}&2->-;11W#D3o_WHN5gE0K=++!x Tvy#%foMoLI3!JvNS~LIIuiRU1 literal 0 HcmV?d00001 diff --git a/website/src/components/home/testimonials/paul.jpg b/website/src/components/home/testimonials/paul.jpg new file mode 100644 index 0000000000000000000000000000000000000000..463a03a6eeecbdbc5c1d73403d03dba431b77796 GIT binary patch literal 20770 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 literal 0 HcmV?d00001 diff --git a/website/src/components/home/testimonials/robdwaller.jpg b/website/src/components/home/testimonials/robdwaller.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e0cd685785771a4a43b5cdcbc90bb0f001c3bfe GIT binary patch literal 43378 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 literal 0 HcmV?d00001 diff --git a/website/src/components/home/testimonials/robmartinson.jpg b/website/src/components/home/testimonials/robmartinson.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e6ca024b28bed904430572e6d8091f23d44674b1 GIT binary patch literal 11157 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 JgHtbS{{v%0Vub(z literal 0 HcmV?d00001 diff --git a/website/src/components/home/testimonials/simon.jpg b/website/src/components/home/testimonials/simon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e3917373983fd778c7c0a6c145a6bc007f09f0a GIT binary patch literal 24060 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 literal 0 HcmV?d00001 diff --git a/website/src/components/home/testimonials/zmalter.jpg b/website/src/components/home/testimonials/zmalter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed4cbf4037f5189e4b007ef94fb681563566bbb8 GIT binary patch literal 27436 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

    + + + From 68b5067c7c12e0c362610d60c7c68cf764de6c84 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 23 Jul 2023 17:11:23 +0900 Subject: [PATCH 020/144] Website: companies and testimonials --- website/src/components/home/companies.jsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index f8e438ca8..ac575d995 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -16,47 +16,47 @@ export default function Companies() { className="mt-16 -mx-6 grid grid-cols-2 gap-0.5 overflow-hidden sm:mx-0 sm:rounded-2xl md:grid-cols-3">
    PhpStan
    bCast.fm
    MyBuilder
    neural.love
    Enoptea
    From e71f05e6dea1bbab92fe02e7f2355ad81f1a437e Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 23 Jul 2023 17:26:55 +0900 Subject: [PATCH 021/144] Website: invocation count --- website/src/components/home/invocations.jsx | 48 +++++++++++++++++++++ website/src/pages/index.mdx | 2 + 2 files changed, 50 insertions(+) create mode 100644 website/src/components/home/invocations.jsx diff --git a/website/src/components/home/invocations.jsx b/website/src/components/home/invocations.jsx new file mode 100644 index 000000000..d27c98422 --- /dev/null +++ b/website/src/components/home/invocations.jsx @@ -0,0 +1,48 @@ +import { useEffect, useState } from 'react'; + +export default function Invocations() { + const invocations = 16411284305; + const [counter, setCounter] = useState(invocations); + + // useEffect(() => { + // const timeout = setTimeout(() => { + // setCounter(counter + 23); + // }, 300); + // return () => { + // clearTimeout(timeout); + // }; + // }, [counter]); + + return ( +
    +
    +
    +

    + {counter.toLocaleString('en-US')} +

    +

    + requests, jobs, and messages handled with Bref in the last 30 days +

    + + +
    +
    +
    + ) +} diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index d60e92496..ddf5799ec 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -4,6 +4,7 @@ import { SymfonyFullIcon } from '../components/icons/SymfonyFullIcon'; import styles from './index.module.css'; import Companies from '../components/home/companies'; import Testimonials from '../components/home/testimonials'; +import Invocations from '../components/home/invocations';
    @@ -93,5 +94,6 @@ import Testimonials from '../components/home/testimonials';
    + From 2c4462b02fbb331079c2c90df5244122458678e9 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 23 Jul 2023 18:03:44 +0900 Subject: [PATCH 022/144] Website: use cases --- website/src/components/home/companies.jsx | 2 +- website/src/components/home/use-cases.jsx | 68 +++++++++++++++++++++++ website/src/pages/index.mdx | 2 + 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 website/src/components/home/use-cases.jsx diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index ac575d995..3c30752da 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -10,7 +10,7 @@ export default function Companies() {

    - Used in production by + Used in production at

    diff --git a/website/src/components/home/use-cases.jsx b/website/src/components/home/use-cases.jsx new file mode 100644 index 000000000..8b4d9f112 --- /dev/null +++ b/website/src/components/home/use-cases.jsx @@ -0,0 +1,68 @@ +import { CheckIcon } from '@heroicons/react/20/solid'; + +const features = [ + { + name: 'Websites', + description: 'Rerum repellat labore necessitatibus reprehenderit molestiae praesentium.' + }, + { + name: 'HTTP APIs', + description: 'Corporis asperiores ea nulla temporibus asperiores non tempore assumenda aut.' + }, + { + name: 'CLI commands', + description: 'In sit qui aliquid deleniti et. Ad nobis sunt omnis. Quo sapiente dicta laboriosam.' + }, + { + name: 'Cron tasks', + description: 'Sed rerum sunt dignissimos ullam. Iusto iure occaecati voluptate eligendi fugiat sequi.' + }, + { + name: 'Job queues', + description: 'Quos inventore harum enim nesciunt. Aut repellat rerum omnis adipisci.' + }, + { + name: 'Event-driven microservices', + description: 'Eos laudantium repellat sed architecto earum unde incidunt. Illum sit dolores voluptatem.' + }, + { + name: 'File processing', + description: 'Nulla est saepe accusamus nostrum est est. Fugit voluptatum omnis quidem voluptatem.' + }, + { + name: 'WebSockets', + description: 'Nulla est saepe accusamus nostrum est est. Fugit voluptatum omnis quidem voluptatem.' + }, +]; + +export default function UseCases() { + return ( +
    +
    +
    +
    +

    Use cases

    +

    + Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis + suscipit eaque, iste + dolor cupiditate blanditiis ratione. +

    +
    +
    + {features.map((feature) => ( +
    +
    +
    +
    {feature.description}
    +
    + ))} +
    +
    +
    +
    + ); +} diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index ddf5799ec..381109682 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -5,6 +5,7 @@ import styles from './index.module.css'; import Companies from '../components/home/companies'; import Testimonials from '../components/home/testimonials'; import Invocations from '../components/home/invocations'; +import UseCases from '../components/home/use-cases';
    @@ -95,5 +96,6 @@ import Invocations from '../components/home/invocations';
    + From 458d9a065ff88e3bf849020c49450fe5369f4bca Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 23 Jul 2023 18:18:13 +0900 Subject: [PATCH 023/144] Website: theme config --- website/src/components/home/use-cases.jsx | 2 +- website/theme.config.jsx | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/website/src/components/home/use-cases.jsx b/website/src/components/home/use-cases.jsx index 8b4d9f112..998a32365 100644 --- a/website/src/components/home/use-cases.jsx +++ b/website/src/components/home/use-cases.jsx @@ -3,7 +3,7 @@ import { CheckIcon } from '@heroicons/react/20/solid'; const features = [ { name: 'Websites', - description: 'Rerum repellat labore necessitatibus reprehenderit molestiae praesentium.' + description: 'Run PHP websites with your favorite framework (or none), with a CDN and your custom domain.' }, { name: 'HTTP APIs', diff --git a/website/theme.config.jsx b/website/theme.config.jsx index 0a9c52161..d38fb7273 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -3,15 +3,21 @@ import { useRouter } from 'next/router'; export default { logo: bref, + docsRepositoryBase: 'https://github.com/brefphp/bref/blob/main', project: { link: 'https://github.com/brefphp/bref' }, useNextSeoProps() { - const { asPath } = useRouter() + const { asPath } = useRouter(); + console.log(asPath); if (asPath !== '/') { return { titleTemplate: '%s – Bref', }; + } else { + return { + titleTemplate: 'Bref – Simple and scalable PHP with serverless', + }; } }, chat: { @@ -34,6 +40,17 @@ export default { ), + footer: { + text: ( + + MIT {new Date().getFullYear()} ©{' '} + + Matthieu Napoli + + . + + ) + }, components: { // https://github.com/shuding/nextra/blob/main/packages/nextra-theme-docs/src/mdx-components.tsx h1: props => ( From b83b5f2846c6d96013d5c9c06e47f10396c48b5f Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 15 Aug 2023 15:48:25 +0200 Subject: [PATCH 024/144] Add sponsors --- website/src/components/home/sponsors.jsx | 54 ++++++++++++++++++ .../components/home/sponsors/gold-sponsor.jsx | 14 +++++ .../components/home/sponsors/logo-aws.svg} | 0 .../home/sponsors}/logo-craft-cms.png | Bin .../components/home/sponsors}/logo-depot.png | Bin .../home/sponsors}/logo-ecomail.png | Bin .../home/sponsors}/logo-jetbrains.svg | 0 .../home/sponsors}/logo-laravel.svg | 0 .../home/sponsors}/logo-mybuilder.svg | 0 .../components/home/sponsors}/logo-null.png | Bin .../home/sponsors}/logo-secumailer.svg | 0 .../home/sponsors}/logo-shippypro.png | Bin .../home/sponsors}/logo-tideways.svg | 0 .../home/sponsors/premium-sponsor.jsx | 17 ++++++ website/src/pages/index.mdx | 4 +- 15 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 website/src/components/home/sponsors.jsx create mode 100644 website/src/components/home/sponsors/gold-sponsor.jsx rename website/{template/img/aws.svg => src/components/home/sponsors/logo-aws.svg} (100%) rename website/{template/img => src/components/home/sponsors}/logo-craft-cms.png (100%) rename website/{template/img => src/components/home/sponsors}/logo-depot.png (100%) rename website/{template/img => src/components/home/sponsors}/logo-ecomail.png (100%) rename website/{template/img => src/components/home/sponsors}/logo-jetbrains.svg (100%) rename website/{template/img => src/components/home/sponsors}/logo-laravel.svg (100%) rename website/{template/img => src/components/home/sponsors}/logo-mybuilder.svg (100%) rename website/{template/img => src/components/home/sponsors}/logo-null.png (100%) rename website/{template/img => src/components/home/sponsors}/logo-secumailer.svg (100%) rename website/{template/img => src/components/home/sponsors}/logo-shippypro.png (100%) rename website/{template/img => src/components/home/sponsors}/logo-tideways.svg (100%) create mode 100644 website/src/components/home/sponsors/premium-sponsor.jsx diff --git a/website/src/components/home/sponsors.jsx b/website/src/components/home/sponsors.jsx new file mode 100644 index 000000000..fe490fc4f --- /dev/null +++ b/website/src/components/home/sponsors.jsx @@ -0,0 +1,54 @@ +import GoldSponsor from './sponsors/gold-sponsor'; +import craftLogo from './sponsors/logo-craft-cms.png'; +import tidewaysLogo from './sponsors/logo-tideways.svg'; +import myBuilderLogo from './sponsors/logo-mybuilder.svg'; +import shippyProLogo from './sponsors/logo-shippypro.png'; +import nullLogo from './sponsors/logo-null.png'; +import awsLogo from './sponsors/logo-aws.svg'; +import jetbrainsLogo from './sponsors/logo-jetbrains.svg'; +import laravelLogo from './sponsors/logo-laravel.svg'; +import depotLogo from './sponsors/logo-depot.png'; +import secumailerLogo from './sponsors/logo-secumailer.svg'; +import ecomailLogo from './sponsors/logo-ecomail.png'; +import PremiumSponsor from './sponsors/premium-sponsor'; + +export default function Sponsors() { + return ( +
    +
    + +

    + They sponsor the open-source project ❤️ +

    + +

    + Premium sponsors +

    +
    + + + + + + +
    + +

    + Gold sponsors +

    +
    + + + + + +
    + +

    + Become a sponsor and help Bref be a sustainable open-source project. +

    + +
    +
    + ); +} diff --git a/website/src/components/home/sponsors/gold-sponsor.jsx b/website/src/components/home/sponsors/gold-sponsor.jsx new file mode 100644 index 000000000..ef9c44dbc --- /dev/null +++ b/website/src/components/home/sponsors/gold-sponsor.jsx @@ -0,0 +1,14 @@ +import Image from 'next/image'; + +export default function GoldSponsor({ src, alt, href, imgClass }) { + return ( + + {alt} + + ); +} diff --git a/website/template/img/aws.svg b/website/src/components/home/sponsors/logo-aws.svg similarity index 100% rename from website/template/img/aws.svg rename to website/src/components/home/sponsors/logo-aws.svg diff --git a/website/template/img/logo-craft-cms.png b/website/src/components/home/sponsors/logo-craft-cms.png similarity index 100% rename from website/template/img/logo-craft-cms.png rename to website/src/components/home/sponsors/logo-craft-cms.png diff --git a/website/template/img/logo-depot.png b/website/src/components/home/sponsors/logo-depot.png similarity index 100% rename from website/template/img/logo-depot.png rename to website/src/components/home/sponsors/logo-depot.png diff --git a/website/template/img/logo-ecomail.png b/website/src/components/home/sponsors/logo-ecomail.png similarity index 100% rename from website/template/img/logo-ecomail.png rename to website/src/components/home/sponsors/logo-ecomail.png diff --git a/website/template/img/logo-jetbrains.svg b/website/src/components/home/sponsors/logo-jetbrains.svg similarity index 100% rename from website/template/img/logo-jetbrains.svg rename to website/src/components/home/sponsors/logo-jetbrains.svg diff --git a/website/template/img/logo-laravel.svg b/website/src/components/home/sponsors/logo-laravel.svg similarity index 100% rename from website/template/img/logo-laravel.svg rename to website/src/components/home/sponsors/logo-laravel.svg diff --git a/website/template/img/logo-mybuilder.svg b/website/src/components/home/sponsors/logo-mybuilder.svg similarity index 100% rename from website/template/img/logo-mybuilder.svg rename to website/src/components/home/sponsors/logo-mybuilder.svg diff --git a/website/template/img/logo-null.png b/website/src/components/home/sponsors/logo-null.png similarity index 100% rename from website/template/img/logo-null.png rename to website/src/components/home/sponsors/logo-null.png diff --git a/website/template/img/logo-secumailer.svg b/website/src/components/home/sponsors/logo-secumailer.svg similarity index 100% rename from website/template/img/logo-secumailer.svg rename to website/src/components/home/sponsors/logo-secumailer.svg diff --git a/website/template/img/logo-shippypro.png b/website/src/components/home/sponsors/logo-shippypro.png similarity index 100% rename from website/template/img/logo-shippypro.png rename to website/src/components/home/sponsors/logo-shippypro.png diff --git a/website/template/img/logo-tideways.svg b/website/src/components/home/sponsors/logo-tideways.svg similarity index 100% rename from website/template/img/logo-tideways.svg rename to website/src/components/home/sponsors/logo-tideways.svg diff --git a/website/src/components/home/sponsors/premium-sponsor.jsx b/website/src/components/home/sponsors/premium-sponsor.jsx new file mode 100644 index 000000000..ca093d204 --- /dev/null +++ b/website/src/components/home/sponsors/premium-sponsor.jsx @@ -0,0 +1,17 @@ +import Image from 'next/image'; + +export default function PremiumSponsor({ src, alt, href, oneTime }) { + return ( + + {alt} + { oneTime &&
    + * one-time sponsor +
    } +
    + ); +} diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index 381109682..9f35de4d6 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -6,6 +6,7 @@ import Companies from '../components/home/companies'; import Testimonials from '../components/home/testimonials'; import Invocations from '../components/home/invocations'; import UseCases from '../components/home/use-cases'; +import Sponsors from '../components/home/sponsors';
    @@ -97,5 +98,6 @@ import UseCases from '../components/home/use-cases'; - + +[//]: # () From dda3c76565e19db04688798ee7c4f15c901d2e03 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 17 Aug 2023 14:48:30 +0200 Subject: [PATCH 025/144] Add credits --- website/package-lock.json | 90 ++++++++++++- website/package.json | 1 + website/src/components/icons/GitHubIcon.jsx | 7 + website/src/components/icons/TwitterIcon.jsx | 6 + website/src/pages/_meta.json | 7 + website/src/pages/credits.mdx | 133 +++++++++++++++++++ 6 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 website/src/components/icons/GitHubIcon.jsx create mode 100644 website/src/components/icons/TwitterIcon.jsx create mode 100644 website/src/pages/credits.mdx diff --git a/website/package-lock.json b/website/package-lock.json index 00cd16f7f..102bb5f8a 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -6,6 +6,7 @@ "": { "dependencies": { "@heroicons/react": "^2.0.18", + "@octokit/graphql": "^7.0.1", "next": "^13.4.9", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", @@ -547,6 +548,73 @@ "node": ">= 8" } }, + "node_modules/@octokit/endpoint": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", + "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "dependencies": { + "@octokit/types": "^11.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz", + "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==", + "dependencies": { + "@octokit/request": "^8.0.1", + "@octokit/types": "^11.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/request": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", + "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "dependencies": { + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.1.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", + "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "dependencies": { + "@octokit/types": "^11.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", + "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -1600,6 +1668,11 @@ "robust-predicates": "^3.0.0" } }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2392,6 +2465,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-reference": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", @@ -3992,7 +4073,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -5282,6 +5362,11 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -5478,8 +5563,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/yallist": { "version": "2.1.2", diff --git a/website/package.json b/website/package.json index 7063d1604..888865bd3 100644 --- a/website/package.json +++ b/website/package.json @@ -7,6 +7,7 @@ }, "dependencies": { "@heroicons/react": "^2.0.18", + "@octokit/graphql": "^7.0.1", "next": "^13.4.9", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", diff --git a/website/src/components/icons/GitHubIcon.jsx b/website/src/components/icons/GitHubIcon.jsx new file mode 100644 index 000000000..a048e2648 --- /dev/null +++ b/website/src/components/icons/GitHubIcon.jsx @@ -0,0 +1,7 @@ +export function GitHubIcon({ children, ...props }) { + return + GitHub + + ; +} diff --git a/website/src/components/icons/TwitterIcon.jsx b/website/src/components/icons/TwitterIcon.jsx new file mode 100644 index 000000000..4e62c1808 --- /dev/null +++ b/website/src/components/icons/TwitterIcon.jsx @@ -0,0 +1,6 @@ +export function TwitterIcon({children, ...props}) { + return + + ; +} diff --git a/website/src/pages/_meta.json b/website/src/pages/_meta.json index 1b969d71f..41b606fdf 100644 --- a/website/src/pages/_meta.json +++ b/website/src/pages/_meta.json @@ -22,5 +22,12 @@ "title": "Dashboard", "type": "page", "href": "https://dashboard.bref.sh/" + }, + "credits": { + "type": "page", + "title": "Credits", + "display": "hidden", + "theme": { + } } } \ No newline at end of file diff --git a/website/src/pages/credits.mdx b/website/src/pages/credits.mdx new file mode 100644 index 000000000..d15c186a4 --- /dev/null +++ b/website/src/pages/credits.mdx @@ -0,0 +1,133 @@ +import { useData } from 'nextra/data'; +import { graphql } from '@octokit/graphql'; +import { TwitterIcon } from '../components/icons/TwitterIcon'; +import { GitHubIcon } from '../components/icons/GitHubIcon'; + +export const getStaticProps = async () => { + const query = ` + { + viewer { + sponsorshipsAsMaintainer(activeOnly: false, first: 100) { + totalCount + edges { + node { + isActive + isOneTimePayment + sponsorEntity { + __typename + ... on User { + name + login + websiteUrl + twitterUsername + } + ... on Organization { + name + login + websiteUrl + twitterUsername + } + } + } + } + } + } + } + `; + try { + const response = await graphql(query, { + headers: { + authorization: `token ${process.env.GITHUB_TOKEN_REA}` + } + }); + } catch (e) { + console.error(e); + return { + props: { + ssg: { + sponsors: [], + }, + }, + // The page will be considered as stale and regenerated every 60 seconds. + revalidate: false, + }; + } + const sponsors = response.viewer.sponsorshipsAsMaintainer.edges.map(({ node }) => node); + + // See https://nextra.site/docs/guide/ssg + return { + props: { + ssg: { + sponsors, + }, + }, + // The page will be considered as stale and regenerated every 60 seconds. + revalidate: false, + }; +} + +export const SponsorsList = ({ sponsors }) => { + const sortedSponsors = sponsors + // Fill missing names with the login + .map(sponsor => { + sponsor.sponsorEntity.name = sponsor.sponsorEntity.name ?? sponsor.sponsorEntity.login; + return sponsor; + }) + // Sport organizations first, then alphabetically by name second + .sort(({ sponsorEntity: a }, { sponsorEntity: b }) => { + // Same type + if (a.__typename === b.__typename) { + return a.name.localeCompare(b.name); + } + // Different types + return a.__typename === 'Organization' ? -1 : 1; + }); + return

    + {sortedSponsors.map(({ sponsorEntity, isOneTimePayment }) => ( + + + {sponsorEntity.name} + {isOneTimePayment && ' (one-time sponsor)'} + + + {sponsorEntity.websiteUrl && ( + + 🔗 + + )} + {sponsorEntity.twitterUsername && ( + + + + )} + + + + + + ))} +

    ; +}; + +export const CurrentSponsors = () => { + const { sponsors } = useData(); + return isActive)} />; +}; + +export const PastSponsors = () => { + const { sponsors } = useData(); + return !isActive)} />; +}; + +# Credits + +## Current sponsors + + + +## Past sponsors + + From 0d94cd04fcd04747df080a9ebc30c417095116d6 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 17 Aug 2023 15:45:14 +0200 Subject: [PATCH 026/144] Website: use-cases --- website/src/components/home/use-cases.jsx | 33 ++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/website/src/components/home/use-cases.jsx b/website/src/components/home/use-cases.jsx index 998a32365..0a8cec968 100644 --- a/website/src/components/home/use-cases.jsx +++ b/website/src/components/home/use-cases.jsx @@ -3,35 +3,35 @@ import { CheckIcon } from '@heroicons/react/20/solid'; const features = [ { name: 'Websites', - description: 'Run PHP websites with your favorite framework (or none), with a CDN and your custom domain.' + description: 'Run PHP websites with your favorite framework (or none), with a worldwide CDN and your custom domain.' }, { name: 'HTTP APIs', - description: 'Corporis asperiores ea nulla temporibus asperiores non tempore assumenda aut.' + description: 'REST or GraphQL APIs deployed in seconds. Need more performance? Enable Laravel Octane or the Symfony equivalent.' }, { name: 'CLI commands', - description: 'In sit qui aliquid deleniti et. Ad nobis sunt omnis. Quo sapiente dicta laboriosam.' + description: 'Run DB migrations, admin commands, or any other CLI command from your machine or your CI/CD.' }, { name: 'Cron tasks', - description: 'Sed rerum sunt dignissimos ullam. Iusto iure occaecati voluptate eligendi fugiat sequi.' + description: 'Every day, every hour, every minute… Yes, The Cloud™ can do that.' }, { name: 'Job queues', - description: 'Quos inventore harum enim nesciunt. Aut repellat rerum omnis adipisci.' + description: 'Run 1000 jobs with 1 worker in 1000 seconds, or with 1000 workers in 1 second. It\'s just as simple and it costs the same. SQS provides batching, retries, and failure handling.' }, { name: 'Event-driven microservices', - description: 'Eos laudantium repellat sed architecto earum unde incidunt. Illum sit dolores voluptatem.' + description: 'Decouple and scale microservices without container madness. Send messages to EventBridge and let it invoke your PHP classes directly. No integration to write.' }, { name: 'File processing', - description: 'Nulla est saepe accusamus nostrum est est. Fugit voluptatum omnis quidem voluptatem.' + description: 'S3 can invoke a PHP class whenever a new file is uploaded. Resize images, convert videos, generate PDFs…' }, { name: 'WebSockets', - description: 'Nulla est saepe accusamus nostrum est est. Fugit voluptatum omnis quidem voluptatem.' + description: 'AWS API Gateway manages the WebSocket connections for you. Send messages to your users in real-time.' }, ]; @@ -44,9 +44,18 @@ export default function UseCases() {

    Use cases

    - Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis - suscipit eaque, iste - dolor cupiditate blanditiis ratione. + Serverless means whatever you choose it to mean. +

    +

    + Run PHP as usual, {' '}like on any server. + Except it scales (almost) infinitely and you don't maintain the infrastructure.
    + Lift-and-shift existing apps or build new ones with your favorite framework. +

    +

    + Or go the extreme opposite: build cloud-native {' '}event-driven microservices with infinitely scalable cloud services like SQS and EventBridge. +

    +

    + Or anything in between, that works too.

    @@ -57,7 +66,7 @@ export default function UseCases() { aria-hidden="true" /> {feature.name} -
    {feature.description}
    +
    ))} From da3b3745f057490235081e67d92197316181d780 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 17 Aug 2023 16:16:17 +0200 Subject: [PATCH 027/144] Website: add more sections (WIP) --- website/src/components/home/companies.jsx | 100 +++++++------ website/src/components/home/how-it-works.jsx | 72 ++++++++++ website/src/components/home/invocations.jsx | 54 ++++--- website/src/components/home/manifesto.jsx | 55 ++++++++ website/src/components/home/sponsors.jsx | 60 ++++---- website/src/components/home/testimonials.jsx | 58 ++++---- website/src/components/home/use-cases.jsx | 63 ++++----- website/src/pages/index.mdx | 140 ++++++++++--------- website/styles/main.css | 7 + 9 files changed, 366 insertions(+), 243 deletions(-) create mode 100644 website/src/components/home/how-it-works.jsx create mode 100644 website/src/components/home/manifesto.jsx diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index 3c30752da..f50ae0749 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -7,57 +7,55 @@ import enopteaLogo from './companies/enoptea.png'; export default function Companies() { return ( -
    -
    -

    - Used in production at -

    -
    -
    - PhpStan -
    -
    - bCast.fm -
    -
    - MyBuilder -
    -
    - neural.love -
    -
    - Enoptea -
    - - - +
    +

    + Used in production at +

    +
    +
    + PhpStan +
    +
    + bCast.fm +
    +
    + MyBuilder +
    +
    + neural.love +
    +
    + Enoptea +
    + + +
    diff --git a/website/src/components/home/how-it-works.jsx b/website/src/components/home/how-it-works.jsx new file mode 100644 index 000000000..f53c5dff1 --- /dev/null +++ b/website/src/components/home/how-it-works.jsx @@ -0,0 +1,72 @@ +import { CloudArrowUpIcon, LockClosedIcon, ServerIcon } from '@heroicons/react/20/solid' + +const features = [ + { + name: 'Push to deploy.', + description: + 'Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione.', + icon: CloudArrowUpIcon, + }, + { + name: 'SSL certificates.', + description: 'Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo.', + icon: LockClosedIcon, + }, + { + name: 'Database backups.', + description: 'Ac tincidunt sapien vehicula erat auctor pellentesque rhoncus. Et magna sit morbi lobortis.', + icon: ServerIcon, + }, +] + +export default function HowItWorks() { + return ( +
    +
    +
    +
    +

    + How it works +

    +

    + Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, + iste dolor cupiditate blanditiis ratione. +

    +
    + {features.map((feature) => ( +
    +
    +
    {' '} +
    {feature.description}
    +
    + ))} +
    +
    +
    +
    +
    + +
    +
    + ) +} diff --git a/website/src/components/home/invocations.jsx b/website/src/components/home/invocations.jsx index d27c98422..0c6bad6bd 100644 --- a/website/src/components/home/invocations.jsx +++ b/website/src/components/home/invocations.jsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; export default function Invocations() { const invocations = 16411284305; @@ -14,34 +14,32 @@ export default function Invocations() { // }, [counter]); return ( -
    -
    -
    -

    - {counter.toLocaleString('en-US')} -

    -

    - requests, jobs, and messages handled with Bref in the last 30 days -

    - - +
    +
    +

    + {counter.toLocaleString('en-US')} +

    +

    + requests, jobs, and messages handled with Bref in the last 30 days +

    + +
    ) diff --git a/website/src/components/home/manifesto.jsx b/website/src/components/home/manifesto.jsx new file mode 100644 index 000000000..cece41382 --- /dev/null +++ b/website/src/components/home/manifesto.jsx @@ -0,0 +1,55 @@ +import { CheckCircleIcon, InformationCircleIcon } from '@heroicons/react/20/solid' + +export default function Example() { + const date = new Date(); + const year = date.getFullYear(); + + return ( +
    +

    + Why Bref? Why serverless? +

    +

    + We're in {year}. + Applications should scale automatically. + Hosting should be reliable and cost-efficient. + Infrastructure should accelerate development, not consume our time. +

    +
    +

    + Faucibus commodo massa rhoncus, volutpat. Dignissim sed eget risus enim. Mattis mauris semper sed amet vitae + sed turpis id. Id dolor praesent donec est. Odio penatibus risus viverra tellus varius sit neque erat velit. + Faucibus commodo massa rhoncus, volutpat. Dignissim sed eget risus enim. Mattis mauris semper sed amet vitae + sed turpis id. +

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +

    + Serverless provides more scalable, affordable, and reliable architectures for less effort. +

    +
    +
    + ) +} diff --git a/website/src/components/home/sponsors.jsx b/website/src/components/home/sponsors.jsx index fe490fc4f..15a6ae080 100644 --- a/website/src/components/home/sponsors.jsx +++ b/website/src/components/home/sponsors.jsx @@ -14,41 +14,37 @@ import PremiumSponsor from './sponsors/premium-sponsor'; export default function Sponsors() { return ( -
    -
    +
    +

    + They sponsor the open-source project ❤️ +

    -

    - They sponsor the open-source project ❤️ -

    - -

    - Premium sponsors -

    -
    - - - - - - -
    - -

    - Gold sponsors -

    -
    - - - - - -
    - -

    - Become a sponsor and help Bref be a sustainable open-source project. -

    +

    + Premium sponsors +

    +
    + + + + + + +
    +

    + Gold sponsors +

    +
    + + + + +
    + +

    + Become a sponsor and help Bref be a sustainable open-source project. +

    ); } diff --git a/website/src/components/home/testimonials.jsx b/website/src/components/home/testimonials.jsx index b4f9650df..e118aa514 100644 --- a/website/src/components/home/testimonials.jsx +++ b/website/src/components/home/testimonials.jsx @@ -96,36 +96,34 @@ const testimonials = [ export default function Testimonials() { return ( -
    -
    -

    - Happy users and community -

    -
    -
    - {testimonials.map((testimonial) => ( -
    -
    -
    -

    {`“${testimonial.body}”`}

    -
    -
    - {testimonial.author.imageUrl ? ( - {testimonial.author.name} - ) : ( - {testimonial.author.name} - )} -
    -
    {testimonial.author.name}
    - {`@${testimonial.author.handle}`} -
    -
    -
    -
    - ))} -
    +
    +

    + Happy users and community +

    +
    +
    + {testimonials.map((testimonial) => ( +
    +
    +
    +

    {`“${testimonial.body}”`}

    +
    +
    + {testimonial.author.imageUrl ? ( + {testimonial.author.name} + ) : ( + {testimonial.author.name} + )} +
    +
    {testimonial.author.name}
    + {`@${testimonial.author.handle}`} +
    +
    +
    +
    + ))}
    diff --git a/website/src/components/home/use-cases.jsx b/website/src/components/home/use-cases.jsx index 0a8cec968..dd8abb2c3 100644 --- a/website/src/components/home/use-cases.jsx +++ b/website/src/components/home/use-cases.jsx @@ -37,40 +37,37 @@ const features = [ export default function UseCases() { return ( -
    -
    -
    -
    -

    Use cases

    -

    - Serverless means whatever you choose it to mean. -

    -

    - Run PHP as usual, {' '}like on any server. - Except it scales (almost) infinitely and you don't maintain the infrastructure.
    - Lift-and-shift existing apps or build new ones with your favorite framework. -

    -

    - Or go the extreme opposite: build cloud-native {' '}event-driven microservices with infinitely scalable cloud services like SQS and EventBridge. -

    -

    - Or anything in between, that works too. -

    -
    -
    - {features.map((feature) => ( -
    -
    -
    -
    -
    - ))} -
    +
    +
    +
    +

    Use cases

    +

    + Serverless means whatever you choose it to mean. +

    +

    + Run PHP as usual, {' '}like on any server. + Except it scales (almost) infinitely and you don't maintain the infrastructure.
    + Lift-and-shift existing apps or build new ones with your favorite framework. +

    +

    + Or go the extreme opposite: build cloud-native {' '}event-driven microservices with infinitely scalable cloud services like SQS and EventBridge. +

    +

    + Or anything in between, that works too. +

    +
    + {features.map((feature) => ( +
    +
    +
    +
    +
    + ))} +
    ); diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index 9f35de4d6..b9e2a1483 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -7,96 +7,98 @@ import Testimonials from '../components/home/testimonials'; import Invocations from '../components/home/invocations'; import UseCases from '../components/home/use-cases'; import Sponsors from '../components/home/sponsors'; +import Manifesto from '../components/home/manifesto'; +import HowItWorks from '../components/home/how-it-works'; -
    -
    -
    -
    -
    -
    -

    - Simple - and scalable PHP with - serverless -

    -
    - Simplify your infrastructure and scale with ease. -
    -
    - Bref is an **open-source** project that helps you go serverless on AWS with PHP. -
    -
    - - Documentation - - - View on GitHub - -
    -
    - - -
    +
    +
    +
    +
    +
    +

    + Simple + and scalable PHP with + serverless +

    +
    + Simplify your infrastructure and scale with ease. +
    +
    + Bref is an **open-source** project that helps you go serverless on AWS with PHP. +
    +
    + + Documentation + + + View on GitHub + +
    +
    + +
    -
    +
    +
    +

    +
    + + + + + + + + + +
    +
    @@ -138,8 +176,22 @@ export function Calculator() { ${apiGatewayCost.toFixed(2)}
    - Assumptions: API Gateway v2. + Assumptions: API Gateway v2. Lambda Function URL could be used instead of API Gateway to reduce costs.
    + {assetsRequests > 0 && + ${cloudfrontCost.toFixed(2)} + } + {assetsRequests > 0 &&
    + CloudFront costs can vary depending on the use case (e.g. number and size of assets, serving images, streaming videos…). + Browser caching can be used to reduce costs on high traffic websites. + Cloudflare can also be considered as an alternative to CloudFront. +
    } + {assetsRequests > 0 && + ${s3Cost.toFixed(2)} + } + {assetsRequests > 0 &&
    + S3 is used to store assets. +
    } {jobs > 0 && ${sqsCost.toFixed(2)} } @@ -163,8 +215,24 @@ export function Calculator() { }
    -
    -
    +
    +

    + Total costs +

    +
    + ${totalCost.toFixed(2)}/month +
    +
    +
    +
    + The calculator takes into account the AWS free tier (except the free tier that expires after 12 months). + It uses prices for the us-east-1 region. Other regions can have slightly higher costs (a few percents usually). +
    +
    + Costs can vary at scale and can be optimized in numerous ways. + For a cost-optimized architecture tailored to your needs, get in touch. +
    +
    ) } From d436b3c67920a1265ccde0f4a8e3d2318c4bf120 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 1 Sep 2023 14:19:06 +0200 Subject: [PATCH 055/144] Website: add testimonial --- website/src/components/home/testimonials.jsx | 10 ++++++++++ .../src/components/home/testimonials/marco.jpg | Bin 0 -> 23534 bytes 2 files changed, 10 insertions(+) create mode 100644 website/src/components/home/testimonials/marco.jpg diff --git a/website/src/components/home/testimonials.jsx b/website/src/components/home/testimonials.jsx index fa27360b5..0b0a553be 100644 --- a/website/src/components/home/testimonials.jsx +++ b/website/src/components/home/testimonials.jsx @@ -2,6 +2,7 @@ import Image from 'next/image'; import neil from './testimonials/neil.jpg'; import geeh from './testimonials/geeh.jpg'; import paul from './testimonials/paul.jpg'; +import marco from './testimonials/marco.jpg'; import robdwaller from './testimonials/robdwaller.jpg'; import aranreeks from './testimonials/aranreeks.jpg'; import nyholm from './testimonials/nyholm.jpg'; @@ -37,6 +38,15 @@ const testimonials = [ image: paul, }, }, + { + body: 'Happily using Bref since 2019 to process millions of requests, jobs and scheduled tasks. It powers the best technical accomplishment of my career and has made me a better software engineer and open-source contributor.', + author: { + name: 'Marco Deleu', + handle: 'deleugyn', + link: 'https://twitter.com/deleugyn', + image: marco, + }, + }, { body: 'There is something amazing and magical about Bref and serverless deploying stuff to the cloud.', author: { diff --git a/website/src/components/home/testimonials/marco.jpg b/website/src/components/home/testimonials/marco.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3dbe052a1e71fa745dbf1cedafec59eb57ed7c3 GIT binary patch literal 23534 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 A0{{R3 literal 0 HcmV?d00001 From 912aae973e57618208336778ccd9d9d4fe3e984a Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 1 Sep 2023 18:08:00 +0200 Subject: [PATCH 056/144] Website: force light theme --- website/theme.config.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/website/theme.config.jsx b/website/theme.config.jsx index 5a1b2079b..34755c5af 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -31,6 +31,11 @@ export default { ) }, + darkMode: false, + nextThemes: { + themes: ['light'], + enableSystem: false, + }, primaryHue: 202, sidebar: { defaultMenuCollapseLevel: 1, From 291d9aad18e9a10377287717022fc3f1e12fcb90 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 1 Sep 2023 18:08:55 +0200 Subject: [PATCH 057/144] Website --- website/src/pages/_meta.json | 1 + 1 file changed, 1 insertion(+) diff --git a/website/src/pages/_meta.json b/website/src/pages/_meta.json index 2f4ff6e97..baeb6591e 100644 --- a/website/src/pages/_meta.json +++ b/website/src/pages/_meta.json @@ -21,6 +21,7 @@ "plans": { "type": "page", "title": "Plans", + "display": "hidden", "theme": { "layout": "raw" } From 684562096eefd63a07742a18704d58e14219f68d Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 1 Sep 2023 18:14:37 +0200 Subject: [PATCH 058/144] Website: fix state --- docs/cost-calculator.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cost-calculator.mdx b/docs/cost-calculator.mdx index 5d940e7f6..0280335f2 100644 --- a/docs/cost-calculator.mdx +++ b/docs/cost-calculator.mdx @@ -48,7 +48,7 @@ export function Calculator() { const natGatewayCost = 0.045 * 24 * 30; const natInstanceCost = 0.0042 * 24 * 30; - const [ httpRequests, setHttpRequests ] = useState(10000); + const [ httpRequests, setHttpRequests ] = useState(100000); const [ httpDuration, setHttpDuration ] = useState(100); const [ assetsRequests, setAssetsRequests ] = useState(0); const [ bandwidth, setBandwidth ] = useState(0); From 50da2f5db7549c59c361c9084a45993a9a57f129 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 3 Sep 2023 18:34:16 +0200 Subject: [PATCH 059/144] Website: home tweaks --- website/src/components/home/intro.jsx | 2 +- website/src/components/home/use-cases.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/components/home/intro.jsx b/website/src/components/home/intro.jsx index 11f67a0dd..844b000e9 100644 --- a/website/src/components/home/intro.jsx +++ b/website/src/components/home/intro.jsx @@ -14,7 +14,7 @@ const features = [ }, { name: 'Cost-efficient.', - description: 'Instead of paying for servers that are idle most of the time, pay for the time the code is actually running. The AWS free tier even provides about 1 million free requests per month.', + description: 'Instead of paying for servers that are idle most of the time, pay for the time the code is actually running. The AWS free tier even provides about 1 million free requests per month. Play with the serverless costs calculator.', icon: BanknotesIcon, }, ] diff --git a/website/src/components/home/use-cases.jsx b/website/src/components/home/use-cases.jsx index 483413a4e..fba03d934 100644 --- a/website/src/components/home/use-cases.jsx +++ b/website/src/components/home/use-cases.jsx @@ -3,7 +3,7 @@ import { CheckIcon } from '@heroicons/react/20/solid'; const simpleUseCases = [ { name: 'Websites', - description: 'Run PHP websites with your favorite framework (or none), with a worldwide CDN and your custom domain.' + description: 'Run PHP websites with Laravel, Symfony or any other framework, with a worldwide CDN and your custom domain.' }, { name: 'HTTP APIs', From ed0e3d67a373d41cebc293036d41e15d0ccfc149 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 4 Sep 2023 10:30:13 +0200 Subject: [PATCH 060/144] Website: sentry --- website/src/components/Breadcrumbs.jsx | 31 ++++ website/src/components/sentry/sentry.png | Bin 0 -> 550815 bytes website/src/pages/_meta.json | 8 ++ website/src/pages/sentry.mdx | 171 +++++++++++++++++++++++ 4 files changed, 210 insertions(+) create mode 100644 website/src/components/Breadcrumbs.jsx create mode 100644 website/src/components/sentry/sentry.png create mode 100644 website/src/pages/sentry.mdx diff --git a/website/src/components/Breadcrumbs.jsx b/website/src/components/Breadcrumbs.jsx new file mode 100644 index 000000000..d134c5f34 --- /dev/null +++ b/website/src/components/Breadcrumbs.jsx @@ -0,0 +1,31 @@ +import { ChevronRightIcon } from '@heroicons/react/20/solid' + +/** + * @param {Array<{name: string; href: string; current: boolean}>} pages + */ +export default function Breadcrumbs({ pages }) { + return ( + + ) +} diff --git a/website/src/components/sentry/sentry.png b/website/src/components/sentry/sentry.png new file mode 100644 index 0000000000000000000000000000000000000000..5778a1b01793e7f6c0b1b07df11b7bf4d7c00f35 GIT binary patch literal 550815 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

    p!n9s5J#iKjWZs-t478lLTs1nzSt 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

    P^Gch~gA=*Dz1jF2I0LtJcYODiMc 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%0D1r4?Ql7_)%3E^-{rS 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

    IFCxrpG`!Afjt8b_l>T%`#?{I9-+mXR#UdMkE5r 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�h@-*I8jRza1V9M$_o^NcMPV8S&e-E>Is;opPoWWX?yKA!D?F zP11~yxrmJ=gBV!2+y&WR=v_28T(GKuCTBYWsPLcKH~`!M;X2H+v_1l=--mtEVE)b3o>HN>^d>qD5Ivdq z-Y=bUzd34G24x)`c0((Jd(0-dCru5Py*skzk7!5uT6yyBXw{GC#voZp=GFxG9Ebu5~{`e1fB7Bv-4tS=C*I z+i|WDIM^+m^RFDfD9NV}=eTbX#J9)jrW7MvNf*Bfrr!?i4oTz`1*J?C?E$4MjS%#~Gn35O;Jr1Y^o|lab+wrQNi8@U5IW;p3U>swM zY%p=Bc_KLDS(=tvu zp8m}iPt_Q-@2&~8XI1GVYIdiry*4K^?e3U*UhCu!LR)o0wYW3g_LJHqYG?IMWjh8!FgLrB zf4X_uQ1YzPv`p9yU*rY-Ah0}^G`Mh!Ur(l zDlz={-wnzq5L>@RQ_1e=e{}fg?B@W8-CQEb%saOJTP>5hgt1uTU~dRrWe_J6iyT8` zW~y|uR*Y7tC8o_*limp3#0AvHSv1VEv7^%M-lWl~Fk?Q)VzM$1owrYNt~_A$2I#(H z#n)4W_~2JF{q#@_sfT(5izO;doqsEzmqaA5+BA2-5hq) zGY$J!<>T1rT=JBv(4)mJvZDgLBXtT7=%nGj&gC|F$&q2D3OqH9Mn_d#61)PeBrS!R zGy0#MeaKCHo3mjspXXFOS=s@(`&N7t*3v*c-lDd)MUY+ObkYch!m;oM+pm$mWeHUZ zF91I&q~kpPQOcH|l%&N;jN~up_(M!mJOKlBGXbXC-R^?^S;MMW%FiT*RJET9`6lz! z!F#@l{-s(!OiKu%^sFvD;`CJ5(-0Y(6JFu26H{g^F)r3*UTO-6^5gHo$guk99u0St z%Al60Fn>PpbF`21Fu=hAinP8RZR^qP@uL-S`|G6a{*UQ87#Ng~CSSc_Up+j2%8Q}W zN1y)Eu}brAL8&glTkZdXR*E2WRH;l!XiNmVvVdyLLfHUTe9^N9@Nghk0al3t1S=ABmkZcQ^N0{(*evw!2BZsBh3OKL%>*DqbCjmwM$_OFlp5*~J*-21O| ze*?cO@}k>@E0_V>;|HKb=>3*^V$LNO?fWX_@-~HpGde-!HSHc@&Ii}G6zktPM_#Zo zbGWjtk#Bt96yqGjUMV|bQ*UoMo)?7cTqVcc+GijOI5L1aI}#=(3KB}07EGI(zph4fj7vI$=)$^&X^_8U8oN%RzbC;9rEo^6Zhp^XX(FnvCY>JD{FW z^nKDE`D%~&+$eN>Y=PTVg&np(Cs(u^b_6cuu**i>Ct@D{t( z=I6WJm6b8Jx~nG+e>J*pHOOfF79AmgN?X;7P^Jkx!(NM%ltv@wg&$UML%-fkldt4f zTe&Y;E213|&u2bSFg_Q=+--}y+ejx%2MnPkqL>s|Cd`Zz8 zw1)Yah-B19AkiOV*bjS=UQ-_yk~f)eTd7#-s!E32eS3Fq*{3kTpog#ijR;20xMy6M z$RGtOF8)pqUbT?{LPtykn22Qxlq?D~`Gx!1y6rxu;`KyPfd+!kniSj=r9w$b%WJz! z1#5k<31G~m2@0d`*}tWX>?H3&xa<)AR)oK{Gd}uTRQSojpr})4DZu>x{lH}`U$-dp zG(qL5iIqp(Gz+AW+NZ4Jgq@m^WHO(WvMKa~K%%{A&!PYyYE*m764ZfZx;2X0SBNt3 zV&iEQUV_aBZ>n!Z@KDRFDP(Mmt;HWKJX1WT3(8aOD@Nu3JCJ!JcoV!J4M9+ z*NHf3(y!wG^J;RwKNoth-WzYkhNpu6T$uJ}{WC5j7_O{L3_eSgA?-``j4v+Wi!O9 zdEy(JjYoJS! zKxhiHNGd#x@4CbGA3A#2o6Q#lNQOsDAM5)^a}S?3y(S6U4)EElAuuvjgB9LmwBsyK zYCP)OZK=RhXwV#)P;reVhAmnK#KUHRtb-D`dFO|uD$^HX=V9{^LP3~~HD7~pb>3k7hr_WELF@$hc!sZ2 dZmzx-2ibL?L!(hmK2Nao? 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%0AF(xorYVbbMGC#WidskQf* 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⪻oieIvDl9#)=2jlk($;W*3_ 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

    yWpibl)3Jvy-3@y?Gf5P;Pg*MeFrwMZsrds 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 + +
    +
    + Sentry integration for AWS Lambda + +
    +
    +
    + {features.map((feature) => ( +
    +
    +
    + {' '} +
    {feature.description}
    +
    + ))} +
    +
    +
    + + +export const includedFeatures = [ + 'Composer package & documentation', + 'Email and Slack support', + 'Unlimited projects', + 'Unlimited users', +] + +
    +
    +

    + Simple pricing +

    +
    + Get access to the package for a one-time price with optional yearly renewal. +
    +
    +
    +
    +

    + One-time price with optional yearly renewal +

    +
    + The license includes access to the current version of the package. + During checkout, you can optionally enable automatic yearly renewal so that you can always access the latest version of the package. +
    +
    +

    What’s included

    +
    +
    +
      + {includedFeatures.map((feature) => ( +
    • +
    • + ))} +
    +
    +

    What’s optional

    +
    +
    +
      +
    • +
    • +
    +
    +
    +
    +
    +
    + License price +
    +
    + 90 +
    +
    + * optional yearly renewal +
    + + Get access + +
    + Invoices and receipts available for easy company reimbursement +
    +
    + 7-days no-questions-asked refund policy +
    +
    +
    +
    +
    +
    From e54665a15773d368ddae5fc4d2355e3ed48c0ce4 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 6 Sep 2023 17:56:35 +0200 Subject: [PATCH 061/144] Website: add contributors to the credits --- website/src/pages/credits.mdx | 135 ++++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 29 deletions(-) diff --git a/website/src/pages/credits.mdx b/website/src/pages/credits.mdx index d15c186a4..332caae70 100644 --- a/website/src/pages/credits.mdx +++ b/website/src/pages/credits.mdx @@ -1,10 +1,61 @@ import { useData } from 'nextra/data'; import { graphql } from '@octokit/graphql'; -import { TwitterIcon } from '../components/icons/TwitterIcon'; -import { GitHubIcon } from '../components/icons/GitHubIcon'; export const getStaticProps = async () => { - const query = ` + const nonGitHubSponsors = [ + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'whilenull', + name: 'Null', + websiteUrl: 'https://null.tc/?ref=bref', + }, + isOneTimePayment: false, + }, + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'CraftCMS', + name: 'CraftCMS', + websiteUrl: 'https://craftcms.com/?ref=bref.sh', + }, + isOneTimePayment: false, + }, + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'ShippyPro', + name: 'ShippyPro', + websiteUrl: 'https://www.shippypro.com/?ref=bref.sh', + }, + isOneTimePayment: false, + }, + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'Tideways', + name: 'Tideways', + websiteUrl: 'https://tideways.com/?ref=bref', + }, + isOneTimePayment: false, + }, + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'MyBuilder', + name: 'MyBuilder', + websiteUrl: 'https://www.mybuilder.com/?ref=bref.sh', + }, + isOneTimePayment: false, + }, + ]; + + const sponsorsQuery = ` { viewer { sponsorshipsAsMaintainer(activeOnly: false, first: 100) { @@ -34,10 +85,11 @@ export const getStaticProps = async () => { } } `; + let sponsorsResponse; try { - const response = await graphql(query, { + sponsorsResponse = await graphql(sponsorsQuery, { headers: { - authorization: `token ${process.env.GITHUB_TOKEN_REA}` + authorization: `token ${process.env.GITHUB_TOKEN_READ}` } }); } catch (e) { @@ -46,19 +98,39 @@ export const getStaticProps = async () => { props: { ssg: { sponsors: [], + contributors: [], }, }, // The page will be considered as stale and regenerated every 60 seconds. revalidate: false, }; } - const sponsors = response.viewer.sponsorshipsAsMaintainer.edges.map(({ node }) => node); + const sponsors = [ + ...nonGitHubSponsors, + ...sponsorsResponse.viewer.sponsorshipsAsMaintainer.edges.map(({ node }) => node), + ]; + + // Retrieve the list of contributors from the GitHub REST API + // Implement the pagination too + // See https://docs.github.com/en/rest/reference/repos#list-repository-contributors + const contributors = []; + let page = 1; + let hasNextPage = true; + while (hasNextPage) { + const response = await fetch(`https://api.github.com/repos/brefphp/bref/contributors?page=${page}&per_page=100`); + const data = await response.json(); + contributors.push(...data.map(({ login, html_url, contributions }) => ({ login, html_url, contributions }))); + hasNextPage = response.headers.get('Link')?.includes('rel="next"'); + page++; + } + contributors.sort((a, b) => b.contributions - a.contributions); // See https://nextra.site/docs/guide/ssg return { props: { ssg: { sponsors, + contributors, }, }, // The page will be considered as stale and regenerated every 60 seconds. @@ -83,32 +155,33 @@ export const SponsorsList = ({ sponsors }) => { return a.__typename === 'Organization' ? -1 : 1; }); return

    - {sortedSponsors.map(({ sponsorEntity, isOneTimePayment }) => ( - - + {sortedSponsors.map(({ sponsorEntity, isOneTimePayment }, i) => ( + + {i > 0 && ", "} + {sponsorEntity.name} - {isOneTimePayment && ' (one-time sponsor)'} - - - {sponsorEntity.websiteUrl && ( - - 🔗 - - )} - {sponsorEntity.twitterUsername && ( - - - - )} - - - - + + {isOneTimePayment && ' (one-time sponsor)'} + + ))} + . +

    ; +}; + +export const ContributorsList = () => { + const { contributors } = useData(); + return

    + {contributors.map(({ login, html_url, contributions }, i) => ( + + {i > 0 && ", "} + + {login} + + {contributions > 1 && ` (${contributions})`} ))} + .

    ; }; @@ -128,6 +201,10 @@ export const PastSponsors = () => { +## Contributors + + + ## Past sponsors From 4d71221907ca8624659c884af05e00acc00a80ed Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 7 Sep 2023 11:57:13 +0200 Subject: [PATCH 062/144] Website: improve contributor list --- website/src/github/contributors.js | 29 +++++++++++++++++++++++++++++ website/src/pages/credits.mdx | 25 +++++++++++-------------- 2 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 website/src/github/contributors.js diff --git a/website/src/github/contributors.js b/website/src/github/contributors.js new file mode 100644 index 000000000..e1d17fd6d --- /dev/null +++ b/website/src/github/contributors.js @@ -0,0 +1,29 @@ +export async function getContributors(repository) { + // Retrieve the list of contributors from the GitHub REST API + // See https://docs.github.com/en/rest/reference/repos#list-repository-contributors + const contributors = []; + let page = 1; + let hasNextPage = true; + while (hasNextPage) { + const response = await fetch(`https://api.github.com/repos/${repository}/contributors?page=${page}&per_page=100`); + const data = await response.json(); + contributors.push(...data.map(({ login, html_url, contributions }) => ({ login, html_url, contributions }))); + hasNextPage = response.headers.get('Link')?.includes('rel="next"'); + page++; + } + return contributors; +} + +export function mergeAndSortContributors(contributors) { + // Merge duplicates and sum contributions + const contributorsMap = {}; + contributors.forEach(contributor => { + if (!contributorsMap[contributor.login]) { + contributorsMap[contributor.login] = contributor; + } else { + contributorsMap[contributor.login].contributions += contributor.contributions; + } + }); + return Object.values(contributorsMap) + .sort((a, b) => b.contributions - a.contributions); +} \ No newline at end of file diff --git a/website/src/pages/credits.mdx b/website/src/pages/credits.mdx index 332caae70..f3256d2b1 100644 --- a/website/src/pages/credits.mdx +++ b/website/src/pages/credits.mdx @@ -1,5 +1,6 @@ import { useData } from 'nextra/data'; import { graphql } from '@octokit/graphql'; +import { getContributors, mergeAndSortContributors } from '../github/contributors'; export const getStaticProps = async () => { const nonGitHubSponsors = [ @@ -110,20 +111,14 @@ export const getStaticProps = async () => { ...sponsorsResponse.viewer.sponsorshipsAsMaintainer.edges.map(({ node }) => node), ]; - // Retrieve the list of contributors from the GitHub REST API - // Implement the pagination too - // See https://docs.github.com/en/rest/reference/repos#list-repository-contributors - const contributors = []; - let page = 1; - let hasNextPage = true; - while (hasNextPage) { - const response = await fetch(`https://api.github.com/repos/brefphp/bref/contributors?page=${page}&per_page=100`); - const data = await response.json(); - contributors.push(...data.map(({ login, html_url, contributions }) => ({ login, html_url, contributions }))); - hasNextPage = response.headers.get('Link')?.includes('rel="next"'); - page++; - } - contributors.sort((a, b) => b.contributions - a.contributions); + const contributors = mergeAndSortContributors([ + ...(await getContributors('brefphp/bref')), + ...(await getContributors('brefphp/aws-lambda-layers')), + ...(await getContributors('brefphp/laravel-bridge')), + ...(await getContributors('brefphp/symfony-bridge')), + ...(await getContributors('brefphp/extra-php-extensions')), + ...(await getContributors('brefphp/examples')), + ]); // See https://nextra.site/docs/guide/ssg return { @@ -197,6 +192,8 @@ export const PastSponsors = () => { # Credits +Here are the amazing people behind Bref. Either they are sponsoring Bref or they have contributed to the project. + ## Current sponsors From 26f945c2ce6d811705d8369b4029504e63de1ddd Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 7 Sep 2023 12:09:20 +0200 Subject: [PATCH 063/144] Website: fix color contrast --- website/src/components/home/companies.jsx | 16 ++++++++-------- .../components/home/sponsors/gold-sponsor.jsx | 2 +- .../components/home/sponsors/premium-sponsor.jsx | 2 +- website/src/components/home/testimonials.jsx | 6 +++--- website/src/components/plans/plans.jsx | 4 ++-- website/src/pages/sentry.mdx | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index f50ae0749..bf8a81ad4 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -13,48 +13,48 @@ export default function Companies() {

    -
    +
    PhpStan
    -
    +
    bCast.fm
    -
    +
    MyBuilder
    -
    +
    neural.love
    -
    +
    Enoptea
    -
    + -
    + - diff --git a/website/src/components/home/sponsors/gold-sponsor.jsx b/website/src/components/home/sponsors/gold-sponsor.jsx index ef9c44dbc..fc0bb8098 100644 --- a/website/src/components/home/sponsors/gold-sponsor.jsx +++ b/website/src/components/home/sponsors/gold-sponsor.jsx @@ -2,7 +2,7 @@ import Image from 'next/image'; export default function GoldSponsor({ src, alt, href, imgClass }) { return ( - {testimonials.map((testimonial) => (
    -
    +

    {testimonial.author.imageUrl ? ( - {testimonial.author.name} ) : ( - {testimonial.author.name} )}
    diff --git a/website/src/components/plans/plans.jsx b/website/src/components/plans/plans.jsx index 952f172b5..887c58d86 100644 --- a/website/src/components/plans/plans.jsx +++ b/website/src/components/plans/plans.jsx @@ -87,7 +87,7 @@ export default function Plans() {
    @@ -147,7 +147,7 @@ export default function Plans() { aria-hidden="true" style={{ marginLeft: `${(tiers.findIndex((tier) => tier.mostPopular) + 1) * 25}%` }} > -
    +
    ) : null} diff --git a/website/src/pages/sentry.mdx b/website/src/pages/sentry.mdx index 8dc8b3e85..573f29fdb 100644 --- a/website/src/pages/sentry.mdx +++ b/website/src/pages/sentry.mdx @@ -141,7 +141,7 @@ export const includedFeatures = [
    + className="rounded-2xl bg-gray-400/10 py-10 text-center ring-1 ring-inset ring-gray-900/5 lg:flex lg:flex-col lg:justify-center lg:py-16">
    License price From 24e9a8ce7972cafd584950e413cd20d6a2840021 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 8 Sep 2023 14:33:15 +0200 Subject: [PATCH 064/144] Website: landing CTA --- website/src/components/home/Cta-Bottom.jsx | 24 ++++++++++++++++++++ website/src/components/home/testimonials.jsx | 2 +- website/src/pages/index.mdx | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 website/src/components/home/Cta-Bottom.jsx diff --git a/website/src/components/home/Cta-Bottom.jsx b/website/src/components/home/Cta-Bottom.jsx new file mode 100644 index 000000000..9fc2007d4 --- /dev/null +++ b/website/src/components/home/Cta-Bottom.jsx @@ -0,0 +1,24 @@ +export default function CtaBottom() { + return ( + + ) +} diff --git a/website/src/components/home/testimonials.jsx b/website/src/components/home/testimonials.jsx index aaa84d2e3..86b62ff2a 100644 --- a/website/src/components/home/testimonials.jsx +++ b/website/src/components/home/testimonials.jsx @@ -66,7 +66,7 @@ const testimonials = [ }, }, { - body: 'I’ve been running APIs and websites with bref (in prod) for over a year now. It is indeed as simple as you describe it.', + body: 'I’ve been running APIs and websites with Bref in prod for over a year now. It is indeed as simple as you describe it.', author: { name: 'Tobias Nyholm', handle: 'TobiasNyholm', diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index 7d0aac7db..8e88542a1 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -10,6 +10,7 @@ import Sponsors from '../components/home/sponsors'; import Intro from '../components/home/intro'; import { useData } from 'nextra/data'; import { getBrefInvocations } from '../aws/invocations'; +import CtaBottom from '../components/home/Cta-Bottom'; export async function getStaticProps() { let invocations; @@ -123,3 +124,4 @@ export async function getStaticProps() { [//]: # () + From 9be38cea77ad06b38a43350e85dbf186a37d74fe Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 8 Sep 2023 15:09:29 +0200 Subject: [PATCH 065/144] Website: company list --- website/src/components/home/Cta-Bottom.jsx | 24 ---- website/src/components/home/companies.jsx | 112 ++++++++++-------- .../src/components/home/companies/gulli.svg | 95 +++++++++++++++ website/src/pages/index.mdx | 3 +- 4 files changed, 158 insertions(+), 76 deletions(-) delete mode 100644 website/src/components/home/Cta-Bottom.jsx create mode 100644 website/src/components/home/companies/gulli.svg diff --git a/website/src/components/home/Cta-Bottom.jsx b/website/src/components/home/Cta-Bottom.jsx deleted file mode 100644 index 9fc2007d4..000000000 --- a/website/src/components/home/Cta-Bottom.jsx +++ /dev/null @@ -1,24 +0,0 @@ -export default function CtaBottom() { - return ( -
    -
    -

    - Ready to dive in? -
    - Get started in under a minute. -

    - -
    -
    - ) -} diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index bf8a81ad4..a3cbe3756 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -4,60 +4,72 @@ import bcastLogo from './companies/bcast.svg'; import myBuilderLogo from './companies/mybuilder.svg'; import neuralLoveLogo from './companies/neural-love.svg'; import enopteaLogo from './companies/enoptea.png'; +import gulliLogo from './companies/gulli.svg'; export default function Companies() { return ( -
    -

    - Used in production at -

    -
    -
    - PhpStan -
    -
    - bCast.fm -
    -
    - MyBuilder -
    -
    - neural.love -
    -
    - Enoptea -
    - - -
    - add your company +
    +
    +
    +
    +

    + Used in production around the world +

    +

    + Get started with Bref on your own, or get in touch for support and consulting. +

    + +
    +
    + PhpStan + bCast.fm + MyBuilder + Gulli.fr + neural.love + Enoptea +
    + phpjobs.app +
    +
    + externals.io +
    +
    - ); + ) } diff --git a/website/src/components/home/companies/gulli.svg b/website/src/components/home/companies/gulli.svg new file mode 100644 index 000000000..b9615c66d --- /dev/null +++ b/website/src/components/home/companies/gulli.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index 8e88542a1..656cf38fa 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -122,6 +122,5 @@ export async function getStaticProps() { -[//]: # () - + From e61313d46a77533e4722f3903321b17259fe07ba Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 8 Sep 2023 15:09:45 +0200 Subject: [PATCH 066/144] Website: company list --- website/src/pages/index.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index 656cf38fa..188f8e776 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -10,7 +10,6 @@ import Sponsors from '../components/home/sponsors'; import Intro from '../components/home/intro'; import { useData } from 'nextra/data'; import { getBrefInvocations } from '../aws/invocations'; -import CtaBottom from '../components/home/Cta-Bottom'; export async function getStaticProps() { let invocations; From 050875ee2c13d7c5eb7d7153030e556def474466 Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Mon, 11 Sep 2023 11:47:04 +0100 Subject: [PATCH 067/144] [website-v3] Replace a bunch of http links with https --- Makefile | 6 +-- docs/environment/php.mdx | 86 +++++++++++++++++++------------------- docs/runtimes/function.mdx | 2 +- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/Makefile b/Makefile index a2bdaf022..87e455abe 100644 --- a/Makefile +++ b/Makefile @@ -6,16 +6,16 @@ trigger_runtimes: runtime_build_status: aws codepipeline get-pipeline-state --name=bref-php-binary | jq ".stageStates[1].latestExecution.status" -# Generate and deploy the production version of the website using http://couscous.io +# Generate and deploy the production version of the website using https://couscous.io/ website: - # See http://couscous.io/ + # See https://couscous.io/ couscous generate netlify deploy --prod --dir=.couscous/generated website-staging: couscous generate netlify deploy --dir=.couscous/generated -# Run a local preview of the website using http://couscous.io +# Run a local preview of the website using https://couscous.io/ website-preview: couscous preview diff --git a/docs/environment/php.mdx b/docs/environment/php.mdx index 52df000fd..6912ab41d 100644 --- a/docs/environment/php.mdx +++ b/docs/environment/php.mdx @@ -24,7 +24,7 @@ PHP will automatically include any `*.ini` file found in `php/conf.d/` in your p ### Customizing php.ini using a custom path -If you want PHP to scan a different directory than `php/conf.d/` in your project, you can override the path by setting it in the [`PHP_INI_SCAN_DIR`](http://php.net/manual/configuration.file.php#configuration.file.scan) environment variable. +If you want PHP to scan a different directory than `php/conf.d/` in your project, you can override the path by setting it in the [`PHP_INI_SCAN_DIR`](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan) environment variable. `PHP_INI_SCAN_DIR` must contain an absolute path. Since your code is placed in `/var/task` on AWS Lambda, the environment variable should contain something like `/var/task/my/different/dir`. @@ -48,56 +48,56 @@ The following extensions are installed and enabled by default in Bref runtimes: ### Extensions installed but disabled by default The following extensions are installed in Bref runtimes, but disabled by default: -- **[intl](http://php.net/manual/en/intro.intl.php)** - Internationalization extension (referred as Intl) is a wrapper for ICU library, enabling PHP programmers to perform various locale-aware operations. -- **[APCu](http://php.net/manual/en/intro.apcu.php)** - APCu is APC stripped of opcode caching. -- **[PostgreSQL PDO Driver](http://php.net/manual/en/ref.pdo-pgsql.php)** - PDO_PGSQL is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to PostgreSQL databases. +- **[intl](https://www.php.net/manual/en/intro.intl.php)** - Internationalization extension (referred as Intl) is a wrapper for ICU library, enabling PHP programmers to perform various locale-aware operations. +- **[APCu](https://www.php.net/manual/en/intro.apcu.php)** - APCu is APC stripped of opcode caching. +- **[PostgreSQL PDO Driver](https://www.php.net/manual/en/ref.pdo-pgsql.php)** - PDO_PGSQL is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to PostgreSQL databases. You can enable these extensions by loading them in `php/conf.d/php.ini` (as mentioned in [the section above](#phpini)), for example: diff --git a/docs/runtimes/function.mdx b/docs/runtimes/function.mdx index 433ddc731..d35727b48 100644 --- a/docs/runtimes/function.mdx +++ b/docs/runtimes/function.mdx @@ -52,7 +52,7 @@ functions: ## PHP functions -Functions that can run on Lambda can be an anonymous function or [any kind of callable supported by PHP](http://php.net/manual/en/language.types.callable.php). +Functions that can run on Lambda can be an anonymous function or [any kind of callable supported by PHP](https://www.php.net/manual/en/language.types.callable.php). ```php Date: Mon, 11 Sep 2023 13:54:15 +0200 Subject: [PATCH 068/144] Website: footer --- website/redirects.js | 1 + website/src/components/Footer.jsx | 62 ++++++++++++++++++++++ website/src/components/icons/SlackIcon.jsx | 3 ++ website/theme.config.jsx | 3 +- 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 website/src/components/Footer.jsx create mode 100644 website/src/components/icons/SlackIcon.jsx diff --git a/website/redirects.js b/website/redirects.js index b431fc7c1..800a05f03 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -1,4 +1,5 @@ module.exports.redirects = { + '/slack': 'https://join.slack.com/t/brefworkspace/shared_invite/enQtNTcwMjU2NTcxNjAxLTIxYmM2MmRjMDkzYjdjYTNkMmE5NGI3YTcyZjc2ZGRjNTFmNjFmYzk5NWQ1YmVhMDkwNzExNzhjZThkZWM0ODE', '/docs/environment/custom-domains': '/docs/use-cases/http/custom-domains', '/docs/aws-cdk': '/docs/deploy/aws-cdk', '/docs/web-apps/index.md#assets': '/docs/use-cases/websites', diff --git a/website/src/components/Footer.jsx b/website/src/components/Footer.jsx new file mode 100644 index 000000000..c7c81697e --- /dev/null +++ b/website/src/components/Footer.jsx @@ -0,0 +1,62 @@ +import { TwitterIcon } from './icons/TwitterIcon'; +import { GitHubIcon } from './icons/GitHubIcon'; +import { SlackIcon } from './icons/SlackIcon'; + +const navigation = { + main: [ + { name: 'Home', href: '/' }, + { name: 'Documentation', href: '/docs/' }, + { name: 'News', href: '/news/' }, + { name: 'Bref Dashboard', href: 'https://dashboard.bref.sh/' }, + { name: 'Credits', href: '/credits' }, + ], + social: [ + { + name: 'GitHub', + href: 'https://github.com/brefphp/bref', + icon: GitHubIcon, + }, + { + name: 'Twitter', + href: 'https://twitter.com/brefphp', + icon: TwitterIcon, + }, + { + name: 'Slack', + href: '/slack', + icon: SlackIcon, + }, + ], +} + +export default function Footer() { + return ( + + ) +} diff --git a/website/src/components/icons/SlackIcon.jsx b/website/src/components/icons/SlackIcon.jsx new file mode 100644 index 000000000..3d9acf3bc --- /dev/null +++ b/website/src/components/icons/SlackIcon.jsx @@ -0,0 +1,3 @@ +export function SlackIcon({children, ...props}) { + return +} diff --git a/website/theme.config.jsx b/website/theme.config.jsx index 34755c5af..68009efca 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -1,6 +1,7 @@ // https://nextra.site/docs/docs-theme/theme-configuration import { useRouter } from 'next/router'; import { AnimatedLogo } from './src/components/AnimatedLogo'; +import Footer from './src/components/Footer'; export default { logo: , @@ -34,7 +35,6 @@ export default { darkMode: false, nextThemes: { themes: ['light'], - enableSystem: false, }, primaryHue: 202, sidebar: { @@ -46,6 +46,7 @@ export default { ), footer: { + component: Footer, text: ( MIT {new Date().getFullYear()} ©{' '} From 89caa9b2514f8acc50f979095a4c7921ab19fb3c Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 11 Sep 2023 14:04:39 +0200 Subject: [PATCH 069/144] Website: automate deployment --- .github/workflows/website.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/website.yml diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 000000000..ecc174a93 --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,23 @@ +name: Website + +on: + push: + branches: [ 'website-v3' ] + +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + +jobs: + + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: npm install --global vercel@latest + - name: Pull Vercel Environment Information + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + - name: Build + run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} + - name: Deploy + run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} From cca3a068b06eb60566616c5a7a2c1c426048fb41 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 11 Sep 2023 14:06:40 +0200 Subject: [PATCH 070/144] Website: automate deployment --- .github/workflows/website.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index ecc174a93..162b55f02 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -12,6 +12,9 @@ jobs: deploy: runs-on: ubuntu-latest + defaults: + run: + working-directory: ./website steps: - uses: actions/checkout@v3 - run: npm install --global vercel@latest From 4770deb4d93d3b764ed1308d518d9d6bc66b66a6 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 11 Sep 2023 14:09:42 +0200 Subject: [PATCH 071/144] Website: automate deployment --- .github/workflows/website.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 162b55f02..ee9b2087b 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -18,6 +18,7 @@ jobs: steps: - uses: actions/checkout@v3 - run: npm install --global vercel@latest + - run: make src/pages/docs - name: Pull Vercel Environment Information run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} - name: Build From 96a90bbd7f8490979df8bbd82352e00cc9d915d1 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 11 Sep 2023 14:28:37 +0200 Subject: [PATCH 072/144] Website: credits credentials --- website/src/github/sponsors.js | 105 +++++++++++++++++++++++++++++++++ website/src/pages/credits.mdx | 99 +------------------------------ 2 files changed, 108 insertions(+), 96 deletions(-) create mode 100644 website/src/github/sponsors.js diff --git a/website/src/github/sponsors.js b/website/src/github/sponsors.js new file mode 100644 index 000000000..8cebeba1b --- /dev/null +++ b/website/src/github/sponsors.js @@ -0,0 +1,105 @@ +import { graphql } from '@octokit/graphql'; + +const nonGitHubSponsors = [ + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'whilenull', + name: 'Null', + websiteUrl: 'https://null.tc/?ref=bref', + }, + isOneTimePayment: false, + }, + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'CraftCMS', + name: 'CraftCMS', + websiteUrl: 'https://craftcms.com/?ref=bref.sh', + }, + isOneTimePayment: false, + }, + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'ShippyPro', + name: 'ShippyPro', + websiteUrl: 'https://www.shippypro.com/?ref=bref.sh', + }, + isOneTimePayment: false, + }, + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'Tideways', + name: 'Tideways', + websiteUrl: 'https://tideways.com/?ref=bref', + }, + isOneTimePayment: false, + }, + { + isActive: true, + sponsorEntity: { + __typename: 'Organization', + login: 'MyBuilder', + name: 'MyBuilder', + websiteUrl: 'https://www.mybuilder.com/?ref=bref.sh', + }, + isOneTimePayment: false, + }, +]; + +export async function getSponsors() { + let githubToken = process.env.GITHUB_TOKEN_READ; + if (!githubToken) { + githubToken = process.env.GITHUB_TOKEN; + } + if (!githubToken) { + throw new Error('Missing GITHUB_TOKEN or GITHUB_TOKEN_READ'); + } + + const sponsorsQuery = ` + { + viewer { + sponsorshipsAsMaintainer(activeOnly: false, first: 100) { + totalCount + edges { + node { + isActive + isOneTimePayment + sponsorEntity { + __typename + ... on User { + name + login + websiteUrl + twitterUsername + } + ... on Organization { + name + login + websiteUrl + twitterUsername + } + } + } + } + } + } + } + `; + const sponsorsResponse = await graphql(sponsorsQuery, { + headers: { + authorization: `token ${githubToken}` + } + }); + + return [ + ...nonGitHubSponsors, + ...sponsorsResponse.viewer.sponsorshipsAsMaintainer.edges.map(({ node }) => node), + ]; +} diff --git a/website/src/pages/credits.mdx b/website/src/pages/credits.mdx index f3256d2b1..871e092d7 100644 --- a/website/src/pages/credits.mdx +++ b/website/src/pages/credits.mdx @@ -1,98 +1,11 @@ import { useData } from 'nextra/data'; -import { graphql } from '@octokit/graphql'; import { getContributors, mergeAndSortContributors } from '../github/contributors'; +import { getSponsors } from '../github/sponsors'; export const getStaticProps = async () => { - const nonGitHubSponsors = [ - { - isActive: true, - sponsorEntity: { - __typename: 'Organization', - login: 'whilenull', - name: 'Null', - websiteUrl: 'https://null.tc/?ref=bref', - }, - isOneTimePayment: false, - }, - { - isActive: true, - sponsorEntity: { - __typename: 'Organization', - login: 'CraftCMS', - name: 'CraftCMS', - websiteUrl: 'https://craftcms.com/?ref=bref.sh', - }, - isOneTimePayment: false, - }, - { - isActive: true, - sponsorEntity: { - __typename: 'Organization', - login: 'ShippyPro', - name: 'ShippyPro', - websiteUrl: 'https://www.shippypro.com/?ref=bref.sh', - }, - isOneTimePayment: false, - }, - { - isActive: true, - sponsorEntity: { - __typename: 'Organization', - login: 'Tideways', - name: 'Tideways', - websiteUrl: 'https://tideways.com/?ref=bref', - }, - isOneTimePayment: false, - }, - { - isActive: true, - sponsorEntity: { - __typename: 'Organization', - login: 'MyBuilder', - name: 'MyBuilder', - websiteUrl: 'https://www.mybuilder.com/?ref=bref.sh', - }, - isOneTimePayment: false, - }, - ]; - - const sponsorsQuery = ` - { - viewer { - sponsorshipsAsMaintainer(activeOnly: false, first: 100) { - totalCount - edges { - node { - isActive - isOneTimePayment - sponsorEntity { - __typename - ... on User { - name - login - websiteUrl - twitterUsername - } - ... on Organization { - name - login - websiteUrl - twitterUsername - } - } - } - } - } - } - } - `; - let sponsorsResponse; + let sponsors; try { - sponsorsResponse = await graphql(sponsorsQuery, { - headers: { - authorization: `token ${process.env.GITHUB_TOKEN_READ}` - } - }); + sponsors = await getSponsors(); } catch (e) { console.error(e); return { @@ -102,14 +15,8 @@ export const getStaticProps = async () => { contributors: [], }, }, - // The page will be considered as stale and regenerated every 60 seconds. - revalidate: false, }; } - const sponsors = [ - ...nonGitHubSponsors, - ...sponsorsResponse.viewer.sponsorshipsAsMaintainer.edges.map(({ node }) => node), - ]; const contributors = mergeAndSortContributors([ ...(await getContributors('brefphp/bref')), From 8c12fd4a0e013ed154cbbfbe5a22804d82f9d9b3 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 11 Sep 2023 14:38:46 +0200 Subject: [PATCH 073/144] Website: CD --- .github/workflows/website.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index ee9b2087b..e4c8210c1 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -12,6 +12,8 @@ jobs: deploy: runs-on: ubuntu-latest + permissions: + contents: read defaults: run: working-directory: ./website From fa2d5fc08056bf03452b05a894148f59595e0df8 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 11 Sep 2023 14:40:49 +0200 Subject: [PATCH 074/144] Update docs/use-cases/sqs.mdx Co-authored-by: Thibault RICHARD --- docs/use-cases/sqs.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use-cases/sqs.mdx b/docs/use-cases/sqs.mdx index c008b8582..35cce9a6f 100644 --- a/docs/use-cases/sqs.mdx +++ b/docs/use-cases/sqs.mdx @@ -49,7 +49,7 @@ Then, create a Lambda function that listens to SQS events with the handler you c ```yml filename="serverless.yml" functions: # ... - events: + resizeImage: handler: App\MyHandler events: - sqs: From 01943991a6e155d54f692a5990572a349d5380ac Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 11 Sep 2023 14:41:56 +0200 Subject: [PATCH 075/144] Website: CD --- .github/workflows/website.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index e4c8210c1..34242ae5f 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -25,5 +25,7 @@ jobs: run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} - name: Build run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Deploy run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} From 8ee08ef84d5a41e7825fb1eaa304865669fe61df Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 11 Sep 2023 14:46:36 +0200 Subject: [PATCH 076/144] Website: cleanup --- .gitattributes | 1 - Makefile | 21 +----- couscous.yml | 172 ------------------------------------------------- 3 files changed, 1 insertion(+), 193 deletions(-) delete mode 100644 couscous.yml diff --git a/.gitattributes b/.gitattributes index 7bb3d8153..f18431d9f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,7 +9,6 @@ website/ export-ignore .gitattributes export-ignore .gitignore export-ignore .phpcs.xml export-ignore -couscous.yml export-ignore docker-compose.yml export-ignore Makefile export-ignore phpstan.neon export-ignore diff --git a/Makefile b/Makefile index 87e455abe..4ccc30d97 100644 --- a/Makefile +++ b/Makefile @@ -6,25 +6,6 @@ trigger_runtimes: runtime_build_status: aws codepipeline get-pipeline-state --name=bref-php-binary | jq ".stageStates[1].latestExecution.status" -# Generate and deploy the production version of the website using https://couscous.io/ -website: - # See https://couscous.io/ - couscous generate - netlify deploy --prod --dir=.couscous/generated -website-staging: - couscous generate - netlify deploy --dir=.couscous/generated - -# Run a local preview of the website using https://couscous.io/ -website-preview: - couscous preview - -website-assets: website/template/output.css -website/template/output.css: website/node_modules website/template/styles.css website/tailwind.config.js - cd website && NODE_ENV=production npx tailwind build template/styles.css -o template/output.css -website/node_modules: website/package.json website/package-lock.json - cd website && npm install - # Deploy the demo functions demo: serverless deploy @@ -35,4 +16,4 @@ layers.json: test-stack: serverless deploy -c tests/serverless.tests.yml -.PHONY: website website-preview website-assets demo layers.json test-stack +.PHONY: demo layers.json test-stack diff --git a/couscous.yml b/couscous.yml deleted file mode 100644 index 02fe7bc4a..000000000 --- a/couscous.yml +++ /dev/null @@ -1,172 +0,0 @@ -template: - # Name of the directory containing the website template (default is "website") - directory: website/template - -exclude: - - demo - - runtime - - src - - template - - tests - - vendor - - website - # This special entry will ask Couscous to read the excluded directories from your ".gitignore" file - - "%gitignore%" - -scripts: - # Scripts to execute before generating the website - before: - - make website-assets - -menu: - intro: - - section: Getting started - items: - what-is-bref: - text: What is Bref and serverless? - url: /docs/ - installation: - text: Installation - url: /docs/installation.html - first-steps: - text: First steps - url: /docs/first-steps.html - runtimes-introduction: - text: Introduction to PHP runtimes - url: /docs/runtimes/ - - webHosting: - - section: 'Bref for web apps' - items: - web-apps: - text: Web apps on AWS Lambda - url: /docs/runtimes/http.html - websites: - text: Website assets - url: /docs/websites.html - title: Building complete websites with Bref - console-applications: - text: Console commands - url: /docs/runtimes/console.html - web-cron: - text: Cron commands - url: /docs/web-apps/cron.html - title: CLI cron tasks - web-local-development: - text: Local development - url: /docs/web-apps/local-development.html - web-docker: - text: Docker - url: /docs/web-apps/docker.html - - section: Frameworks - items: - laravel: - text: Laravel - url: /docs/frameworks/laravel.html - title: Learn how to deploy serverless Laravel applications - symfony: - text: Symfony - url: /docs/frameworks/symfony.html - title: Learn how to deploy serverless Symfony applications - - functions: - - section: 'Bref for event-driven functions' - items: - php-functions: - text: PHP functions on AWS Lambda - url: /docs/runtimes/function.html - typed-handlers: - text: Typed handlers - url: /docs/function/handlers.html - function-local-development: - text: Local development - url: /docs/function/local-development.html - cron-function: - text: Cron functions - url: /docs/function/cron.html - - other: - - section: Workflow - items: - deploy: - text: Deployment - url: /docs/deploy.html - monitoring: - text: Monitoring - url: /docs/monitoring.html - - section: Environment - items: - serverless-yml: - text: serverless.yml - url: /docs/environment/serverless-yml.html - title: Configure your application with the serverless.yml file - variables: - text: Variables - url: /docs/environment/variables.html - title: Configuring environment variables with Bref - php: - text: PHP - url: /docs/environment/php.html - title: Configuring PHP versions and options with Bref - storage: - text: Storage - url: /docs/environment/storage.html - title: Storing files and data with Bref on AWS Lambda - logs: - text: Logs - url: /docs/environment/logs.html - title: Managing logs with Bref on AWS Lambda - database: - text: Databases - url: /docs/environment/database.html - title: Using a database from AWS Lambda - database-planetscale: - text: Databases - PlanetScale - url: /docs/environment/database-planetscale.html - title: Using PlanetScale from AWS Lambda - custom-domains: - text: Custom domains - url: /docs/environment/custom-domains.html - title: Configuring custom domain names - performances: - text: Performance - url: /docs/environment/performances.html - title: Performance tuning and optimizations - - section: Upgrading - items: - v2: - text: Upgrading to v2 - url: /docs/upgrading/v2.html - title: Upgrading Bref applications to Bref v2 - - section: Learning - items: - course: - text: Course - url: https://serverless-visually-explained.com/?ref=bref-menu - title: Serverless Visually Explained - case-studies: - text: Case studies - url: /docs/case-studies.html - title: A collection of case studies of serverless PHP applications built using Bref. - community: - text: Community - url: /docs/community.html - title: Places where to learn and exchange about Bref. - - section: Ecosystem - items: - github: - text: GitHub - url: https://github.com/brefphp - title: Bref on GitHub - twitter: - text: Twitter - url: https://twitter.com/brefphp - title: Bref on Twitter - slack: - text: Slack - url: https://join.slack.com/t/brefworkspace/shared_invite/enQtNTcwMjU2NTcxNjAxLTIxYmM2MmRjMDkzYjdjYTNkMmE5NGI3YTcyZjc2ZGRjNTFmNjFmYzk5NWQ1YmVhMDkwNzExNzhjZThkZWM0ODE - title: Join the Slack community - dashboard: - text: Bref Dashboard - url: https://dashboard.bref.sh/?ref=bref - title: Bref Dashboard From dd0f63a8638451bd498da2dfd33156eb24f25882 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 13 Sep 2023 20:24:42 +0200 Subject: [PATCH 077/144] Docs: console runtime --- docs/default/_meta.json | 2 +- docs/default/cli-commands.mdx | 1 + docs/runtimes/_meta.json | 3 +- .../console.md => runtimes/console.mdx} | 89 +++++++++++++------ docs/runtimes/function.mdx | 2 +- 5 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 docs/default/cli-commands.mdx rename docs/{default/console.md => runtimes/console.mdx} (56%) diff --git a/docs/default/_meta.json b/docs/default/_meta.json index 498f807d3..857fc087f 100644 --- a/docs/default/_meta.json +++ b/docs/default/_meta.json @@ -1,4 +1,4 @@ { "getting-started": "", - "console": "Console commands" + "cli-commands": "CLI commands" } \ No newline at end of file diff --git a/docs/default/cli-commands.mdx b/docs/default/cli-commands.mdx new file mode 100644 index 000000000..4a7c8be29 --- /dev/null +++ b/docs/default/cli-commands.mdx @@ -0,0 +1 @@ +# CLI commands diff --git a/docs/runtimes/_meta.json b/docs/runtimes/_meta.json index 2083a3220..f9b80dd57 100644 --- a/docs/runtimes/_meta.json +++ b/docs/runtimes/_meta.json @@ -1,5 +1,6 @@ { "fpm-runtime": "PHP-FPM runtime", - "function": "Event-driven functions", + "function": "Function runtime", + "console": "Console runtime", "runtimes-details": "Runtimes in details" } \ No newline at end of file diff --git a/docs/default/console.md b/docs/runtimes/console.mdx similarity index 56% rename from docs/default/console.md rename to docs/runtimes/console.mdx index dd21e240a..a66c7e41b 100644 --- a/docs/default/console.md +++ b/docs/runtimes/console.mdx @@ -1,24 +1,28 @@ ---- -title: Console commands -current_menu: console-applications -introduction: Learn how to run serverless console commands on AWS Lambda with Symfony Console or Laravel Artisan. -previous: - link: /docs/websites.html - title: Website assets -next: - link: /docs/web-apps/cron.html - title: Cron commands ---- +export const introduction = 'Learn how to run serverless console commands on AWS Lambda with Symfony Console or Laravel Artisan.'; -Bref provides a way to run console commands on AWS Lambda. +# Console runtime -This can be used to run PHP scripts, the [Symfony Console](https://symfony.com/doc/current/console.html), as well as [Laravel Artisan](https://laravel.com/docs/artisan) commands in production. +Bref's "Console" runtime lets us run CLI scripts on AWS Lambda. -## Configuration +This can be used to run PHP scripts, like cron tasks, the [Symfony Console](https://symfony.com/doc/current/console.html), [Laravel Artisan](https://laravel.com/docs/artisan), and more. -The lambda function used for running console applications must use the `php-xx-console` runtime. Here is an example `serverless.yml`: +## How it works -```yaml +When the function is invoked, the Console runtime will execute the PHP script defined as the *handler* in a sub-process. + +The result of the execution (exit code and output) will be returned as the result of the AWS Lambda invocation. All the CLI output is also logged ([learn more about logs](../environment/logs.mdx)). + +Console functions can be invoked: + +- via a cron schedule +- via the `serverless bref:cli` command +- manually by invoking the function via the AWS API + +## Usage + +The Lambda function used for running console applications must use the `php-xx-console` runtime. Here is an example: + +```yml filename="serverless.yml" {8-9} service: app provider: name: aws @@ -26,15 +30,44 @@ plugins: - ./vendor/bref/bref functions: hello: - handler: bin/console # or 'artisan' for Laravel + handler: the-php-script-to-run.php runtime: php-81-console ``` Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-81` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](../runtimes.mdx)). -## Usage +## Running commands + +When invoked, the "Console" runtime executes the `handler` script in a sub-process. For example, if the following handler was defined: + +```yml filename="serverless.yml" +functions: + hello: + handler: the-php-script-to-run.php + runtime: php-81-console +``` + +Then the following command would run in Lambda every time the function is invoked: + +```sh +php the-php-script-to-run.php +``` + +The Lambda function can be invoked with a payload. It must be a JSON string, for example `"arg1 arg2 --option1=foo"`. Note that it is a string encoded in JSON, that is why it is in quotes, `json_decode($payload)` would return the string itself. -To run a console command on AWS Lambda, run `serverless bref:cli` on your computer: +In our example, the following command would run in Lambda when invoked with such a payload: + +```sh +php the-php-script-to-run.php arg1 arg2 --option1=foo +``` + +### Cron + +Read the dedicated documentation for [running cron tasks on AWS Lambda](../use-cases/cron.mdx). + +### CLI invocation + +To manually run a console command on AWS Lambda, run `serverless bref:cli` on your computer: ```bash serverless bref:cli --args="" @@ -64,7 +97,17 @@ $ AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar serverless bref:cli # ... ``` -### Usage without Serverless Framework +The `bref:cli` command can be used to run CLI commands in Lambda from your machine, but can also be used in CI/CD to run DB migrations for example. + +### Interactive terminal + +As an alternative to the CLI, the [Bref Dashboard](https://dashboard.bref.sh/?ref=bref) provides a convenient way to run commands via a terminal: + +[![Bref Dashboard terminal for Laravel](../runtimes/dashboard-terminal.png)](https://dashboard.bref.sh/?ref=bref) + +Functions using the "console" runtime are automatically detected, and colors are enabled by default for Laravel Artisan and Symfony Console. + +### Without Serverless Framework If you do not use `serverless.yml` but something else, like SAM/AWS CDK/Terraform, you can invoke your console function via the AWS CLI. For example: @@ -97,12 +140,6 @@ aws lambda invoke \ > **Note:** > The `--payload` needs to contain a JSON string, that is why it is quoted twice: `'"..."'`. This is intentional. -The [Bref Dashboard](https://dashboard.bref.sh/?ref=bref) also provides a convenient way to run commands via a terminal: - -[![Bref Dashboard terminal for Laravel](../runtimes/dashboard-terminal.png)](https://dashboard.bref.sh/?ref=bref) - -Functions using the "console" runtime are automatically detected, and colors are enabled by default for Laravel Artisan and Symfony Console. - ## Lambda context Lambda provides information about the invocation, function, and execution environment via the *lambda context*. diff --git a/docs/runtimes/function.mdx b/docs/runtimes/function.mdx index d35727b48..e776ca1ab 100644 --- a/docs/runtimes/function.mdx +++ b/docs/runtimes/function.mdx @@ -1,7 +1,7 @@ import { Callout, Tab, Tabs } from 'nextra/components'; export const introduction = 'Run serverless event-driven PHP functions on AWS Lambda using Bref.'; -# PHP functions on AWS Lambda +# PHP functions runtime for AWS Lambda Bref's **"Event-driven function" runtime** lets you run PHP functions on AWS Lambda. From 74ac8a40048d8f7c1a70bfc1cf560794cea14a69 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 16 Sep 2023 17:22:53 +0200 Subject: [PATCH 078/144] Website: wording tweak --- docs/cost-calculator.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cost-calculator.mdx b/docs/cost-calculator.mdx index 0280335f2..ab355984c 100644 --- a/docs/cost-calculator.mdx +++ b/docs/cost-calculator.mdx @@ -3,7 +3,7 @@ export const introduction = 'Calculate the costs of running your PHP application # Serverless costs calculator -Use the calculator below to estimate the costs of running your PHP application on AWS Lambda. +Use the calculator below to estimate the costs of running your PHP application serverless on AWS Lambda. @@ -217,7 +217,7 @@ export function Calculator() {

    - Total costs + Total AWS costs

    ${totalCost.toFixed(2)}/month From 291c7efb515b7f83f7691b71420e62538ff89340 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 16 Sep 2023 19:01:49 +0200 Subject: [PATCH 079/144] Docs: getting started --- docs/default/getting-started.mdx | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/docs/default/getting-started.mdx b/docs/default/getting-started.mdx index c73e73ced..de7174009 100644 --- a/docs/default/getting-started.mdx +++ b/docs/default/getting-started.mdx @@ -39,11 +39,35 @@ Accept all the defaults by pressing "Enter". The following files will be created - `index.php` contains the code of your application - `serverless.yml` contains the configuration for deploying on AWS -You are free to edit the code in `index.php`. If you want to deploy an existing application, you can delete `index.php` and edit `serverless.yml` to point to your existing index file (for example it may be another file like `public/index.php`). +You are free to edit `index.php`. + +To deploy an existing application, you can delete `index.php` and edit `serverless.yml` to point to your existing index file (for example it may be another file like `public/index.php`). You can also create the `serverless.yml` file manually: + +```yml filename="serverless.yml" +service: app +provider: + name: aws + region: us-east-1 + +functions: + web: + handler: index.php + runtime: php-81-fpm + events: + - httpApi: '*' + +package: + patterns: # Exclude files from deployment + - '!node_modules/**' + - '!tests/**' + +plugins: + - ./vendor/bref/bref +``` ## Deployment -To deploy, let's run: +To deploy, run: ```bash serverless deploy @@ -57,7 +81,7 @@ https://3pjp2yiw97.execute-api.us-east-1.amazonaws.com Open this URL and you should see your application: `index.php` is running on Lambda! -🎉 congrats on creating your first serverless application! +Congrats on creating your first serverless application 🎉 To learn more about deployments, head over the [Deployment guide](../deploy.mdx). From f0c9a59cc539e16655c719d3c785974c0a9fe7ec Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 16 Sep 2023 21:34:01 +0200 Subject: [PATCH 080/144] Docs: CLI commands --- docs/default/cli-commands.mdx | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/default/cli-commands.mdx b/docs/default/cli-commands.mdx index 4a7c8be29..db8b8dc24 100644 --- a/docs/default/cli-commands.mdx +++ b/docs/default/cli-commands.mdx @@ -1 +1,28 @@ # CLI commands + +We can run CLI commands and scripts on AWS Lambda by deploying a "console" function with `serverless.yml`. + +```yml +functions: + cli: + handler: the-php-script-to-run.php + runtime: php-81-console +``` + +The function uses the [Console runtime](../runtimes/console.mdx). + +To execute the script on Lambda, run the command below: + +```bash +serverless bref:cli +``` + +We can also pass arguments to the script: + +```bash +serverless bref:cli --args="extra command line arguments and options" +``` + +Our script will be invoked inside AWS Lambda and the result will be printed to the console. + +To learn more, read [the "Console" guide](../runtimes/console.mdx). From 002dbb50b11abe6adc2de4501bc29c568fdced76 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 16 Sep 2023 22:10:13 +0200 Subject: [PATCH 081/144] Website: news --- website/package-lock.json | 1 + website/package.json | 1 + website/src/components/news/ArticleHeader.jsx | 15 ++++ .../news/{01-bref-1.0.md => 01-bref-1.0.mdx} | 30 ++++--- .../news/{02-bref-2.0.md => 02-bref-2.0.mdx} | 90 +++++++++++-------- website/src/pages/news/_meta.json | 4 + 6 files changed, 89 insertions(+), 52 deletions(-) create mode 100644 website/src/components/news/ArticleHeader.jsx rename website/src/pages/news/{01-bref-1.0.md => 01-bref-1.0.mdx} (92%) rename website/src/pages/news/{02-bref-2.0.md => 02-bref-2.0.mdx} (82%) create mode 100644 website/src/pages/news/_meta.json diff --git a/website/package-lock.json b/website/package-lock.json index 812b7ed41..2ba32ae9d 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,6 +9,7 @@ "@heroicons/react": "^2.0.18", "@octokit/graphql": "^7.0.1", "next": "^13.4.9", + "next-seo": "^6.1.0", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", "react": "^18.2.0", diff --git a/website/package.json b/website/package.json index 091eec02f..a85050b71 100644 --- a/website/package.json +++ b/website/package.json @@ -10,6 +10,7 @@ "@heroicons/react": "^2.0.18", "@octokit/graphql": "^7.0.1", "next": "^13.4.9", + "next-seo": "^6.1.0", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", "react": "^18.2.0", diff --git a/website/src/components/news/ArticleHeader.jsx b/website/src/components/news/ArticleHeader.jsx new file mode 100644 index 000000000..3d7000014 --- /dev/null +++ b/website/src/components/news/ArticleHeader.jsx @@ -0,0 +1,15 @@ +export default function ArticleHeader({ subTitle, date, author, authorGitHub, ...props }) { + return
    +
    + {subTitle} +
    +
    + {author} +
    +
    {date}
    + {author} +
    +
    +
    ; +} \ No newline at end of file diff --git a/website/src/pages/news/01-bref-1.0.md b/website/src/pages/news/01-bref-1.0.mdx similarity index 92% rename from website/src/pages/news/01-bref-1.0.md rename to website/src/pages/news/01-bref-1.0.mdx index 1d9f54dd7..e18304ed6 100644 --- a/website/src/pages/news/01-bref-1.0.md +++ b/website/src/pages/news/01-bref-1.0.mdx @@ -1,11 +1,15 @@ ---- -title: Bref 1.0 is released 🎉 -subTitle: Celebrating 1 billion executions per month -layout: news-article -articleDate: November 2020 -author: Matthieu Napoli -authorGithub: mnapoli ---- +import ArticleHeader from '../../components/news/ArticleHeader'; +import { NextSeo } from 'next-seo'; + + + +# Bref 1.0 is released 🎉 + + Bref started in November 2017, 3 years ago. Back then, running PHP on AWS Lambda was experimental at best. @@ -13,7 +17,7 @@ Over the years, as the Bref community grew, as AWS features landed, and as contr Needless to say, **Bref is stable** and has been for a long time. -
    +
    Indeed, Bref runs more than 1 billion requests and jobs every month!
    @@ -143,7 +147,7 @@ Well, you already could, but now it will be a bit easier. > Self-promotion time: I've helped enterprises refactor their microservice architectures using Lambda and SQS/EventBridge. If you are interested, [get in touch to work together](mailto:matthieu@null.tc). You can also check out [Serverless Visually Explained](https://serverless-visually-explained.com/?ref=bref-1.0), it contains examples for those use cases. - +< /self-promo\> Finally, the [`BREF_LOOP_MAX` variable](/docs/environment/performances.mdx#bref-for-event-driven-functions) is now documented, for those ready to keep the PHP process alive between events to accelerate their workers. @@ -257,7 +261,7 @@ Hope you enjoy it! And stay tuned for the AWS re:Invent conference next week! You can also join the community [in Slack](/docs/community.md), post details about your project in [Built with Bref](https://github.com/brefphp/bref/issues/267) or share your experience online. -
    - What is Bref and serverless? - Get started with Bref + diff --git a/website/src/pages/news/02-bref-2.0.md b/website/src/pages/news/02-bref-2.0.mdx similarity index 82% rename from website/src/pages/news/02-bref-2.0.md rename to website/src/pages/news/02-bref-2.0.mdx index c3f57fc85..5bf04cea6 100644 --- a/website/src/pages/news/02-bref-2.0.md +++ b/website/src/pages/news/02-bref-2.0.mdx @@ -1,12 +1,24 @@ ---- -title: Bref 2.0 is released 🎉 -subTitle: Celebrating 10 billion executions per month -layout: news-article -articleDate: March 2023 -author: Matthieu Napoli -authorGithub: mnapoli -socialCard: https://bref.sh/docs/news/02/social-card.png ---- +import ArticleHeader from '../../components/news/ArticleHeader'; +import { NextSeo } from 'next-seo'; + + + +# Bref 2.0 is released 🎉 + + The work on what would be Bref 2.0 started in October 2021, about 1.5 year ago. We went through many different strategies, experiments, rewrites, over **700 commits** to finally land with the stable release. @@ -334,44 +346,44 @@ I know this isn't _that_ exciting, but I had to mention it given the incredible A huge thanks to the [136 Bref contributors](https://github.com/brefphp/bref/graphs/contributors), to the community for supporting the project, and to the open-source sponsors: -
    - - AWS + -
    - - JetBrains + @@ -393,7 +405,7 @@ You can also join the community [in Slack](/docs/community.md), post details abo If you enjoy teasers, here is a preview of a redesign coming soon to Bref: -
    +![](./02/logo.png) ## One more thing @@ -403,7 +415,7 @@ I launched the [**Bref Dashboard**](https://dashboard.bref.sh/) ✨ in January. And if you need support or help going serverless, check out the [Support Plans](/#ecosystem). -
    - What is Bref and serverless? - Get started with Bref + diff --git a/website/src/pages/news/_meta.json b/website/src/pages/news/_meta.json new file mode 100644 index 000000000..b6445d87d --- /dev/null +++ b/website/src/pages/news/_meta.json @@ -0,0 +1,4 @@ +{ + "02-bref-2.0": "Bref 2.0 is released", + "01-bref-1.0": "Bref 1.0 is released" +} \ No newline at end of file From dac4c68367488ccaaf4190fa2b0452f72cfc25e5 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 18 Sep 2023 14:42:16 +0200 Subject: [PATCH 082/144] Website: fix more 404 --- docs/_meta.json | 2 +- docs/{cost-calculator.mdx => costs-calculator.mdx} | 0 docs/deploy/docker.mdx | 2 +- docs/index.md | 6 +++--- docs/laravel/getting-started.mdx | 2 +- docs/setup.mdx | 2 +- docs/symfony/getting-started.mdx | 2 +- docs/use-cases/http/binary-requests-responses.mdx | 2 +- website/Makefile | 2 +- website/link-checker/index.js | 9 +++++++++ 10 files changed, 19 insertions(+), 10 deletions(-) rename docs/{cost-calculator.mdx => costs-calculator.mdx} (100%) diff --git a/docs/_meta.json b/docs/_meta.json index bd4ac0015..4db5d4ac9 100644 --- a/docs/_meta.json +++ b/docs/_meta.json @@ -1,6 +1,6 @@ { "index": "What is Bref and serverless?", - "cost-calculator": "Costs calculator", + "costs-calculator": "Costs calculator", "-- Getting started": { "type": "separator", "title": "Getting started" diff --git a/docs/cost-calculator.mdx b/docs/costs-calculator.mdx similarity index 100% rename from docs/cost-calculator.mdx rename to docs/costs-calculator.mdx diff --git a/docs/deploy/docker.mdx b/docs/deploy/docker.mdx index 91f07a187..7d09a5492 100644 --- a/docs/deploy/docker.mdx +++ b/docs/deploy/docker.mdx @@ -50,7 +50,7 @@ Bref offers the following base images: - `bref/php-xx-fpm:2`: PHP-FPM to run HTTP applications - `bref/php-xx-console:2`: to run PHP CLI commands -- `bref/php-xx:2`: to run [PHP functions](../functions/README.md) +- `bref/php-xx:2`: to run [PHP functions](../runtimes/function.mdx) ### Extra PHP extensions diff --git a/docs/index.md b/docs/index.md index 5bfc2f7f2..f5f2d734c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -70,7 +70,7 @@ Bref and AWS Lambda can be used to run many kind of PHP application, for example Bref aims to support any PHP framework as well. -If you are interested in real-world examples as well as cost analyses head over to the [**Case Studies** page](case-studies.md). +If you are interested in real-world examples as well as cost analyses head over to the [**Case Studies** page](/docs/case-studies.md). ## Maturity matrix @@ -170,7 +170,7 @@ This matrix will be updated as Bref and AWS services evolve over time. - **Website** - Websites can run on AWS Lambda. Assets can be stored in S3 and served via Cloudfront. This is documented in the ["Websites" documentation](/docs/web-apps/website-assets.md). Performance is as good as any server. + Websites can run on AWS Lambda. Assets can be stored in S3 and served via Cloudfront. This is documented in the ["Websites" documentation](/docs/use-cases/websites.mdx). Performance is as good as any server. - **Legacy application** @@ -180,4 +180,4 @@ This matrix will be updated as Bref and AWS services evolve over time. ## Getting started -Get started with Bref by reading the [installation documentation](setup.mdx). +Get started with Bref by reading the [installation documentation](/docs/setup.mdx). diff --git a/docs/laravel/getting-started.mdx b/docs/laravel/getting-started.mdx index 233908d3d..eafecfd9c 100644 --- a/docs/laravel/getting-started.mdx +++ b/docs/laravel/getting-started.mdx @@ -12,7 +12,7 @@ This guide helps you run Laravel applications on AWS Lambda using Bref. These in ## Setup -First, **follow the [Setup guide](../setup.md)** to create an AWS account and install the necessary tools. +First, **follow the [Setup guide](../setup.mdx)** to create an AWS account and install the necessary tools. Next, in an existing Laravel project, install Bref and the [Laravel-Bref package](https://github.com/brefphp/laravel-bridge). diff --git a/docs/setup.mdx b/docs/setup.mdx index c2b70a325..e8a69a763 100644 --- a/docs/setup.mdx +++ b/docs/setup.mdx @@ -35,7 +35,7 @@ To use Bref, you will need an AWS account and the `serverless` CLI. Let's get st If you have already set up AWS credentials on your machine (for example if you use the `aws` CLI), you can skip this step. - - [Create AWS access keys](/docs/setup/aws-keys.mdx) + - [Create AWS access keys](./setup/aws-keys.mdx) - Set up those keys by running: diff --git a/docs/symfony/getting-started.mdx b/docs/symfony/getting-started.mdx index fba269ee7..c025f3fe3 100644 --- a/docs/symfony/getting-started.mdx +++ b/docs/symfony/getting-started.mdx @@ -12,7 +12,7 @@ This guide helps you run Symfony applications on AWS Lambda using Bref. These in ## Setup -First, **follow the [Setup guide](../setup.md)** to create an AWS account and install the necessary tools. +First, **follow the [Setup guide](../setup.mdx)** to create an AWS account and install the necessary tools. Next, in an existing Symfony project, install Bref and the [Symfony Bridge package](https://github.com/brefphp/symfony-bridge). diff --git a/docs/use-cases/http/binary-requests-responses.mdx b/docs/use-cases/http/binary-requests-responses.mdx index c9f466dfc..d8e456a1c 100644 --- a/docs/use-cases/http/binary-requests-responses.mdx +++ b/docs/use-cases/http/binary-requests-responses.mdx @@ -5,7 +5,7 @@ import { Callout } from 'nextra/components'; AWS Lambda is only used for executing code. Serving assets via PHP does not make sense as this would be a waste of resources and money. - Deploying a website with assets (e.g. CSS, JavaScript, images) is covered in [the "Websites" documentation](./websites.md). + Deploying a website with assets (e.g. CSS, JavaScript, images) is covered in [the "Websites" documentation](../websites.mdx). In some cases however, you want to serve images (or other assets) via PHP. One example would be if you served generated images or PDFs via PHP. diff --git a/website/Makefile b/website/Makefile index 1a1b00f66..8b3423f82 100644 --- a/website/Makefile +++ b/website/Makefile @@ -17,4 +17,4 @@ node_modules: npm install check-links: - node link-checker/index.js https://website-v3--bref-website-v2.netlify.app/docs + node link-checker/index.js https://bref-website.vercel.app/ diff --git a/website/link-checker/index.js b/website/link-checker/index.js index d46d3fb7b..5185d0791 100644 --- a/website/link-checker/index.js +++ b/website/link-checker/index.js @@ -41,6 +41,14 @@ async function scan(stdout, url, links, brokenLinks, pageCache) { const urlWithoutAnchor = url.split('#')[0]; if (pageCache[urlWithoutAnchor] === undefined) { const response = await fetch(url); + // Ignore redirects to other domains (e.g. https://bref.sh/slack) + const originalDomain = new URL(url).hostname; + const finalDomain = new URL(response.url).hostname; + if (finalDomain !== originalDomain) { + console.log(`Ignoring ${url} redirecting to ${response.url}`); + pageCache[urlWithoutAnchor] = false; + return; + } if (! response.ok) { pageCache[urlWithoutAnchor] = false; } else { @@ -80,6 +88,7 @@ async function scan(stdout, url, links, brokenLinks, pageCache) { // Ignore already scanned links return; } + stdout.write(`Found new link ${newLink} on ${url}\n`); links[newLink] = false; } }, From 374540c219453070ffc5fa5ce2c22bba8da100ae Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 18 Sep 2023 15:03:12 +0200 Subject: [PATCH 083/144] Website: support --- website/src/components/Footer.jsx | 1 + website/src/components/home/companies.jsx | 2 +- .../components/{plans => support}/plans.jsx | 18 +++++++++--------- website/src/pages/_meta.json | 5 ++--- website/src/pages/{plans.mdx => support.mdx} | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) rename website/src/components/{plans => support}/plans.jsx (98%) rename website/src/pages/{plans.mdx => support.mdx} (99%) diff --git a/website/src/components/Footer.jsx b/website/src/components/Footer.jsx index c7c81697e..e68721b23 100644 --- a/website/src/components/Footer.jsx +++ b/website/src/components/Footer.jsx @@ -7,6 +7,7 @@ const navigation = { { name: 'Home', href: '/' }, { name: 'Documentation', href: '/docs/' }, { name: 'News', href: '/news/' }, + { name: 'Support', href: '/support' }, { name: 'Bref Dashboard', href: 'https://dashboard.bref.sh/' }, { name: 'Credits', href: '/credits' }, ], diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index a3cbe3756..bdc655579 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -25,7 +25,7 @@ export default function Companies() { > Documentation - + Support & consulting
    diff --git a/website/src/components/plans/plans.jsx b/website/src/components/support/plans.jsx similarity index 98% rename from website/src/components/plans/plans.jsx rename to website/src/components/support/plans.jsx index 887c58d86..e4969ee93 100644 --- a/website/src/components/plans/plans.jsx +++ b/website/src/components/support/plans.jsx @@ -37,18 +37,11 @@ const sections = [ { name: 'The Bref open-source project, its documentation and framework integrations', tiers: { OpenSource: true, Pro: true, Enterprise: true } }, { name: 'Deploy your applications to your AWS account', tiers: { OpenSource: true, Pro: true, Enterprise: true } }, { name: 'Use the public AWS Lambda runtimes hosted in the Bref AWS account', tiers: { OpenSource: true, Pro: true, Enterprise: true } }, - { name: 'Use AWS Lambda runtimes hosted in your AWS account (opt-in)', tiers: { Pro: true, Enterprise: true } }, - { name: ' Self-built, tailor-made AWS Lambda runtimes and PHP extensions optimized for your project (opt-in)', tiers: { Enterprise: true } }, + { name: 'Use AWS Lambda runtimes hosted in your AWS account', tiers: { Pro: 'Optional', Enterprise: 'Optional' } }, + { name: ' Self-built, tailor-made AWS Lambda runtimes and PHP extensions optimized for your project', tiers: { Enterprise: 'Optional' } }, { name: 'Appear as an open-source sponsor 💙', tiers: { Pro: 'Gold sponsor', Enterprise: 'Premium sponsor' } }, ], }, - { - name: 'Extra integrations', - features: [ - { name: 'AWS X-Ray integration', tiers: { Pro: true, Enterprise: true } }, - { name: 'Sentry integration', tiers: { Pro: true, Enterprise: true } }, - ], - }, { name: 'Resources and support', features: [ @@ -61,6 +54,13 @@ const sections = [ { name: 'Onboarding workshop online or on-site', tiers: { Enterprise: 'Optional' } }, ], }, + { + name: 'Extra integrations', + features: [ + { name: 'Sentry integration', tiers: { Pro: true, Enterprise: true } }, + { name: 'AWS X-Ray integration', tiers: { Pro: 'Early access', Enterprise: 'Early access' } }, + ], + }, ] function classNames(...classes) { diff --git a/website/src/pages/_meta.json b/website/src/pages/_meta.json index 68dad5585..1085ed7bf 100644 --- a/website/src/pages/_meta.json +++ b/website/src/pages/_meta.json @@ -18,10 +18,9 @@ "typesetting": "article" } }, - "plans": { + "support": { "type": "page", - "title": "Plans", - "display": "hidden", + "title": "Support", "theme": { "layout": "raw" } diff --git a/website/src/pages/plans.mdx b/website/src/pages/support.mdx similarity index 99% rename from website/src/pages/plans.mdx rename to website/src/pages/support.mdx index 1666073ba..735763fd0 100644 --- a/website/src/pages/plans.mdx +++ b/website/src/pages/support.mdx @@ -1,4 +1,4 @@ -import Plans from '../components/plans/plans'; +import Plans from '../components/support/plans';
    From 48a47913f00463925cdee5f6db1e1e14679fe2b1 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 18 Sep 2023 15:55:36 +0200 Subject: [PATCH 084/144] Website: redirect anchors --- SECURITY.md | 2 +- website/redirects.js | 3 +++ website/src/components/AnimatedLogo.jsx | 1 - website/src/pages/_app.jsx | 12 ++++++++++++ website/src/pages/news/02-bref-2.0.mdx | 2 +- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 49719927b..7d21f003a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -12,7 +12,7 @@ Version 1.7.x will only receive critical bug fixes and security fixes, as well P You are encouraged to upgrade to v2. -If you prefer to stay on v1 and need long term support for v1 (or need help upgrading), get in touch for enterprise support: https://bref.sh/#enterprise +If you prefer to stay on v1 and need long term support for v1 (or need help upgrading), get in touch for enterprise support: https://bref.sh/support ## Reporting a Vulnerability diff --git a/website/redirects.js b/website/redirects.js index 800a05f03..06d7c568e 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -1,5 +1,8 @@ module.exports.redirects = { '/slack': 'https://join.slack.com/t/brefworkspace/shared_invite/enQtNTcwMjU2NTcxNjAxLTIxYmM2MmRjMDkzYjdjYTNkMmE5NGI3YTcyZjc2ZGRjNTFmNjFmYzk5NWQ1YmVhMDkwNzExNzhjZThkZWM0ODE', + '/#ecosystem': '/support', + '/#plans': '/support', + '/#enterprise': '/support', '/docs/environment/custom-domains': '/docs/use-cases/http/custom-domains', '/docs/aws-cdk': '/docs/deploy/aws-cdk', '/docs/web-apps/index.md#assets': '/docs/use-cases/websites', diff --git a/website/src/components/AnimatedLogo.jsx b/website/src/components/AnimatedLogo.jsx index 5c6e3154c..30f60a1aa 100644 --- a/website/src/components/AnimatedLogo.jsx +++ b/website/src/components/AnimatedLogo.jsx @@ -5,7 +5,6 @@ export function AnimatedLogo({ children, ...props }) { useEffect(() => { const interval = setInterval(() => { setCounter((counter + 1) % 28); - console.log(counter); }, 200); return () => clearInterval(interval); }, [counter]); diff --git a/website/src/pages/_app.jsx b/website/src/pages/_app.jsx index 39b53900c..eb3ddbdb8 100644 --- a/website/src/pages/_app.jsx +++ b/website/src/pages/_app.jsx @@ -1,5 +1,17 @@ import '../../styles/main.css'; +import { useRouter } from 'next/router'; +import { useEffect } from 'react'; +const redirects = require('../../redirects').redirects; export default function MyApp({ Component, pageProps }) { + const router = useRouter(); + + useEffect(() => { + // If a redirect matches the current path, redirect to the new path + if (redirects[router.asPath]) { + router.push(redirects[router.asPath]); + } + }, []); + return } diff --git a/website/src/pages/news/02-bref-2.0.mdx b/website/src/pages/news/02-bref-2.0.mdx index 5bf04cea6..072c483f8 100644 --- a/website/src/pages/news/02-bref-2.0.mdx +++ b/website/src/pages/news/02-bref-2.0.mdx @@ -413,7 +413,7 @@ I launched the [**Bref Dashboard**](https://dashboard.bref.sh/) ✨ in January. [![Bref Dashboard](../docs/monitoring/bref-dashboard.png)](https://dashboard.bref.sh/?ref=bref) -And if you need support or help going serverless, check out the [Support Plans](/#ecosystem). +And if you need support or help going serverless, check out the [Support Plans](/support).
    What is Bref and serverless? From 6af25f189c3da15b3b5e05b3ef49fca1ca17dd89 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 18 Sep 2023 16:35:34 +0200 Subject: [PATCH 085/144] Website: redirect anchors --- docs/community.md | 2 +- website/src/pages/_app.jsx | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/community.md b/docs/community.md index 0ff02c9f7..671c4c1fa 100644 --- a/docs/community.md +++ b/docs/community.md @@ -6,7 +6,7 @@ introduction: A collection of links to places where to discuss and learn about B To report bugs you can head over to the [GitHub Bref repository](https://github.com/brefphp/bref). -For support and general discussions, [open a GitHub discussion](https://github.com/brefphp/bref/discussions). +For community support and general discussions, [open a GitHub discussion](https://github.com/brefphp/bref/discussions). You can also join the [Slack community](https://join.slack.com/t/brefworkspace/shared_invite/enQtNTcwMjU2NTcxNjAxLTIxYmM2MmRjMDkzYjdjYTNkMmE5NGI3YTcyZjc2ZGRjNTFmNjFmYzk5NWQ1YmVhMDkwNzExNzhjZThkZWM0ODE) to discuss Bref and exchange with the community (please open an issue if the link doesn't work). diff --git a/website/src/pages/_app.jsx b/website/src/pages/_app.jsx index eb3ddbdb8..12ba341c4 100644 --- a/website/src/pages/_app.jsx +++ b/website/src/pages/_app.jsx @@ -4,12 +4,23 @@ import { useEffect } from 'react'; const redirects = require('../../redirects').redirects; export default function MyApp({ Component, pageProps }) { + // Custom code to redirect old URLs to new ones + // This runs client-side to redirect anchor tags const router = useRouter(); - useEffect(() => { - // If a redirect matches the current path, redirect to the new path + // For the initial page load if (redirects[router.asPath]) { - router.push(redirects[router.asPath]); + router.replace(redirects[router.asPath]); + } + // For client-side routing + const onRouteChange = (url) => { + if (redirects[url]) { + router.replace(redirects[url]); + } + } + router.events.on('routeChangeStart', onRouteChange) + return () => { // If the component is unmounted, unsubscribe + router.events.off('routeChangeStart', onRouteChange) } }, []); From b8b9bef4e59a711eae54bce4d43671e1bf9de42b Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 18 Sep 2023 16:54:10 +0200 Subject: [PATCH 086/144] Website: plans --- website/src/components/support/plans.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/components/support/plans.jsx b/website/src/components/support/plans.jsx index e4969ee93..fa17d54e6 100644 --- a/website/src/components/support/plans.jsx +++ b/website/src/components/support/plans.jsx @@ -78,7 +78,7 @@ export default function Plans() {

    Bref is a free and open-source project hosted on GitHub.
    - Bref Pro and Bref Enterprise are offered by Null, the company behind Bref. + Bref Pro and Bref Enterprise are support plans offered by Null, the company behind Bref.

    {/* xs to lg */} From c87bdc41840c1b05bfda1cf36b87e2fad1d93273 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 18 Sep 2023 21:54:44 +0200 Subject: [PATCH 087/144] Website: force light theme --- website/theme.config.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/website/theme.config.jsx b/website/theme.config.jsx index 68009efca..bd1306d0e 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -34,7 +34,8 @@ export default { }, darkMode: false, nextThemes: { - themes: ['light'], + defaultTheme: 'light', + forcedTheme: 'light', }, primaryHue: 202, sidebar: { From ca0b59a2049752fc1927b0cccfd50e9af7a4026d Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 18 Sep 2023 22:21:51 +0200 Subject: [PATCH 088/144] Docs: maturity matrix --- docs/_meta.json | 2 +- docs/{index.md => index.mdx} | 127 ++++++++++++++++++++--------------- website/styles/main.css | 8 +++ 3 files changed, 82 insertions(+), 55 deletions(-) rename docs/{index.md => index.mdx} (53%) diff --git a/docs/_meta.json b/docs/_meta.json index 4db5d4ac9..b63abc9cf 100644 --- a/docs/_meta.json +++ b/docs/_meta.json @@ -1,6 +1,5 @@ { "index": "What is Bref and serverless?", - "costs-calculator": "Costs calculator", "-- Getting started": { "type": "separator", "title": "Getting started" @@ -14,6 +13,7 @@ "title": "How it works" }, "runtimes": "PHP runtimes for AWS Lambda", + "costs-calculator": "Costs calculator", "-- Workflow": { "type": "separator", "title": "Workflow" diff --git a/docs/index.md b/docs/index.mdx similarity index 53% rename from docs/index.md rename to docs/index.mdx index f5f2d734c..4c83118b0 100644 --- a/docs/index.md +++ b/docs/index.mdx @@ -1,6 +1,4 @@ ---- -introduction: An introduction to what serverless and Bref can offer for PHP applications. ---- +export const introduction = 'An introduction to what serverless and Bref can offer for PHP applications.'; # What is Bref and serverless? @@ -64,11 +62,12 @@ Bref uses [the Serverless framework](https://serverless.com/) to configure and d Bref and AWS Lambda can be used to run many kind of PHP application, for example: - APIs +- websites - workers - batch processes/scripts -- websites +- event-driven microservices -Bref aims to support any PHP framework as well. +Bref aims to support any PHP framework. It comes with deep integrations with Laravel and Symfony. If you are interested in real-world examples as well as cost analyses head over to the [**Case Studies** page](/docs/case-studies.md). @@ -80,82 +79,98 @@ This maturity level is a vague metric, however it can be useful to anticipate th This matrix will be updated as Bref and AWS services evolve over time. - - - - - - +
    SimplicityPerformanceReliability
    + + + + + + - - + + + - + + - + + + + - - - - + + - - - - - + + - - - - - + + - - - + - - - +
    SimplicityPerformanceReliability
    +
    Jobs, Cron - + + + + + + - +
    API + + + - + +
    API - +
    Website + - + + - + +
    Website - +
    Legacy application + - + + - + +
    Legacy application - +
    Event-driven microservices + - + + - + +
    + Is this documented and simple to achieve? + Is performance acceptable? + Is this scenario production-ready?
    -
    +
    Legend: - Good use case - Some drawbacks - Strong limitations + Good use case + Some drawbacks + Strong limitations
    - **Jobs, Cron** @@ -164,19 +179,23 @@ This matrix will be updated as Bref and AWS services evolve over time. Using Bref, it is possible to implement cron jobs and queue workers using PHP. Bref also provides integration with popular queue libraries, like Laravel Queues and Symfony Messenger. + One limitation to keep in mind is that each AWS Lambda invocation has a maximum execution time of 15 minutes. + - **API** - APIs run on AWS Lambda without problems. Performance is now similar to what you could expect on traditional VPS. + APIs run on AWS Lambda without problems. Performance is now similar to what you could expect on a traditional VPS. + + The main difference to account for is that about 0.5% of HTTP requests are cold starts. If your use case requires that _all_ requests are handled below 10ms, serverless might not be a good fit. - **Website** - Websites can run on AWS Lambda. Assets can be stored in S3 and served via Cloudfront. This is documented in the ["Websites" documentation](/docs/use-cases/websites.mdx). Performance is as good as any server. + Websites run well on AWS Lambda. Assets can be stored in S3 and served via Cloudfront. This is documented in the ["Websites" documentation](/docs/use-cases/websites.mdx). Performance is as good as any server. - **Legacy application** Migrating a legacy PHP application to Bref and Lambda can be a challenge. One could expect to rewrite some parts of the code to make the application fit for Lambda (or running in containers in general). For example, file uploads and sessions often need to be adapted to work with the read-only filesystem. Cron tasks, scripts or asynchronous jobs must be made compatible with Lambda and SQS. - Not impossible, but definitely not the easiest place to start. As a first step, you can follow the guidelines of [The Twelve-Factor App](https://12factor.net). + Not impossible, but definitely not the easiest place to start. As a first step, you can follow the guidelines of [The Twelve-Factor App](https://12factor.net). Note that if your application already runs redundantly on multiple servers, it is much more ready for AWS Lambda and the migration could be simple. ## Getting started diff --git a/website/styles/main.css b/website/styles/main.css index b2ba7803f..461380f33 100644 --- a/website/styles/main.css +++ b/website/styles/main.css @@ -39,3 +39,11 @@ body { stroke: #fff !important; stroke-width: 1px !important; } + +.maturity-icon { + width: 20px; + height: 20px; + display: inline-block; + border-radius: 9999px; + vertical-align: text-top; +} From 5b95938162a3e5965843186a088c5781caa49533 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 19 Sep 2023 10:08:24 +0200 Subject: [PATCH 089/144] Docs: costs --- docs/_meta.json | 2 +- ...sts-calculator.mdx => serverless-costs.mdx} | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) rename docs/{costs-calculator.mdx => serverless-costs.mdx} (94%) diff --git a/docs/_meta.json b/docs/_meta.json index b63abc9cf..10bbd78c6 100644 --- a/docs/_meta.json +++ b/docs/_meta.json @@ -13,7 +13,7 @@ "title": "How it works" }, "runtimes": "PHP runtimes for AWS Lambda", - "costs-calculator": "Costs calculator", + "serverless-costs": "Serverless costs", "-- Workflow": { "type": "separator", "title": "Workflow" diff --git a/docs/costs-calculator.mdx b/docs/serverless-costs.mdx similarity index 94% rename from docs/costs-calculator.mdx rename to docs/serverless-costs.mdx index ab355984c..5c6c13809 100644 --- a/docs/costs-calculator.mdx +++ b/docs/serverless-costs.mdx @@ -1,7 +1,23 @@ import { useState } from 'react'; + export const introduction = 'Calculate the costs of running your PHP application on AWS Lambda.'; -# Serverless costs calculator +# Costs of a serverless application + +Unlike traditional hosting, serverless hosting is billed based on usage. This means that you only pay for what you use, **down to the request**. + +To be clear, this means that if your application is not used, you don't pay anything. + +On AWS Lambda, you pay for: + +- the number of requests +- the duration of the requests (the time it takes to execute your code) + +There are no costs when the PHP application is waiting between requests (or jobs, events, etc.). It doesn't matter if AWS Lambda scaled your functions up to several instances (containers), you only pay for the requests and the duration of the requests. + +For some use cases it has interesting consequences: 1 job running for 10 minutes has about the same costs as 600 jobs running for 1 second in parallel. + +## Costs calculator Use the calculator below to estimate the costs of running your PHP application serverless on AWS Lambda. From 77e7cf876a3f2ef97507944f224a589d66bbb138 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 19 Sep 2023 10:15:13 +0200 Subject: [PATCH 090/144] Website: fix link --- website/src/components/home/companies.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index bdc655579..b1c275b59 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -25,7 +25,7 @@ export default function Companies() { > Documentation - + Support & consulting
    From 2abe360421c35317681bcd47b1388da7bdc0686a Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 19 Sep 2023 10:18:23 +0200 Subject: [PATCH 091/144] Docs: clarify Octane behavior --- docs/laravel/{octane.md => octane.mdx} | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) rename docs/laravel/{octane.md => octane.mdx} (85%) diff --git a/docs/laravel/octane.md b/docs/laravel/octane.mdx similarity index 85% rename from docs/laravel/octane.md rename to docs/laravel/octane.mdx index 7879ab252..e13687db1 100644 --- a/docs/laravel/octane.md +++ b/docs/laravel/octane.mdx @@ -1,6 +1,4 @@ ---- -introduction: Run Laravel with Octane on AWS Lambda using Bref. ---- +export const introduction = 'Run Laravel with Octane on AWS Lambda using Bref.'; # Laravel Octane @@ -20,6 +18,7 @@ Keep the following details in mind: - Laravel Octane does not need Swoole or RoadRunner on AWS Lambda, so it is not possible to use Swoole-specific features. - Octane keeps Laravel booted in a long-running process, [beware of memory leaks](https://laravel.com/docs/10.x/octane#managing-memory-leaks). +- The process is kept alive between requests, but you still don't pay for time between requests. The execution model and cost model of AWS Lambda does not change (Lambda is frozen between requests). - `BREF_LOOP_MAX` specifies the number of HTTP requests handled before the PHP process is restarted (and the memory is cleared). ### Persistent database connections From e00c0923cccf8501b13f8165b0b0fe9eec1c8102 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 19 Sep 2023 10:21:50 +0200 Subject: [PATCH 092/144] Docs: console --- docs/laravel/getting-started.mdx | 10 +++++++--- docs/symfony/getting-started.mdx | 11 +++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/laravel/getting-started.mdx b/docs/laravel/getting-started.mdx index eafecfd9c..04d9abc2e 100644 --- a/docs/laravel/getting-started.mdx +++ b/docs/laravel/getting-started.mdx @@ -77,7 +77,7 @@ Have a look at the [Website guide](../use-cases/websites.mdx) to learn how to de ## Laravel Artisan -As you may have noticed, we define a function named "artisan" in `serverless.yml`. That function is using the [Console runtime](/docs/web-apps/console.md), which lets us run Laravel Artisan on AWS Lambda. +As you may have noticed, we define a function named "artisan" in `serverless.yml`. That function is using the [Console runtime](../runtimes/console.mdx), which lets us run Laravel Artisan on AWS Lambda. For example, to execute an `artisan` command on Lambda, run the command below: @@ -85,9 +85,13 @@ For example, to execute an `artisan` command on Lambda, run the command below: serverless bref:cli --args="" ``` -For more details follow [the "Console" guide](/docs/web-apps/console.md). +For example: -TODO +```bash +serverless bref:cli --args="route:list" +``` + +For more details follow [the "Console" guide](../runtimes/console.mdx). ## Inertia diff --git a/docs/symfony/getting-started.mdx b/docs/symfony/getting-started.mdx index c025f3fe3..3d5742f9c 100644 --- a/docs/symfony/getting-started.mdx +++ b/docs/symfony/getting-started.mdx @@ -85,8 +85,7 @@ Have a look at the [Website guide](../use-cases/websites.mdx) to learn how to de ## Symfony Console -As you may have noticed, we define a function named "console" in `serverless.yml`. That function is using the [Console runtime](/docs/web-apps/console.md), -which lets us run the Symfony Console on AWS Lambda. +As you may have noticed, we define a function named "console" in `serverless.yml`. That function is using the [Console runtime](../runtimes/console.mdx), which lets us run the Symfony Console on AWS Lambda. For example, to execute an `bin/console` command on Lambda, run the command below: @@ -94,9 +93,13 @@ For example, to execute an `bin/console` command on Lambda, run the command belo serverless bref:cli --args="" ``` -For more details follow [the "Console" guide](/docs/web-apps/console.md). +For example: -TODO +```bash +serverless bref:cli --args="doctrine:migrations:migrate" +``` + +For more details follow [the "Console" guide](../runtimes/console.mdx). ## Logs From cfc8e13ddacac9339d3d8cc209c7043210e5f9f2 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 19 Sep 2023 10:26:39 +0200 Subject: [PATCH 093/144] Docs: Symfony --- docs/symfony/caching.mdx | 4 +--- docs/symfony/messenger.mdx | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/symfony/caching.mdx b/docs/symfony/caching.mdx index bd872b370..9f59a5bc5 100644 --- a/docs/symfony/caching.mdx +++ b/docs/symfony/caching.mdx @@ -1,6 +1,4 @@ -import { Callout } from 'nextra/components'; - -# Caching +# Symfony Caching As explained in the [Storage documentation](../environment/storage.md), the filesystem is readonly on AWS Lambda except for `/tmp`. diff --git a/docs/symfony/messenger.mdx b/docs/symfony/messenger.mdx index fb8f012fb..530529e19 100644 --- a/docs/symfony/messenger.mdx +++ b/docs/symfony/messenger.mdx @@ -13,7 +13,7 @@ This guide assumes that: - Symfony and [Symfony Messenger are installed](https://symfony.com/doc/current/messenger.html#installation) - Bref is [installed and set up with Symfony](./getting-started.mdx) -First, install the Bref-Symfony messenger integration: +First, install the [Bref-Symfony messenger integration](https://github.com/brefphp/symfony-messenger): ```bash composer require bref/symfony-messenger From 97360ee6f104eaaddd2a0da84191f24c03e69711 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 19 Sep 2023 10:43:10 +0200 Subject: [PATCH 094/144] Docs: tweaks --- docs/_meta.json | 12 ++++----- docs/{community.md => community.mdx} | 8 +++--- docs/laravel/file-storage.mdx | 37 +++++++++++++++------------- docs/laravel/getting-started.mdx | 2 +- docs/laravel/octane.mdx | 2 +- docs/laravel/passport.mdx | 2 +- docs/laravel/queues.mdx | 16 ++++++------ docs/newsletters.md | 16 ------------ website/redirects.js | 1 + 9 files changed, 42 insertions(+), 54 deletions(-) rename docs/{community.md => community.mdx} (65%) delete mode 100644 docs/newsletters.md diff --git a/docs/_meta.json b/docs/_meta.json index 10bbd78c6..88a96bb6b 100644 --- a/docs/_meta.json +++ b/docs/_meta.json @@ -12,7 +12,7 @@ "type": "separator", "title": "How it works" }, - "runtimes": "PHP runtimes for AWS Lambda", + "runtimes": "PHP runtimes for Lambda", "serverless-costs": "Serverless costs", "-- Workflow": { "type": "separator", @@ -28,14 +28,14 @@ "use-cases": "Use cases", "environment": "Environment", "upgrading": "Upgrading", - "-- Learning": { + "-- Resources": { "type": "separator", - "title": "Learning" + "title": "Resources" }, "course": { - "title": "Course", + "title": "Serverless course", "href": "https://serverless-visually-explained.com/?ref=bref-menu" }, - "case-studies": "", - "community": "" + "community": "", + "case-studies": "" } \ No newline at end of file diff --git a/docs/community.md b/docs/community.mdx similarity index 65% rename from docs/community.md rename to docs/community.mdx index 671c4c1fa..c5d898962 100644 --- a/docs/community.md +++ b/docs/community.mdx @@ -1,6 +1,4 @@ ---- -introduction: A collection of links to places where to discuss and learn about Bref. ---- +export const introduction = 'A collection of links to places where to discuss and learn about Bref.'; # Community @@ -8,7 +6,7 @@ To report bugs you can head over to the [GitHub Bref repository](https://github. For community support and general discussions, [open a GitHub discussion](https://github.com/brefphp/bref/discussions). -You can also join the [Slack community](https://join.slack.com/t/brefworkspace/shared_invite/enQtNTcwMjU2NTcxNjAxLTIxYmM2MmRjMDkzYjdjYTNkMmE5NGI3YTcyZjc2ZGRjNTFmNjFmYzk5NWQ1YmVhMDkwNzExNzhjZThkZWM0ODE) to discuss Bref and exchange with the community (please open an issue if the link doesn't work). +You can also join the [Slack community](https://bref.sh/slack) to discuss Bref and exchange with the community (please open an issue if the link doesn't work). On Twitter, follow [@brefphp](https://twitter.com/brefphp) to get news about Bref. @@ -24,7 +22,7 @@ You can subscribe to these newsletters to keep up to date with what's happening - [Serverless PHP](https://serverless-php.news/) - A monthly newsletter about serverless news related to PHP. + A newsletter about serverless news related to PHP. - [Off by None](https://www.jeremydaly.com/newsletter/) A very packed weekly newsletter about serverless news in general. diff --git a/docs/laravel/file-storage.mdx b/docs/laravel/file-storage.mdx index f519c3d68..d76792e3d 100644 --- a/docs/laravel/file-storage.mdx +++ b/docs/laravel/file-storage.mdx @@ -1,3 +1,5 @@ +import { Callout } from 'nextra/components'; + # File storage Laravel has a [filesystem abstraction](https://laravel.com/docs/filesystem) that lets us easily change where files are stored. @@ -33,13 +35,15 @@ resources: That's it! The AWS credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN) are set automatically in AWS Lambda, you don't have to define them. -### Public files +## Public files Laravel has a [special disk called `public`](https://laravel.com/docs/filesystem#the-public-disk): this disk stores files that we want to make public, like uploaded photos, generated PDF files, etc. Again, those files cannot be stored on Lambda, i.e. they cannot be stored in the default `storage/app/public` directory. You need to store those files on S3. -> Do not run `php artisan storage:link` in AWS Lambda: it is now useless, and it will fail because the filesystem is read-only in Lambda. + + Do not run `php artisan storage:link` in AWS Lambda: it is now useless, and it will fail because the filesystem is read-only in Lambda. + To store public files on S3, you could replace the disk in the code: @@ -48,16 +52,16 @@ To store public files on S3, you could replace the disk in the code: + Storage::disk('s3')->put('avatars/1', $fileContents); ``` -but doing this will not let your application work locally. A better solution, but more complex, involves making the `public` disk configurable. Let's change the configuration in `config/filesystems.php`: +but doing this will not let your application work locally. A better solution, but more complex, involves making the `public` disk configurable. Let's change the following lines in `config/filesystems.php`: -```diff +```php filename="config/filesystems.php" {7,18,35-43} /* |-------------------------------------------------------------------------- | Default Public Filesystem Disk |-------------------------------------------------------------------------- */ -+ 'public' => env('FILESYSTEM_DISK', 'public_local'), + 'public' => env('FILESYSTEM_DISK', 'public_local'), ... @@ -68,8 +72,7 @@ but doing this will not let your application work locally. A better solution, bu 'root' => storage_path('app'), ], -- 'public' => [ -+ 'public_local' => [ + 'public_local' => [ // Rename `public` to `public_local` 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', @@ -86,22 +89,22 @@ but doing this will not let your application work locally. A better solution, bu 'url' => env('AWS_URL'), ], -+ 's3_public' => [ -+ 'driver' => 's3', -+ 'key' => env('AWS_ACCESS_KEY_ID'), -+ 'secret' => env('AWS_SECRET_ACCESS_KEY'), -+ 'token' => env('AWS_SESSION_TOKEN'), -+ 'region' => env('AWS_DEFAULT_REGION'), -+ 'bucket' => env('AWS_PUBLIC_BUCKET'), -+ 'url' => env('AWS_URL'), -+ ], + 's3_public' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'token' => env('AWS_SESSION_TOKEN'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_PUBLIC_BUCKET'), + 'url' => env('AWS_URL'), + ], ], ``` You can now configure the `public` disk to use S3 by changing `serverless.yml` or your production `.env`: -```dotenv +```bash filename=".env" FILESYSTEM_DISK=s3 FILESYSTEM_DISK_PUBLIC=s3 ``` diff --git a/docs/laravel/getting-started.mdx b/docs/laravel/getting-started.mdx index 04d9abc2e..eae684089 100644 --- a/docs/laravel/getting-started.mdx +++ b/docs/laravel/getting-started.mdx @@ -20,7 +20,7 @@ Next, in an existing Laravel project, install Bref and the [Laravel-Bref package composer require bref/bref bref/laravel-bridge --update-with-dependencies ``` -Then let's create a [`serverless.yml` configuration file](https://bref.sh/docs/environment/serverless-yml.html): +Then let's create a [`serverless.yml` configuration file](../environment/serverless-yml.mdx): ```bash php artisan vendor:publish --tag=serverless-config diff --git a/docs/laravel/octane.mdx b/docs/laravel/octane.mdx index e13687db1..782f836f4 100644 --- a/docs/laravel/octane.mdx +++ b/docs/laravel/octane.mdx @@ -21,7 +21,7 @@ Keep the following details in mind: - The process is kept alive between requests, but you still don't pay for time between requests. The execution model and cost model of AWS Lambda does not change (Lambda is frozen between requests). - `BREF_LOOP_MAX` specifies the number of HTTP requests handled before the PHP process is restarted (and the memory is cleared). -### Persistent database connections +## Persistent database connections You can keep database connections persistent across requests to make your application even faster. To do so, set the `OCTANE_PERSIST_DATABASE_SESSIONS` environment variable: diff --git a/docs/laravel/passport.mdx b/docs/laravel/passport.mdx index 1b4c44c97..fc9893388 100644 --- a/docs/laravel/passport.mdx +++ b/docs/laravel/passport.mdx @@ -22,7 +22,7 @@ Instead, here is what you need to do: Depending on how you deploy your application (from your machine, or from CI), you may want to whitelist them in `serverless.yml`: - ```yaml + ```yml filename="serverless.yml" package: patterns: - ... diff --git a/docs/laravel/queues.mdx b/docs/laravel/queues.mdx index 8583119f4..4c234f315 100644 --- a/docs/laravel/queues.mdx +++ b/docs/laravel/queues.mdx @@ -51,16 +51,18 @@ If you want to create the SQS queue manually, you will need to set these variabl That's it! Anytime a job is pushed to Laravel Queues, it will be sent to SQS, and SQS will invoke our "worker" function so that it is processed. -> **Note**: -> -> In the example above, we set the full SQS queue URL in the `SQS_QUEUE` variable. -> -If you only set the queue name (which is also valid), you need to set the `SQS_PREFIX` environment variable too. For example: `SQS_PREFIX: "https://sqs.${aws:region}.amazonaws.com/${aws:accountId}"`. + + In the example above, we set the full SQS queue URL in the `SQS_QUEUE` variable. + + If you only set the queue name (which is also valid), you need to set the `SQS_PREFIX` environment variable too. For example: `SQS_PREFIX: "https://sqs.${aws:region}.amazonaws.com/${aws:accountId}"`. + -### How it works +## How it works When integrated with AWS Lambda, SQS has a built-in retry mechanism and storage for failed messages. These features work slightly differently than Laravel Queues. The "Bref for Laravel" integration does **not** use these SQS features. Instead, "Bref for Laravel" makes all the feature of Laravel Queues work out of the box, just like on any server. Read more in [the Laravel Queues documentation](https://laravel.com/docs/latest/queues). -> **Note:** the "Bref-Laravel bridge" v1 used to do the opposite. We changed that behavior in Bref v2 in order to make the experience smoother for Laravel users. + + The "Bref-Laravel bridge" v1 used to do the opposite. We changed that behavior in Bref v2 in order to make the experience smoother for Laravel users. + diff --git a/docs/newsletters.md b/docs/newsletters.md deleted file mode 100644 index f70c75ee7..000000000 --- a/docs/newsletters.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Newsletters -current_menu: newsletters -introduction: A collection of newsletters related to serverless and PHP. ---- - -This page collects newsletters related to serverless and PHP. Those are not necessarily related to Bref. - -You can subscribe to these newsletters to keep up to date with what's happening in the serverless world. - -- [Serverless PHP](https://serverless-php.news/) - - A monthly newsletter about serverless news related to PHP. -- [Off by None](https://www.jeremydaly.com/newsletter/) - - A weekly newsletter about serverless news in general. diff --git a/website/redirects.js b/website/redirects.js index 06d7c568e..0e18d5801 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -8,4 +8,5 @@ module.exports.redirects = { '/docs/web-apps/index.md#assets': '/docs/use-cases/websites', '/docs/function/local-development': '/docs/local-development/event-driven-functions', '/docs/frameworks/laravel': '/docs/laravel/getting-started', + '/docs/newsletters': '/docs/community#newsletters', }; From 7b8c08d369287e57bb43e88ddbf563c5dca2608a Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 19 Sep 2023 17:40:23 +0200 Subject: [PATCH 095/144] Website: update logo --- website/src/components/home/sponsors.jsx | 8 +++--- .../components/home/sponsors/logo-depot.png | Bin 14039 -> 0 bytes .../components/home/sponsors/logo-depot.svg | 23 ++++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) delete mode 100644 website/src/components/home/sponsors/logo-depot.png create mode 100644 website/src/components/home/sponsors/logo-depot.svg diff --git a/website/src/components/home/sponsors.jsx b/website/src/components/home/sponsors.jsx index 15a6ae080..4ce56a581 100644 --- a/website/src/components/home/sponsors.jsx +++ b/website/src/components/home/sponsors.jsx @@ -7,7 +7,7 @@ import nullLogo from './sponsors/logo-null.png'; import awsLogo from './sponsors/logo-aws.svg'; import jetbrainsLogo from './sponsors/logo-jetbrains.svg'; import laravelLogo from './sponsors/logo-laravel.svg'; -import depotLogo from './sponsors/logo-depot.png'; +import depotLogo from './sponsors/logo-depot.svg'; import secumailerLogo from './sponsors/logo-secumailer.svg'; import ecomailLogo from './sponsors/logo-ecomail.png'; import PremiumSponsor from './sponsors/premium-sponsor'; @@ -16,7 +16,7 @@ export default function Sponsors() { return (

    - They sponsor the open-source project ❤️ + They sponsor the open-source project ❤️

    @@ -36,8 +36,8 @@ export default function Sponsors() {

    - - + +
    diff --git a/website/src/components/home/sponsors/logo-depot.png b/website/src/components/home/sponsors/logo-depot.png deleted file mode 100644 index e8bc14eb3a7afafe99e15be86bea5681ae83046c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14039 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 diff --git a/website/src/components/home/sponsors/logo-depot.svg b/website/src/components/home/sponsors/logo-depot.svg new file mode 100644 index 000000000..53869e015 --- /dev/null +++ b/website/src/components/home/sponsors/logo-depot.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + From 641076676b859774f883f1b9f0d6186bb75e5ff9 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 19 Sep 2023 17:52:02 +0200 Subject: [PATCH 096/144] Website: tweak --- website/src/components/home/companies.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index b1c275b59..48476d392 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -13,7 +13,7 @@ export default function Companies() {

    - Used in production around the world + Used by thousands of companies

    Get started with Bref on your own, or get in touch for support and consulting. From 30831c83b23b5a0c6fa1a7e0ba2e297cc5538172 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 21 Sep 2023 09:03:09 +0200 Subject: [PATCH 097/144] Website: companies --- website/src/components/home/companies.jsx | 21 +++++++++++-------- .../components/home/companies/20minutes.svg | 17 +++++++++++++++ 2 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 website/src/components/home/companies/20minutes.svg diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index 48476d392..0f1cb4423 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -5,6 +5,7 @@ import myBuilderLogo from './companies/mybuilder.svg'; import neuralLoveLogo from './companies/neural-love.svg'; import enopteaLogo from './companies/enoptea.png'; import gulliLogo from './companies/gulli.svg'; +import minutesLogo from './companies/20minutes.svg'; export default function Companies() { return ( @@ -38,8 +39,8 @@ export default function Companies() { /> bCast.fm neural.love Enoptea -

    - phpjobs.app -
    externals.io
    + neural.love
    diff --git a/website/src/components/home/companies/20minutes.svg b/website/src/components/home/companies/20minutes.svg new file mode 100644 index 000000000..6d825e44e --- /dev/null +++ b/website/src/components/home/companies/20minutes.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file From 5ee11dbc7494dfd97727eae070b6f03bf691e370 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 22 Sep 2023 17:24:46 +0200 Subject: [PATCH 098/144] Website: favicon --- website/public/apple-touch-icon-144x144.png | Bin 0 -> 5293 bytes website/public/apple-touch-icon-152x152.png | Bin 0 -> 5740 bytes website/public/favicon-16x16.png | Bin 0 -> 454 bytes website/public/favicon-32x32.png | Bin 0 -> 920 bytes website/public/favicon.ico | Bin 0 -> 5430 bytes website/theme.config.jsx | 7 ++++++- 6 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 website/public/apple-touch-icon-144x144.png create mode 100644 website/public/apple-touch-icon-152x152.png create mode 100644 website/public/favicon-16x16.png create mode 100644 website/public/favicon-32x32.png create mode 100644 website/public/favicon.ico diff --git a/website/public/apple-touch-icon-144x144.png b/website/public/apple-touch-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..d32e4e5ad1b3ba05a541e9e87fe0940d9cf092ec GIT binary patch literal 5293 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 literal 0 HcmV?d00001 diff --git a/website/theme.config.jsx b/website/theme.config.jsx index bd1306d0e..18dca5535 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -43,7 +43,12 @@ export default { }, head: ( <> - + + + + + + ), footer: { From 14b1272459269bab59394a3a043856a5ae7b357e Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 22 Sep 2023 17:48:48 +0200 Subject: [PATCH 099/144] Website: 404 --- website/src/pages/404.mdx | 60 ++++++++++++++++++++++++++++++++++++ website/src/pages/_meta.json | 8 +++++ 2 files changed, 68 insertions(+) create mode 100644 website/src/pages/404.mdx diff --git a/website/src/pages/404.mdx b/website/src/pages/404.mdx new file mode 100644 index 000000000..6b0fef86f --- /dev/null +++ b/website/src/pages/404.mdx @@ -0,0 +1,60 @@ +import { ChevronRightIcon } from '@heroicons/react/20/solid' +import { BookOpenIcon, BugAntIcon } from '@heroicons/react/24/solid' + +

    +
    +
    404
    +

    This page does not exist

    +
    + Sorry, we couldn’t find the page you’re looking for. +
    +
    +
    +

    Popular pages

    + + +
    +
    diff --git a/website/src/pages/_meta.json b/website/src/pages/_meta.json index 1085ed7bf..72af50810 100644 --- a/website/src/pages/_meta.json +++ b/website/src/pages/_meta.json @@ -37,6 +37,14 @@ "theme": { } }, + "404": { + "type": "page", + "title": "Sentry integration for AWS Lambda", + "display": "hidden", + "theme": { + "layout": "raw" + } + }, "sentry": { "type": "page", "title": "Sentry integration for AWS Lambda", From cef2d5f41d43eb56b14ad5ac8511514c8fb7adad Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 22 Sep 2023 18:09:12 +0200 Subject: [PATCH 100/144] Website: 404 tracking --- website/next.config.js | 6 +- website/package-lock.json | 14 +++++ website/package.json | 1 + website/src/pages/404.mdx | 123 +++++++++++++++++++++---------------- website/src/pages/_app.jsx | 7 ++- 5 files changed, 94 insertions(+), 57 deletions(-) diff --git a/website/next.config.js b/website/next.config.js index abdb3c62f..7d95306a6 100644 --- a/website/next.config.js +++ b/website/next.config.js @@ -1,3 +1,5 @@ +const { withPlausibleProxy } = require('next-plausible') + const withNextra = require('nextra')({ theme: 'nextra-theme-docs', themeConfig: './theme.config.jsx', @@ -6,7 +8,7 @@ const withNextra = require('nextra')({ defaultShowCopyCode: true, }) -module.exports = withNextra({ +module.exports = withNextra(withPlausibleProxy()({ // Redirect old .html links async redirects() { const { redirects } = require('./redirects'); @@ -28,7 +30,7 @@ module.exports = withNextra({ ...redirectList, ] }, -}) +})); // If you have other Next.js configurations, you can pass them as the parameter: // module.exports = withNextra({ /* other next.js config */ }) diff --git a/website/package-lock.json b/website/package-lock.json index 2ba32ae9d..35e728764 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,6 +9,7 @@ "@heroicons/react": "^2.0.18", "@octokit/graphql": "^7.0.1", "next": "^13.4.9", + "next-plausible": "^3.11.1", "next-seo": "^6.1.0", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", @@ -4989,6 +4990,19 @@ "react-dom": ">=16.x <=18.x" } }, + "node_modules/next-plausible": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/next-plausible/-/next-plausible-3.11.1.tgz", + "integrity": "sha512-Gd+QU+XflVTx65yJ2cNZyrOQLrpz3uKjGLEG4ls+CIVqK3yjsVGCMsEWJcvv1LAeVfHUQtCyp1xyAltLn5Odcg==", + "funding": { + "url": "https://github.com/4lejandrito/next-plausible?sponsor=1" + }, + "peerDependencies": { + "next": "^11.1.0 || ^12.0.0 || ^13.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/next-seo": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-6.1.0.tgz", diff --git a/website/package.json b/website/package.json index a85050b71..07df02244 100644 --- a/website/package.json +++ b/website/package.json @@ -10,6 +10,7 @@ "@heroicons/react": "^2.0.18", "@octokit/graphql": "^7.0.1", "next": "^13.4.9", + "next-plausible": "^3.11.1", "next-seo": "^6.1.0", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", diff --git a/website/src/pages/404.mdx b/website/src/pages/404.mdx index 6b0fef86f..6c0a22146 100644 --- a/website/src/pages/404.mdx +++ b/website/src/pages/404.mdx @@ -1,60 +1,75 @@ -import { ChevronRightIcon } from '@heroicons/react/20/solid' -import { BookOpenIcon, BugAntIcon } from '@heroicons/react/24/solid' +import { ChevronRightIcon } from '@heroicons/react/20/solid'; +import { BookOpenIcon, BugAntIcon } from '@heroicons/react/24/solid'; +import { usePlausible } from 'next-plausible'; +import { useEffect } from 'react'; -
    -
    -
    404
    -

    This page does not exist

    -
    - Sorry, we couldn’t find the page you’re looking for. +export default function NotFound() { + const plausible = usePlausible(); + useEffect(() => { + // Track 404s so we can fix them + plausible('404', { props: { path: document.location.pathname } }); + }, []); + + return
    +
    +
    404
    +

    This page does not + exist

    +
    + Sorry, we couldn’t find the page you’re looking for. +
    -
    -
    -

    Popular pages

    - +
    -
    -
    + +} diff --git a/website/src/pages/_app.jsx b/website/src/pages/_app.jsx index 12ba341c4..4a4e8b193 100644 --- a/website/src/pages/_app.jsx +++ b/website/src/pages/_app.jsx @@ -1,6 +1,7 @@ import '../../styles/main.css'; import { useRouter } from 'next/router'; import { useEffect } from 'react'; +import PlausibleProvider from 'next-plausible'; const redirects = require('../../redirects').redirects; export default function MyApp({ Component, pageProps }) { @@ -24,5 +25,9 @@ export default function MyApp({ Component, pageProps }) { } }, []); - return + return ( + + + + ) } From b77c9979fc77da01152f1d0382153aa3129536b1 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 22 Sep 2023 18:26:10 +0200 Subject: [PATCH 101/144] Website: refresh metrics --- website/src/pages/index.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index 188f8e776..87b99a9b1 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -17,6 +17,7 @@ export async function getStaticProps() { invocations = await getBrefInvocations(); } catch (e) { console.error(e); + // Fallback value for local development, preview environments, etc. (no permissions) invocations = 11700607900; } // See https://nextra.site/docs/guide/ssg @@ -26,8 +27,8 @@ export async function getStaticProps() { invocations: invocations, }, }, - // The page will be considered as stale and regenerated every 60 seconds. - revalidate: 60, + // The page will be considered as stale and regenerated every hour + revalidate: 60 * 60, }; } From c5e052fc420f34072e20f8b3a311cdc2cf588227 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 22 Sep 2023 18:31:15 +0200 Subject: [PATCH 102/144] Website: old redirects --- website/redirects.js | 5 +++++ website/template/_redirects | 8 -------- 2 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 website/template/_redirects diff --git a/website/redirects.js b/website/redirects.js index 0e18d5801..f1cce3704 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -9,4 +9,9 @@ module.exports.redirects = { '/docs/function/local-development': '/docs/local-development/event-driven-functions', '/docs/frameworks/laravel': '/docs/laravel/getting-started', '/docs/newsletters': '/docs/community#newsletters', + '/docs/newsletters.html': '/docs/community#newsletters', + '/docs/cron.html': '/docs/use-cases/cron', + '/docs/web-apps/cron.html': '/docs/use-cases/cron', + '/docs/local-development.html': '/docs/local-development', + '/docs/web-apps/local-development.html': '/docs/local-development', }; diff --git a/website/template/_redirects b/website/template/_redirects deleted file mode 100644 index 5f163dc92..000000000 --- a/website/template/_redirects +++ /dev/null @@ -1,8 +0,0 @@ -# Redirect default Netlify subdomain to primary domain -http://bref-website.netlify.com/* http://bref.sh/:splat 301! -https://bref-website.netlify.com/* https://bref.sh/:splat 301! - -# Deleted pages -/docs/newsletters.html /docs/community.html -/docs/cron.html /docs/web-apps/cron.html -/docs/local-development.html /docs/web-apps/local-development.html From b20c6af766d2d23b85fbfbf8d3bc696a562222db Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 23 Sep 2023 18:41:34 +0200 Subject: [PATCH 103/144] Website: sitemap --- website/.gitignore | 3 ++ website/next-sitemap.config.js | 5 +++ website/package-lock.json | 58 +++++++++++++++++++++++----------- website/package.json | 2 ++ 4 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 website/next-sitemap.config.js diff --git a/website/.gitignore b/website/.gitignore index ed3513cc8..4625954bd 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -1,3 +1,6 @@ src/pages/docs .next .vercel +public/robots.txt +public/sitemap.xml +public/sitemap-*.xml diff --git a/website/next-sitemap.config.js b/website/next-sitemap.config.js new file mode 100644 index 000000000..2efb39f74 --- /dev/null +++ b/website/next-sitemap.config.js @@ -0,0 +1,5 @@ +/** @type {import('next-sitemap').IConfig} */ +module.exports = { + siteUrl: process.env.SITE_URL || 'https://bref.sh', + generateRobotsTxt: true, +} diff --git a/website/package-lock.json b/website/package-lock.json index 35e728764..ef2602f35 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -11,6 +11,7 @@ "next": "^13.4.9", "next-plausible": "^3.11.1", "next-seo": "^6.1.0", + "next-sitemap": "^4.2.3", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", "react": "^18.2.0", @@ -590,6 +591,11 @@ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" }, + "node_modules/@corex/deepmerge": { + "version": "4.0.43", + "resolved": "https://registry.npmjs.org/@corex/deepmerge/-/deepmerge-4.0.43.tgz", + "integrity": "sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==" + }, "node_modules/@headlessui/react": { "version": "1.7.15", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", @@ -1059,7 +1065,6 @@ "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" @@ -1072,7 +1077,6 @@ "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" } @@ -1081,7 +1085,6 @@ "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" @@ -1970,7 +1973,6 @@ "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" }, @@ -2940,7 +2942,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2977,7 +2978,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -2986,7 +2986,6 @@ "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" }, @@ -3111,7 +3110,6 @@ "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" }, @@ -3485,7 +3483,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3494,7 +3491,6 @@ "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" }, @@ -3515,7 +3511,6 @@ "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" } @@ -4112,7 +4107,6 @@ "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" } @@ -4850,7 +4844,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -4880,6 +4873,14 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -5013,6 +5014,32 @@ "react-dom": ">=16.0.0" } }, + "node_modules/next-sitemap": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/next-sitemap/-/next-sitemap-4.2.3.tgz", + "integrity": "sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==", + "funding": [ + { + "url": "https://github.com/iamvishnusankar/next-sitemap.git" + } + ], + "dependencies": { + "@corex/deepmerge": "^4.0.43", + "@next/env": "^13.4.3", + "fast-glob": "^3.2.12", + "minimist": "^1.2.8" + }, + "bin": { + "next-sitemap": "bin/next-sitemap.mjs", + "next-sitemap-cjs": "bin/next-sitemap.cjs" + }, + "engines": { + "node": ">=14.18" + }, + "peerDependencies": { + "next": "*" + } + }, "node_modules/next-themes": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", @@ -5291,7 +5318,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -5452,7 +5478,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -5716,7 +5741,6 @@ "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" @@ -5731,7 +5755,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -6174,7 +6197,6 @@ "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" }, diff --git a/website/package.json b/website/package.json index 07df02244..a6bad4669 100644 --- a/website/package.json +++ b/website/package.json @@ -2,6 +2,7 @@ "scripts": { "dev": "next dev -p 8000", "build": "next build", + "postbuild": "next-sitemap", "start": "next start", "lint": "next lint" }, @@ -12,6 +13,7 @@ "next": "^13.4.9", "next-plausible": "^3.11.1", "next-seo": "^6.1.0", + "next-sitemap": "^4.2.3", "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", "react": "^18.2.0", From 89c63a3d27e32da497aa0eeb34bcc748a960409d Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 23 Sep 2023 19:09:46 +0200 Subject: [PATCH 104/144] Website: Algolia search --- website/package-lock.json | 221 ++++++++++++++++++++++++++++++++++++++ website/package.json | 2 + website/styles/main.css | 21 ++++ website/theme.config.jsx | 4 + 4 files changed, 248 insertions(+) diff --git a/website/package-lock.json b/website/package-lock.json index ef2602f35..1c051937f 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -6,6 +6,8 @@ "": { "dependencies": { "@aws-sdk/client-cloudwatch": "^3.393.0", + "@docsearch/css": "^3.5.2", + "@docsearch/react": "^3.5.2", "@heroicons/react": "^2.0.18", "@octokit/graphql": "^7.0.1", "next": "^13.4.9", @@ -25,6 +27,162 @@ "tailwindcss": "^3.3.2" } }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz", + "integrity": "sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==", + "dependencies": { + "@algolia/cache-common": "4.20.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz", + "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz", + "integrity": "sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==", + "dependencies": { + "@algolia/cache-common": "4.20.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.20.0.tgz", + "integrity": "sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==", + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.20.0.tgz", + "integrity": "sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==", + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz", + "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==", + "dependencies": { + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.20.0.tgz", + "integrity": "sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==", + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz", + "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==", + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz", + "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.20.0.tgz", + "integrity": "sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==", + "dependencies": { + "@algolia/logger-common": "4.20.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz", + "integrity": "sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==", + "dependencies": { + "@algolia/requester-common": "4.20.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz", + "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz", + "integrity": "sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==", + "dependencies": { + "@algolia/requester-common": "4.20.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz", + "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==", + "dependencies": { + "@algolia/cache-common": "4.20.0", + "@algolia/logger-common": "4.20.0", + "@algolia/requester-common": "4.20.0" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -596,6 +754,42 @@ "resolved": "https://registry.npmjs.org/@corex/deepmerge/-/deepmerge-4.0.43.tgz", "integrity": "sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==" }, + "node_modules/@docsearch/css": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", + "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==" + }, + "node_modules/@docsearch/react": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", + "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, "node_modules/@headlessui/react": { "version": "1.7.15", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", @@ -1821,6 +2015,27 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/algoliasearch": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz", + "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.20.0", + "@algolia/cache-common": "4.20.0", + "@algolia/cache-in-memory": "4.20.0", + "@algolia/client-account": "4.20.0", + "@algolia/client-analytics": "4.20.0", + "@algolia/client-common": "4.20.0", + "@algolia/client-personalization": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/logger-common": "4.20.0", + "@algolia/logger-console": "4.20.0", + "@algolia/requester-browser-xhr": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/requester-node-http": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, "node_modules/ansi-sequence-parser": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", @@ -5810,6 +6025,12 @@ "compute-scroll-into-view": "^3.0.2" } }, + "node_modules/search-insights": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.8.2.tgz", + "integrity": "sha512-PxA9M5Q2bpBelVvJ3oDZR8nuY00Z6qwOxL53wNpgzV28M/D6u9WUbImDckjLSILBF8F1hn/mgyuUaOPtjow4Qw==", + "peer": true + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", diff --git a/website/package.json b/website/package.json index a6bad4669..479ab88b0 100644 --- a/website/package.json +++ b/website/package.json @@ -8,6 +8,8 @@ }, "dependencies": { "@aws-sdk/client-cloudwatch": "^3.393.0", + "@docsearch/css": "^3.5.2", + "@docsearch/react": "^3.5.2", "@heroicons/react": "^2.0.18", "@octokit/graphql": "^7.0.1", "next": "^13.4.9", diff --git a/website/styles/main.css b/website/styles/main.css index 461380f33..05fc3b790 100644 --- a/website/styles/main.css +++ b/website/styles/main.css @@ -1,7 +1,14 @@ +@import "@docsearch/css/dist/style.css"; + @tailwind base; @tailwind components; @tailwind utilities; +:root { + /* Algolia DocSearch https://github.com/algolia/docsearch/blob/main/packages/docsearch-css/src/_variables.css */ + --docsearch-primary-color: theme(colors.blue.500); +} + body { font-family: "Inter var", system-ui, sans-serif; } @@ -47,3 +54,17 @@ body { border-radius: 9999px; vertical-align: text-top; } + +/* Algolia */ +.DocSearch.DocSearch-Button { + @apply relative md:w-64 hidden md:flex min-w-[200px] w-full appearance-none rounded-lg px-3 py-2 transition-colors text-base leading-tight md:text-sm bg-black/[.05] contrast-more:border contrast-more:border-current ring-gray-500; +} +.DocSearch .DocSearch-Button-Placeholder { + @apply text-gray-500 text-sm font-normal !important; +} +.DocSearch-Search-Icon { + display: none !important; +} +.DocSearch-Button-Keys { + @apply opacity-75 scale-75; +} diff --git a/website/theme.config.jsx b/website/theme.config.jsx index 18dca5535..40718c0d9 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -2,6 +2,7 @@ import { useRouter } from 'next/router'; import { AnimatedLogo } from './src/components/AnimatedLogo'; import Footer from './src/components/Footer'; +import { DocSearch } from '@docsearch/react'; export default { logo: , @@ -63,6 +64,9 @@ export default { ) }, + search: { + component: + }, components: { // https://github.com/shuding/nextra/blob/main/packages/nextra-theme-docs/src/mdx-components.tsx h1: props => ( From 407ced423dc37737b1ea444b7bca9a4beaacd807 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 23 Sep 2023 19:17:11 +0200 Subject: [PATCH 105/144] Website: news list page --- website/src/pages/news.mdx | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 website/src/pages/news.mdx diff --git a/website/src/pages/news.mdx b/website/src/pages/news.mdx new file mode 100644 index 000000000..960cc14e6 --- /dev/null +++ b/website/src/pages/news.mdx @@ -0,0 +1,31 @@ +import { NextSeo } from 'next-seo'; + + + +# Latest news + +## [Bref 2.0 is released 🎉](./news/02-bref-2.0.md) + +The work on what would be Bref 2.0 started in October 2021, about 1.5 year ago. We went through many different strategies, experiments, rewrites, over **700 commits** to finally land with the stable release. + +So far, Bref has been installed more than 2 million times and powers more than **10 billion Lambda executions** (aka requests) every month. + +That's [1 in every 1000 AWS Lambda executions](https://twitter.com/matthieunapoli/status/1603032544424894464)! + +Today, we celebrate these achievements, the ongoing work and **the release of Bref 2.0** 🎉 + +Let's dive in what's new in v2 👇 + +[▶ Read more](./news/02-bref-2.0.md) + +## [Bref 1.0 is released 🎉](./news/01-bref-1.0.md) + +Bref started in November 2017, 3 years ago. Back then, running PHP on AWS Lambda was experimental at best. + +Over the years, as the Bref community grew, as AWS features landed, and as contributors worked, creating serverless PHP applications has become a reality. Bref 0.2 has seen 37 releases. Bref 0.5 has 33. In total, we've released 89 versions since the project started. + +Needless to say **Bref is stable** and has been for a long time. + +Today, we're finally releasing **Bref 1.0**! + +[▶ Read more](./news/01-bref-1.0.md) From da4234855d1cf07b1ebbbbbbdf25fcb598b9fc7e Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 23 Sep 2023 19:24:36 +0200 Subject: [PATCH 106/144] Website: fix links --- bref | 4 ++-- docs/environment/performances.mdx | 2 +- docs/environment/storage.mdx | 2 +- docs/runtimes.mdx | 4 ++-- docs/symfony/getting-started.mdx | 2 +- website/src/components/home/intro.jsx | 2 +- website/src/pages/news/01-bref-1.0.mdx | 2 +- website/src/pages/news/02-bref-2.0.mdx | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bref b/bref index 493d6f74f..f72b17f1d 100755 --- a/bref +++ b/bref @@ -21,7 +21,7 @@ switch ($argv[1] ?? '') { break; case 'cli': cliWarning(); - error('Since Bref 2.0, the "bref cli" command has been moved. Read https://bref.sh/docs/runtimes/console.html#usage'); + error('Since Bref 2.0, the "bref cli" command has been moved. Read https://bref.sh/docs/runtimes/console#usage'); case 'layers': cliWarning(); echo "Bref layer ARNs can be found here: https://runtimes.bref.sh/\n\n"; @@ -29,7 +29,7 @@ switch ($argv[1] ?? '') { exit(1); case 'local': cliWarning(); - error('Since Bref 2.0, the "bref local" command has been moved. Read https://bref.sh/docs/function/local-development.html\n'); + error('Since Bref 2.0, the "bref local" command has been moved. Read https://bref.sh/docs/local-development/event-driven-functions\n'); case 'dashboard': cliWarning(); echo "The Bref Dashboard is now available as a desktop application.\n\n"; diff --git a/docs/environment/performances.mdx b/docs/environment/performances.mdx index cf34d26c8..7d6db486f 100644 --- a/docs/environment/performances.mdx +++ b/docs/environment/performances.mdx @@ -49,7 +49,7 @@ In general, **use smaller and slower lambdas only when speed is not important at ### Bref for web apps -The [FPM runtime for web apps](/docs/web-apps/index.md) **does not add overhead to response times**. +The [FPM runtime for web apps](../runtimes/fpm-runtime.mdx) **does not add overhead to response times**. Here are execution times for an empty PHP application: diff --git a/docs/environment/storage.mdx b/docs/environment/storage.mdx index 2ed23272b..75d3a8590 100644 --- a/docs/environment/storage.mdx +++ b/docs/environment/storage.mdx @@ -14,7 +14,7 @@ Here is a simplified overview of the filesystem on AWS Lambda: ... ``` -The `/var/task` directory is [limited to 250MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution). If you hit that limit, you can deploy [via Docker images instead](../web-apps/docker.md). +The `/var/task` directory is [limited to 250MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution). If you hit that limit, you can deploy [via Docker images instead](../deploy/docker.mdx). The filesystem on AWS Lambda **is read-only**, except for the `/tmp` directory. diff --git a/docs/runtimes.mdx b/docs/runtimes.mdx index 9e30385e8..f00434435 100644 --- a/docs/runtimes.mdx +++ b/docs/runtimes.mdx @@ -43,7 +43,7 @@ This runtime works great to create **event-driven micro-services**. If you are getting started, we highly recommend using the FPM runtime instead. It's "PHP as usual" (like on any server), with all the benefits of serverless (simplicity, scaling, etc.). -[Learn more about the Function runtime](/docs/runtimes/function.md). +[Learn more about the Function runtime](./runtimes/function.mdx). ### Console @@ -53,7 +53,7 @@ This runtime lets you run CLI console commands on Lambda. For example, we can run the [Symfony Console](https://symfony.com/doc/master/components/console.html) or [Laravel Artisan](https://laravel.com/docs/artisan). -[Learn more about the Console runtime](/docs/web-apps/console.md). +[Learn more about the Console runtime](./runtimes/console.mdx). ## Usage diff --git a/docs/symfony/getting-started.mdx b/docs/symfony/getting-started.mdx index 3d5742f9c..b717021de 100644 --- a/docs/symfony/getting-started.mdx +++ b/docs/symfony/getting-started.mdx @@ -134,7 +134,7 @@ framework: Note that API Gateway doesn't set the `X-Forwarded-Host` header, so we don't trust it by default. You should only whitelist this header if you set it manually, for example in your CloudFront configuration (this is done automatically -in [the Cloudfront distribution deployed by Lift](./assets.mdx)). +in [the Cloudfront distribution deployed by Lift](../use-cases/websites.mdx)). You can get more details in the [Symfony documentation](https://symfony.com/doc/current/deployment/proxies.html). diff --git a/website/src/components/home/intro.jsx b/website/src/components/home/intro.jsx index 844b000e9..dd9132c99 100644 --- a/website/src/components/home/intro.jsx +++ b/website/src/components/home/intro.jsx @@ -14,7 +14,7 @@ const features = [ }, { name: 'Cost-efficient.', - description: 'Instead of paying for servers that are idle most of the time, pay for the time the code is actually running. The AWS free tier even provides about 1 million free requests per month. Play with the serverless costs calculator.', + description: 'Instead of paying for servers that are idle most of the time, pay for the time the code is actually running. The AWS free tier even provides about 1 million free requests per month. Play with the serverless costs calculator.', icon: BanknotesIcon, }, ] diff --git a/website/src/pages/news/01-bref-1.0.mdx b/website/src/pages/news/01-bref-1.0.mdx index e18304ed6..6293bb2b5 100644 --- a/website/src/pages/news/01-bref-1.0.mdx +++ b/website/src/pages/news/01-bref-1.0.mdx @@ -263,5 +263,5 @@ You can also join the community [in Slack](/docs/community.md), post details abo diff --git a/website/src/pages/news/02-bref-2.0.mdx b/website/src/pages/news/02-bref-2.0.mdx index 072c483f8..4e6277a56 100644 --- a/website/src/pages/news/02-bref-2.0.mdx +++ b/website/src/pages/news/02-bref-2.0.mdx @@ -417,5 +417,5 @@ And if you need support or help going serverless, check out the [Support Plans]( From e8e91a31d4c284aa5b6f4d7fde66f0f00ef02e22 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 23 Sep 2023 22:16:29 +0200 Subject: [PATCH 107/144] Website: news --- website/src/pages/news.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/website/src/pages/news.mdx b/website/src/pages/news.mdx index 960cc14e6..471b4ecb0 100644 --- a/website/src/pages/news.mdx +++ b/website/src/pages/news.mdx @@ -4,6 +4,11 @@ import { NextSeo } from 'next-seo'; # Latest news + + ## [Bref 2.0 is released 🎉](./news/02-bref-2.0.md) The work on what would be Bref 2.0 started in October 2021, about 1.5 year ago. We went through many different strategies, experiments, rewrites, over **700 commits** to finally land with the stable release. From a592165002eb9737e33fe1c525f382737312a799 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 5 Oct 2023 11:55:08 +0200 Subject: [PATCH 108/144] Website: landing --- website/src/components/home/intro.jsx | 8 ++++---- website/src/pages/index.mdx | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/website/src/components/home/intro.jsx b/website/src/components/home/intro.jsx index dd9132c99..ecb7a3f07 100644 --- a/website/src/components/home/intro.jsx +++ b/website/src/components/home/intro.jsx @@ -69,14 +69,14 @@ export default function Intro() {

    Deploying demo to stage dev (us-east-1)

     

    - Service deployed to stack demo-prod (31s) + Service deployed to stack demo-dev (31s)

     

    endpoint: https://yti4le2q5.lambda-url.us-east-1.on.aws/

    functions:

    -

    api: demo-prod-api (750 KB)

    -

    cron: demo-prod-cron (750 KB)

    -

    worker: demo-prod-worker (750 KB)

    +

    web: demo-dev-web (750 KB)

    +

    cron: demo-dev-cron (750 KB)

    +

    worker: demo-dev-worker (750 KB)

    diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx index 87b99a9b1..c1919e022 100644 --- a/website/src/pages/index.mdx +++ b/website/src/pages/index.mdx @@ -91,7 +91,7 @@ export async function getStaticProps() {
    ```yml - service: my-app + service: demo provider: name: aws From 36aa799abe6d97c07ae67e9e0c63d2a9f84c1a4d Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 5 Oct 2023 12:03:10 +0200 Subject: [PATCH 109/144] Website: improve link-checker to also check URLs from the v2 website --- website/Makefile | 2 +- website/link-checker/index.js | 8 +++++++ website/link-checker/urls.js | 40 +++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 website/link-checker/urls.js diff --git a/website/Makefile b/website/Makefile index 8b3423f82..2e668c0ad 100644 --- a/website/Makefile +++ b/website/Makefile @@ -17,4 +17,4 @@ node_modules: npm install check-links: - node link-checker/index.js https://bref-website.vercel.app/ + node link-checker/index.js https://bref-website.vercel.app diff --git a/website/link-checker/index.js b/website/link-checker/index.js index 5185d0791..f8b7f3efc 100644 --- a/website/link-checker/index.js +++ b/website/link-checker/index.js @@ -1,6 +1,7 @@ import {Command, Option, runExit} from 'clipanion'; import fetch from 'node-fetch'; import { Parser } from "htmlparser2"; +import urls from './urls.js'; runExit(class HelloCommand extends Command { url = Option.String(); @@ -13,6 +14,13 @@ runExit(class HelloCommand extends Command { const pageCache = {}; await scan(this.context.stdout, this.url, links, brokenLinks, pageCache); + // Also scan the URLs we whitelisted + for (const chunk of chunkArray(urls)) { + const promises = chunk + .map(link => scan(this.context.stdout, this.url + link, links, brokenLinks, pageCache)); + await Promise.all(promises); + } + this.context.stdout.write(`Found ${brokenLinks.size} broken links\n`); for (const link of brokenLinks) { this.context.stdout.write(` ${link}\n`); diff --git a/website/link-checker/urls.js b/website/link-checker/urls.js new file mode 100644 index 000000000..27d2229b2 --- /dev/null +++ b/website/link-checker/urls.js @@ -0,0 +1,40 @@ +export default [ + // v2 website + '/docs/', + '/docs/news/', + '/docs/news/02-bref-2.0', + '/docs/news/01-bref-1.0', + '/docs/installation', + '/docs/first-steps', + '/docs/runtimes/', + '/docs/runtimes/http', + '/docs/websites', + '/docs/runtimes/console', + '/docs/web-apps/cron', + '/docs/web-apps/local-development', + '/docs/web-apps/docker', + '/docs/frameworks/laravel', + '/docs/frameworks/symfony', + '/docs/runtimes/function', + '/docs/function/handlers', + '/docs/function/local-development', + '/docs/function/cron', + '/docs/deploy', + '/docs/monitoring', + '/docs/environment/serverless-yml', + '/docs/environment/variables', + '/docs/environment/php', + '/docs/environment/storage', + '/docs/environment/logs', + '/docs/environment/database', + '/docs/environment/database-planetscale', + '/docs/environment/custom-domains', + '/docs/environment/performances', + '/docs/upgrading/v2', + '/docs/case-studies', + '/docs/community', + '/docs/installation/aws-keys', + '/docs/environment/database-public', + '/docs/web-apps/local-development.html', + '/docs/web-apps/local-development', +]; From 76fd2327fa365fd9589f93fba5c1b809063bbcf2 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 5 Oct 2023 12:18:08 +0200 Subject: [PATCH 110/144] Website: add redirects for v2 URLs --- website/redirects.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/website/redirects.js b/website/redirects.js index f1cce3704..71e99653e 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -3,15 +3,31 @@ module.exports.redirects = { '/#ecosystem': '/support', '/#plans': '/support', '/#enterprise': '/support', + // TODO: add redirects for anchor links too + '/docs/news': '/news', + '/docs/news/01-bref-1.0': '/news/01-bref-1.0', + '/docs/news/02-bref-2.0': '/news/02-bref-2.0', + '/docs/installation': '/docs/setup', + '/docs/first-steps': '/docs/setup#whats-next', + '/docs/runtimes/http': '/docs/runtimes/fpm-runtime', + '/docs/websites': '/docs/use-cases/websites', + '/docs/web-apps/docker': '/docs/deploy/docker', + '/docs/installation/aws-keys': '/docs/setup/aws-keys', '/docs/environment/custom-domains': '/docs/use-cases/http/custom-domains', '/docs/aws-cdk': '/docs/deploy/aws-cdk', + // TODO what's this url? '/docs/web-apps/index.md#assets': '/docs/use-cases/websites', '/docs/function/local-development': '/docs/local-development/event-driven-functions', '/docs/frameworks/laravel': '/docs/laravel/getting-started', + '/docs/frameworks/symfony': '/docs/symfony/getting-started', '/docs/newsletters': '/docs/community#newsletters', '/docs/newsletters.html': '/docs/community#newsletters', + '/docs/cron': '/docs/use-cases/cron', '/docs/cron.html': '/docs/use-cases/cron', + '/docs/web-apps/cron': '/docs/use-cases/cron', '/docs/web-apps/cron.html': '/docs/use-cases/cron', + '/docs/local-development': '/docs/local-development', '/docs/local-development.html': '/docs/local-development', + '/docs/web-apps/local-development': '/docs/local-development', '/docs/web-apps/local-development.html': '/docs/local-development', }; From 93cb8e2a2fe7ddb2e20b1a3b80910464b0d72ad1 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 18:33:53 +0200 Subject: [PATCH 111/144] Website: landing --- website/src/components/home/invocations.jsx | 22 +++++---------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/website/src/components/home/invocations.jsx b/website/src/components/home/invocations.jsx index ab599ce55..1c8a585c6 100644 --- a/website/src/components/home/invocations.jsx +++ b/website/src/components/home/invocations.jsx @@ -1,16 +1,4 @@ export default function Invocations({ invocations }) { - // const invocations = 16411284305; - // const [counter, setCounter] = useState(invocations); - - // useEffect(() => { - // const timeout = setTimeout(() => { - // setCounter(counter + 23); - // }, 300); - // return () => { - // clearTimeout(timeout); - // }; - // }, [counter]); - return (
    @@ -20,11 +8,11 @@ export default function Invocations({ invocations }) {

    requests, jobs, and messages handled with Bref in the last 30 days

    - + {/**/} Date: Sat, 7 Oct 2023 18:41:44 +0200 Subject: [PATCH 112/144] Docs: maturity matrix --- docs/index.mdx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/index.mdx b/docs/index.mdx index 4c83118b0..befdb39ae 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -151,6 +151,18 @@ This matrix will be updated as Bref and AWS services evolve over time. + + Real-time applications + + + + + + + + + + @@ -197,6 +209,10 @@ This matrix will be updated as Bref and AWS services evolve over time. Not impossible, but definitely not the easiest place to start. As a first step, you can follow the guidelines of [The Twelve-Factor App](https://12factor.net). Note that if your application already runs redundantly on multiple servers, it is much more ready for AWS Lambda and the migration could be simple. +- **Real-time applications** + + Warm Lambda invocations are very fast (can be as low as 1ms), but cold starts can take 230ms or more. Cold starts are rare on most applications (less than 0.5% of invocations) and can be further mitigated with [provisioned concurrency](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html), but it's unlikely to ensure they will _never_ happen. This makes Lambda a poor choice for real-time applications where latency must be below 100ms for 100% of requests. + ## Getting started Get started with Bref by reading the [installation documentation](/docs/setup.mdx). From a4b78dffafdc017da50029a7e8003492a609cae1 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 18:42:49 +0200 Subject: [PATCH 113/144] Website: redirects --- website/redirects.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/website/redirects.js b/website/redirects.js index 71e99653e..f3e5d6452 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -26,8 +26,6 @@ module.exports.redirects = { '/docs/cron.html': '/docs/use-cases/cron', '/docs/web-apps/cron': '/docs/use-cases/cron', '/docs/web-apps/cron.html': '/docs/use-cases/cron', - '/docs/local-development': '/docs/local-development', - '/docs/local-development.html': '/docs/local-development', '/docs/web-apps/local-development': '/docs/local-development', '/docs/web-apps/local-development.html': '/docs/local-development', }; From a15fc330672edb9005ad88f04648443497f693b7 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 20:53:13 +0200 Subject: [PATCH 114/144] Website: redirects --- website/.gitignore | 1 + website/Makefile | 2 +- website/link-checker/index.js | 10 ++--- website/link-checker/urls.js | 72 +++++++++++++++++++++++++++++++++++ website/redirects.js | 11 ++++++ 5 files changed, 90 insertions(+), 6 deletions(-) diff --git a/website/.gitignore b/website/.gitignore index 4625954bd..b8fe6273c 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -4,3 +4,4 @@ src/pages/docs public/robots.txt public/sitemap.xml public/sitemap-*.xml +links.log diff --git a/website/Makefile b/website/Makefile index 2e668c0ad..5b88c306e 100644 --- a/website/Makefile +++ b/website/Makefile @@ -17,4 +17,4 @@ node_modules: npm install check-links: - node link-checker/index.js https://bref-website.vercel.app + node link-checker/index.js https://bref-website.vercel.app > links.log diff --git a/website/link-checker/index.js b/website/link-checker/index.js index f8b7f3efc..a19c79a96 100644 --- a/website/link-checker/index.js +++ b/website/link-checker/index.js @@ -43,7 +43,7 @@ async function scan(stdout, url, links, brokenLinks, pageCache) { } links[url] = true; - stdout.write(`Scanning ${url}\n`); + // stdout.write(`Scanning ${url}\n`); // Cache the page to avoid fetching it twice when it is linked via anchor tags const urlWithoutAnchor = url.split('#')[0]; @@ -53,7 +53,7 @@ async function scan(stdout, url, links, brokenLinks, pageCache) { const originalDomain = new URL(url).hostname; const finalDomain = new URL(response.url).hostname; if (finalDomain !== originalDomain) { - console.log(`Ignoring ${url} redirecting to ${response.url}`); + //console.log(`Ignoring ${url} redirecting to ${response.url}`); pageCache[urlWithoutAnchor] = false; return; } @@ -66,7 +66,7 @@ async function scan(stdout, url, links, brokenLinks, pageCache) { const pageBody = pageCache[urlWithoutAnchor]; if (pageBody === false) { - stdout.write(`Error: ${url}\n`); + // stdout.write(`Error: ${url}\n`); brokenLinks.add(url); return; } @@ -96,7 +96,7 @@ async function scan(stdout, url, links, brokenLinks, pageCache) { // Ignore already scanned links return; } - stdout.write(`Found new link ${newLink} on ${url}\n`); + // stdout.write(`Found new link ${newLink} on ${url}\n`); links[newLink] = false; } }, @@ -105,7 +105,7 @@ async function scan(stdout, url, links, brokenLinks, pageCache) { parser.end(); if (anchorLink && ! foundAnchorLink) { - stdout.write(`Error: anchor link not found: ${anchorLink}\n`); + // stdout.write(`Error: anchor link not found: ${anchorLink}\n`); brokenLinks.add(url); } diff --git a/website/link-checker/urls.js b/website/link-checker/urls.js index 27d2229b2..db8760f66 100644 --- a/website/link-checker/urls.js +++ b/website/link-checker/urls.js @@ -1,23 +1,93 @@ export default [ // v2 website '/docs/', + '/docs/#why-serverless', + '/docs/#why-bref', + '/docs/#maturity-matrix', '/docs/news/', '/docs/news/02-bref-2.0', '/docs/news/01-bref-1.0', '/docs/installation', '/docs/first-steps', '/docs/runtimes/', + '/docs/runtimes/#bref-ping', '/docs/runtimes/http', + '/docs/runtimes/http#setup', + '/docs/runtimes/http#handler', + '/docs/runtimes/http#runtime', + '/docs/runtimes/http#routing', + '/docs/runtimes/http#binary-requests-and-responses', + '/docs/runtimes/http#context-access', + '/docs/runtimes/http#lambda-context', + '/docs/runtimes/http#request-context', + '/docs/runtimes/http#cold-starts', '/docs/websites', + '/docs/websites#setting-up-a-domain-name', + '/docs/websites#alternative-solutions', '/docs/runtimes/console', + '/docs/runtimes/console#configuration', + '/docs/runtimes/console#usage', + '/docs/runtimes/console#usage-without-serverless-framework', + '/docs/runtimes/console#lambda-context', '/docs/web-apps/cron', '/docs/web-apps/local-development', + '/docs/web-apps/local-development#the-simple-way', + '/docs/web-apps/local-development#docker', + '/docs/web-apps/local-development#read-only-filesystem', + '/docs/web-apps/local-development#assets', + '/docs/web-apps/local-development#xdebug', + '/docs/web-apps/local-development#blackfire', + '/docs/web-apps/local-development#console-applications', '/docs/web-apps/docker', + '/docs/web-apps/docker#docker-image', + '/docs/web-apps/docker#deployment', + '/docs/web-apps/docker#filesystem', + '/docs/web-apps/docker#docker-registry', '/docs/frameworks/laravel', + '/docs/frameworks/laravel#setup', + '/docs/frameworks/laravel#deployment', + '/docs/frameworks/laravel#assets', + '/docs/frameworks/laravel#file-storage-on-s3', + '/docs/frameworks/laravel#public-files', + '/docs/frameworks/laravel#laravel-queues', + '/docs/frameworks/laravel#how-it-works-1', + '/docs/frameworks/laravel#laravel-octane', + '/docs/frameworks/laravel#persistent-database-connections', + '/docs/frameworks/laravel#caching', + '/docs/frameworks/laravel#maintenance-mode', + '/docs/frameworks/laravel#laravel-passport', '/docs/frameworks/symfony', + '/docs/frameworks/symfony#setup', + '/docs/frameworks/symfony#deploy', + '/docs/frameworks/symfony#console', + '/docs/frameworks/symfony#logs', + '/docs/frameworks/symfony#environment-variables', + '/docs/frameworks/symfony#trust-api-gateway', + '/docs/frameworks/symfony#assets', + '/docs/frameworks/symfony#symfony-messenger', + '/docs/frameworks/symfony#caching', '/docs/runtimes/function', + '/docs/runtimes/function#the-function', + '/docs/runtimes/function#deployment-configuration', + '/docs/runtimes/function#invocation', '/docs/function/handlers', + '/docs/function/handlers#autoloading', + '/docs/function/handlers#s3-events', + '/docs/function/handlers#sqs-events', + '/docs/function/handlers#partial-batch-response', + '/docs/function/handlers#lift-queue-construct', + '/docs/function/handlers#api-gateway-http-events', + '/docs/function/handlers#lambda-event-and-context', + '/docs/function/handlers#websocket-events', + '/docs/function/handlers#eventbridge-events', + '/docs/function/handlers#sns-events', + '/docs/function/handlers#dynamodb-events', + '/docs/function/handlers#kinesis-events', + '/docs/function/handlers#kafka-events', '/docs/function/local-development', + '/docs/function/local-development#with-serverless-framework', + '/docs/function/local-development#api-gateway-local-development', + '/docs/function/local-development#without-serverless-framework', '/docs/function/cron', '/docs/deploy', '/docs/monitoring', @@ -29,6 +99,8 @@ export default [ '/docs/environment/database', '/docs/environment/database-planetscale', '/docs/environment/custom-domains', + '/docs/environment/custom-domains#custom-domains-for-http-lambdas', + '/docs/environment/custom-domains#custom-domains-for-static-files-on-s3', '/docs/environment/performances', '/docs/upgrading/v2', '/docs/case-studies', diff --git a/website/redirects.js b/website/redirects.js index f3e5d6452..bc8fd8c1b 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -9,6 +9,7 @@ module.exports.redirects = { '/docs/news/02-bref-2.0': '/news/02-bref-2.0', '/docs/installation': '/docs/setup', '/docs/first-steps': '/docs/setup#whats-next', + '/runtimes/#bref-ping': '/docs/runtimes/runtimes-details#telemetry-ping', '/docs/runtimes/http': '/docs/runtimes/fpm-runtime', '/docs/websites': '/docs/use-cases/websites', '/docs/web-apps/docker': '/docs/deploy/docker', @@ -18,6 +19,16 @@ module.exports.redirects = { // TODO what's this url? '/docs/web-apps/index.md#assets': '/docs/use-cases/websites', '/docs/function/local-development': '/docs/local-development/event-driven-functions', + '/docs/frameworks/laravel#assets': '/docs/laravel/getting-started#website-assets', + '/docs/frameworks/laravel#file-storage-on-s3': '/docs/laravel/file-storage', + '/docs/frameworks/laravel#public-files': '/docs/laravel/file-storage#public-files', + '/docs/frameworks/laravel#laravel-queues': '/docs/laravel/queues', + '/docs/frameworks/laravel#how-it-works-1': '/docs/laravel/queues#how-it-works', + '/docs/frameworks/laravel#laravel-octane': '/docs/laravel/octane', + '/docs/frameworks/laravel#persistent-database-connections': '/docs/laravel/octane#persistent-database-connections', + '/docs/frameworks/laravel#caching': '/docs/laravel/caching', + '/docs/frameworks/laravel#maintenance-mode': '/docs/laravel/maintenance-mode', + '/docs/frameworks/laravel#laravel-passport': '/docs/laravel/passport', '/docs/frameworks/laravel': '/docs/laravel/getting-started', '/docs/frameworks/symfony': '/docs/symfony/getting-started', '/docs/newsletters': '/docs/community#newsletters', From a4364fea67b03f04a4a6180e1ec938d0a04821ba Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 21:00:12 +0200 Subject: [PATCH 115/144] Website: redirects --- website/redirects.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/website/redirects.js b/website/redirects.js index bc8fd8c1b..a7a948f78 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -11,6 +11,11 @@ module.exports.redirects = { '/docs/first-steps': '/docs/setup#whats-next', '/runtimes/#bref-ping': '/docs/runtimes/runtimes-details#telemetry-ping', '/docs/runtimes/http': '/docs/runtimes/fpm-runtime', + '/docs/runtimes/fpm-runtime#setup': '/docs/runtimes/fpm-runtime#usage', + '/docs/runtimes/fpm-runtime#runtime': '/docs/runtimes/fpm-runtime', + '/docs/runtimes/fpm-runtime#routing': '/docs/use-cases/http#how-it-works', + '/docs/runtimes/fpm-runtime#binary-requests-and-responses': '/docs/use-cases/http/binary-requests-responses', + '/docs/runtimes/fpm-runtime#cold-starts': '/docs/use-cases/http/advanced-use-cases#cold-starts', '/docs/websites': '/docs/use-cases/websites', '/docs/web-apps/docker': '/docs/deploy/docker', '/docs/installation/aws-keys': '/docs/setup/aws-keys', @@ -19,17 +24,17 @@ module.exports.redirects = { // TODO what's this url? '/docs/web-apps/index.md#assets': '/docs/use-cases/websites', '/docs/function/local-development': '/docs/local-development/event-driven-functions', - '/docs/frameworks/laravel#assets': '/docs/laravel/getting-started#website-assets', - '/docs/frameworks/laravel#file-storage-on-s3': '/docs/laravel/file-storage', - '/docs/frameworks/laravel#public-files': '/docs/laravel/file-storage#public-files', - '/docs/frameworks/laravel#laravel-queues': '/docs/laravel/queues', - '/docs/frameworks/laravel#how-it-works-1': '/docs/laravel/queues#how-it-works', - '/docs/frameworks/laravel#laravel-octane': '/docs/laravel/octane', - '/docs/frameworks/laravel#persistent-database-connections': '/docs/laravel/octane#persistent-database-connections', - '/docs/frameworks/laravel#caching': '/docs/laravel/caching', - '/docs/frameworks/laravel#maintenance-mode': '/docs/laravel/maintenance-mode', - '/docs/frameworks/laravel#laravel-passport': '/docs/laravel/passport', '/docs/frameworks/laravel': '/docs/laravel/getting-started', + '/docs/laravel/getting-started#assets': '/docs/laravel/getting-started#website-assets', + '/docs/laravel/getting-started#file-storage-on-s3': '/docs/laravel/file-storage', + '/docs/laravel/getting-started#public-files': '/docs/laravel/file-storage#public-files', + '/docs/laravel/getting-started#laravel-queues': '/docs/laravel/queues', + '/docs/laravel/getting-started#how-it-works-1': '/docs/laravel/queues#how-it-works', + '/docs/laravel/getting-started#laravel-octane': '/docs/laravel/octane', + '/docs/laravel/getting-started#persistent-database-connections': '/docs/laravel/octane#persistent-database-connections', + '/docs/laravel/getting-started#caching': '/docs/laravel/caching', + '/docs/laravel/getting-started#maintenance-mode': '/docs/laravel/maintenance-mode', + '/docs/laravel/getting-started#laravel-passport': '/docs/laravel/passport', '/docs/frameworks/symfony': '/docs/symfony/getting-started', '/docs/newsletters': '/docs/community#newsletters', '/docs/newsletters.html': '/docs/community#newsletters', From ae190f7659284c79c1a3a1d9ed76221ce3c03ed7 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 22:21:47 +0200 Subject: [PATCH 116/144] Website: redirects --- docs/environment/performances.mdx | 2 +- website/link-checker/ManualTests.md | 79 +++++++++++++++++++++++++++++ website/link-checker/urls.js | 72 -------------------------- website/redirects.js | 14 +++++ 4 files changed, 94 insertions(+), 73 deletions(-) create mode 100644 website/link-checker/ManualTests.md diff --git a/docs/environment/performances.mdx b/docs/environment/performances.mdx index 7d6db486f..a9e58d151 100644 --- a/docs/environment/performances.mdx +++ b/docs/environment/performances.mdx @@ -106,7 +106,7 @@ On a website with low to medium traffic, you can expect cold starts to happen fo ### Optimizing cold starts -On small websites, cold starts can be avoided by pinging the application regularly. This keeps the lambda instances warm. [Pingdom](https://www.pingdom.com/) or similar services can be used, but you can also [an automatic ping via `serverless.yml`](/docs/web-apps/index.md#cold-starts). +On small websites, cold starts can be avoided by pinging the application regularly. This keeps the lambda instances warm. [Pingdom](https://www.pingdom.com/) or similar services can be used, but you can also [an automatic ping via `serverless.yml`](../use-cases/http/advanced-use-cases#cold-starts). While the memory size has no impact, the codebase size can increase the cold start duration. When deploying, remember to exclude assets, images, tests and any extra file in `serverless.yml`: diff --git a/website/link-checker/ManualTests.md b/website/link-checker/ManualTests.md new file mode 100644 index 000000000..1c0bfa63f --- /dev/null +++ b/website/link-checker/ManualTests.md @@ -0,0 +1,79 @@ +Test the following anchor links manually. + +### Tested OK + +/docs/#why-serverless +/docs/#why-bref +/docs/#maturity-matrix +/docs/runtimes/http#setup +/docs/runtimes/http#handler +/docs/runtimes/http#runtime +/docs/runtimes/http#routing +/docs/runtimes/http#binary-requests-and-responses +/docs/runtimes/http#context-access +/docs/runtimes/http#lambda-context +/docs/runtimes/http#request-context +/docs/runtimes/http#cold-starts + +### TODO + +/docs/runtimes/console#configuration +/docs/runtimes/console#usage +/docs/runtimes/console#usage-without-serverless-framework +/docs/runtimes/console#lambda-context +/docs/websites#setting-up-a-domain-name +/docs/websites#alternative-solutions +/docs/runtimes/#bref-ping +/docs/web-apps/local-development#the-simple-way +/docs/web-apps/local-development#docker +/docs/web-apps/local-development#read-only-filesystem +/docs/web-apps/local-development#assets +/docs/web-apps/local-development#xdebug +/docs/web-apps/local-development#blackfire +/docs/web-apps/local-development#console-applications +/docs/web-apps/docker#docker-image +/docs/web-apps/docker#deployment +/docs/web-apps/docker#filesystem +/docs/web-apps/docker#docker-registry +/docs/frameworks/laravel#setup +/docs/frameworks/laravel#deployment +/docs/frameworks/laravel#assets +/docs/frameworks/laravel#file-storage-on-s3 +/docs/frameworks/laravel#public-files +/docs/frameworks/laravel#laravel-queues +/docs/frameworks/laravel#how-it-works-1 +/docs/frameworks/laravel#laravel-octane +/docs/frameworks/laravel#persistent-database-connections +/docs/frameworks/laravel#caching +/docs/frameworks/laravel#maintenance-mode +/docs/frameworks/laravel#laravel-passport +/docs/frameworks/symfony#setup +/docs/frameworks/symfony#deploy +/docs/frameworks/symfony#console +/docs/frameworks/symfony#logs +/docs/frameworks/symfony#environment-variables +/docs/frameworks/symfony#trust-api-gateway +/docs/frameworks/symfony#assets +/docs/frameworks/symfony#symfony-messenger +/docs/frameworks/symfony#caching +/docs/runtimes/function#the-function +/docs/runtimes/function#deployment-configuration +/docs/runtimes/function#invocation +/docs/function/handlers#autoloading +/docs/function/handlers#s3-events +/docs/function/handlers#sqs-events +/docs/function/handlers#partial-batch-response +/docs/function/handlers#lift-queue-construct +/docs/function/handlers#api-gateway-http-events +/docs/function/handlers#lambda-event-and-context +/docs/function/handlers#websocket-events +/docs/function/handlers#eventbridge-events +/docs/function/handlers#sns-events +/docs/function/handlers#dynamodb-events +/docs/function/handlers#kinesis-events +/docs/function/handlers#kafka-events +/docs/function/local-development#with-serverless-framework +/docs/function/local-development#api-gateway-local-development +/docs/function/local-development#without-serverless-framework +/docs/environment/custom-domains#custom-domains-for-http-lambdas +/docs/environment/custom-domains#custom-domains-for-static-files-on-s3 diff --git a/website/link-checker/urls.js b/website/link-checker/urls.js index db8760f66..27d2229b2 100644 --- a/website/link-checker/urls.js +++ b/website/link-checker/urls.js @@ -1,93 +1,23 @@ export default [ // v2 website '/docs/', - '/docs/#why-serverless', - '/docs/#why-bref', - '/docs/#maturity-matrix', '/docs/news/', '/docs/news/02-bref-2.0', '/docs/news/01-bref-1.0', '/docs/installation', '/docs/first-steps', '/docs/runtimes/', - '/docs/runtimes/#bref-ping', '/docs/runtimes/http', - '/docs/runtimes/http#setup', - '/docs/runtimes/http#handler', - '/docs/runtimes/http#runtime', - '/docs/runtimes/http#routing', - '/docs/runtimes/http#binary-requests-and-responses', - '/docs/runtimes/http#context-access', - '/docs/runtimes/http#lambda-context', - '/docs/runtimes/http#request-context', - '/docs/runtimes/http#cold-starts', '/docs/websites', - '/docs/websites#setting-up-a-domain-name', - '/docs/websites#alternative-solutions', '/docs/runtimes/console', - '/docs/runtimes/console#configuration', - '/docs/runtimes/console#usage', - '/docs/runtimes/console#usage-without-serverless-framework', - '/docs/runtimes/console#lambda-context', '/docs/web-apps/cron', '/docs/web-apps/local-development', - '/docs/web-apps/local-development#the-simple-way', - '/docs/web-apps/local-development#docker', - '/docs/web-apps/local-development#read-only-filesystem', - '/docs/web-apps/local-development#assets', - '/docs/web-apps/local-development#xdebug', - '/docs/web-apps/local-development#blackfire', - '/docs/web-apps/local-development#console-applications', '/docs/web-apps/docker', - '/docs/web-apps/docker#docker-image', - '/docs/web-apps/docker#deployment', - '/docs/web-apps/docker#filesystem', - '/docs/web-apps/docker#docker-registry', '/docs/frameworks/laravel', - '/docs/frameworks/laravel#setup', - '/docs/frameworks/laravel#deployment', - '/docs/frameworks/laravel#assets', - '/docs/frameworks/laravel#file-storage-on-s3', - '/docs/frameworks/laravel#public-files', - '/docs/frameworks/laravel#laravel-queues', - '/docs/frameworks/laravel#how-it-works-1', - '/docs/frameworks/laravel#laravel-octane', - '/docs/frameworks/laravel#persistent-database-connections', - '/docs/frameworks/laravel#caching', - '/docs/frameworks/laravel#maintenance-mode', - '/docs/frameworks/laravel#laravel-passport', '/docs/frameworks/symfony', - '/docs/frameworks/symfony#setup', - '/docs/frameworks/symfony#deploy', - '/docs/frameworks/symfony#console', - '/docs/frameworks/symfony#logs', - '/docs/frameworks/symfony#environment-variables', - '/docs/frameworks/symfony#trust-api-gateway', - '/docs/frameworks/symfony#assets', - '/docs/frameworks/symfony#symfony-messenger', - '/docs/frameworks/symfony#caching', '/docs/runtimes/function', - '/docs/runtimes/function#the-function', - '/docs/runtimes/function#deployment-configuration', - '/docs/runtimes/function#invocation', '/docs/function/handlers', - '/docs/function/handlers#autoloading', - '/docs/function/handlers#s3-events', - '/docs/function/handlers#sqs-events', - '/docs/function/handlers#partial-batch-response', - '/docs/function/handlers#lift-queue-construct', - '/docs/function/handlers#api-gateway-http-events', - '/docs/function/handlers#lambda-event-and-context', - '/docs/function/handlers#websocket-events', - '/docs/function/handlers#eventbridge-events', - '/docs/function/handlers#sns-events', - '/docs/function/handlers#dynamodb-events', - '/docs/function/handlers#kinesis-events', - '/docs/function/handlers#kafka-events', '/docs/function/local-development', - '/docs/function/local-development#with-serverless-framework', - '/docs/function/local-development#api-gateway-local-development', - '/docs/function/local-development#without-serverless-framework', '/docs/function/cron', '/docs/deploy', '/docs/monitoring', @@ -99,8 +29,6 @@ export default [ '/docs/environment/database', '/docs/environment/database-planetscale', '/docs/environment/custom-domains', - '/docs/environment/custom-domains#custom-domains-for-http-lambdas', - '/docs/environment/custom-domains#custom-domains-for-static-files-on-s3', '/docs/environment/performances', '/docs/upgrading/v2', '/docs/case-studies', diff --git a/website/redirects.js b/website/redirects.js index a7a948f78..ca3cc2e9c 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -16,6 +16,20 @@ module.exports.redirects = { '/docs/runtimes/fpm-runtime#routing': '/docs/use-cases/http#how-it-works', '/docs/runtimes/fpm-runtime#binary-requests-and-responses': '/docs/use-cases/http/binary-requests-responses', '/docs/runtimes/fpm-runtime#cold-starts': '/docs/use-cases/http/advanced-use-cases#cold-starts', + '/docs/function/handlers': '/docs/runtimes/function', + '/docs/runtimes/function#autoloading': '/docs/runtimes/function', + '/docs/runtimes/function#s3-events': '/docs/use-cases/s3', + '/docs/runtimes/function#sqs-events': '/docs/use-cases/sqs', + '/docs/runtimes/function#partial-batch-response': '/docs/use-cases/sqs#partial-batch-response', + '/docs/runtimes/function#lift-queue-construct': '/docs/use-cases/sqs#lift-queue-construct', + '/docs/runtimes/function#api-gateway-http-events': '/docs/use-cases/http/advanced-use-cases#php-handlers', + '/docs/runtimes/function#lambda-event-and-context': '/docs/use-cases/http/advanced-use-cases#lambda-event-and-context', + '/docs/runtimes/function#websocket-events': '/docs/use-cases/websockets', + '/docs/runtimes/function#eventbridge-events': '/docs/use-cases/eventbridge', + '/docs/runtimes/function#sns-events': '/docs/use-cases/sns', + '/docs/runtimes/function#dynamodb-events': '/docs/use-cases/dynamodb', + '/docs/runtimes/function#kinesis-events': '/docs/use-cases/kinesis', + '/docs/runtimes/function#kafka-events': '/docs/use-cases/kafka', '/docs/websites': '/docs/use-cases/websites', '/docs/web-apps/docker': '/docs/deploy/docker', '/docs/installation/aws-keys': '/docs/setup/aws-keys', From 9cc899032f653ea9367384335969acb51c69eba9 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 22:31:30 +0200 Subject: [PATCH 117/144] Website: redirects --- website/link-checker/ManualTests.md | 49 +++++++++++++++-------------- website/redirects.js | 10 +++++- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/website/link-checker/ManualTests.md b/website/link-checker/ManualTests.md index 1c0bfa63f..4dc4acfd0 100644 --- a/website/link-checker/ManualTests.md +++ b/website/link-checker/ManualTests.md @@ -14,27 +14,6 @@ Test the following anchor links manually. /docs/runtimes/http#lambda-context /docs/runtimes/http#request-context /docs/runtimes/http#cold-starts - -### TODO - -/docs/runtimes/console#configuration -/docs/runtimes/console#usage -/docs/runtimes/console#usage-without-serverless-framework -/docs/runtimes/console#lambda-context -/docs/websites#setting-up-a-domain-name -/docs/websites#alternative-solutions -/docs/runtimes/#bref-ping -/docs/web-apps/local-development#the-simple-way -/docs/web-apps/local-development#docker -/docs/web-apps/local-development#read-only-filesystem -/docs/web-apps/local-development#assets -/docs/web-apps/local-development#xdebug -/docs/web-apps/local-development#blackfire -/docs/web-apps/local-development#console-applications -/docs/web-apps/docker#docker-image -/docs/web-apps/docker#deployment -/docs/web-apps/docker#filesystem -/docs/web-apps/docker#docker-registry /docs/frameworks/laravel#setup /docs/frameworks/laravel#deployment /docs/frameworks/laravel#assets @@ -47,15 +26,37 @@ Test the following anchor links manually. /docs/frameworks/laravel#caching /docs/frameworks/laravel#maintenance-mode /docs/frameworks/laravel#laravel-passport +/docs/web-apps/docker#docker-image +/docs/web-apps/docker#deployment +/docs/web-apps/docker#filesystem +/docs/web-apps/docker#docker-registry +/docs/runtimes/console#usage +/docs/runtimes/console#lambda-context +/docs/web-apps/local-development#the-simple-way +/docs/web-apps/local-development#docker +/docs/web-apps/local-development#read-only-filesystem +/docs/web-apps/local-development#assets +/docs/web-apps/local-development#xdebug +/docs/web-apps/local-development#blackfire +/docs/web-apps/local-development#console-applications /docs/frameworks/symfony#setup -/docs/frameworks/symfony#deploy -/docs/frameworks/symfony#console /docs/frameworks/symfony#logs -/docs/frameworks/symfony#environment-variables /docs/frameworks/symfony#trust-api-gateway + +### KO + +/docs/runtimes/console#configuration +/docs/runtimes/console#usage-without-serverless-framework +/docs/websites#setting-up-a-domain-name +/docs/runtimes/#bref-ping +/docs/frameworks/symfony#deploy +/docs/frameworks/symfony#console /docs/frameworks/symfony#assets /docs/frameworks/symfony#symfony-messenger /docs/frameworks/symfony#caching + +### TODO + /docs/runtimes/function#the-function /docs/runtimes/function#deployment-configuration /docs/runtimes/function#invocation diff --git a/website/redirects.js b/website/redirects.js index ca3cc2e9c..d382c6560 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -9,7 +9,7 @@ module.exports.redirects = { '/docs/news/02-bref-2.0': '/news/02-bref-2.0', '/docs/installation': '/docs/setup', '/docs/first-steps': '/docs/setup#whats-next', - '/runtimes/#bref-ping': '/docs/runtimes/runtimes-details#telemetry-ping', + '/docs/runtimes/#bref-ping': '/docs/runtimes/runtimes-details#telemetry-ping', '/docs/runtimes/http': '/docs/runtimes/fpm-runtime', '/docs/runtimes/fpm-runtime#setup': '/docs/runtimes/fpm-runtime#usage', '/docs/runtimes/fpm-runtime#runtime': '/docs/runtimes/fpm-runtime', @@ -31,6 +31,7 @@ module.exports.redirects = { '/docs/runtimes/function#kinesis-events': '/docs/use-cases/kinesis', '/docs/runtimes/function#kafka-events': '/docs/use-cases/kafka', '/docs/websites': '/docs/use-cases/websites', + '/docs/use-cases/websites#setting-up-a-domain-name': '/docs/use-cases/websites#custom-domain-name', '/docs/web-apps/docker': '/docs/deploy/docker', '/docs/installation/aws-keys': '/docs/setup/aws-keys', '/docs/environment/custom-domains': '/docs/use-cases/http/custom-domains', @@ -50,6 +51,11 @@ module.exports.redirects = { '/docs/laravel/getting-started#maintenance-mode': '/docs/laravel/maintenance-mode', '/docs/laravel/getting-started#laravel-passport': '/docs/laravel/passport', '/docs/frameworks/symfony': '/docs/symfony/getting-started', + '/docs/symfony/getting-started#deploy': '/docs/symfony/getting-started#deployment', + '/docs/symfony/getting-started#console': '/docs/symfony/getting-started#symfony-console', + '/docs/symfony/getting-started#assets': '/docs/symfony/getting-started#website-assets', + '/docs/symfony/getting-started#symfony-messenger': '/docs/symfony/messenger', + '/docs/symfony/getting-started#caching': '/docs/symfony/caching', '/docs/newsletters': '/docs/community#newsletters', '/docs/newsletters.html': '/docs/community#newsletters', '/docs/cron': '/docs/use-cases/cron', @@ -58,4 +64,6 @@ module.exports.redirects = { '/docs/web-apps/cron.html': '/docs/use-cases/cron', '/docs/web-apps/local-development': '/docs/local-development', '/docs/web-apps/local-development.html': '/docs/local-development', + '/docs/runtimes/console#configuration': '/docs/runtimes/console#usage', + '/docs/runtimes/console#usage-without-serverless-framework': '/docs/runtimes/console#without-serverless-framework', }; From 3c74ffb106a50cd1dfdc5df3ccc7deb98c02ffda Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 22:48:50 +0200 Subject: [PATCH 118/144] Docs: Symfony keep-alive process --- docs/symfony/_meta.json | 3 +- docs/symfony/keep-alive.mdx | 60 ++++++++++++++++++++++ docs/use-cases/http/advanced-use-cases.mdx | 2 +- website/src/pages/news/01-bref-1.0.mdx | 2 +- 4 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 docs/symfony/keep-alive.mdx diff --git a/docs/symfony/_meta.json b/docs/symfony/_meta.json index a36b31b83..90254d01f 100644 --- a/docs/symfony/_meta.json +++ b/docs/symfony/_meta.json @@ -1,5 +1,6 @@ { "getting-started": "Getting started", "messenger": "Symfony Messenger", - "caching": "" + "caching": "", + "keep-alive": "Keeping the Kernel alive" } \ No newline at end of file diff --git a/docs/symfony/keep-alive.mdx b/docs/symfony/keep-alive.mdx new file mode 100644 index 000000000..0de6636b2 --- /dev/null +++ b/docs/symfony/keep-alive.mdx @@ -0,0 +1,60 @@ +import { Callout } from 'nextra/components'; + +# Keeping the Symfony Kernel alive between requests + + + This is an **advanced approach** aimed at optimizing performance. If you are just starting with Bref, this approach is not recommended because it is more complex to set up and can lead to unexpected issues. + + +By default, Bref uses PHP-FPM to handle HTTP requests. This means that the Symfony Kernel is restarted for every request. This is not a problem for most applications, but if you want to optimize performance, you can keep the Symfony Kernel alive between requests. This approach is similar to [Laravel Octane](../laravel/octane), or running Symfony with [RoadRunner](https://roadrunner.dev/). + +## Usage + +The Bref Symfony Bridge integrates with the Symfony Runtime component. This means that Bref can natively set the Symfony Kernel as the handler for Lambda functions, without going through PHP-FPM: + +```diff filename="serverless.yml" +functions: + app: +- handler: public/index.php ++ handler: App\Kernel + layers: + # Switch from PHP-FPM to the "function" runtime: +- - ${bref:layer.php-81-fpm} ++ - ${bref:layer.php-81} + environment: ++ # The Symfony process will restart every 100 requests ++ BREF_LOOP_MAX: 100 +``` + +The `App\Kernel` will be retrieved via Symfony Runtime from `public/index.php`. If you don't have a `public/index.php`, read the next sections. + +## How it works + +Traditionally, Bref runs Symfony applications with the [PHP-FPM runtime](../runtimes/fpm-runtime.mdx). By switching to the [Function runtime](../runtimes/function.mdx), Bref loads the Symfony Kernel directly and can keep it alive between requests (controlled by `BREF_LOOP_MAX`). + +Note that the execution model of AWS Lambda is unchanged: the entire Lambda instance is frozen between requests. The Symfony Kernel is kept alive in memory, but it is not running. When a new request comes in, the Lambda instance is thawed and the request is handled. + +The main risks with this approach are memory leaks and global state. If your application has memory leaks, the memory usage will increase over time and eventually reach the Lambda limit. This can be mitigated by setting `BREF_LOOP_MAX` to a low value, so that the Symfony Kernel is restarted regularly. If your application uses global state, it will be shared between requests, which can be a disaster security-wise. + +## Custom bootstrap file + +If you do not have a `public/index.php` file, you can create a file that returns the kernel (or any PSR-11 container): + +```php + - Note: this approach is used to run Laravel Octane or Symfony with a keep-alive process (like Roadrunner/Swoole). These use cases are not detailed here, read [about Laravel Octane](../../laravel/octane.mdx) or [about Symfony Runtime](../../symfony/keep-alive.mdx) instead. + Note: this approach is used to run Laravel Octane or Symfony with a keep-alive process (like Roadrunner/Swoole). These use cases are not detailed here, read [about Laravel Octane](../../laravel/octane.mdx) or [about Symfony Runtime](../../symfony/runtime.mdx) instead. The `handler` must be a PHP function, or a PSR-15 implementation. Indeed, Bref natively supports the [PSR-15](https://www.php-fig.org/psr/psr-15/#2-interfaces) and [PSR-7](https://www.php-fig.org/psr/psr-7/) standards. Here is an example: diff --git a/website/src/pages/news/01-bref-1.0.mdx b/website/src/pages/news/01-bref-1.0.mdx index 6293bb2b5..91f899f0e 100644 --- a/website/src/pages/news/01-bref-1.0.mdx +++ b/website/src/pages/news/01-bref-1.0.mdx @@ -121,7 +121,7 @@ A common source of errors and confusion was the two runtimes: "FPM" and "Functio To solve that, we clarified the wording and the structure of the documentation: -- [**Bref for web apps**](/docs/web-apps/index.md) lets you run Laravel, Symfony, etc. on Lambda like on any server, using PHP-FPM (aka the "FPM" runtime), +- [**Bref for web apps**](/docs/runtimes/fpm-runtime.mdx) lets you run Laravel, Symfony, etc. on Lambda like on any server, using PHP-FPM (aka the "FPM" runtime), - [**Bref for event-driven functions**](/docs/runtimes/function.mdx) lets you handle native AWS Lambda events (aka the "Function" runtime). *Bref for web apps* is the default runtime (see the "onboarding" section above), so if you're not sure: go with this one. From 100807f962a3f718701a4e6b838afa2bc2810e4e Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 22:55:10 +0200 Subject: [PATCH 119/144] Docs: improve the Symfony docs --- docs/symfony/getting-started.mdx | 41 ++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/docs/symfony/getting-started.mdx b/docs/symfony/getting-started.mdx index b717021de..c702c3471 100644 --- a/docs/symfony/getting-started.mdx +++ b/docs/symfony/getting-started.mdx @@ -69,10 +69,47 @@ At the moment, we deployed our local codebase to Lambda. When deploying for prod Follow [the deployment guide](/docs/deploy.md#deploying-for-production) for more details. -Note as well that for better performance in production, you can warmup the Symfony cache before deploying: +Separately, on cold starts, Symfony will boot with an empty cache directory. It will build the cache on the fly, which can take a few seconds depending on the complexity of the application. + +To optimize cold starts, you can deploy the application with a warm cache. In a simple application it means that the deployment script should include `cache:warmup` to look something like this: ```bash -php bin/console cache:warmup --env=prod +# Install dependencies +composer install --classmap-authoritative --no-dev --no-scripts + +# Warmup the cache +bin/console cache:clear --env=prod + +# Disable use of Dotenv component +echo " .env.local.php + +serverless deploy +``` + +#### Optimizing caches + +When running Symfony on Lambda you should avoid writing to the filesystem. If you pre-warm the cache before deploying you are mostly fine. But you should also make sure you never write to a filesystem cache like `cache.system` or use a pool like: + +```yaml +framework: + cache: + pools: + my_pool: + adapter: cache.adapter.filesystem +``` + +If you don't write to such cache pool you can optimize your setup by not copying the `var/cache/pools` directory. The change below will make sure to symlink the `pools` directory. + +```diff filename="src/Kernel.php" +class Kernel extends BrefKernel +{ + // ... + ++ protected function getWritableCacheDirectories(): array ++ { ++ return []; ++ } +} ``` ## Troubleshooting From db0798905d2dcce86e0e908ff3c2f4d2f7fa2752 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 23:01:35 +0200 Subject: [PATCH 120/144] Website: redirects --- website/link-checker/ManualTests.md | 24 +++++++++--------------- website/redirects.js | 3 ++- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/website/link-checker/ManualTests.md b/website/link-checker/ManualTests.md index 4dc4acfd0..fd1677163 100644 --- a/website/link-checker/ManualTests.md +++ b/website/link-checker/ManualTests.md @@ -30,8 +30,11 @@ Test the following anchor links manually. /docs/web-apps/docker#deployment /docs/web-apps/docker#filesystem /docs/web-apps/docker#docker-registry +/docs/runtimes/console#configuration /docs/runtimes/console#usage /docs/runtimes/console#lambda-context +/docs/runtimes/console#usage-without-serverless-framework +/docs/websites#setting-up-a-domain-name /docs/web-apps/local-development#the-simple-way /docs/web-apps/local-development#docker /docs/web-apps/local-development#read-only-filesystem @@ -41,25 +44,12 @@ Test the following anchor links manually. /docs/web-apps/local-development#console-applications /docs/frameworks/symfony#setup /docs/frameworks/symfony#logs -/docs/frameworks/symfony#trust-api-gateway - -### KO - -/docs/runtimes/console#configuration -/docs/runtimes/console#usage-without-serverless-framework -/docs/websites#setting-up-a-domain-name -/docs/runtimes/#bref-ping /docs/frameworks/symfony#deploy /docs/frameworks/symfony#console /docs/frameworks/symfony#assets /docs/frameworks/symfony#symfony-messenger /docs/frameworks/symfony#caching - -### TODO - -/docs/runtimes/function#the-function -/docs/runtimes/function#deployment-configuration -/docs/runtimes/function#invocation +/docs/frameworks/symfony#trust-api-gateway /docs/function/handlers#autoloading /docs/function/handlers#s3-events /docs/function/handlers#sqs-events @@ -76,5 +66,9 @@ Test the following anchor links manually. /docs/function/local-development#with-serverless-framework /docs/function/local-development#api-gateway-local-development /docs/function/local-development#without-serverless-framework +/docs/runtimes/function#deployment-configuration /docs/environment/custom-domains#custom-domains-for-http-lambdas -/docs/environment/custom-domains#custom-domains-for-static-files-on-s3 + +### KO + +/docs/runtimes/#bref-ping diff --git a/website/redirects.js b/website/redirects.js index d382c6560..97ea35177 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -9,7 +9,7 @@ module.exports.redirects = { '/docs/news/02-bref-2.0': '/news/02-bref-2.0', '/docs/installation': '/docs/setup', '/docs/first-steps': '/docs/setup#whats-next', - '/docs/runtimes/#bref-ping': '/docs/runtimes/runtimes-details#telemetry-ping', + '/docs/runtimes#bref-ping': '/docs/runtimes/runtimes-details#telemetry-ping', '/docs/runtimes/http': '/docs/runtimes/fpm-runtime', '/docs/runtimes/fpm-runtime#setup': '/docs/runtimes/fpm-runtime#usage', '/docs/runtimes/fpm-runtime#runtime': '/docs/runtimes/fpm-runtime', @@ -17,6 +17,7 @@ module.exports.redirects = { '/docs/runtimes/fpm-runtime#binary-requests-and-responses': '/docs/use-cases/http/binary-requests-responses', '/docs/runtimes/fpm-runtime#cold-starts': '/docs/use-cases/http/advanced-use-cases#cold-starts', '/docs/function/handlers': '/docs/runtimes/function', + '/docs/runtimes/function#deployment-configuration': '/docs/runtimes/function#usage', '/docs/runtimes/function#autoloading': '/docs/runtimes/function', '/docs/runtimes/function#s3-events': '/docs/use-cases/s3', '/docs/runtimes/function#sqs-events': '/docs/use-cases/sqs', From 1d7328c6fcd7004d28b0a81b805d18ebaa0bdbe1 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 23:03:23 +0200 Subject: [PATCH 121/144] Docs: fix link --- docs/use-cases/http/advanced-use-cases.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use-cases/http/advanced-use-cases.mdx b/docs/use-cases/http/advanced-use-cases.mdx index 0a9d3f97a..e9085f1dc 100644 --- a/docs/use-cases/http/advanced-use-cases.mdx +++ b/docs/use-cases/http/advanced-use-cases.mdx @@ -153,7 +153,7 @@ This is more advanced, as PHP does not run in a traditional PHP-FPM environment. When used with a framework, understand that the whole HTTP stack (like HTTP middlewares) of the framework does not run. You are responsible for invoking the PHP code that should run. - Note: this approach is used to run Laravel Octane or Symfony with a keep-alive process (like Roadrunner/Swoole). These use cases are not detailed here, read [about Laravel Octane](../../laravel/octane.mdx) or [about Symfony Runtime](../../symfony/runtime.mdx) instead. + Note: this approach is used to run Laravel Octane or Symfony with a keep-alive process (like Roadrunner/Swoole). These use cases are not detailed here, read [about Laravel Octane](../../laravel/octane.mdx) or [about Symfony "Keep-Alive"](../../symfony/keep-alive.mdx) instead. The `handler` must be a PHP function, or a PSR-15 implementation. Indeed, Bref natively supports the [PSR-15](https://www.php-fig.org/psr/psr-15/#2-interfaces) and [PSR-7](https://www.php-fig.org/psr/psr-7/) standards. Here is an example: From 32e678ed05b3a8789539f454c9e9663cc6eb5f18 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 23:15:12 +0200 Subject: [PATCH 122/144] Website: redirects --- website/link-checker/ManualTests.md | 3 --- website/redirects.js | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/website/link-checker/ManualTests.md b/website/link-checker/ManualTests.md index fd1677163..85bbd5365 100644 --- a/website/link-checker/ManualTests.md +++ b/website/link-checker/ManualTests.md @@ -68,7 +68,4 @@ Test the following anchor links manually. /docs/function/local-development#without-serverless-framework /docs/runtimes/function#deployment-configuration /docs/environment/custom-domains#custom-domains-for-http-lambdas - -### KO - /docs/runtimes/#bref-ping diff --git a/website/redirects.js b/website/redirects.js index 97ea35177..71599a290 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -3,7 +3,6 @@ module.exports.redirects = { '/#ecosystem': '/support', '/#plans': '/support', '/#enterprise': '/support', - // TODO: add redirects for anchor links too '/docs/news': '/news', '/docs/news/01-bref-1.0': '/news/01-bref-1.0', '/docs/news/02-bref-2.0': '/news/02-bref-2.0', @@ -37,8 +36,7 @@ module.exports.redirects = { '/docs/installation/aws-keys': '/docs/setup/aws-keys', '/docs/environment/custom-domains': '/docs/use-cases/http/custom-domains', '/docs/aws-cdk': '/docs/deploy/aws-cdk', - // TODO what's this url? - '/docs/web-apps/index.md#assets': '/docs/use-cases/websites', + '/docs/web-apps/index#assets': '/docs/use-cases/websites', '/docs/function/local-development': '/docs/local-development/event-driven-functions', '/docs/frameworks/laravel': '/docs/laravel/getting-started', '/docs/laravel/getting-started#assets': '/docs/laravel/getting-started#website-assets', From 3941b8b7baa908e1ae2fbb09fcba10c46dbf7320 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 23:17:44 +0200 Subject: [PATCH 123/144] Website: redirects --- docs/upgrading/v2.md | 2 +- website/redirects.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/upgrading/v2.md b/docs/upgrading/v2.md index a295285be..4921827bb 100644 --- a/docs/upgrading/v2.md +++ b/docs/upgrading/v2.md @@ -67,7 +67,7 @@ The following commands of `vendor/bin/bref` have changed: serverless bref:cli --args="migrate --force" ``` - No need to provide the function name or the region anymore. Read [the Console documentation](../web-apps/console.md#usage) to learn more. You will also find alternatives if you don't use the `serverless` CLI. + No need to provide the function name or the region anymore. Read [the Console documentation](../runtimes/console.mdx#usage) to learn more. You will also find alternatives if you don't use the `serverless` CLI. - `vendor/bin/bref local` is replaced by the simpler `serverless bref:local`. diff --git a/website/redirects.js b/website/redirects.js index 71599a290..56c8e18b7 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -65,4 +65,5 @@ module.exports.redirects = { '/docs/web-apps/local-development.html': '/docs/local-development', '/docs/runtimes/console#configuration': '/docs/runtimes/console#usage', '/docs/runtimes/console#usage-without-serverless-framework': '/docs/runtimes/console#without-serverless-framework', + '/docs/function/cron': '/docs/use-cases/cron#cron-functions', }; From 96214be05b8e96fe6d438d1d72ca7f0365239067 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 7 Oct 2023 23:24:37 +0200 Subject: [PATCH 124/144] Website: fix CSS --- website/styles/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/styles/main.css b/website/styles/main.css index 05fc3b790..142f1c042 100644 --- a/website/styles/main.css +++ b/website/styles/main.css @@ -6,7 +6,7 @@ :root { /* Algolia DocSearch https://github.com/algolia/docsearch/blob/main/packages/docsearch-css/src/_variables.css */ - --docsearch-primary-color: theme(colors.blue.500); + --docsearch-primary-color: theme('colors.blue.500'); } body { From cd9c289048aa10ea2d00aa7504cd6be5ae63aa86 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 8 Oct 2023 10:48:16 +0200 Subject: [PATCH 125/144] Website: testimonials --- website/src/components/home/testimonials.jsx | 80 +++++++++--------- .../components/home/testimonials/lorenzo.jpg | Bin 0 -> 20770 bytes .../home/testimonials/robmartinson.jpg | Bin 11157 -> 0 bytes 3 files changed, 40 insertions(+), 40 deletions(-) create mode 100644 website/src/components/home/testimonials/lorenzo.jpg delete mode 100644 website/src/components/home/testimonials/robmartinson.jpg diff --git a/website/src/components/home/testimonials.jsx b/website/src/components/home/testimonials.jsx index 86b62ff2a..7362413f2 100644 --- a/website/src/components/home/testimonials.jsx +++ b/website/src/components/home/testimonials.jsx @@ -8,7 +8,7 @@ import aranreeks from './testimonials/aranreeks.jpg'; import nyholm from './testimonials/nyholm.jpg'; import zmalter from './testimonials/zmalter.jpg'; import simon from './testimonials/simon.jpg'; -import robmartinson from './testimonials/robmartinson.jpg'; +import lorenzo from './testimonials/lorenzo.jpg'; const testimonials = [ { @@ -20,15 +20,6 @@ const testimonials = [ image: neil, }, }, - { - body: 'Every time I throw something up onto AWS Lambda in PHP using Bref I marvel at how mega-useful it is. If you haven’t checked out Bref you’re probably missing out', - author: { - name: 'Gary Hockin', - handle: 'GeeH', - link: 'https://twitter.com/GeeH/status/1335909653897752576', - image: geeh, - }, - }, { body: 'Bref has been a boon for running our customer\'s applications. We\'ve had a Laravel API on Bref for the last 12 months serve over 25 million requests with an average response time of 50ms.', author: { @@ -39,30 +30,30 @@ const testimonials = [ }, }, { - body: 'Happily using Bref since 2019 to process millions of requests, jobs and scheduled tasks. It powers the best technical accomplishment of my career and has made me a better software engineer and open-source contributor.', + body: 'Every time I throw something up onto AWS Lambda in PHP using Bref I marvel at how mega-useful it is. If you haven’t checked out Bref you’re probably missing out', author: { - name: 'Marco Deleu', - handle: 'deleugyn', - link: 'https://twitter.com/deleugyn', - image: marco, + name: 'Gary Hockin', + handle: 'GeeH', + link: 'https://twitter.com/GeeH/status/1335909653897752576', + image: geeh, }, }, { - body: 'There is something amazing and magical about Bref and serverless deploying stuff to the cloud.', + body: 'Just finished migrating our production from Heroku to AWS Lambda via Bref. It\'ll save us around $2k a year 🤯', author: { - name: 'Rob Waller', - handle: 'RobDWaller', - link: 'https://twitter.com/RobDWaller/status/1484569852694118406', - image: robdwaller, + name: 'Zach Malter', + handle: 'zmalter99', + link: 'https://twitter.com/zmalter99/status/1671228229317689367', + image: zmalter, }, }, { - body: 'An incredible project and one we\'re very proud to use in production for a recent eCommerce project we launched that saw 32 million Lambda invocations last month.', + body: 'When your production website with Symfony, API Platform and Bref handles more than 500 simultaneous connections without flinching…', author: { - name: 'Aran Reeks', - handle: 'AranReeks', - link: 'https://twitter.com/AranReeks/status/1332467843254919168', - image: aranreeks, + name: '$!m0n', + handle: '__si_mon', + link: 'https://twitter.com/__si_mon/status/1616778693212348416', + image: simon, }, }, { @@ -75,30 +66,39 @@ const testimonials = [ }, }, { - body: 'Just finished migrating our production from Heroku to AWS Lambda via Bref. It\'ll save us around $2k a year 🤯', + body: 'There is something amazing and magical about Bref and serverless deploying stuff to the cloud.', author: { - name: 'Zach Malter', - handle: 'zmalter99', - link: 'https://twitter.com/zmalter99/status/1671228229317689367', - image: zmalter, + name: 'Rob Waller', + handle: 'RobDWaller', + link: 'https://twitter.com/RobDWaller/status/1484569852694118406', + image: robdwaller, }, }, { - body: 'When your production website with Symfony, API Platform and Bref handles more than 500 simultaneous connections without flinching…', + body: 'Happily using Bref since 2019 to process millions of requests, jobs and scheduled tasks. It powers the best technical accomplishment of my career and has made me a better software engineer and open-source contributor.', author: { - name: '$!m0n', - handle: '__si_mon', - link: 'https://twitter.com/__si_mon/status/1616778693212348416', - image: simon, + name: 'Marco Deleu', + handle: 'deleugyn', + link: 'https://twitter.com/deleugyn', + image: marco, }, }, { - body: 'We have several serverless applications deployed in production using Bref. It’s an awesome tool.', + body: 'The team embraced Bref with lightning speed! We were able to roll out the first parts of our new event-driven architecture within days, crafting new features in a mere fraction of the time it used to take — truly mind-blowing!', author: { - name: 'Rob Martinson', - handle: 'robmartinson', - link: 'https://twitter.com/robmartinson/status/1603043069972320258', - image: robmartinson, + name: 'Lorenzo Rogai', + handle: 'lorenzo-rogai', + link: 'https://www.linkedin.com/in/lorenzo-rogai/', + image: lorenzo, + }, + }, + { + body: 'An incredible project and one we\'re very proud to use in production for a recent eCommerce project we launched that saw 32 million Lambda invocations last month.', + author: { + name: 'Aran Reeks', + handle: 'AranReeks', + link: 'https://twitter.com/AranReeks/status/1332467843254919168', + image: aranreeks, }, }, // More testimonials... diff --git a/website/src/components/home/testimonials/lorenzo.jpg b/website/src/components/home/testimonials/lorenzo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b9ac34263a653c6d0b803bd53e3a19aa78e63d7 GIT binary patch literal 20770 zcmbrl1yCK$)-F7_!^Yj+U4y&3ySr;}g1c*w;O-6~xLfex?j!^V5H#GK_ndpqSGWGE zzi!>0y=R`?J-v4K>h9^)&+2(wecJ^<^3rnB00aa8K!6Y6Z6C5wPC~*&Rb53|PEqQg z1juAZ3nvd~HUMyP_HTQf^AE(K#IcW?p0cbt zUu^R){O}jMYpP2C03?gYNa5sayv9KFD0_$U0W39^;5 zmInAr^v~A=PzPiHaexdk2fP3~z!C5Sn88PZ@9l=dl2vT>)Rf9h}1k zum$I30>^p*9)K12Y7LIJ0w0dxJHX+;y8o|EJ*+wZ$^%y!Ssnmj4&L5=F#rHuE&#kn zy}dmbzrDSd007h~0Q9H-H@{0dSe=*P_~ie_QRM>wS{MMd_x?A|ybJ(3z≫b~ST1 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 JgHtbS{{v%0Vub(z From 8ebf93c401cca28b4f11710703fa143c1e445e11 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 8 Oct 2023 20:10:15 +0200 Subject: [PATCH 126/144] Website: GitHub permissions --- .github/workflows/website.yml | 6 +++++- website/src/pages/credits.mdx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 34242ae5f..640c4afc2 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -26,6 +26,10 @@ jobs: - name: Build run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # CUSTOM_GITHUB_TOKEN_READ is a manually created GitHub token with appropriate permissions: + # - allowed to list contributors + # - allowed to list sponsors + # It wouldn't be possible to use the default GITHUB_TOKEN because it doesn't have the required permissions. + GITHUB_TOKEN: ${{ secrets.CUSTOM_GITHUB_TOKEN_READ }} - name: Deploy run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} diff --git a/website/src/pages/credits.mdx b/website/src/pages/credits.mdx index 871e092d7..c96c2d9ae 100644 --- a/website/src/pages/credits.mdx +++ b/website/src/pages/credits.mdx @@ -35,7 +35,7 @@ export const getStaticProps = async () => { contributors, }, }, - // The page will be considered as stale and regenerated every 60 seconds. + // This page will be generated statically on deployment and never regenerated revalidate: false, }; } From 61a01aa1d080069f79278a912471a20dcf61fc7e Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 9 Oct 2023 15:35:19 +0200 Subject: [PATCH 127/144] Website: newsletter --- website/src/components/home/invocations.jsx | 30 ++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/website/src/components/home/invocations.jsx b/website/src/components/home/invocations.jsx index 1c8a585c6..e994eb3a8 100644 --- a/website/src/components/home/invocations.jsx +++ b/website/src/components/home/invocations.jsx @@ -1,7 +1,8 @@ export default function Invocations({ invocations }) { return (
    -
    +

    {invocations?.toLocaleString('en-US')}

    @@ -13,12 +14,35 @@ export default function Invocations({ invocations }) { {/* Learn more */} {/* */} {/*
    */} +
    +
      +
      +
      + +
      + +
      +
      - ) + ); } From 0b609bb924b5813bf25d4c2e08b7a7c3555fec91 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 9 Oct 2023 15:47:39 +0200 Subject: [PATCH 128/144] Website: responsive fixes --- website/src/components/home/companies.jsx | 2 +- website/src/components/home/intro.jsx | 6 +++--- website/src/components/home/invocations.jsx | 13 ++++++------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/website/src/components/home/companies.jsx b/website/src/components/home/companies.jsx index 0f1cb4423..35371c585 100644 --- a/website/src/components/home/companies.jsx +++ b/website/src/components/home/companies.jsx @@ -31,7 +31,7 @@ export default function Companies() {
      -
      +
      -
      +

      Why Bref? Why serverless? @@ -55,7 +55,7 @@ export default function Intro() {

      -
      +
      -
      +

      $ serverless deploy

       

      Deploying demo to stage dev (us-east-1)

      diff --git a/website/src/components/home/invocations.jsx b/website/src/components/home/invocations.jsx index e994eb3a8..e5388fc20 100644 --- a/website/src/components/home/invocations.jsx +++ b/website/src/components/home/invocations.jsx @@ -1,6 +1,6 @@ export default function Invocations({ invocations }) { return ( -
      +

      @@ -19,12 +19,11 @@ export default function Invocations({ invocations }) { method="post" data-sv-form="5696241" data-uid="ee838f35c4" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"message","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":""},"analytics":{"google":null,"fathom":null,"facebook":null,"segment":null,"pinterest":null,"sparkloop":null,"googletagmanager":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com/features/forms?utm_campaign=poweredby&utm_content=form&utm_medium=referral&utm_source=dynamic"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}">
        -
        -
        - -
        +
        + - - -
        - - - -
        -
        - {% block content %} - - {% endblock %} -
        - -
        -
        - - - - - - - - - - - - - -{% endblock %} diff --git a/website/template/enterprise.twig b/website/template/enterprise.twig deleted file mode 100644 index d1ad54b6c..000000000 --- a/website/template/enterprise.twig +++ /dev/null @@ -1,324 +0,0 @@ -{# Double id="" to keep old links working #} -
        -
        -

        - # - Ecosystem -

        - -
        -
        -
        -

        Bref

        -

        - Free and Open Source -

        -

        - Documentation -
        -
        -
          -
        • - - - The Bref open-source project, its documentation and framework integrations -
        • - -
        • - - - Deploy your applications in your AWS account -
        • - -
        • - - - Use the public AWS Lambda runtimes hosted in the Bref AWS account -
        • -
        -
        -
        - -
        -
        -

        Bref Pro

        -

        - $100 - /mo -

        -

        - * cancel anytime, first month refund if not satisfied -

        - Get Started -
        -
        -
          -
        • - - - The Bref open-source project, its documentation and framework integrations -
        • - -
        • - - - Deploy your applications in your AWS account -
        • - -
        • - - - Use the public AWS Lambda runtimes hosted in the Bref AWS account -
        • - -
        • - - - Use AWS Lambda runtimes hosted in your AWS account (opt-in) -
        • - -
        • - - - Open-source gold sponsor 💙 -
        • - -
        • - - - Expert support via Slack and Email - - - - - -
        • -
        -
        -
        - -
        -
        -

        Bref Enterprise

        -

        - Get in touch -

        -

        - Get In Touch -
        -
        -
          -
        • - - - The Bref open-source project, its documentation and framework integrations -
        • - -
        • - - - Deploy your applications in your AWS account -
        • - -
        • - - - Use the public AWS Lambda runtimes hosted in the Bref AWS account -
        • - -
        • - - - Use AWS Lambda runtimes hosted in your AWS account (opt-in) -
        • - -
        • - - - Open-source premium sponsor 💙 -
        • - -
        • - - - - Self-built, tailor-made AWS Lambda runtimes optimized for your project (opt-in) - -
        • - -
        • - - - Expert support via Zoom, Slack, and Email - - - - - -
        • - -
        • - - - GitHub/GitLab review for infrastructure code -
        • - -
        • - - - Engineer-led introduction and onboarding -
        • - -
        • - - - - Team access to the - Serverless Visually Explained - course - -
        • -
        -
        -
        -
        - -
        -
        -

        - Bref is a free and open-source project hosted on GitHub. -

        -

        - Bref Pro and Bref Enterprise are offered by Null, the company created by the author of Bref. Got any question about these plans? - . -

        -
        - -
        - -
        -
        - - - - - -
        -
        -

        - Direct support, aka Matthieu-as-a-Service -

        -

        - Provide your team with direct support from - Matthieu, - author of Bref, - AWS Serverless Hero, - and former - Serverless Framework product manager. -
        - Support covers Bref (including priority bugfixes), serverless, and AWS. -

        -
        -
        - -
        -
        - - - -
        -
        -

        - Self-hosted AWS Lambda runtimes -

        -

        - Runtimes provided by the open-source project are served from the Bref AWS account. -
        - It works perfectly, but if your project or company policy requires full ownership of AWS Lambda runtimes, Bref Pro and Bref Enterprise help you publish the runtimes to your own AWS account. -

        -
        -
        - -
        -
        - - - -
        -
        -

        - Tailored and optimized runtimes -

        -

        - Bref Enterprise helps you optimize runtimes to your needs and comply with security standards and regulations. -

        -
        -
        - -
        -
        - -
        - -
        diff --git a/website/template/favicon.ico b/website/template/favicon.ico deleted file mode 100644 index 089f9e21c05cba3cf515adefefd2182a49f56bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmd^D-BVRn6hAfn0saX*uo1_X%%*&_mmcb^_uj1N(+mquEP_fwLn18|F-?$*)an{IysAUDuHA?ik9-F=>NI_vB*t~T|iui4}J^JT0Ts>Thq28T1+xR4QuM*f(D$rE62+eN@v{fy`!1sF*Cwss3 z?!n~medyWx1di7{ic4*!=&pVc$EyUo-xc`keSuxC3haK(wei_%vh%t?OBvazd>9Ac z6!>Bty_X9deoNrXw*}fO1Uf5)XJh9|Wkca$8;pZ(w5}02xORRU+g}mzY#2D26%J{` zhvTS$rb7X_pZ6GxB@3yu$85b$i6ICA_gTS^4x*vJ#d2hRy)*a*U5 z@}hprre_7LHcTAqx9szCOE#)k2;^hKA0O6DA&*AhXA0ZTw^#`ZC{jUvl;qQn4vL#2cSZC6S2yfplU<_VL{4 z_<*dD-8-JfCY9mYkWOdOYOLS2($k>viPDS&Uw6MQm~q z$=OMaU1`I2bxZN7+C!Vl7Nak`4$-lnF*R}t*S^_>Goe)&?e9c#dW>wQJiBaD|4wi1 z=s2c^`{@3`9Z$cP=Om^_as6~XPHkEuYy0WCW%%j93iNDTh@K5pEJG5pY&a|u~Oc%+oE+6S+46%t{Xq}r96LU5E<9>8iKZ5qE#W>emg7IHZ z;MVnT(cAbGx|A+BLE3`##mV5N8Ne+~xHEL;orQJrVKz!+FFgex9G|H&=n z-(lPyK8McDkKw|hwTO&d!1?fM(ji4siyR>hzs>u`L}{X9q={G;-NE4M zBNs!V^h1NvNf~}1A86ghnn(K~r1aAP(od|z7z1muFljN?V-f@5$iz@6^_iaw)>zpv z__@dl1NlI6adaL(>`;25f%GP8&I~R%7A*0=T(Aa|ejs0XehA5hhEErgu+T!68TA#J9hr#rNFE_n-F!CZNE>t|&FtEnW83W}7bD?v>8j~g$0WoQE zv5nTZVhG|w<)*}7=0y+}CI*g4Uv9ES55zDJ7hX)77=m)sj0azC)~j>EHg(>}nF}K( z^nM*tvFpNBP8qg^P^bG`XOfq5Kf^zrfvU{~OJZ;R65w diff --git a/website/template/footer.twig b/website/template/footer.twig deleted file mode 100644 index 7feafeea5..000000000 --- a/website/template/footer.twig +++ /dev/null @@ -1,13 +0,0 @@ -
        -
        -

        - © 2019-{{ 'now'|date('Y') }} Matthieu Napoli - - GitHub - - Twitter -

        -

        - Need help? Take a look at the - support plans. -

        -
        -
        diff --git a/website/template/home.twig b/website/template/home.twig deleted file mode 100644 index 7ed9f5e5d..000000000 --- a/website/template/home.twig +++ /dev/null @@ -1,281 +0,0 @@ -{% extends 'layout.twig' %} - -{% set metaTitle = 'Bref - Serverless PHP made simple' %} -{% set metaDescription = 'Bref is a framework to write and deploy serverless PHP applications on AWS Lambda.' %} - -{% block body %} - -
        - - - -
        -
        -
        - -
        -
        -

        - Simple and scalable PHP applications - - with serverless -

        - -
        -
        -
        - - - - - Symfony - - - - -
        -
        - -
        -
        - - - - - - - -
        - -
        - -
        -
        -
        -
        -

        - A higher level stack -

        -

        - Creating and running modern and scalable PHP applications should be simpler. By using serverless technologies, like AWS Lambda, we can focus on development and worry less about servers. -

        -

        - Bref is an open source project that brings full support for PHP and its frameworks to AWS Lambda. -

        -
        -
        -
        - AWS -
        -

        Open source, battle-tested
        PHP runtimes for AWS Lambda

        -
        -
        - -
        -
        -

        - built on top of the cloud -

        -

        - Getting started with serverless can be overwhelming. Bref integrates with the open-source Serverless Framework for configuration and deployment. - We get the best of both world: powerful, yet simple. -

        -

        - On top of Serverless' documentation and ecosystem, Bref provides complete documentation and examples for PHP applications. -

        -
        -
        -
        - - - -
        -

        Simple cloud orchestration
        via the Serverless Framework

        -
        -
        - -
        - - - -
        -
        - -
        -
        -

        - - 10 billion requests and jobs served using Bref every month - -

        -
        -
        -
        -
        -

        “Bref is excellent. We've been running a Laravel/PHP app with it since 2020 and it's currently handing over 160 million requests per month without a hiccup.”

        -
        -
        -
        Neil Morgan
        -
        - bcast.fm -
        -
        -
        -
        -
        -
        -
        -

        “Bref has been a boon for running our customer's applications. We've had a Laravel API on Bref for the last 12 months serve over 25M requests with an average response time of 50ms.”

        -
        -
        -
        Paul Giberson
        -
        - Chief Software Architect, - Halas Labs -
        -
        -
        -
        -
        -
        -
        - -
        -
        -

        - They sponsor the open-source project -

        -
        -
        -

        Premium sponsors

        -

        - * one-time sponsor -

        -
        - -
        -
        -

        Gold sponsors

        - -
        -

        - Join the sponsors ❤️ -

        -
        -
        - - {% include 'enterprise.twig' %} - - {% include 'footer.twig' %} - - - - - - - -{% endblock %} diff --git a/website/template/img/favicon-16x16.png b/website/template/img/favicon-16x16.png deleted file mode 100644 index c3d4720fff228d14797c06c2ab522a3ed357fb3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmV-(0gV2MP)DlD$d;K@i7(v$sez9)1-X#YPAg5)sl`YGLI|Sm-+l z);@ucV6BCnrL7=nV<93~s3cfu63)wxg~@qI_B@k;g_+s;f3UMs-aA%|0qGoLK!Q|m zJb94hb~tb_&^KPNWGN5k_D|&=qQFaJ|D`N`FvegO-e9U&=Q|Wu5kTSr?NCdDI5c!87t#fcx%MO4oZ`jhkA>Xt4CJnL(cAAklII6XNv_? zH35hS0IEtiT5Y8e{PZISfxuVWAT^{Rp(sCW=TgMuWk0X2zBOfs37?pGd?%uITlo{4BdGxc8A z@_+TOdOb35;i`gwtUPf#1_Th3Y*SZ{_q7cLBSBB~HK}oI<0lF2rGkw~9^bUlRv6N|Vh&a+csnn>6r1(7MJl)V8CvsA4y3Q_{pt%%8B69r`( z4)B+CyB_ovU!l3_Fb11>&LaS864#?Ch1TSYDCs0kjb@x~LQ{~n^CkUm&jdVq3hI@8 zy*5$0Z6@?dW7=@DM)z%9^tBC_nWnfn#QNIU01-ooT+>+^ZVkxzZ$xqvCY8OB`=Z8Q zMUWVKvnH5?0*F9m)R)(NJ)79xy|H5Fc`-E$WW;HVWl{Kou|;V>mw4 z$N8iC+0&gT-y)P9e3&cK+2*k&XP8}b+-Wc5C7f_(DD@RxRGP^T{fIH8p7<>AT`C`E4jy4W%>*UeoEKWfNF5lFV!5v&WG0eWL zn`mA6D_C+c_1mXsgGb)3atNwg0kP;Sd0U0`v*=hTJGOV&<<=2FRVnz&>*)d$GYcHv z*-2N<ru9JCs#4w!Q;0^nbY0U}6O*WvvnS&x4# s1^-g)f6h;HUG^8n0`FJn^?&^S0V(iKnx#6GZ~y=R07*qoM6N<$f_#i~!T - - - - - - - - - - - - diff --git a/website/template/img/logo-small.png b/website/template/img/logo-small.png deleted file mode 100755 index 06677a1c3f38b61a91d43d6ed969fa6ad5f3b200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44090 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 - - - - - diff --git a/website/template/img/serverless-visually-explained.png b/website/template/img/serverless-visually-explained.png deleted file mode 100644 index c09a1b7e83f899471458909aa0f8ab02b0e581ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29566 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 GvHt_J!kg#- diff --git a/website/template/news-article.twig b/website/template/news-article.twig deleted file mode 100644 index af24f9292..000000000 --- a/website/template/news-article.twig +++ /dev/null @@ -1,33 +0,0 @@ -{% extends 'news.twig' %} - -{% set hideTweets = true %} - -{% block article %} -
        -
        -
        -
        {{ articleDate }}
        -
        - - {{ author }} - -
        -
        - {{ author }} -
        - - @{{ authorGithub }} - -
        -
        - -
        -
        - {{ content|raw }} - -
        -
        -{% endblock %} diff --git a/website/template/news.twig b/website/template/news.twig deleted file mode 100644 index a8d625961..000000000 --- a/website/template/news.twig +++ /dev/null @@ -1,92 +0,0 @@ -{% extends 'layout.twig' %} - -{% set metaTitle = title ~ ' - Bref' %} -{% set metaDescription = introduction|default %} - -{% block body %} - - - -
        - {% if not hideTweets %} - - {% endif %} - {% block content %} -
        -

        {{ title }}

        - {% if subTitle %} -
        {{ subTitle }}
        - {% endif %} - {% block article %} - {{ content|raw }} - {% endblock %} -
        - {% endblock %} -
        -
        - - {% include 'footer.twig' %} - - - - - - - - - - - -{% endblock %} diff --git a/website/template/styles.css b/website/template/styles.css deleted file mode 100644 index 91bcb7bb0..000000000 --- a/website/template/styles.css +++ /dev/null @@ -1,221 +0,0 @@ -@tailwind base; - -html { - scroll-padding-top: 70px; - scroll-behavior: smooth; -} - -body { - -webkit-font-smoothing: antialiased; -} - -h1, h2, h3, h4, h5, h6 { - @apply font-title; -} - -a { - @apply text-blue-700; -} -a:hover { - @apply text-blue-800; -} - -ul { - list-style-type: disc; - @apply pl-4; -} -ol { - list-style-type: decimal; - @apply pl-4; -} - -/* Home */ -.hero { - background: linear-gradient(123.19deg, #266488 3.98%, #258ECB 94.36%); -} -.home-logo { - width: 140px; -} -@media only screen and (min-width: 768px) { - .home-logo { - width: 230px; - } -} -@media only screen and (min-width: 1024px) { - .home-logo { - width: 280px; - } -} - -/* Cancel highlight.js defaults */ -.hljs { - background: transparent !important; - padding: 0 !important; - color: inherit !important; -} - -/* Style documentation articles */ -article p { - margin-top: 16px; - line-height: 24px; -} -article h1, article h2, article h3, article h4, article h5, article h6 { - position: relative; -} -article h1 { - margin-bottom: 40px; -} -@media only screen and (max-width: 992px) and (min-width: 768px) { - article h1{ - max-width: calc(100% - 60px); - } -} -@media only screen and (min-width: 992px) { - article h1{ - max-width: calc(100% - 130px); - } -} -article h2 { - font-weight: 600; - font-size: 24px; - line-height: 32px; - margin-top: 60px; - margin-bottom: 30px; - padding-right: 64px; -} -article h3 { - font-size: 18px; - line-height: 24px; - font-weight: 600; - margin-top: 40px; - margin-bottom: 16px; -} -article h4 { - font-size: 16px; - line-height: 22px; - font-weight: 600; - margin-top: 30px; - margin-bottom: 14px; -} -.title-anchor { - @apply text-blue-200; - position: absolute; - margin-left: -30px; - margin-top: 1px; - right: 0; - left: 0; - opacity: 0.5; -} -a.title-anchor:hover { - text-decoration: none; - opacity: 0.75; -} -article ul, article ol { - margin-top: 8px; - margin-left: 16px; - padding: 0 0 0 16px; -} -article ul li, article ol li { - margin-top: 6px; - line-height: 24px; -} -article code { - @apply font-mono bg-gray-100; - display: inline-block; - font-size: .9rem; - line-height: 1.5; - padding: 0 .3rem; -} -article pre { - @apply bg-gray-100; - padding: 1em; - margin: 1em 0; - word-break: normal; - overflow: auto; -} -article pre code { - display: block; - padding: 0; - font-size: .85rem; -} -article blockquote { - @apply text-blue-700 bg-blue-100 border-blue-500; - border-left-width: 4px; - padding: 1rem; - margin-top: 16px; -} -article blockquote a { - @apply underline; -} -article blockquote p:first-child { - margin-top: 0; -} -article table { - @apply w-full my-8 border-b border-gray-200; -} -article table th { - @apply text-sm font-bold text-gray-700 p-2 bg-gray-100; -} -article table td { - @apply p-2 border-t border-gray-200; -} - -@media (min-width: 1360px) { - #in-page-menu { - display: block; - } -} - -.maturity-icon { - width: 20px; - height: 20px; - display: inline-block; - border-radius: 9999px; - vertical-align: text-top; -} - -/* Menu */ -#menu h3 { - @apply mb-4 text-gray-500 uppercase font-semibold text-sm tracking-wider; -} -@screen lg { - #menu h3 { - @apply text-xs; - } -} -#menu ul { - @apply list-none p-0 mb-6 ml-4; -} -#menu ul:last-child { - @apply mb-0; -} -#menu ul > li { - @apply my-3; -} -#menu ul > li:last-child { - @apply mb-0; -} -#menu ul > li > a { - @apply text-gray-800; -} -#menu ul > li > a.active { - @apply text-blue-600 underline; -} - -/* Algolia */ -.DocSearch.DocSearch-Button { - @apply w-48 lg:w-64 rounded m-0 px-3 lg:px-4 py-2 bg-blue-800 focus:outline-none focus:bg-blue-700 shadow-inner cursor-pointer !important; -} -#search-container-home .DocSearch.DocSearch-Button { - @apply w-48 lg:w-64 rounded-md m-0 px-3 lg:px-4 py-2 bg-transparent transition-all duration-200 bg-blue-700 outline-none focus:outline-none shadow-md focus:shadow-2xl transform focus:scale-125 cursor-pointer !important; -} -.DocSearch .DocSearch-Button-Placeholder { - @apply text-blue-300 !important; -} -.DocSearch-Search-Icon, .DocSearch-Button-Keys { - display: none !important; -} - -@tailwind components; - -@tailwind utilities; From cfe4894af530ea6570fdb042dc4087dcbe72702c Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 11:04:21 +0200 Subject: [PATCH 133/144] Website: improve meta tags --- website/theme.config.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/website/theme.config.jsx b/website/theme.config.jsx index 40718c0d9..38aae16b1 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -12,7 +12,7 @@ export default { }, useNextSeoProps() { const { asPath } = useRouter(); - if (asPath !== '/') { + if (asPath.length > 1) { return { titleTemplate: '%s – Bref', }; @@ -50,6 +50,10 @@ export default { + + + + ), footer: { From 0adddf3ce9523c2b81c4139cee3064aba4f07acb Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 11:04:37 +0200 Subject: [PATCH 134/144] Website: cleanup more files from the previous website --- website/template/layout.twig | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 website/template/layout.twig diff --git a/website/template/layout.twig b/website/template/layout.twig deleted file mode 100644 index 08d59eee3..000000000 --- a/website/template/layout.twig +++ /dev/null @@ -1,35 +0,0 @@ - - - - - {% set metaTitle = metaTitle|default('Bref') %} - {% set metaDescription = metaDescription|default('Bref is a framework to run serverless PHP applications on AWS Lambda.') %} - {{ metaTitle }} - - - - - - {% if socialCard|default %} - - - - {% else %} - - - {% endif %} - - - - - {##} - - - - - - - - {% block body %}{% endblock %} - - From badf37052760d4d6908b86d5575ad3ce6a276688 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 11:15:32 +0200 Subject: [PATCH 135/144] Website: self-host the font --- website/src/pages/_app.jsx | 9 ++++++++- website/tailwind.config.js | 2 +- website/theme.config.jsx | 1 - 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/website/src/pages/_app.jsx b/website/src/pages/_app.jsx index 4a4e8b193..65efa6f02 100644 --- a/website/src/pages/_app.jsx +++ b/website/src/pages/_app.jsx @@ -2,8 +2,15 @@ import '../../styles/main.css'; import { useRouter } from 'next/router'; import { useEffect } from 'react'; import PlausibleProvider from 'next-plausible'; +import { Inter } from 'next/font/google' const redirects = require('../../redirects').redirects; +// See https://nextjs.org/docs/pages/building-your-application/optimizing/fonts#with-tailwind-css +const inter = Inter({ + subsets: ['latin'], + variable: '--font-inter', +}) + export default function MyApp({ Component, pageProps }) { // Custom code to redirect old URLs to new ones // This runs client-side to redirect anchor tags @@ -27,7 +34,7 @@ export default function MyApp({ Component, pageProps }) { return ( - + ) } diff --git a/website/tailwind.config.js b/website/tailwind.config.js index d75217248..f2f0b3229 100644 --- a/website/tailwind.config.js +++ b/website/tailwind.config.js @@ -9,7 +9,7 @@ module.exports = { darkMode: 'class', theme: { fontFamily: { - sans: ['"Inter var"', ...defaultTheme.fontFamily.sans], + sans: ['var(--font-inter)', ...defaultTheme.fontFamily.sans], mono: "ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace", }, extend: { diff --git a/website/theme.config.jsx b/website/theme.config.jsx index 38aae16b1..a201990e8 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -44,7 +44,6 @@ export default { }, head: ( <> - From 73ec5f396a94ff787a679aa57d9f6eb905934b68 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 12:04:50 +0200 Subject: [PATCH 136/144] Website: social card --- website/public/social-card.png | Bin 0 -> 82266 bytes website/theme.config.jsx | 15 +++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 website/public/social-card.png diff --git a/website/public/social-card.png b/website/public/social-card.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b783565fa9b367fed201731c9650a374b838be GIT binary patch literal 82266 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 literal 0 HcmV?d00001 diff --git a/website/theme.config.jsx b/website/theme.config.jsx index a201990e8..d776e2126 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -15,10 +15,24 @@ export default { if (asPath.length > 1) { return { titleTemplate: '%s – Bref', + openGraph: { + images: [ + { + url: '/social-card.png', + }, + ], + }, }; } else { return { titleTemplate: 'Bref – Simple and scalable PHP with serverless', + openGraph: { + images: [ + { + url: '/social-card.png', + }, + ], + }, }; } }, @@ -51,6 +65,7 @@ export default { + From d79b7029e3e420d5f132aad57467360379a6778d Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 15:52:04 +0200 Subject: [PATCH 137/144] Website: debug SSG --- website/theme.config.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/website/theme.config.jsx b/website/theme.config.jsx index d776e2126..53be25b7f 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -12,6 +12,7 @@ export default { }, useNextSeoProps() { const { asPath } = useRouter(); + console.log(asPath); if (asPath.length > 1) { return { titleTemplate: '%s – Bref', From 437cee9686ecd83d09176eab4a021b090578bd47 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 17:07:51 +0200 Subject: [PATCH 138/144] Website: fix SSG --- website/theme.config.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/theme.config.jsx b/website/theme.config.jsx index 53be25b7f..e530b265f 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -12,8 +12,8 @@ export default { }, useNextSeoProps() { const { asPath } = useRouter(); - console.log(asPath); - if (asPath.length > 1) { + // On SSG the path is `/index` instead of `/` for some reason + if (asPath === '/' || asPath === '/index') { return { titleTemplate: '%s – Bref', openGraph: { From 62141a54b7c0ff6caad1b0b50852576b37829071 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 17:27:55 +0200 Subject: [PATCH 139/144] Website: fix SSG --- website/theme.config.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/website/theme.config.jsx b/website/theme.config.jsx index e530b265f..ded4806b3 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -12,6 +12,7 @@ export default { }, useNextSeoProps() { const { asPath } = useRouter(); + console.log(asPath); // On SSG the path is `/index` instead of `/` for some reason if (asPath === '/' || asPath === '/index') { return { From 542638ce7cddcf00dfb278d60aa18adf50ae3407 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 17:40:38 +0200 Subject: [PATCH 140/144] Website: fix warnings --- .github/workflows/website.yml | 2 + website/package-lock.json | 505 +++++++++++++++++++++++++++++++++- website/package.json | 3 +- 3 files changed, 504 insertions(+), 6 deletions(-) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 640c4afc2..dd532ddf7 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -19,6 +19,8 @@ jobs: working-directory: ./website steps: - uses: actions/checkout@v3 + with: + fetch-depth: 0 # fetch all history for "latest modified time" - run: npm install --global vercel@latest - run: make src/pages/docs - name: Pull Vercel Environment Information diff --git a/website/package-lock.json b/website/package-lock.json index 1c051937f..b51f33cfe 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -17,7 +17,8 @@ "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "sharp": "^0.32.6" }, "devDependencies": { "@tailwindcss/forms": "^0.5.5", @@ -2145,6 +2146,11 @@ "postcss": "^8.1.0" } }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -2160,6 +2166,25 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "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/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2169,6 +2194,16 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -2227,6 +2262,29 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "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/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -2365,6 +2423,11 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -2390,6 +2453,18 @@ "node": ">=6" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2403,6 +2478,31 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/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/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/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -2933,6 +3033,28 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/delaunator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", @@ -2954,6 +3076,14 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -2990,6 +3120,14 @@ "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" }, + "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/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3137,6 +3275,14 @@ "node": ">=4" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3153,6 +3299,11 @@ "node": ">=0.10.0" } }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, "node_modules/fast-glob": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", @@ -3231,6 +3382,11 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -3296,6 +3452,11 @@ "git-up": "^7.0.0" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", @@ -3562,6 +3723,25 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3575,8 +3755,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "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/inline-style-parser": { "version": "0.1.1", @@ -3631,6 +3815,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -5067,6 +5256,17 @@ "node": ">=8.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mini-svg-data-uri": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", @@ -5096,6 +5296,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -5137,6 +5342,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "node_modules/next": { "version": "13.4.9", "resolved": "https://registry.npmjs.org/next/-/next-13.4.9.tgz", @@ -5352,6 +5562,22 @@ "react-dom": ">=16.13.1" } }, + "node_modules/node-abi": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.49.0.tgz", + "integrity": "sha512-ji8IK8VT2zAQv9BeOqwnpuvJnCivxPCe2HNiPe8P1z1SDhqEFpm7GqctqTWkujb8mLfZ1PWDrjMeiq6l9TN7fA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -5670,6 +5896,57 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/property-information": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", @@ -5689,6 +5966,15 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, + "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/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5708,6 +5994,25 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "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/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -5740,6 +6045,19 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdir-enhanced": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz", @@ -6004,6 +6322,25 @@ "node": ">=6" } }, + "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", @@ -6043,6 +6380,58 @@ "node": ">=4" } }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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/semver/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/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -6078,6 +6467,57 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6149,6 +6589,23 @@ "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", + "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "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/stringify-entities": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", @@ -6178,6 +6635,14 @@ "node": ">=0.10.0" } }, + "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": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -6366,6 +6831,26 @@ "postcss": "^8.4.21" } }, + "node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -6462,6 +6947,17 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-fest": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", @@ -6756,8 +7252,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "9.0.0", diff --git a/website/package.json b/website/package.json index 479ab88b0..efe85d270 100644 --- a/website/package.json +++ b/website/package.json @@ -19,7 +19,8 @@ "nextra": "^2.8.0", "nextra-theme-docs": "^2.8.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "sharp": "^0.32.6" }, "devDependencies": { "@tailwindcss/forms": "^0.5.5", From 9a6da67daea4be86478dc23188b50329c76c23c8 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 17:42:12 +0200 Subject: [PATCH 141/144] Website: fix title --- website/theme.config.jsx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/website/theme.config.jsx b/website/theme.config.jsx index ded4806b3..a3782d99e 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -16,25 +16,25 @@ export default { // On SSG the path is `/index` instead of `/` for some reason if (asPath === '/' || asPath === '/index') { return { - titleTemplate: '%s – Bref', + titleTemplate: 'Bref – Simple and scalable PHP with serverless', openGraph: { images: [ { - url: '/social-card.png', - }, - ], - }, + url: '/social-card.png' + } + ] + } }; } else { return { - titleTemplate: 'Bref – Simple and scalable PHP with serverless', + titleTemplate: '%s – Bref', openGraph: { images: [ { - url: '/social-card.png', - }, - ], - }, + url: '/social-card.png' + } + ] + } }; } }, From 64fc44053d5aed9dbf1fa9ad1522a74afe135c5e Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 21:42:33 +0200 Subject: [PATCH 142/144] Website: social cards --- .../news/02-social-card.png} | Bin website/src/pages/news/02-bref-2.0.mdx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename website/{src/pages/news/02/social-card.png => public/news/02-social-card.png} (100%) diff --git a/website/src/pages/news/02/social-card.png b/website/public/news/02-social-card.png similarity index 100% rename from website/src/pages/news/02/social-card.png rename to website/public/news/02-social-card.png diff --git a/website/src/pages/news/02-bref-2.0.mdx b/website/src/pages/news/02-bref-2.0.mdx index 4e6277a56..c2fb66f07 100644 --- a/website/src/pages/news/02-bref-2.0.mdx +++ b/website/src/pages/news/02-bref-2.0.mdx @@ -6,7 +6,7 @@ import { NextSeo } from 'next-seo'; images: [ { // TODO move the image to a public folder - url: 'https://bref.sh/docs/news/02/social-card.png', + url: '/news/02-social-card.png', }, ], }} From 11d739a0c9847ce07631a8628b7886f0ee0cd658 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 21:43:47 +0200 Subject: [PATCH 143/144] Website: solve TODOs --- docs/laravel/getting-started.mdx | 2 -- website/next.config.js | 7 ++----- website/src/pages/news/02-bref-2.0.mdx | 1 - 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/docs/laravel/getting-started.mdx b/docs/laravel/getting-started.mdx index 4f0a4131d..2a491a1d6 100644 --- a/docs/laravel/getting-started.mdx +++ b/docs/laravel/getting-started.mdx @@ -66,8 +66,6 @@ At the moment, we deployed our local codebase to Lambda. When deploying for prod Follow [the deployment guide](/docs/deploy.md#deploying-for-production) for more details. -TODO - ## Troubleshooting In case your application is showing a blank page after being deployed, [have a look at the logs](../environment/logs.md). diff --git a/website/next.config.js b/website/next.config.js index 7d95306a6..f57debbbd 100644 --- a/website/next.config.js +++ b/website/next.config.js @@ -16,16 +16,13 @@ module.exports = withNextra(withPlausibleProxy()({ .map(([source, destination]) => ({ source, destination, - // TODO switch to true - permanent: false + permanent: true, })); return [ { source: '/docs/:path*.html', destination: '/docs/:path*', - // TODO enable permanent redirect when all pages are migrated - permanent: false, - // permanent: true, + permanent: true, }, ...redirectList, ] diff --git a/website/src/pages/news/02-bref-2.0.mdx b/website/src/pages/news/02-bref-2.0.mdx index c2fb66f07..63882550a 100644 --- a/website/src/pages/news/02-bref-2.0.mdx +++ b/website/src/pages/news/02-bref-2.0.mdx @@ -5,7 +5,6 @@ import { NextSeo } from 'next-seo'; openGraph={{ images: [ { - // TODO move the image to a public folder url: '/news/02-social-card.png', }, ], From 45ec7715389d2498c8f96be4a80688602d721e41 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 11 Oct 2023 21:49:25 +0200 Subject: [PATCH 144/144] Website: remove log --- website/theme.config.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/website/theme.config.jsx b/website/theme.config.jsx index a3782d99e..e20d64740 100644 --- a/website/theme.config.jsx +++ b/website/theme.config.jsx @@ -12,7 +12,6 @@ export default { }, useNextSeoProps() { const { asPath } = useRouter(); - console.log(asPath); // On SSG the path is `/index` instead of `/` for some reason if (asPath === '/' || asPath === '/index') { return {

        RUsC~MwlaR;d1NvaR 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