From 48b3c1fd40520bbcbc34f25a49b3741f21620dfd Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 13:05:28 -0700 Subject: [PATCH 01/40] Initialize SvelteKit and rewrite to in Svelte + Tailwind. Replaced timezonecomplete with luxon because it works both in the browser and in nodejs. Replaced some of the styles with tailwind. --- .gitignore | 101 +- .npmrc | 1 + .prettierignore | 4 + .prettierrc | 15 + README copy.md | 38 + eslint.config.js | 23 + netlify.toml | 14 +- netlify/edge-functions/og.tsx | 122 - netlify/functions/index.js | 119 - package.json | 31 +- pnpm-lock.yaml | 2599 ++++++++++++++++- postcss.config.js | 6 + src/app.css | 9 + src/app.html | 16 + src/lib/Instructions.svelte | 11 + src/lib/TimezoneView.svelte | 19 + src/lib/index.js | 1 + netlify/common.js => src/lib/timezones.js | 62 +- src/routes/+layout.svelte | 6 + src/routes/+page.svelte | 7 + src/routes/[tzstring]/+page.js | 5 + src/routes/[tzstring]/+page.svelte | 33 + .../og.js => src/routes/og/+server.js | 9 +- static/index.html | 24 - static/timezone.js | 1 - svelte.config.js | 20 + tailwind.config.js | 12 + vite.config.js | 10 + 28 files changed, 2800 insertions(+), 518 deletions(-) create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 README copy.md create mode 100644 eslint.config.js delete mode 100644 netlify/edge-functions/og.tsx delete mode 100644 netlify/functions/index.js create mode 100644 postcss.config.js create mode 100644 src/app.css create mode 100644 src/app.html create mode 100644 src/lib/Instructions.svelte create mode 100644 src/lib/TimezoneView.svelte create mode 100644 src/lib/index.js rename netlify/common.js => src/lib/timezones.js (85%) create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/[tzstring]/+page.js create mode 100644 src/routes/[tzstring]/+page.svelte rename netlify/functions/og.js => src/routes/og/+server.js (93%) delete mode 100644 static/index.html delete mode 100644 static/timezone.js create mode 100644 svelte.config.js create mode 100644 tailwind.config.js create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore index 6b21beb..9489d62 100644 --- a/.gitignore +++ b/.gitignore @@ -15,97 +15,32 @@ pids *.seed *.pid.lock -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - # Dependency directories node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity # dotenv environment variables file .env .env.test -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ +# Local Netlify folder +.netlify -# DynamoDB Local files -.dynamodb/ +# Svelte Output +.output +.vercel +/.svelte-kit +/build -# TernJS port file -.tern-port +# OS .DS_Store -.firebase/** -functions/package-lock.json -package-lock.json +Thumbs.db -# Local Netlify folder -.netlify +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ab78a95 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7ebb855 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/README copy.md b/README copy.md new file mode 100644 index 0000000..abd6f21 --- /dev/null +++ b/README copy.md @@ -0,0 +1,38 @@ +# create-svelte + +Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```bash +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```bash +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..dae2fad --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,23 @@ +import prettier from 'eslint-config-prettier'; +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import globals from 'globals'; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + js.configs.recommended, + ...svelte.configs['flat/recommended'], + prettier, + ...svelte.configs['flat/prettier'], + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node + } + } + }, + { + ignores: ['build/', '.svelte-kit/', 'dist/'] + } +]; diff --git a/netlify.toml b/netlify.toml index 328fa95..74eba01 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,13 +1,3 @@ [build] - edge_functions = "./netlify/edge-functions-disabled" - -[[redirects]] - from = "/og" - to = "/.netlify/functions/og" - status = 200 - force = true - -[[redirects]] - from = "/*" - to = "/.netlify/functions/index" - status = 200 + command = "npm run build" + publish = "build" diff --git a/netlify/edge-functions/og.tsx b/netlify/edge-functions/og.tsx deleted file mode 100644 index 3da0794..0000000 --- a/netlify/edge-functions/og.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import type { Config, Context } from "@netlify/edge-functions"; -import { ImageResponse } from "https://deno.land/x/og_edge/mod.ts"; -import React from "https://esm.sh/react@18.2.0"; - -import { getZoneInfo, colors } from "../common.js"; - - -export default async (request: Request, context: Context) => { - let url = new URL(request.url); - let path = url.searchParams.get("path"); - const info = getZoneInfo(path); - - console.log("URL:", info); - - return new ImageResponse( - ( -
- {info?.zones.map((z, i) => ( -
- -
{z.niceZoneName}
-
{z.startString}
-
- ))} - Hello! -
- ) - ); -} - -export const config = { - path: "/og", - cache: "manual", -}; - - -// //og.jpg?path= -// export default async (request, context) => { -// let url = new URL(request.url); -// let path = url.searchParams.get("path"); -// const info = getZoneInfo(path); - -// console.log("URL:", info); - -// // const canvas = new Canvas(1200, 630); -// // const ctx = canvas.getContext("2d"); - -// // if (info) { -// // ctx.beginPath(); -// // ctx.rect(0, 0, canvas.width, canvas.height); -// // ctx.fillStyle = "rgba(255,255,255,1.0)"; -// // ctx.fill(); - -// // var count = info.zones.length; -// // var width = canvas.width / count; -// // var height = canvas.height; -// // var size = width / 5; -// // ctx.textAlign = "center"; -// // info.zones.forEach((z, i) => { -// // ctx.beginPath(); -// // ctx.rect(width * i, 0, width, canvas.height); -// // var hour = z.zoneStart.hour(); -// // var grd = ctx.createLinearGradient(0, 0, 0, height); -// // grd.addColorStop(0, colors[hour * 2]); -// // grd.addColorStop(1, colors[hour * 2 + 1]); -// // ctx.fillStyle = grd; -// // console.log(colors[hour * 2], colors[hour * 1 + 1]); -// // ctx.fill(); -// // }); - -// // info.zones.forEach((z, i) => { -// // ctx.fillStyle = z.night ? "white" : "black"; -// // ctx.globalCompositeOperation = "hard-light"; - -// // ctx.font = `${size / 1.5}px Arial`; -// // ctx.globalAlpha = 0.5; -// // ctx.fillText(z.niceZoneName, width * (0.5 + i), height / 2 - size / 2); - -// // ctx.font = `${size}px Arial`; -// // ctx.globalAlpha = 0.8; -// // ctx.fillText(z.startString, width * (0.5 + i), height / 2 + size / 2); -// // }); -// // } - -// // const stream = canvas.createJPEGStream(); -// // const chunks = []; - -// // for await (let chunk of stream) { -// // chunks.push(chunk); -// // } - -// // const buffer = Buffer.concat(chunks); - -// // return { -// // statusCode: 200, -// // headers: { -// // "Content-Type": "image/jpeg", -// // "Content-Disposition": 'attachment; filename="ogimage.jpg"', -// // "Cache-Control": "public, max-age=60, s-maxage=31536000", -// // }, -// // body: buffer.toString("base64"), -// // isBase64Encoded: true, -// // }; -// }; - -// export const config = { -// path: "/og.jpg*", -// }; diff --git a/netlify/functions/index.js b/netlify/functions/index.js deleted file mode 100644 index 00d2674..0000000 --- a/netlify/functions/index.js +++ /dev/null @@ -1,119 +0,0 @@ -import { getZoneInfo } from "../common.js"; - -export default async (req, context) => { - let url = new URL(req.url); - var path = url.pathname; - - console.log("path", path); - - var error; - var zoneHTML = []; - var zoneStrings = []; - - var info = getZoneInfo(path); - - if (info && !info.error) { - info.zones.forEach((z) => { - zoneStrings.push(z.description); - zoneHTML.push(` -
-
${z.emoji}
-
-
${z.niceZoneName}
-
${z.zoneStart.zone().name()}
-
-
${z.startString}${z.extraDay ? "⁺¹" : ""}${ - z.endString ? `
` : "" - }${z.endString}
- -
`); - }); - - if (info.label) zoneStrings.push(info.label); - - let dtstart = `DTSTART;TZID=${info.start.zone().name()}:${info.start.format( - "yyyyMMddThhmmss" - )}`; - console.log({ dtstart }); - let duration = "PT" + (info.duration || 30) + "M"; - var description = zoneStrings.join(" •  "); - - let defaultName = "timezone.fyi event"; - var vcalendar = encodeURIComponent( - `BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//hacksw/handcal//NONSGML v1.0//EN -BEGIN:VEVENT -SUMMARY:${info.label || defaultName} -LOCATION:${url.toString()} -DESCRIPTION:${description} -${dtstart} -DURATION:${duration} -END:VEVENT -END:VCALENDAR` - ); - return new Response( - ` - - - - ${info.label || description} - - - - - ${ - info.zones - ? `` - : "" - } - - - - - - -
${zoneHTML.join("")}
- - `, - { - status: 200, - headers: { - "Content-Type": "text/html", - }, - } - ); - } - return new Response( - ` - - - timezone.fyi - - -
-
-

timezone.fyi

- This site lets you quickly share a time across multiple time zones. -

Simply type a url with the following structure: -
https://timezone.fyi/10:30am,pst,est -

The first listed time zone will be treated as the primary. List of time zone names - -
When you send these via Slack, SMS, and other modern chat clients, -
they'll expand to show times in every listed zone. -

