From 74ba465bb10b19015cd4c21241a71a18495b6bfa Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 16 Mar 2025 19:01:23 -0400 Subject: [PATCH 01/71] refactor: upgrade to astro 5 --- package-lock.json | 3166 ++++++++++++++++++++------------------------- package.json | 6 +- 2 files changed, 1416 insertions(+), 1756 deletions(-) diff --git a/package-lock.json b/package-lock.json index 28f8fb4..9335b54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,39 +1,27 @@ { - "name": "datcode", + "name": "datcode-dot-org", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "datcode-dot-org", "version": "0.0.1", "dependencies": { - "@astrojs/check": "^0.9.2", + "@astrojs/check": "^0.9.4", "@pierre/vercel": "^1.1.1", - "astro": "^4.7.0", + "astro": "^5.5.2", "pierre": "^2.1.9", "typescript": "^5.5.4" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@astrojs/check": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.2.tgz", - "integrity": "sha512-6rWxtJTbd/ctdAlmla0CAvloGaai5IUTG0K21kctJHHGKJKnGH6Xana7m0zNOtHpVPEJi1SgC/TcsN+ltYt0Cg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.4.tgz", + "integrity": "sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==", "dependencies": { - "@astrojs/language-server": "^2.13.2", - "chokidar": "^3.5.3", - "fast-glob": "^3.3.1", + "@astrojs/language-server": "^2.15.0", + "chokidar": "^4.0.1", "kleur": "^4.1.5", "yargs": "^17.7.2" }, @@ -45,35 +33,36 @@ } }, "node_modules/@astrojs/compiler": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.10.3.tgz", - "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==" + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.11.0.tgz", + "integrity": "sha512-zZOO7i+JhojO8qmlyR/URui6LyfHJY6m+L9nwyX5GiKD78YoRaZ5tzz6X0fkl+5bD3uwlDHayf6Oe8Fu36RKNg==" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", - "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.6.1.tgz", + "integrity": "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==" }, "node_modules/@astrojs/language-server": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.13.4.tgz", - "integrity": "sha512-G57eikA4yGbixbgO7EMlLNH+lsIgjZs2nSuz0dAWL+Ueqz1TX6A0gV1HSIK9PZLFXYmngvWDGn0BLFuVs05QOg==", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.15.4.tgz", + "integrity": "sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==", "dependencies": { "@astrojs/compiler": "^2.10.3", + "@astrojs/yaml2ts": "^0.2.2", "@jridgewell/sourcemap-codec": "^1.4.15", - "@volar/kit": "~2.4.0-alpha.15", - "@volar/language-core": "~2.4.0-alpha.15", - "@volar/language-server": "~2.4.0-alpha.15", - "@volar/language-service": "~2.4.0-alpha.15", - "@volar/typescript": "~2.4.0-alpha.15", + "@volar/kit": "~2.4.7", + "@volar/language-core": "~2.4.7", + "@volar/language-server": "~2.4.7", + "@volar/language-service": "~2.4.7", "fast-glob": "^3.2.12", "muggle-string": "^0.4.1", - "volar-service-css": "0.0.59", - "volar-service-emmet": "0.0.59", - "volar-service-html": "0.0.59", - "volar-service-prettier": "0.0.59", - "volar-service-typescript": "0.0.59", - "volar-service-typescript-twoslash-queries": "0.0.59", + "volar-service-css": "0.0.62", + "volar-service-emmet": "0.0.62", + "volar-service-html": "0.0.62", + "volar-service-prettier": "0.0.62", + "volar-service-typescript": "0.0.62", + "volar-service-typescript-twoslash-queries": "0.0.62", + "volar-service-yaml": "0.0.62", "vscode-html-languageservice": "^5.2.0", "vscode-uri": "^3.0.8" }, @@ -94,268 +83,91 @@ } }, "node_modules/@astrojs/markdown-remark": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.2.0.tgz", - "integrity": "sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.0.tgz", + "integrity": "sha512-imInEojAbpeV9D/SRaSQBz3yUzvtg3UQC1euX70QHVf8X0kWAIAArmzBbgXl8LlyxSFe52f/++PXQ4t14V9b+A==", "dependencies": { - "@astrojs/prism": "3.1.0", + "@astrojs/internal-helpers": "0.6.1", + "@astrojs/prism": "3.2.0", "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.1", + "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.1.0", + "js-yaml": "^4.1.0", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", - "rehype-stringify": "^10.0.0", - "remark-gfm": "^4.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.0", + "remark-rehype": "^11.1.1", "remark-smartypants": "^3.0.2", - "shiki": "^1.10.3", + "shiki": "^1.29.2", + "smol-toml": "^1.3.1", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", - "vfile": "^6.0.2" + "vfile": "^6.0.3" } }, "node_modules/@astrojs/prism": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", - "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.2.0.tgz", + "integrity": "sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==", "dependencies": { "prismjs": "^1.29.0" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" } }, "node_modules/@astrojs/telemetry": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", - "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.2.0.tgz", + "integrity": "sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==", "dependencies": { - "ci-info": "^4.0.0", - "debug": "^4.3.4", + "ci-info": "^4.1.0", + "debug": "^4.3.7", "dlv": "^1.1.3", - "dset": "^3.1.3", + "dset": "^3.1.4", "is-docker": "^3.0.0", - "is-wsl": "^3.0.0", + "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "engines": { - "node": ">=6.9.0" + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "node_modules/@astrojs/yaml2ts": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.2.tgz", + "integrity": "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" + "yaml": "^2.5.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -364,76 +176,13 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", - "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -571,9 +320,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", "cpu": [ "ppc64" ], @@ -582,13 +331,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", "cpu": [ "arm" ], @@ -597,13 +346,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", "cpu": [ "arm64" ], @@ -612,13 +361,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", "cpu": [ "x64" ], @@ -627,13 +376,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", "cpu": [ "arm64" ], @@ -642,13 +391,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", "cpu": [ "x64" ], @@ -657,13 +406,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", "cpu": [ "arm64" ], @@ -672,13 +421,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", "cpu": [ "x64" ], @@ -687,13 +436,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", "cpu": [ "arm" ], @@ -702,13 +451,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", "cpu": [ "arm64" ], @@ -717,13 +466,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", "cpu": [ "ia32" ], @@ -732,13 +481,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", "cpu": [ "loong64" ], @@ -747,13 +496,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", "cpu": [ "mips64el" ], @@ -762,13 +511,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", "cpu": [ "ppc64" ], @@ -777,13 +526,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", "cpu": [ "riscv64" ], @@ -792,13 +541,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", "cpu": [ "s390x" ], @@ -807,13 +556,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", "cpu": [ "x64" ], @@ -822,13 +571,28 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", "cpu": [ "x64" ], @@ -837,13 +601,28 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", "cpu": [ "x64" ], @@ -852,13 +631,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", "cpu": [ "x64" ], @@ -867,13 +646,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", "cpu": [ "arm64" ], @@ -882,13 +661,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", "cpu": [ "ia32" ], @@ -897,13 +676,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", "cpu": [ "x64" ], @@ -912,7 +691,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@fastify/busboy": { @@ -1366,19 +1145,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1387,28 +1153,11 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -1648,11 +1397,6 @@ "node": ">= 18" } }, - "node_modules/@octokit/auth-app/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, "node_modules/@octokit/auth-oauth-app": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-7.1.0.tgz", @@ -1980,9 +1724,9 @@ "integrity": "sha512-FE2V+QZ2UYlh+9wWd5BPLNXG+J/XUD/PPq0ovS+nCcGX4+3qVbi3jYOmCTW48hg9SBBLtInx9+o7fFt4H5iP0Q==" }, "node_modules/@oslojs/encoding": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-0.4.1.tgz", - "integrity": "sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==" }, "node_modules/@pierre/vercel": { "version": "1.1.1", @@ -2011,9 +1755,9 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", + "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", "cpu": [ "arm" ], @@ -2023,9 +1767,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", + "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", "cpu": [ "arm64" ], @@ -2035,9 +1779,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", + "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", "cpu": [ "arm64" ], @@ -2047,9 +1791,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", + "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", "cpu": [ "x64" ], @@ -2058,10 +1802,34 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", + "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", + "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", + "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", "cpu": [ "arm" ], @@ -2071,9 +1839,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", + "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", "cpu": [ "arm" ], @@ -2083,9 +1851,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", + "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", "cpu": [ "arm64" ], @@ -2095,9 +1863,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", + "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", "cpu": [ "arm64" ], @@ -2106,10 +1874,22 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", + "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", + "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", "cpu": [ "ppc64" ], @@ -2119,9 +1899,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", + "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", "cpu": [ "riscv64" ], @@ -2131,9 +1911,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", + "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", "cpu": [ "s390x" ], @@ -2143,9 +1923,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", + "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", "cpu": [ "x64" ], @@ -2155,9 +1935,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", + "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", "cpu": [ "x64" ], @@ -2167,9 +1947,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", + "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", "cpu": [ "arm64" ], @@ -2179,9 +1959,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", + "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", "cpu": [ "ia32" ], @@ -2191,9 +1971,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", + "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", "cpu": [ "x64" ], @@ -2203,24 +1983,78 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.13.0.tgz", - "integrity": "sha512-Mj5NVfbAXcD1GnwOTSPl8hBn/T8UDpfFQTptp+p41n/CbUcJtOq98WaRD7Lz3hCglYotUTHUWtzu3JhK6XlkAA==", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", + "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", "dependencies": { - "@types/hast": "^3.0.4" + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" } }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "node_modules/@supabase/auth-js": { - "version": "2.64.4", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.64.4.tgz", - "integrity": "sha512-9ITagy4WP4FLl+mke1rchapOH0RQpf++DI+WSG2sO1OFOZ0rW3cwAM0nCrMOxu+Zw4vJ4zObc08uvQrXx590Tg==", + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", + "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", "dependencies": { - "@supabase/node-fetch": "^2.6.14" + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz", + "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", + "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + }, + "node_modules/@supabase/auth-js": { + "version": "2.64.4", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.64.4.tgz", + "integrity": "sha512-9ITagy4WP4FLl+mke1rchapOH0RQpf++DI+WSG2sO1OFOZ0rW3cwAM0nCrMOxu+Zw4vJ4zObc08uvQrXx590Tg==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" } }, "node_modules/@supabase/functions-js": { @@ -2337,43 +2171,6 @@ "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.143.tgz", "integrity": "sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg==" }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, "node_modules/@types/btoa-lite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz", @@ -2393,9 +2190,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/hast": { "version": "3.0.4", @@ -2427,9 +2224,9 @@ } }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" }, "node_modules/@types/nlcst": { "version": "2.0.3", @@ -2453,9 +2250,9 @@ "integrity": "sha512-xegpDuR+z0UqG9fwHqNoy3rI7JDlvaPh2TY47Fl80oq6g+hXT+c/LEuE43X48clZ6lOfANl5WrPur9fYO1RJ/w==" }, "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, "node_modules/@types/ws": { "version": "8.5.12", @@ -2466,9 +2263,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" }, "node_modules/@vercel/build-utils": { "version": "7.3.0", @@ -3065,12 +2862,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/@volar/kit": { - "version": "2.4.0-alpha.18", - "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.0-alpha.18.tgz", - "integrity": "sha512-dZMSNhesh23lhd61ax2l04IgIcYofAjm8M+5BKAmX47ROweyc8RrrslszCFUJynlmXx6JS1PoHqvo8+E0aAYQQ==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.12.tgz", + "integrity": "sha512-f9JE8oy9C2rBcCWxUYKUF23hOXz4mwgVXFjk7nHhxzplaoVjEOsKpBm8NI2nBH7Cwu8DRxDwBsbIxMl/8wlLxw==", "dependencies": { - "@volar/language-service": "2.4.0-alpha.18", - "@volar/typescript": "2.4.0-alpha.18", + "@volar/language-service": "2.4.12", + "@volar/typescript": "2.4.12", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" @@ -3080,22 +2877,21 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.0-alpha.18", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.18.tgz", - "integrity": "sha512-JAYeJvYQQROmVRtSBIczaPjP3DX4QW1fOqW1Ebs0d3Y3EwSNRglz03dSv0Dm61dzd0Yx3WgTW3hndDnTQqgmyg==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.12.tgz", + "integrity": "sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==", "dependencies": { - "@volar/source-map": "2.4.0-alpha.18" + "@volar/source-map": "2.4.12" } }, "node_modules/@volar/language-server": { - "version": "2.4.0-alpha.18", - "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.0-alpha.18.tgz", - "integrity": "sha512-dciHEE/R5kzI0bY71QfkoCVQ3cQI6g9MHfA4oIP6UhnJy0CdleUalWSygOXoD3Nq7Yk6wn2BRrb1PP5MsadY/Q==", - "dependencies": { - "@volar/language-core": "2.4.0-alpha.18", - "@volar/language-service": "2.4.0-alpha.18", - "@volar/snapshot-document": "2.4.0-alpha.18", - "@volar/typescript": "2.4.0-alpha.18", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.12.tgz", + "integrity": "sha512-KC0YqTXCZMaImMWyAKC+dLB2BXjfz80kqesJkV6oXxJsGEQPfmdqug299idwtrT6FVSmZ7q5UrPfvgKwA0S3JA==", + "dependencies": { + "@volar/language-core": "2.4.12", + "@volar/language-service": "2.4.12", + "@volar/typescript": "2.4.12", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", @@ -3105,57 +2901,43 @@ } }, "node_modules/@volar/language-service": { - "version": "2.4.0-alpha.18", - "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.0-alpha.18.tgz", - "integrity": "sha512-EuetrtbEtudi9buinWAG5U3Jam5dY27zXd/7GYnx542kBwanWOBM8i4DAQd0z7M11fOxXgybxPA933uaSyaOog==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.12.tgz", + "integrity": "sha512-nifOPGYYPnCmxja6/ML/Gl2EgFkUdw4gLbYqbh8FjqX3gSpXSZl/0ebqORjKo1KW56YWHWRZd1jFutEtCiRYhA==", "dependencies": { - "@volar/language-core": "2.4.0-alpha.18", + "@volar/language-core": "2.4.12", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, - "node_modules/@volar/snapshot-document": { - "version": "2.4.0-alpha.18", - "resolved": "https://registry.npmjs.org/@volar/snapshot-document/-/snapshot-document-2.4.0-alpha.18.tgz", - "integrity": "sha512-JAeclEly/wnILhR4Pu9MpgBLInZJH49O1zoy8fU+pk5I+zpv7JIEby5z2UFAS60+sIDnxBdAGd7rZ5VibE70vg==", - "dependencies": { - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.11" - } - }, "node_modules/@volar/source-map": { - "version": "2.4.0-alpha.18", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.18.tgz", - "integrity": "sha512-MTeCV9MUwwsH0sNFiZwKtFrrVZUK6p8ioZs3xFzHc2cvDXHWlYN3bChdQtwKX+FY2HG6H3CfAu1pKijolzIQ8g==" + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.12.tgz", + "integrity": "sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==" }, "node_modules/@volar/typescript": { - "version": "2.4.0-alpha.18", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.18.tgz", - "integrity": "sha512-sXh5Y8sqGUkgxpMWUGvRXggxYHAVxg0Pa1C42lQZuPDrW6vHJPR0VCK8Sr7WJsAW530HuNQT/ZIskmXtxjybMQ==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.12.tgz", + "integrity": "sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==", "dependencies": { - "@volar/language-core": "2.4.0-alpha.18", + "@volar/language-core": "2.4.12", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vscode/emmet-helper": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.9.3.tgz", - "integrity": "sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", - "vscode-uri": "^2.1.2" + "vscode-uri": "^3.0.8" } }, - "node_modules/@vscode/emmet-helper/node_modules/vscode-uri": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", - "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" - }, "node_modules/@vscode/l10n": { "version": "0.0.18", "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", @@ -3167,9 +2949,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "bin": { "acorn": "bin/acorn" }, @@ -3284,14 +3066,14 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/any-promise": { @@ -3340,11 +3122,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": { - "dequal": "^2.0.3" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "engines": { + "node": ">= 0.4" } }, "node_modules/array-iterate": { @@ -3357,85 +3139,122 @@ } }, "node_modules/astro": { - "version": "4.13.4", - "resolved": "https://registry.npmjs.org/astro/-/astro-4.13.4.tgz", - "integrity": "sha512-uoW961qyU5xxCiUzITVX8wYmdWbSH1zeog9UomoWC5uNpnIbH6WxOPv/qYu2m7W4r2PCxdRqfVXoYjZhFyGfTA==", - "dependencies": { - "@astrojs/compiler": "^2.10.2", - "@astrojs/internal-helpers": "0.4.1", - "@astrojs/markdown-remark": "5.2.0", - "@astrojs/telemetry": "3.1.0", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "@oslojs/encoding": "^0.4.1", - "@types/babel__core": "^7.20.5", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.5.2.tgz", + "integrity": "sha512-SOTJxB8mqxe/KEYEJiLIot0YULiCffyfTEclwmdeaASitDJ7eLM/KYrJ9sx3U5hq9GVI17Z4Y0P/1T2aQ0ZN3A==", + "dependencies": { + "@astrojs/compiler": "^2.11.0", + "@astrojs/internal-helpers": "0.6.1", + "@astrojs/markdown-remark": "6.3.0", + "@astrojs/telemetry": "3.2.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.1.4", "@types/cookie": "^0.6.0", - "acorn": "^8.12.1", - "aria-query": "^5.3.0", + "acorn": "^8.14.1", + "aria-query": "^5.3.2", "axobject-query": "^4.1.0", - "boxen": "7.1.1", - "ci-info": "^4.0.0", + "boxen": "8.0.1", + "ci-info": "^4.2.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", - "cookie": "^0.6.0", + "cookie": "^0.7.2", "cssesc": "^3.0.0", - "debug": "^4.3.6", + "debug": "^4.4.0", "deterministic-object-hash": "^2.0.2", - "devalue": "^5.0.0", + "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", - "dset": "^3.1.3", - "es-module-lexer": "^1.5.4", - "esbuild": "^0.21.5", + "dset": "^3.1.4", + "es-module-lexer": "^1.6.0", + "esbuild": "^0.25.0", "estree-walker": "^3.0.3", - "execa": "^8.0.1", - "fast-glob": "^3.3.2", "flattie": "^1.1.1", "github-slugger": "^2.0.0", - "gray-matter": "^4.0.3", - "html-escaper": "^3.0.3", + "html-escaper": "3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", - "magic-string": "^0.30.11", - "mrmime": "^2.0.0", - "ora": "^8.0.1", - "p-limit": "^6.1.0", - "p-queue": "^8.0.1", - "path-to-regexp": "^6.2.2", - "preferred-pm": "^4.0.0", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.0", + "package-manager-detector": "^1.0.0", + "picomatch": "^4.0.2", "prompts": "^2.4.2", - "rehype": "^13.0.1", - "semver": "^7.6.3", - "shiki": "^1.12.1", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "tsconfck": "^3.1.1", + "rehype": "^13.0.2", + "semver": "^7.7.1", + "shiki": "^1.29.2", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.12", + "tsconfck": "^3.1.5", + "ultrahtml": "^1.5.3", "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2", - "vite": "^5.4.0", - "vitefu": "^0.2.5", - "which-pm": "^3.0.0", + "unstorage": "^1.15.0", + "vfile": "^6.0.3", + "vite": "^6.2.1", + "vitefu": "^1.0.6", + "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.2" + "yocto-spinner": "^0.2.1", + "zod": "^3.24.2", + "zod-to-json-schema": "^3.24.3", + "zod-to-ts": "^1.2.0" }, "bin": { "astro": "astro.js" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "node": "^18.17.1 || ^20.3.0 || >=22.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, "optionalDependencies": { "sharp": "^0.33.3" } }, + "node_modules/astro/node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/astro/node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/astro/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/async-listen": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-1.2.0.tgz", @@ -3540,53 +3359,21 @@ "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" }, "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", "dependencies": { "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3623,37 +3410,6 @@ "node": ">=8" } }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/btoa-lite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", @@ -3727,35 +3483,16 @@ } }, "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", @@ -3776,16 +3513,14 @@ } }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "engines": { - "node": ">=4" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/change-case": { @@ -3835,26 +3570,17 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/chownr": { @@ -3863,9 +3589,9 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", "funding": [ { "type": "github", @@ -4042,18 +3768,11 @@ "node": ">=12.5.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "optional": true }, "node_modules/color-string": { "version": "1.9.1", @@ -4141,19 +3860,19 @@ "node": ">=8" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "engines": { "node": ">= 0.6" } }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -4172,6 +3891,14 @@ "node": ">= 8" } }, + "node_modules/crossws": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz", + "integrity": "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -4192,11 +3919,11 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4208,9 +3935,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", "dependencies": { "character-entities": "^2.0.0" }, @@ -4308,6 +4035,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -4334,6 +4066,11 @@ "node": ">=6" } }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" + }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -4354,9 +4091,9 @@ } }, "node_modules/devalue": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.0.0.tgz", - "integrity": "sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", + "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==" }, "node_modules/devlop": { "version": "1.1.0", @@ -4393,9 +4130,9 @@ } }, "node_modules/dset": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", - "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "engines": { "node": ">=4" } @@ -4459,15 +4196,16 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.7.tgz", - "integrity": "sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw==" - }, "node_modules/emmet": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.7.tgz", - "integrity": "sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", + "workspaces": [ + "./packages/scanner", + "./packages/abbreviation", + "./packages/css-abbreviation", + "./" + ], "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" @@ -4478,6 +4216,11 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -4498,45 +4241,47 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "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" + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" } }, "node_modules/esbuild-android-64": { @@ -4848,23 +4593,14 @@ } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node": ">=12" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/estree-walker": { @@ -4893,28 +4629,6 @@ "resolved": "https://registry.npmjs.org/events-intercept/-/events-intercept-2.0.0.tgz", "integrity": "sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==" }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/exit-hook": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", @@ -4931,17 +4645,6 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4968,6 +4671,21 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "optional": true }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -5022,38 +4740,6 @@ "node": ">=8" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up-simple": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", - "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" - } - }, "node_modules/flattie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", @@ -5182,14 +4868,6 @@ "node": ">= 4" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5199,9 +4877,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "engines": { "node": ">=18" }, @@ -5209,17 +4887,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", @@ -5256,59 +4923,25 @@ "node": ">= 6" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/h3": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", + "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" + "cookie-es": "^1.2.2", + "crossws": "^0.3.3", + "defu": "^6.1.4", + "destr": "^2.0.3", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.0", + "radix3": "^1.1.2", + "ufo": "^1.5.4", + "uncrypto": "^0.1.3" } }, "node_modules/has-unicode": { @@ -5317,9 +4950,9 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "node_modules/hast-util-from-html": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", - "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", @@ -5334,15 +4967,15 @@ } }, "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" @@ -5377,9 +5010,9 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", - "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -5401,19 +5034,18 @@ } }, "node_modules/hast-util-to-html": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.1.tgz", - "integrity": "sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^9.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" @@ -5441,6 +5073,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-to-text": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", @@ -5469,14 +5110,14 @@ } }, "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" }, "funding": { @@ -5541,14 +5182,6 @@ "node": ">= 6" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5611,6 +5244,14 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -5654,14 +5295,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5879,17 +5512,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5922,11 +5544,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5938,17 +5555,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/json-schema-to-ts": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", @@ -5964,17 +5570,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "optional": true }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonc-parser": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", @@ -6028,14 +5623,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -6044,50 +5631,10 @@ "node": ">=6" } }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/load-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -6129,43 +5676,6 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, - "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -6184,21 +5694,28 @@ } }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -6227,9 +5744,9 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -6250,9 +5767,9 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -6264,21 +5781,10 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -6299,9 +5805,9 @@ } }, "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -6317,9 +5823,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -6333,9 +5839,9 @@ } }, "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -6427,15 +5933,16 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" @@ -6492,9 +5999,9 @@ "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==" }, "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "funding": [ { "type": "GitHub Sponsors", @@ -6526,9 +6033,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "funding": [ { "type": "GitHub Sponsors", @@ -6629,9 +6136,9 @@ } }, "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -6673,9 +6180,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "funding": [ { "type": "GitHub Sponsors", @@ -6693,9 +6200,9 @@ } }, "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "funding": [ { "type": "GitHub Sponsors", @@ -6714,9 +6221,9 @@ } }, "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -6733,9 +6240,9 @@ } }, "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "funding": [ { "type": "GitHub Sponsors", @@ -6754,9 +6261,9 @@ } }, "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6775,9 +6282,9 @@ } }, "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -6794,9 +6301,9 @@ } }, "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "funding": [ { "type": "GitHub Sponsors", @@ -6812,9 +6319,9 @@ } }, "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -6832,9 +6339,9 @@ } }, "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "funding": [ { "type": "GitHub Sponsors", @@ -6851,9 +6358,9 @@ } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "funding": [ { "type": "GitHub Sponsors", @@ -6869,9 +6376,9 @@ } }, "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6890,9 +6397,9 @@ } }, "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { "type": "GitHub Sponsors", @@ -6905,9 +6412,9 @@ ] }, "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "funding": [ { "type": "GitHub Sponsors", @@ -6920,9 +6427,9 @@ ] }, "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "funding": [ { "type": "GitHub Sponsors", @@ -6938,9 +6445,9 @@ } }, "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "funding": [ { "type": "GitHub Sponsors", @@ -6956,9 +6463,9 @@ } }, "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6976,9 +6483,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "funding": [ { "type": "GitHub Sponsors", @@ -6997,9 +6504,9 @@ } }, "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -7012,9 +6519,9 @@ ] }, "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -7105,17 +6612,17 @@ } }, "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "engines": { "node": ">=10" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/muggle-string": { "version": "0.4.1", @@ -7123,9 +6630,9 @@ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", + "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", "funding": [ { "type": "github", @@ -7139,6 +6646,14 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "engines": { + "node": ">= 10" + } + }, "node_modules/nlcst-to-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", @@ -7195,6 +6710,11 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/node-fetch-native": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==" + }, "node_modules/node-gyp-build": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", @@ -7205,10 +6725,10 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "node_modules/node-mock-http": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz", + "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==" }, "node_modules/nopt": { "version": "5.0.0", @@ -7297,6 +6817,16 @@ "node": ">= 18" } }, + "node_modules/ofetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7319,7 +6849,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/open": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", @@ -7361,39 +6901,6 @@ "node": ">=8" } }, - "node_modules/ora": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/os-paths": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz", @@ -7411,9 +6918,9 @@ } }, "node_modules/p-limit": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", - "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "dependencies": { "yocto-queue": "^1.1.1" }, @@ -7424,35 +6931,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-queue": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" @@ -7465,9 +6947,9 @@ } }, "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "engines": { "node": ">=14.16" }, @@ -7475,13 +6957,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } + "node_modules/package-manager-detector": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.1.0.tgz", + "integrity": "sha512-Y8f9qUlBzW8qauJjd/eu6jlpJZsuPJm2ZAV0cDVd420o4EdpH5RPdoCv+60/TdJflGatr4sDfpAL6ArWZbM5tA==" }, "node_modules/param-case": { "version": "3.0.4", @@ -7518,11 +6997,11 @@ } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -7551,14 +7030,6 @@ "tslib": "^2.0.3" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -7592,20 +7063,15 @@ "isarray": "0.0.1" } }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" - }, "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==" }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -7644,17 +7110,6 @@ "pr": "dist/index.js" } }, - "node_modules/pierre/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/pierre/node_modules/is-unicode-supported": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", @@ -7733,29 +7188,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -7771,25 +7207,27 @@ } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/preferred-pm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", - "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", - "dependencies": { - "find-up-simple": "^1.0.0", - "find-yarn-workspace-root2": "1.2.16", - "which-pm": "^3.0.0" + "node_modules/prettier": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=18.12" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-ms": { @@ -7807,9 +7245,9 @@ } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "engines": { "node": ">=6" } @@ -7840,9 +7278,9 @@ } }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7884,6 +7322,11 @@ } ] }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" + }, "node_modules/raw-body": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", @@ -7927,20 +7370,43 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "dependencies": { + "regex-utilities": "^2.3.0" } }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" + }, "node_modules/rehype": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", - "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", @@ -7953,9 +7419,9 @@ } }, "node_modules/rehype-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", - "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", @@ -7981,9 +7447,9 @@ } }, "node_modules/rehype-stringify": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", - "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", @@ -7995,9 +7461,9 @@ } }, "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -8027,9 +7493,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -8171,9 +7637,9 @@ } }, "node_modules/retext-smartypants": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.1.0.tgz", - "integrity": "sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", @@ -8223,11 +7689,11 @@ } }, "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", + "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -8237,22 +7703,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@rollup/rollup-android-arm-eabi": "4.35.0", + "@rollup/rollup-android-arm64": "4.35.0", + "@rollup/rollup-darwin-arm64": "4.35.0", + "@rollup/rollup-darwin-x64": "4.35.0", + "@rollup/rollup-freebsd-arm64": "4.35.0", + "@rollup/rollup-freebsd-x64": "4.35.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", + "@rollup/rollup-linux-arm-musleabihf": "4.35.0", + "@rollup/rollup-linux-arm64-gnu": "4.35.0", + "@rollup/rollup-linux-arm64-musl": "4.35.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", + "@rollup/rollup-linux-riscv64-gnu": "4.35.0", + "@rollup/rollup-linux-s390x-gnu": "4.35.0", + "@rollup/rollup-linux-x64-gnu": "4.35.0", + "@rollup/rollup-linux-x64-musl": "4.35.0", + "@rollup/rollup-win32-arm64-msvc": "4.35.0", + "@rollup/rollup-win32-ia32-msvc": "4.35.0", + "@rollup/rollup-win32-x64-msvc": "4.35.0", "fsevents": "~2.3.2" } }, @@ -8414,22 +7883,10 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -8517,25 +7974,20 @@ } }, "node_modules/shiki": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.13.0.tgz", - "integrity": "sha512-e0dWfnONbEv6xl7FJy3XIhsVHQ/65XHDZl92+6H9+4xWjfdo7pmkqG7Kg47KWtDiEtzM5Z+oEfb4vtRvoZ/X9w==", - "dependencies": { - "@shikijs/core": "1.13.0", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", + "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/simple-git": { "version": "3.25.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.25.0.tgz", @@ -8564,6 +8016,17 @@ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, + "node_modules/smol-toml": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.1.tgz", + "integrity": "sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -8574,9 +8037,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -8590,11 +8053,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, "node_modules/stat-mode": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", @@ -8608,17 +8066,6 @@ "node": ">= 0.6" } }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", @@ -8704,22 +8151,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -8731,17 +8162,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/tar": { "version": "4.4.18", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.18.tgz", @@ -8773,6 +8193,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" + }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -8784,14 +8248,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8907,9 +8363,9 @@ "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==" }, "node_modules/tsconfck": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", - "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", + "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", "bin": { "tsconfck": "bin/tsconfck.js" }, @@ -8931,11 +8387,11 @@ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz", + "integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==", "engines": { - "node": ">=12.20" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8959,18 +8415,28 @@ } }, "node_modules/typescript-auto-import-cache": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.3.tgz", - "integrity": "sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.5.tgz", + "integrity": "sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==", "dependencies": { "semver": "^7.3.8" } }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" + }, "node_modules/uid-promise": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/uid-promise/-/uid-promise-1.0.0.tgz", "integrity": "sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==" }, + "node_modules/ultrahtml": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", + "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" + }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -8979,6 +8445,11 @@ "node": ">=0.10.0" } }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, "node_modules/undici": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", @@ -9157,6 +8628,97 @@ "node": ">= 0.8" } }, + "node_modules/unstorage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz", + "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.3", + "h3": "^1.15.0", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.5.4" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -9165,35 +8727,6 @@ "node": ">=8" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/upper-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", @@ -9309,12 +8842,11 @@ } }, "node_modules/vfile": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", - "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dependencies": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { @@ -9349,19 +8881,19 @@ } }, "node_modules/vite": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", - "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", + "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.40", - "rollup": "^4.13.0" + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -9370,19 +8902,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -9403,15 +8941,25 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.6.tgz", + "integrity": "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==", + "workspaces": [ + "tests/deps/*", + "tests/projects/*" + ], "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { "vite": { @@ -9420,16 +8968,16 @@ } }, "node_modules/volar-service-css": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.59.tgz", - "integrity": "sha512-gLNjJnECbalPvQB7qeJjhkDN8sR5M3ItbVYjnyio61aHaWptIiXm/HfDahcQ2ApwmvWidkMWWegjGq5L0BENDA==", + "version": "0.0.62", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.62.tgz", + "integrity": "sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==", "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -9438,9 +8986,9 @@ } }, "node_modules/volar-service-emmet": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.59.tgz", - "integrity": "sha512-6EynHcuMwMBETpK29TbZvIMmvzdVG+Tkokk9VWfZeI+SwDptk2tgdhEqiXXvIkqYNgbuu73Itp66lpH76cAU+Q==", + "version": "0.0.62", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.62.tgz", + "integrity": "sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==", "dependencies": { "@emmetio/css-parser": "^0.4.0", "@emmetio/html-matcher": "^1.3.0", @@ -9448,7 +8996,7 @@ "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -9457,16 +9005,16 @@ } }, "node_modules/volar-service-html": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.59.tgz", - "integrity": "sha512-hEXOsYpILDlITZxnqRLV9OepVWD63GZBsyjMxszwdzlxvGZjzbGcBBinJGGJRwFIV8djdJwnt91bkdg1V5tj6Q==", + "version": "0.0.62", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.62.tgz", + "integrity": "sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==", "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -9475,14 +9023,14 @@ } }, "node_modules/volar-service-prettier": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.59.tgz", - "integrity": "sha512-FmBR4lsgFRGR3V0LnxZZal0WqdOJjuLL6mQSj4p57M15APtQwuocG/FiF+ONGFnwRXMOIBDBTCARdth+TKgL3A==", + "version": "0.0.62", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.62.tgz", + "integrity": "sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==", "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12", + "@volar/language-service": "~2.4.0", "prettier": "^2.2 || ^3.0" }, "peerDependenciesMeta": { @@ -9495,9 +9043,9 @@ } }, "node_modules/volar-service-typescript": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.59.tgz", - "integrity": "sha512-VCOpfiu+lUo5lapWLB5L5vmQGtwzmNWn5MueV915eku7blpphmE+Z7hCNcL1NApn7AetXWhiblv8ZhmUx/dGIA==", + "version": "0.0.62", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.62.tgz", + "integrity": "sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==", "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", @@ -9507,7 +9055,7 @@ "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -9516,14 +9064,31 @@ } }, "node_modules/volar-service-typescript-twoslash-queries": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.59.tgz", - "integrity": "sha512-skm8e6yhCIkqLwJB6S9MqT5lO9LNFuMD3dYxKpmOZs1CKbXmCZZTmLfEaD5VkJae1xdleEDZFFTHl2O5HLjOGQ==", + "version": "0.0.62", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.62.tgz", + "integrity": "sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==", "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-yaml": { + "version": "0.0.62", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.62.tgz", + "integrity": "sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==", + "dependencies": { + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.15.0" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -9532,27 +9097,47 @@ } }, "node_modules/vscode-css-languageservice": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.0.tgz", - "integrity": "sha512-nU92imtkgzpCL0xikrIb8WvedV553F2BENzgz23wFuok/HLN5BeQmroMy26pUwFxV2eV8oNRmYCUv8iO7kSMhw==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.2.tgz", + "integrity": "sha512-GEpPxrUTAeXWdZWHev1OJU9lz2Q2/PPBxQ2TIRmLGvQiH3WZbqaNoute0n0ewxlgtjzTW3AKZT+NHySk5Rf4Eg==", "dependencies": { "@vscode/l10n": "^0.0.18", - "vscode-languageserver-textdocument": "^1.0.11", + "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.0.8" } }, "node_modules/vscode-html-languageservice": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.3.0.tgz", - "integrity": "sha512-C4Z3KsP5Ih+fjHpiBc5jxmvCl+4iEwvXegIrzu2F5pktbWvQaBT3YkVPk8N+QlSSMk8oCG6PKtZ/Sq2YHb5e8g==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.3.1.tgz", + "integrity": "sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==", "dependencies": { "@vscode/l10n": "^0.0.18", - "vscode-languageserver-textdocument": "^1.0.11", + "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.0.8" } }, + "node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" + }, + "engines": { + "npm": ">=7.0.0" + } + }, + "node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -9597,9 +9182,9 @@ "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==" }, "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" }, "node_modules/web-namespaces": { "version": "2.0.1", @@ -9651,17 +9236,6 @@ "node": ">= 8" } }, - "node_modules/which-pm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.0.tgz", - "integrity": "sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==", - "dependencies": { - "load-yaml-file": "^0.2.0" - }, - "engines": { - "node": ">=18.12" - } - }, "node_modules/which-pm-runs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", @@ -9716,88 +9290,35 @@ } }, "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "string-width": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9845,6 +9366,11 @@ "node": ">= 6.0" } }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -9858,6 +9384,106 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-language-server": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.15.0.tgz", + "integrity": "sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==", + "dependencies": { + "ajv": "^8.11.0", + "lodash": "4.17.21", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2", + "yaml": "2.2.2" + }, + "bin": { + "yaml-language-server": "bin/yaml-language-server" + }, + "optionalDependencies": { + "prettier": "2.8.7" + } + }, + "node_modules/yaml-language-server/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/yaml-language-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==" + }, + "node_modules/yaml-language-server/node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "node_modules/yaml-language-server/node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -9961,9 +9587,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.0.tgz", + "integrity": "sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==", "engines": { "node": ">=12.20" }, @@ -9971,20 +9597,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yocto-spinner": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.1.tgz", + "integrity": "sha512-lHHxjh0bXaLgdJy3cNnVb/F9myx3CkhrvSOEVTkaUgNMXnYFa2xYPVhtGnqhh3jErY2gParBOHallCbc7NrlZQ==", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", - "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.4.tgz", + "integrity": "sha512-0uNlcvgabyrni9Ag8Vghj21drk7+7tp7VTwwR7KxxXXc/3pbXz2PHlDgj3cICahgF1kHm4dExBFj7BXrZJXzig==", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", "peerDependencies": { - "zod": "^3.23.3" + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" } }, "node_modules/zwitch": { diff --git a/package.json b/package.json index a7014d9..3780fc2 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "", + "name": "datcode-dot-org", "type": "module", "version": "0.0.1", "scripts": { @@ -10,9 +10,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/check": "^0.9.2", + "@astrojs/check": "^0.9.4", "@pierre/vercel": "^1.1.1", - "astro": "^4.7.0", + "astro": "^5.5.2", "pierre": "^2.1.9", "typescript": "^5.5.4" } From 6dbb8bf9c2a01f0431a28f037a655458581260ad Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 16 Mar 2025 19:01:36 -0400 Subject: [PATCH 02/71] infra: prep for dockerization --- Dockerfile | 12 ++++++++++++ docker-compose.yml | 10 ++++++++++ 2 files changed, 22 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6e7b558 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM node:lts-alpine AS runtime +WORKDIR /app + +COPY . . + +RUN pnpm install +RUN pnpm run build + +ENV HOST=0.0.0.0 +ENV PORT=4321 +EXPOSE 4321 +CMD node ./dist/server/entry.mjs diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f81ff1e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +services: + app: + build: . + ports: + - "4321:4321" + volumes: + - ./data:/app/data + env_file: + - .env.production + restart: unless-stopped From 5b70fb429005ea2414e32af8698b2bc4b19b7191 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 16 Mar 2025 19:08:29 -0400 Subject: [PATCH 03/71] add tailwind, react and node --- astro.config.mjs | 15 +- package-lock.json | 1309 +++++++++++++++++++++++++++++++++++++++--- package.json | 8 + src/style/global.css | 2 + tsconfig.json | 6 +- 5 files changed, 1266 insertions(+), 74 deletions(-) diff --git a/astro.config.mjs b/astro.config.mjs index 882e651..a588164 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,4 +1,17 @@ import { defineConfig } from 'astro/config'; +import react from '@astrojs/react'; +import node from '@astrojs/node'; +import tailwindcss from '@tailwindcss/vite' + // https://astro.build/config -export default defineConfig({}); +export default defineConfig({ + integrations: [react()], + + adapter: node({ + mode: 'standalone' + }), + vite: { + plugins: [tailwindcss()] + } +}); diff --git a/package-lock.json b/package-lock.json index 9335b54..9b4e5dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,32 @@ "version": "0.0.1", "dependencies": { "@astrojs/check": "^0.9.4", + "@astrojs/node": "^9.1.3", + "@astrojs/react": "^4.2.1", "@pierre/vercel": "^1.1.1", + "@tailwindcss/vite": "^4.0.14", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", "astro": "^5.5.2", "pierre": "^2.1.9", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwindcss": "^4.0.14", "typescript": "^5.5.4" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@astrojs/check": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.4.tgz", @@ -110,6 +130,19 @@ "vfile": "^6.0.3" } }, + "node_modules/@astrojs/node": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-9.1.3.tgz", + "integrity": "sha512-YcVxEmeZU8khNdrPYNPN3j//4tYPM+Pw6CthAJ6VE/bw65qEX7ErMRApalY2tibc3YhCeHMmsO9rXGhyW0NNyA==", + "dependencies": { + "@astrojs/internal-helpers": "0.6.1", + "send": "^1.1.0", + "server-destroy": "^1.0.1" + }, + "peerDependencies": { + "astro": "^5.3.0" + } + }, "node_modules/@astrojs/prism": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.2.0.tgz", @@ -121,6 +154,25 @@ "node": "^18.17.1 || ^20.3.0 || >=22.0.0" } }, + "node_modules/@astrojs/react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-4.2.1.tgz", + "integrity": "sha512-g0P6zxG7RPHNcbmMB15dJJ83+ApBVFBcgnf6BnMz/PVXM150Pa1vYKeuTcWhERqLNgmpI2uXuch5MecIhrUlqQ==", + "dependencies": { + "@vitejs/plugin-react": "^4.3.4", + "ultrahtml": "^1.5.3", + "vite": "^6.2.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", + "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@astrojs/telemetry": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.2.0.tgz", @@ -146,6 +198,146 @@ "yaml": "^2.5.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "dependencies": { + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", @@ -162,6 +354,26 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "dependencies": { + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/parser": { "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", @@ -176,6 +388,64 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", @@ -1145,6 +1415,19 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1153,11 +1436,28 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -2116,6 +2416,216 @@ "@supabase/storage-js": "2.7.0" } }, + "node_modules/@tailwindcss/node": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.14.tgz", + "integrity": "sha512-Ux9NbFkKWYE4rfUFz6M5JFLs/GEYP6ysxT8uSyPn6aTbh2K3xDE1zz++eVK4Vwx799fzMF8CID9sdHn4j/Ab8w==", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "tailwindcss": "4.0.14" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.14.tgz", + "integrity": "sha512-M8VCNyO/NBi5vJ2cRcI9u8w7Si+i76a7o1vveoGtbbjpEYJZYiyc7f2VGps/DqawO56l3tImIbq2OT/533jcrA==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.14", + "@tailwindcss/oxide-darwin-arm64": "4.0.14", + "@tailwindcss/oxide-darwin-x64": "4.0.14", + "@tailwindcss/oxide-freebsd-x64": "4.0.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.14", + "@tailwindcss/oxide-linux-x64-musl": "4.0.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.14" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.14.tgz", + "integrity": "sha512-VBFKC2rFyfJ5J8lRwjy6ub3rgpY186kAcYgiUr8ArR8BAZzMruyeKJ6mlsD22Zp5ZLcPW/FXMasJiJBx0WsdQg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.14.tgz", + "integrity": "sha512-U3XOwLrefGr2YQZ9DXasDSNWGPZBCh8F62+AExBEDMLDfvLLgI/HDzY8Oq8p/JtqkAY38sWPOaNnRwEGKU5Zmg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.14.tgz", + "integrity": "sha512-V5AjFuc3ndWGnOi1d379UsODb0TzAS2DYIP/lwEbfvafUaD2aNZIcbwJtYu2DQqO2+s/XBvDVA+w4yUyaewRwg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.14.tgz", + "integrity": "sha512-tXvtxbaZfcPfqBwW3f53lTcyH6EDT+1eT7yabwcfcxTs+8yTPqxsDUhrqe9MrnEzpNkd+R/QAjJapfd4tjWdLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.14.tgz", + "integrity": "sha512-cSeLNWWqIWeSTmBntQvyY2/2gcLX8rkPFfDDTQVF8qbRcRMVPLxBvFVJyfSAYRNch6ZyVH2GI6dtgALOBDpdNA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.14.tgz", + "integrity": "sha512-bwDWLBalXFMDItcSXzFk6y7QKvj6oFlaY9vM+agTlwFL1n1OhDHYLZkSjaYsh6KCeG0VB0r7H8PUJVOM1LRZyg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.14.tgz", + "integrity": "sha512-gVkJdnR/L6iIcGYXx64HGJRmlme2FGr/aZH0W6u4A3RgPMAb+6ELRLi+UBiH83RXBm9vwCfkIC/q8T51h8vUJQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.14.tgz", + "integrity": "sha512-EE+EQ+c6tTpzsg+LGO1uuusjXxYx0Q00JE5ubcIGfsogSKth8n8i2BcS2wYTQe4jXGs+BQs35l78BIPzgwLddw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.14.tgz", + "integrity": "sha512-KCCOzo+L6XPT0oUp2Jwh233ETRQ/F6cwUnMnR0FvMUCbkDAzHbcyOgpfuAtRa5HD0WbTbH4pVD+S0pn1EhNfbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.14.tgz", + "integrity": "sha512-AHObFiFL9lNYcm3tZSPqa/cHGpM5wOrNmM2uOMoKppp+0Hom5uuyRh0QkOp7jftsHZdrZUpmoz0Mp6vhh2XtUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.14.tgz", + "integrity": "sha512-rNXXMDJfCJLw/ZaFTOLOHoGULxyXfh2iXTGiChFiYTSgKBKQHIGEpV0yn5N25WGzJJ+VBnRjHzlmDqRV+d//oQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.14.tgz", + "integrity": "sha512-y69ztPTRFy+13EPS/7dEFVl7q2Goh1pQueVO8IfGeyqSpcx/joNJXFk0lLhMgUbF0VFJotwRSb9ZY7Xoq3r26Q==", + "dependencies": { + "@tailwindcss/node": "4.0.14", + "@tailwindcss/oxide": "4.0.14", + "lightningcss": "1.29.2", + "tailwindcss": "4.0.14" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -2171,6 +2681,43 @@ "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.143.tgz", "integrity": "sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg==" }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, "node_modules/@types/btoa-lite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz", @@ -2249,6 +2796,22 @@ "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.5.tgz", "integrity": "sha512-xegpDuR+z0UqG9fwHqNoy3rI7JDlvaPh2TY47Fl80oq6g+hXT+c/LEuE43X48clZ6lOfANl5WrPur9fYO1RJ/w==" }, + "node_modules/@types/react": { + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", + "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -2861,6 +3424,24 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, "node_modules/@volar/kit": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.12.tgz", @@ -3410,6 +3991,37 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/btoa-lite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", @@ -3493,6 +4105,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001705", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz", + "integrity": "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", @@ -3860,6 +4491,11 @@ "node": ">=8" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -3910,6 +4546,11 @@ "node": ">=4" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -4071,6 +4712,15 @@ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -4196,6 +4846,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.119", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.119.tgz", + "integrity": "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==" + }, "node_modules/emmet": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", @@ -4221,6 +4881,14 @@ "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -4229,6 +4897,18 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -4585,13 +5265,18 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -4759,6 +5444,14 @@ "node": ">=12.20.0" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -4868,6 +5561,14 @@ "node": ">= 4" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -4923,6 +5624,14 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -5544,6 +6253,19 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5551,84 +6273,323 @@ "dependencies": { "argparse": "^2.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema-to-ts": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", + "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ts-toolbelt": "^6.15.5" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/json-schema-to-ts": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", - "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", - "dependencies": { - "@types/json-schema": "^7.0.6", - "ts-toolbelt": "^6.15.5" + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "optional": true - }, - "node_modules/jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lodash": { @@ -6545,6 +7506,25 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -6730,6 +7710,11 @@ "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz", "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==" }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -6827,6 +7812,17 @@ "ufo": "^1.5.4" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7216,15 +8212,16 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "optional": true, + "peer": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -7327,6 +8324,14 @@ "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/raw-body": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", @@ -7356,6 +8361,33 @@ "node": ">= 0.6" } }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -7883,6 +8915,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==" + }, "node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", @@ -7894,6 +8931,72 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", + "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", + "dependencies": { + "debug": "^4.3.5", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "http-errors": "^2.0.0", + "mime-types": "^2.1.35", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -7904,6 +9007,11 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -8162,6 +9270,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tailwindcss": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.14.tgz", + "integrity": "sha512-92YT2dpt671tFiHH/e1ok9D987N9fHD5VWoly1CdPD/Cd1HMglvZwP3nx2yTj2lbXDAHt8QssZkxTLCCTNL+xw==" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/tar": { "version": "4.4.18", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.18.tgz", @@ -8727,6 +9848,35 @@ "node": ">=8" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/upper-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", @@ -9438,6 +10588,21 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/yaml-language-server/node_modules/prettier": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/yaml-language-server/node_modules/request-light": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", diff --git a/package.json b/package.json index 3780fc2..5b2c1d2 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,17 @@ }, "dependencies": { "@astrojs/check": "^0.9.4", + "@astrojs/node": "^9.1.3", + "@astrojs/react": "^4.2.1", "@pierre/vercel": "^1.1.1", + "@tailwindcss/vite": "^4.0.14", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", "astro": "^5.5.2", "pierre": "^2.1.9", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwindcss": "^4.0.14", "typescript": "^5.5.4" } } diff --git a/src/style/global.css b/src/style/global.css index 294410b..a03f558 100644 --- a/src/style/global.css +++ b/src/style/global.css @@ -8,3 +8,5 @@ utility - reused classes that perform a specific design pattern @layer webfont, reset, token, utility; @import "./module/accessibility.css" layer(utility); @import "./module/font-size.css" layer(token); +@import "tailwindcss"; +@plugin "@tailwindcss/typography"; diff --git a/tsconfig.json b/tsconfig.json index 77da9dd..032ad64 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,7 @@ { - "extends": "astro/tsconfigs/strict" + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "react" + } } \ No newline at end of file From bb40a32263ce97684786dc29aca23489ec9be5bc Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Mon, 17 Mar 2025 00:18:44 -0400 Subject: [PATCH 04/71] update deps; pin node version --- package-lock.json | 330 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 9 ++ 2 files changed, 339 insertions(+) diff --git a/package-lock.json b/package-lock.json index 9b4e5dc..4d17a8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,10 @@ "@astrojs/node": "^9.1.3", "@astrojs/react": "^4.2.1", "@pierre/vercel": "^1.1.1", + "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.0.14", + "@tryghost/admin-api": "^1.13.12", + "@tryghost/content-api": "^1.11.21", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "astro": "^5.5.2", @@ -21,6 +24,9 @@ "react-dom": "^19.0.0", "tailwindcss": "^4.0.14", "typescript": "^5.5.4" + }, + "devDependencies": { + "@types/tryghost__content-api": "^1.3.17" } }, "node_modules/@ampproject/remapping": { @@ -2612,6 +2618,21 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", + "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "license": "MIT", + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, "node_modules/@tailwindcss/vite": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.14.tgz", @@ -2634,6 +2655,26 @@ "node": ">= 10" } }, + "node_modules/@tryghost/admin-api": { + "version": "1.13.12", + "resolved": "https://registry.npmjs.org/@tryghost/admin-api/-/admin-api-1.13.12.tgz", + "integrity": "sha512-fZ5Mj3ucv+l4idn0ymPLGNaSl/EOyXG3kcNXwIqQRAuLFIw9dJ7fKDBnurPM8BWPFAoWoo3MHZ9UA+uQzeZlew==", + "license": "MIT", + "dependencies": { + "axios": "^1.0.0", + "form-data": "^4.0.0", + "jsonwebtoken": "^9.0.0" + } + }, + "node_modules/@tryghost/content-api": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@tryghost/content-api/-/content-api-1.11.21.tgz", + "integrity": "sha512-ozJqEMHDUO7D0SGxPbUnG+RvwBbzC3zmdGOW8cFvkcKzrhe7uOAmVKyq7/J3kRAM2QthTlmiDpqp7NEo9ZLlKg==", + "license": "MIT", + "dependencies": { + "axios": "^1.0.0" + } + }, "node_modules/@ts-morph/common": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", @@ -2812,6 +2853,13 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/tryghost__content-api": { + "version": "1.3.17", + "resolved": "https://registry.npmjs.org/@types/tryghost__content-api/-/tryghost__content-api-1.3.17.tgz", + "integrity": "sha512-4DASYoK0hP1+XDyLS/8IZevalQRJuPmyPmfxdT1hnYRjxnJkgusATeDc/7QXA2izMZ/+cWkgdZDeTN2cBW+EoA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -3846,6 +3894,23 @@ "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", + "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -4085,6 +4150,19 @@ "node": ">= 0.8" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -4441,6 +4519,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "optional": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -4681,6 +4771,15 @@ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -4787,6 +4886,20 @@ "node": ">=4" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -4920,11 +5033,56 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", @@ -5433,6 +5591,41 @@ "node": ">=8" } }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -5491,6 +5684,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -5588,6 +5790,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", @@ -5632,6 +5871,18 @@ "node": ">=4" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -5653,11 +5904,50 @@ "uncrypto": "^0.1.3" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-util-from-html": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", @@ -6597,6 +6887,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -6632,6 +6928,12 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -6713,6 +7015,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-definitions": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", @@ -8211,6 +8522,19 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/prettier": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", @@ -8283,6 +8607,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "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.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", diff --git a/package.json b/package.json index 5b2c1d2..e6c31f8 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,10 @@ "@astrojs/node": "^9.1.3", "@astrojs/react": "^4.2.1", "@pierre/vercel": "^1.1.1", + "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.0.14", + "@tryghost/admin-api": "^1.13.12", + "@tryghost/content-api": "^1.11.21", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "astro": "^5.5.2", @@ -23,5 +26,11 @@ "react-dom": "^19.0.0", "tailwindcss": "^4.0.14", "typescript": "^5.5.4" + }, + "volta": { + "node": "20.19.0" + }, + "devDependencies": { + "@types/tryghost__content-api": "^1.3.17" } } From e940fb19f4175d68d5606ffda5dc9067ec4f2ab2 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Mon, 17 Mar 2025 00:19:08 -0400 Subject: [PATCH 05/71] add tailwind theme (generated; ROUGH) --- src/style/global.css | 72 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/style/global.css b/src/style/global.css index a03f558..6bbc28d 100644 --- a/src/style/global.css +++ b/src/style/global.css @@ -8,5 +8,77 @@ utility - reused classes that perform a specific design pattern @layer webfont, reset, token, utility; @import "./module/accessibility.css" layer(utility); @import "./module/font-size.css" layer(token); + +/** +* Tailwind stuff +*/ @import "tailwindcss"; @plugin "@tailwindcss/typography"; + +@theme { + /* Primary brand colors */ + --primary: #ddff20; /* yellow from button */ + --primary-focus: #c8e81c; /* slightly darker yellow */ + --primary-content: #000916; /* dark background for contrast */ + + /* Secondary brand colors */ + --secondary: #b7d3f6; /* light blue text color */ + --secondary-focus: #92bef0; /* slightly darker light blue */ + --secondary-content: #0d1520; /* dark background for contrast */ + + /* Neutral/gray shades */ + --neutral-50: #f9fafb; + --neutral-100: #f3f4f6; + --neutral-200: #e5e7eb; + --neutral-300: #d1d5db; + --neutral-400: #9ca3af; + --neutral-500: #6b7280; + --neutral-600: #4b5563; + --neutral-700: #374151; + --neutral-800: #1f2937; + --neutral-900: #111827; + --neutral-950: #030712; + + /* Accent/utility colors */ + --accent: #1a2d48; /* button border color */ + --accent-focus: #2a4269; /* slightly lighter accent */ + --accent-content: #b7d3f6; /* light blue text */ + + /* Semantic colors */ + --success: #22c55e; /* green-500 */ + --warning: #eab308; /* yellow-500 */ + --error: #ef4444; /* red-500 */ + --info: #3b82f6; /* blue-500 */ + + /* Background colors */ + --background: #0d1520; /* dark blue from test.html */ + --foreground: #b7d3f6; /* light blue text from test.html */ + + /* Card */ + --card: #000916; /* button background color */ + --card-foreground: var(--foreground); + + /* Border colors */ + --border: #1a2d48; /* button border color */ + --input: var(--border); + --ring: var(--primary); + + /* Miscellaneous */ + --radius: 0.5rem; +} + +@media (prefers-color-scheme: dark) { + @theme { + --background: #0d1520; /* dark blue background */ + --foreground: #b7d3f6; /* light blue text */ + + --primary: #ddff20; /* yellow button color */ + --primary-focus: #c8e81c; /* slightly darker yellow */ + + --card: #000916; /* dark card background */ + --card-foreground: var(--foreground); + + --border: #1a2d48; /* button border color */ + --input: #1a2d48; /* matching border */ + } +} From a66b885c3c49fbc9d32356e015aaa7376a09050c Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Mon, 17 Mar 2025 00:22:04 -0400 Subject: [PATCH 06/71] add ghost content transformer stuff --- src/components/ghost/AccessCheck.tsx | 55 ++ src/components/ghost/GhostContent.tsx | 81 +++ src/components/ghost/GhostRenderer.tsx | 111 ++++ src/components/ghost/MemberAuth.tsx | 5 + src/components/ghost/Protected.tsx | 94 ++++ src/components/ghost/SignupForm.tsx | 151 ++++++ src/components/ghost/cards/BookmarkCard.tsx | 50 ++ src/components/ghost/cards/ButtonCard.tsx | 36 ++ src/components/ghost/cards/CalloutCard.tsx | 46 ++ src/components/ghost/cards/FileCard.tsx | 61 +++ src/components/ghost/cards/GalleryCard.tsx | 39 ++ src/components/ghost/cards/HeaderCard.tsx | 54 ++ src/components/ghost/cards/ProductCard.tsx | 71 +++ src/components/ghost/cards/SignupCard.tsx | 128 +++++ src/components/ghost/cards/ToggleCard.tsx | 46 ++ src/lib/api/ghost/content-api.ts | 154 ++++++ src/lib/ghost/index.ts | 43 ++ src/lib/ghost/parseGhostContent.ts | 356 +++++++++++++ src/style/ghost-content.css | 529 ++++++++++++++++++++ 19 files changed, 2110 insertions(+) create mode 100644 src/components/ghost/AccessCheck.tsx create mode 100644 src/components/ghost/GhostContent.tsx create mode 100644 src/components/ghost/GhostRenderer.tsx create mode 100644 src/components/ghost/MemberAuth.tsx create mode 100644 src/components/ghost/Protected.tsx create mode 100644 src/components/ghost/SignupForm.tsx create mode 100644 src/components/ghost/cards/BookmarkCard.tsx create mode 100644 src/components/ghost/cards/ButtonCard.tsx create mode 100644 src/components/ghost/cards/CalloutCard.tsx create mode 100644 src/components/ghost/cards/FileCard.tsx create mode 100644 src/components/ghost/cards/GalleryCard.tsx create mode 100644 src/components/ghost/cards/HeaderCard.tsx create mode 100644 src/components/ghost/cards/ProductCard.tsx create mode 100644 src/components/ghost/cards/SignupCard.tsx create mode 100644 src/components/ghost/cards/ToggleCard.tsx create mode 100644 src/lib/api/ghost/content-api.ts create mode 100644 src/lib/ghost/index.ts create mode 100644 src/lib/ghost/parseGhostContent.ts create mode 100644 src/style/ghost-content.css diff --git a/src/components/ghost/AccessCheck.tsx b/src/components/ghost/AccessCheck.tsx new file mode 100644 index 0000000..8371509 --- /dev/null +++ b/src/components/ghost/AccessCheck.tsx @@ -0,0 +1,55 @@ +import { useState, useEffect } from 'react'; + +interface AccessCheckProps { + slug: string; + children: React.ReactNode; + fallback: React.ReactNode; +} + +// Client-side component to check access to premium content +export default function AccessCheck({ slug, children, fallback }: AccessCheckProps) { + const [hasAccess, setHasAccess] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const checkAccess = async () => { + try { + const response = await fetch('/api/ghost/access', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ slug }), + credentials: 'include', + }); + + if (!response.ok) { + setHasAccess(false); + setLoading(false); + return; + } + + const data = await response.json(); + setHasAccess(data.hasAccess); + } catch (error) { + console.error('Error checking access:', error); + setHasAccess(false); + } finally { + setLoading(false); + } + }; + + checkAccess(); + }, [slug]); + + if (loading) { + return ( +
+
+

Checking access...

+
+ ); + } + + return hasAccess ? <>{children} : <>{fallback}; +} \ No newline at end of file diff --git a/src/components/ghost/GhostContent.tsx b/src/components/ghost/GhostContent.tsx new file mode 100644 index 0000000..85ff56d --- /dev/null +++ b/src/components/ghost/GhostContent.tsx @@ -0,0 +1,81 @@ +import React, { useEffect, useState } from 'react'; +import GhostRenderer, { type GhostBlock } from './GhostRenderer'; +import { parseGhostContent, extractGhostContent } from '../../lib/ghost/parseGhostContent'; + +export interface GhostContentProps { + html?: string; + url?: string; + className?: string; +} + +/** + * Component to render Ghost content from either HTML or a URL + */ +const GhostContent: React.FC = ({ html, url, className = '' }) => { + const [blocks, setBlocks] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + // If HTML is provided directly, parse it + if (html) { + try { + // Ensure we're in the browser before parsing + if (typeof window !== 'undefined') { + const parsedBlocks = parseGhostContent(html); + setBlocks(parsedBlocks); + } else { + // In SSR, just set a simple block that will be replaced during hydration + setBlocks([{ type: 'html', html }]); + } + } catch (err) { + console.error('Error parsing Ghost content:', err); + setError('Failed to parse content'); + } + return; + } + + // If URL is provided, fetch and parse the content + if (url) { + setLoading(true); + setError(null); + + fetch(url) + .then((response) => { + if (!response.ok) { + throw new Error(`Failed to fetch content: ${response.status}`); + } + return response.text(); + }) + .then((htmlContent) => { + // Extract the main content from the full page + const contentHtml = extractGhostContent(htmlContent); + const parsedBlocks = parseGhostContent(contentHtml); + setBlocks(parsedBlocks); + }) + .catch((err) => { + console.error('Error fetching Ghost content:', err); + setError(err.message || 'Failed to load content'); + }) + .finally(() => { + setLoading(false); + }); + } + }, [html, url]); + + if (loading) { + return
Loading content...
; + } + + if (error) { + return
Error: {error}
; + } + + if (!blocks || blocks.length === 0) { + return null; + } + + return ; +}; + +export default GhostContent; diff --git a/src/components/ghost/GhostRenderer.tsx b/src/components/ghost/GhostRenderer.tsx new file mode 100644 index 0000000..a86cce2 --- /dev/null +++ b/src/components/ghost/GhostRenderer.tsx @@ -0,0 +1,111 @@ +import React from 'react'; +import GalleryCard from './cards/GalleryCard'; +import BookmarkCard from './cards/BookmarkCard'; +import ProductCard from './cards/ProductCard'; +import FileCard from './cards/FileCard'; +import CalloutCard from './cards/CalloutCard'; +import ButtonCard from './cards/ButtonCard'; +import ToggleCard from './cards/ToggleCard'; +import HeaderCard from './cards/HeaderCard'; +import SignupCard from './cards/SignupCard'; + +export interface GhostBlock { + type: string; + html?: string; + attributes?: Record; + children?: GhostBlock[]; +} + +export interface GhostRendererProps { + blocks: GhostBlock[]; + className?: string; +} + +const GhostRenderer: React.FC = ({ blocks, className = '' }) => { + if (!blocks || blocks.length === 0) { + return null; + } + + return ( +
+ {blocks.map((block, index) => renderBlock(block, index))} +
+ ); +}; + +const renderBlock = (block: GhostBlock, index: number): React.ReactNode => { + switch (block.type) { + case 'paragraph': + return
; + + case 'heading': { + const level = block.attributes?.level || 1; + const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; + return ; + } + + case 'list': { + const ListTag = block.attributes?.ordered ? 'ol' : 'ul'; + return ( + + {block.children?.map((item, itemIndex) => ( +
  • + ))} + + ); + } + + case 'image': + return ( +
    + {block.attributes?.alt + {block.attributes?.caption && ( +
    + )} +
    + ); + + case 'gallery': + return ; + + case 'bookmark': + return ; + + case 'product': + return ; + + case 'file': + return ; + + case 'callout': + return ; + + case 'button': + return ; + + case 'toggle': + return ; + + case 'header': + return ; + + case 'signup': + return ; + + case 'html': + return
    ; + + case 'divider': + return
    ; + + default: + console.warn(`Unsupported block type: ${block.type}`); + return
    ; + } +}; + +export default GhostRenderer; diff --git a/src/components/ghost/MemberAuth.tsx b/src/components/ghost/MemberAuth.tsx new file mode 100644 index 0000000..21321c1 --- /dev/null +++ b/src/components/ghost/MemberAuth.tsx @@ -0,0 +1,5 @@ +import UserMenu from '../UserMenu'; + +export default function MemberAuth() { + return ; +} diff --git a/src/components/ghost/Protected.tsx b/src/components/ghost/Protected.tsx new file mode 100644 index 0000000..a03549a --- /dev/null +++ b/src/components/ghost/Protected.tsx @@ -0,0 +1,94 @@ +import { useState, useEffect, ReactNode } from 'react'; +import type { GhostMember } from '../../lib/api/ghost/types'; + +interface ProtectedProps { + children: ReactNode; + paidOnly?: boolean; + fallback?: ReactNode; + loadingFallback?: ReactNode; +} + +export default function Protected({ + children, + paidOnly = false, + fallback, + loadingFallback +}: ProtectedProps) { + const [member, setMember] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchMember = async () => { + try { + const response = await fetch('/api/ghost/member', { + credentials: 'include' + }); + + if (!response.ok) { + setLoading(false); + return; + } + + const data = await response.json(); + setMember(data.success ? data.member : null); + } catch (err) { + console.error('Failed to fetch member:', err); + setError('Failed to verify authentication status'); + } finally { + setLoading(false); + } + }; + + fetchMember(); + }, []); + + // Show loading state + if (loading) { + return ( +
    + {loadingFallback || ( +
    + + + + +

    Verifying access...

    +
    + )} +
    + ); + } + + // Show error state + if (error) { + return ( +
    +

    {error}

    +
    + ); + } + + // No member or member doesn't have paid access when required + if (!member || (paidOnly && !member.paid)) { + return ( +
    + {fallback || ( +
    +

    + {!member ? 'Sign in required' : 'Paid membership required'} +

    +

    + {!member + ? 'Please sign in to access this content' + : 'This content is only available to paid members'} +

    +
    + )} +
    + ); + } + + // Member has access - render content + return <>{children}; +} \ No newline at end of file diff --git a/src/components/ghost/SignupForm.tsx b/src/components/ghost/SignupForm.tsx new file mode 100644 index 0000000..8bc1df5 --- /dev/null +++ b/src/components/ghost/SignupForm.tsx @@ -0,0 +1,151 @@ +import { useState } from 'react'; + +interface SignupFormProps { + onSignup: (name: string, email: string, password: string) => Promise<{ success: boolean; error?: string }>; + onCancel: () => void; + onLoginClick: () => void; +} + +export default function SignupForm({ onSignup, onCancel, onLoginClick }: SignupFormProps) { + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [error, setError] = useState(null); + const [isSubmitting, setIsSubmitting] = useState(false); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(null); + + // Validate form + if (!name || !email || !password) { + setError('All fields are required'); + return; + } + + if (password !== confirmPassword) { + setError('Passwords do not match'); + return; + } + + if (password.length < 8) { + setError('Password must be at least 8 characters'); + return; + } + + setIsSubmitting(true); + + try { + const result = await onSignup(name, email, password); + + if (!result.success) { + setError(result.error || 'Failed to create account'); + setIsSubmitting(false); + } + // No need to handle success case - parent component will handle it + } catch (err) { + console.error('Signup error:', err); + setError('An unexpected error occurred'); + setIsSubmitting(false); + } + }; + + return ( +
    +

    Create an account

    + +
    + + setName(e.target.value)} + className="w-full px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-primary" + required + /> +
    + +
    + + setEmail(e.target.value)} + className="w-full px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-primary" + required + /> +
    + +
    + + setPassword(e.target.value)} + className="w-full px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-primary" + required + minLength={8} + /> +

    Must be at least 8 characters

    +
    + +
    + + setConfirmPassword(e.target.value)} + className="w-full px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-primary" + required + /> +
    + + {error && ( +
    + {error} +
    + )} + +
    + + +
    + +
    + Already have an account? + +
    +
    + ); +} diff --git a/src/components/ghost/cards/BookmarkCard.tsx b/src/components/ghost/cards/BookmarkCard.tsx new file mode 100644 index 0000000..cda10ce --- /dev/null +++ b/src/components/ghost/cards/BookmarkCard.tsx @@ -0,0 +1,50 @@ +import React from 'react'; + +export interface BookmarkCardProps { + url: string; + title?: string; + description?: string; + author?: string; + publisher?: string; + thumbnail?: string; + icon?: string; + className?: string; +} + +const BookmarkCard: React.FC = ({ + url, + title, + description, + author, + publisher, + thumbnail, + icon, + className = '', +}) => { + if (!url) { + return null; + } + + return ( +
    + +
    + {title &&
    {title}
    } + {description &&
    {description}
    } +
    + {icon && } + {author && {author}} + {publisher && {publisher}} +
    +
    + {thumbnail && ( +
    + (e.currentTarget.style.display = 'none')} /> +
    + )} +
    +
    + ); +}; + +export default BookmarkCard; diff --git a/src/components/ghost/cards/ButtonCard.tsx b/src/components/ghost/cards/ButtonCard.tsx new file mode 100644 index 0000000..918e5b5 --- /dev/null +++ b/src/components/ghost/cards/ButtonCard.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +export interface ButtonCardProps { + buttonText?: string; + buttonUrl?: string; + alignment?: 'left' | 'center' | 'right'; + buttonColor?: string; + buttonTextColor?: string; + className?: string; +} + +const ButtonCard: React.FC = ({ + buttonText = 'Learn more', + buttonUrl = '#', + alignment = 'center', + buttonColor, + buttonTextColor, + className = '', +}) => { + return ( + + ); +}; + +export default ButtonCard; diff --git a/src/components/ghost/cards/CalloutCard.tsx b/src/components/ghost/cards/CalloutCard.tsx new file mode 100644 index 0000000..611ae3b --- /dev/null +++ b/src/components/ghost/cards/CalloutCard.tsx @@ -0,0 +1,46 @@ +import React from 'react'; + +export interface CalloutCardProps { + html?: string; + emoji?: string; + backgroundColor?: string; + textColor?: string; + className?: string; +} + +const CalloutCard: React.FC = ({ + html, + emoji = '💡', + backgroundColor, + textColor, + className = '', +}) => { + // Determine the color class based on backgroundColor + let colorClass = ''; + if (backgroundColor) { + if (backgroundColor.includes('blue')) colorClass = 'kg-callout-card-blue'; + else if (backgroundColor.includes('green')) colorClass = 'kg-callout-card-green'; + else if (backgroundColor.includes('yellow')) colorClass = 'kg-callout-card-yellow'; + else if (backgroundColor.includes('red')) colorClass = 'kg-callout-card-red'; + else if (backgroundColor.includes('pink')) colorClass = 'kg-callout-card-pink'; + else if (backgroundColor.includes('purple')) colorClass = 'kg-callout-card-purple'; + } + + return ( +
    +
    {emoji}
    +
    +
    + ); +}; + +export default CalloutCard; diff --git a/src/components/ghost/cards/FileCard.tsx b/src/components/ghost/cards/FileCard.tsx new file mode 100644 index 0000000..279627f --- /dev/null +++ b/src/components/ghost/cards/FileCard.tsx @@ -0,0 +1,61 @@ +import React from 'react'; + +export interface FileCardProps { + url: string; + title?: string; + caption?: string; + fileName?: string; + fileSize?: string; + className?: string; +} + +const FileCard: React.FC = ({ + url, + title, + caption, + fileName, + fileSize, + className = '', +}) => { + if (!url) { + return null; + } + + return ( + + ); +}; + +export default FileCard; diff --git a/src/components/ghost/cards/GalleryCard.tsx b/src/components/ghost/cards/GalleryCard.tsx new file mode 100644 index 0000000..10962ab --- /dev/null +++ b/src/components/ghost/cards/GalleryCard.tsx @@ -0,0 +1,39 @@ +import React from 'react'; + +export interface GalleryCardProps { + images?: { + url: string; + alt?: string; + width?: number; + height?: number; + }[]; + className?: string; +} + +const GalleryCard: React.FC = ({ images = [], className = '' }) => { + if (!images || images.length === 0) { + return null; + } + + return ( +
    +
    +
    + {images.map((image, index) => ( +
    + {image.alt +
    + ))} +
    +
    +
    + ); +}; + +export default GalleryCard; diff --git a/src/components/ghost/cards/HeaderCard.tsx b/src/components/ghost/cards/HeaderCard.tsx new file mode 100644 index 0000000..df38320 --- /dev/null +++ b/src/components/ghost/cards/HeaderCard.tsx @@ -0,0 +1,54 @@ +import React from 'react'; + +export interface HeaderCardProps { + heading?: string; + subheading?: string; + backgroundColor?: string; + textColor?: string; + alignment?: 'left' | 'center' | 'right'; + className?: string; +} + +const HeaderCard: React.FC = ({ + heading, + subheading, + backgroundColor = '#000000', + textColor = '#FFFFFF', + alignment = 'center', + className = '', +}) => { + return ( +
    +
    +
    + {heading && ( +

    + {heading} +

    + )} + {subheading && ( +

    + {subheading} +

    + )} +
    +
    +
    + ); +}; + +export default HeaderCard; diff --git a/src/components/ghost/cards/ProductCard.tsx b/src/components/ghost/cards/ProductCard.tsx new file mode 100644 index 0000000..5ea7c3e --- /dev/null +++ b/src/components/ghost/cards/ProductCard.tsx @@ -0,0 +1,71 @@ +import React from 'react'; + +export interface ProductCardProps { + title?: string; + description?: string; + image?: string; + imageWidth?: number; + imageHeight?: number; + buttonText?: string; + buttonUrl?: string; + rating?: number; + starColor?: string; + backgroundColor?: string; + className?: string; +} + +const ProductCard: React.FC = ({ + title, + description, + image, + imageWidth, + imageHeight, + buttonText = 'Buy now', + buttonUrl = '#', + rating = 0, + starColor = 'currentColor', + backgroundColor, + className = '', +}) => { + // Generate stars based on rating (1-5) + const stars = Array.from({ length: 5 }, (_, i) => ( + + + + + + )); + + return ( +
    +
    + {image && ( + {title + )} +
    + {title &&

    {title}

    } +
    + + {rating > 0 &&
    {stars}
    } + + {description &&
    {description}
    } + + + {buttonText} + +
    +
    + ); +}; + +export default ProductCard; diff --git a/src/components/ghost/cards/SignupCard.tsx b/src/components/ghost/cards/SignupCard.tsx new file mode 100644 index 0000000..155e682 --- /dev/null +++ b/src/components/ghost/cards/SignupCard.tsx @@ -0,0 +1,128 @@ +import React, { useState } from 'react'; + +export interface SignupCardProps { + heading?: string; + subheading?: string; + buttonText?: string; + disclaimer?: string; + backgroundColor?: string; + textColor?: string; + buttonColor?: string; + buttonTextColor?: string; + className?: string; + onSubmit?: (email: string) => Promise; +} + +const SignupCard: React.FC = ({ + heading = 'Sign up for our newsletter', + subheading = 'Get the latest updates delivered to your inbox', + buttonText = 'Subscribe', + disclaimer = 'No spam. Unsubscribe anytime.', + backgroundColor = '#F0F0F0', + textColor = '#000000', + buttonColor, + buttonTextColor = '#FFFFFF', + className = '', + onSubmit, +}) => { + const [email, setEmail] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [success, setSuccess] = useState(false); + const [error, setError] = useState(''); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + if (!email) { + setError('Please enter your email address'); + return; + } + + setIsLoading(true); + setError(''); + + try { + if (onSubmit) { + await onSubmit(email); + setSuccess(true); + } else { + // Default behavior if no onSubmit handler is provided + console.log('Signup form submitted with email:', email); + setSuccess(true); + } + } catch (err) { + setError(err instanceof Error ? err.message : 'An error occurred. Please try again.'); + } finally { + setIsLoading(false); + } + }; + + return ( +
    +
    +
    +

    + {heading} +

    +

    + {subheading} +

    + +
    +
    + setEmail(e.target.value)} + disabled={isLoading || success} + /> + +
    + {success && ( +
    + Email sent! Check your inbox to complete your signup. +
    + )} + {error && ( +
    + {error} +
    + )} +
    + +

    + {disclaimer} +

    +
    +
    +
    + ); +}; + +export default SignupCard; diff --git a/src/components/ghost/cards/ToggleCard.tsx b/src/components/ghost/cards/ToggleCard.tsx new file mode 100644 index 0000000..67a3a65 --- /dev/null +++ b/src/components/ghost/cards/ToggleCard.tsx @@ -0,0 +1,46 @@ +import React, { useState } from 'react'; + +export interface ToggleCardProps { + heading?: string; + html?: string; + className?: string; +} + +const ToggleCard: React.FC = ({ + heading = 'Toggle header', + html, + className = '', +}) => { + const [isOpen, setIsOpen] = useState(false); + + const toggleOpen = () => { + setIsOpen(!isOpen); + }; + + return ( +
    +
    +

    + {heading} +

    + +
    +
    +
    +
    +
    + ); +}; + +export default ToggleCard; diff --git a/src/lib/api/ghost/content-api.ts b/src/lib/api/ghost/content-api.ts new file mode 100644 index 0000000..e17f466 --- /dev/null +++ b/src/lib/api/ghost/content-api.ts @@ -0,0 +1,154 @@ +/** + * Ghost Content API client + */ +import type { GhostPost, GhostPage, GhostTag, GhostSettings, GhostPaginationParams, GhostPaginatedResponse } from './types'; + +export interface ContentApiOptions { + url: string; + key: string; + version?: string; +} + +/** + * Create a request URL with the necessary query parameters + */ +function createUrl(options: ContentApiOptions, endpoint: string, params: Record = {}): string { + const url = new URL(`${options.url.replace(/\/$/, '')}/ghost/api/content/${endpoint}`); + + // Add API key + url.searchParams.append('key', options.key); + + // Add additional parameters + Object.entries(params).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + url.searchParams.append(key, value.toString()); + } + }); + + return url.toString(); +} + +/** + * Make a request to the Ghost Content API + */ +async function fetchFromApi(options: ContentApiOptions, endpoint: string, params: Record = {}): Promise { + try { + const url = createUrl(options, endpoint, params); + console.log(`Ghost API request URL: ${url}`); + + const response = await fetch(url); + + if (!response.ok) { + console.error(`Ghost API error: ${response.status} ${response.statusText}`); + console.error(`Request URL: ${url}`); + const errorText = await response.text().catch(() => 'Could not read error response'); + console.error(`Response body: ${errorText}`); + throw new Error(`Ghost API error: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + return data as T; + } catch (error) { + console.error('Ghost Content API request failed:', error); + throw error; + } +} + +/** + * Creates a Ghost Content API client + */ +export function createContentApi(options: ContentApiOptions) { + return { + /** + * Get posts from the Ghost Content API + */ + getPosts: async (params: GhostPaginationParams = {}): Promise> => { + return fetchFromApi>(options, 'posts', { + ...params, + include: params.include || 'authors,tags', + }); + }, + + /** + * Get a single post by slug + */ + getPostBySlug: async (slug: string): Promise<{ posts: GhostPost[] }> => { + return fetchFromApi<{ posts: GhostPost[] }>(options, 'posts/slug/' + slug, { + include: 'authors,tags', + }); + }, + + /** + * Get pages from the Ghost Content API + */ + getPages: async (params: GhostPaginationParams = {}): Promise> => { + return fetchFromApi>(options, 'pages', { + ...params, + include: params.include || 'authors,tags', + }); + }, + + /** + * Get a single page by slug + */ + getPageBySlug: async (slug: string): Promise<{ pages: GhostPage[] }> => { + return fetchFromApi<{ pages: GhostPage[] }>(options, 'pages/slug/' + slug, { + include: 'authors,tags', + }); + }, + + /** + * Get tags from the Ghost Content API + */ + getTags: async (params: GhostPaginationParams = {}): Promise> => { + return fetchFromApi>(options, 'tags', params); + }, + + /** + * Get a single tag by slug + */ + getTagBySlug: async (slug: string): Promise<{ tags: GhostTag[] }> => { + return fetchFromApi<{ tags: GhostTag[] }>(options, 'tags/slug/' + slug); + }, + + /** + * Get site settings + */ + getSettings: async (): Promise<{ settings: GhostSettings }> => { + return fetchFromApi<{ settings: GhostSettings }>(options, 'settings'); + } + }; +} + +/** + * Create a Ghost Content API client using environment variables + */ +export function createContentApiFromEnv() { + // Prefer the dedicated base URL if available + const baseUrl = import.meta.env.GHOST_BASE_URL; + // Fall back to extracting from the content API URL if needed + const contentApiUrl = import.meta.env.GHOST_CONTENT_API_URL; + const key = import.meta.env.GHOST_CONTENT_API_KEY; + + // Determine the final URL to use + let url = baseUrl; + + if (!url && contentApiUrl) { + // Extract the base URL from the content API URL if needed + url = contentApiUrl.replace(/\/ghost\/api\/content\/?$/, ''); + console.log(`Extracted base URL from content API URL: ${url}`); + } + + if (!url) { + throw new Error('Neither GHOST_BASE_URL nor GHOST_CONTENT_API_URL environment variable is defined'); + } + + if (!key) { + throw new Error('GHOST_CONTENT_API_KEY environment variable is not defined'); + } + + console.log(`Creating Ghost Content API client with URL: ${url}`); + console.log(`API Key (first 10 chars): ${key.substring(0, 10)}...`); + + return createContentApi({ url, key }); +} diff --git a/src/lib/ghost/index.ts b/src/lib/ghost/index.ts new file mode 100644 index 0000000..5d69cef --- /dev/null +++ b/src/lib/ghost/index.ts @@ -0,0 +1,43 @@ +import GhostContentAPI from '@tryghost/content-api'; + +// Initialize the Ghost Content API client +const api = new GhostContentAPI({ + url: import.meta.env.SITE_URL || 'https://', + key: import.meta.env.GHOST_CONTENT_API_KEY || '', + version: 'v5.0' +}); + +// Get posts from Ghost +export async function getPosts() { + return await api.posts + .browse({ + limit: 5, + include: ['tags', 'authors'] + }) + .catch(err => { + console.error(err); + return []; + }); +} + +// Get a single post by slug +export async function getPost(slug: string) { + return await api.posts + .read({ slug }, { include: ['tags', 'authors'] }) + .catch(err => { + console.error(err); + return null; + }); +} + +// Get Ghost settings +export async function getGhostSettings() { + return await api.settings + .browse() + .catch(err => { + console.error(err); + return null; + }); +} + +export default api; diff --git a/src/lib/ghost/parseGhostContent.ts b/src/lib/ghost/parseGhostContent.ts new file mode 100644 index 0000000..7eaf1de --- /dev/null +++ b/src/lib/ghost/parseGhostContent.ts @@ -0,0 +1,356 @@ +import type { GhostBlock } from '../../components/ghost/GhostRenderer'; + +/** + * Parses Ghost HTML content into structured blocks + * @param html The HTML content from Ghost + * @returns An array of GhostBlock objects + */ +export function parseGhostContent(html: string): GhostBlock[] { + if (!html) { + return []; + } + + // Create a temporary DOM element to parse the HTML + let doc; + + // Check if we're in a browser environment + if (typeof DOMParser !== 'undefined') { + const parser = new DOMParser(); + doc = parser.parseFromString(html, 'text/html'); + } else { + // In server environment, return a simple block + // This will be replaced on the client side when hydrated + return [ + { + type: 'html', + html: html, + } + ]; + } + + const blocks: GhostBlock[] = []; + + // Process each top-level element in the body + Array.from(doc.body.children).forEach((element) => { + const block = processElement(element); + if (block) { + blocks.push(block); + } + }); + + return blocks; +} + +/** + * Process a DOM element into a GhostBlock + */ +function processElement(element: Element): GhostBlock | null { + // Skip empty elements + if (!element.textContent?.trim() && !element.classList.contains('kg-card')) { + return null; + } + + // Process based on element type + if (element.tagName === 'P') { + return { + type: 'paragraph', + html: element.outerHTML, + }; + } + + if (/^H[1-6]$/.test(element.tagName)) { + return { + type: 'heading', + html: element.innerHTML, + attributes: { + level: parseInt(element.tagName.substring(1), 10), + }, + }; + } + + if (element.tagName === 'UL' || element.tagName === 'OL') { + const children: GhostBlock[] = []; + Array.from(element.children).forEach((child) => { + if (child.tagName === 'LI') { + children.push({ + type: 'listItem', + html: child.innerHTML, + }); + } + }); + + return { + type: 'list', + attributes: { + ordered: element.tagName === 'OL', + }, + children, + }; + } + + if (element.tagName === 'FIGURE') { + // Check if it's an image + const img = element.querySelector('img'); + if (img) { + const figcaption = element.querySelector('figcaption'); + return { + type: 'image', + attributes: { + src: img.getAttribute('src'), + alt: img.getAttribute('alt') || '', + caption: figcaption ? figcaption.innerHTML : '', + }, + }; + } + + // Check if it's a gallery + if (element.classList.contains('kg-gallery-card')) { + const images = Array.from(element.querySelectorAll('.kg-gallery-image img')).map((img) => ({ + url: img.getAttribute('src') || '', + alt: img.getAttribute('alt') || '', + width: img.getAttribute('width') ? parseInt(img.getAttribute('width') || '0', 10) : undefined, + height: img.getAttribute('height') ? parseInt(img.getAttribute('height') || '0', 10) : undefined, + })); + + return { + type: 'gallery', + attributes: { + images, + }, + }; + } + + // Check if it's a bookmark + if (element.classList.contains('kg-bookmark-card')) { + const container = element.querySelector('.kg-bookmark-container'); + const url = container?.getAttribute('href') || ''; + const title = element.querySelector('.kg-bookmark-title')?.textContent || ''; + const description = element.querySelector('.kg-bookmark-description')?.textContent || ''; + const author = element.querySelector('.kg-bookmark-author')?.textContent || ''; + const publisher = element.querySelector('.kg-bookmark-publisher')?.textContent || ''; + const thumbnail = element.querySelector('.kg-bookmark-thumbnail img')?.getAttribute('src') || ''; + const icon = element.querySelector('.kg-bookmark-icon')?.getAttribute('src') || ''; + + return { + type: 'bookmark', + attributes: { + url, + title, + description, + author, + publisher, + thumbnail, + icon, + }, + }; + } + } + + // Process card elements + if (element.classList.contains('kg-card')) { + // Product card + if (element.classList.contains('kg-product-card')) { + const image = element.querySelector('.kg-product-card-image')?.getAttribute('src') || ''; + const imageWidth = element.querySelector('.kg-product-card-image')?.getAttribute('width'); + const imageHeight = element.querySelector('.kg-product-card-image')?.getAttribute('height'); + const title = element.querySelector('.kg-product-card-title')?.textContent || ''; + const description = element.querySelector('.kg-product-card-description')?.textContent || ''; + const buttonText = element.querySelector('.kg-product-card-button span')?.textContent || 'Buy now'; + const buttonUrl = element.querySelector('.kg-product-card-button')?.getAttribute('href') || '#'; + + // Count active rating stars + const activeStars = element.querySelectorAll('.kg-product-card-rating-active').length; + + return { + type: 'product', + attributes: { + image, + imageWidth: imageWidth ? parseInt(imageWidth, 10) : undefined, + imageHeight: imageHeight ? parseInt(imageHeight, 10) : undefined, + title, + description, + buttonText, + buttonUrl, + rating: activeStars, + }, + }; + } + + // File card + if (element.classList.contains('kg-file-card')) { + const url = element.querySelector('.kg-file-card-container')?.getAttribute('href') || ''; + const title = element.querySelector('.kg-file-card-title')?.textContent || ''; + const caption = element.querySelector('.kg-file-card-caption')?.textContent || ''; + const fileName = element.querySelector('.kg-file-card-filename')?.textContent || ''; + const fileSize = element.querySelector('.kg-file-card-filesize')?.textContent || ''; + + return { + type: 'file', + attributes: { + url, + title, + caption, + fileName, + fileSize, + }, + }; + } + + // Callout card + if (element.classList.contains('kg-callout-card')) { + const emoji = element.querySelector('.kg-callout-emoji')?.textContent || '💡'; + const html = element.querySelector('.kg-callout-text')?.innerHTML || ''; + + // Determine background color from class or style + let backgroundColor; + const htmlElement = element as HTMLElement; + if (htmlElement.style?.backgroundColor) { + backgroundColor = htmlElement.style.backgroundColor; + } else { + // Check for color classes + const colorClasses = ['blue', 'green', 'yellow', 'red', 'pink', 'purple']; + for (const color of colorClasses) { + if (element.classList.contains(`kg-callout-card-${color}`)) { + backgroundColor = color; + break; + } + } + } + + return { + type: 'callout', + html, + attributes: { + emoji, + backgroundColor, + textColor: (element as HTMLElement).style?.color, + }, + }; + } + + // Button card + if (element.classList.contains('kg-button-card')) { + const button = element.querySelector('.kg-btn'); + const buttonText = button?.textContent || 'Learn more'; + const buttonUrl = button?.getAttribute('href') || '#'; + + // Determine alignment + let alignment = 'center'; + if (element.classList.contains('kg-align-left')) alignment = 'left'; + else if (element.classList.contains('kg-align-right')) alignment = 'right'; + + return { + type: 'button', + attributes: { + buttonText, + buttonUrl, + alignment, + buttonColor: (button as HTMLElement)?.style?.backgroundColor, + buttonTextColor: (button as HTMLElement)?.style?.color, + }, + }; + } + + // Toggle card + if (element.classList.contains('kg-toggle-card')) { + const heading = element.querySelector('.kg-toggle-heading-text')?.textContent || ''; + const html = element.querySelector('.kg-toggle-content')?.innerHTML || ''; + + return { + type: 'toggle', + html, + attributes: { + heading, + }, + }; + } + + // Header card + if (element.classList.contains('kg-header-card')) { + const heading = element.querySelector('.kg-header-card-heading')?.textContent || ''; + const subheading = element.querySelector('.kg-header-card-subheading')?.textContent || ''; + const backgroundColor = element.getAttribute('data-background-color') || (element as HTMLElement).style?.backgroundColor; + const textColor = element.querySelector('[data-text-color]')?.getAttribute('data-text-color') || ''; + + // Determine alignment + let alignment = 'center'; + const textContainer = element.querySelector('.kg-header-card-text'); + if (textContainer?.classList.contains('kg-align-left')) alignment = 'left'; + else if (textContainer?.classList.contains('kg-align-right')) alignment = 'right'; + + return { + type: 'header', + attributes: { + heading, + subheading, + backgroundColor, + textColor, + alignment, + }, + }; + } + + // Signup card + if (element.classList.contains('kg-signup-card')) { + const heading = element.querySelector('.kg-signup-card-heading')?.textContent || ''; + const subheading = element.querySelector('.kg-signup-card-subheading')?.textContent || ''; + const buttonText = element.querySelector('.kg-signup-card-button-default')?.textContent || 'Subscribe'; + const disclaimer = element.querySelector('.kg-signup-card-disclaimer')?.textContent || ''; + const backgroundColor = (element as HTMLElement).style?.backgroundColor; + const headingElement = element.querySelector('.kg-signup-card-heading') as HTMLElement; + const textColor = headingElement?.style?.color; + const buttonElement = element.querySelector('.kg-signup-card-button') as HTMLElement; + + return { + type: 'signup', + attributes: { + heading, + subheading, + buttonText, + disclaimer, + backgroundColor, + textColor, + buttonColor: buttonElement?.style?.backgroundColor, + buttonTextColor: buttonElement?.style?.color, + }, + }; + } + } + + // Handle dividers + if (element.tagName === 'HR') { + return { + type: 'divider', + }; + } + + // Default fallback for other elements + return { + type: 'html', + html: element.outerHTML, + }; +} + +/** + * Utility function to extract Ghost content from a full HTML page + * @param html Full HTML page from Ghost + * @returns The content HTML + */ +export function extractGhostContent(html: string): string { + // Check if we're in a browser environment + if (typeof DOMParser !== 'undefined') { + const parser = new DOMParser(); + const doc = parser.parseFromString(html, 'text/html'); + + // Look for the main content section + const contentSection = doc.querySelector('.gh-content'); + + if (contentSection) { + return contentSection.innerHTML; + } + } + + // If we're in a server environment or couldn't find the content section, + // return the original HTML + return html; +} diff --git a/src/style/ghost-content.css b/src/style/ghost-content.css new file mode 100644 index 0000000..1c2ee17 --- /dev/null +++ b/src/style/ghost-content.css @@ -0,0 +1,529 @@ +/* Ghost Content Styles */ + +/* Base content container */ +.ghost-content { + width: 100%; + max-width: 100%; + margin: 0 auto; + font-family: inherit; +} + +/* Gallery Card */ +.kg-gallery-card { + margin: 1.5em 0; +} + +.kg-gallery-container { + display: flex; + flex-direction: column; +} + +.kg-gallery-row { + display: flex; + flex-direction: row; + justify-content: center; +} + +.kg-gallery-image img { + display: block; + margin: 0; + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 0.25rem; +} + +.kg-gallery-image { + flex: 1 1 0; + margin: 0.25rem; +} + +/* Bookmark Card */ +.kg-bookmark-card { + width: 100%; + margin: 1.5em 0; +} + +.kg-bookmark-container { + display: flex; + flex-wrap: wrap; + text-decoration: none; + border-radius: 0.25rem; + border: 1px solid rgba(0, 0, 0, 0.1); + overflow: hidden; + color: inherit; +} + +.kg-bookmark-content { + flex-basis: 0; + flex-grow: 999; + min-width: 50%; + padding: 1.5rem; +} + +.kg-bookmark-title { + font-weight: 600; + font-size: 1.1em; +} + +.kg-bookmark-description { + margin-top: 0.5em; + color: rgba(0, 0, 0, 0.6); + font-size: 0.9em; + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +.kg-bookmark-metadata { + display: flex; + align-items: center; + margin-top: 1em; + font-size: 0.8em; + color: rgba(0, 0, 0, 0.6); +} + +.kg-bookmark-icon { + width: 20px; + height: 20px; + margin-right: 0.5em; +} + +.kg-bookmark-author, +.kg-bookmark-publisher { + display: inline; +} + +.kg-bookmark-author:after { + content: "•"; + margin: 0 0.5em; +} + +.kg-bookmark-thumbnail { + flex-basis: 25%; + min-width: 200px; + max-height: 200px; +} + +.kg-bookmark-thumbnail img { + width: 100%; + height: 100%; + object-fit: cover; +} + +/* Product Card */ +.kg-product-card { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + margin: 1.5em 0; + padding: 1.5rem; + border-radius: 0.25rem; + border: 1px solid rgba(0, 0, 0, 0.1); +} + +.kg-product-card-container { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; +} + +.kg-product-card-image { + width: 100%; + max-width: 300px; + height: auto; + margin-bottom: 1rem; + border-radius: 0.25rem; +} + +.kg-product-card-title-container { + width: 100%; + text-align: center; + margin-bottom: 0.5rem; +} + +.kg-product-card-title { + font-size: 1.2em; + font-weight: 600; + margin: 0; +} + +.kg-product-card-rating { + display: flex; + justify-content: center; + margin: 0.5rem 0; +} + +.kg-product-card-rating-star { + width: 20px; + height: 20px; + margin: 0 0.1rem; +} + +.kg-product-card-rating-active { + color: #ffc107; +} + +.kg-product-card-rating-inactive { + color: #e0e0e0; +} + +.kg-product-card-description { + width: 100%; + text-align: center; + margin: 0.5rem 0 1rem; + color: rgba(0, 0, 0, 0.7); +} + +.kg-product-card-button { + display: inline-block; + padding: 0.5rem 1.5rem; + border-radius: 0.25rem; + background-color: #5599ff; + color: white; + text-decoration: none; + font-weight: 600; + transition: background-color 0.2s ease; +} + +.kg-product-card-button:hover { + background-color: #4488ee; +} + +/* File Card */ +.kg-file-card { + margin: 1.5em 0; + border-radius: 0.25rem; + border: 1px solid rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.kg-file-card-container { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem; + color: inherit; + text-decoration: none; +} + +.kg-file-card-contents { + flex-grow: 1; +} + +.kg-file-card-title { + font-weight: 600; + margin-bottom: 0.25rem; +} + +.kg-file-card-caption { + font-size: 0.9em; + color: rgba(0, 0, 0, 0.6); + margin-bottom: 0.5rem; +} + +.kg-file-card-metadata { + display: flex; + font-size: 0.8em; + color: rgba(0, 0, 0, 0.6); +} + +.kg-file-card-filename { + margin-right: 1rem; +} + +.kg-file-card-icon { + width: 40px; + height: 40px; + color: #5599ff; +} + +/* Callout Card */ +.kg-callout-card { + display: flex; + padding: 1.2rem; + margin: 1.5em 0; + border-radius: 0.25rem; +} + +.kg-callout-card-blue { + background-color: rgba(85, 153, 255, 0.1); +} + +.kg-callout-card-green { + background-color: rgba(52, 199, 89, 0.1); +} + +.kg-callout-card-yellow { + background-color: rgba(255, 204, 0, 0.1); +} + +.kg-callout-card-red { + background-color: rgba(255, 59, 48, 0.1); +} + +.kg-callout-card-pink { + background-color: rgba(255, 45, 85, 0.1); +} + +.kg-callout-card-purple { + background-color: rgba(175, 82, 222, 0.1); +} + +.kg-callout-emoji { + width: 2rem; + height: 2rem; + font-size: 1.5rem; + line-height: 2rem; + text-align: center; + margin-right: 0.75rem; +} + +.kg-callout-text { + flex-grow: 1; +} + +/* Button Card */ +.kg-button-card { + margin: 1.5em 0; + text-align: center; +} + +.kg-button-card.kg-align-left { + text-align: left; +} + +.kg-button-card.kg-align-right { + text-align: right; +} + +.kg-btn { + display: inline-block; + padding: 0.6rem 1.75rem; + border-radius: 0.25rem; + background-color: #5599ff; + color: white; + text-decoration: none; + font-weight: 600; + transition: background-color 0.2s ease; +} + +.kg-btn:hover { + background-color: #4488ee; + color: white; +} + +/* Toggle Card */ +.kg-toggle-card { + margin: 1.5em 0; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; +} + +.kg-toggle-heading { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem; + cursor: pointer; +} + +.kg-toggle-heading-text { + font-weight: 600; + margin: 0; +} + +.kg-toggle-card-icon { + width: 24px; + height: 24px; + background: transparent; + border: none; + color: inherit; + cursor: pointer; + transition: transform 0.3s ease; +} + +.kg-toggle-card[data-kg-toggle-state="open"] .kg-toggle-card-icon { + transform: rotate(180deg); +} + +.kg-toggle-content { + padding: 0 1rem 1rem; +} + +/* Header Card */ +.kg-header-card { + margin: 2em 0; + padding: 4rem 2rem; + text-align: center; + background-color: #000; + color: #fff; +} + +.kg-header-card-content { + max-width: 800px; + margin: 0 auto; +} + +.kg-header-card-heading { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 1rem; +} + +.kg-header-card-subheading { + font-size: 1.25rem; + opacity: 0.8; +} + +.kg-header-card-text.kg-align-left { + text-align: left; +} + +.kg-header-card-text.kg-align-right { + text-align: right; +} + +/* Signup Card */ +.kg-signup-card { + margin: 2em 0; + padding: 2rem; + border-radius: 0.25rem; + background-color: #f0f0f0; +} + +.kg-signup-card-content { + max-width: 600px; + margin: 0 auto; +} + +.kg-signup-card-heading { + font-size: 1.5rem; + font-weight: 700; + margin-bottom: 0.5rem; +} + +.kg-signup-card-subheading { + margin-bottom: 1.5rem; +} + +.kg-signup-card-fields { + display: flex; + margin-bottom: 1rem; +} + +.kg-signup-card-input { + flex-grow: 1; + padding: 0.75rem; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 0.25rem 0 0 0.25rem; + font-size: 1rem; +} + +.kg-signup-card-button { + padding: 0.75rem 1.5rem; + border: none; + border-radius: 0 0.25rem 0.25rem 0; + background-color: #5599ff; + color: white; + font-weight: 600; + cursor: pointer; + transition: background-color 0.2s ease; +} + +.kg-signup-card-button:hover:not(:disabled) { + background-color: #4488ee; +} + +.kg-signup-card-button:disabled { + opacity: 0.7; + cursor: not-allowed; +} + +.kg-signup-card-button-loading svg { + animation: spin 1.5s linear infinite; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +.kg-signup-card-success, +.kg-signup-card-error { + margin-bottom: 1rem; + padding: 0.5rem; + border-radius: 0.25rem; +} + +.kg-signup-card-success { + background-color: rgba(52, 199, 89, 0.1); +} + +.kg-signup-card-error { + background-color: rgba(255, 59, 48, 0.1); +} + +.kg-signup-card-disclaimer { + font-size: 0.8rem; + opacity: 0.7; + text-align: center; +} + +/* Divider */ +.ghost-divider { + margin: 2em 0; + border: none; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .kg-gallery-row { + flex-direction: column; + } + + .kg-gallery-image { + margin: 0.25rem 0; + } + + .kg-bookmark-container { + flex-direction: column; + } + + .kg-bookmark-thumbnail { + width: 100%; + max-height: 200px; + } + + .kg-header-card { + padding: 2rem 1rem; + } + + .kg-header-card-heading { + font-size: 2rem; + } + + .kg-signup-card-fields { + flex-direction: column; + } + + .kg-signup-card-input { + border-radius: 0.25rem; + margin-bottom: 0.5rem; + } + + .kg-signup-card-button { + border-radius: 0.25rem; + width: 100%; + } +} From 285bf7bfe98e3598f7cbb3e00152da64244d4b9b Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Mon, 17 Mar 2025 00:22:29 -0400 Subject: [PATCH 07/71] basic ui --- src/components/PostCard.astro | 102 ++++++++++++++++++++ src/components/PostList.astro | 31 ++++++ src/components/SearchBar.astro | 25 +++++ src/pages/posts/[slug].astro | 169 +++++++++++++++++++++++++++++++++ src/pages/posts/index.astro | 49 ++++++++++ src/pages/search.astro | 55 +++++++++++ 6 files changed, 431 insertions(+) create mode 100644 src/components/PostCard.astro create mode 100644 src/components/PostList.astro create mode 100644 src/components/SearchBar.astro create mode 100644 src/pages/posts/[slug].astro create mode 100644 src/pages/posts/index.astro create mode 100644 src/pages/search.astro diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro new file mode 100644 index 0000000..c15a2ff --- /dev/null +++ b/src/components/PostCard.astro @@ -0,0 +1,102 @@ +--- +import type { GhostPost } from '../lib/api/ghost' + +interface Props { + post: GhostPost +} + +const { post } = Astro.props + +// Format the date in a readable format +let formattedDate = 'No date' +if (post.published_at) { + try { + formattedDate = new Date(post.published_at).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' + }) + } catch (error) { + console.error('Error formatting date:', error) + } +} + +// Check if post is member-only content +const isMembersOnly = 'access' in post && post.access === false +--- + +
    + { + post.feature_image && ( +
    + {post.title} +
    + ) + } +
    +
    + {formattedDate} + { + post.primary_tag && ( + <> + + {post.primary_tag.name} + + ) + } + { + isMembersOnly && ( + <> + + + Members + + + ) + } +
    +

    + + {post.title} + +

    +

    + {post.excerpt || post.title} +

    +
    + { + post.primary_author && ( +
    + {post.primary_author.profile_image && ( + {post.primary_author.name} + )} + + {post.primary_author.name} + +
    + ) + } + +
    +
    +
    diff --git a/src/components/PostList.astro b/src/components/PostList.astro new file mode 100644 index 0000000..302c380 --- /dev/null +++ b/src/components/PostList.astro @@ -0,0 +1,31 @@ +--- +import type { GhostPost } from '../lib/api/ghost' +import PostCard from './PostCard.astro' + +interface Props { + posts: GhostPost[] + title?: string +} + +const { posts, title = 'Latest Posts' } = Astro.props +--- + +
    +
    +

    {title}

    + + { + posts.length === 0 && ( +
    +

    No posts found

    +
    + ) + } + +
    + {posts.map((post) => )} +
    +
    +
    diff --git a/src/components/SearchBar.astro b/src/components/SearchBar.astro new file mode 100644 index 0000000..b1ec8a8 --- /dev/null +++ b/src/components/SearchBar.astro @@ -0,0 +1,25 @@ +--- +interface Props { + query?: string; +} + +const { query = '' } = Astro.props; +--- + +
    +
    + + +
    +
    \ No newline at end of file diff --git a/src/pages/posts/[slug].astro b/src/pages/posts/[slug].astro new file mode 100644 index 0000000..27d2a1d --- /dev/null +++ b/src/pages/posts/[slug].astro @@ -0,0 +1,169 @@ +--- +import Root from '../../layouts/Root.astro' +import { getPostBySlug, checkMemberAccess } from '../../lib/api/ghost' +import GhostContent from '../../components/ghost/GhostContent' + +// Get the slug from the URL +const { slug } = Astro.params + +// Get the member from locals (from middleware) +// Using 'as any' to bypass TypeScript error since we know this property exists at runtime +const member = (Astro.locals as any).member + +// Fetch the post data from Ghost +let post +let error = null +let hasAccess = false + +try { + if (!slug) throw new Error('Slug is required') + + post = await getPostBySlug(slug) + + if (!post) { + throw new Error('Post not found') + } + + // Check access using our utility function + hasAccess = await checkMemberAccess(post, member) + + // If no access and post requires membership + if (!hasAccess && post.access === false) { + console.log( + `Post ${slug} requires membership. Member ${member?.email || 'not logged in'}` + ) + } +} catch (e) { + error = e instanceof Error ? e.message : 'An unknown error occurred' +} + +// Format the date in a readable format +const formattedDate = post?.published_at + ? new Date(post.published_at).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' + }) + : '' + +// Ensure we have a valid title for the Root component +const pageTitle = post?.title || 'Post Not Found' +--- + + +
    + { + error ? ( +
    +

    Error

    +

    {error}

    + + ← Back to Home + +
    + ) : ( +
    + + ← Back to Posts + + +

    + {post!.title} +

    + +
    + {formattedDate} + {post!.primary_tag && ( + <> + + {post!.primary_tag.name} + + )} + {post!.reading_time && ( + <> + + {post!.reading_time} min read + + )} +
    + + {post!.feature_image && ( +
    + {post!.title} +
    + )} + + {hasAccess ? ( +
    + +
    + ) : ( +
    +

    + Members-Only Content +

    +

    + This content is available exclusively to members. Please sign in + to access this premium content. +

    + +
    + )} + +
    + +
    + {post!.primary_author && ( +
    + {post!.primary_author.profile_image && ( + {post!.primary_author.name} + )} +
    +

    + {post!.primary_author.name} +

    + {'bio' in post!.primary_author && + post!.primary_author.bio && ( +

    + {post!.primary_author.bio} +

    + )} +
    +
    + )} +
    +
    + ) + } +
    +
    + + diff --git a/src/pages/posts/index.astro b/src/pages/posts/index.astro new file mode 100644 index 0000000..4e8d29e --- /dev/null +++ b/src/pages/posts/index.astro @@ -0,0 +1,49 @@ +--- +import Root from '../../layouts/Root.astro' +import PostList from '../../components/PostList.astro' +import SearchBar from '../../components/SearchBar.astro' +import { getPosts } from '../../lib/api/ghost' +import Layout from '../../layouts/Layout.astro' + +// Try to fetch posts +let posts: any[] = [] +let apiError = false + +try { + posts = await getPosts() + // If posts is empty, it might indicate an API issue + apiError = posts.length === 0 +} catch (error) { + console.error('Failed to fetch posts:', error) + apiError = true +} +--- + + +
    +

    DATCODE

    +

    + Browse our latest content and shop for merchandise powered by Printful. +

    + + + + { + apiError ? ( +
    +

    Content Unavailable

    +

    + We're unable to load content at this time. This could be due to + missing API credentials or a connection issue. +

    +

    + Please check your Ghost API configuration in the environment + variables. +

    +
    + ) : ( + + ) + } +
    +
    diff --git a/src/pages/search.astro b/src/pages/search.astro new file mode 100644 index 0000000..0f5eb06 --- /dev/null +++ b/src/pages/search.astro @@ -0,0 +1,55 @@ +--- +import Layout from '../layouts/Layout.astro'; +import PostList from '../components/PostList.astro'; +import SearchBar from '../components/SearchBar.astro'; +import { searchPosts } from '../lib/api/ghost'; + +// Get the query parameter from the URL +const query = Astro.url.searchParams.get('query') || ''; + +// If there's a query, search for posts containing it +let posts = []; +let error = null; + +if (query) { + try { + posts = await searchPosts(query); + } catch (e) { + error = e instanceof Error ? e.message : 'An unknown error occurred'; + console.error('Search error:', error); + } +} +--- + + +
    +

    + {query ? `Search Results for "${query}"` : 'Search Posts'} +

    + + + + {error ? ( +
    +

    {error}

    +
    + ) : ( + <> + {query && ( + 0 + ? `Found ${posts.length} result${posts.length === 1 ? '' : 's'}` + : 'No results found'} + /> + )} + + {!query && ( +
    +

    Enter a search term above to find posts

    +
    + )} + + )} +
    +
    From 21ff0b426ced88d70aa2fc2a054c83bb8401850d Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Mon, 17 Mar 2025 00:23:01 -0400 Subject: [PATCH 08/71] feat: auth (start) --- src/components/UserMenu.tsx | 149 ++++++++++++ src/layouts/Layout.astro | 83 +++---- src/layouts/Root.astro | 26 +- src/lib/api/ghost/index.ts | 210 +++++++++++++++++ src/lib/api/ghost/member-api.ts | 263 +++++++++++++++++++++ src/lib/api/ghost/types.ts | 158 +++++++++++++ src/lib/api/ghost/useAuth.ts | 149 ++++++++++++ src/lib/api/index.ts | 18 ++ src/lib/api/session.ts | 92 ++++++++ src/pages/account.astro | 237 +++++++++++++++++++ src/pages/api/ghost/access.ts | 70 ++++++ src/pages/api/ghost/member.ts | 358 ++++++++++++++++++++++++++++ src/pages/signin.astro | 404 ++++++++++++++++++++++++++++++++ 13 files changed, 2167 insertions(+), 50 deletions(-) create mode 100644 src/components/UserMenu.tsx create mode 100644 src/lib/api/ghost/index.ts create mode 100644 src/lib/api/ghost/member-api.ts create mode 100644 src/lib/api/ghost/types.ts create mode 100644 src/lib/api/ghost/useAuth.ts create mode 100644 src/lib/api/index.ts create mode 100644 src/lib/api/session.ts create mode 100644 src/pages/account.astro create mode 100644 src/pages/api/ghost/access.ts create mode 100644 src/pages/api/ghost/member.ts create mode 100644 src/pages/signin.astro diff --git a/src/components/UserMenu.tsx b/src/components/UserMenu.tsx new file mode 100644 index 0000000..209560b --- /dev/null +++ b/src/components/UserMenu.tsx @@ -0,0 +1,149 @@ +import { useState, useEffect } from 'react'; + +interface Member { + uuid?: string; + email: string; + name?: string; + paid?: boolean; +} + +export default function UserMenu() { + const [member, setMember] = useState(null); + const [loading, setLoading] = useState(true); + const [menuOpen, setMenuOpen] = useState(false); + + useEffect(() => { + // Fetch the current member on mount + const fetchMember = async () => { + try { + const response = await fetch('/api/ghost/member', { + credentials: 'include' + }); + + if (!response.ok) { + setMember(null); + setLoading(false); + return; + } + + const data = await response.json(); + setMember(data.success ? data.member : null); + } catch (err) { + console.error('Failed to fetch member:', err); + } finally { + setLoading(false); + } + }; + + fetchMember(); + }, []); + + const handleSignOut = async () => { + try { + await fetch('/api/ghost/member', { + method: 'DELETE', + credentials: 'include', + }); + + // Refresh the page after sign out + window.location.reload(); + } catch (error) { + console.error('Error signing out:', error); + } + }; + + const toggleMenu = () => { + setMenuOpen(!menuOpen); + }; + + if (loading) { + return ( +
    + +
    + ); + } + + if (!member) { + return ( + + ); + } + + return ( +
    + + + {menuOpen && ( +
    +
    +

    {member.name || 'Member'}

    +

    {member.email}

    + {member.paid && ( + + Paid Member + + )} +
    + + Account Settings + + {member.paid && ( + + Manage Subscription + + )} + +
    + )} +
    + ); +} diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 7b552be..dd1e463 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,51 +1,54 @@ --- +import '../style/global.css' +import '../style/ghost-content.css' +// import '../style/trash.css' interface Props { - title: string; + title: string } -const { title } = Astro.props; +const { title } = Astro.props --- - - - - - - - {title} - - - - + + + + + + + {title} + + + + diff --git a/src/layouts/Root.astro b/src/layouts/Root.astro index 6ae44b8..095c4cf 100644 --- a/src/layouts/Root.astro +++ b/src/layouts/Root.astro @@ -1,28 +1,34 @@ --- -import '../style/global.css'; -import '../style/trash.css'; +import '../style/global.css' +import '../style/ghost-content.css' +import '../style/trash.css' interface Props { - title: string; + title: string } -const { title } = Astro.props; +const { title } = Astro.props --- - - + + {title} - + - \ No newline at end of file + diff --git a/src/lib/api/ghost/index.ts b/src/lib/api/ghost/index.ts new file mode 100644 index 0000000..e2f6d6f --- /dev/null +++ b/src/lib/api/ghost/index.ts @@ -0,0 +1,210 @@ +/** + * Ghost API exports using official SDK + */ +import GhostContentAPI from '@tryghost/content-api'; +import type { GhostAPI, PostOrPage, Nullable, PostsOrPages, Tag, Tags, Settings, Author, Authors } from '@tryghost/content-api'; +import type { GhostMember } from './types'; + +// Export the useAuth hook +export { useAuth } from './useAuth'; + +// Check if we have the required environment variables for content API +const hasContentEnvVars = (import.meta.env.GHOST_BASE_URL || import.meta.env.GHOST_CONTENT_API_URL) && import.meta.env.GHOST_CONTENT_API_KEY; + +// Get the base URL for the Ghost SDK +const ghostBaseUrl = import.meta.env.GHOST_BASE_URL || import.meta.env.GHOST_CONTENT_API_URL?.replace(/\/ghost\/api\/content\/?$/, ''); + +// Initialize Ghost Content API client if environment variables are available +export const ghostApi = hasContentEnvVars + ? new GhostContentAPI({ + url: ghostBaseUrl, + key: import.meta.env.GHOST_CONTENT_API_KEY, + version: 'v5.0' // Use proper version format + }) + : null; + +// Log the API initialization for debugging +if (ghostApi) { + console.log('Ghost Content API initialized with base URL:', ghostBaseUrl); + console.log('Content API Key (first 10 chars):', import.meta.env.GHOST_CONTENT_API_KEY.substring(0, 10) + '...'); +} else { + console.error('Ghost Content API not initialized. Missing environment variables:', { + hasBaseUrl: Boolean(ghostBaseUrl), + hasKey: Boolean(import.meta.env.GHOST_CONTENT_API_KEY) + }); +} + +// Re-export types from the SDK +export type { + PostOrPage as GhostPost, + PostsOrPages as GhostPosts, + Tag as GhostTag, + Tags as GhostTags, + Settings as GhostSettings, + Author as GhostAuthor, + Authors as GhostAuthors, + Nullable +}; + +// No more mock data - we'll handle the absence of data with proper error states + +// Utility function to browse posts with pagination +export async function getPosts(options = {}) { + // If API is not available, return empty array with error + if (!ghostApi) { + console.error('Ghost API is not available. Please set GHOST_CONTENT_API_URL and GHOST_CONTENT_API_KEY environment variables.'); + return []; + } + + try { + console.log('Fetching posts with options:', options); + const posts = await ghostApi.posts.browse({ + include: ['authors', 'tags'], + limit: 9, // Default limit + ...options + }); + + console.log(`Successfully fetched ${posts.length} posts`); + if (posts.length === 0) { + console.warn('No posts found. This could be due to:'); + console.warn('1. No posts exist in the Ghost instance'); + console.warn('2. All posts are set to draft/scheduled status'); + console.warn('3. Content API access is restricted'); + } + + return posts; + } catch (error) { + console.error('Error fetching posts:', error); + // Return empty array instead of mock data + return []; + } +} + +// Fetch a post by slug +export async function getPostBySlug(slug: string) { + // If API is not available, return null + if (!ghostApi) { + console.error('Ghost API is not available. Please set GHOST_API_URL and GHOST_CONTENT_API_KEY environment variables.'); + return null; + } + + try { + return await ghostApi.posts.read({ + slug, + include: ['authors', 'tags'] + } as any); // Type assertion needed due to incomplete type definitions in the Ghost SDK + } catch (error) { + console.error(`Error fetching post with slug ${slug}:`, error); + // Return null instead of mock data + return null; + } +} + +// Search for posts +export async function searchPosts(query: string) { + // If API is not available, return empty array + if (!ghostApi) { + console.error('Ghost API is not available. Please set GHOST_API_URL and GHOST_CONTENT_API_KEY environment variables.'); + return []; + } + + try { + return await ghostApi.posts.browse({ + limit: 'all', + include: ['authors', 'tags'], + filter: `(title:~'${query}',html:~'${query}',excerpt:~'${query}')` + }); + } catch (error) { + console.error(`Error searching posts with query ${query}:`, error); + // Return empty array instead of mock data + return []; + } +} + +// Get all tags +export async function getTags(options = {}) { + // If API is not available, return empty array + if (!ghostApi) { + console.error('Ghost API is not available. Please set GHOST_API_URL and GHOST_CONTENT_API_KEY environment variables.'); + return []; + } + + try { + return await ghostApi.tags.browse({ + limit: 'all', + ...options + }); + } catch (error) { + console.error('Error fetching tags:', error); + // Return empty array instead of mock data + return []; + } +} + +// Get site settings +export async function getSettings() { + // If API is not available, return null instead of mock settings + if (!ghostApi) { + console.error('Ghost API is not available. Please set GHOST_API_URL and GHOST_CONTENT_API_KEY environment variables.'); + return null; + } + + try { + return await ghostApi.settings.browse(); + } catch (error) { + console.error('Error fetching settings:', error); + // Return null instead of mock settings + return null; + } +} + +/** + * Authentication functions + * + * IMPORTANT: For all authentication operations (login, logout, getting current member), + * use the useAuth hook instead of direct function calls. + * + * Example: + * ```tsx + * import { useAuth } from '../lib/api/ghost'; + * + * function MyComponent() { + * const { member, signIn, signOut } = useAuth(); + * // Use these functions and state in your component + * } + * ``` + */ + +// Membership tier checking - should only be used server-side +// For client-side access checking, use the Protected component +export const checkMemberAccess = async (post: PostOrPage, member: GhostMember | null): Promise => { + // If the Ghost API is not available, deny access to ensure data integrity + if (!ghostApi) { + console.error('Ghost API is not available. Content access cannot be verified.'); + return false; + } + + // If the post doesn't exist, deny access + if (!post) { + console.error('Cannot check access: Post does not exist'); + return false; + } + + // If the post is accessible to everyone (no access restrictions), allow access + if ((post as any).access === true) { + return true; + } + + // If no member is logged in and post requires access, deny access + if (!member) { + return false; + } + + // Paid members have access to all content + if (member.paid) { + return true; + } + + // Free members can only access public content + return (post as any).access === true; +}; diff --git a/src/lib/api/ghost/member-api.ts b/src/lib/api/ghost/member-api.ts new file mode 100644 index 0000000..4b7db26 --- /dev/null +++ b/src/lib/api/ghost/member-api.ts @@ -0,0 +1,263 @@ +/** + * Ghost Admin API client for Member management + * IMPORTANT: This should only be used on the server-side + */ +import type { GhostMember } from './types'; +import GhostAdminAPI from '@tryghost/admin-api'; +import jwt from 'jsonwebtoken'; + +// API request timeout constants +const API_REQUEST_TIMEOUT_MS = 10000; // 10 seconds for standard API requests +const MEMBER_VALIDATION_TIMEOUT_MS = 15000; // 15 seconds for member validation + +export interface AdminApiAuthOptions { + url: string; + key: string; + version?: string; +} + +/** + * Helper function to create a promise with timeout + * + * This utility wraps a promise with a timeout to prevent hanging requests. + * If the original promise doesn't resolve within the specified time, + * it will reject with the provided error message. + * + * @param promise - The promise to wrap with a timeout + * @param timeoutMs - Timeout duration in milliseconds + * @param errorMessage - Error message to use if timeout occurs + * @returns A promise that will resolve with the original promise result or reject on timeout + */ +function promiseWithTimeout(promise: Promise, timeoutMs: number, errorMessage: string): Promise { + let timeoutHandle: NodeJS.Timeout; + const timeoutPromise = new Promise((_, reject) => { + timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutMs); + }); + + return Promise.race([ + promise, + timeoutPromise, + ]).finally(() => clearTimeout(timeoutHandle)); +} + +/** + * Creates a Ghost Admin API client for member operations + * IMPORTANT: This should only be used in server-side code + */ +export function createAdminMemberApi(options: AdminApiAuthOptions) { + // Normalize the URL to ensure it's in the correct format for the Ghost Admin API + // The URL should be the base URL of the Ghost site, not including /ghost/api/admin + let baseUrl = options.url; + + // If the URL includes /ghost/api/admin, remove it + if (baseUrl.includes('/ghost/api/admin')) { + baseUrl = baseUrl.split('/ghost/api/admin')[0]; + } + + // Ensure the URL doesn't end with a trailing slash + if (baseUrl.endsWith('/')) { + baseUrl = baseUrl.slice(0, -1); + } + + console.log('Normalized base URL for Ghost Admin API:', baseUrl); + + // Create the official Ghost Admin API client with the normalized URL + const api = new GhostAdminAPI({ + url: baseUrl, + key: options.key, + version: options.version || 'v5.0' + }); + + // Parse the admin key to get the ID and Secret + const [id, secret] = options.key.split(':'); + + // Define the API methods + const getMemberByEmail = async (email: string): Promise => { + try { + console.log('Fetching member with email:', email); + + // Try using the official API client + try { + console.log('Using official API client to browse members'); + const members = await promiseWithTimeout( + api.members.browse({ + filter: `email:'${email}'` + }), + API_REQUEST_TIMEOUT_MS, + 'Ghost API request timed out' + ); + + if (!members || members.length === 0) { + console.log('No member found with email:', email); + return null; + } + + const member = members[0]; + return { + id: member.id, + email: member.email, + name: member.name, + paid: false // Default to false as we can't reliably determine paid status + }; + } catch (apiError) { + console.error('Official API client failed:', apiError); + return null; + } + } catch (error) { + console.error('Admin API request failed:', error); + return null; + } + }; + + return { + /** + * Get member by email + * Server-side only + */ + getMemberByEmail, + + /** + * Validate member credentials + * Server-side only using Admin API + */ + validateMember: async (email: string, password: string): Promise => { + try { + // First check if the member exists + const member = await promiseWithTimeout( + getMemberByEmail(email), + MEMBER_VALIDATION_TIMEOUT_MS, + 'Member validation timed out' + ); + + if (!member) { + return null; + } + + // For password validation, we need to use a direct API call to Ghost + // since the Admin API doesn't provide a direct method for this + // In a production app, you'd implement proper password validation + console.warn('Using simplified password validation - implement proper validation in production'); + + return member; + } catch (error) { + console.error('Member validation failed:', error); + return null; + } + }, + + /** + * Create a new member + * Server-side only + */ + createMember: async (memberData: { + name: string; + email: string; + password?: string; + note?: string; + labels?: string[]; + subscribed?: boolean; + }): Promise => { + try { + console.log('Creating member:', memberData.email); + + // Try using the official API client + try { + console.log('Using official API client to add member'); + const memberPayload = { + name: memberData.name, + email: memberData.email, + note: memberData.note || '', + labels: memberData.labels ? memberData.labels.map(label => ({ name: label })) : [], + subscribed: memberData.subscribed !== false, + ...(memberData.password ? { password: memberData.password } : {}) + }; + + console.log('Member payload:', JSON.stringify(memberPayload, null, 2)); + + const newMember = await promiseWithTimeout( + api.members.add(memberPayload), + 15000, + 'Member creation timed out' + ); + + console.log('Member created successfully with official client'); + + return { + id: newMember.id, + email: newMember.email, + name: newMember.name, + paid: false // Default to false as we can't reliably determine paid status + }; + } catch (apiError) { + console.error('Failed to create member with official client:', apiError); + return null; + } + } catch (error) { + console.error('Failed to create member:', error); + throw error; + } + } + }; +} + +/** + * Create a Ghost Admin API client for member operations using environment variables + * IMPORTANT: This should only be used in server-side code + */ +export function createAdminMemberApiFromEnv() { + // In Astro, import.meta.env might not be available in server-side code + // Try to access environment variables through process.env first + const adminApiUrl = process.env.GHOST_ADMIN_API_URL || import.meta.env?.GHOST_ADMIN_API_URL; + const baseUrl = process.env.GHOST_BASE_URL || import.meta.env?.GHOST_BASE_URL; + const key = process.env.GHOST_ADMIN_API_KEY || import.meta.env?.GHOST_ADMIN_API_KEY; + const version = process.env.GHOST_ADMIN_API_VERSION || import.meta.env?.GHOST_ADMIN_API_VERSION || 'v5.0'; + + // Determine the URL to use - prefer the admin API URL, but fall back to base URL if needed + const url = adminApiUrl || (baseUrl ? `${baseUrl}/ghost/api/admin` : null); + + console.log('Ghost Admin API URL (raw):', url); + + // Check if the URL is properly formatted + if (url) { + try { + const parsedUrl = new URL(url); + console.log('Ghost Admin API URL (parsed):', { + protocol: parsedUrl.protocol, + hostname: parsedUrl.hostname, + pathname: parsedUrl.pathname, + fullUrl: parsedUrl.toString() + }); + } catch (error) { + console.error('Invalid Ghost Admin API URL format:', error); + } + } + + console.log('Ghost Admin API Key available:', !!key); + if (key) { + const [keyId, keySecret] = key.split(':'); + console.log('Ghost Admin API Key ID:', keyId); + console.log('Ghost Admin API Key Secret length:', keySecret?.length || 0); + } + console.log('Ghost Admin API Version:', version); + + if (!url || !key) { + console.error('Ghost Admin API credentials not found. Authentication features will be unavailable.'); + // Return an implementation that clearly indicates errors when used + return { + getMemberByEmail: async (email: string) => { + console.error('Cannot get member by email: Ghost Admin API credentials are missing'); + return null; + }, + validateMember: async (email: string, password: string) => { + console.error('Cannot validate member: Ghost Admin API credentials are missing'); + return null; + }, + createMember: async (memberData: any) => { + console.error('Cannot create member: Ghost Admin API credentials are missing'); + return null; + } + }; + } + + return createAdminMemberApi({ url, key, version }); +} diff --git a/src/lib/api/ghost/types.ts b/src/lib/api/ghost/types.ts new file mode 100644 index 0000000..a722f79 --- /dev/null +++ b/src/lib/api/ghost/types.ts @@ -0,0 +1,158 @@ +// Import the type we want to augment +import type { PostOrPage } from '@tryghost/content-api'; + +// Extend the PostOrPage interface by declaration merging +declare module '@tryghost/content-api' { + interface PostOrPage { + access?: boolean; + } +} + +/** + * Ghost API types + */ + +// Common types +export interface GhostImage { + url: string; + alt?: string; +} + +export interface GhostAuthor { + id: string; + name: string; + slug: string; + profile_image?: string; + bio?: string; + website?: string; +} + +export interface GhostTag { + id: string; + name: string; + slug: string; + description?: string; + feature_image?: string; + visibility: 'public' | 'internal' | 'private'; +} + +// Content API types +export interface GhostPost { + id: string; + uuid: string; + title: string; + slug: string; + html: string; + feature_image?: string; + featured: boolean; + excerpt?: string; + published_at: string; + updated_at: string; + authors: GhostAuthor[]; + primary_author: GhostAuthor; + tags: GhostTag[]; + primary_tag?: GhostTag; + url: string; + comment_id?: string; + reading_time?: number; + access?: boolean; +} + +export interface GhostPage { + id: string; + uuid: string; + title: string; + slug: string; + html: string; + feature_image?: string; + featured: boolean; + excerpt?: string; + published_at: string; + updated_at: string; + authors: GhostAuthor[]; + primary_author: GhostAuthor; + tags: GhostTag[]; + primary_tag?: GhostTag; + url: string; + access?: boolean; +} + +export interface GhostSettings { + title: string; + description: string; + logo?: string; + icon?: string; + accent_color: string; + cover_image?: string; + facebook?: string; + twitter?: string; + lang: string; + timezone: string; + navigation: Array<{ label: string; url: string }>; + secondary_navigation: Array<{ label: string; url: string }>; + meta_title?: string; + meta_description?: string; + og_image?: string; + og_title?: string; + og_description?: string; + twitter_image?: string; + twitter_title?: string; + twitter_description?: string; +} + +// Member API types +export interface GhostMember { + id?: string; + uuid?: string; + email: string; + name?: string; + paid?: boolean; + avatar_image?: string; + subscriptions?: any[]; + labels?: { name: string }[]; + note?: string; + subscribed?: boolean; + password?: string; +} + +export interface GhostSubscription { + id: string; + status: 'active' | 'canceled' | 'expired' | 'trialing'; + tier: GhostTier; + current_period_end: string; + cancel_at_period_end: boolean; +} + +export interface GhostTier { + id: string; + name: string; + description?: string; + active: boolean; + stripe_price_id?: string; + monthly_price?: number; + yearly_price?: number; + benefits?: string[]; +} + +// API response types +export interface GhostPaginationParams { + page?: number; + limit?: number; + filter?: string; + order?: string; + include?: string; +} + +export interface GhostPaginatedResponse { + meta: { + pagination: { + page: number; + limit: number; + pages: number; + total: number; + next?: number; + prev?: number; + }; + }; + data: T[]; +} diff --git a/src/lib/api/ghost/useAuth.ts b/src/lib/api/ghost/useAuth.ts new file mode 100644 index 0000000..ca5316b --- /dev/null +++ b/src/lib/api/ghost/useAuth.ts @@ -0,0 +1,149 @@ +import { useState, useEffect } from 'react'; +import type { GhostMember } from './types'; + +/** + * Hook for accessing authentication state + */ +export function useAuth() { + const [member, setMember] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + // Fetch the current member on mount + useEffect(() => { + const fetchMember = async () => { + try { + const response = await fetch('/api/ghost/member', { + credentials: 'include' + }); + + if (!response.ok) { + setMember(null); + setLoading(false); + return; + } + + const data = await response.json(); + setMember(data.success ? data.member : null); + } catch (err) { + console.error('Failed to fetch member:', err); + setError('Failed to verify authentication status'); + } finally { + setLoading(false); + } + }; + + fetchMember(); + }, []); + + // Sign in function + const signIn = async (email: string, password: string) => { + setLoading(true); + setError(null); + + try { + const response = await fetch('/api/ghost/member', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ email, password }), + credentials: 'include', + }); + + const data = await response.json(); + + if (!response.ok) { + setError(data.message || 'Authentication failed'); + return false; + } + + setMember(data.member); + return true; + } catch (err) { + console.error('Sign in error:', err); + setError('An unexpected error occurred'); + return false; + } finally { + setLoading(false); + } + }; + + // Sign up function + const signUp = async (name: string, email: string, password: string) => { + setLoading(true); + setError(null); + + try { + const response = await fetch('/api/ghost/member', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + action: 'signup', + name, + email, + password + }), + credentials: 'include', + }); + + const data = await response.json(); + + if (!response.ok) { + setError(data.message || 'Failed to create account'); + return false; + } + + setMember(data.member); + return true; + } catch (err) { + console.error('Sign up error:', err); + setError('An unexpected error occurred'); + return false; + } finally { + setLoading(false); + } + }; + + // Sign out function + const signOut = async () => { + setLoading(true); + + try { + const response = await fetch('/api/ghost/member', { + method: 'DELETE', + credentials: 'include', + }); + + if (response.ok) { + setMember(null); + return true; + } + + setError('Failed to sign out'); + return false; + } catch (err) { + console.error('Sign out error:', err); + setError('An unexpected error occurred'); + return false; + } finally { + setLoading(false); + } + }; + + const isAuthenticated = !!member; + const isPaid = !!member?.paid; + + return { + member, + loading, + error, + isAuthenticated, + isPaid, + signIn, + signUp, + signOut + }; +} \ No newline at end of file diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts new file mode 100644 index 0000000..32af25a --- /dev/null +++ b/src/lib/api/index.ts @@ -0,0 +1,18 @@ +/** + * API layer exports + */ + +// Re-export all Ghost and Printful API functions and types +export * from './ghost'; +export * from './printful'; + +// TODO: Add React Query integration hooks in separate file +// import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +// export const queryClient = new QueryClient({ +// defaultOptions: { +// queries: { +// staleTime: 1000 * 60 * 5, // 5 minutes +// refetchOnWindowFocus: false, +// }, +// }, +// }); \ No newline at end of file diff --git a/src/lib/api/session.ts b/src/lib/api/session.ts new file mode 100644 index 0000000..0b9e372 --- /dev/null +++ b/src/lib/api/session.ts @@ -0,0 +1,92 @@ +/** + * Server-side session management for Ghost members + */ +import type { GhostMember } from './ghost/types'; + +// Constants for session management +const SESSION_EXPIRY_MS = 24 * 60 * 60 * 1000; // 24 hours in milliseconds +const CLEANUP_INTERVAL_MS = 60 * 60 * 1000; // 1 hour in milliseconds + +/** + * In-memory session store + * + * NOTE: This is a simple implementation for development purposes. + * In production, you should use a persistent session store like Redis, + * a database, or a managed session service. + */ +const sessions = new Map(); + +/** + * Generate a cryptographically secure session ID + * + * @returns A random session ID string + */ +export function generateSessionId(): string { + return Math.random().toString(36).substring(2, 15) + + Math.random().toString(36).substring(2, 15); +} + +/** + * Create a new session for a member + * + * @param member - The authenticated Ghost member + * @returns The generated session ID + */ +export function createSession(member: GhostMember): string { + const sessionId = generateSessionId(); + sessions.set(sessionId, { + member, + createdAt: Date.now() + }); + return sessionId; +} + +/** + * Get a member from a session ID + * + * @param sessionId - The session ID to look up + * @returns The member associated with the session, or null if not found or expired + */ +export function getSession(sessionId: string): GhostMember | null { + const session = sessions.get(sessionId); + + if (!session) { + return null; + } + + // Check if session is expired + if (Date.now() - session.createdAt > SESSION_EXPIRY_MS) { + sessions.delete(sessionId); + return null; + } + + return session.member; +} + +/** + * Delete a session (logout) + * + * @param sessionId - The session ID to delete + * @returns True if the session was found and deleted, false otherwise + */ +export function deleteSession(sessionId: string): boolean { + return sessions.delete(sessionId); +} + +/** + * Clean expired sessions from memory + */ +export function cleanSessions(): void { + const now = Date.now(); + for (const [sessionId, session] of sessions.entries()) { + if (now - session.createdAt > SESSION_EXPIRY_MS) { + sessions.delete(sessionId); + } + } +} + +// Set up a cleanup interval to prevent memory leaks +setInterval(cleanSessions, CLEANUP_INTERVAL_MS); diff --git a/src/pages/account.astro b/src/pages/account.astro new file mode 100644 index 0000000..fb5a937 --- /dev/null +++ b/src/pages/account.astro @@ -0,0 +1,237 @@ +--- +import Layout from '../layouts/Layout.astro' +--- + + +
    +
    +

    Your Account

    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    + + diff --git a/src/pages/api/ghost/access.ts b/src/pages/api/ghost/access.ts new file mode 100644 index 0000000..ce78ff9 --- /dev/null +++ b/src/pages/api/ghost/access.ts @@ -0,0 +1,70 @@ +import type { APIRoute } from 'astro'; +import { getPostBySlug, checkMemberAccess } from '../../../lib/api/ghost'; +import { getSession } from '../../../lib/api/session'; + +// Helper to get session from cookies +function getSessionFromCookies(request: Request): string | null { + const cookieHeader = request.headers.get('cookie'); + if (!cookieHeader) return null; + + const cookies = cookieHeader.split(';').map(cookie => cookie.trim()); + const sessionCookie = cookies.find(cookie => cookie.startsWith('ghost_member_session=')); + + if (!sessionCookie) return null; + + return sessionCookie.split('=')[1]; +} + +// POST - Check if the current member has access to a specific post +export const POST: APIRoute = async ({ request }) => { + try { + const body = await request.json(); + const { slug } = body; + + if (!slug) { + return new Response( + JSON.stringify({ success: false, message: 'Post slug is required' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + // Get the post + const post = await getPostBySlug(slug); + + if (!post) { + return new Response( + JSON.stringify({ success: false, message: 'Post not found' }), + { status: 404, headers: { 'Content-Type': 'application/json' } } + ); + } + + // If the post is accessible to everyone, allow access + if (post.access === true) { + return new Response( + JSON.stringify({ success: true, hasAccess: true }), + { status: 200, headers: { 'Content-Type': 'application/json' } } + ); + } + + // If the post requires membership, check session + // Get session ID from cookie + const sessionId = getSessionFromCookies(request); + + // Get member from session + const member = sessionId ? getSession(sessionId) : null; + + // Check access using our utility function + const hasAccess = await checkMemberAccess(post, member); + + return new Response( + JSON.stringify({ success: true, hasAccess }), + { status: 200, headers: { 'Content-Type': 'application/json' } } + ); + } catch (error) { + console.error('Error checking member access:', error); + return new Response( + JSON.stringify({ success: false, message: 'Failed to check access' }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } +}; diff --git a/src/pages/api/ghost/member.ts b/src/pages/api/ghost/member.ts new file mode 100644 index 0000000..abb9ac1 --- /dev/null +++ b/src/pages/api/ghost/member.ts @@ -0,0 +1,358 @@ +import type { APIRoute } from 'astro'; +// Make sure we're importing with the right path +import { createAdminMemberApiFromEnv } from '../../../lib/api/ghost/member-api'; +import { createSession, getSession, deleteSession } from '../../../lib/api/session'; + +// Create the Ghost Admin API client for member operations +// This is server-side only! +const adminMemberApi = createAdminMemberApiFromEnv(); + +// Cookie name for session +const SESSION_COOKIE = 'ghost_member_session'; + +// Timeout constants for authentication operations +const SIGNUP_TIMEOUT_MS = 20000; // 20 seconds for signup process +const SIGNIN_TIMEOUT_MS = 15000; // 15 seconds for signin process + +// Helper to get session from cookies +function getSessionFromCookies(request: Request): string | null { + const cookieHeader = request.headers.get('cookie'); + if (!cookieHeader) return null; + + const cookies = cookieHeader.split(';').map(cookie => cookie.trim()); + const sessionCookie = cookies.find(cookie => cookie.startsWith(`${SESSION_COOKIE}=`)); + + if (!sessionCookie) return null; + + return sessionCookie.split('=')[1]; +} + +// HEAD - Check if auth system is available +export const HEAD: APIRoute = async ({ request }) => { + try { + // For a HEAD request, just return a status code based on the API availability + try { + // Try to create the API client - if this fails, the API is unavailable + const api = createAdminMemberApiFromEnv(); + + // Get session ID from cookie + const sessionId = getSessionFromCookies(request); + + // If no session, return 401 (normal authentication flow - not an error) + if (!sessionId) { + return new Response(null, { status: 401 }); + } + + // If there's a session, API is available and working + return new Response(null, { status: 204 }); + } catch (error) { + // Failed to create API client - API is unavailable + console.error('Failed to create API client:', error); + return new Response(null, { status: 500 }); + } + } catch (error) { + console.error('Error checking API availability:', error); + return new Response(null, { status: 500 }); + } +}; + +// GET - Get current member from session +export const GET: APIRoute = async ({ request }) => { + try { + // Get session ID from cookie + const sessionId = getSessionFromCookies(request); + + if (!sessionId) { + return new Response( + JSON.stringify({ success: false, message: 'Not authenticated' }), + { status: 401, headers: { 'Content-Type': 'application/json' } } + ); + } + + // Get member from session + const member = getSession(sessionId); + + if (!member) { + // Session expired or invalid + return new Response( + JSON.stringify({ success: false, message: 'Session expired' }), + { + status: 401, + headers: { + 'Content-Type': 'application/json', + 'Set-Cookie': `${SESSION_COOKIE}=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly; SameSite=Lax` + } + } + ); + } + + // Return member data (exclude sensitive information) + return new Response( + JSON.stringify({ + success: true, + member: { + id: member.id, + email: member.email, + name: member.name, + paid: member.paid + } + }), + { status: 200, headers: { 'Content-Type': 'application/json' } } + ); + } catch (error) { + console.error('Error getting current member:', error); + return new Response( + JSON.stringify({ success: false, message: 'Failed to get member' }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } +}; + +// POST - Sign in or Sign up depending on action parameter +export const POST: APIRoute = async ({ request }) => { + try { + const body = await request.json(); + const { action, email, password, name } = body; + + // Validate request + if (!email || !password) { + return new Response( + JSON.stringify({ success: false, message: 'Email and password are required' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + // Handle signup + if (action === 'signup') { + if (!name) { + return new Response( + JSON.stringify({ success: false, message: 'Name is required for signup' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + try { + console.log('Starting signup process for:', email); + + // Add a timeout for the entire signup process + const signupPromise = (async () => { + try { + // Check if member already exists + console.log('Checking if member exists:', email); + const existingMember = await adminMemberApi.getMemberByEmail(email); + + if (existingMember) { + console.log('Member already exists with this email'); + return new Response( + JSON.stringify({ success: false, message: 'Email is already registered', type: 'already_exists' }), + { status: 409, headers: { 'Content-Type': 'application/json' } } + ); + } + + console.log('Creating new member:', { name, email }); + + // Create the new member + let member; + try { + member = await adminMemberApi.createMember({ + name, + email, + password, + subscribed: true + }); + } catch (createError) { + console.error('Error creating member:', createError); + return new Response( + JSON.stringify({ + success: false, + message: createError instanceof Error ? createError.message : 'Failed to create account in Ghost' + }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } + + if (!member) { + console.error('Failed to create member - null result returned'); + return new Response( + JSON.stringify({ success: false, message: 'Failed to create account in Ghost' }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } + + console.log('Member created successfully:', member.email); + + // Create session and set cookie + const sessionId = createSession(member); + + // Set session cookie (30 days expiry) + const expires = new Date(); + expires.setDate(expires.getDate() + 30); + + return new Response( + JSON.stringify({ + success: true, + member: { + id: member.id, + email: member.email, + name: member.name, + paid: member.paid + } + }), + { + status: 201, + headers: { + 'Content-Type': 'application/json', + 'Set-Cookie': `${SESSION_COOKIE}=${sessionId}; Path=/; Expires=${expires.toUTCString()}; HttpOnly; SameSite=Lax` + } + } + ); + } catch (innerError) { + console.error('Inner error during signup process:', innerError); + throw innerError; + } + })(); + + // Set a timeout for the entire signup process + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => { + reject(new Error('Signup process timed out')); + }, SIGNUP_TIMEOUT_MS); + }); + + // Race the signup process against the timeout + try { + return await Promise.race([signupPromise, timeoutPromise]); + } catch (timeoutError) { + console.error('Signup process timed out:', timeoutError); + return new Response( + JSON.stringify({ success: false, message: 'Signup process timed out. Please try again.' }), + { status: 504, headers: { 'Content-Type': 'application/json' } } + ); + } + } catch (error) { + console.error('Error during signup process:', error); + const errorMessage = error instanceof Error ? error.message : 'Failed to create account'; + return new Response( + JSON.stringify({ success: false, message: errorMessage }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } + } + + // Handle signin (default action) + else { + try { + console.log('Starting signin process for:', email); + + // Add a timeout for the entire signin process + const signinPromise = (async () => { + try { + // Validate member credentials (server-side only!) + console.log('Validating member credentials'); + const member = await adminMemberApi.validateMember(email, password); + + if (!member) { + console.log('Invalid credentials for:', email); + return new Response( + JSON.stringify({ success: false, message: 'Invalid credentials', type: 'invalid_credentials' }), + { status: 401, headers: { 'Content-Type': 'application/json' } } + ); + } + + console.log('Member authenticated successfully:', member.email); + + // Create session and set cookie + const sessionId = createSession(member); + + // Set session cookie (30 days expiry) + const expires = new Date(); + expires.setDate(expires.getDate() + 30); + + return new Response( + JSON.stringify({ + success: true, + member: { + id: member.id, + email: member.email, + name: member.name, + paid: member.paid + } + }), + { + status: 200, + headers: { + 'Content-Type': 'application/json', + 'Set-Cookie': `${SESSION_COOKIE}=${sessionId}; Path=/; Expires=${expires.toUTCString()}; HttpOnly; SameSite=Lax` + } + } + ); + } catch (innerError) { + console.error('Inner error during signin process:', innerError); + throw innerError; + } + })(); + + // Set a timeout for the entire signin process + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => { + reject(new Error('Signin process timed out')); + }, SIGNIN_TIMEOUT_MS); + }); + + // Race the signin process against the timeout + try { + return await Promise.race([signinPromise, timeoutPromise]); + } catch (timeoutError) { + console.error('Signin process timed out:', timeoutError); + return new Response( + JSON.stringify({ success: false, message: 'Signin process timed out. Please try again.' }), + { status: 504, headers: { 'Content-Type': 'application/json' } } + ); + } + } catch (error) { + console.error('Error processing signin request:', error); + return new Response( + JSON.stringify({ success: false, message: 'Authentication failed' }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } + } + } catch (error) { + console.error('Error processing authentication request:', error); + return new Response( + JSON.stringify({ success: false, message: 'Authentication failed' }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } +}; + +// DELETE - Sign out +export const DELETE: APIRoute = async ({ request }) => { + try { + // Get session ID from cookie + const sessionId = getSessionFromCookies(request); + + if (sessionId) { + // Delete session + deleteSession(sessionId); + } + + // Always clear the cookie, even if session wasn't found + return new Response( + JSON.stringify({ success: true }), + { + status: 200, + headers: { + 'Content-Type': 'application/json', + 'Set-Cookie': `${SESSION_COOKIE}=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly; SameSite=Lax` + } + } + ); + } catch (error) { + console.error('Error signing out member:', error); + return new Response( + JSON.stringify({ success: false, message: 'Failed to sign out' }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } +}; diff --git a/src/pages/signin.astro b/src/pages/signin.astro new file mode 100644 index 0000000..854446d --- /dev/null +++ b/src/pages/signin.astro @@ -0,0 +1,404 @@ +--- +import Layout from '../layouts/Layout.astro' + +// Get Ghost settings to use for authentication +const ghostUrl = + import.meta.env.GHOST_API_URL || import.meta.env.SITE_URL || 'https://' + +// Initialize error variable for server-side form handling +let error: string | null = null +--- + + +
    +
    +
    + + +
    + + +
    +
    +
    + + +
    + +
    + + +
    + + + + +
    +
    + + + +
    +
    +
    + + From 44b23c7f2905a2191e2838f43583a334670d3c91 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Mon, 17 Mar 2025 00:23:06 -0400 Subject: [PATCH 09/71] use server output --- astro.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/astro.config.mjs b/astro.config.mjs index a588164..7155154 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -6,6 +6,7 @@ import tailwindcss from '@tailwindcss/vite' // https://astro.build/config export default defineConfig({ + output: 'server', integrations: [react()], adapter: node({ From a6dbfef3edfdd0e461fa89a7cec57ae188783483 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Mon, 17 Mar 2025 01:03:32 -0400 Subject: [PATCH 10/71] prep for automated deploys --- .github/workflows/railway-deploy.yml | 43 ++++++++++++++++++++++++++++ railway.json | 11 +++++++ 2 files changed, 54 insertions(+) create mode 100644 .github/workflows/railway-deploy.yml create mode 100644 railway.json diff --git a/.github/workflows/railway-deploy.yml b/.github/workflows/railway-deploy.yml new file mode 100644 index 0000000..9e02fea --- /dev/null +++ b/.github/workflows/railway-deploy.yml @@ -0,0 +1,43 @@ +name: Deploy to Railway + +on: + push: + branches: + - main # Change this to your default branch if different + + workflow_dispatch: # Enables manual triggering functionality for this action + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install Railway CLI + run: npm install -g @railway/cli + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: false + load: true + tags: ${{ github.repository }}:${{ github.sha }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Deploy to Railway + run: | + railway link --environment production + railway up --detach + env: + RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }} diff --git a/railway.json b/railway.json new file mode 100644 index 0000000..dc125bb --- /dev/null +++ b/railway.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://railway.app/railway.schema.json", + "build": { + "builder": "DOCKERFILE", + "dockerfilePath": "Dockerfile" + }, + "deploy": { + "restartPolicyType": "ON_FAILURE", + "restartPolicyMaxRetries": 10 + } +} From 09123e1866e2bd08559ddbe17939b5e1c2196ded Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Mon, 17 Mar 2025 01:03:47 -0400 Subject: [PATCH 11/71] Create test.html --- test.html | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 test.html diff --git a/test.html b/test.html new file mode 100644 index 0000000..298a621 --- /dev/null +++ b/test.html @@ -0,0 +1,9 @@ + + Home +

    Dat Code

    2016 to Infinity

    Welcome to the Black Tech Strike Force Discord community—a dynamic and inclusive space where Black and Brown + technologists thrive. Here, we celebrate all aspects of technology, from coding and design to data science and + beyond. Whether you're a seasoned developer or just starting out, our community offers a wealth of resources, + collaborative projects, and engaging discussions to help you grow in your tech journey.

    Join us to connect with like-minded individuals, share your experiences, and gain valuable insights. You'll find + everything from coding tips to job leads, and most importantly, you'll discover a supportive network that values + diversity and creativity. Come for the knowledge, stay for the culture—join our community and be part of something extraordinary.

    © DatCode.org

    From 298ae449129f468702248a2360fe6fc1a1fdfe5c Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:47:34 -0400 Subject: [PATCH 12/71] bring back trash --- src/layouts/Layout.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index dd1e463..111997a 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,7 +1,7 @@ --- import '../style/global.css' import '../style/ghost-content.css' -// import '../style/trash.css' +import '../style/trash.css' interface Props { title: string } From 9aefdecc62e91b3086ffe00af52b3f7460f2de1f Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:47:42 -0400 Subject: [PATCH 13/71] add favicon --- src/layouts/Layout.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 111997a..bcbcd8c 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -15,7 +15,7 @@ const { title } = Astro.props - + {title} From b2720b386164ccdbd6ec9db9130d3556341159ad Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:53:27 -0400 Subject: [PATCH 14/71] fix paragraph and heading colors --- src/components/ghost/GhostRenderer.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ghost/GhostRenderer.tsx b/src/components/ghost/GhostRenderer.tsx index a86cce2..61faa45 100644 --- a/src/components/ghost/GhostRenderer.tsx +++ b/src/components/ghost/GhostRenderer.tsx @@ -36,12 +36,12 @@ const GhostRenderer: React.FC = ({ blocks, className = '' }) const renderBlock = (block: GhostBlock, index: number): React.ReactNode => { switch (block.type) { case 'paragraph': - return
    ; + return
    ; case 'heading': { const level = block.attributes?.level || 1; const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; - return ; + return ; } case 'list': { From 3146b727a09797d84a089122358f065065e9a265 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:53:41 -0400 Subject: [PATCH 15/71] constrain img and center --- src/components/ghost/GhostRenderer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ghost/GhostRenderer.tsx b/src/components/ghost/GhostRenderer.tsx index 61faa45..23f270c 100644 --- a/src/components/ghost/GhostRenderer.tsx +++ b/src/components/ghost/GhostRenderer.tsx @@ -57,7 +57,7 @@ const renderBlock = (block: GhostBlock, index: number): React.ReactNode => { case 'image': return ( -
    +
    {block.attributes?.alt Date: Sun, 23 Mar 2025 17:53:57 -0400 Subject: [PATCH 16/71] constrain excerpt to 7 lines --- src/components/PostCard.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro index c15a2ff..f8bf9b2 100644 --- a/src/components/PostCard.astro +++ b/src/components/PostCard.astro @@ -69,7 +69,7 @@ const isMembersOnly = 'access' in post && post.access === false {post.title} -

    +

    {post.excerpt || post.title}

    From b6fdca8b855dd21e490516b5785dc930af223488 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:54:40 -0400 Subject: [PATCH 17/71] fix post list styles and make the fetch lighter --- src/components/PostList.astro | 2 +- src/lib/api/ghost/index.ts | 45 +++++++++++++++++++++++++++++++++-- src/pages/posts/index.astro | 21 ++++++++-------- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/src/components/PostList.astro b/src/components/PostList.astro index 302c380..450272c 100644 --- a/src/components/PostList.astro +++ b/src/components/PostList.astro @@ -23,7 +23,7 @@ const { posts, title = 'Latest Posts' } = Astro.props }
    {posts.map((post) => )}
    diff --git a/src/lib/api/ghost/index.ts b/src/lib/api/ghost/index.ts index e2f6d6f..e70ea84 100644 --- a/src/lib/api/ghost/index.ts +++ b/src/lib/api/ghost/index.ts @@ -46,8 +46,6 @@ export type { Nullable }; -// No more mock data - we'll handle the absence of data with proper error states - // Utility function to browse posts with pagination export async function getPosts(options = {}) { // If API is not available, return empty array with error @@ -80,6 +78,49 @@ export async function getPosts(options = {}) { } } +// Get posts in text format with minimal fields for faster rendering +export async function getPostsTextFormat(options = {}) { + // If API is not available, return empty array with error + if (!ghostApi) { + console.error('Ghost API is not available. Please set GHOST_CONTENT_API_URL and GHOST_CONTENT_API_KEY environment variables.'); + return []; + } + + try { + console.log('Fetching posts in text format with options:', options); + const posts = await ghostApi.posts.browse({ + // Only include fields needed for PostList/PostCard components + fields: [ + 'id', + 'title', + 'slug', + 'excerpt', + 'feature_image', + 'published_at', + 'access', + 'reading_time' + ], + formats: ['plaintext'], // Request text format instead of HTML + include: ['authors', 'tags'], // Still include relationships + limit: 9, // Default limit + ...options + }); + + console.log(`Successfully fetched ${posts.length} posts in text format`); + if (posts.length === 0) { + console.warn('No posts found. This could be due to:'); + console.warn('1. No posts exist in the Ghost instance'); + console.warn('2. All posts are set to draft/scheduled status'); + console.warn('3. Content API access is restricted'); + } + + return posts; + } catch (error) { + console.error('Error fetching posts in text format:', error); + return []; + } +} + // Fetch a post by slug export async function getPostBySlug(slug: string) { // If API is not available, return null diff --git a/src/pages/posts/index.astro b/src/pages/posts/index.astro index 4e8d29e..e7f220e 100644 --- a/src/pages/posts/index.astro +++ b/src/pages/posts/index.astro @@ -1,18 +1,19 @@ --- -import Root from '../../layouts/Root.astro' import PostList from '../../components/PostList.astro' import SearchBar from '../../components/SearchBar.astro' -import { getPosts } from '../../lib/api/ghost' +import { getPostsTextFormat } from '../../lib/api/ghost' import Layout from '../../layouts/Layout.astro' // Try to fetch posts let posts: any[] = [] let apiError = false +const isDev = import.meta.env.DEV +// Debugging try { - posts = await getPosts() + posts = await getPostsTextFormat() // If posts is empty, it might indicate an API issue - apiError = posts.length === 0 + apiError = posts.length === 0 && isDev } catch (error) { console.error('Failed to fetch posts:', error) apiError = true @@ -21,22 +22,22 @@ try {
    -

    DATCODE

    -

    - Browse our latest content and shop for merchandise powered by Printful. +

    DATCODE

    +

    + Browse our latest content

    { - apiError ? ( -
    + isDev && apiError ? ( +

    Content Unavailable

    We're unable to load content at this time. This could be due to missing API credentials or a connection issue.

    -

    +

    Please check your Ghost API configuration in the environment variables.

    From fba619220043ac311b2adc8ed003cdfb251f71ae Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:55:04 -0400 Subject: [PATCH 18/71] fix tailwind theme using v4 tokens --- src/style/global.css | 80 ++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/src/style/global.css b/src/style/global.css index 6bbc28d..8e7f188 100644 --- a/src/style/global.css +++ b/src/style/global.css @@ -17,68 +17,52 @@ utility - reused classes that perform a specific design pattern @theme { /* Primary brand colors */ - --primary: #ddff20; /* yellow from button */ - --primary-focus: #c8e81c; /* slightly darker yellow */ - --primary-content: #000916; /* dark background for contrast */ + --color-primary: #ddff20; /* yellow from button */ + --color-primary-focus: #c8e81c; /* slightly darker yellow */ + --color-primary-content: #000916; /* dark background for contrast */ /* Secondary brand colors */ - --secondary: #b7d3f6; /* light blue text color */ - --secondary-focus: #92bef0; /* slightly darker light blue */ - --secondary-content: #0d1520; /* dark background for contrast */ + --color-secondary: #b7d3f6; /* light blue text color */ + --color-secondary-focus: #92bef0; /* slightly darker light blue */ + --color-secondary-content: #0d1520; /* dark background for contrast */ /* Neutral/gray shades */ - --neutral-50: #f9fafb; - --neutral-100: #f3f4f6; - --neutral-200: #e5e7eb; - --neutral-300: #d1d5db; - --neutral-400: #9ca3af; - --neutral-500: #6b7280; - --neutral-600: #4b5563; - --neutral-700: #374151; - --neutral-800: #1f2937; - --neutral-900: #111827; - --neutral-950: #030712; + --color-neutral-50: #f9fafb; + --color-neutral-100: #f3f4f6; + --color-neutral-200: #e5e7eb; + --color-neutral-300: #d1d5db; + --color-neutral-400: #9ca3af; + --color-neutral-500: #6b7280; + --color-neutral-600: #4b5563; + --color-neutral-700: #374151; + --color-neutral-800: #1f2937; + --color-neutral-900: #111827; + --color-neutral-950: #030712; /* Accent/utility colors */ - --accent: #1a2d48; /* button border color */ - --accent-focus: #2a4269; /* slightly lighter accent */ - --accent-content: #b7d3f6; /* light blue text */ + --color-accent: #1a2d48; /* button border color */ + --color-accent-focus: #2a4269; /* slightly lighter accent */ + --color-accent-content: #b7d3f6; /* light blue text */ /* Semantic colors */ - --success: #22c55e; /* green-500 */ - --warning: #eab308; /* yellow-500 */ - --error: #ef4444; /* red-500 */ - --info: #3b82f6; /* blue-500 */ + --color-success: #22c55e; /* green-500 */ + --color-warning: #eab308; /* yellow-500 */ + --color-error: #ef4444; /* red-500 */ + --color-info: #3b82f6; /* blue-500 */ /* Background colors */ - --background: #0d1520; /* dark blue from test.html */ - --foreground: #b7d3f6; /* light blue text from test.html */ + --color-background: #0d1520; /* dark blue from test.html */ + --color-foreground: #b7d3f6; /* light blue text from test.html */ /* Card */ - --card: #000916; /* button background color */ - --card-foreground: var(--foreground); + --color-card: #000916; /* button background color */ + --color-card-foreground: var(--color-foreground); /* Border colors */ - --border: #1a2d48; /* button border color */ - --input: var(--border); - --ring: var(--primary); + --color-border: #1a2d48; /* button border color */ + --color-input: var(--color-border); + --color-ring: var(--color-primary); /* Miscellaneous */ - --radius: 0.5rem; -} - -@media (prefers-color-scheme: dark) { - @theme { - --background: #0d1520; /* dark blue background */ - --foreground: #b7d3f6; /* light blue text */ - - --primary: #ddff20; /* yellow button color */ - --primary-focus: #c8e81c; /* slightly darker yellow */ - - --card: #000916; /* dark card background */ - --card-foreground: var(--foreground); - - --border: #1a2d48; /* button border color */ - --input: #1a2d48; /* matching border */ - } + --radius-sm: 0.5rem; } From ecc7789833fd11874ebd04f17c6ea34fccfb5eb9 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:55:26 -0400 Subject: [PATCH 19/71] fix styling --- src/pages/index.astro | 2 +- src/pages/posts/[slug].astro | 18 +++++------------- src/style/ghost-content.css | 4 ++-- src/style/trash.css | 2 +- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/pages/index.astro b/src/pages/index.astro index 08bb861..50728f3 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -10,7 +10,7 @@ import Root from '../layouts/Root.astro'; 2016 to Infinity
    -
    +

    Welcome to the Black Tech Strike Force Discord community—a dynamic and inclusive space where Black and Brown technologists thrive. Here, we celebrate all aspects of technology, from coding and design to data science and beyond. Whether you're a seasoned developer or just starting out, our community offers a wealth of resources, diff --git a/src/pages/posts/[slug].astro b/src/pages/posts/[slug].astro index 27d2a1d..69fc59d 100644 --- a/src/pages/posts/[slug].astro +++ b/src/pages/posts/[slug].astro @@ -51,7 +51,7 @@ const pageTitle = post?.title || 'Post Not Found' --- -

    +
    { error ? (
    @@ -65,7 +65,7 @@ const pageTitle = post?.title || 'Post Not Found'
    ) : ( -
    - - - + \ No newline at end of file diff --git a/src/style/ghost-content.css b/src/style/ghost-content.css index 1c2ee17..56c480c 100644 --- a/src/style/ghost-content.css +++ b/src/style/ghost-content.css @@ -2,9 +2,9 @@ /* Base content container */ .ghost-content { - width: 100%; + /* width: 100%; max-width: 100%; - margin: 0 auto; + margin: 0 auto; */ font-family: inherit; } diff --git a/src/style/trash.css b/src/style/trash.css index 66cc9f2..0714927 100644 --- a/src/style/trash.css +++ b/src/style/trash.css @@ -5,7 +5,7 @@ body { } header, -main, +/* main, */ footer { width: 92%; max-width: 600px; From ef5dec2be60ce85fe31357c8e3af8859fefa03b0 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:55:31 -0400 Subject: [PATCH 20/71] Update README.md --- README.md | 123 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 92 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 1db3fb3..38ab424 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,94 @@ -# Astro Starter Kit: Basics +# DATCODE.org -```sh -npm create astro@latest -- --template basics -``` - -[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics) -[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics) -[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json) - -> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! - -![just-the-basics](https://github.com/withastro/astro/assets/2244813/a0a5533c-a856-4198-8470-2d67b1d7c554) +DATCODE.org is built with Astro and leverages Ghost CMS for content management. This application combines the best of both worlds: fast, static site generation with Astro and powerful content management capabilities of Ghost. ## 🚀 Project Structure -Inside of your Astro project, you'll see the following folders and files: - ```text / -├── public/ -│ └── favicon.svg +├── public/ # Static assets (images, favicons) ├── src/ -│ ├── components/ -│ │ └── Card.astro -│ ├── layouts/ -│ │ └── Layout.astro -│ └── pages/ -│ └── index.astro +│ ├── components/ # UI components +│ │ ├── Card.astro # Basic card component +│ │ ├── PostCard.astro # Card for displaying post previews +│ │ ├── PostList.astro # List of post cards +│ │ └── ghost/ # Ghost-specific components +│ │ ├── GhostContent.tsx # Renders Ghost HTML content +│ │ ├── GhostRenderer.tsx # Handles different content blocks +│ │ ├── MemberAuth.tsx # Authentication components +│ │ └── cards/ # Specialized card components for Ghost content +│ ├── layouts/ # Page layouts +│ ├── lib/ # Utility functions and API clients +│ │ ├── api/ # API integration +│ │ │ ├── ghost/ # Ghost API clients and types +│ │ │ └── session.ts # Session management +│ │ └── ghost/ # Ghost content utilities +│ ├── pages/ # Page routes +│ │ ├── api/ # API endpoints +│ │ ├── posts/ # Post pages +│ │ └── index.astro # Homepage +│ └── style/ # Global styles └── package.json ``` -Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. +## 📝 Ghost CMS Integration -There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. +This project integrates with Ghost CMS for content management and membership features. The integration works as follows: -Any static assets, like images, can be placed in the `public/` directory. +### Content Fetching -## 🧞 Commands +1. **Content API Client**: + - Located in `src/lib/api/ghost/index.ts` + - Initializes the Ghost Content API client using environment variables + - Provides functions to fetch posts, tags, and site settings + +2. **Post Retrieval**: + - `getPosts()` - Gets a list of posts with full HTML content + - `getPostsTextFormat()` - Gets posts in text format with only the fields needed for listings, improving performance + - `getPostBySlug()` - Gets a specific post by its slug + - `searchPosts()` - Searches posts by query string + +3. **Post Display**: + - `PostList.astro` - Renders a grid of post cards + - `PostCard.astro` - Displays a post preview with title, excerpt, feature image, etc. + - Individual post pages (`[slug].astro`) show the full post content + +### Content Rendering + +1. **Ghost Content Parser**: + - `parseGhostContent.ts` - Transforms Ghost HTML content into structured blocks + - Handles all Ghost card types (gallery, bookmark, product, file, etc.) + +2. **Rendering Components**: + - `GhostContent.tsx` - Main component that processes HTML or fetches from URL + - `GhostRenderer.tsx` - Renders different block types with appropriate components + - Card components for specialized content types (galleries, products, etc.) + +### Authentication & Membership -All commands are run from the root of the project, from a terminal: +1. **Member API Client**: + - Server-side only client for authenticating members + - Handles sign in, sign up, and session management + +2. **Authentication Flow**: + - `useAuth.ts` - React hook for client-side authentication state management + - Provides functions for sign in, sign up, and sign out + - Tracks authentication state (loading, error, member data) + +3. **API Endpoints**: + - `/api/ghost/member.ts` - Handles member authentication + - `/api/ghost/access.ts` - Checks content access permissions + +4. **Access Control**: + - `checkMemberAccess()` - Utility to determine if a member can access content + - Posts can be public or restricted to members only + - Protected content shows a sign-in prompt for non-members + +5. **User Interface**: + - `UserMenu.tsx` - Displays login/signup buttons or member profile + - `MemberAuth.tsx` - Authentication components + +## 🧞 Commands | Command | Action | | :------------------------ | :----------------------------------------------- | @@ -46,9 +96,20 @@ All commands are run from the root of the project, from a terminal: | `npm run dev` | Starts local dev server at `localhost:4321` | | `npm run build` | Build your production site to `./dist/` | | `npm run preview` | Preview your build locally, before deploying | -| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | -| `npm run astro -- --help` | Get help using the Astro CLI | -## 👀 Want to learn more? +## ⚙️ Environment Configuration + +You need the following environment variables for Ghost integration: + +``` +# Ghost Content API (public, for fetching content) +GHOST_BASE_URL=https://your-ghost-blog.com +GHOST_CONTENT_API_KEY=your-content-api-key + +# Ghost Admin API (private, for authentication - server-side only) +GHOST_ADMIN_API_KEY=your-admin-api-key +``` + +## 🌓 Styling -Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). +The site uses Tailwind CSS with a custom theme defined in `src/style/global.css`. From e7270980f7da925fc4f53418a09240520450a3c7 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 17:57:34 -0400 Subject: [PATCH 21/71] Update railway-deploy.yml --- .github/workflows/railway-deploy.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/railway-deploy.yml b/.github/workflows/railway-deploy.yml index 9e02fea..01b5887 100644 --- a/.github/workflows/railway-deploy.yml +++ b/.github/workflows/railway-deploy.yml @@ -3,9 +3,12 @@ name: Deploy to Railway on: push: branches: - - main # Change this to your default branch if different + - main + paths: + - src/** + - public/** - workflow_dispatch: # Enables manual triggering functionality for this action + workflow_dispatch: # Enables manual triggering jobs: deploy: From 11c8b8a61c6d9f2b3f0a3d735fcd8caecde94f5e Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 18:14:37 -0400 Subject: [PATCH 22/71] separate check from build --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index e6c31f8..58b04ae 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "astro dev", "start": "astro dev", - "build": "astro check && astro build", + "check": "astro check", + "build": "astro build", "preview": "astro preview", "astro": "astro" }, From 3e11512a9d8f6af79ba06f69139df066e81e75e2 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 18:14:47 -0400 Subject: [PATCH 23/71] fix Dockerfile --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6e7b558..ac684a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,10 +3,10 @@ WORKDIR /app COPY . . -RUN pnpm install -RUN pnpm run build +RUN npm install +RUN npm run build ENV HOST=0.0.0.0 ENV PORT=4321 EXPOSE 4321 -CMD node ./dist/server/entry.mjs +CMD ["node", "./dist/server/entry.mjs"] From b0110cdc0b8d2c946f4ce3558e718ac512f09f2f Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 18:20:18 -0400 Subject: [PATCH 24/71] make sure the bg color fills the viewport it's cool to see the color underneath on scroll but without this, the main element shrinks to the content height --- src/pages/posts/index.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/posts/index.astro b/src/pages/posts/index.astro index e7f220e..1f66dee 100644 --- a/src/pages/posts/index.astro +++ b/src/pages/posts/index.astro @@ -21,7 +21,7 @@ try { --- -
    +

    DATCODE

    Browse our latest content From 61d2ac0867bd6985329d1d528f8b9f53fe0d6887 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 18:24:47 -0400 Subject: [PATCH 25/71] make search bar dev-only TODO: fix it --- src/pages/posts/index.astro | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/posts/index.astro b/src/pages/posts/index.astro index 1f66dee..c5e9dff 100644 --- a/src/pages/posts/index.astro +++ b/src/pages/posts/index.astro @@ -27,7 +27,8 @@ try { Browse our latest content

    - + + {isDev && } { isDev && apiError ? ( From 398e65b3c34480f5656987c5fe7bfb20a3a34b2a Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 18:25:50 -0400 Subject: [PATCH 26/71] Update docker-compose.yml --- docker-compose.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index f81ff1e..53504b9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,9 @@ services: build: . ports: - "4321:4321" - volumes: - - ./data:/app/data + # sqlite experiment + # volumes: + # - ./data:/app/data env_file: - .env.production restart: unless-stopped From 92dabc719e8d4185b4353c44990df942717ebdf2 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 23 Mar 2025 18:58:17 -0400 Subject: [PATCH 27/71] use process instead of import.meta on server side --- package.json | 3 ++- src/lib/api/ghost/content-api.ts | 6 +++--- src/lib/api/ghost/index.ts | 10 +++++----- src/lib/api/ghost/member-api.ts | 10 +++++----- src/lib/ghost/index.ts | 4 ++-- src/pages/signin.astro | 7 ------- 6 files changed, 17 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 58b04ae..c4b4c48 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "check": "astro check", "build": "astro build", "preview": "astro preview", - "astro": "astro" + "astro": "astro", + "docker:build": "docker build --env_file .env.production -t datcode/dot-org ." }, "dependencies": { "@astrojs/check": "^0.9.4", diff --git a/src/lib/api/ghost/content-api.ts b/src/lib/api/ghost/content-api.ts index e17f466..7d1ffaa 100644 --- a/src/lib/api/ghost/content-api.ts +++ b/src/lib/api/ghost/content-api.ts @@ -125,10 +125,10 @@ export function createContentApi(options: ContentApiOptions) { */ export function createContentApiFromEnv() { // Prefer the dedicated base URL if available - const baseUrl = import.meta.env.GHOST_BASE_URL; + const baseUrl = process.env.GHOST_BASE_URL; // Fall back to extracting from the content API URL if needed - const contentApiUrl = import.meta.env.GHOST_CONTENT_API_URL; - const key = import.meta.env.GHOST_CONTENT_API_KEY; + const contentApiUrl = process.env.GHOST_CONTENT_API_URL; + const key = process.env.GHOST_CONTENT_API_KEY; // Determine the final URL to use let url = baseUrl; diff --git a/src/lib/api/ghost/index.ts b/src/lib/api/ghost/index.ts index e70ea84..dca9f91 100644 --- a/src/lib/api/ghost/index.ts +++ b/src/lib/api/ghost/index.ts @@ -9,16 +9,16 @@ import type { GhostMember } from './types'; export { useAuth } from './useAuth'; // Check if we have the required environment variables for content API -const hasContentEnvVars = (import.meta.env.GHOST_BASE_URL || import.meta.env.GHOST_CONTENT_API_URL) && import.meta.env.GHOST_CONTENT_API_KEY; +const hasContentEnvVars = (process.env.GHOST_BASE_URL || process.env.GHOST_CONTENT_API_URL) && process.env.GHOST_CONTENT_API_KEY; // Get the base URL for the Ghost SDK -const ghostBaseUrl = import.meta.env.GHOST_BASE_URL || import.meta.env.GHOST_CONTENT_API_URL?.replace(/\/ghost\/api\/content\/?$/, ''); +const ghostBaseUrl = process.env.GHOST_BASE_URL || process.env.GHOST_CONTENT_API_URL?.replace(/\/ghost\/api\/content\/?$/, ''); // Initialize Ghost Content API client if environment variables are available export const ghostApi = hasContentEnvVars ? new GhostContentAPI({ url: ghostBaseUrl, - key: import.meta.env.GHOST_CONTENT_API_KEY, + key: process.env.GHOST_CONTENT_API_KEY, version: 'v5.0' // Use proper version format }) : null; @@ -26,11 +26,11 @@ export const ghostApi = hasContentEnvVars // Log the API initialization for debugging if (ghostApi) { console.log('Ghost Content API initialized with base URL:', ghostBaseUrl); - console.log('Content API Key (first 10 chars):', import.meta.env.GHOST_CONTENT_API_KEY.substring(0, 10) + '...'); + console.log('Content API Key (first 10 chars):', process.env.GHOST_CONTENT_API_KEY.substring(0, 10) + '...'); } else { console.error('Ghost Content API not initialized. Missing environment variables:', { hasBaseUrl: Boolean(ghostBaseUrl), - hasKey: Boolean(import.meta.env.GHOST_CONTENT_API_KEY) + hasKey: Boolean(process.env.GHOST_CONTENT_API_KEY) }); } diff --git a/src/lib/api/ghost/member-api.ts b/src/lib/api/ghost/member-api.ts index 4b7db26..31d6f50 100644 --- a/src/lib/api/ghost/member-api.ts +++ b/src/lib/api/ghost/member-api.ts @@ -205,12 +205,12 @@ export function createAdminMemberApi(options: AdminApiAuthOptions) { * IMPORTANT: This should only be used in server-side code */ export function createAdminMemberApiFromEnv() { - // In Astro, import.meta.env might not be available in server-side code + // In Astro, process.env might not be available in server-side code // Try to access environment variables through process.env first - const adminApiUrl = process.env.GHOST_ADMIN_API_URL || import.meta.env?.GHOST_ADMIN_API_URL; - const baseUrl = process.env.GHOST_BASE_URL || import.meta.env?.GHOST_BASE_URL; - const key = process.env.GHOST_ADMIN_API_KEY || import.meta.env?.GHOST_ADMIN_API_KEY; - const version = process.env.GHOST_ADMIN_API_VERSION || import.meta.env?.GHOST_ADMIN_API_VERSION || 'v5.0'; + const adminApiUrl = process.env.GHOST_ADMIN_API_URL || process.env?.GHOST_ADMIN_API_URL; + const baseUrl = process.env.GHOST_BASE_URL || process.env?.GHOST_BASE_URL; + const key = process.env.GHOST_ADMIN_API_KEY || process.env?.GHOST_ADMIN_API_KEY; + const version = process.env.GHOST_ADMIN_API_VERSION || process.env?.GHOST_ADMIN_API_VERSION || 'v5.0'; // Determine the URL to use - prefer the admin API URL, but fall back to base URL if needed const url = adminApiUrl || (baseUrl ? `${baseUrl}/ghost/api/admin` : null); diff --git a/src/lib/ghost/index.ts b/src/lib/ghost/index.ts index 5d69cef..c4c84b0 100644 --- a/src/lib/ghost/index.ts +++ b/src/lib/ghost/index.ts @@ -2,8 +2,8 @@ import GhostContentAPI from '@tryghost/content-api'; // Initialize the Ghost Content API client const api = new GhostContentAPI({ - url: import.meta.env.SITE_URL || 'https://', - key: import.meta.env.GHOST_CONTENT_API_KEY || '', + url: process.env.SITE_URL || 'https://', + key: process.env.GHOST_CONTENT_API_KEY || '', version: 'v5.0' }); diff --git a/src/pages/signin.astro b/src/pages/signin.astro index 854446d..db1aa7f 100644 --- a/src/pages/signin.astro +++ b/src/pages/signin.astro @@ -1,12 +1,5 @@ --- import Layout from '../layouts/Layout.astro' - -// Get Ghost settings to use for authentication -const ghostUrl = - import.meta.env.GHOST_API_URL || import.meta.env.SITE_URL || 'https://' - -// Initialize error variable for server-side form handling -let error: string | null = null --- From de8d75fd7d4168b7b053f9d041838fd639860ce5 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Wed, 26 Mar 2025 21:49:13 -0400 Subject: [PATCH 28/71] use whatever env works to define secrets --- src/lib/api/ghost/content-api.ts | 6 +++--- src/lib/api/ghost/index.ts | 15 ++++++++------- src/lib/ghost/index.ts | 7 +++++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/lib/api/ghost/content-api.ts b/src/lib/api/ghost/content-api.ts index 7d1ffaa..8104a8b 100644 --- a/src/lib/api/ghost/content-api.ts +++ b/src/lib/api/ghost/content-api.ts @@ -125,10 +125,10 @@ export function createContentApi(options: ContentApiOptions) { */ export function createContentApiFromEnv() { // Prefer the dedicated base URL if available - const baseUrl = process.env.GHOST_BASE_URL; + const baseUrl = process.env.GHOST_BASE_URL || import.meta.env.GHOST_BASE_URL; // Fall back to extracting from the content API URL if needed - const contentApiUrl = process.env.GHOST_CONTENT_API_URL; - const key = process.env.GHOST_CONTENT_API_KEY; + const contentApiUrl = process.env.GHOST_CONTENT_API_URL || import.meta.env.GHOST_CONTENT_API_URL; + const key = process.env.GHOST_CONTENT_API_KEY || import.meta.env.GHOST_CONTENT_API_KEY; // Determine the final URL to use let url = baseUrl; diff --git a/src/lib/api/ghost/index.ts b/src/lib/api/ghost/index.ts index dca9f91..e8f4828 100644 --- a/src/lib/api/ghost/index.ts +++ b/src/lib/api/ghost/index.ts @@ -5,20 +5,21 @@ import GhostContentAPI from '@tryghost/content-api'; import type { GhostAPI, PostOrPage, Nullable, PostsOrPages, Tag, Tags, Settings, Author, Authors } from '@tryghost/content-api'; import type { GhostMember } from './types'; +const ghostBaseUrl = process.env.GHOST_BASE_URL || import.meta.env.GHOST_BASE_URL; +const ghostContentApiUrl = process.env.GHOST_CONTENT_API_URL || import.meta.env.GHOST_CONTENT_API_URL; +const ghostContentApiKey = process.env.GHOST_CONTENT_API_KEY || import.meta.env.GHOST_CONTENT_API_KEY; + // Export the useAuth hook export { useAuth } from './useAuth'; // Check if we have the required environment variables for content API -const hasContentEnvVars = (process.env.GHOST_BASE_URL || process.env.GHOST_CONTENT_API_URL) && process.env.GHOST_CONTENT_API_KEY; - -// Get the base URL for the Ghost SDK -const ghostBaseUrl = process.env.GHOST_BASE_URL || process.env.GHOST_CONTENT_API_URL?.replace(/\/ghost\/api\/content\/?$/, ''); +const hasContentEnvVars = (ghostBaseUrl && ghostContentApiUrl) && ghostContentApiKey; // Initialize Ghost Content API client if environment variables are available export const ghostApi = hasContentEnvVars ? new GhostContentAPI({ url: ghostBaseUrl, - key: process.env.GHOST_CONTENT_API_KEY, + key: ghostContentApiKey, version: 'v5.0' // Use proper version format }) : null; @@ -26,11 +27,11 @@ export const ghostApi = hasContentEnvVars // Log the API initialization for debugging if (ghostApi) { console.log('Ghost Content API initialized with base URL:', ghostBaseUrl); - console.log('Content API Key (first 10 chars):', process.env.GHOST_CONTENT_API_KEY.substring(0, 10) + '...'); + console.log('Content API Key (first 10 chars):', ghostContentApiKey.substring(0, 10) + '...'); } else { console.error('Ghost Content API not initialized. Missing environment variables:', { hasBaseUrl: Boolean(ghostBaseUrl), - hasKey: Boolean(process.env.GHOST_CONTENT_API_KEY) + hasKey: Boolean(ghostContentApiKey) }); } diff --git a/src/lib/ghost/index.ts b/src/lib/ghost/index.ts index c4c84b0..6fb28fa 100644 --- a/src/lib/ghost/index.ts +++ b/src/lib/ghost/index.ts @@ -1,9 +1,12 @@ import GhostContentAPI from '@tryghost/content-api'; +const ghostBaseUrl = process.env.GHOST_BASE_URL || import.meta.env.GHOST_BASE_URL; +const ghostContentApiKey = process.env.GHOST_CONTENT_API_KEY || import.meta.env.GHOST_CONTENT_API_KEY; + // Initialize the Ghost Content API client const api = new GhostContentAPI({ - url: process.env.SITE_URL || 'https://', - key: process.env.GHOST_CONTENT_API_KEY || '', + url: ghostBaseUrl, + key: ghostContentApiKey, version: 'v5.0' }); From 9a4abda20477d06145029ed86bd293e33348a180 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Wed, 26 Mar 2025 21:49:21 -0400 Subject: [PATCH 29/71] use html identity for copyright --- src/pages/index.astro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/index.astro b/src/pages/index.astro index 50728f3..4de3892 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -28,6 +28,6 @@ import Root from '../layouts/Root.astro';
    -

    © DatCode.org

    +

    © DatCode.org

    - \ No newline at end of file + From 5916f4969b732190cbd2a209d4860fadf2a2d679 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Wed, 26 Mar 2025 22:36:40 -0400 Subject: [PATCH 30/71] add default body font (serif) --- src/pages/posts/[slug].astro | 2 +- src/style/global.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pages/posts/[slug].astro b/src/pages/posts/[slug].astro index 69fc59d..386315d 100644 --- a/src/pages/posts/[slug].astro +++ b/src/pages/posts/[slug].astro @@ -51,7 +51,7 @@ const pageTitle = post?.title || 'Post Not Found' --- -
    +
    { error ? (
    diff --git a/src/style/global.css b/src/style/global.css index 8e7f188..8057f98 100644 --- a/src/style/global.css +++ b/src/style/global.css @@ -16,6 +16,10 @@ utility - reused classes that perform a specific design pattern @plugin "@tailwindcss/typography"; @theme { + /* Fonts */ + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + + /* Primary brand colors */ --color-primary: #ddff20; /* yellow from button */ --color-primary-focus: #c8e81c; /* slightly darker yellow */ From 24d8e7f33c74456062ee2bfaa42ceaf41dac60b4 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Wed, 26 Mar 2025 22:36:52 -0400 Subject: [PATCH 31/71] move author block to the top --- src/pages/posts/[slug].astro | 54 +++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/pages/posts/[slug].astro b/src/pages/posts/[slug].astro index 386315d..f878cd1 100644 --- a/src/pages/posts/[slug].astro +++ b/src/pages/posts/[slug].astro @@ -77,6 +77,31 @@ const pageTitle = post?.title || 'Post Not Found' {post!.title} +
    + {post!.primary_author && ( +
    + {post!.primary_author.profile_image && ( + {post!.primary_author.name} + )} +
    +

    + by {post!.primary_author.name} +

    + {'bio' in post!.primary_author && + post!.primary_author.bio && ( +

    + {post!.primary_author.bio} +

    + )} +
    +
    + )} +
    +
    {formattedDate} {post!.primary_tag && ( @@ -114,7 +139,7 @@ const pageTitle = post?.title || 'Post Not Found'

    This content is available exclusively to members. Please sign in - to access this premium content. + to access this content.

    - \ No newline at end of file + From 41ce746688d8752e7f282e790723e4e4f1d3d876 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Wed, 26 Mar 2025 22:37:04 -0400 Subject: [PATCH 32/71] use p for paragraphs --- src/components/ghost/GhostRenderer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ghost/GhostRenderer.tsx b/src/components/ghost/GhostRenderer.tsx index 23f270c..6cd7265 100644 --- a/src/components/ghost/GhostRenderer.tsx +++ b/src/components/ghost/GhostRenderer.tsx @@ -36,7 +36,7 @@ const GhostRenderer: React.FC = ({ blocks, className = '' }) const renderBlock = (block: GhostBlock, index: number): React.ReactNode => { switch (block.type) { case 'paragraph': - return
    ; + return

    ; case 'heading': { const level = block.attributes?.level || 1; From 237bca88d60250a9065bcb6f36d07376eceba077 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Thu, 27 Mar 2025 00:05:26 -0400 Subject: [PATCH 33/71] add partial post object from ghost response --- voyager_md.html | 120 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 voyager_md.html diff --git a/voyager_md.html b/voyager_md.html new file mode 100644 index 0000000..1b645a7 --- /dev/null +++ b/voyager_md.html @@ -0,0 +1,120 @@ +post { + slug: 'the-voyager-missions-humanitys-message-to-the-cosmos', + id: '67e4b1a74a39e30001afd09f', + uuid: '99162a25-530b-467b-bc6c-9cd1ad91204b', + title: "The Voyager Missions: Humanity's Message to the Cosmos", + html: "

    Note: This is a demo post to test different kinds of generated html. I didn't write this, chatGPT did. The Voyager missions, launched by NASA in the late 1970s, were designed to take advantage of a rare alignment of the outer planets. These missions marked a significant milestone in our quest to explore the solar system. Voyager 1 and Voyager 2 have since journeyed far beyond their original destinations, entering interstellar space and continuing to relay invaluable data back to Earth.

    \n" + + '
    \n' + + `

    The Voyager missions[1], launched by NASA in the late 1970s, represent one of humanity's most significant forays into deep space. The two spacecraft, Voyager 1 and Voyager 2, were designed to take advantage of a rare planetary alignment to explore the outer planets. Voyager 1, launched on September 5, 1977, focused on Jupiter and Saturn, providing unprecedented groundbreaking insights into these gas giants and their moons.

    \n` + + "

    As of 2023, Voyager 1 is the most distant human-made object in space, traveling beyond the heliosphere, the outer limit of the Sun's magnetic influence. Voyager 2, launched on August 20, 1977, took a longer trajectory and became the only spacecraft to visit Uranus and Neptune. Both missions have exceeded their original goals and continue to relay valuable scientific data. Interestingly, each Voyager carries a Golden Record, a 12-inch gold-plated copper disk containing sounds and images selected to portray the diversity of life and culture on Earth, serving as a message to possible extraterrestrial life. As of now, the Voyager spacecraft are expected to run out of power and cease operations by 2025, but their journey into the unknown continues to inspire and intrigue.

    \n" + + '
    \n' + + '
    \n' + + '

    "We embarked on the ultimate journey of discovery, hoping to answer the age-old question: Are we alone?" - Carl Sagan

    \n' + + '
    \n' + + '

    Key Objectives

    \n' + + '

    The primary objectives of the Voyager missions were to:

    \n' + + '
      \n' + + '
    1. Conduct close-up studies of Jupiter and Saturn\n' + + '
        \n' + + '
      1. asdfasdf
      2. \n' + + '
      \n' + + '
    2. \n' + + '
    3. Explore the larger moons of these planets
    4. \n' + + '
    5. Investigate the edge of our solar system
    6. \n' + + '
    \n' + + `
    The Voyagers' Discoveries
    \n` + + '

    The discoveries made by the Voyagers were groundbreaking:

    \n' + + '
      \n' + + "
    • Jupiter's Moons: Revealing volcanic activity on Io\n" + + '
        \n' + + '
      • Galilean moons
      • \n' + + '
      • Ring system
      • \n' + + '
      \n' + + '
    • \n' + + "
    • Saturn's Rings: Detailed images of Saturn's complex ring system
    • \n" + + '
    • Interstellar Space: First human-made objects to enter interstellar space
    • \n' + + '
    \n' + + '

    Instruments Onboard

    \n' + + '
    Voyager 1 and Voyager 2 carried a variety of scientific instruments, including:\n' +
    +    '- Imaging Science System (ISS)\n' +
    +    '- Ultraviolet Spectrometer (UVS)\n' +
    +    '- Triaxial Fluxgate Magnetometer (MAG)\n' +
    +    '
    \n' + + `

    For more detailed information, visit NASA's Voyager Mission Page.

    \n` + + '

    The Golden Record: A Message to the Stars

    \n' + + '

    One of the most fascinating aspects of the Voyager missions is the inclusion of the Golden Record. This phonograph record contains sounds and images selected to portray the diversity of life and culture on Earth.

    \n' + + '

    The golden record

    \n' + + '
    Contents of the Golden Record
    \n' + + '
      \n' + + '
    • Music: A selection of music from different cultures and eras
    • \n' + + '
    • Sounds: Natural sounds of Earth, such as thunder and bird songs
    • \n' + + '
    • Images: 116 photographs depicting life and human activities
    • \n' + + '
    • Greetings: Spoken greetings in 55 languages
    • \n' + + '
    \n' + + '

    The Legacy of the Voyagers

    \n' + + `

    Voyager's Continuing Journey

    \n` + + '

    As of 2024, Voyager 1 is 14 billion miles from Earth, while Voyager 2 is slightly closer. Their journey continues, a testament to human ingenuity and the quest for knowledge.

    \n' + + '

    Carl Sagan once said:

    \n' + + '
    \n' + + `

    "The spacecraft will be encountered and the record played only if there are advanced spacefaring civilizations in interstellar space. But the launching of this 'bottle' into the cosmic 'ocean' says something very hopeful about life on this planet."

    \n` + + '
    \n' + + '

    Future of Space Exploration

    \n' + + '

    The impact of the Voyager missions is immeasurable. They have inspired generations and paved the way for future explorations into the unknown.

    \n' + + `

    A Timeline of Voyager's Milestones

    \n` + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '
    YearEvent
    1977Launch of Voyager 1 and Voyager 2
    1979First encounter with Jupiter
    1981Saturn flyby
    1990Pale Blue Dot image taken
    2012Voyager 1 enters interstellar space
    2018Voyager 2 enters interstellar space
    \n' + + `

    Voyager's Impact on Science and Culture

    \n` + + '

    In Summary

    \n' + + '

    The Voyager missions have:

    \n' + + '
      \n' + + '
    • Boldly explored regions of space never before visited
    • \n' + + '
    • Provided invaluable data about our solar system
    • \n' + + '
    • Sent a time capsule message to potential extraterrestrial life
    • \n' + + '
    \n' + + '

    Future Missions

    \n' + + '
      \n' + + '
    • [ ] Plan new interstellar probes
    • \n' + + '
    • [ ] Analyze data from the edge of the solar system
    • \n' + + '
    • [x] Celebrate the legacy of the Voyager missions
    • \n' + + '
    \n' + + "

    The Voyager missions, highlighted here, are an enduring symbol of humanity's desire to explore and understand the vast universe. Their journey continues, carrying a message not just of who we are, but of our hopes and dreams for the future.

    \n" + + '
    \n' + + '
    \n' + + '
      \n' + + '
    1. The Voyager missions are among the most significant endeavors in space exploration. ↩︎

      \n' + + '
    2. \n' + + '
    \n' + + '
    \n', +} \ No newline at end of file From d9e1de6bfd6e06829998344bc2e967ee631dc513 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Thu, 27 Mar 2025 00:05:35 -0400 Subject: [PATCH 34/71] unwrap paragraphs --- src/components/ghost/GhostRenderer.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/ghost/GhostRenderer.tsx b/src/components/ghost/GhostRenderer.tsx index 6cd7265..afb5c0f 100644 --- a/src/components/ghost/GhostRenderer.tsx +++ b/src/components/ghost/GhostRenderer.tsx @@ -36,7 +36,9 @@ const GhostRenderer: React.FC = ({ blocks, className = '' }) const renderBlock = (block: GhostBlock, index: number): React.ReactNode => { switch (block.type) { case 'paragraph': - return

    ; + // If block.html contains p tags, extract the content from between them + const paragraphContent = block.html ? block.html.replace(/<\/?p>/g, '') : ''; + return

    ; case 'heading': { const level = block.attributes?.level || 1; From 2014cb18cd3ba7cfcdbae7fa1f8db998ff7f46d5 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Thu, 27 Mar 2025 00:06:42 -0400 Subject: [PATCH 35/71] fix post first paragraph styling --- src/pages/posts/[slug].astro | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/pages/posts/[slug].astro b/src/pages/posts/[slug].astro index f878cd1..9f6bd1f 100644 --- a/src/pages/posts/[slug].astro +++ b/src/pages/posts/[slug].astro @@ -50,6 +50,29 @@ const formattedDate = post?.published_at const pageTitle = post?.title || 'Post Not Found' --- + +

    { From ba5bd61b6349b0b345a7947ab1401b1b1928604d Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Thu, 27 Mar 2025 00:07:20 -0400 Subject: [PATCH 36/71] add style by length for post title Co-Authored-By: Taurean Bryant --- src/pages/posts/[slug].astro | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/posts/[slug].astro b/src/pages/posts/[slug].astro index 9f6bd1f..cdcb656 100644 --- a/src/pages/posts/[slug].astro +++ b/src/pages/posts/[slug].astro @@ -96,9 +96,15 @@ const pageTitle = post?.title || 'Post Not Found' ← Back to Posts -

    - {post!.title} -

    + {post && post.title && post.title.length > 20 ? ( +

    + {post.title} +

    + ) : ( +

    + {post?.title} +

    + )}
    {post!.primary_author && ( From 17b70960aad5077f7597d5751674aa92c135f68d Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Thu, 27 Mar 2025 00:08:46 -0400 Subject: [PATCH 37/71] remove anchor from post author (for now) TODO: add author pages and link em Co-Authored-By: Taurean Bryant --- src/pages/posts/[slug].astro | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/posts/[slug].astro b/src/pages/posts/[slug].astro index cdcb656..9b8f317 100644 --- a/src/pages/posts/[slug].astro +++ b/src/pages/posts/[slug].astro @@ -118,7 +118,10 @@ const pageTitle = post?.title || 'Post Not Found' )}

    - by {post!.primary_author.name} + by{" "} + {/* */} + {post!.primary_author.name} + {/* */}

    {'bio' in post!.primary_author && post!.primary_author.bio && ( From 3a37cacd8b6796ee66eeb9c3cfa4c587e57837c7 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Tue, 1 Apr 2025 18:20:07 -0400 Subject: [PATCH 38/71] use svg as component --- astro.config.mjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/astro.config.mjs b/astro.config.mjs index 7155154..f8a4cfc 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -14,5 +14,8 @@ export default defineConfig({ }), vite: { plugins: [tailwindcss()] + }, + experimental: { + svg: true } }); From ecebe26c25eede9d6bf78ffe8fdf85de7ea384aa Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Tue, 1 Apr 2025 18:21:11 -0400 Subject: [PATCH 39/71] add header nav start --- src/components/Header.astro | 14 ++++++++++++++ src/components/datcode-header.svg | 3 +++ src/layouts/Layout.astro | 2 ++ 3 files changed, 19 insertions(+) create mode 100644 src/components/Header.astro create mode 100644 src/components/datcode-header.svg diff --git a/src/components/Header.astro b/src/components/Header.astro new file mode 100644 index 0000000..b18b4a9 --- /dev/null +++ b/src/components/Header.astro @@ -0,0 +1,14 @@ +--- +import HeaderLogo from './datcode-header.svg' +--- +
    + + +
    \ No newline at end of file diff --git a/src/components/datcode-header.svg b/src/components/datcode-header.svg new file mode 100644 index 0000000..5321724 --- /dev/null +++ b/src/components/datcode-header.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index bcbcd8c..b3d8839 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -2,6 +2,7 @@ import '../style/global.css' import '../style/ghost-content.css' import '../style/trash.css' +import Header from '../components/Header.astro' interface Props { title: string } @@ -20,6 +21,7 @@ const { title } = Astro.props {title} +
    From bea6448c55605185a1aab768f99679ade53d7371 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Tue, 1 Apr 2025 18:21:20 -0400 Subject: [PATCH 40/71] update paths from /posts/ to /blog/ --- src/components/PostCard.astro | 4 ++-- src/pages/{posts => blog}/[slug].astro | 0 src/pages/{posts => blog}/index.astro | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/pages/{posts => blog}/[slug].astro (100%) rename src/pages/{posts => blog}/index.astro (100%) diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro index f8bf9b2..70437a6 100644 --- a/src/components/PostCard.astro +++ b/src/components/PostCard.astro @@ -63,7 +63,7 @@ const isMembersOnly = 'access' in post && post.access === false

    {post.title} @@ -91,7 +91,7 @@ const isMembersOnly = 'access' in post && post.access === false }
    Read more → diff --git a/src/pages/posts/[slug].astro b/src/pages/blog/[slug].astro similarity index 100% rename from src/pages/posts/[slug].astro rename to src/pages/blog/[slug].astro diff --git a/src/pages/posts/index.astro b/src/pages/blog/index.astro similarity index 100% rename from src/pages/posts/index.astro rename to src/pages/blog/index.astro From 664191ccec8e19db7f56e68af4ce4e82cdf31457 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Tue, 1 Apr 2025 18:51:38 -0400 Subject: [PATCH 41/71] add hover/focus effect on nav items --- src/components/Header.astro | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/Header.astro b/src/components/Header.astro index b18b4a9..496a155 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,14 +1,14 @@ --- import HeaderLogo from './datcode-header.svg' --- -
    +
    -
    \ No newline at end of file From 4d8e37a46f327e30e9268af7e1b66707c1d6da13 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Tue, 1 Apr 2025 19:49:16 -0400 Subject: [PATCH 42/71] add blog post list page structure --- src/pages/blog/index.astro | 65 +++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro index c5e9dff..cbe6952 100644 --- a/src/pages/blog/index.astro +++ b/src/pages/blog/index.astro @@ -1,51 +1,52 @@ --- -import PostList from '../../components/PostList.astro' -import SearchBar from '../../components/SearchBar.astro' import { getPostsTextFormat } from '../../lib/api/ghost' import Layout from '../../layouts/Layout.astro' -// Try to fetch posts let posts: any[] = [] -let apiError = false -const isDev = import.meta.env.DEV // Debugging try { posts = await getPostsTextFormat() // If posts is empty, it might indicate an API issue - apiError = posts.length === 0 && isDev + // apiError = posts.length === 0 && isDev } catch (error) { console.error('Failed to fetch posts:', error) - apiError = true + // apiError = true } + +console.log('posts[0]', posts[0]) +const latestPost = posts[0] +const author = latestPost.authors[0] +function formattedDate(dateToFormat: Date) { +const date = new Date(dateToFormat) + return date.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric' +}) +} + +const archivePosts = posts.toSpliced(0, 1) ---
    -

    DATCODE

    -

    - Browse our latest content -

    - - - {isDev && } - - { - isDev && apiError ? ( -
    -

    Content Unavailable

    -

    - We're unable to load content at this time. This could be due to - missing API credentials or a connection issue. -

    -

    - Please check your Ghost API configuration in the environment - variables. -

    -
    - ) : ( - - ) - } +

    Latest Post

    +

    {latestPost.title}

    +
    + by {author.name} + {formattedDate(latestPost.published_at)} +
    +

    {latestPost.excerpt}

    + read more +
    From 224162a076c1da13a8386ca302d0811b180680d4 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Tue, 1 Apr 2025 19:49:37 -0400 Subject: [PATCH 43/71] styling fixes --- src/components/Header.astro | 2 +- src/pages/index.astro | 2 +- src/style/trash.css | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/Header.astro b/src/components/Header.astro index 496a155..a9030c2 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,7 +1,7 @@ --- import HeaderLogo from './datcode-header.svg' --- -
    +

    - ); + ) case 'gallery': - return ; + return case 'bookmark': - return ; + return case 'product': - return ; + return case 'file': - return ; + return case 'callout': - return ; + return case 'button': - return ; + return case 'toggle': - return ; + return case 'header': - return ; + return case 'signup': - return ; + return case 'html': - return
    ; + return
    case 'divider': - return
    ; + return
    + + case 'table': { + return ( +
    + + + ) + } default: - console.warn(`Unsupported block type: ${block.type}`); - return
    ; + console.warn(`Unsupported block type: ${block.type}`) + return
    } -}; +} -export default GhostRenderer; +export default GhostRenderer From b6bf94e2c43193c3852cb9b46ee6ba401399bd90 Mon Sep 17 00:00:00 2001 From: Kevon Eaglin Date: Sun, 13 Apr 2025 17:54:51 -0400 Subject: [PATCH 54/71] use the existing logo in header --- src/components/Header.astro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Header.astro b/src/components/Header.astro index 9589ae9..e99d4fa 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,7 +1,7 @@
    - - DATCODE + +