diff --git a/.github/workflows/build-deploy-web-app.yaml b/.github/workflows/build-deploy-web-app.yaml deleted file mode 100644 index c5d92c27..00000000 --- a/.github/workflows/build-deploy-web-app.yaml +++ /dev/null @@ -1,71 +0,0 @@ -name: Build and deploy web app -on: - push: - branches: - - main - paths: - - ".github/workflows/build-deploy-web-app.yaml" - - "public/**" - - "summary/**" - - "util/build.sh" - - ".detaignore" - - "index.js" - - "package-lock.json" - - "package.json" - - pull_request: - branches: - - main - paths: - - "public/**" - - "summary/**" - - "util/build.sh" - - "index.js" - - "package-lock.json" - - "package.json" - - workflow_dispatch: # Allows manual execution of workflow - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Install dependencies - run: npm install - - - name: Perform linting check - run: npm run lint:check - - build: - if: startsWith(github.ref, 'refs/pull/') - runs-on: ubuntu-latest - container: "docker://asciidoctor/docker-asciidoctor:latest" - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Build summary pages using Asciidoctor Jet - run: ./util/build.sh - - build-and-deploy: - needs: lint - if: startsWith(github.ref, 'refs/heads/') - runs-on: ubuntu-latest - container: "docker://asciidoctor/docker-asciidoctor:latest" - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Build summary pages using Asciidoctor Jet - run: ./util/build.sh - - - name: Deploy to Deta - uses: HarshKapadia2/deta-deploy@v1.0.2 - with: - deta-access-token: ${{ secrets.DETA_TOKEN }} - deta-name: web-app-micro - deta-project: catchup - deta-project-dir: "." diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 00000000..2538a1a7 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,37 @@ +name: Build web app +on: + pull_request: + branches: + - main + paths: + - "public/**" + - "summary/**" + - "util/build.sh" + - "index.js" + - "package-lock.json" + - "package.json" + + workflow_dispatch: # Allows manual execution of workflow + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install dependencies + run: npm ci + + - name: Perform linting check + run: npm run lint:check + + build: + runs-on: ubuntu-latest + container: "docker://asciidoctor/docker-asciidoctor:latest" + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Build summary pages using Asciidoctor Jet + run: ./util/build.sh diff --git a/.gitignore b/.gitignore index a5a8b8fa..0aef4d28 100644 --- a/.gitignore +++ b/.gitignore @@ -2,14 +2,13 @@ node_modules .env -public/css/summary/ -public/js/summary/ -public/img/summary/ -public/html/summary/ +build summary/autogenerated-combined-summary.adoc summary/map.json +netlify/edge-functions/common/built-catchup-numbers.ts + .deta .vercel .space diff --git a/.prettierignore b/.prettierignore index 8aba0a43..edda2b1f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,3 @@ -.deta .vscode node_modules .env - -public/css/summary/ -public/js/summary/ -public/img/summary/ -public/html/summary/ diff --git a/.prettierrc b/.prettierrc index 1a80af9c..b66d218b 100644 --- a/.prettierrc +++ b/.prettierrc @@ -7,7 +7,6 @@ "filepath": "", "htmlWhitespaceSensitivity": "css", "insertPragma": false, - "jsxBracketSameLine": false, "jsxSingleQuote": false, "overrides": [], "plugins": [], diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 00000000..26c761da --- /dev/null +++ b/netlify.toml @@ -0,0 +1,9 @@ +[[redirects]] +from = "/cfp" +to = "https://talks.ourtech.community" +status = 302 + +[[redirects]] +from = "/ideas" +to = "https://docs.google.com/document/d/1K67G2_0w3-MEOcrakJrvStwHDz4zhlSliycHDa5oTGk/edit?usp=sharing" +status = 302 diff --git a/netlify/edge-functions/attend.ts b/netlify/edge-functions/attend.ts new file mode 100644 index 00000000..c88c4976 --- /dev/null +++ b/netlify/edge-functions/attend.ts @@ -0,0 +1,34 @@ +import { getStore } from "@netlify/blobs"; +import type { Config, Context } from "@netlify/edge-functions"; +import { STORE_NAME, CONFIG_KEY } from "./common/config.ts"; + +export default async function ( + req: Request, + context: Context +): Promise { + let date = new Date( + new Date().toLocaleString("en-US", { timeZone: "Asia/Kolkata" }) + ); + + let day = date.getDay(); // 6 is Saturday, 0 is Sunday + let redirectUrl = "/?isCatchUpOn=false"; + + if (day === 6 || day === 0) { + // 6 is Saturday, 0 is Sunday + let config = await getStore(STORE_NAME).get(CONFIG_KEY, { + type: "json" + }); + if (!config?.catchUpLink) + return new Response( + "internal server error: could not fetch redirect config", + { status: 500 } + ); + redirectUrl = config.catchUpLink; + } + + return Response.redirect(redirectUrl); +} + +export const config: Config = { + path: "/attend" +}; diff --git a/netlify/edge-functions/catchUpLink.ts b/netlify/edge-functions/catchUpLink.ts new file mode 100644 index 00000000..312c6414 --- /dev/null +++ b/netlify/edge-functions/catchUpLink.ts @@ -0,0 +1,85 @@ +import { getStore } from "@netlify/blobs"; +import type { Config, Context } from "@netlify/edge-functions"; +import { STORE_NAME, CONFIG_KEY } from "./common/config.ts"; + +export default async function ( + req: Request, + context: Context +): Promise { + if (req.method == "GET") { + const config = await getStore(STORE_NAME).get(CONFIG_KEY, { + type: "json" + }); + return new Response(JSON.stringify(config, null, 4), { + headers: { + "content-type": "application/json" + } + }); + } + + let authResponse = auth(req); + if (authResponse) authResponse; + + let link; + const contentType = req.headers.get("content-type"); + if (!contentType || contentType.includes("application/json")) { + const body = await req.json(); + link = body.catchUpLink; + } else if (contentType.includes("application/x-www-form-urlencoded")) { + const body = await req.formData(); + link = body.get("catchUpLink"); + } else + return new Response( + `Error: Unsupported content-type ${contentType}\n` + + `Expected one of: "application/json" or "application/x-www-form-urlencoded"`, + { + status: 415 + } + ); + + try { + new URL(link); + } catch (e: any) { + return new Response( + `Error: Could not set CatchUp link ${link}: ${e?.message}`, + { + status: 400 + } + ); + } + await getStore(STORE_NAME).setJSON(CONFIG_KEY, { + catchUpLink: link, + lastUpdated: new Date().toISOString() + }); + + return new Response(`Meet link changed to ${link}.`); +} + +function auth(req: Request): Response | null { + const authHeader = req.headers.get("authorization"); + if (authHeader) { + let [username, password] = Buffer.from( + authHeader.split(" ")[1], + "base64" + ) + .toString() + .split(":"); + + if ( + username === process.env.ADMIN_USERNAME && + password === process.env.ADMIN_PASSWORD + ) + return null; + } + + return new Response(null, { + status: 401, + headers: { + "WWW-Authenticate": "Basic" + } + }); +} + +export const config: Config = { + path: "/api/catchUpLink" +}; diff --git a/netlify/edge-functions/catchupNumber.ts b/netlify/edge-functions/catchupNumber.ts new file mode 100644 index 00000000..3f4ec32c --- /dev/null +++ b/netlify/edge-functions/catchupNumber.ts @@ -0,0 +1,35 @@ +import type { Config, Context } from "@netlify/edge-functions"; +import allCatchupNumbers from "./common/built-catchup-numbers.ts"; + +export default async function ( + req: Request, + context: Context +): Promise { + let catchupNumber = context.params.catchupNumber?.toLowerCase(); + + if (catchupNumber === "latest" || catchupNumber === "random") { + let index = -1; + if (catchupNumber === "latest") index = 0; + else if (catchupNumber === "random") + index = Math.floor(Math.random() * allCatchupNumbers.length); + return Response.redirect( + new URL(`/summary/${allCatchupNumbers[index]}`, req.url) + ); + } + + let parsedCatchupNumber = parseInt(catchupNumber); + // if entered path is not canonical but exists, redirect to the canonical path + if ( + allCatchupNumbers.includes(parsedCatchupNumber) && + catchupNumber !== parsedCatchupNumber.toString() + ) + return Response.redirect( + new URL(`/summary/${parsedCatchupNumber}`, req.url) + ); + // else, let netlify handle the response (success or 404) + else return context.next(); +} + +export const config: Config = { + path: "/summary/:catchupNumber" +}; diff --git a/netlify/edge-functions/common/config.ts b/netlify/edge-functions/common/config.ts new file mode 100644 index 00000000..25777751 --- /dev/null +++ b/netlify/edge-functions/common/config.ts @@ -0,0 +1,2 @@ +export const STORE_NAME = "catchup"; +export const CONFIG_KEY = "config"; diff --git a/package-lock.json b/package-lock.json index 9b481f9b..a3479ac0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,38 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "deta": "^1.1.0", - "dotenv": "^16.3.1", - "express": "^4.18.2" + "@netlify/blobs": "^8.0.1", + "@netlify/edge-functions": "^2.5.1", + "dotenv": "^16.3.1" }, "devDependencies": { + "@types/node": "^20.11.17", "nodemon": "^3.0.0", - "prettier": "2.7.1" + "prettier": "2.7.1", + "typescript": "^5.3.3" + } + }, + "node_modules/@netlify/blobs": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-8.0.1.tgz", + "integrity": "sha512-IrZHVqillU0x12eDbsap4Ba6poi+4IdVCYjZa+tA0eD95TaSbSqfw1zNkO27MiKw0pOjPB6+RXFK4pdfOs/qUQ==", + "license": "MIT", + "engines": { + "node": "^14.16.0 || >=16.0.0" + } + }, + "node_modules/@netlify/edge-functions": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@netlify/edge-functions/-/edge-functions-2.5.1.tgz", + "integrity": "sha512-6YGlbzxPaSqc/D2LhP4T4PXrim/vRmqpO1RwQKqVod6WCWlkdtJcAd3mGoI7efrjfND8twh7TqXtL7RRCI23qA==" + }, + "node_modules/@types/node": { + "version": "20.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", + "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" } }, "node_modules/abbrev": { @@ -24,18 +49,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -49,11 +62,6 @@ "node": ">= 8" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -69,29 +77,6 @@ "node": ">=8" } }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -114,26 +99,6 @@ "node": ">=8" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -161,71 +126,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "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/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/deta": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deta/-/deta-1.1.0.tgz", - "integrity": "sha512-mQAvfAsB++McPMT3Gb39KWkxfFzaPSF+z8XNpomakkUslg9xTu6Z8gVjAXaDGJm0LFEIIZQdokpU+lOJOXtOqw==", - "dependencies": { - "node-fetch": "^2.6.7" - } - }, "node_modules/dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", @@ -237,73 +137,6 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -316,58 +149,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -380,17 +161,6 @@ "node": ">= 6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -400,73 +170,12 @@ "node": ">=4" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/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", @@ -521,57 +230,6 @@ "node": ">=10" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -584,38 +242,6 @@ "node": "*" } }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/nodemon": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.0.tgz", @@ -683,38 +309,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -742,60 +336,12 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "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/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -808,30 +354,6 @@ "node": ">=8.10.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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -847,66 +369,6 @@ "node": ">=10" } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -919,14 +381,6 @@ "node": ">=10" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -951,14 +405,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -971,21 +417,17 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 0.6" + "node": ">=14.17" } }, "node_modules/undefsafe": { @@ -994,43 +436,11 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } + "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/yallist": { "version": "4.0.0", @@ -1040,21 +450,31 @@ } }, "dependencies": { + "@netlify/blobs": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-8.0.1.tgz", + "integrity": "sha512-IrZHVqillU0x12eDbsap4Ba6poi+4IdVCYjZa+tA0eD95TaSbSqfw1zNkO27MiKw0pOjPB6+RXFK4pdfOs/qUQ==" + }, + "@netlify/edge-functions": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@netlify/edge-functions/-/edge-functions-2.5.1.tgz", + "integrity": "sha512-6YGlbzxPaSqc/D2LhP4T4PXrim/vRmqpO1RwQKqVod6WCWlkdtJcAd3mGoI7efrjfND8twh7TqXtL7RRCI23qA==" + }, + "@types/node": { + "version": "20.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", + "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, "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 }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -1065,11 +485,6 @@ "picomatch": "^2.0.4" } }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1082,25 +497,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1120,20 +516,6 @@ "fill-range": "^7.0.1" } }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, "chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -1156,118 +538,11 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "deta": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deta/-/deta-1.1.0.tgz", - "integrity": "sha512-mQAvfAsB++McPMT3Gb39KWkxfFzaPSF+z8XNpomakkUslg9xTu6Z8gVjAXaDGJm0LFEIIZQdokpU+lOJOXtOqw==", - "requires": { - "node-fetch": "^2.6.7" - } - }, "dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1277,46 +552,6 @@ "to-regex-range": "^5.0.1" } }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1326,66 +561,18 @@ "is-glob": "^4.0.1" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "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==" - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1425,39 +612,6 @@ "yallist": "^4.0.0" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1467,24 +621,6 @@ "brace-expansion": "^1.1.7" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, "nodemon": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.0.tgz", @@ -1535,29 +671,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -1570,45 +683,12 @@ "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true }, - "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==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, "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 }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1618,16 +698,6 @@ "picomatch": "^2.2.1" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -1637,59 +707,6 @@ "lru-cache": "^6.0.0" } }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, "simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -1699,11 +716,6 @@ "semver": "^7.5.3" } }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1722,11 +734,6 @@ "is-number": "^7.0.0" } }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -1736,19 +743,11 @@ "nopt": "~1.0.10" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true }, "undefsafe": { "version": "2.0.5", @@ -1756,34 +755,11 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } + "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 }, "yallist": { "version": "4.0.0", diff --git a/package.json b/package.json index 3212be8c..4c2a0fd2 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,14 @@ }, "homepage": "https://github.com/OurTechCommunity/catchup#readme", "dependencies": { - "deta": "^1.1.0", - "dotenv": "^16.3.1", - "express": "^4.18.2" + "@netlify/blobs": "^8.0.1", + "@netlify/edge-functions": "^2.5.1", + "dotenv": "^16.3.1" }, "devDependencies": { + "@types/node": "^20.11.17", "nodemon": "^3.0.0", - "prettier": "2.7.1" + "prettier": "2.7.1", + "typescript": "^5.3.3" } } diff --git a/public/html/404.html b/public/404.html similarity index 91% rename from public/html/404.html rename to public/404.html index 34aef1c8..ec6df9e2 100644 --- a/public/html/404.html +++ b/public/404.html @@ -17,17 +17,17 @@ - + @@ -36,13 +36,9 @@ rel="stylesheet" /> - + - + 404 Page Not Found diff --git a/public/html/admin.html b/public/admin.html similarity index 89% rename from public/html/admin.html rename to public/admin.html index a4f0938e..649f24c5 100644 --- a/public/html/admin.html +++ b/public/admin.html @@ -23,17 +23,17 @@ /> - + @@ -42,13 +42,9 @@ rel="stylesheet" /> - + - + OTC CatchUp Admin Portal diff --git a/summary/static/css/summary-style.css b/public/css/summary-style.css similarity index 100% rename from summary/static/css/summary-style.css rename to public/css/summary-style.css diff --git a/public/html/index.html b/public/index.html similarity index 92% rename from public/html/index.html rename to public/index.html index 58bd6336..b66a4246 100644 --- a/public/html/index.html +++ b/public/index.html @@ -20,14 +20,14 @@ @@ -37,7 +37,7 @@ src="https://analytics.ourtech.community/script.js" data-website-id="b8043870-edd4-467a-bf1b-0543db54baef" > - + @@ -46,13 +46,9 @@ rel="stylesheet" /> - + - + OTC CatchUp diff --git a/summary/static/js/summary-script.js b/public/js/summary-script.js similarity index 100% rename from summary/static/js/summary-script.js rename to public/js/summary-script.js diff --git a/public/html/project-showcase-form.html b/public/showcase.html similarity index 88% rename from public/html/project-showcase-form.html rename to public/showcase.html index 2e8d8ac7..6041efca 100644 --- a/public/html/project-showcase-form.html +++ b/public/showcase.html @@ -26,14 +26,14 @@ /> - + @@ -50,13 +50,9 @@ rel="stylesheet" /> - + - + OTC CatchUp Project Showcase Form @@ -124,8 +120,9 @@