${info && info.error ? info.error : ""}
-
- - `, - { - status: 200, - headers: { - "Content-Type": "text/html", - }, - } - ); -}; diff --git a/package.json b/package.json index 0c8db37..f3914bf 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,40 @@ { "name": "timezone-fyi", "description": "Timezone Tool", + "version": "0.2.0", + "type": "module", "scripts": { - "dev": "netlify dev" + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "format": "prettier --write .", + "lint": "prettier --check . && eslint ." }, "engines": { "node": "20" }, + "devDependencies": { + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^4.0.0", + "@sveltejs/adapter-netlify": "^4.3.6", + "@tailwindcss/typography": "^0.5.15", + "@types/eslint": "^9.6.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.7.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.36.0", + "globals": "^15.0.0", + "prettier": "^3.3.2", + "prettier-plugin-svelte": "^3.2.6", + "prettier-plugin-tailwindcss": "^0.6.5", + "svelte": "^5.0.0", + "tailwindcss": "^3.4.9", + "vite": "^5.0.3" + }, "dependencies": { - "@netlify/functions": "^2.8.2", "canvas": "^2.11.2", - "timezonecomplete": "^5.13.1", - "tzdata": "^1.0.42" + "luxon": "^3.5.0" }, "private": true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6b0692..b3ed771 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,48 +8,500 @@ importers: .: dependencies: - '@netlify/functions': - specifier: ^2.8.2 - version: 2.8.2 canvas: specifier: ^2.11.2 version: 2.11.2 - timezonecomplete: - specifier: ^5.13.1 - version: 5.13.1 - tzdata: - specifier: ^1.0.42 - version: 1.0.42 + luxon: + specifier: ^3.5.0 + version: 3.5.0 + devDependencies: + '@sveltejs/adapter-auto': + specifier: ^3.0.0 + version: 3.3.1(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10)) + '@sveltejs/adapter-netlify': + specifier: ^4.3.6 + version: 4.3.6(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10)) + '@sveltejs/kit': + specifier: ^2.0.0 + version: 2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10) + '@sveltejs/vite-plugin-svelte': + specifier: ^4.0.0 + version: 4.0.0(svelte@5.1.3)(vite@5.4.10) + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.15(tailwindcss@3.4.14) + '@types/eslint': + specifier: ^9.6.0 + version: 9.6.1 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + eslint: + specifier: ^9.7.0 + version: 9.13.0(jiti@1.21.6) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.13.0(jiti@1.21.6)) + eslint-plugin-svelte: + specifier: ^2.36.0 + version: 2.46.0(eslint@9.13.0(jiti@1.21.6))(svelte@5.1.3) + globals: + specifier: ^15.0.0 + version: 15.11.0 + prettier: + specifier: ^3.3.2 + version: 3.3.3 + prettier-plugin-svelte: + specifier: ^3.2.6 + version: 3.2.7(prettier@3.3.3)(svelte@5.1.3) + prettier-plugin-tailwindcss: + specifier: ^0.6.5 + version: 0.6.8(prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.1.3))(prettier@3.3.3) + svelte: + specifier: ^5.0.0 + version: 5.1.3 + tailwindcss: + specifier: ^3.4.9 + version: 3.4.14 + vite: + specifier: ^5.0.3 + version: 5.4.10 packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.0': + resolution: {integrity: sha512-gh7PdNombP8ftL8TinYC8Xd7WEypB8EKV4PI2h0eMzndKjPCXuo2zUiZtD2Hu+MSPt02Ty2MdS788ADl9ai1rA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.13.0': + resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.1': + resolution: {integrity: sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.0': + resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.5': + resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@iarna/toml@2.2.5': + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@mapbox/node-pre-gyp@1.0.11': resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@netlify/functions@2.8.2': - resolution: {integrity: sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==} - engines: {node: '>=14.0.0'} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@rollup/rollup-android-arm-eabi@4.24.2': + resolution: {integrity: sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.24.2': + resolution: {integrity: sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.24.2': + resolution: {integrity: sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.24.2': + resolution: {integrity: sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.24.2': + resolution: {integrity: sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.24.2': + resolution: {integrity: sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.24.2': + resolution: {integrity: sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.24.2': + resolution: {integrity: sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.24.2': + resolution: {integrity: sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.24.2': + resolution: {integrity: sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.24.2': + resolution: {integrity: sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.24.2': + resolution: {integrity: sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.24.2': + resolution: {integrity: sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.24.2': + resolution: {integrity: sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.24.2': + resolution: {integrity: sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.24.2': + resolution: {integrity: sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.24.2': + resolution: {integrity: sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.24.2': + resolution: {integrity: sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==} + cpu: [x64] + os: [win32] + + '@sveltejs/adapter-auto@3.3.1': + resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/adapter-netlify@4.3.6': + resolution: {integrity: sha512-o1M8SlNeXiTD4X9T/q+WZaeStEzRlGZeMc/NHrgK5dhnrJhN3UFzMqFV4mnNAVyxqyvsQ87FYyjPlkDualSwRA==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 - '@netlify/node-cookies@0.1.0': - resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} - engines: {node: ^14.16.0 || >=16.0.0} + '@sveltejs/kit@2.7.3': + resolution: {integrity: sha512-Vx7nq5MJ86I8qXYsVidC5PX6xm+uxt8DydvOdmJoyOK7LvGP18OFEG359yY+aa51t6pENvqZAMqAREQQx1OI2Q==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 + + '@sveltejs/vite-plugin-svelte-inspector@3.0.1': + resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 + svelte: ^5.0.0-next.96 || ^5.0.0 + vite: ^5.0.0 + + '@sveltejs/vite-plugin-svelte@4.0.0': + resolution: {integrity: sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0-next.96 || ^5.0.0 + vite: ^5.0.0 + + '@tailwindcss/typography@0.5.15': + resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' - '@netlify/serverless-functions-api@1.26.1': - resolution: {integrity: sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==} - engines: {node: '>=18.0.0'} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -58,30 +510,110 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001672: + resolution: {integrity: sha512-XhW1vRo1ob6aeK2w3rTohwTPBLse/rvjq+s3RTSBwnlZqoFFjx9cHsShJjAIbLsLjyoacaTxpLZy9v3gg6zypw==} + canvas@2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} engines: {node: '>=6'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -95,6 +627,13 @@ packages: resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} engines: {node: '>=8'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -102,9 +641,160 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.47: + resolution: {integrity: sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-svelte@2.46.0: + resolution: {integrity: sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.13.0: + resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esm-env@1.0.0: + resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrap@1.2.2: + resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -112,22 +802,79 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} deprecated: This package is no longer supported. + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.11.0: + resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} + engines: {node: '>=18'} + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -135,14 +882,119 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} + engines: {node: '>=12'} + + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mimic-response@2.1.0: resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} engines: {node: '>=8'} @@ -150,6 +1002,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -158,6 +1014,10 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -167,12 +1027,31 @@ packages: engines: {node: '>=10'} hasBin: true + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nan@2.22.0: resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -182,11 +1061,22 @@ packages: encoding: optional: true + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} hasBin: true + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. @@ -195,50 +1085,307 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 - simple-get@3.1.1: + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-safe-parser@6.0.0: + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-svelte@3.2.7: + resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier-plugin-tailwindcss@0.6.8: + resolution: {integrity: sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.24.2: + resolution: {integrity: sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -246,125 +1393,860 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte-eslint-parser@0.43.0: + resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte@5.1.3: + resolution: {integrity: sha512-Sl8UFHlBvF54aK8MElFvyvaUfPE2REOz6LnhR2pBClCL11MU4qpn4V+KgAggaXxDyrP2iQixvHbtpHqL/zXlSQ==} + engines: {node: '>=18'} + + tailwindcss@3.4.14: + resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} + engines: {node: '>=14.0.0'} + hasBin: true + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - timezonecomplete@5.13.1: - resolution: {integrity: sha512-41o3TTExXQ03jQML12Tk64b5TYeEy968Umq5vya+08sFWCcYw5fNqrHubD1vj/JGN1NYhFFBCS09rOL3b7nM2w==} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tzdata@1.0.25: - resolution: {integrity: sha512-yAZ/Tv/tBFIPHJGYrOexxW8Swyjszt7rDhIjnIPSqLaP8mzrr3T7D0w4cxQBtToXnQrlFqkEU0stGC/auz0JcQ==} + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} - tzdata@1.0.42: - resolution: {integrity: sha512-hVA4V8g27yz1YB4Ty4UliwJlWrFOoFrFBYFMd9rKUlRlaF+9Fl3gyzxF/+MQOtCH50pPE+XZ/bYOYkRnBDscVQ==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' - urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + vite@5.4.10: + resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@1.0.3: + resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.6.0: + resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + engines: {node: '>= 14'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.13.0(jiti@1.21.6))': + dependencies: + eslint: 9.13.0(jiti@1.21.6) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.0': {} + + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.7.0': {} + + '@eslint/eslintrc@3.1.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 10.2.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.13.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.1': + dependencies: + levn: 0.4.1 + + '@humanfs/core@0.19.0': {} + + '@humanfs/node@0.16.5': + dependencies: + '@humanfs/core': 0.19.0 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@iarna/toml@2.2.5': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.28': {} + + '@rollup/rollup-android-arm-eabi@4.24.2': + optional: true + + '@rollup/rollup-android-arm64@4.24.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.24.2': + optional: true + + '@rollup/rollup-darwin-x64@4.24.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.24.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.24.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.24.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.24.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.24.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.24.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.24.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.24.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.24.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.24.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.24.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.24.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.24.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.24.2': + optional: true + + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10))': + dependencies: + '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10) + import-meta-resolve: 4.1.0 + + '@sveltejs/adapter-netlify@4.3.6(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10))': + dependencies: + '@iarna/toml': 2.2.5 + '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10) + esbuild: 0.21.5 + set-cookie-parser: 2.7.1 + + '@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10)': + dependencies: + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.3)(vite@5.4.10) + '@types/cookie': 0.6.0 + cookie: 0.6.0 + devalue: 5.1.1 + esm-env: 1.0.0 + import-meta-resolve: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.12 + mrmime: 2.0.0 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.0 + svelte: 5.1.3 + tiny-glob: 0.2.9 + vite: 5.4.10 + + '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10)': + dependencies: + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.3)(vite@5.4.10) + debug: 4.3.7 + svelte: 5.1.3 + vite: 5.4.10 + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10)': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.3)(vite@5.4.10))(svelte@5.1.3)(vite@5.4.10) + debug: 4.3.7 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.12 + svelte: 5.1.3 + vite: 5.4.10 + vitefu: 1.0.3(vite@5.4.10) + transitivePeerDependencies: + - supports-color + + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.14 + + '@types/cookie@0.6.0': {} + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.6': {} + + '@types/json-schema@7.0.15': {} + + abbrev@1.1.1: {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn-typescript@1.4.13(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aproba@2.0.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + autoprefixer@10.4.20(postcss@8.4.47): + dependencies: + browserslist: 4.24.2 + caniuse-lite: 1.0.30001672 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + axobject-query@4.1.0: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001672 + electron-to-chromium: 1.5.47 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001672: {} + + canvas@2.11.2: + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + nan: 2.22.0 + simple-get: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: {} + + cookie@0.6.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decompress-response@4.2.1: + dependencies: + mimic-response: 2.1.0 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + delegates@1.0.0: {} + + detect-libc@2.0.3: {} + + devalue@5.1.1: {} + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + eastasianwidth@0.2.0: {} - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + electron-to-chromium@1.5.47: {} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + emoji-regex@8.0.0: {} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + emoji-regex@9.2.2: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.1(eslint@9.13.0(jiti@1.21.6)): + dependencies: + eslint: 9.13.0(jiti@1.21.6) + semver: 7.6.3 -snapshots: + eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.6)): + dependencies: + eslint: 9.13.0(jiti@1.21.6) - '@mapbox/node-pre-gyp@1.0.11': + eslint-plugin-svelte@2.46.0(eslint@9.13.0(jiti@1.21.6))(svelte@5.1.3): dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.13.0(jiti@1.21.6)) + '@jridgewell/sourcemap-codec': 1.5.0 + eslint: 9.13.0(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.6)) + esutils: 2.0.3 + known-css-properties: 0.35.0 + postcss: 8.4.47 + postcss-load-config: 3.1.4(postcss@8.4.47) + postcss-safe-parser: 6.0.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 semver: 7.6.3 - tar: 6.2.1 + svelte-eslint-parser: 0.43.0(svelte@5.1.3) + optionalDependencies: + svelte: 5.1.3 transitivePeerDependencies: - - encoding - - supports-color + - ts-node - '@netlify/functions@2.8.2': + eslint-scope@7.2.2: dependencies: - '@netlify/serverless-functions-api': 1.26.1 + esrecurse: 4.3.0 + estraverse: 5.3.0 - '@netlify/node-cookies@0.1.0': {} - - '@netlify/serverless-functions-api@1.26.1': + eslint-scope@8.1.0: dependencies: - '@netlify/node-cookies': 0.1.0 - urlpattern-polyfill: 8.0.2 + esrecurse: 4.3.0 + estraverse: 5.3.0 - abbrev@1.1.1: {} + eslint-visitor-keys@3.4.3: {} - agent-base@6.0.2: + eslint-visitor-keys@4.1.0: {} + + eslint@9.13.0(jiti@1.21.6): dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.13.0(jiti@1.21.6)) + '@eslint-community/regexpp': 4.12.0 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.7.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.13.0 + '@eslint/plugin-kit': 0.2.1 + '@humanfs/node': 0.16.5 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 debug: 4.3.7 + escape-string-regexp: 4.0.0 + eslint-scope: 8.1.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 transitivePeerDependencies: - supports-color - ansi-regex@5.0.1: {} + esm-env@1.0.0: {} - aproba@2.0.0: {} + espree@10.2.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.1.0 - are-we-there-yet@2.0.0: + espree@9.6.1: dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 - balanced-match@1.0.2: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 - brace-expansion@1.1.11: + esrap@1.2.2: dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 - canvas@2.11.2: + esrecurse@4.3.0: dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.22.0 - simple-get: 3.1.1 - transitivePeerDependencies: - - encoding - - supports-color + estraverse: 5.3.0 - chownr@2.0.0: {} + estraverse@5.3.0: {} - color-support@1.1.3: {} + esutils@2.0.3: {} - concat-map@0.0.1: {} + fast-deep-equal@3.1.3: {} - console-control-strings@1.1.0: {} + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 - debug@4.3.7: + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: dependencies: - ms: 2.1.3 + reusify: 1.0.4 - decompress-response@4.2.1: + file-entry-cache@8.0.0: dependencies: - mimic-response: 2.1.0 + flat-cache: 4.0.1 - delegates@1.0.0: {} + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 - detect-libc@2.0.3: {} + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 - emoji-regex@8.0.0: {} + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} fs-minipass@2.1.0: dependencies: @@ -372,6 +2254,11 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + gauge@3.0.2: dependencies: aproba: 2.0.0 @@ -384,6 +2271,23 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -393,8 +2297,22 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + globals@14.0.0: {} + + globals@15.11.0: {} + + globalyzer@0.1.0: {} + + globrex@0.1.2: {} + + has-flag@4.0.0: {} + has-unicode@2.0.1: {} + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -402,6 +2320,17 @@ snapshots: transitivePeerDependencies: - supports-color + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -409,24 +2338,116 @@ snapshots: inherits@2.0.4: {} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.6 + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.6: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@4.1.5: {} + + known-css-properties@0.35.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + locate-character@3.0.0: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lru-cache@10.4.3: {} + + luxon@3.5.0: {} + + magic-string@0.30.12: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@3.1.0: dependencies: semver: 6.3.1 + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mimic-response@2.1.0: {} minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + minipass@3.3.6: dependencies: yallist: 4.0.0 minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -434,18 +2455,38 @@ snapshots: mkdirp@1.0.4: {} + mri@1.2.0: {} + + mrmime@2.0.0: {} + ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nan@2.22.0: {} + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-releases@2.0.18: {} + nopt@5.0.0: dependencies: abbrev: 1.1.1 + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 @@ -455,22 +2496,192 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + once@1.4.0: dependencies: wrappy: 1.0.2 + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + postcss-import@15.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.47): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.47 + + postcss-load-config@3.1.4(postcss@8.4.47): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.4.47 + + postcss-load-config@4.0.2(postcss@8.4.47): + dependencies: + lilconfig: 3.1.2 + yaml: 2.6.0 + optionalDependencies: + postcss: 8.4.47 + + postcss-nested@6.2.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-safe-parser@6.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-scss@4.0.9(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.1.3): + dependencies: + prettier: 3.3.3 + svelte: 5.1.3 + + prettier-plugin-tailwindcss@0.6.8(prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.1.3))(prettier@3.3.3): + dependencies: + prettier: 3.3.3 + optionalDependencies: + prettier-plugin-svelte: 3.2.7(prettier@3.3.3)(svelte@5.1.3) + + prettier@3.3.3: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + resolve-from@4.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + rimraf@3.0.2: dependencies: glob: 7.2.3 + rollup@4.24.2: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.24.2 + '@rollup/rollup-android-arm64': 4.24.2 + '@rollup/rollup-darwin-arm64': 4.24.2 + '@rollup/rollup-darwin-x64': 4.24.2 + '@rollup/rollup-freebsd-arm64': 4.24.2 + '@rollup/rollup-freebsd-x64': 4.24.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.24.2 + '@rollup/rollup-linux-arm-musleabihf': 4.24.2 + '@rollup/rollup-linux-arm64-gnu': 4.24.2 + '@rollup/rollup-linux-arm64-musl': 4.24.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.24.2 + '@rollup/rollup-linux-riscv64-gnu': 4.24.2 + '@rollup/rollup-linux-s390x-gnu': 4.24.2 + '@rollup/rollup-linux-x64-gnu': 4.24.2 + '@rollup/rollup-linux-x64-musl': 4.24.2 + '@rollup/rollup-win32-arm64-msvc': 4.24.2 + '@rollup/rollup-win32-ia32-msvc': 4.24.2 + '@rollup/rollup-win32-x64-msvc': 4.24.2 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-buffer@5.2.1: {} semver@6.3.1: {} @@ -479,8 +2690,18 @@ snapshots: set-blocking@2.0.0: {} + set-cookie-parser@2.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + simple-concat@1.0.1: {} simple-get@3.1.1: @@ -489,12 +2710,26 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 + sirv@3.0.0: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + + source-map-js@1.2.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -503,6 +2738,81 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-json-comments@3.1.1: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte-eslint-parser@0.43.0(svelte@5.1.3): + dependencies: + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + postcss: 8.4.47 + postcss-scss: 4.0.9(postcss@8.4.47) + optionalDependencies: + svelte: 5.1.3 + + svelte@5.1.3: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 + acorn-typescript: 1.4.13(acorn@8.14.0) + aria-query: 5.3.2 + axobject-query: 4.1.0 + esm-env: 1.0.0 + esrap: 1.2.2 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.12 + zimmerframe: 1.1.2 + + tailwindcss@3.4.14: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -512,20 +2822,59 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - timezonecomplete@5.13.1: + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + + to-regex-range@5.0.1: dependencies: - tzdata: 1.0.25 + is-number: 7.0.0 + + totalist@3.0.1: {} tr46@0.0.3: {} - tzdata@1.0.25: {} + ts-interface-checker@0.1.13: {} - tzdata@1.0.42: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 - urlpattern-polyfill@8.0.2: {} + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 util-deprecate@1.0.2: {} + vite@5.4.10: + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.24.2 + optionalDependencies: + fsevents: 2.3.3 + + vitefu@1.0.3(vite@5.4.10): + optionalDependencies: + vite: 5.4.10 + webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -533,10 +2882,36 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + which@2.0.2: + dependencies: + isexe: 2.0.0 + wide-align@1.1.5: dependencies: string-width: 4.2.3 + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} yallist@4.0.0: {} + + yaml@1.10.2: {} + + yaml@2.6.0: {} + + yocto-queue@0.1.0: {} + + zimmerframe@1.1.2: {} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..0f77216 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..dc7f9a8 --- /dev/null +++ b/src/app.css @@ -0,0 +1,9 @@ +@import 'tailwindcss/base'; +@import 'tailwindcss/components'; +@import 'tailwindcss/utilities'; + +@layer components { + p { + @apply my-4; + } +} diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..730eecb --- /dev/null +++ b/src/app.html @@ -0,0 +1,16 @@ + + + + + + + + + %sveltekit.head% + + + +
%sveltekit.body%
+ + + \ No newline at end of file diff --git a/src/lib/Instructions.svelte b/src/lib/Instructions.svelte new file mode 100644 index 0000000..041c45d --- /dev/null +++ b/src/lib/Instructions.svelte @@ -0,0 +1,11 @@ +
+
+

timezone.fyi

+

This site lets you quickly share a time across multiple time zones.

+

Simply type a url with the following structure: +
https://timezone.fyi/10:30am,pst,est +

The first listed time zone will be treated as the primary. + List of time zone names

+ +

When you send these via Slack, SMS, and other modern chat clients, they'll expand to show times in every listed zone.

+
\ No newline at end of file diff --git a/src/lib/TimezoneView.svelte b/src/lib/TimezoneView.svelte new file mode 100644 index 0000000..6df4455 --- /dev/null +++ b/src/lib/TimezoneView.svelte @@ -0,0 +1,19 @@ + + +
+
{timezone.emoji}
+
+
{timezone.niceZoneName}
+
{timezone.zoneStart.timezone}
+
+
+ {timezone.startString} + {timezone.extraDay ? "⁺¹" : ""} + {#if timezone.endString } +
+ {/if} + {timezone.endString} +
+
\ No newline at end of file diff --git a/src/lib/index.js b/src/lib/index.js new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/src/lib/index.js @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/netlify/common.js b/src/lib/timezones.js similarity index 85% rename from netlify/common.js rename to src/lib/timezones.js index f1669eb..e8e479c 100644 --- a/netlify/common.js +++ b/src/lib/timezones.js @@ -1,5 +1,4 @@ -import * as tc from "timezonecomplete"; -import tzdata from "tzdata"; // here just to make sure it's included in the build +import { DateTime } from "luxon"; var overrides = { ACDT: 10.5, @@ -331,11 +330,13 @@ function resolveZone(z) { if (z.startsWith("GMT+")) if (isNaN(z)) { - let tzd = tc.TzDatabase.instance(); - if (!tzd.exists(z)) { - // Uppercase for country names - z = z[0].toUpperCase() + z.substring(1); - } + // TODO(liquidx): Not sure what this does, luxon doesn't have a db instance. + // let tzd = tc.TzDatabase.instance(); + // if (!tzd.exists(z)) { + // // Uppercase for country names + // z = z[0].toUpperCase() + z.substring(1); + // } + z = 0; } else { z *= 60; } @@ -430,12 +431,10 @@ export const colors = [ ]; export const getZoneInfo = (path) => { - var error; var info = undefined; var zones = path.replace(/ /g, "+").split(/[,.]/); if (zones.length > 1) { - try { var timeString = decodeURIComponent(zones.shift()); // Handle difference in params[0] on local vs server (firebase) looking at leading slash var timeRE = @@ -447,54 +446,46 @@ export const getZoneInfo = (path) => { if (label) label = decodePrettyComponent(label.slice(0, -1)); var firstZone = resolveZone(zones[0]); - var start = new tc.now(tc.zone(firstZone)) - .startOfDay() - .add(tc.hours(parseInt(groups.h1))) - .add(tc.minutes(parseInt(groups.m1) || 0)); + var start = DateTime.local().setZone(firstZone); - if (groups.p1 == "p" && start.hour() < 12) - start = start.add(tc.hours(12)); + if (groups.p1 == "p" && start.hour < 12) + start = start.plus({ hours: 12 }); var end = undefined; if (groups.h2) { - end = new tc.now(tc.zone(firstZone)) - .startOfDay() - .add(tc.hours(parseInt(groups.h2))) - .add(tc.minutes(parseInt(groups.m2) || 0)); - if ((groups.p2 == "p" && end.hour() < 12) || start.hour() > end.hour()) - end = end.add(tc.hours(12)); + end = DateTime.local().setZone(firstZone).startOf("day") + .plus({ hours: parseInt(groups.h2) }) + .plus({ minutes: parseInt(groups.m2) || 0 }); + if ((groups.p2 == "p" && end.hour < 12) || start.hour > end.hour) + end.plus({ hours: 12 }); } - let duration = end ? end.diff(start).minutes() : undefined; + let duration = end ? end.diff(start).minutes : undefined; info = { zones: [], label, start, end, duration }; zones.forEach((zone) => { var tzName = resolveZone(zone); if (zone.length) { - var z = (zoneInfo = {}); - var tcz = tc.zone(tzName); + var tcz = tzName; - var zoneStart = start.toZone(tcz); - var extraDay = start.day() < zoneStart.day(); + var zoneStart = start.setZone(tcz); + var extraDay = start.day < zoneStart.day; - let omitXM = false; var endString = ""; if (end) { - var zoneEnd = end.toZone(tcz); + var zoneEnd = end.setZone(tcz); endString = zoneEnd - .format("h:mm a") + .toFormat('h:mm a') .replace(" PM", "ᴘᴍ") .replace(" AM", "ᴀᴍ") .replace(":00", ""); - - // omitXM = (zoneEnd.hour() < 12 && zoneStart.hour() < 12) || zoneEnd.hour() >= 12 && zoneStart.hour() >= 12 } var startString = zoneStart - .format(omitXM ? "h:mm" : "h:mm a") + .toFormat('h:mm a') .replace(" PM", "ᴘᴍ") .replace(" AM", "ᴀᴍ") .replace(":00", ""); - var emoji = hourMoji[zoneStart.hour() % 12]; + var emoji = hourMoji[zoneStart.hour % 12]; var niceZoneName = zone .split("/") .pop() @@ -505,7 +496,7 @@ export const getZoneInfo = (path) => { endString ? "‑" + endString : "" } ${niceZoneName} ${extraDay ? " +1" : ""}`; var night = - zoneStart.hour() > 14 || zoneStart.hour() <= 6 ? "night" : ""; + zoneStart.hour > 14 || zoneStart.hour <= 6 ? "night" : ""; var zoneInfo = { description, night, @@ -520,9 +511,6 @@ export const getZoneInfo = (path) => { info.zones.push(zoneInfo); } }); - } catch (e) { - return { error: e.message }; - } return info; } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..726b46c --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,6 @@ + + +{@render children()} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..599fc64 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,7 @@ + + + + + diff --git a/src/routes/[tzstring]/+page.js b/src/routes/[tzstring]/+page.js new file mode 100644 index 0000000..a8c408d --- /dev/null +++ b/src/routes/[tzstring]/+page.js @@ -0,0 +1,5 @@ +export const load = async ({params}) => { + return { + tzstring: params.tzstring, + } +}; \ No newline at end of file diff --git a/src/routes/[tzstring]/+page.svelte b/src/routes/[tzstring]/+page.svelte new file mode 100644 index 0000000..1cad32f --- /dev/null +++ b/src/routes/[tzstring]/+page.svelte @@ -0,0 +1,33 @@ + + +
+{#each timezones as timezone} + +{/each} +
+ + diff --git a/netlify/functions/og.js b/src/routes/og/+server.js similarity index 93% rename from netlify/functions/og.js rename to src/routes/og/+server.js index 8b22a22..90354db 100644 --- a/netlify/functions/og.js +++ b/src/routes/og/+server.js @@ -1,7 +1,8 @@ import { Canvas } from "canvas"; -import { getZoneInfo, colors } from "../common.js"; +import { getZoneInfo, colors } from "$lib/timezones.js"; + +export const GET = async (req) => { -export default async (req, context) => { const url = new URL(req.url); const path = url.searchParams.get("path"); if (!path) { @@ -25,7 +26,7 @@ export default async (req, context) => { info.zones.forEach((z, i) => { ctx.beginPath(); ctx.rect(width * i, 0, width, canvas.height); - var hour = z.zoneStart.hour(); + var hour = z.zoneStart.hour; var grd = ctx.createLinearGradient(0, 0, 0, height); grd.addColorStop(0, colors[hour * 2]); grd.addColorStop(1, colors[hour * 2 + 1]); @@ -65,4 +66,4 @@ export default async (req, context) => { "Cache-Control": "public, max-age=60, s-maxage=31536000", }, }); -}; +} \ No newline at end of file diff --git a/static/index.html b/static/index.html deleted file mode 100644 index 57f9e62..0000000 --- a/static/index.html +++ /dev/null @@ -1,24 +0,0 @@ -` - - - - - timezone.fyi - - - -
-
-

timezone.fyi

- This site lets you quickly share a time across multiple time zones. -

Simply type a url with the following structure: -
https://timezone.fyi/10:30am,pst,est -

The first listed time zone will be treated as the primary. List of time zone names - -
When you send these via Slack, SMS, and other modern chat clients, -
they'll expand to show times in every listed zone. -

- - - \ No newline at end of file diff --git a/static/timezone.js b/static/timezone.js deleted file mode 100644 index 44742ac..0000000 --- a/static/timezone.js +++ /dev/null @@ -1 +0,0 @@ -// TK \ No newline at end of file diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..bef1513 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,20 @@ +import adapter from '@sveltejs/adapter-netlify'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + kit: { + // https://svelte.dev/docs/kit/adapter-netlify + adapter: adapter({ + // if true, will create a Netlify Edge Function rather + // than using standard Node-based functions + edge: false, + + // if true, will split your app into multiple functions + // instead of creating a single one for the entire app. + // if `edge` is true, this option cannot be used + split: false + }), + }, +}; + +export default config; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..7c4077d --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,12 @@ +import typography from '@tailwindcss/typography'; + +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./src/**/*.{html,js,svelte,ts}'], + + theme: { + extend: {} + }, + + plugins: [typography] +}; diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..3b24264 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,10 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()], + server: { + port: 12345 + } + +}); From 71e4f5e973c1e067ea5e5f1b6fff49cef3e99ca6 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 13:18:56 -0700 Subject: [PATCH 02/40] add instructions --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index b18dd47..b5defc6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ # timezone.fyi Source for https://timezone.fyi + +# development + +```` +pnpm install +pnpm run dev +``` + From bce54cc9a4c6635bb6e28e6c49a825088d22e8b0 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 13:23:14 -0700 Subject: [PATCH 03/40] Downgrade to use node18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f3914bf..f0235b4 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint": "prettier --check . && eslint ." }, "engines": { - "node": "20" + "node": "18" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.0.0", From e58c185fb4545e7738e887641b6bd7f9119a7c67 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 15:20:58 -0700 Subject: [PATCH 04/40] Properly create the og image url --- src/app.html | 3 ++- src/routes/[tzstring]/+page.js | 8 ++++++-- src/routes/[tzstring]/+page.svelte | 17 +++++++++++++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/app.html b/src/app.html index 730eecb..4860e6a 100644 --- a/src/app.html +++ b/src/app.html @@ -4,8 +4,9 @@ - + + %sveltekit.head% diff --git a/src/routes/[tzstring]/+page.js b/src/routes/[tzstring]/+page.js index a8c408d..b2fa39b 100644 --- a/src/routes/[tzstring]/+page.js +++ b/src/routes/[tzstring]/+page.js @@ -1,5 +1,9 @@ -export const load = async ({params}) => { + + +/** @type {import('./$types').PageServerLoad} */ +export const load = async ({ params, url }) => { return { tzstring: params.tzstring, - } + url: url, + }; }; \ No newline at end of file diff --git a/src/routes/[tzstring]/+page.svelte b/src/routes/[tzstring]/+page.svelte index 1cad32f..917b88f 100644 --- a/src/routes/[tzstring]/+page.svelte +++ b/src/routes/[tzstring]/+page.svelte @@ -3,11 +3,14 @@ import TimezoneView from "$lib/TimezoneView.svelte"; import { getZoneInfo } from "$lib/timezones"; + /** @type {import('./$types').PageData} */ export let data; + let description = 'timezone.fyi' let timezones = []; + let path = '' $: { - const path = data.tzstring; + path = data.tzstring; const infos = getZoneInfo(path); if (infos) { timezones = infos.zones; @@ -15,7 +18,8 @@ } onMount(() => { - const path = data.tzstring; + console.log(data.url); + path = data.tzstring; const infos = getZoneInfo(path); if (infos) { timezones = infos.zones; @@ -24,6 +28,15 @@ + + + + {#if timezones.length > 0} + + {/if} + + +
{#each timezones as timezone} From 45a3a9e9dbe5eed191475ee7cb542c643c5702bf Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 15:58:24 -0700 Subject: [PATCH 05/40] Convert from canvas to sharp --- package.json | 8 +- pnpm-lock.yaml | 614 ++++++++++++++++----------------------- src/lib/timezones.js | 6 +- src/routes/og/+server.js | 133 +++++---- 4 files changed, 340 insertions(+), 421 deletions(-) diff --git a/package.json b/package.json index f0235b4..9af6ff4 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,13 @@ "lint": "prettier --check . && eslint ." }, "engines": { - "node": "18" + "node": "20" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-netlify": "^4.3.6", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", - "@sveltejs/adapter-netlify": "^4.3.6", "@tailwindcss/typography": "^0.5.15", "@types/eslint": "^9.6.0", "autoprefixer": "^10.4.20", @@ -33,8 +33,8 @@ "vite": "^5.0.3" }, "dependencies": { - "canvas": "^2.11.2", - "luxon": "^3.5.0" + "luxon": "^3.5.0", + "sharp": "^0.33.5" }, "private": true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3ed771..f8ff249 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,12 @@ importers: .: dependencies: - canvas: - specifier: ^2.11.2 - version: 2.11.2 luxon: specifier: ^3.5.0 version: 3.5.0 + sharp: + specifier: ^0.33.5 + version: 0.33.5 devDependencies: '@sveltejs/adapter-auto': specifier: ^3.0.0 @@ -77,6 +77,9 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -268,6 +271,111 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -290,10 +398,6 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -454,9 +558,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -472,10 +573,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -502,14 +599,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -564,10 +653,6 @@ packages: caniuse-lite@1.0.30001672: resolution: {integrity: sha512-XhW1vRo1ob6aeK2w3rTohwTPBLse/rvjq+s3RTSBwnlZqoFFjx9cHsShJjAIbLsLjyoacaTxpLZy9v3gg6zypw==} - canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -576,10 +661,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -587,9 +668,12 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} @@ -598,9 +682,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -623,10 +704,6 @@ packages: supports-color: optional: true - decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -634,9 +711,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -795,13 +869,6 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -810,11 +877,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -827,10 +889,6 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -849,17 +907,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -875,12 +926,8 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -983,10 +1030,6 @@ packages: magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -995,10 +1038,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1006,27 +1045,10 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1041,9 +1063,6 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nan@2.22.0: - resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} - nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1052,23 +1071,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -1077,10 +1082,6 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1089,9 +1090,6 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1115,10 +1113,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1294,10 +1288,6 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1314,11 +1304,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rollup@4.24.2: resolution: {integrity: sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1331,24 +1316,18 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1357,18 +1336,12 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} sirv@3.0.0: resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} @@ -1386,9 +1359,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1432,10 +1402,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -1457,12 +1423,12 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1518,20 +1484,11 @@ packages: vite: optional: true - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -1544,12 +1501,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -1575,6 +1526,11 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.0 + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -1696,6 +1652,81 @@ snapshots: '@iarna/toml@2.2.5': {} + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1722,21 +1753,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mapbox/node-pre-gyp@1.0.11': - dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.6.3 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1879,8 +1895,6 @@ snapshots: '@types/json-schema@7.0.15': {} - abbrev@1.1.1: {} - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -1891,12 +1905,6 @@ snapshots: acorn@8.14.0: {} - agent-base@6.0.2: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -1921,13 +1929,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - aproba@2.0.0: {} - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - arg@5.0.2: {} argparse@2.0.1: {} @@ -1976,15 +1977,6 @@ snapshots: caniuse-lite@1.0.30001672: {} - canvas@2.11.2: - dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.22.0 - simple-get: 3.1.1 - transitivePeerDependencies: - - encoding - - supports-color - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -2002,22 +1994,26 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@2.0.0: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} - color-support@1.1.3: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 commander@4.1.1: {} concat-map@0.0.1: {} - console-control-strings@1.1.0: {} - cookie@0.6.0: {} cross-spawn@7.0.3: @@ -2032,16 +2028,10 @@ snapshots: dependencies: ms: 2.1.3 - decompress-response@4.2.1: - dependencies: - mimic-response: 2.1.0 - deep-is@0.1.4: {} deepmerge@4.3.1: {} - delegates@1.0.0: {} - detect-libc@2.0.3: {} devalue@5.1.1: {} @@ -2248,29 +2238,11 @@ snapshots: fraction.js@4.3.7: {} - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2288,15 +2260,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - globals@14.0.0: {} globals@15.11.0: {} @@ -2307,19 +2270,10 @@ snapshots: has-flag@4.0.0: {} - has-unicode@2.0.1: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - ignore@5.3.2: {} import-fresh@3.3.0: @@ -2331,12 +2285,7 @@ snapshots: imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} + is-arrayish@0.3.2: {} is-binary-path@2.1.0: dependencies: @@ -2419,10 +2368,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - merge2@1.4.1: {} micromatch@4.0.8: @@ -2430,8 +2375,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mimic-response@2.1.0: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2440,21 +2383,8 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.1.2: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp@1.0.4: {} - mri@1.2.0: {} mrmime@2.0.0: {} @@ -2467,41 +2397,20 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nan@2.22.0: {} - nanoid@3.3.7: {} natural-compare@1.4.0: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-releases@2.0.18: {} - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 - normalize-path@3.0.0: {} normalize-range@0.1.2: {} - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - object-assign@4.1.1: {} object-hash@3.0.0: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -2527,8 +2436,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -2626,12 +2533,6 @@ snapshots: dependencies: pify: 2.3.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -2646,10 +2547,6 @@ snapshots: reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rollup@4.24.2: dependencies: '@types/estree': 1.0.6 @@ -2682,33 +2579,47 @@ snapshots: dependencies: mri: 1.2.0 - safe-buffer@5.2.1: {} - - semver@6.3.1: {} - semver@7.6.3: {} - set-blocking@2.0.0: {} - set-cookie-parser@2.7.1: {} + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - simple-concat@1.0.1: {} - - simple-get@3.1.1: + simple-swizzle@0.2.2: dependencies: - decompress-response: 4.2.1 - once: 1.4.0 - simple-concat: 1.0.1 + is-arrayish: 0.3.2 sirv@3.0.0: dependencies: @@ -2730,10 +2641,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2813,15 +2720,6 @@ snapshots: transitivePeerDependencies: - ts-node - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - text-table@0.2.0: {} thenify-all@1.6.0: @@ -2843,10 +2741,11 @@ snapshots: totalist@3.0.1: {} - tr46@0.0.3: {} - ts-interface-checker@0.1.13: {} + tslib@2.8.0: + optional: true + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -2875,21 +2774,10 @@ snapshots: optionalDependencies: vite: 5.4.10 - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which@2.0.2: dependencies: isexe: 2.0.0 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -2904,10 +2792,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} - - yallist@4.0.0: {} - yaml@1.10.2: {} yaml@2.6.0: {} diff --git a/src/lib/timezones.js b/src/lib/timezones.js index e8e479c..af79008 100644 --- a/src/lib/timezones.js +++ b/src/lib/timezones.js @@ -1,5 +1,8 @@ import { DateTime } from "luxon"; +const isNightAfter = 18; // 6pm +const isNightBefore = 6; // 6am + var overrides = { ACDT: 10.5, ACST: 9.5, @@ -325,7 +328,6 @@ function resolveZone(z) { .toString() .toUpperCase() .match(/^GMT([+\-]\d+)$/); - console.log("gmtmatch", gmtmatch, z); if (gmtmatch && gmtmatch[1]) z = gmtmatch[1]; if (z.startsWith("GMT+")) @@ -496,7 +498,7 @@ export const getZoneInfo = (path) => { endString ? "‑" + endString : "" } ${niceZoneName} ${extraDay ? " +1" : ""}`; var night = - zoneStart.hour > 14 || zoneStart.hour <= 6 ? "night" : ""; + zoneStart.hour > isNightAfter || zoneStart.hour <= isNightBefore ? "night" : ""; var zoneInfo = { description, night, diff --git a/src/routes/og/+server.js b/src/routes/og/+server.js index 90354db..7c79d05 100644 --- a/src/routes/og/+server.js +++ b/src/routes/og/+server.js @@ -1,68 +1,101 @@ -import { Canvas } from "canvas"; +import sharp from "sharp"; + import { getZoneInfo, colors } from "$lib/timezones.js"; -export const GET = async (req) => { +const generateLinearGradient = (gradientId, stops) => { + const backgroundStops = stops + .map((color, index) => { + const offset = (index / (stops.length - 1) * 100); + return ``; + }) + .join(''); + return `${backgroundStops}`; +} - const url = new URL(req.url); - const path = url.searchParams.get("path"); - if (!path) { - return new Response("Missing path", { status: 400 }); - } - const info = getZoneInfo(path); - const canvas = new Canvas(1200, 630); - const ctx = canvas.getContext("2d"); +const generateZoneRect = (zone, x, y, width, height, gradientId) => { + const fontSizeZone = width / 10; + const fontSizeTime = width / 5; + const centerX = x + width / 2; + const centerY = y + height / 2; + const textColor = zone.night ? "white" : "black"; - if (info) { - ctx.beginPath(); - ctx.rect(0, 0, canvas.width, canvas.height); - ctx.fillStyle = "rgba(255,255,255,1.0)"; - ctx.fill(); + return ` + + ${zone.niceZoneName} + + + ${zone.startString} + + ` +} - var count = info.zones.length; - var width = canvas.width / count; - var height = canvas.height; - var size = width / 5; - ctx.textAlign = "center"; - info.zones.forEach((z, i) => { - ctx.beginPath(); - ctx.rect(width * i, 0, width, canvas.height); - var hour = z.zoneStart.hour; - var grd = ctx.createLinearGradient(0, 0, 0, height); - grd.addColorStop(0, colors[hour * 2]); - grd.addColorStop(1, colors[hour * 2 + 1]); - ctx.fillStyle = grd; - console.log(colors[hour * 2], colors[hour * 1 + 1]); - ctx.fill(); - }); +const generateSvg = (width, height, zones) => { + const gradients = zones.map((z, i) => { + if (!z.zoneStart) { + return ''; + } + const start = colors[z.zoneStart.hour * 2]; + const end = colors[z.zoneStart.hour * 2 + 1]; + const gradient = generateLinearGradient(`gradient${i}`, [start, end]); + return gradient; + }).join(''); - info.zones.forEach((z, i) => { - ctx.fillStyle = z.night ? "white" : "black"; - ctx.globalCompositeOperation = "hard-light"; + const zoneBlocks = zones.map((z, i) => { + const zoneWidth = width / zones.length; + const x = zoneWidth * i; + const rect = generateZoneRect(z, x, 0, zoneWidth, height, `gradient${i}`); + return rect; + }).join(''); - ctx.font = `${size / 1.5}px Arial`; - ctx.globalAlpha = 0.5; - ctx.fillText(z.niceZoneName, width * (0.5 + i), height / 2 - size / 2); + const svg = ` + + + ${gradients} + + ${zoneBlocks} + ` - ctx.font = `${size}px Arial`; - ctx.globalAlpha = 0.8; - ctx.fillText(z.startString, width * (0.5 + i), height / 2 + size / 2); - }); - } + return svg; +} - const stream = canvas.createJPEGStream(); - const chunks = []; - - for await (let chunk of stream) { - chunks.push(chunk); +export const GET = async (req) => { + const url = new URL(req.url); + const path = url.searchParams.get("path"); + if (!path) { + return new Response("Missing path", { status: 400 }); } - - const buffer = Buffer.concat(chunks); + const info = getZoneInfo(path); + const width = 1200 + const height = 630 + const svg = generateSvg(width, height, info.zones); + const buffer = await sharp(Buffer.from(svg)) + .jpeg() + .toBuffer(); return new Response(buffer, { status: 200, headers: { "Content-Type": "image/jpeg", - "Content-Disposition": 'attachment; filename="ogimage.jpg"', "Cache-Control": "public, max-age=60, s-maxage=31536000", }, }); From 975f25ac1c2324278676eff26afaa7ab80c46dce Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 15:59:44 -0700 Subject: [PATCH 06/40] Fix dup key in overrides --- src/lib/timezones.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/timezones.js b/src/lib/timezones.js index af79008..ddfed17 100644 --- a/src/lib/timezones.js +++ b/src/lib/timezones.js @@ -177,7 +177,6 @@ var overrides = { WST: 8, YAKT: 9, YEKT: 5, - GMT: 0, EDT: "America/New_York", EST: "America/New_York", ET: "America/New_York", From 9c0552e50cd3337dbe6bebf9813b0ddeb671a4ee Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 16:05:12 -0700 Subject: [PATCH 07/40] Update fonts --- src/routes/og/+server.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/routes/og/+server.js b/src/routes/og/+server.js index 7c79d05..dd1f79b 100644 --- a/src/routes/og/+server.js +++ b/src/routes/og/+server.js @@ -1,7 +1,8 @@ import sharp from "sharp"; - import { getZoneInfo, colors } from "$lib/timezones.js"; +const fontFamily = 'Arial' + const generateLinearGradient = (gradientId, stops) => { const backgroundStops = stops .map((color, index) => { @@ -24,7 +25,7 @@ const generateZoneRect = (zone, x, y, width, height, gradientId) => { x="${centerX}" y="${centerY}" opacity="0.5" - font-family="sans-serif" + font-family="${fontFamily}" font-size="${fontSizeZone}pt" text-anchor="middle" fill="${textColor}" @@ -38,7 +39,7 @@ const generateZoneRect = (zone, x, y, width, height, gradientId) => { y="${centerY + fontSizeTime}" fill="${textColor}" opacity="0.8" - font-family="sans-serif" + font-family="${fontFamily}" font-size="${fontSizeTime}pt" text-anchor="middle" dominant-baseline="middle" From 2ff9845f2b2fb36d5018f840b3fcbeea66b22d04 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 16:39:18 -0700 Subject: [PATCH 08/40] Fonts --- src/routes/og/+server.js | 6 +++++- static/fonts/Roboto-Regular-webfont.woff | Bin 0 -> 80304 bytes static/fonts/fonts.conf | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 static/fonts/Roboto-Regular-webfont.woff create mode 100644 static/fonts/fonts.conf diff --git a/src/routes/og/+server.js b/src/routes/og/+server.js index dd1f79b..692c18d 100644 --- a/src/routes/og/+server.js +++ b/src/routes/og/+server.js @@ -1,7 +1,11 @@ import sharp from "sharp"; import { getZoneInfo, colors } from "$lib/timezones.js"; +import process from "process"; -const fontFamily = 'Arial' +// Forces the use of the fonts in the lambda layer. +process.env.FONTCONFIG_PATH='/var/task/fonts' + +const fontFamily = 'Roboto' const generateLinearGradient = (gradientId, stops) => { const backgroundStops = stops diff --git a/static/fonts/Roboto-Regular-webfont.woff b/static/fonts/Roboto-Regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..6ff6afd8c863f4ee4a2bd032a93c5dde5bf15f0d GIT binary patch literal 80304 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 U5+{zuf?@lC+j6Kse)s?X0ZPdgP5=M^ literal 0 HcmV?d00001 diff --git a/static/fonts/fonts.conf b/static/fonts/fonts.conf new file mode 100644 index 0000000..70a647a --- /dev/null +++ b/static/fonts/fonts.conf @@ -0,0 +1,7 @@ + + + +

/var/task/fonts/ + /tmp/fonts-cache/ + + From 91d6cf0cc82bb6680a5788f59495ad58a74d5f8a Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 16:46:04 -0700 Subject: [PATCH 09/40] Add debug endpoint --- src/routes/echo/+server.js | 16 ++++++++++++++++ src/routes/og/+server.js | 1 + 2 files changed, 17 insertions(+) create mode 100644 src/routes/echo/+server.js diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js new file mode 100644 index 0000000..d3a5e60 --- /dev/null +++ b/src/routes/echo/+server.js @@ -0,0 +1,16 @@ +import sharp from "sharp"; +import process from "process"; +import { json } from "@sveltejs/kit"; + +// Forces the use of the fonts in the lambda layer. +process.env.FONTCONFIG_PATH='/var/task/fonts' + +const fontFamily = 'Roboto' + + +export const GET = async (req) => { + console.log(process.env) + + return json({env: process.env}); + +} \ No newline at end of file diff --git a/src/routes/og/+server.js b/src/routes/og/+server.js index 692c18d..771aad2 100644 --- a/src/routes/og/+server.js +++ b/src/routes/og/+server.js @@ -84,6 +84,7 @@ const generateSvg = (width, height, zones) => { } export const GET = async (req) => { + console.log(process.env) const url = new URL(req.url); const path = url.searchParams.get("path"); if (!path) { From df37a8e56707529ffae8781990580e02f662e46a Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 16:49:30 -0700 Subject: [PATCH 10/40] Dump more info --- src/routes/echo/+server.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index d3a5e60..423c9a2 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -1,5 +1,6 @@ import sharp from "sharp"; import process from "process"; +import fs from "fs"; import { json } from "@sveltejs/kit"; // Forces the use of the fonts in the lambda layer. @@ -10,7 +11,8 @@ const fontFamily = 'Roboto' export const GET = async (req) => { console.log(process.env) + const fontfiles = fs.readdirSync('/var/task/fonts'); - return json({env: process.env}); + return json({env: process.env, fontfiles}); } \ No newline at end of file From d81d5b7961b4d3ed5dffb7dc5db4897a92a422d1 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 16:51:16 -0700 Subject: [PATCH 11/40] List out files in fonts --- src/routes/echo/+server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index 423c9a2..21586de 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -11,7 +11,7 @@ const fontFamily = 'Roboto' export const GET = async (req) => { console.log(process.env) - const fontfiles = fs.readdirSync('/var/task/fonts'); + const fontfiles = fs.readdirSync('/var/task/fonts').map(toString); return json({env: process.env, fontfiles}); From c0b98992a0764551f8cb1afdc24bf81be1d3ce18 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 16:54:17 -0700 Subject: [PATCH 12/40] again --- src/routes/echo/+server.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index 21586de..f4d3ceb 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -11,8 +11,14 @@ const fontFamily = 'Roboto' export const GET = async (req) => { console.log(process.env) - const fontfiles = fs.readdirSync('/var/task/fonts').map(toString); + let error = '' + let fontfiles = [] + try { + fontfiles = fs.readdirSync('/var/task/fonts').map(toString); + } catch (e) { + error = e.toString(); + } - return json({env: process.env, fontfiles}); + return json({env: process.env, fontfiles, error}); } \ No newline at end of file From 0f95e4eef478006badde57d9a8a7e6cca1fd6a1c Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 16:57:56 -0700 Subject: [PATCH 13/40] List the other directory /var/task instead --- src/routes/echo/+server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index f4d3ceb..1471142 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -12,13 +12,13 @@ const fontFamily = 'Roboto' export const GET = async (req) => { console.log(process.env) let error = '' - let fontfiles = [] + let taskfiles = [] try { - fontfiles = fs.readdirSync('/var/task/fonts').map(toString); + taskfiles = fs.readdirSync('/var/task').map(toString); } catch (e) { error = e.toString(); } - return json({env: process.env, fontfiles, error}); + return json({env: process.env, taskfiles, error}); } \ No newline at end of file From 79b24d11d04781bd0c8b651c3da55b34fe768d17 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 17:01:50 -0700 Subject: [PATCH 14/40] Continue to debug /var/task --- src/routes/echo/+server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index 1471142..cae4233 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -14,7 +14,7 @@ export const GET = async (req) => { let error = '' let taskfiles = [] try { - taskfiles = fs.readdirSync('/var/task').map(toString); + taskfiles = fs.readdirSync('/var/task'); } catch (e) { error = e.toString(); } From a4409d1d572d2e392c3cb353f6c47e048a3d08e2 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 17:18:55 -0700 Subject: [PATCH 15/40] Add back the og edge function to see if it works --- netlify.toml | 5 ++ netlify/edge-functions/ogx.tsx | 122 +++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 netlify/edge-functions/ogx.tsx diff --git a/netlify.toml b/netlify.toml index 74eba01..40ea84e 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,3 +1,8 @@ [build] command = "npm run build" publish = "build" + edge_functions = "netlify/edge-functions" + +[[edge_functions]] + path = "/ogx" + function = "ogx" \ No newline at end of file diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx new file mode 100644 index 0000000..b968d2b --- /dev/null +++ b/netlify/edge-functions/ogx.tsx @@ -0,0 +1,122 @@ +import type { Config, Context } from "@netlify/edge-functions"; +import { ImageResponse } from "https://deno.land/x/og_edge/mod.ts"; +import React from "https://esm.sh/react@18.2.0"; + +import { getZoneInfo, colors } from "../common.js"; + + +export default async (request: Request, context: Context) => { + let url = new URL(request.url); + let path = url.searchParams.get("path"); + const info = getZoneInfo(path); + + console.log("URL:", info); + + return new ImageResponse( + ( +
+ {info?.zones.map((z, i) => ( +
+ +
{z.niceZoneName}
+
{z.startString}
+
+ ))} + Hello! +
+ ) + ); +} + +export const config = { + path: "/ogx", + cache: "manual", +}; + + +// //og.jpg?path= +// export default async (request, context) => { +// let url = new URL(request.url); +// let path = url.searchParams.get("path"); +// const info = getZoneInfo(path); + +// console.log("URL:", info); + +// // const canvas = new Canvas(1200, 630); +// // const ctx = canvas.getContext("2d"); + +// // if (info) { +// // ctx.beginPath(); +// // ctx.rect(0, 0, canvas.width, canvas.height); +// // ctx.fillStyle = "rgba(255,255,255,1.0)"; +// // ctx.fill(); + +// // var count = info.zones.length; +// // var width = canvas.width / count; +// // var height = canvas.height; +// // var size = width / 5; +// // ctx.textAlign = "center"; +// // info.zones.forEach((z, i) => { +// // ctx.beginPath(); +// // ctx.rect(width * i, 0, width, canvas.height); +// // var hour = z.zoneStart.hour(); +// // var grd = ctx.createLinearGradient(0, 0, 0, height); +// // grd.addColorStop(0, colors[hour * 2]); +// // grd.addColorStop(1, colors[hour * 2 + 1]); +// // ctx.fillStyle = grd; +// // console.log(colors[hour * 2], colors[hour * 1 + 1]); +// // ctx.fill(); +// // }); + +// // info.zones.forEach((z, i) => { +// // ctx.fillStyle = z.night ? "white" : "black"; +// // ctx.globalCompositeOperation = "hard-light"; + +// // ctx.font = `${size / 1.5}px Arial`; +// // ctx.globalAlpha = 0.5; +// // ctx.fillText(z.niceZoneName, width * (0.5 + i), height / 2 - size / 2); + +// // ctx.font = `${size}px Arial`; +// // ctx.globalAlpha = 0.8; +// // ctx.fillText(z.startString, width * (0.5 + i), height / 2 + size / 2); +// // }); +// // } + +// // const stream = canvas.createJPEGStream(); +// // const chunks = []; + +// // for await (let chunk of stream) { +// // chunks.push(chunk); +// // } + +// // const buffer = Buffer.concat(chunks); + +// // return { +// // statusCode: 200, +// // headers: { +// // "Content-Type": "image/jpeg", +// // "Content-Disposition": 'attachment; filename="ogimage.jpg"', +// // "Cache-Control": "public, max-age=60, s-maxage=31536000", +// // }, +// // body: buffer.toString("base64"), +// // isBase64Encoded: true, +// // }; +// }; + +// export const config = { +// path: "/og.jpg*", +// }; \ No newline at end of file From f84b8429aa26317f16ec89173760f562548b471e Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 19:44:04 -0700 Subject: [PATCH 16/40] Attempt to hook up the hold ogx --- netlify/edge-functions/ogx.tsx | 44 +++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index b968d2b..22cd53a 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -1,16 +1,54 @@ import type { Config, Context } from "@netlify/edge-functions"; import { ImageResponse } from "https://deno.land/x/og_edge/mod.ts"; import React from "https://esm.sh/react@18.2.0"; +import {DateTime} from "https://esm.sh/luxon@2"; + +export const emptyZoneInfo = (): any=> { + return { + description: '', + night: false, + zoneStart: DateTime.local(), + zoneEnd: null, + emoji: '', + niceZoneName: 'SPC', + startString: '00:01 PM', + endString: '', + extraDay: false, +}; +} -import { getZoneInfo, colors } from "../common.js"; +const getZoneInfo = (path: string) : any => { + let zones : any[] = []; + zones.push(emptyZoneInfo()); + return zones; +} export default async (request: Request, context: Context) => { let url = new URL(request.url); let path = url.searchParams.get("path"); + + const info = getZoneInfo(path); + if (!info.zones) { + return new ImageResponse( +
+ Hello! +
+ ); + } - console.log("URL:", info); + const zones = info.zones; return new ImageResponse( ( @@ -25,7 +63,7 @@ export default async (request: Request, context: Context) => { backgroundImage: "linear-gradient(#e66465, #9198e5)" }} > - {info?.zones.map((z, i) => ( + {zones.map((z, i) => (
Date: Sun, 27 Oct 2024 19:51:23 -0700 Subject: [PATCH 17/40] Update to work on localhost --- vite.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.js b/vite.config.js index 3b24264..76cd646 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,6 +4,7 @@ import { defineConfig } from 'vite'; export default defineConfig({ plugins: [sveltekit()], server: { + host: '0.0.0.0', port: 12345 } From daaeefba158d9296de643b88c9095ec03ee30736 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 19:54:01 -0700 Subject: [PATCH 18/40] Fix bugs with the ogx --- netlify/edge-functions/ogx.tsx | 3 +-- src/routes/og/+server.js | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 22cd53a..4d6b68c 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -20,7 +20,7 @@ export const emptyZoneInfo = (): any=> { const getZoneInfo = (path: string) : any => { let zones : any[] = []; zones.push(emptyZoneInfo()); - return zones; + return {zones}; } @@ -28,7 +28,6 @@ export default async (request: Request, context: Context) => { let url = new URL(request.url); let path = url.searchParams.get("path"); - const info = getZoneInfo(path); if (!info.zones) { return new ImageResponse( diff --git a/src/routes/og/+server.js b/src/routes/og/+server.js index 771aad2..692c18d 100644 --- a/src/routes/og/+server.js +++ b/src/routes/og/+server.js @@ -84,7 +84,6 @@ const generateSvg = (width, height, zones) => { } export const GET = async (req) => { - console.log(process.env) const url = new URL(req.url); const path = url.searchParams.get("path"); if (!path) { From 634e2421d3defb98b527f9fb22c0446cd5c3c88f Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 19:57:55 -0700 Subject: [PATCH 19/40] No zones --- netlify/edge-functions/ogx.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 4d6b68c..4c68d3c 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -28,7 +28,7 @@ export default async (request: Request, context: Context) => { let url = new URL(request.url); let path = url.searchParams.get("path"); - const info = getZoneInfo(path); + const info = {}; //getZoneInfo(path); if (!info.zones) { return new ImageResponse(
Date: Sun, 27 Oct 2024 20:01:48 -0700 Subject: [PATCH 20/40] Try importing from other sources to see if it works. --- netlify/edge-functions/ogx.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 4c68d3c..df98a14 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -3,6 +3,8 @@ import { ImageResponse } from "https://deno.land/x/og_edge/mod.ts"; import React from "https://esm.sh/react@18.2.0"; import {DateTime} from "https://esm.sh/luxon@2"; +import { colors } from '../../src/lib/timezones.js' + export const emptyZoneInfo = (): any=> { return { description: '', From c52190998e69a4c4f5888e11b9a9b4d762d3e998 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:03:48 -0700 Subject: [PATCH 21/40] Hook up the fake getZoneInfo --- netlify/edge-functions/ogx.tsx | 2 +- src/routes/[tzstring]/+page.svelte | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index df98a14..651f98f 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -30,7 +30,7 @@ export default async (request: Request, context: Context) => { let url = new URL(request.url); let path = url.searchParams.get("path"); - const info = {}; //getZoneInfo(path); + const info = getZoneInfo(path); if (!info.zones) { return new ImageResponse(
+
+Title +
{#each timezones as timezone} From 19d7844b96f97824ad7b2c703b81bccb73ad1433 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:05:42 -0700 Subject: [PATCH 22/40] zoneinfo fix --- netlify/edge-functions/ogx.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 651f98f..504056c 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -67,7 +67,7 @@ export default async (request: Request, context: Context) => { {zones.map((z, i) => (
From f7b63257c513d3d7e1a19d658189ef974b5d7a21 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:12:12 -0700 Subject: [PATCH 23/40] Check if colors is working --- netlify/edge-functions/ogx.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 504056c..64a24b0 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -30,6 +30,8 @@ export default async (request: Request, context: Context) => { let url = new URL(request.url); let path = url.searchParams.get("path"); + console.log('colors', colors); + const info = getZoneInfo(path); if (!info.zones) { return new ImageResponse( From dfc10e110c62ecd65651630b25563f9fd4c86b0c Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:20:39 -0700 Subject: [PATCH 24/40] Debugging colors --- netlify/edge-functions/ogx.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 64a24b0..d483d09 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -9,7 +9,7 @@ export const emptyZoneInfo = (): any=> { return { description: '', night: false, - zoneStart: DateTime.local(), + zoneStart: DateTime.now(), zoneEnd: null, emoji: '', niceZoneName: 'SPC', @@ -30,8 +30,6 @@ export default async (request: Request, context: Context) => { let url = new URL(request.url); let path = url.searchParams.get("path"); - console.log('colors', colors); - const info = getZoneInfo(path); if (!info.zones) { return new ImageResponse( @@ -52,6 +50,8 @@ export default async (request: Request, context: Context) => { } const zones = info.zones; + console.log('Hours', zones.map(z => z.zoneStart.hour); + console.log('Colors', zones.map(z => colors[z.zoneStart.hour * 2], colors[z.zoneStart.hour * 2 + 1]); return new ImageResponse( ( @@ -66,7 +66,7 @@ export default async (request: Request, context: Context) => { backgroundImage: "linear-gradient(#e66465, #9198e5)" }} > - {zones.map((z, i) => ( + {zones.map((z: any, i: number) => (
{ ); } -export const config = { +export const config : Config = { path: "/ogx", cache: "manual", }; From 6ecc578bc6306fe4682e529e080a18e0232ce0b8 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:22:14 -0700 Subject: [PATCH 25/40] Fix syntax --- netlify/edge-functions/ogx.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index d483d09..83e2f0d 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -50,8 +50,8 @@ export default async (request: Request, context: Context) => { } const zones = info.zones; - console.log('Hours', zones.map(z => z.zoneStart.hour); - console.log('Colors', zones.map(z => colors[z.zoneStart.hour * 2], colors[z.zoneStart.hour * 2 + 1]); + console.log('Hours', zones.map(z => z.zoneStart.hour)); + console.log('Colors', zones.map(z => colors[z.zoneStart.hour * 2])); return new ImageResponse( ( From 9d66c0a0595f2a3e5fbf41b7ef5fb86f99ab06a2 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:28:08 -0700 Subject: [PATCH 26/40] Return nothing if no path --- netlify/edge-functions/ogx.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 83e2f0d..8c5dbe5 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -21,6 +21,9 @@ export const emptyZoneInfo = (): any=> { const getZoneInfo = (path: string) : any => { let zones : any[] = []; + if (!path) { + return {} + } zones.push(emptyZoneInfo()); return {zones}; } From 89a9da3f788a3fe336faa3d8805c80c3f04ba5c4 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:30:04 -0700 Subject: [PATCH 27/40] Maybe fix a react error --- netlify/edge-functions/ogx.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 8c5dbe5..89f6165 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -80,7 +80,6 @@ export default async (request: Request, context: Context) => {
{z.startString}
))} - Hello!
) ); From 4af91c158577ccde5340d56109f823569972fbf7 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:32:39 -0700 Subject: [PATCH 28/40] Another fix --- netlify/edge-functions/ogx.tsx | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 89f6165..8010b6d 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -56,6 +56,18 @@ export default async (request: Request, context: Context) => { console.log('Hours', zones.map(z => z.zoneStart.hour)); console.log('Colors', zones.map(z => colors[z.zoneStart.hour * 2])); + // const zonesElements = zones.map((z: any, i: number) => ( + //
+ + //
{z.niceZoneName}
+ //
{z.startString}
+ //
+ // )); + return new ImageResponse( (
{ backgroundImage: "linear-gradient(#e66465, #9198e5)" }} > - {zones.map((z: any, i: number) => ( -
- -
{z.niceZoneName}
-
{z.startString}
-
- ))} +
) ); From 0ab9fd96865bd7f8fa01c5afb5c3b5067b5a9ed8 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:54:54 -0700 Subject: [PATCH 29/40] Zones element --- netlify/edge-functions/ogx.tsx | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 8010b6d..3a57f49 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -56,17 +56,15 @@ export default async (request: Request, context: Context) => { console.log('Hours', zones.map(z => z.zoneStart.hour)); console.log('Colors', zones.map(z => colors[z.zoneStart.hour * 2])); - // const zonesElements = zones.map((z: any, i: number) => ( - //
- - //
{z.niceZoneName}
- //
{z.startString}
- //
- // )); + const zonesElements = zones.map((z: any, i: number) => { + const background = `linear-gradient(${colors[z.zoneStart.hour * 2]}, ${colors[z.zoneStart.hour * 2 + 1]})`; + return ( +
+
{z.niceZoneName}
+
{z.startString}
+
+ ) + }); return new ImageResponse( ( From 741c8673e5b81314ad008d66c39f46996804647f Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 20:57:46 -0700 Subject: [PATCH 30/40] Add zones --- netlify/edge-functions/ogx.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 3a57f49..26b39ab 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -79,7 +79,7 @@ export default async (request: Request, context: Context) => { backgroundImage: "linear-gradient(#e66465, #9198e5)" }} > - + ${zonesElements}
) ); From b7bc59f04b61976e879554073b556e4a40fa4e6b Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 21:01:50 -0700 Subject: [PATCH 31/40] stringify zone --- netlify/edge-functions/ogx.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 26b39ab..44a5c3a 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -59,7 +59,7 @@ export default async (request: Request, context: Context) => { const zonesElements = zones.map((z: any, i: number) => { const background = `linear-gradient(${colors[z.zoneStart.hour * 2]}, ${colors[z.zoneStart.hour * 2 + 1]})`; return ( -
+
{z.niceZoneName}
{z.startString}
From 1bebf51ff876303a37d56522e42959cb053ff0ef Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 21:05:38 -0700 Subject: [PATCH 32/40] Another fix for the netlify zone --- netlify/edge-functions/ogx.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 44a5c3a..4fbccac 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -5,15 +5,15 @@ import {DateTime} from "https://esm.sh/luxon@2"; import { colors } from '../../src/lib/timezones.js' -export const emptyZoneInfo = (): any=> { +export const emptyZoneInfo = (zone: string): any=> { return { description: '', night: false, - zoneStart: DateTime.now(), + zoneStart: DateTime.now().setZone(zone), zoneEnd: null, emoji: '', - niceZoneName: 'SPC', - startString: '00:01 PM', + niceZoneName: zone, + startString: DateTime.now().setZone(zone).toFormat('h:mm a'), endString: '', extraDay: false, }; @@ -24,7 +24,8 @@ const getZoneInfo = (path: string) : any => { if (!path) { return {} } - zones.push(emptyZoneInfo()); + zones.push(emptyZoneInfo('EST')); + zones.push(emptyZoneInfo('PST')); return {zones}; } @@ -60,8 +61,9 @@ export default async (request: Request, context: Context) => { const background = `linear-gradient(${colors[z.zoneStart.hour * 2]}, ${colors[z.zoneStart.hour * 2 + 1]})`; return (
-
{z.niceZoneName}
-
{z.startString}
+
Hello
+ {/*
{z.niceZoneName}
+
{z.startString}
*/}
) }); From c60e9632311180526f205f244761ba2d716201b9 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 21:15:09 -0700 Subject: [PATCH 33/40] Update the style --- netlify/edge-functions/ogx.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/netlify/edge-functions/ogx.tsx b/netlify/edge-functions/ogx.tsx index 4fbccac..78a8ae4 100644 --- a/netlify/edge-functions/ogx.tsx +++ b/netlify/edge-functions/ogx.tsx @@ -59,8 +59,16 @@ export default async (request: Request, context: Context) => { const zonesElements = zones.map((z: any, i: number) => { const background = `linear-gradient(${colors[z.zoneStart.hour * 2]}, ${colors[z.zoneStart.hour * 2 + 1]})`; + const zoneStyle = { + backgroundImage: background, + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + fontSize: 128, + } return ( -
+
Hello
{/*
{z.niceZoneName}
{z.startString}
*/} @@ -75,10 +83,11 @@ export default async (request: Request, context: Context) => { width: "100%", height: "100%", display: "flex", + flexDirection: "row", alignItems: "center", justifyContent: "center", fontSize: 128, - backgroundImage: "linear-gradient(#e66465, #9198e5)" + backgroundImage: "linear-gradient(#9198e5, #9198e5)" }} > ${zonesElements} From 39b0e41b09c52e5116b2543fe11e5231c59dab78 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 22:25:59 -0700 Subject: [PATCH 34/40] A little bit more debugging --- src/routes/echo/+server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index cae4233..ba256e8 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -14,7 +14,7 @@ export const GET = async (req) => { let error = '' let taskfiles = [] try { - taskfiles = fs.readdirSync('/var/task'); + taskfiles = fs.readdirSync('/var/task/.netlify'); } catch (e) { error = e.toString(); } From d38fedc209af24bd7b2ff5bc43d19dfb519d17d1 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 22:39:09 -0700 Subject: [PATCH 35/40] Update debug --- src/routes/echo/+server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index ba256e8..f997b6f 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -14,7 +14,7 @@ export const GET = async (req) => { let error = '' let taskfiles = [] try { - taskfiles = fs.readdirSync('/var/task/.netlify'); + taskfiles = fs.readdirSync('/var/task/.netlify/server'); } catch (e) { error = e.toString(); } From 3df6adbacb2e564c4a1dcf95e2df9472bfe3a6eb Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 22:42:51 -0700 Subject: [PATCH 36/40] Add build steps to force copy the fonts into the server deployment --- package.json | 3 ++- pnpm-lock.yaml | 47 ++++++++++++++++++++++++++++++++++++++ src/routes/echo/+server.js | 8 +++---- static/fonts/fonts.conf | 2 +- vite.config.js | 12 +++++++++- 5 files changed, 65 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 9af6ff4..f947981 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "prettier-plugin-tailwindcss": "^0.6.5", "svelte": "^5.0.0", "tailwindcss": "^3.4.9", - "vite": "^5.0.3" + "vite": "^5.0.3", + "vite-plugin-static-copy": "^2.0.0" }, "dependencies": { "luxon": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8ff249..06ca143 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,6 +66,9 @@ importers: vite: specifier: ^5.0.3 version: 5.4.10 + vite-plugin-static-copy: + specifier: ^2.0.0 + version: 2.0.0(vite@5.4.10) packages: @@ -869,6 +872,10 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -903,6 +910,9 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -979,6 +989,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1433,6 +1446,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -1445,6 +1462,12 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + vite-plugin-static-copy@2.0.0: + resolution: {integrity: sha512-b/quFjTUa/RY9t3geIyeeT2GtWEoRI0GawYFFjys5iMLGgVP638NTGu0RoMjwmi8MoZZ3BQw4OQvb1GpVcXZDA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vite@5.4.10: resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2238,6 +2261,12 @@ snapshots: fraction.js@4.3.7: {} + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fsevents@2.3.3: optional: true @@ -2268,6 +2297,8 @@ snapshots: globrex@0.1.2: {} + graceful-fs@4.2.11: {} + has-flag@4.0.0: {} hasown@2.0.2: @@ -2329,6 +2360,12 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -2750,6 +2787,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + universalify@2.0.1: {} + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 @@ -2762,6 +2801,14 @@ snapshots: util-deprecate@1.0.2: {} + vite-plugin-static-copy@2.0.0(vite@5.4.10): + dependencies: + chokidar: 3.6.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + picocolors: 1.1.1 + vite: 5.4.10 + vite@5.4.10: dependencies: esbuild: 0.21.5 diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index f997b6f..5630c35 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -4,7 +4,7 @@ import fs from "fs"; import { json } from "@sveltejs/kit"; // Forces the use of the fonts in the lambda layer. -process.env.FONTCONFIG_PATH='/var/task/fonts' +process.env.FONTCONFIG_PATH='/var/task/.netlify/server/fonts' const fontFamily = 'Roboto' @@ -12,13 +12,13 @@ const fontFamily = 'Roboto' export const GET = async (req) => { console.log(process.env) let error = '' - let taskfiles = [] + let dirfiles = [] try { - taskfiles = fs.readdirSync('/var/task/.netlify/server'); + dirfiles = fs.readdirSync('/var/task/.netlify/server'); } catch (e) { error = e.toString(); } - return json({env: process.env, taskfiles, error}); + return json({env: process.env, dirfiles, error}); } \ No newline at end of file diff --git a/static/fonts/fonts.conf b/static/fonts/fonts.conf index 70a647a..d3f2c87 100644 --- a/static/fonts/fonts.conf +++ b/static/fonts/fonts.conf @@ -1,7 +1,7 @@ - /var/task/fonts/ + /var/task/.netlify/server/fonts /tmp/fonts-cache/ diff --git a/vite.config.js b/vite.config.js index 76cd646..e99fcda 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,8 +1,18 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; +import { viteStaticCopy } from 'vite-plugin-static-copy' + +const staticCopyConfig = { + targets: [ + { + src: 'static/fonts', + dest: 'fonts' + } + ] +} export default defineConfig({ - plugins: [sveltekit()], + plugins: [sveltekit(), viteStaticCopy(staticCopyConfig)], server: { host: '0.0.0.0', port: 12345 From 4eebe95b0dc2ffba22cf0da79937e8d87ed6555a Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 22:43:16 -0700 Subject: [PATCH 37/40] Add back title --- src/routes/[tzstring]/+page.svelte | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/routes/[tzstring]/+page.svelte b/src/routes/[tzstring]/+page.svelte index 3116689..e89b971 100644 --- a/src/routes/[tzstring]/+page.svelte +++ b/src/routes/[tzstring]/+page.svelte @@ -8,6 +8,7 @@ let description = 'timezone.fyi' let timezones = []; let path = '' + let title // TODO: Extract title from first path component $: { path = data.tzstring; @@ -37,9 +38,12 @@ +{#if title}
-Title +{title}
+{/if} +
{#each timezones as timezone} From 1515ef6fe5aca8061cc6e87d792aa033c38ae099 Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Sun, 27 Oct 2024 22:49:13 -0700 Subject: [PATCH 38/40] Trying to do a better job copying the files --- src/routes/og/+server.js | 2 +- vite.config.js | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/routes/og/+server.js b/src/routes/og/+server.js index 692c18d..9cba4b3 100644 --- a/src/routes/og/+server.js +++ b/src/routes/og/+server.js @@ -3,7 +3,7 @@ import { getZoneInfo, colors } from "$lib/timezones.js"; import process from "process"; // Forces the use of the fonts in the lambda layer. -process.env.FONTCONFIG_PATH='/var/task/fonts' +process.env.FONTCONFIG_PATH='/var/task/.netlify/server/fonts' const fontFamily = 'Roboto' diff --git a/vite.config.js b/vite.config.js index e99fcda..0634e4f 100644 --- a/vite.config.js +++ b/vite.config.js @@ -5,9 +5,14 @@ import { viteStaticCopy } from 'vite-plugin-static-copy' const staticCopyConfig = { targets: [ { - src: 'static/fonts', + src: 'static/fonts/fonts.conf', + dest: 'fonts/' + }, + { + src: 'static/fonts/Roboto-Regular-webfont.woff', dest: 'fonts' } + ] } From 3cdf06d01fb7ffa7e63a3ebf40c636030bc7bfba Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Fri, 1 Nov 2024 20:48:32 +0900 Subject: [PATCH 39/40] Make echo allow customizing where to point the readdir method --- src/routes/echo/+server.js | 40 ++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index 5630c35..0ddec34 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -1,24 +1,26 @@ -import sharp from "sharp"; -import process from "process"; -import fs from "fs"; -import { json } from "@sveltejs/kit"; +import sharp from 'sharp'; +import process from 'process'; +import fs from 'fs'; +import { json } from '@sveltejs/kit'; // Forces the use of the fonts in the lambda layer. -process.env.FONTCONFIG_PATH='/var/task/.netlify/server/fonts' +process.env.FONTCONFIG_PATH = '/var/task/.netlify/server/fonts'; -const fontFamily = 'Roboto' +const fontFamily = 'Roboto'; +export const GET = async ({ url }) => { + let localPath = url.searchParams.path; + if (!localPath) { + localPath = '/var/task/.netlify/server'; + } + console.log(process.env); + let error = ''; + let dirfiles = []; + try { + dirfiles = fs.readdirSync(localPath); + } catch (e) { + error = e.toString(); + } -export const GET = async (req) => { - console.log(process.env) - let error = '' - let dirfiles = [] - try { - dirfiles = fs.readdirSync('/var/task/.netlify/server'); - } catch (e) { - error = e.toString(); - } - - return json({env: process.env, dirfiles, error}); - -} \ No newline at end of file + return json({ env: process.env, dirfiles, error }); +}; From 375bef43379a60a430446f9955fa1301d8d6bd9a Mon Sep 17 00:00:00 2001 From: Alastair Tse Date: Fri, 1 Nov 2024 20:51:40 +0900 Subject: [PATCH 40/40] Fix searchParams --- src/routes/echo/+server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/echo/+server.js b/src/routes/echo/+server.js index 0ddec34..2aa4268 100644 --- a/src/routes/echo/+server.js +++ b/src/routes/echo/+server.js @@ -9,7 +9,7 @@ process.env.FONTCONFIG_PATH = '/var/task/.netlify/server/fonts'; const fontFamily = 'Roboto'; export const GET = async ({ url }) => { - let localPath = url.searchParams.path; + let localPath = url.searchParams.get('path'); if (!localPath) { localPath = '/var/task/.netlify/server'; }