From 144f4bfad6dbbb31366e8dc29861fabe8a06b7d5 Mon Sep 17 00:00:00 2001 From: RedrockJS Date: Fri, 5 Dec 2025 15:25:09 +0300 Subject: [PATCH] fix: add open graph autogen image --- .idea/workspace.xml | 14 +- package-lock.json | 1000 ++++++++++++++++++++++++- package.json | 1 + public/images/ogBg.png | Bin 0 -> 39665 bytes public/images/only-eagle-logo.png | Bin 0 -> 7390 bytes src/app/api/og-image/lib/render.ts | 10 + src/app/api/og-image/lib/template.tsx | 38 + src/app/api/og-image/lib/types.ts | 4 + src/app/api/og-image/route.ts | 33 + src/app/api/og/route.ts | 53 ++ 10 files changed, 1127 insertions(+), 26 deletions(-) create mode 100644 public/images/ogBg.png create mode 100644 public/images/only-eagle-logo.png create mode 100644 src/app/api/og-image/lib/render.ts create mode 100644 src/app/api/og-image/lib/template.tsx create mode 100644 src/app/api/og-image/lib/types.ts create mode 100644 src/app/api/og-image/route.ts create mode 100644 src/app/api/og/route.ts diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 26bafef..1d25827 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,8 +5,15 @@ + + + + + + - + + - @@ -70,6 +77,7 @@ } + diff --git a/package-lock.json b/package-lock.json index 6761168..37fdbc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "libphonenumber-js": "^1.12.9", "next": "15.5.2", "nodemailer": "7.0.11", + "puppeteer": "^24.32.0", "react": "19.1.1", "react-dom": "19.1.1", "react-hook-form": "^7.60.0", @@ -39,6 +40,29 @@ "typescript": "^5" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@emnapi/core": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", @@ -965,6 +989,27 @@ "node": ">=12.4.0" } }, + "node_modules/@puppeteer/browsers": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.0.tgz", + "integrity": "sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.3", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -994,6 +1039,12 @@ "tslib": "^2.8.0" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", @@ -1030,7 +1081,7 @@ "version": "20.19.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz", "integrity": "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -1066,6 +1117,16 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.34.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz", @@ -1645,6 +1706,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1695,7 +1765,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -1725,7 +1794,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/aria-query": { @@ -1898,6 +1966,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -1951,6 +2031,20 @@ "node": ">= 0.4" } }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1958,6 +2052,106 @@ "dev": true, "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.2.tgz", + "integrity": "sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1995,6 +2189,15 @@ "node": ">=8" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -2049,7 +2252,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -2130,6 +2332,19 @@ "node": ">= 6" } }, + "node_modules/chromium-bidi": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-11.0.0.tgz", + "integrity": "sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -2169,6 +2384,87 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -2197,7 +2493,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2210,7 +2505,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true, "license": "MIT" }, "node_modules/color-string": { @@ -2248,6 +2542,32 @@ "dev": true, "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2276,6 +2596,15 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -2331,10 +2660,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2391,6 +2719,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -2401,6 +2743,12 @@ "node": ">=8" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1534754", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1534754.tgz", + "integrity": "sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==", + "license": "BSD-3-Clause" + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -2436,6 +2784,24 @@ "dev": true, "license": "MIT" }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -2449,6 +2815,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -2626,6 +3007,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2639,6 +3029,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/eslint": { "version": "9.29.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", @@ -3019,6 +3430,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -3049,7 +3473,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3059,7 +3482,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -3072,6 +3494,35 @@ "dev": true, "license": "MIT" }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3079,6 +3530,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", @@ -3133,6 +3590,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -3269,6 +3735,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-east-asian-width": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", @@ -3321,6 +3796,21 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -3352,6 +3842,20 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3518,6 +4022,32 @@ "node": ">= 0.4" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/husky": { "version": "9.1.7", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", @@ -3555,7 +4085,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -3593,6 +4122,15 @@ "node": ">= 0.4" } }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -4069,7 +4607,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4085,6 +4622,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4191,6 +4734,12 @@ "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/lint-staged": { "version": "16.1.2", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.2.tgz", @@ -4351,6 +4900,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4421,11 +4979,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nano-spawn": { @@ -4482,6 +5045,15 @@ "dev": true, "license": "MIT" }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/next": { "version": "15.5.2", "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz", @@ -4675,6 +5247,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/onetime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", @@ -4759,11 +5340,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -4772,6 +5384,24 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4799,6 +5429,12 @@ "dev": true, "license": "MIT" }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -4895,6 +5531,15 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4906,6 +5551,41 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4916,6 +5596,45 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "24.32.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.32.0.tgz", + "integrity": "sha512-exyxHPV5DSsigIhM/pzLcyzl5XU4Dp5lNP+APwIeStDxAdYqpMnJ1qN0QHXghjJx+cQJczby+ySH5rgv/5GQLw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.11.0", + "chromium-bidi": "11.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1534754", + "puppeteer-core": "24.32.0", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.32.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.32.0.tgz", + "integrity": "sha512-MqzLLeJjqjtHK9J44+KE3kjtXXhFpPvg+AvXl/oy/jB8MeeNH66/4MNotOTqGZ6MPaxWi51YJ1ASga6OIff6xw==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.11.0", + "chromium-bidi": "11.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1534754", + "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.3.9", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5064,6 +5783,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -5089,7 +5817,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -5244,10 +5971,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "devOptional": true, + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5500,6 +6226,54 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5530,6 +6304,17 @@ "node": ">= 0.4" } }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -5785,6 +6570,40 @@ "node": ">= 4.7.0" } }, + "node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -5966,11 +6785,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -6003,7 +6828,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/unrs-resolver": { @@ -6051,6 +6876,12 @@ "punycode": "^2.1.0" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.9.tgz", + "integrity": "sha512-uIYvlRQ0PwtZR1EzHlTMol1G0lAlmOe6wPykF9a77AK3bkpvZHzIVxRE2ThOx5vjy2zISe0zhwf5rzuUfbo1PQ==", + "license": "Apache-2.0" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6197,6 +7028,42 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yaml": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", @@ -6210,6 +7077,93 @@ "node": ">= 14.6" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 08c797a..7dfcbf6 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "libphonenumber-js": "^1.12.9", "next": "15.5.2", "nodemailer": "7.0.11", + "puppeteer": "^24.32.0", "react": "19.1.1", "react-dom": "19.1.1", "react-hook-form": "^7.60.0", diff --git a/public/images/ogBg.png b/public/images/ogBg.png new file mode 100644 index 0000000000000000000000000000000000000000..8afc32de044ac48a0b3a353f106bc8a5b749a7da GIT binary patch literal 39665 zcmbtd30RX?)&>GZWvjM`vex?7I-oKts3=QqtG3#@w2g5Ii5&(}T!=DASi>TGx zt&@q#neOtSUZLwjauuJhlbiALhV#P*|^cPP4caLU_yU`R|Hm+D; zBUmjx^Cwx+py|@6#nnMiyBV=fv2AHNYq1~KltwZut5oZ{d3oyiV=A88LYeGbPY?Hn z_~OPY)t-Hs)Sd@hnE`Xuo%H)&(Vdaqdp;2tovrAexq1nUzfYx_`$)CrOxBOjWEH>3 z+Rp9`I9OUtX6E|IDlTbUuSeGvaT+?Gb9OVC@z+<(iq6VX>DlF|Xq-$v6(nRW zQAF0LG0|*g={5Mr)gB>>zKM}O+m5sRnH|+Wg1|W!jENq>U&)$w)$>0(S$;2x^`BYv zh+OrYS~qUVGGiNV`acMH; zR8XRBI)QFF0Zf+&)6ro%HcUr>>DcFj1u&gJ6kXnoiGN;4+bJY1p3E)zjG57FM|p69 zUkm@;HTdp?TnlndD;D~PT0mO25Od#bN%`ct9VIS6+$IqJvW~X99>(!>ls8%A!P84J;=-hsa(X?P|cz79R;?{Wzan^2p7Rdtc#8kGR!l zz{W^3#06XL%B9~jcgjPn+c42bRmtR{C$a^qWb*t@BIm;PdeV7cp5xg72I-Cs@5+%x z@^|o8$79ph@DnZATh(uxl1sA<Mz?KxgI zKVvF2ur#V*wg{?^bR8DU`ZmmW}ZBBFH`RRz3lxm z8;VWOQZx2Gm?^6r4m4H0yC8t>9nQquk4=W9C9@{NikCe|VC|er_eMH*rD#LgkF7X$ zi!@WbuxVFD&qeo!aR0!q

qPGq`Cecs4!+A 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 dotSB2^VD>Mc>8NXCh)(HmaYDP{oay literal 0 HcmV?d00001 diff --git a/public/images/only-eagle-logo.png b/public/images/only-eagle-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0d27846907839dc1595fe4b0d1a5900b162fea4a GIT binary patch literal 7390 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 literal 0 HcmV?d00001 diff --git a/src/app/api/og-image/lib/render.ts b/src/app/api/og-image/lib/render.ts new file mode 100644 index 0000000..31230fc --- /dev/null +++ b/src/app/api/og-image/lib/render.ts @@ -0,0 +1,10 @@ +import core from 'puppeteer'; + +export async function getScreenshot(html: string) { + const browser = await core.launch(); + const page = await browser.newPage(); + + await page.setViewport({ width: 1200, height: 630, deviceScaleFactor: 0.5 }); + await page.setContent(html); + return await page.screenshot({ type: 'png' }); +} diff --git a/src/app/api/og-image/lib/template.tsx b/src/app/api/og-image/lib/template.tsx new file mode 100644 index 0000000..652ef3c --- /dev/null +++ b/src/app/api/og-image/lib/template.tsx @@ -0,0 +1,38 @@ +import { ParsedRequest } from './types'; +import { FC } from 'react'; + +export const OGImage: FC = ({ title, desc }) => { + return ( +

+
+

+ {title} +

+

+ {desc} +

+
+
+ ); +}; + +export async function getHtml(parsedReq: ParsedRequest) { + const { title, desc } = parsedReq; + const { renderToString } = await import('react-dom/server'); + + const result = renderToString(); + + return result; +} diff --git a/src/app/api/og-image/lib/types.ts b/src/app/api/og-image/lib/types.ts new file mode 100644 index 0000000..3d61829 --- /dev/null +++ b/src/app/api/og-image/lib/types.ts @@ -0,0 +1,4 @@ +export interface ParsedRequest { + title?: string; + desc?: string; +} diff --git a/src/app/api/og-image/route.ts b/src/app/api/og-image/route.ts new file mode 100644 index 0000000..8d81020 --- /dev/null +++ b/src/app/api/og-image/route.ts @@ -0,0 +1,33 @@ +import { getHtml } from './lib/template'; +import { getScreenshot } from './lib/render'; +import { NextRequest } from 'next/server'; + +export async function GET(request: NextRequest) { + try { + const params = Object.fromEntries(request.nextUrl.searchParams); + const html = await getHtml(params); + const file = await getScreenshot(html); + + return new Response(file, { + status: 200, + statusText: 'OK', + headers: { + // 'Access-Control-Allow-Origin': '*', + // 'Access-Control-Allow-Methods': 'GET', + 'Content-Type': `image/png`, + 'Cache-Control': `public, immutable, no-transform, s-maxage=31536000, max-age=31536000`, + }, + }); + } catch (e) { + console.error(e); + return new Response( + '

Internal Error

Sorry, there was a problem

', + { + status: 500, + headers: { + 'Content-Type': 'text/html', + }, + }, + ); + } +} diff --git a/src/app/api/og/route.ts b/src/app/api/og/route.ts new file mode 100644 index 0000000..f981df6 --- /dev/null +++ b/src/app/api/og/route.ts @@ -0,0 +1,53 @@ +import { NextRequest, NextResponse } from 'next/server'; +import puppeteer from 'puppeteer'; + +export const dynamic = 'force-dynamic'; + +export async function GET(req: NextRequest) { + const title = req.nextUrl.searchParams.get('title') ?? 'Default title'; + const desc = req.nextUrl.searchParams.get('desc') ?? 'Default description'; + + const imageUrl = `${req.nextUrl.origin}/images/ogBg.png`; + const logoUrl = `${req.nextUrl.origin}/images/logo-dtr-white.png`; + + const html = ` + + + + +
+

${title}

+

${desc}

+
+ + + `; + + // Запуск браузера + const browser = await puppeteer.launch({ + args: ['--no-sandbox', '--disable-setuid-sandbox'], + }); + + const page = await browser.newPage(); + await page.setContent(html, { waitUntil: 'networkidle0' }); + await page.setViewport({ width: 600, height: 315 }); + const screenshot = await page.screenshot({ type: 'png' }); + await browser.close(); + + return new NextResponse(screenshot, { + headers: { + 'Content-Type': 'image/png', + 'Cache-Control': 'max-age=60', + }, + }); +}