OTC CatchUp Project Showcase Form

+ Loading… + diff --git a/summary/combined-summary-docinfo.html b/summary/combined-summary-docinfo.html index abd49b02..eeb27d0e 100644 --- a/summary/combined-summary-docinfo.html +++ b/summary/combined-summary-docinfo.html @@ -10,14 +10,14 @@ - + @@ -34,4 +34,4 @@ rel="stylesheet" /> - + diff --git a/summary/combined-summary.adoc b/summary/combined-summary.adoc index bbf6ac21..eae04a7a 100644 --- a/summary/combined-summary.adoc +++ b/summary/combined-summary.adoc @@ -1,11 +1,11 @@ = OTC CatchUp Summaries Our Tech Community v1 -:toc: left -:favicon: /public/img/favicon.ico -:imagesdir: /public/img/summary +:toc: left +:favicon: /img/favicon.ico +:imagesdir: /img/summary :icons: image -:iconsdir: /public/img/summary/admonition_icons +:iconsdir: /img/summary/admonition_icons :docinfo: private-head, shared :sectanchors: :figure-caption!: @@ -53,5 +53,5 @@ Alone we can do so little; together we can do so much. ''' ++++ - + ++++ diff --git a/summary/individual-summary-docinfo.html b/summary/individual-summary-docinfo.html index b465a98c..5bb5ce41 100644 --- a/summary/individual-summary-docinfo.html +++ b/summary/individual-summary-docinfo.html @@ -16,14 +16,14 @@ /> - + @@ -40,4 +40,4 @@ rel="stylesheet" /> - + diff --git a/summary/individual-summary.adoc b/summary/individual-summary.adoc index 31d1e200..f8aac99c 100644 --- a/summary/individual-summary.adoc +++ b/summary/individual-summary.adoc @@ -1,10 +1,10 @@ = OTC CatchUp #{catchup_display_number} Summary Our Tech Community v1 -:favicon: /public/img/favicon.ico -:imagesdir: /public/img/summary -:icons: image -:iconsdir: /public/img/summary/admonition_icons +:favicon: /img/favicon.ico +:imagesdir: /img/summary +:icons: image +:iconsdir: /img/summary/admonition_icons :docinfo: private-head, shared :sectanchors: :figure-caption!: @@ -12,7 +12,7 @@ v1 :catchup_number: 000 :catchup_display_number: 0 :catchup_image_extension: jpg -:combined_summary_file: combined-summary-template.adoc +:summary_file: summary-template.adoc ''' @@ -23,7 +23,7 @@ For all summaries, please visit link:https://catchup.ourtech.community/summary[c ''' -include::{combined_summary_file}[] +include::{summary_file}[] NOTE: For all summaries, please visit link:https://catchup.ourtech.community/summary[catchup.ourtech.community/summary]. @@ -54,5 +54,5 @@ Alone we can do so little; together we can do so much. ''' ++++ - + ++++ diff --git a/summary/sessions/002/combined-summary.adoc b/summary/sessions/002/summary-template.adoc similarity index 100% rename from summary/sessions/002/combined-summary.adoc rename to summary/sessions/002/summary-template.adoc diff --git a/summary/sessions/005/combined-summary.adoc b/summary/sessions/005/summary-template.adoc similarity index 100% rename from summary/sessions/005/combined-summary.adoc rename to summary/sessions/005/summary-template.adoc diff --git a/summary/sessions/006/combined-summary.adoc b/summary/sessions/006/summary-template.adoc similarity index 100% rename from summary/sessions/006/combined-summary.adoc rename to summary/sessions/006/summary-template.adoc diff --git a/summary/sessions/008/combined-summary.adoc b/summary/sessions/008/summary-template.adoc similarity index 100% rename from summary/sessions/008/combined-summary.adoc rename to summary/sessions/008/summary-template.adoc diff --git a/summary/sessions/009/combined-summary.adoc b/summary/sessions/009/summary-template.adoc similarity index 100% rename from summary/sessions/009/combined-summary.adoc rename to summary/sessions/009/summary-template.adoc diff --git a/summary/sessions/010/combined-summary.adoc b/summary/sessions/010/summary-template.adoc similarity index 100% rename from summary/sessions/010/combined-summary.adoc rename to summary/sessions/010/summary-template.adoc diff --git a/summary/sessions/011/combined-summary.adoc b/summary/sessions/011/summary-template.adoc similarity index 100% rename from summary/sessions/011/combined-summary.adoc rename to summary/sessions/011/summary-template.adoc diff --git a/summary/sessions/012/combined-summary.adoc b/summary/sessions/012/summary-template.adoc similarity index 100% rename from summary/sessions/012/combined-summary.adoc rename to summary/sessions/012/summary-template.adoc diff --git a/summary/sessions/013/combined-summary.adoc b/summary/sessions/013/summary-template.adoc similarity index 100% rename from summary/sessions/013/combined-summary.adoc rename to summary/sessions/013/summary-template.adoc diff --git a/summary/sessions/014/combined-summary.adoc b/summary/sessions/014/summary-template.adoc similarity index 100% rename from summary/sessions/014/combined-summary.adoc rename to summary/sessions/014/summary-template.adoc diff --git a/summary/sessions/015/combined-summary.adoc b/summary/sessions/015/summary-template.adoc similarity index 100% rename from summary/sessions/015/combined-summary.adoc rename to summary/sessions/015/summary-template.adoc diff --git a/summary/sessions/016/combined-summary.adoc b/summary/sessions/016/summary-template.adoc similarity index 100% rename from summary/sessions/016/combined-summary.adoc rename to summary/sessions/016/summary-template.adoc diff --git a/summary/sessions/017/combined-summary.adoc b/summary/sessions/017/summary-template.adoc similarity index 100% rename from summary/sessions/017/combined-summary.adoc rename to summary/sessions/017/summary-template.adoc diff --git a/summary/sessions/018/combined-summary.adoc b/summary/sessions/018/summary-template.adoc similarity index 100% rename from summary/sessions/018/combined-summary.adoc rename to summary/sessions/018/summary-template.adoc diff --git a/summary/sessions/019/combined-summary.adoc b/summary/sessions/019/summary-template.adoc similarity index 100% rename from summary/sessions/019/combined-summary.adoc rename to summary/sessions/019/summary-template.adoc diff --git a/summary/sessions/020/combined-summary.adoc b/summary/sessions/020/summary-template.adoc similarity index 100% rename from summary/sessions/020/combined-summary.adoc rename to summary/sessions/020/summary-template.adoc diff --git a/summary/sessions/021/combined-summary.adoc b/summary/sessions/021/summary-template.adoc similarity index 100% rename from summary/sessions/021/combined-summary.adoc rename to summary/sessions/021/summary-template.adoc diff --git a/summary/sessions/022/combined-summary.adoc b/summary/sessions/022/summary-template.adoc similarity index 100% rename from summary/sessions/022/combined-summary.adoc rename to summary/sessions/022/summary-template.adoc diff --git a/summary/sessions/023/combined-summary.adoc b/summary/sessions/023/summary-template.adoc similarity index 100% rename from summary/sessions/023/combined-summary.adoc rename to summary/sessions/023/summary-template.adoc diff --git a/summary/sessions/024/combined-summary.adoc b/summary/sessions/024/summary-template.adoc similarity index 100% rename from summary/sessions/024/combined-summary.adoc rename to summary/sessions/024/summary-template.adoc diff --git a/summary/sessions/025/combined-summary.adoc b/summary/sessions/025/summary-template.adoc similarity index 100% rename from summary/sessions/025/combined-summary.adoc rename to summary/sessions/025/summary-template.adoc diff --git a/summary/sessions/026/combined-summary.adoc b/summary/sessions/026/summary-template.adoc similarity index 100% rename from summary/sessions/026/combined-summary.adoc rename to summary/sessions/026/summary-template.adoc diff --git a/summary/sessions/027/combined-summary.adoc b/summary/sessions/027/summary-template.adoc similarity index 100% rename from summary/sessions/027/combined-summary.adoc rename to summary/sessions/027/summary-template.adoc diff --git a/summary/sessions/028/combined-summary.adoc b/summary/sessions/028/summary-template.adoc similarity index 100% rename from summary/sessions/028/combined-summary.adoc rename to summary/sessions/028/summary-template.adoc diff --git a/summary/sessions/029/combined-summary.adoc b/summary/sessions/029/summary-template.adoc similarity index 100% rename from summary/sessions/029/combined-summary.adoc rename to summary/sessions/029/summary-template.adoc diff --git a/summary/sessions/030/combined-summary.adoc b/summary/sessions/030/summary-template.adoc similarity index 100% rename from summary/sessions/030/combined-summary.adoc rename to summary/sessions/030/summary-template.adoc diff --git a/summary/sessions/031/combined-summary.adoc b/summary/sessions/031/summary-template.adoc similarity index 100% rename from summary/sessions/031/combined-summary.adoc rename to summary/sessions/031/summary-template.adoc diff --git a/summary/sessions/032/combined-summary.adoc b/summary/sessions/032/summary-template.adoc similarity index 100% rename from summary/sessions/032/combined-summary.adoc rename to summary/sessions/032/summary-template.adoc diff --git a/summary/sessions/033/combined-summary.adoc b/summary/sessions/033/summary-template.adoc similarity index 100% rename from summary/sessions/033/combined-summary.adoc rename to summary/sessions/033/summary-template.adoc diff --git a/summary/sessions/034/combined-summary.adoc b/summary/sessions/034/summary-template.adoc similarity index 100% rename from summary/sessions/034/combined-summary.adoc rename to summary/sessions/034/summary-template.adoc diff --git a/summary/sessions/035/combined-summary.adoc b/summary/sessions/035/summary-template.adoc similarity index 100% rename from summary/sessions/035/combined-summary.adoc rename to summary/sessions/035/summary-template.adoc diff --git a/summary/sessions/036/combined-summary.adoc b/summary/sessions/036/summary-template.adoc similarity index 100% rename from summary/sessions/036/combined-summary.adoc rename to summary/sessions/036/summary-template.adoc diff --git a/summary/sessions/037/combined-summary.adoc b/summary/sessions/037/summary-template.adoc similarity index 100% rename from summary/sessions/037/combined-summary.adoc rename to summary/sessions/037/summary-template.adoc diff --git a/summary/sessions/038/combined-summary.adoc b/summary/sessions/038/summary-template.adoc similarity index 100% rename from summary/sessions/038/combined-summary.adoc rename to summary/sessions/038/summary-template.adoc diff --git a/summary/sessions/039/combined-summary.adoc b/summary/sessions/039/summary-template.adoc similarity index 100% rename from summary/sessions/039/combined-summary.adoc rename to summary/sessions/039/summary-template.adoc diff --git a/summary/sessions/040/combined-summary.adoc b/summary/sessions/040/summary-template.adoc similarity index 100% rename from summary/sessions/040/combined-summary.adoc rename to summary/sessions/040/summary-template.adoc diff --git a/summary/sessions/041/combined-summary.adoc b/summary/sessions/041/summary-template.adoc similarity index 100% rename from summary/sessions/041/combined-summary.adoc rename to summary/sessions/041/summary-template.adoc diff --git a/summary/sessions/042/combined-summary.adoc b/summary/sessions/042/summary-template.adoc similarity index 100% rename from summary/sessions/042/combined-summary.adoc rename to summary/sessions/042/summary-template.adoc diff --git a/summary/sessions/043/combined-summary.adoc b/summary/sessions/043/summary-template.adoc similarity index 100% rename from summary/sessions/043/combined-summary.adoc rename to summary/sessions/043/summary-template.adoc diff --git a/summary/sessions/044/combined-summary.adoc b/summary/sessions/044/summary-template.adoc similarity index 100% rename from summary/sessions/044/combined-summary.adoc rename to summary/sessions/044/summary-template.adoc diff --git a/summary/sessions/045/combined-summary.adoc b/summary/sessions/045/summary-template.adoc similarity index 100% rename from summary/sessions/045/combined-summary.adoc rename to summary/sessions/045/summary-template.adoc diff --git a/summary/sessions/046/combined-summary.adoc b/summary/sessions/046/summary-template.adoc similarity index 100% rename from summary/sessions/046/combined-summary.adoc rename to summary/sessions/046/summary-template.adoc diff --git a/summary/sessions/047/combined-summary.adoc b/summary/sessions/047/summary-template.adoc similarity index 100% rename from summary/sessions/047/combined-summary.adoc rename to summary/sessions/047/summary-template.adoc diff --git a/summary/sessions/048/combined-summary.adoc b/summary/sessions/048/summary-template.adoc similarity index 100% rename from summary/sessions/048/combined-summary.adoc rename to summary/sessions/048/summary-template.adoc diff --git a/summary/sessions/049/combined-summary.adoc b/summary/sessions/049/summary-template.adoc similarity index 100% rename from summary/sessions/049/combined-summary.adoc rename to summary/sessions/049/summary-template.adoc diff --git a/summary/sessions/050/combined-summary.adoc b/summary/sessions/050/summary-template.adoc similarity index 100% rename from summary/sessions/050/combined-summary.adoc rename to summary/sessions/050/summary-template.adoc diff --git a/summary/sessions/051/combined-summary.adoc b/summary/sessions/051/summary-template.adoc similarity index 100% rename from summary/sessions/051/combined-summary.adoc rename to summary/sessions/051/summary-template.adoc diff --git a/summary/sessions/052/combined-summary.adoc b/summary/sessions/052/summary-template.adoc similarity index 100% rename from summary/sessions/052/combined-summary.adoc rename to summary/sessions/052/summary-template.adoc diff --git a/summary/sessions/053/combined-summary.adoc b/summary/sessions/053/summary-template.adoc similarity index 100% rename from summary/sessions/053/combined-summary.adoc rename to summary/sessions/053/summary-template.adoc diff --git a/summary/sessions/069/combined-summary.adoc b/summary/sessions/069/summary-template.adoc similarity index 81% rename from summary/sessions/069/combined-summary.adoc rename to summary/sessions/069/summary-template.adoc index e09a1e0e..5342915f 100644 --- a/summary/sessions/069/combined-summary.adoc +++ b/summary/sessions/069/summary-template.adoc @@ -13,6 +13,6 @@ image::{catchup_number}.{catchup_image_extension}[alt="Meet #{catchup_display_nu ==== Special 69th CatchUp poster -image::/public/img/69th-catchup.png[alt="69th CatchUp special poster", 600, 600] +image::/img/69th-catchup.png[alt="69th CatchUp special poster", 600, 600] ''' diff --git a/summary/sessions/074/combined-summary.adoc b/summary/sessions/074/summary-template.adoc similarity index 100% rename from summary/sessions/074/combined-summary.adoc rename to summary/sessions/074/summary-template.adoc diff --git a/summary/sessions/096/combined-summary.adoc b/summary/sessions/096/summary-template.adoc similarity index 100% rename from summary/sessions/096/combined-summary.adoc rename to summary/sessions/096/summary-template.adoc diff --git a/summary/sessions/112/combined-summary.adoc b/summary/sessions/112/summary-template.adoc similarity index 100% rename from summary/sessions/112/combined-summary.adoc rename to summary/sessions/112/summary-template.adoc diff --git a/summary/sessions/143/combined-summary.adoc b/summary/sessions/143/summary-template.adoc similarity index 100% rename from summary/sessions/143/combined-summary.adoc rename to summary/sessions/143/summary-template.adoc diff --git a/summary/sessions/144/combined-summary.adoc b/summary/sessions/144/summary-template.adoc similarity index 100% rename from summary/sessions/144/combined-summary.adoc rename to summary/sessions/144/summary-template.adoc diff --git a/summary/sessions/152/combined-summary.adoc b/summary/sessions/152/summary-template.adoc similarity index 100% rename from summary/sessions/152/combined-summary.adoc rename to summary/sessions/152/summary-template.adoc diff --git a/summary/sessions/156/combined-summary.adoc b/summary/sessions/156/summary-template.adoc similarity index 100% rename from summary/sessions/156/combined-summary.adoc rename to summary/sessions/156/summary-template.adoc diff --git a/summary/sessions/162/combined-summary.adoc b/summary/sessions/162/summary-template.adoc similarity index 100% rename from summary/sessions/162/combined-summary.adoc rename to summary/sessions/162/summary-template.adoc diff --git a/summary/sessions/163/combined-summary.adoc b/summary/sessions/163/summary-template.adoc similarity index 100% rename from summary/sessions/163/combined-summary.adoc rename to summary/sessions/163/summary-template.adoc diff --git a/summary/sessions/165/combined-summary.adoc b/summary/sessions/165/summary-template.adoc similarity index 100% rename from summary/sessions/165/combined-summary.adoc rename to summary/sessions/165/summary-template.adoc diff --git a/summary/sessions/178/combined-summary.adoc b/summary/sessions/178/summary-template.adoc similarity index 100% rename from summary/sessions/178/combined-summary.adoc rename to summary/sessions/178/summary-template.adoc diff --git a/summary/sessions/184/combined-summary.adoc b/summary/sessions/184/summary-template.adoc similarity index 100% rename from summary/sessions/184/combined-summary.adoc rename to summary/sessions/184/summary-template.adoc diff --git a/summary/sessions/197/combined-summary.adoc b/summary/sessions/197/summary-template.adoc similarity index 100% rename from summary/sessions/197/combined-summary.adoc rename to summary/sessions/197/summary-template.adoc diff --git a/summary/sessions/198/combined-summary.adoc b/summary/sessions/198/summary-template.adoc similarity index 100% rename from summary/sessions/198/combined-summary.adoc rename to summary/sessions/198/summary-template.adoc diff --git a/summary/combined-summary-template.adoc b/summary/summary-template.adoc similarity index 100% rename from summary/combined-summary-template.adoc rename to summary/summary-template.adoc diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..47749288 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "strict": true, + "declaration": false, + "allowImportingTsExtensions": true + }, + "exclude": ["node_modules"] +} diff --git a/util/README.adoc b/util/README.adoc new file mode 100644 index 00000000..85d58776 --- /dev/null +++ b/util/README.adoc @@ -0,0 +1,37 @@ += Shell Scripting + +== Aim +Write a portable, self-contained and minimal build system to build the catchup site. + +== Structure +* The site uses https://docs.asciidoctor.org/asciidoctor/latest/[Asciidoctor] to write content. +* Each folder under `/summary/sessions/` represents one page +** Folders are named with the catchup number, left padded with 0s to a length of three + to ensure consistent ordering. +* Common static files are in `/summary/static/` +* Each catchup session folder (`/summary/sessions/{number}/`) consists of: +** `content.adoc`: page contents +** `attendees.adoc`: attendee list +** `combined-summary.adoc`: optional, allows overriding the page layout for a specific summary +* Additional files: +** `/summary/combined-summary-template.adoc`: default page layout file +** `/summary/combined-summary.adoc`: page layout for combined summary page +** `/summary/individual-summary.adoc`: page layout for individual summary page + +== Reasons for Choosing Shellscript +The build system needs to be portable across different operating systems (Windows/MacOS/Linux) +and setups (Full Desktop Environments to bare containers). +It should also ideally require minimal setup and be easy to modify. + +That is why a POSIX shell script was chosen to handle the build. +Currently, the buildscript depends only on `grep` and `sed` apart from standard UNIX utilities. + +== Build Process +Each summary is built as a separate page using `summary-template.adoc` and added to the combined summary file. +The content for the combined summary file is autogenerated by the build script, +in reverse order so the most recent summary comes first. +Templates are populated by defining variables during the invocation of the asciidoctor build command. + +== Output +The buildscript creates a directory named `public` with the static files needed to serve the site. +The output folder can be changed by passing it as the first parameter to the script. diff --git a/util/build.sh b/util/build.sh index 3f4e4688..610aa5f9 100755 --- a/util/build.sh +++ b/util/build.sh @@ -4,28 +4,19 @@ set -eu; script_dir=$(dirname "${0}"); base_dir=$(realpath "${script_dir}/.."); -public_dir="${base_dir}/public"; summary_dir="${base_dir}/summary"; +out_dir="${1:-build}"; + echo "Building summary pages using Asciidoctor Jet..."; -# Create required directories if they don't exist -mkdir -p "${public_dir}/css/summary"; -mkdir -p "${public_dir}/html/summary"; -mkdir -p "${public_dir}/js/summary"; -mkdir -p "${public_dir}/img/summary"; - -# Remove all summary files to prevent residual files -rm -rf "${public_dir}/css/summary/"*; -rm -rf "${public_dir}/html/summary/"*; -rm -rf "${public_dir}/js/summary/"*; -rm -rf "${public_dir}/img/summary/"*; +# Cleanup old builds +rm -rf "${out_dir}"; rm -f "${summary_dir}/autogenerated-combined-summary.adoc"; -# Copy files to public directory for static serving -cp -r "${summary_dir}/static/css/"* "${public_dir}/css/summary"; -cp -r "${summary_dir}/static/js/"* "${public_dir}/js/summary"; -cp -r "${summary_dir}/static/img/"* "${public_dir}/img/summary"; +# Copy public files to output directory +cp -r "${base_dir}/public" "${out_dir}"; +cp -r "${summary_dir}/static/img/" "${out_dir}/img/summary"; # Reverse order so summaries are newest to oldest BUILD_SUMMARY_DIRS=""; @@ -35,24 +26,27 @@ for path in "${summary_dir}/sessions/"*; do fi; done; +# Store all built catchups for quick lookup in edge functions +built_catchup_numbers=""; + # Build individual summary pages for path in ${BUILD_SUMMARY_DIRS}; do if [ -d "${path}" ]; then catchup_number=${path##*/}; catchup_display_number=$(printf "%.0f" "${catchup_number}"); - # If summary/sessions/${catchup_number}/combined-summary.adoc exists, + # If summary/sessions/${catchup_number}/summary-template.adoc exists, # then use it, else use the default template - combined_summary_template="sessions/${catchup_number}/combined-summary.adoc"; - if [ ! -f "${summary_dir}/${combined_summary_template}" ]; then - combined_summary_template="combined-summary-template.adoc"; + summary_template="sessions/${catchup_number}/summary-template.adoc"; + if [ ! -f "${summary_dir}/${summary_template}" ]; then + summary_template="summary-template.adoc"; fi; # Use the first image named `${catchup_number}.*` catchup_image_folder="${summary_dir}/static/img"; catchup_image_extension=""; # Only search for an image extension if used in the template - if grep -Fq "{catchup_image_extension}" "${summary_dir}/${combined_summary_template}"; then + if grep -Fq "{catchup_image_extension}" "${summary_dir}/${summary_template}"; then for image in "${catchup_image_folder}/${catchup_number}."*; do if [ -e "${image}" ]; then if [ -z "${catchup_image_extension}" ]; then @@ -75,7 +69,7 @@ for path in ${BUILD_SUMMARY_DIRS}; do echo ":catchup_number: ${catchup_number}"; echo ":catchup_display_number: ${catchup_display_number}"; echo ":catchup_image_extension: ${catchup_image_extension}"; - echo "include::${combined_summary_template}[]"; + echo "include::${summary_template}[]"; echo ""; } >> "${summary_dir}/autogenerated-combined-summary.adoc"; @@ -84,22 +78,29 @@ for path in ${BUILD_SUMMARY_DIRS}; do -a "catchup_number=${catchup_number}" \ -a "catchup_display_number=${catchup_display_number}" \ -a "catchup_image_extension=${catchup_image_extension}" \ - -a "combined_summary_file=${combined_summary_template}" \ - -o "${public_dir}/html/summary/${catchup_number}.html" \ + -a "summary_file=${summary_template}" \ + -o "${out_dir}/summary/${catchup_display_number}.html" \ "${summary_dir}/individual-summary.adoc"; # Lazy load images - sed -i -e "s/ "${base_dir}/netlify/edge-functions/common/built-catchup-numbers.ts"; + # Build combined summary site asciidoctor \ -a webfonts! \ - -o "${public_dir}/html/summary/combined-summary.html" \ + -o "${out_dir}/summary/index.html" \ "${summary_dir}/combined-summary.adoc"; # Lazy load images -sed -i -e 's/