From 991890c93145643d13d35831fe4b1c0c49993aba Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Wed, 20 Dec 2023 16:32:35 +0100 Subject: [PATCH 01/10] remove bun file --- bun.lockb | Bin 1264 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 bun.lockb diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index d304cd81fc1e94d55f3eea14b644d056b45660be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1264 zcmY#Z)GsYA(of3F(@)JSQ%EY!;{sycoc!eMw9K4T-L(9o+{6;yG6OCq1_lO0ldpf; z+^>Jtx!wHyb)n&_NneisHQ6R1YIFO^yXJD~rUVwCA|L>%1py8S1*aRJ{3@6NFkga! zp`oBCwWK67wP@~^m8Gi|B$VBWGYHzGy|b4Qs)Jk#W|0Qa01Kc!%s?7sCMo8kt4HPk zDEvY^FV|2zr)#j$?}DcQ)hG7TXN+UtS9I-|_AJ7f^S?kO%))_ryRIW-%H-Jmdng+DMZ7zBXfghMG#VPtpW zRD>dN02(z{pfs0FaZ$2fW?pegVor`8ECK3;6s4xxDHs_j6lYeY=BMc>m?$LXWTxlk zr*XlI`}ZFLKzy(}K#>dtEKr)urqtNT4yX}_5e86oCPb(QnV$hw*92D|ZDbZ(Y5{bn z8Qcy-RA<7%7nZI$7~_of4D}2d7|uXVfzhbpP@I}umRh9eT2Yc(l$V$jTvC*omu{zE zh_J{4ZqW~@NfFRo2=q75O@>&Vl$?>8oSk1-+^k}~{GxQYGJRb*Qy1(fy^{1Qa0CoO0suTK+2sHL From 7434c79b82c5bdbf485c8656f684b1523c32cb48 Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Wed, 20 Dec 2023 16:32:47 +0100 Subject: [PATCH 02/10] rename API_KEY to PRIMER_API_KEY --- .env.example | 4 +++- src/api/const.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 48204cd..1bc4735 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,3 @@ -API_KEY= +# API key of your environment +PRIMER_API_KEY= + diff --git a/src/api/const.ts b/src/api/const.ts index 01f1b03..86b0b62 100644 --- a/src/api/const.ts +++ b/src/api/const.ts @@ -1,7 +1,7 @@ export const primerHeaders = { accept: "application/json", "content-type": "application/json", - "X-API-KEY": Deno.env.get("API_KEY"), + "X-API-KEY": Deno.env.get("PRIMER_API_KEY"), "X-API-VERSION": "2.2", }; From 5bd04b30cc64468774476dd3685a4f051aa84467 Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Wed, 20 Dec 2023 16:32:54 +0100 Subject: [PATCH 03/10] bring everything in a single file --- src/api/createClientSession.ts | 22 ----------- src/main.ts | 68 +++++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 32 deletions(-) delete mode 100644 src/api/createClientSession.ts diff --git a/src/api/createClientSession.ts b/src/api/createClientSession.ts deleted file mode 100644 index 298f745..0000000 --- a/src/api/createClientSession.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { post } from "../utils/post.ts"; -import { primerApiUrl, primerHeaders } from "./const.ts"; - -export function createClientSession(info: Info) { - return post( - `${primerApiUrl}/client-session`, - { - ...info, - orderId: crypto.randomUUID(), - }, - primerHeaders, - ); -} - -type Info = { - amount: number; - currencyCode: string; -}; - -type ClientSession = { - clientToken: string; -}; diff --git a/src/main.ts b/src/main.ts index 923cc18..16e7901 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,25 +1,73 @@ import { Hono } from "hono/mod.ts"; import "std/dotenv/load.ts"; -import { createClientSession } from "./api/createClientSession.ts"; +import { post } from "./utils/post.ts"; +import { primerApiUrl, primerHeaders } from "./api/const.ts"; const app = new Hono(); app.get("/", (c) => - c.text(["Available endpoints:", "", " POST /client-session"].join("\n")), + c.text(["Available endpoints:", "", " POST /client-session"].join("\n")) ); +/////////////////////////////////////////// +// Create a client session and send back the client token +/////////////////////////////////////////// + app.post("/client-session", async (c) => { - const { amount, currencyCode } = (await c.req.json()) as { - amount: number; - currencyCode: string; - }; + const res = await post( + `${primerApiUrl}/client-session`, + + /* ✨ Feel free to update this 👇 */ + { + orderId: crypto.randomUUID(), + + order: { + // Line items for this session + // If your checkout does not have line items: + // > Pass a single line item with the total amount! + lineItems: [ + { + itemId: "shoes-123", + description: "Some nice shoes!", + amount: 2500, // Amount should be in minor units! + quantity: 1, + }, + ], + }, + + currencyCode: "GBP", - const res = await createClientSession({ - amount, - currencyCode, - }); + // emailAddress and billingAddress are required for 3DS + customer: { + emailAddress: "test@test.com", + mobileNumber: "+6588889999", + firstName: "John", + lastName: "Smith", + billingAddress: { + firstName: "John", + lastName: "Smith", + postalCode: "CB94BQ", + addressLine1: "47A", + countryCode: "CL", + city: "Cambridge", + state: "Cambridgeshire", + }, + }, + }, + /* */ + + primerHeaders + ); return c.json(res); }); +type ClientSession = { + clientToken: string; +}; + +/////////////////////////////////////////// +// Serve +/////////////////////////////////////////// + await Deno.serve(app.fetch); From 66508e861e932d723b808df14eeadaf88211e977 Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Wed, 20 Dec 2023 17:06:24 +0100 Subject: [PATCH 04/10] update readme --- README.md | 61 ++++++++++++++++++++++++++++++--------- images/primer-banner.png | Bin 0 -> 38490 bytes 2 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 images/primer-banner.png diff --git a/README.md b/README.md index 60b9e48..ecf74c4 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,59 @@ -# Server Deno Hono +![Primer Banner](./images/primer-banner.png) -In this example we build a server to integrate with Primer's API. +# 🦄 Primer Example Backend -It uses [Deno](https://deno.land) as the runtime and [Hono](https://hono.dev) as the HTTP server framework, but feel free to build your server however you'd like. +This project is a very simple companion backend to the example apps of [Primer](https://primer.io) Universal Checkout: -## Running on your browser +- [example Web apps](#) +- [example iOS apps](https://github.com/primer-io/checkout-examples-ios) +- [example Android apps](https://github.com/primer-io/checkout-examples-android) -[Click here to immediately launch it on your browser](https://stackblitz.com/github/primer-io/checkout-web/tree/main/examples/server-deno-hono). +--- -Once it's open, make sure to: +_It uses [Deno](https://deno.land) as the runtime and [Hono](https://hono.dev) as the HTTP server framework._ -1. Create a new file `.env` and copy contents from `.env.example` into it -2. Get an `API_KEY` from your Primer Dashboard and paste it there - - Example: `API_KEY=1234-foo-bar-4321` +# 🚀 Get started -## Running locally +## ✅ Pre-requisites + +- A Primer sandbox account 🚀 + +- An API key for your Sandbox.
You can grab your API key or create a new one from the [Primer Dashboard](https://sandbox-dashboard.primer.io/developers/apiKeys). + +## ⚡️ Deploy on Glitch + +_We recommend using Glitch to quickly spin up a new instance of your server for free._ + +1. First, click on the following button to open up the project in Glitch + + [![remix With Glitch](https://cdn.glitch.com/2703baf2-b643-4da7-ab91-7ee2a2d00b5b%2Fremix-button-v2.svg?v=1622676640618)](https://glitch.com/edit/#!/import/github/primer-io/example-web-checkout) + +2. On Glitch, open the file `.env` and set the environment variable `PRIMER_API_KEY` to your Primer sandbox API key. + +3. On Glitch, grab the link of your Glitch instance. It should look like `https://xxx-yyy-zzz.glitch.me`. + +4. Paste this URL in the example project. + +## 👩‍💻 Run it locally + +1. First, make sure [Deno](https://deno.land) is installed on your machine +2. Clone this repository -1. Install [Deno](https://deno.land) -2. Follow the same instructions described on the section above about the `API_KEY` -3. Execute the following script on a terminal window: + ```sh + git clone https://github.com/primer-io/example-backend.git + + cd ./example-backend + ``` + +3. Clone the file `.env.example` and call it `.env`. Set the environment variable `PRIMER_API_KEY` to your Primer sandbox API key. + +4. Execute the following script on a terminal window: ```sh deno task start ``` + +# 🤖 Capabilities + +- `GET /`
Health check + +- `POST /client-session`
Create a client session diff --git a/images/primer-banner.png b/images/primer-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..70c17bfb741393f7cb8625efc64b21fc89b5c7c7 GIT binary patch literal 38490 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 Date: Wed, 20 Dec 2023 17:09:07 +0100 Subject: [PATCH 05/10] update readme --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ecf74c4..de23bd9 100644 --- a/README.md +++ b/README.md @@ -8,19 +8,17 @@ This project is a very simple companion backend to the example apps of [Primer]( - [example iOS apps](https://github.com/primer-io/checkout-examples-ios) - [example Android apps](https://github.com/primer-io/checkout-examples-android) ---- - _It uses [Deno](https://deno.land) as the runtime and [Hono](https://hono.dev) as the HTTP server framework._ # 🚀 Get started -## ✅ Pre-requisites +## Pre-requisites ✅ - A Primer sandbox account 🚀 - An API key for your Sandbox.
You can grab your API key or create a new one from the [Primer Dashboard](https://sandbox-dashboard.primer.io/developers/apiKeys). -## ⚡️ Deploy on Glitch +## Deploy on Glitch ⚡️ _We recommend using Glitch to quickly spin up a new instance of your server for free._ @@ -34,7 +32,7 @@ _We recommend using Glitch to quickly spin up a new instance of your server for 4. Paste this URL in the example project. -## 👩‍💻 Run it locally +## Run it locally 👩‍💻 1. First, make sure [Deno](https://deno.land) is installed on your machine 2. Clone this repository From afc9d39ebdac7df909201a258bba7d390aec2438 Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Wed, 20 Dec 2023 17:10:18 +0100 Subject: [PATCH 06/10] update readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index de23bd9..c0c1ebe 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ _It uses [Deno](https://deno.land) as the runtime and [Hono](https://hono.dev) a # 🚀 Get started -## Pre-requisites ✅ +## Pre-requisites - A Primer sandbox account 🚀 @@ -22,7 +22,7 @@ _It uses [Deno](https://deno.land) as the runtime and [Hono](https://hono.dev) a _We recommend using Glitch to quickly spin up a new instance of your server for free._ -1. First, click on the following button to open up the project in Glitch +1. First, click on the following button to open the project in Glitch and start the server. [![remix With Glitch](https://cdn.glitch.com/2703baf2-b643-4da7-ab91-7ee2a2d00b5b%2Fremix-button-v2.svg?v=1622676640618)](https://glitch.com/edit/#!/import/github/primer-io/example-web-checkout) @@ -32,10 +32,10 @@ _We recommend using Glitch to quickly spin up a new instance of your server for 4. Paste this URL in the example project. -## Run it locally 👩‍💻 +## Run it locally -1. First, make sure [Deno](https://deno.land) is installed on your machine -2. Clone this repository +1. First, make sure [Deno](https://deno.land) is installed on your machine. +2. Clone this repository: ```sh git clone https://github.com/primer-io/example-backend.git From 90ec50d11701247f9d0febb2aa562692cb6fb7af Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Wed, 20 Dec 2023 17:12:14 +0100 Subject: [PATCH 07/10] update readme --- README.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index c0c1ebe..ef5115e 100644 --- a/README.md +++ b/README.md @@ -4,33 +4,35 @@ This project is a very simple companion backend to the example apps of [Primer](https://primer.io) Universal Checkout: -- [example Web apps](#) -- [example iOS apps](https://github.com/primer-io/checkout-examples-ios) -- [example Android apps](https://github.com/primer-io/checkout-examples-android) +- [Example Web apps](#) +- [Example iOS apps](https://github.com/primer-io/checkout-examples-ios) +- [Example Android apps](https://github.com/primer-io/checkout-examples-android) -_It uses [Deno](https://deno.land) as the runtime and [Hono](https://hono.dev) as the HTTP server framework._ +--- + +_This server uses [Deno](https://deno.land) as the runtime and [Hono](https://hono.dev) as the HTTP server framework._ # 🚀 Get started ## Pre-requisites -- A Primer sandbox account 🚀 +- A Primer sandbox account 👤 -- An API key for your Sandbox.
You can grab your API key or create a new one from the [Primer Dashboard](https://sandbox-dashboard.primer.io/developers/apiKeys). +- An API key for your Sandbox 🔑
You can grab your API key or create a new one from the [Primer Dashboard](https://sandbox-dashboard.primer.io/developers/apiKeys). ## Deploy on Glitch ⚡️ _We recommend using Glitch to quickly spin up a new instance of your server for free._ -1. First, click on the following button to open the project in Glitch and start the server. +1. First, click on this button to open the project in Glitch and start the server. [![remix With Glitch](https://cdn.glitch.com/2703baf2-b643-4da7-ab91-7ee2a2d00b5b%2Fremix-button-v2.svg?v=1622676640618)](https://glitch.com/edit/#!/import/github/primer-io/example-web-checkout) -2. On Glitch, open the file `.env` and set the environment variable `PRIMER_API_KEY` to your Primer sandbox API key. +2. On Glitch, open the file `.env`.
Set the environment variable `PRIMER_API_KEY` to your Primer sandbox API key. -3. On Glitch, grab the link of your Glitch instance. It should look like `https://xxx-yyy-zzz.glitch.me`. +3. On Glitch, grab the URL of your Glitch instance.
It should look like `https://xxx-yyy-zzz.glitch.me`. -4. Paste this URL in the example project. +4. Paste your Glitch instance URL in the example project. ## Run it locally From cd41226c7e15bc0a38ab8d782b01fb2f2bbed2f3 Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Wed, 20 Dec 2023 17:17:25 +0100 Subject: [PATCH 08/10] add cors for web --- deno.lock | 25 +++++++++++++++++++++++++ src/main.ts | 4 ++++ 2 files changed, 29 insertions(+) diff --git a/deno.lock b/deno.lock index 0eb8e8b..a509ba0 100644 --- a/deno.lock +++ b/deno.lock @@ -3,15 +3,33 @@ "remote": { "https://deno.land/std@0.206.0/dotenv/load.ts": "0636983549b98f29ab75c9a22a42d9723f0a389ece5498fe971e7bb2556a12e2", "https://deno.land/std@0.206.0/dotenv/mod.ts": "039468f5c87d39b69d7ca6c3d68ebca82f206ec0ff5e011d48205eea292ea5a6", + "https://deno.land/x/hono@v3.10.1/adapter/deno/serve-static.ts": "ba10cf6aaf39da942b0d49c3b9877ddba69d41d414c6551d890beb1085f58eea", "https://deno.land/x/hono@v3.10.1/client/client.ts": "ff340f58041203879972dd368b011ed130c66914f789826610869a90603406bf", "https://deno.land/x/hono@v3.10.1/client/index.ts": "3ff4cf246f3543f827a85a2c84d66a025ac350ee927613629bda47e854bfb7ba", "https://deno.land/x/hono@v3.10.1/client/utils.ts": "053273c002963b549d38268a1b423ac8ca211a8028bdab1ed0b781a62aa5e661", "https://deno.land/x/hono@v3.10.1/compose.ts": "e8ab4b345aa367f2dd65f221c9fe829dd885326a613f4215b654f93a4066bb5c", "https://deno.land/x/hono@v3.10.1/context.ts": "261cc8b8b1e8f04b98beab1cca6692f317b7dc6d2b75b4f84c982e54cf1db730", "https://deno.land/x/hono@v3.10.1/helper/cookie/index.ts": "55ccd20bbd8d9a8bb2ecd998e90845c1d306c19027f54b3d1b89a5be35968b80", + "https://deno.land/x/hono@v3.10.1/helper/html/index.ts": "aba19e8d29f217c7fffa5719cf606c4e259b540d51296e82bbea3c992e2ecbc6", "https://deno.land/x/hono@v3.10.1/hono-base.ts": "cc55e0a4c63a7bdf44df3e804ea4737d5399eeb6606b45d102f8e48c3ff1e925", "https://deno.land/x/hono@v3.10.1/hono.ts": "2cc4c292e541463a4d6f83edbcea58048d203e9564ae62ec430a3d466b49a865", "https://deno.land/x/hono@v3.10.1/http-exception.ts": "6071df078b5f76d279684d52fe82a590f447a64ffe1b75eb5064d0c8a8d2d676", + "https://deno.land/x/hono@v3.10.1/jsx/index.ts": "019512d3a9b3897b879e87fa5fb179cd34f3d326f8ff8b93379c2bb707ec168a", + "https://deno.land/x/hono@v3.10.1/jsx/streaming.ts": "5d03b4d02eaa396c8f0f33c3f6e8c7ed3afb7598283c2d4a7ddea0ada8c212a7", + "https://deno.land/x/hono@v3.10.1/middleware.ts": "57b2047c4b9d775a052a9c44a3b805802c1d1cb477ab9c4bb6185d27382d1b96", + "https://deno.land/x/hono@v3.10.1/middleware/basic-auth/index.ts": "5505288ccf9364f56f7be2dfac841543b72e20656e54ac646a1a73a0aa853261", + "https://deno.land/x/hono@v3.10.1/middleware/bearer-auth/index.ts": "d11fe14e0a3006f6d35c391e455fe20d8ece9561e48b6a5580e4b87dd491cd90", + "https://deno.land/x/hono@v3.10.1/middleware/cache/index.ts": "9e5d31d33206bb5dba46dde16ed606dd2cb361d75c26b02e02c72bd1fb6fe53e", + "https://deno.land/x/hono@v3.10.1/middleware/compress/index.ts": "85d315c9a942d7758e5c524dc94b736124646a56752e56c6e4284f3989b4692a", + "https://deno.land/x/hono@v3.10.1/middleware/cors/index.ts": "d481eba7e05d3448cd326d3dca8b9c7e16ecf0d27a37fd7d700485834123ae5e", + "https://deno.land/x/hono@v3.10.1/middleware/etag/index.ts": "4ad675e108dc98dccca0e9e35cd903701669a1aea676b8b51266c3b602e4d54c", + "https://deno.land/x/hono@v3.10.1/middleware/jsx-renderer/index.ts": "5352d6dda872d419ebafbd4d6b408f66ad473fc3d395d82327850c1e786d7344", + "https://deno.land/x/hono@v3.10.1/middleware/jwt/index.ts": "c6e02a94a3911299d21392b3b1f8710bda7cacf0d60db59c0e2f0d9fa8ff1a70", + "https://deno.land/x/hono@v3.10.1/middleware/logger/index.ts": "c139f372f482baeffbad68b14bef990e011fe8df578dcee71fb612ffad7fe748", + "https://deno.land/x/hono@v3.10.1/middleware/powered-by/index.ts": "c36b7a3d1322c6a37f3d1510f7ff04a85aa6cacfac2173e5f1913eb16c3cc869", + "https://deno.land/x/hono@v3.10.1/middleware/pretty-json/index.ts": "f6967ceecdb42c95ddd5e2e7bc8545d3e8bda111fa659f3f1336b2e6fe6b0bb0", + "https://deno.land/x/hono@v3.10.1/middleware/secure-headers/index.ts": "d2b8a7978e3d201ead5ac8fd22e3adc9094189aebcba0d9cd51b98773927a5d5", + "https://deno.land/x/hono@v3.10.1/middleware/timing/index.ts": "d6976a07d9d51a7b26dae1311fe51d0744f7d234498bac3fe024ec7088c0ca47", "https://deno.land/x/hono@v3.10.1/mod.ts": "90114a97be9111b348129ad0143e764a64921f60dd03b8f3da529db98a0d3a82", "https://deno.land/x/hono@v3.10.1/request.ts": "52330303dd7a3bf4f580fde0463ba608bc4c88a8b7b5edd7c1327064c7cf65ce", "https://deno.land/x/hono@v3.10.1/router.ts": "39d573f48baee429810cd583c931dd44274273c30804d538c86967d310ea4ab5", @@ -32,6 +50,13 @@ "https://deno.land/x/hono@v3.10.1/utils/buffer.ts": "9066a973e64498cb262c7e932f47eed525a51677b17f90893862b7279dc0773e", "https://deno.land/x/hono@v3.10.1/utils/cookie.ts": "19920ba6756944aae1ad8585c3ddeaa9df479733f59d05359db096f7361e5e4b", "https://deno.land/x/hono@v3.10.1/utils/crypto.ts": "bda0e141bbe46d3a4a20f8fbcb6380d473b617123d9fdfa93e4499410b537acc", + "https://deno.land/x/hono@v3.10.1/utils/encode.ts": "3b7c7d736123b5073542b34321700d4dbf5ff129c138f434bb2144a4d425ee89", + "https://deno.land/x/hono@v3.10.1/utils/filepath.ts": "18461b055a914d6da85077f453051b516281bb17cf64fa74bf5ef604dc9d2861", + "https://deno.land/x/hono@v3.10.1/utils/html.ts": "01c1520a4256f899da1954357cf63ae11c348eda141a505f72d7090cf5481aba", + "https://deno.land/x/hono@v3.10.1/utils/jwt/index.ts": "5e4b82a42eb3603351dfce726cd781ca41cb57437395409d227131aec348d2d5", + "https://deno.land/x/hono@v3.10.1/utils/jwt/jwt.ts": "02ff7bbf1298ffcc7a40266842f8eac44b6c136453e32d4441e24d0cbfba3a95", + "https://deno.land/x/hono@v3.10.1/utils/jwt/types.ts": "58ddf908f76ba18d9c62ddfc2d1e40cc2e306bf987409a6169287efa81ce2546", + "https://deno.land/x/hono@v3.10.1/utils/mime.ts": "0105d2b5e8e91f07acc70f5d06b388313995d62af23c802fcfba251f5a744d95", "https://deno.land/x/hono@v3.10.1/utils/stream.ts": "1789dcc73c5b0ede28f83d7d34e47ae432c20e680907cb3275a9c9187f293983", "https://deno.land/x/hono@v3.10.1/utils/url.ts": "5fc3307ef3cb2e6f34ec2a03e3d7f2126c6a9f5f0eab677222df3f0e40bd7567", "https://deno.land/x/hono@v3.10.1/validator/index.ts": "6c986e8b91dcf857ecc8164a506ae8eea8665792a4ff7215471df669c632ae7c", diff --git a/src/main.ts b/src/main.ts index 16e7901..0cdbb7e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,10 +1,14 @@ import { Hono } from "hono/mod.ts"; +import { cors } from "hono/middleware.ts"; + import "std/dotenv/load.ts"; import { post } from "./utils/post.ts"; import { primerApiUrl, primerHeaders } from "./api/const.ts"; const app = new Hono(); +app.use("/*", cors()); + app.get("/", (c) => c.text(["Available endpoints:", "", " POST /client-session"].join("\n")) ); From cf04c464c7f4fdf45128a253fe84dabb2353b4be Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Mon, 8 Jan 2024 15:38:29 +0100 Subject: [PATCH 09/10] move to npm --- .github/workflows/lint.yml | 24 - .gitignore | 4 +- .nvmrc | 1 + README.md | 25 +- deno.json | 9 - deno.lock | 65 -- package-lock.json | 1829 ++++++++++++++++++++++++++++++++++++ package.json | 30 +- src/api/const.ts | 2 +- src/{main.ts => server.ts} | 40 +- src/utils/post.ts | 4 +- yarn.lock | 8 - 12 files changed, 1901 insertions(+), 140 deletions(-) delete mode 100644 .github/workflows/lint.yml create mode 100644 .nvmrc delete mode 100644 deno.json delete mode 100644 deno.lock create mode 100644 package-lock.json rename src/{main.ts => server.ts} (65%) delete mode 100644 yarn.lock diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 9643a77..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: lint - -on: - pull_request: - types: - - opened - - edited - - synchronize - branches: - - main - -jobs: - lint: - runs-on: ubuntu-latest - permissions: - pull-requests: write - steps: - - uses: actions/checkout@v3 - - - uses: oven-sh/setup-bun@v1 - - - run: bun i --frozen-lockfile - - - run: bun run lint:prettier diff --git a/.gitignore b/.gitignore index a2e04e4..6db4613 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +dist node_modules -.env \ No newline at end of file +.env +.DS_Store \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..19c7bdb --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +16 \ No newline at end of file diff --git a/README.md b/README.md index ef5115e..dcfe434 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,15 @@ -![Primer Banner](./images/primer-banner.png) +![Primer Banner](https://github.com/xevious78/example-backend/raw/main/images/primer-banner.png) -# 🦄 Primer Example Backend +# 💳 Primer Example Backend This project is a very simple companion backend to the example apps of [Primer](https://primer.io) Universal Checkout: -- [Example Web apps](#) - [Example iOS apps](https://github.com/primer-io/checkout-examples-ios) - [Example Android apps](https://github.com/primer-io/checkout-examples-android) --- -_This server uses [Deno](https://deno.land) as the runtime and [Hono](https://hono.dev) as the HTTP server framework._ +_This server uses [Node](https://nodejs.org/) as the runtime (v16 to be compatible with Glitch) and [Fastify](https://fastify.dev/) as the HTTP server framework._ # 🚀 Get started @@ -24,9 +23,9 @@ _This server uses [Deno](https://deno.land) as the runtime and [Hono](https://ho _We recommend using Glitch to quickly spin up a new instance of your server for free._ -1. First, click on this button to open the project in Glitch and start the server. +1. First, click on this button to open the project in Glitch and start the server.
_It may take a moment to start._ - [![remix With Glitch](https://cdn.glitch.com/2703baf2-b643-4da7-ab91-7ee2a2d00b5b%2Fremix-button-v2.svg?v=1622676640618)](https://glitch.com/edit/#!/import/github/primer-io/example-web-checkout) + [![Remix With Glitch](https://cdn.glitch.com/2703baf2-b643-4da7-ab91-7ee2a2d00b5b%2Fremix-button-v2.svg?v=1622676640618)](https://glitch.com/edit/#!/import/github/xevious78/example-backend) 2. On Glitch, open the file `.env`.
Set the environment variable `PRIMER_API_KEY` to your Primer sandbox API key. @@ -36,7 +35,7 @@ _We recommend using Glitch to quickly spin up a new instance of your server for ## Run it locally -1. First, make sure [Deno](https://deno.land) is installed on your machine. +1. First, make sure [Node](https://nodejs.org) is installed on your machine. 2. Clone this repository: ```sh @@ -45,11 +44,17 @@ _We recommend using Glitch to quickly spin up a new instance of your server for cd ./example-backend ``` -3. Clone the file `.env.example` and call it `.env`. Set the environment variable `PRIMER_API_KEY` to your Primer sandbox API key. +3. Install the dependencies: -4. Execute the following script on a terminal window: ```sh - deno task start + npm install + ``` + +4. Clone the file `.env.example` and call it `.env`. Set the environment variable `PRIMER_API_KEY` to your Primer sandbox API key. + +5. Execute the following script on a terminal window: + ```sh + npm start ``` # 🤖 Capabilities diff --git a/deno.json b/deno.json deleted file mode 100644 index dfa5fae..0000000 --- a/deno.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "imports": { - "hono/": "https://deno.land/x/hono@v3.10.1/", - "std/": "https://deno.land/std@0.206.0/" - }, - "tasks": { - "start": "deno run --allow-env --allow-net --allow-read --watch src/main.ts" - } -} diff --git a/deno.lock b/deno.lock deleted file mode 100644 index a509ba0..0000000 --- a/deno.lock +++ /dev/null @@ -1,65 +0,0 @@ -{ - "version": "3", - "remote": { - "https://deno.land/std@0.206.0/dotenv/load.ts": "0636983549b98f29ab75c9a22a42d9723f0a389ece5498fe971e7bb2556a12e2", - "https://deno.land/std@0.206.0/dotenv/mod.ts": "039468f5c87d39b69d7ca6c3d68ebca82f206ec0ff5e011d48205eea292ea5a6", - "https://deno.land/x/hono@v3.10.1/adapter/deno/serve-static.ts": "ba10cf6aaf39da942b0d49c3b9877ddba69d41d414c6551d890beb1085f58eea", - "https://deno.land/x/hono@v3.10.1/client/client.ts": "ff340f58041203879972dd368b011ed130c66914f789826610869a90603406bf", - "https://deno.land/x/hono@v3.10.1/client/index.ts": "3ff4cf246f3543f827a85a2c84d66a025ac350ee927613629bda47e854bfb7ba", - "https://deno.land/x/hono@v3.10.1/client/utils.ts": "053273c002963b549d38268a1b423ac8ca211a8028bdab1ed0b781a62aa5e661", - "https://deno.land/x/hono@v3.10.1/compose.ts": "e8ab4b345aa367f2dd65f221c9fe829dd885326a613f4215b654f93a4066bb5c", - "https://deno.land/x/hono@v3.10.1/context.ts": "261cc8b8b1e8f04b98beab1cca6692f317b7dc6d2b75b4f84c982e54cf1db730", - "https://deno.land/x/hono@v3.10.1/helper/cookie/index.ts": "55ccd20bbd8d9a8bb2ecd998e90845c1d306c19027f54b3d1b89a5be35968b80", - "https://deno.land/x/hono@v3.10.1/helper/html/index.ts": "aba19e8d29f217c7fffa5719cf606c4e259b540d51296e82bbea3c992e2ecbc6", - "https://deno.land/x/hono@v3.10.1/hono-base.ts": "cc55e0a4c63a7bdf44df3e804ea4737d5399eeb6606b45d102f8e48c3ff1e925", - "https://deno.land/x/hono@v3.10.1/hono.ts": "2cc4c292e541463a4d6f83edbcea58048d203e9564ae62ec430a3d466b49a865", - "https://deno.land/x/hono@v3.10.1/http-exception.ts": "6071df078b5f76d279684d52fe82a590f447a64ffe1b75eb5064d0c8a8d2d676", - "https://deno.land/x/hono@v3.10.1/jsx/index.ts": "019512d3a9b3897b879e87fa5fb179cd34f3d326f8ff8b93379c2bb707ec168a", - "https://deno.land/x/hono@v3.10.1/jsx/streaming.ts": "5d03b4d02eaa396c8f0f33c3f6e8c7ed3afb7598283c2d4a7ddea0ada8c212a7", - "https://deno.land/x/hono@v3.10.1/middleware.ts": "57b2047c4b9d775a052a9c44a3b805802c1d1cb477ab9c4bb6185d27382d1b96", - "https://deno.land/x/hono@v3.10.1/middleware/basic-auth/index.ts": "5505288ccf9364f56f7be2dfac841543b72e20656e54ac646a1a73a0aa853261", - "https://deno.land/x/hono@v3.10.1/middleware/bearer-auth/index.ts": "d11fe14e0a3006f6d35c391e455fe20d8ece9561e48b6a5580e4b87dd491cd90", - "https://deno.land/x/hono@v3.10.1/middleware/cache/index.ts": "9e5d31d33206bb5dba46dde16ed606dd2cb361d75c26b02e02c72bd1fb6fe53e", - "https://deno.land/x/hono@v3.10.1/middleware/compress/index.ts": "85d315c9a942d7758e5c524dc94b736124646a56752e56c6e4284f3989b4692a", - "https://deno.land/x/hono@v3.10.1/middleware/cors/index.ts": "d481eba7e05d3448cd326d3dca8b9c7e16ecf0d27a37fd7d700485834123ae5e", - "https://deno.land/x/hono@v3.10.1/middleware/etag/index.ts": "4ad675e108dc98dccca0e9e35cd903701669a1aea676b8b51266c3b602e4d54c", - "https://deno.land/x/hono@v3.10.1/middleware/jsx-renderer/index.ts": "5352d6dda872d419ebafbd4d6b408f66ad473fc3d395d82327850c1e786d7344", - "https://deno.land/x/hono@v3.10.1/middleware/jwt/index.ts": "c6e02a94a3911299d21392b3b1f8710bda7cacf0d60db59c0e2f0d9fa8ff1a70", - "https://deno.land/x/hono@v3.10.1/middleware/logger/index.ts": "c139f372f482baeffbad68b14bef990e011fe8df578dcee71fb612ffad7fe748", - "https://deno.land/x/hono@v3.10.1/middleware/powered-by/index.ts": "c36b7a3d1322c6a37f3d1510f7ff04a85aa6cacfac2173e5f1913eb16c3cc869", - "https://deno.land/x/hono@v3.10.1/middleware/pretty-json/index.ts": "f6967ceecdb42c95ddd5e2e7bc8545d3e8bda111fa659f3f1336b2e6fe6b0bb0", - "https://deno.land/x/hono@v3.10.1/middleware/secure-headers/index.ts": "d2b8a7978e3d201ead5ac8fd22e3adc9094189aebcba0d9cd51b98773927a5d5", - "https://deno.land/x/hono@v3.10.1/middleware/timing/index.ts": "d6976a07d9d51a7b26dae1311fe51d0744f7d234498bac3fe024ec7088c0ca47", - "https://deno.land/x/hono@v3.10.1/mod.ts": "90114a97be9111b348129ad0143e764a64921f60dd03b8f3da529db98a0d3a82", - "https://deno.land/x/hono@v3.10.1/request.ts": "52330303dd7a3bf4f580fde0463ba608bc4c88a8b7b5edd7c1327064c7cf65ce", - "https://deno.land/x/hono@v3.10.1/router.ts": "39d573f48baee429810cd583c931dd44274273c30804d538c86967d310ea4ab5", - "https://deno.land/x/hono@v3.10.1/router/linear-router/index.ts": "8a2a7144c50b1f4a92d9ee99c2c396716af144c868e10608255f969695efccd0", - "https://deno.land/x/hono@v3.10.1/router/linear-router/router.ts": "bc63e8b5bc1dabc815306d50bebd1bb5877ffa3936ba2ad7550d093c95ee6bd1", - "https://deno.land/x/hono@v3.10.1/router/pattern-router/index.ts": "304a66c50e243872037ed41c7dd79ed0c89d815e17e172e7ad7cdc4bc07d3383", - "https://deno.land/x/hono@v3.10.1/router/pattern-router/router.ts": "a9a5a2a182cce8c3ae82139892cc0502be7dd8f579f31e76d0302b19b338e548", - "https://deno.land/x/hono@v3.10.1/router/reg-exp-router/index.ts": "52755829213941756159b7a963097bafde5cc4fc22b13b1c7c9184dc0512d1db", - "https://deno.land/x/hono@v3.10.1/router/reg-exp-router/node.ts": "5b3fb80411db04c65df066e69fedb2c8c0844753c2633d703336de84d569252c", - "https://deno.land/x/hono@v3.10.1/router/reg-exp-router/router.ts": "fbe8917aa24fe25d0208bfa82ce7f49ba0507f9ae158d4d0c177f6a061b0a561", - "https://deno.land/x/hono@v3.10.1/router/reg-exp-router/trie.ts": "852ce7207e6701e47fa30889a0d2b8bfcd56d8862c97e7bc9831e0a64bd8835f", - "https://deno.land/x/hono@v3.10.1/router/smart-router/index.ts": "74f9b4fe15ea535900f2b9b048581915f12fe94e531dd2b0032f5610e61c3bef", - "https://deno.land/x/hono@v3.10.1/router/smart-router/router.ts": "71979c06b32b093960a6e8efc4c185e558f280bff18846b8b1cdc757ade6ff99", - "https://deno.land/x/hono@v3.10.1/router/trie-router/index.ts": "3eb75e7f71ba81801631b30de6b1f5cefb2c7239c03797e2b2cbab5085911b41", - "https://deno.land/x/hono@v3.10.1/router/trie-router/node.ts": "3af15fa9c9994a8664a2b7a7c11233504b5bb9d4fcf7bb34cf30d7199052c39f", - "https://deno.land/x/hono@v3.10.1/router/trie-router/router.ts": "54ced78d35676302c8fcdda4204f7bdf5a7cc907fbf9967c75674b1e394f830d", - "https://deno.land/x/hono@v3.10.1/utils/body.ts": "7a16a6656331a96bcae57642f8d5e3912bd361cbbcc2c0d2157ecc3f218f7a92", - "https://deno.land/x/hono@v3.10.1/utils/buffer.ts": "9066a973e64498cb262c7e932f47eed525a51677b17f90893862b7279dc0773e", - "https://deno.land/x/hono@v3.10.1/utils/cookie.ts": "19920ba6756944aae1ad8585c3ddeaa9df479733f59d05359db096f7361e5e4b", - "https://deno.land/x/hono@v3.10.1/utils/crypto.ts": "bda0e141bbe46d3a4a20f8fbcb6380d473b617123d9fdfa93e4499410b537acc", - "https://deno.land/x/hono@v3.10.1/utils/encode.ts": "3b7c7d736123b5073542b34321700d4dbf5ff129c138f434bb2144a4d425ee89", - "https://deno.land/x/hono@v3.10.1/utils/filepath.ts": "18461b055a914d6da85077f453051b516281bb17cf64fa74bf5ef604dc9d2861", - "https://deno.land/x/hono@v3.10.1/utils/html.ts": "01c1520a4256f899da1954357cf63ae11c348eda141a505f72d7090cf5481aba", - "https://deno.land/x/hono@v3.10.1/utils/jwt/index.ts": "5e4b82a42eb3603351dfce726cd781ca41cb57437395409d227131aec348d2d5", - "https://deno.land/x/hono@v3.10.1/utils/jwt/jwt.ts": "02ff7bbf1298ffcc7a40266842f8eac44b6c136453e32d4441e24d0cbfba3a95", - "https://deno.land/x/hono@v3.10.1/utils/jwt/types.ts": "58ddf908f76ba18d9c62ddfc2d1e40cc2e306bf987409a6169287efa81ce2546", - "https://deno.land/x/hono@v3.10.1/utils/mime.ts": "0105d2b5e8e91f07acc70f5d06b388313995d62af23c802fcfba251f5a744d95", - "https://deno.land/x/hono@v3.10.1/utils/stream.ts": "1789dcc73c5b0ede28f83d7d34e47ae432c20e680907cb3275a9c9187f293983", - "https://deno.land/x/hono@v3.10.1/utils/url.ts": "5fc3307ef3cb2e6f34ec2a03e3d7f2126c6a9f5f0eab677222df3f0e40bd7567", - "https://deno.land/x/hono@v3.10.1/validator/index.ts": "6c986e8b91dcf857ecc8164a506ae8eea8665792a4ff7215471df669c632ae7c", - "https://deno.land/x/hono@v3.10.1/validator/validator.ts": "afa5e52495e0996fbba61996736fab5c486590d72d376f809e9f9ff4e0c463e9" - } -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..748ec1a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1829 @@ +{ + "name": "@primer-io/example-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@primer-io/example-backend", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@fastify/cors": "^8.5.0", + "dotenv": "^16.3.1", + "fastify": "^4.24.3", + "node-fetch": "^3.3.2" + }, + "devDependencies": { + "@types/node": "^20.10.5", + "concurrently": "^8.2.2", + "esbuild": "^0.19.5", + "nodemon": "^3.0.2", + "typescript": "^5.2.2" + }, + "engines": { + "node": "16.x" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", + "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/cors": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-8.5.0.tgz", + "integrity": "sha512-/oZ1QSb02XjP0IK1U0IXktEsw/dUBTxJOW7IpIeO8c/tNalw/KjoNSJv1Sf6eqoBPO+TDGkifq6ynFK3v68HFQ==", + "dependencies": { + "fastify-plugin": "^4.0.0", + "mnemonist": "0.39.6" + } + }, + "node_modules/@fastify/deepmerge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", + "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" + }, + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.1.tgz", + "integrity": "sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==", + "dependencies": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1" + } + }, + "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/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", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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.2.1" + } + }, + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "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/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stringify": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.9.1.tgz", + "integrity": "sha512-NMrf+uU9UJnTzfxaumMDXK1NWqtPCfGoM9DYIE+ESlaTQqjlANFBy0VAbsm6FB88Mx0nceyi18zTo5kIEUlzxg==", + "dependencies": { + "@fastify/deepmerge": "^1.0.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-uri": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.3.0.tgz", + "integrity": "sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==" + }, + "node_modules/fastify": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.24.3.tgz", + "integrity": "sha512-6HHJ+R2x2LS3y1PqxnwEIjOTZxFl+8h4kSC/TuDPXtA+v2JnV9yEtOsNSKK1RMD7sIR2y1ZsA4BEFaid/cK5pg==", + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.2.1", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^7.7.0", + "light-my-request": "^5.11.0", + "pino": "^8.16.0", + "process-warning": "^2.2.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==" + }, + "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/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-my-way": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", + "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "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/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "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" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/light-my-request": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", + "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "dependencies": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "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/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/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mnemonist": { + "version": "0.39.6", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.6.tgz", + "integrity": "sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "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/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/nodemon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", + "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/picomatch": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.16.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.2.tgz", + "integrity": "sha512-2advCDGVEvkKu9TTVSa/kWW7Z3htI/sBKEZpqiHk6ive0i/7f5b1rsU8jn0aimxqfnSz5bj/nOYkwhBUn5xxvg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.0.tgz", + "integrity": "sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "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/safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "dependencies": { + "ret": "~0.2.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, + "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/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toad-cache": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", + "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json index a3c0340..8396f21 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,31 @@ { - "name": "checkout-example-backend", + "name": "@primer-io/example-backend", + "type": "module", "version": "1.0.0", - "main": "src/main.ts", - "repository": "git@github.com:primer-io/example-backend.git", - "author": "Jack Newcombe ", + "private": true, + "author": "@primer-io", "license": "MIT", "scripts": { - "lint:prettier": "prettier . --ignore-path .gitignore --check", - "format:prettier": "prettier . --ignore-path .gitignore --write" + "start": "concurrently npm:start:*", + "start:build": "npm run build -- --watch", + "start:server": "nodemon dist/server.js", + "prestart": "npm run build", + "build": "esbuild src/server.ts --bundle --format=esm --outfile=dist/server.js --packages=external --platform=node --target=esnext" + }, + "engines": { + "node": "16.x" + }, + "dependencies": { + "@fastify/cors": "^8.5.0", + "dotenv": "^16.3.1", + "fastify": "^4.24.3", + "node-fetch": "^3.3.2" }, "devDependencies": { - "prettier": "^3.1.1" + "@types/node": "^20.10.5", + "concurrently": "^8.2.2", + "esbuild": "^0.19.5", + "nodemon": "^3.0.2", + "typescript": "^5.2.2" } } diff --git a/src/api/const.ts b/src/api/const.ts index 86b0b62..07cf826 100644 --- a/src/api/const.ts +++ b/src/api/const.ts @@ -1,7 +1,7 @@ export const primerHeaders = { accept: "application/json", "content-type": "application/json", - "X-API-KEY": Deno.env.get("PRIMER_API_KEY"), + "X-API-KEY": process.env.PRIMER_API_KEY || "", "X-API-VERSION": "2.2", }; diff --git a/src/main.ts b/src/server.ts similarity index 65% rename from src/main.ts rename to src/server.ts index 0cdbb7e..11d8967 100644 --- a/src/main.ts +++ b/src/server.ts @@ -1,16 +1,18 @@ -import { Hono } from "hono/mod.ts"; -import { cors } from "hono/middleware.ts"; +import "dotenv/config"; +import fastify from "fastify"; +import cors from "@fastify/cors"; +import { randomUUID } from "node:crypto"; -import "std/dotenv/load.ts"; import { post } from "./utils/post.ts"; import { primerApiUrl, primerHeaders } from "./api/const.ts"; -const app = new Hono(); - -app.use("/*", cors()); +const app = fastify(); +await app.register(cors, { + origin: true, +}); -app.get("/", (c) => - c.text(["Available endpoints:", "", " POST /client-session"].join("\n")) +app.get("/", () => + ["Available endpoints:", "", " POST /client-session"].join("\n") ); /////////////////////////////////////////// @@ -21,9 +23,10 @@ app.post("/client-session", async (c) => { const res = await post( `${primerApiUrl}/client-session`, - /* ✨ Feel free to update this 👇 */ + // ✨ Feel free to update this 👇 + // Check the API reference here: https://apiref.primer.io/reference/create_client_side_token_client_session_post { - orderId: crypto.randomUUID(), + orderId: randomUUID(), order: { // Line items for this session @@ -33,7 +36,8 @@ app.post("/client-session", async (c) => { { itemId: "shoes-123", description: "Some nice shoes!", - amount: 2500, // Amount should be in minor units! + // Amount should be in minor units! + amount: 2500, quantity: 1, }, ], @@ -58,12 +62,11 @@ app.post("/client-session", async (c) => { }, }, }, - /* */ primerHeaders ); - return c.json(res); + return res; }); type ClientSession = { @@ -74,4 +77,13 @@ type ClientSession = { // Serve /////////////////////////////////////////// -await Deno.serve(app.fetch); +const port = 3000; + +try { + await app.listen({ port }); +} catch (err) { + app.log.error(err); + process.exit(1); +} + +console.log("🚀 Server running on", `http://localhost:${port}`); diff --git a/src/utils/post.ts b/src/utils/post.ts index d81f9b5..9fa936f 100644 --- a/src/utils/post.ts +++ b/src/utils/post.ts @@ -1,7 +1,9 @@ +import fetch from "node-fetch"; + export async function post( url: string, body: Record, - headers?: HeadersInit, + headers?: HeadersInit ) { const response = await fetch(url, { ...(body && { body: JSON.stringify(body) }), diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 77a4bfb..0000000 --- a/yarn.lock +++ /dev/null @@ -1,8 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -prettier@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.1.tgz#6ba9f23165d690b6cbdaa88cb0807278f7019848" - integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw== From 26310aba8f675aafaba7906a2f40ca25d6f6e3c6 Mon Sep 17 00:00:00 2001 From: Aladin Taleb Date: Mon, 8 Jan 2024 15:39:02 +0100 Subject: [PATCH 10/10] move to primer-io --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dcfe434..bb39939 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Primer Banner](https://github.com/xevious78/example-backend/raw/main/images/primer-banner.png) +![Primer Banner](https://github.com/primer-io/example-backend/raw/main/images/primer-banner.png) # 💳 Primer Example Backend @@ -25,7 +25,7 @@ _We recommend using Glitch to quickly spin up a new instance of your server for 1. First, click on this button to open the project in Glitch and start the server.
_It may take a moment to start._ - [![Remix With Glitch](https://cdn.glitch.com/2703baf2-b643-4da7-ab91-7ee2a2d00b5b%2Fremix-button-v2.svg?v=1622676640618)](https://glitch.com/edit/#!/import/github/xevious78/example-backend) + [![Remix With Glitch](https://cdn.glitch.com/2703baf2-b643-4da7-ab91-7ee2a2d00b5b%2Fremix-button-v2.svg?v=1622676640618)](https://glitch.com/edit/#!/import/github/primer-io/example-backend) 2. On Glitch, open the file `.env`.
Set the environment variable `PRIMER_API_KEY` to your Primer sandbox API key.