Mirror of
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: bootstrap

+2171 -63
+43
.github/workflows/generate-post.yml
··· 1 + name: Generate Daily/Nightly Post 2 + 3 + on: 4 + schedule: 5 + - cron: "0 6 * * *" 6 + - cron: "0 22 * * *" 7 + workflow_dispatch: 8 + 9 + permissions: 10 + contents: write 11 + 12 + jobs: 13 + generate-post: 14 + runs-on: ubuntu-latest 15 + 16 + steps: 17 + - name: Checkout repository 18 + uses: actions/checkout@v4 19 + with: 20 + ref: ${{ github.head_ref }} 21 + 22 + - name: Setup Node.js 23 + uses: actions/setup-node@v4 24 + with: 25 + node-version: "20" 26 + cache: "pnpm" 27 + 28 + - name: Install dependencies 29 + run: pnpm install --frozen-lockfile 30 + 31 + - name: Generate post 32 + env: 33 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 34 + run: pnpm run generate 35 + 36 + - name: Commit and push new post 37 + uses: stefanzweifel/git-auto-commit-action@v5 38 + with: 39 + commit_message: "chore: add digest [skip ci]" 40 + file_pattern: "src/content/posts/*.json" 41 + commit_user_name: "github-actions[bot]" 42 + commit_user_email: "github-actions[bot]@users.noreply.github.com" 43 + commit_author: "github-actions[bot] <github-actions[bot]@users.noreply.github.com>"
+151 -28
README.md
··· 1 - # Astro Starter Kit: Minimal 1 + # 📰 npmx-digest 2 + 3 + An automated news aggregation website that summarizes npmx activity from GitHub and Bluesky every 12 hours. 4 + 5 + ## ✨ Features 6 + 7 + - 🤖 **AI-Powered Summaries** - Uses GitHub Models to generate concise summaries 8 + - ⏰ **Twice Daily Updates** - Posts published at 07:00 and 23:00 CET 9 + - 🎨 **Beautiful Minimalist Design** - Clean, modern interface with no framework dependencies 10 + - 📱 **Fully Responsive** - Works perfectly on all devices 11 + - 🔄 **Automated** - GitHub Actions handles everything automatically 12 + 13 + ## 🚀 Quick Start 14 + 15 + ### Prerequisites 16 + 17 + - Node.js 24+ installed 18 + - GitHub account 19 + - (Optional) Bluesky account for Bluesky integration 20 + 21 + ### Installation 22 + 23 + 1. **Clone and install dependencies:** 2 24 3 - ```sh 4 - pnpm create astro@latest -- --template minimal 25 + ```bash 26 + cd npmx-digest 27 + pnpm install 5 28 ``` 6 29 7 - > 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! 30 + 2. **Set up environment variables:** 31 + 32 + Create a `.env` file in the root directory: 33 + 34 + ```env 35 + # Required for AI summaries and GitHub API 36 + GITHUB_TOKEN=your_github_token_here 37 + ``` 38 + 39 + 3. **Run development server:** 40 + 41 + ```bash 42 + pnpm dev 43 + ``` 44 + 45 + Visit `http://localhost:4321` to see your site! 46 + 47 + ## 🛠️ Commands 48 + 49 + | Command | Description | 50 + |---------|-------------| 51 + | `pnpm dev` | Start development server | 52 + | `pnpm build` | Build for production | 53 + | `pnpm preview` | Preview production build | 54 + | `pnpm generate` | Manually generate a new post | 55 + 56 + ## 📝 Manual Post Generation 57 + 58 + To create a post manually: 59 + 60 + ```bash 61 + pnpm generate 62 + ``` 63 + 64 + This will: 65 + 1. Fetch events from GitHub and Bluesky from the last 12 hours 66 + 2. Generate an AI summary using GitHub Models 67 + 3. Create a JSON file in `src/content/posts/` 68 + 4. Automatically determine if it's a "daily" or "nightly" post based on current time 69 + 70 + ## ⚙️ GitHub Actions Setup 71 + 72 + The site automatically generates posts using GitHub Actions. To set this up: 73 + 74 + 1. **Enable GitHub Actions** in your repository settings 75 + 76 + 2. **Add repository secrets:** 77 + - Go to Settings → Secrets and variables → Actions 78 + - Add the following secrets: 79 + - `GITHUB_TOKEN` (automatically provided by GitHub) 80 + 81 + 3. **Enable GitHub Pages (optional):** 82 + - Go to Settings → Pages 83 + - Source: GitHub Actions 84 + - Your site will be deployed automatically after each post generation 85 + 86 + The workflow runs automatically at: 87 + - **07:00 CET** (daily post) 88 + - **23:00 CET** (nightly post) 89 + 90 + You can also trigger it manually from the Actions tab. 91 + 92 + ## 🔑 Getting Tokens 93 + 94 + ### GitHub Token 95 + 96 + 1. Go to GitHub Settings → Developer settings → Personal access tokens → Tokens (classic) 97 + 2. Generate new token with `repo` scope 98 + 3. Copy and save the token 99 + 100 + ### Bluesky 101 + 102 + No authentication needed! The public API is used to fetch posts. 103 + 104 + ## 🎨 Customization 105 + 106 + ### Styling 107 + 108 + All styles are inline CSS using CSS custom properties. To customize colors, edit the `:root` variables in `src/layouts/Layout.astro`: 109 + 110 + ```css 111 + :root { 112 + --bg-primary: #0a0a0a; 113 + --bg-secondary: #151515; 114 + --accent: #3b82f6; 115 + /* ... more variables ... */ 116 + } 117 + ``` 8 118 9 - ## 🚀 Project Structure 119 + ### Post Schedule 10 120 11 - Inside of your Astro project, you'll see the following folders and files: 121 + To change when posts are generated, edit `.github/workflows/generate-post.yml`: 12 122 13 - ```text 14 - / 15 - ├── public/ 16 - ├── src/ 17 - │ └── pages/ 18 - │ └── index.astro 19 - └── package.json 123 + ```yaml 124 + schedule: 125 + - cron: '0 6 * * *' # 07:00 CET (daily) 126 + - cron: '0 22 * * *' # 23:00 CET (nightly) 20 127 ``` 21 128 22 - Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. 129 + ### Sources 130 + 131 + To add or modify data sources, edit `src/lib/utils.ts` and add new fetch functions. 23 132 24 - There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. 133 + ## 🐛 Troubleshooting 25 134 26 - Any static assets, like images, can be placed in the `public/` directory. 135 + **Posts not generating:** 136 + - Check GitHub Actions logs in the Actions tab 137 + - Verify environment variables are set correctly 138 + - Ensure GitHub token has necessary permissions 27 139 28 - ## 🧞 Commands 140 + **No events showing:** 141 + - Verify the GitHub repository exists and is accessible 142 + - Ensure Bluesky handle is correct 29 143 30 - All commands are run from the root of the project, from a terminal: 144 + **Build fails:** 145 + - Run `npm run build` locally to see errors 146 + - Check that all dependencies are installed 147 + - Verify Node.js version is 18+ 31 148 32 - | Command | Action | 33 - | :------------------------ | :----------------------------------------------- | 34 - | `pnpm install` | Installs dependencies | 35 - | `pnpm dev` | Starts local dev server at `localhost:4321` | 36 - | `pnpm build` | Build your production site to `./dist/` | 37 - | `pnpm preview` | Preview your build locally, before deploying | 38 - | `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` | 39 - | `pnpm astro -- --help` | Get help using the Astro CLI | 149 + ## 📄 License 150 + 151 + MIT License - feel free to use this for your own projects! 40 152 41 - ## 👀 Want to learn more? 153 + ## 🤝 Contributing 42 154 43 - Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). 155 + Contributions are welcome! Please feel free to submit a Pull Request. 156 + 157 + ## 💡 Tips 158 + 159 + - The first time you run the site, there will be no posts. Run `npm run generate` to create one. 160 + - Posts are stored as JSON files in `src/content/posts/` - you can manually edit them if needed. 161 + - The AI summary quality depends on the events found. More events = better summaries! 162 + - GitHub Models uses the `gpt-4o-mini` model by default for cost efficiency. 163 + 164 + --- 165 + 166 + Built with [Astro](https://astro.build) 🚀
+33 -6
package.json
··· 1 1 { 2 - "name": "npmx-daily", 2 + "name": "npmx-digest", 3 3 "type": "module", 4 4 "version": "0.0.1", 5 + "description": "Get the latest news around npmx.", 6 + "author": "trueberryless <trueberryless@gmail.com> (https://trueberryless.org)", 5 7 "scripts": { 6 8 "dev": "astro dev", 7 - "build": "astro build", 9 + "build": "astro check && astro build", 8 10 "preview": "astro preview", 9 - "astro": "astro" 11 + "astro": "astro", 12 + "generate": "tsx --env-file=.env scripts/generate-digest.ts", 13 + "backfill": "tsx --env-file=.env scripts/backfill.ts" 10 14 }, 11 15 "dependencies": { 12 - "astro": "^5.17.1" 13 - } 14 - } 16 + "@astrojs/check": "^0.9.6", 17 + "astro": "^5.17.1", 18 + "typescript": "^5.9.3" 19 + }, 20 + "devDependencies": { 21 + "@types/node": "^22.0.0", 22 + "tsx": "^4.19.0", 23 + "zod": "^3.25.76" 24 + }, 25 + "packageManager": "pnpm@10.10.0", 26 + "private": true, 27 + "keywords": [ 28 + "npmx", 29 + "newsletter", 30 + "blog", 31 + "automation", 32 + "daily", 33 + "nightly" 34 + ], 35 + "homepage": "https://github.com/trueberryless-org/npmx-digest", 36 + "repository": { 37 + "type": "git", 38 + "url": "https://github.com/trueberryless-org/npmx-digest.git" 39 + }, 40 + "bugs": "https://github.com/trueberryless-org/npmx-digest/issues" 41 + }
+937 -7
pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 + '@astrojs/check': 12 + specifier: ^0.9.6 13 + version: 0.9.6(prettier@3.8.1)(typescript@5.9.3) 11 14 astro: 12 15 specifier: ^5.17.1 13 - version: 5.17.1(rollup@4.57.1)(typescript@5.9.3) 16 + version: 5.17.1(@types/node@22.19.7)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) 17 + typescript: 18 + specifier: ^5.9.3 19 + version: 5.9.3 20 + devDependencies: 21 + '@types/node': 22 + specifier: ^22.0.0 23 + version: 22.19.7 24 + tsx: 25 + specifier: ^4.19.0 26 + version: 4.21.0 27 + zod: 28 + specifier: ^3.25.76 29 + version: 3.25.76 14 30 15 31 packages: 16 32 33 + '@astrojs/check@0.9.6': 34 + resolution: {integrity: sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==} 35 + hasBin: true 36 + peerDependencies: 37 + typescript: ^5.0.0 38 + 17 39 '@astrojs/compiler@2.13.0': 18 40 resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} 19 41 20 42 '@astrojs/internal-helpers@0.7.5': 21 43 resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} 22 44 45 + '@astrojs/language-server@2.16.3': 46 + resolution: {integrity: sha512-yO5K7RYCMXUfeDlnU6UnmtnoXzpuQc0yhlaCNZ67k1C/MiwwwvMZz+LGa+H35c49w5QBfvtr4w4Zcf5PcH8uYA==} 47 + hasBin: true 48 + peerDependencies: 49 + prettier: ^3.0.0 50 + prettier-plugin-astro: '>=0.11.0' 51 + peerDependenciesMeta: 52 + prettier: 53 + optional: true 54 + prettier-plugin-astro: 55 + optional: true 56 + 23 57 '@astrojs/markdown-remark@6.3.10': 24 58 resolution: {integrity: sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==} 25 59 ··· 31 65 resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} 32 66 engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} 33 67 68 + '@astrojs/yaml2ts@0.2.2': 69 + resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} 70 + 34 71 '@babel/helper-string-parser@7.27.1': 35 72 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 36 73 engines: {node: '>=6.9.0'} ··· 52 89 resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} 53 90 engines: {node: '>=18'} 54 91 92 + '@emmetio/abbreviation@2.3.3': 93 + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} 94 + 95 + '@emmetio/css-abbreviation@2.1.8': 96 + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} 97 + 98 + '@emmetio/css-parser@0.4.1': 99 + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} 100 + 101 + '@emmetio/html-matcher@1.3.0': 102 + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} 103 + 104 + '@emmetio/scanner@1.0.4': 105 + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} 106 + 107 + '@emmetio/stream-reader-utils@0.1.0': 108 + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} 109 + 110 + '@emmetio/stream-reader@2.2.0': 111 + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} 112 + 55 113 '@emnapi/runtime@1.8.1': 56 114 resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} 57 115 ··· 61 119 cpu: [ppc64] 62 120 os: [aix] 63 121 122 + '@esbuild/aix-ppc64@0.27.2': 123 + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} 124 + engines: {node: '>=18'} 125 + cpu: [ppc64] 126 + os: [aix] 127 + 64 128 '@esbuild/android-arm64@0.25.12': 65 129 resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 66 130 engines: {node: '>=18'} 67 131 cpu: [arm64] 68 132 os: [android] 69 133 134 + '@esbuild/android-arm64@0.27.2': 135 + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} 136 + engines: {node: '>=18'} 137 + cpu: [arm64] 138 + os: [android] 139 + 70 140 '@esbuild/android-arm@0.25.12': 71 141 resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 72 142 engines: {node: '>=18'} 73 143 cpu: [arm] 74 144 os: [android] 75 145 146 + '@esbuild/android-arm@0.27.2': 147 + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} 148 + engines: {node: '>=18'} 149 + cpu: [arm] 150 + os: [android] 151 + 76 152 '@esbuild/android-x64@0.25.12': 77 153 resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 78 154 engines: {node: '>=18'} 79 155 cpu: [x64] 80 156 os: [android] 81 157 158 + '@esbuild/android-x64@0.27.2': 159 + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} 160 + engines: {node: '>=18'} 161 + cpu: [x64] 162 + os: [android] 163 + 82 164 '@esbuild/darwin-arm64@0.25.12': 83 165 resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 84 166 engines: {node: '>=18'} 85 167 cpu: [arm64] 86 168 os: [darwin] 87 169 170 + '@esbuild/darwin-arm64@0.27.2': 171 + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} 172 + engines: {node: '>=18'} 173 + cpu: [arm64] 174 + os: [darwin] 175 + 88 176 '@esbuild/darwin-x64@0.25.12': 89 177 resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 178 + engines: {node: '>=18'} 179 + cpu: [x64] 180 + os: [darwin] 181 + 182 + '@esbuild/darwin-x64@0.27.2': 183 + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} 90 184 engines: {node: '>=18'} 91 185 cpu: [x64] 92 186 os: [darwin] ··· 97 191 cpu: [arm64] 98 192 os: [freebsd] 99 193 194 + '@esbuild/freebsd-arm64@0.27.2': 195 + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} 196 + engines: {node: '>=18'} 197 + cpu: [arm64] 198 + os: [freebsd] 199 + 100 200 '@esbuild/freebsd-x64@0.25.12': 101 201 resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 102 202 engines: {node: '>=18'} 103 203 cpu: [x64] 104 204 os: [freebsd] 105 205 206 + '@esbuild/freebsd-x64@0.27.2': 207 + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} 208 + engines: {node: '>=18'} 209 + cpu: [x64] 210 + os: [freebsd] 211 + 106 212 '@esbuild/linux-arm64@0.25.12': 107 213 resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 108 214 engines: {node: '>=18'} 109 215 cpu: [arm64] 110 216 os: [linux] 111 217 218 + '@esbuild/linux-arm64@0.27.2': 219 + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} 220 + engines: {node: '>=18'} 221 + cpu: [arm64] 222 + os: [linux] 223 + 112 224 '@esbuild/linux-arm@0.25.12': 113 225 resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 114 226 engines: {node: '>=18'} 115 227 cpu: [arm] 116 228 os: [linux] 117 229 230 + '@esbuild/linux-arm@0.27.2': 231 + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} 232 + engines: {node: '>=18'} 233 + cpu: [arm] 234 + os: [linux] 235 + 118 236 '@esbuild/linux-ia32@0.25.12': 119 237 resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 120 238 engines: {node: '>=18'} 121 239 cpu: [ia32] 122 240 os: [linux] 123 241 242 + '@esbuild/linux-ia32@0.27.2': 243 + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} 244 + engines: {node: '>=18'} 245 + cpu: [ia32] 246 + os: [linux] 247 + 124 248 '@esbuild/linux-loong64@0.25.12': 125 249 resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 126 250 engines: {node: '>=18'} 127 251 cpu: [loong64] 128 252 os: [linux] 129 253 254 + '@esbuild/linux-loong64@0.27.2': 255 + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} 256 + engines: {node: '>=18'} 257 + cpu: [loong64] 258 + os: [linux] 259 + 130 260 '@esbuild/linux-mips64el@0.25.12': 131 261 resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 132 262 engines: {node: '>=18'} 133 263 cpu: [mips64el] 134 264 os: [linux] 135 265 266 + '@esbuild/linux-mips64el@0.27.2': 267 + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} 268 + engines: {node: '>=18'} 269 + cpu: [mips64el] 270 + os: [linux] 271 + 136 272 '@esbuild/linux-ppc64@0.25.12': 137 273 resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 138 274 engines: {node: '>=18'} 139 275 cpu: [ppc64] 140 276 os: [linux] 141 277 278 + '@esbuild/linux-ppc64@0.27.2': 279 + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} 280 + engines: {node: '>=18'} 281 + cpu: [ppc64] 282 + os: [linux] 283 + 142 284 '@esbuild/linux-riscv64@0.25.12': 143 285 resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 144 286 engines: {node: '>=18'} 145 287 cpu: [riscv64] 146 288 os: [linux] 147 289 290 + '@esbuild/linux-riscv64@0.27.2': 291 + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} 292 + engines: {node: '>=18'} 293 + cpu: [riscv64] 294 + os: [linux] 295 + 148 296 '@esbuild/linux-s390x@0.25.12': 149 297 resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 150 298 engines: {node: '>=18'} 151 299 cpu: [s390x] 152 300 os: [linux] 153 301 302 + '@esbuild/linux-s390x@0.27.2': 303 + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} 304 + engines: {node: '>=18'} 305 + cpu: [s390x] 306 + os: [linux] 307 + 154 308 '@esbuild/linux-x64@0.25.12': 155 309 resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 156 310 engines: {node: '>=18'} 157 311 cpu: [x64] 158 312 os: [linux] 159 313 314 + '@esbuild/linux-x64@0.27.2': 315 + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} 316 + engines: {node: '>=18'} 317 + cpu: [x64] 318 + os: [linux] 319 + 160 320 '@esbuild/netbsd-arm64@0.25.12': 161 321 resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 162 322 engines: {node: '>=18'} 163 323 cpu: [arm64] 164 324 os: [netbsd] 165 325 326 + '@esbuild/netbsd-arm64@0.27.2': 327 + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} 328 + engines: {node: '>=18'} 329 + cpu: [arm64] 330 + os: [netbsd] 331 + 166 332 '@esbuild/netbsd-x64@0.25.12': 167 333 resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 334 + engines: {node: '>=18'} 335 + cpu: [x64] 336 + os: [netbsd] 337 + 338 + '@esbuild/netbsd-x64@0.27.2': 339 + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} 168 340 engines: {node: '>=18'} 169 341 cpu: [x64] 170 342 os: [netbsd] 171 343 172 344 '@esbuild/openbsd-arm64@0.25.12': 173 345 resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 346 + engines: {node: '>=18'} 347 + cpu: [arm64] 348 + os: [openbsd] 349 + 350 + '@esbuild/openbsd-arm64@0.27.2': 351 + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} 174 352 engines: {node: '>=18'} 175 353 cpu: [arm64] 176 354 os: [openbsd] ··· 181 359 cpu: [x64] 182 360 os: [openbsd] 183 361 362 + '@esbuild/openbsd-x64@0.27.2': 363 + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} 364 + engines: {node: '>=18'} 365 + cpu: [x64] 366 + os: [openbsd] 367 + 184 368 '@esbuild/openharmony-arm64@0.25.12': 185 369 resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 370 + engines: {node: '>=18'} 371 + cpu: [arm64] 372 + os: [openharmony] 373 + 374 + '@esbuild/openharmony-arm64@0.27.2': 375 + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} 186 376 engines: {node: '>=18'} 187 377 cpu: [arm64] 188 378 os: [openharmony] ··· 193 383 cpu: [x64] 194 384 os: [sunos] 195 385 386 + '@esbuild/sunos-x64@0.27.2': 387 + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} 388 + engines: {node: '>=18'} 389 + cpu: [x64] 390 + os: [sunos] 391 + 196 392 '@esbuild/win32-arm64@0.25.12': 197 393 resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 394 + engines: {node: '>=18'} 395 + cpu: [arm64] 396 + os: [win32] 397 + 398 + '@esbuild/win32-arm64@0.27.2': 399 + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} 198 400 engines: {node: '>=18'} 199 401 cpu: [arm64] 200 402 os: [win32] ··· 205 407 cpu: [ia32] 206 408 os: [win32] 207 409 410 + '@esbuild/win32-ia32@0.27.2': 411 + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} 412 + engines: {node: '>=18'} 413 + cpu: [ia32] 414 + os: [win32] 415 + 208 416 '@esbuild/win32-x64@0.25.12': 209 417 resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 418 + engines: {node: '>=18'} 419 + cpu: [x64] 420 + os: [win32] 421 + 422 + '@esbuild/win32-x64@0.27.2': 423 + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} 210 424 engines: {node: '>=18'} 211 425 cpu: [x64] 212 426 os: [win32] ··· 527 741 '@types/nlcst@2.0.3': 528 742 resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} 529 743 744 + '@types/node@22.19.7': 745 + resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} 746 + 530 747 '@types/unist@3.0.3': 531 748 resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 532 749 533 750 '@ungap/structured-clone@1.3.0': 534 751 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 535 752 753 + '@volar/kit@2.4.28': 754 + resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} 755 + peerDependencies: 756 + typescript: '*' 757 + 758 + '@volar/language-core@2.4.28': 759 + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} 760 + 761 + '@volar/language-server@2.4.28': 762 + resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} 763 + 764 + '@volar/language-service@2.4.28': 765 + resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} 766 + 767 + '@volar/source-map@2.4.28': 768 + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} 769 + 770 + '@volar/typescript@2.4.28': 771 + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} 772 + 773 + '@vscode/emmet-helper@2.11.0': 774 + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} 775 + 776 + '@vscode/l10n@0.0.18': 777 + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} 778 + 536 779 acorn@8.15.0: 537 780 resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 538 781 engines: {node: '>=0.4.0'} 539 782 hasBin: true 540 783 784 + ajv-draft-04@1.0.0: 785 + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} 786 + peerDependencies: 787 + ajv: ^8.5.0 788 + peerDependenciesMeta: 789 + ajv: 790 + optional: true 791 + 792 + ajv@8.17.1: 793 + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 794 + 541 795 ansi-align@3.0.1: 542 796 resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 543 797 ··· 548 802 ansi-regex@6.2.2: 549 803 resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} 550 804 engines: {node: '>=12'} 805 + 806 + ansi-styles@4.3.0: 807 + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 808 + engines: {node: '>=8'} 551 809 552 810 ansi-styles@6.2.3: 553 811 resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} ··· 609 867 character-entities@2.0.2: 610 868 resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 611 869 870 + chokidar@4.0.3: 871 + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 872 + engines: {node: '>= 14.16.0'} 873 + 612 874 chokidar@5.0.0: 613 875 resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} 614 876 engines: {node: '>= 20.19.0'} ··· 621 883 resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 622 884 engines: {node: '>=10'} 623 885 886 + cliui@8.0.1: 887 + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 888 + engines: {node: '>=12'} 889 + 624 890 clsx@2.1.1: 625 891 resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 626 892 engines: {node: '>=6'} 893 + 894 + color-convert@2.0.1: 895 + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 896 + engines: {node: '>=7.0.0'} 897 + 898 + color-name@1.1.4: 899 + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 627 900 628 901 comma-separated-tokens@2.0.3: 629 902 resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} ··· 729 1002 resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} 730 1003 engines: {node: '>=4'} 731 1004 1005 + emmet@2.4.11: 1006 + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} 1007 + 732 1008 emoji-regex@10.6.0: 733 1009 resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} 734 1010 ··· 751 1027 engines: {node: '>=18'} 752 1028 hasBin: true 753 1029 1030 + esbuild@0.27.2: 1031 + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} 1032 + engines: {node: '>=18'} 1033 + hasBin: true 1034 + 1035 + escalade@3.2.0: 1036 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1037 + engines: {node: '>=6'} 1038 + 754 1039 escape-string-regexp@5.0.0: 755 1040 resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 756 1041 engines: {node: '>=12'} ··· 766 1051 767 1052 extend@3.0.2: 768 1053 resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 1054 + 1055 + fast-deep-equal@3.1.3: 1056 + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1057 + 1058 + fast-uri@3.1.0: 1059 + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} 769 1060 770 1061 fdir@6.5.0: 771 1062 resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} ··· 792 1083 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 793 1084 os: [darwin] 794 1085 1086 + get-caller-file@2.0.5: 1087 + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1088 + engines: {node: 6.* || 8.* || >= 10.*} 1089 + 795 1090 get-east-asian-width@1.4.0: 796 1091 resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} 797 1092 engines: {node: '>=18'} 1093 + 1094 + get-tsconfig@4.13.1: 1095 + resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} 798 1096 799 1097 github-slugger@2.0.0: 800 1098 resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} ··· 873 1171 resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 874 1172 hasBin: true 875 1173 1174 + json-schema-traverse@1.0.0: 1175 + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1176 + 1177 + jsonc-parser@2.3.1: 1178 + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} 1179 + 1180 + jsonc-parser@3.3.1: 1181 + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} 1182 + 876 1183 kleur@3.0.3: 877 1184 resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 878 1185 engines: {node: '>=6'} 879 1186 1187 + kleur@4.1.5: 1188 + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1189 + engines: {node: '>=6'} 1190 + 1191 + lodash@4.17.21: 1192 + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1193 + 880 1194 longest-streak@3.1.0: 881 1195 resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 882 1196 ··· 1029 1343 ms@2.1.3: 1030 1344 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1031 1345 1346 + muggle-string@0.4.1: 1347 + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 1348 + 1032 1349 nanoid@3.3.11: 1033 1350 resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1034 1351 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} ··· 1087 1404 parse5@7.3.0: 1088 1405 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 1089 1406 1407 + path-browserify@1.0.1: 1408 + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 1409 + 1090 1410 piccolore@0.1.3: 1091 1411 resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} 1092 1412 ··· 1105 1425 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1106 1426 engines: {node: ^10 || ^12 || >=14} 1107 1427 1428 + prettier@3.8.1: 1429 + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} 1430 + engines: {node: '>=14'} 1431 + hasBin: true 1432 + 1108 1433 prismjs@1.30.0: 1109 1434 resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} 1110 1435 engines: {node: '>=6'} ··· 1118 1443 1119 1444 radix3@1.1.2: 1120 1445 resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} 1446 + 1447 + readdirp@4.1.2: 1448 + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1449 + engines: {node: '>= 14.18.0'} 1121 1450 1122 1451 readdirp@5.0.0: 1123 1452 resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} ··· 1159 1488 1160 1489 remark-stringify@11.0.0: 1161 1490 resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} 1491 + 1492 + request-light@0.5.8: 1493 + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} 1494 + 1495 + request-light@0.7.0: 1496 + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} 1497 + 1498 + require-directory@2.1.1: 1499 + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1500 + engines: {node: '>=0.10.0'} 1501 + 1502 + require-from-string@2.0.2: 1503 + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1504 + engines: {node: '>=0.10.0'} 1505 + 1506 + resolve-pkg-maps@1.0.0: 1507 + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1162 1508 1163 1509 retext-latin@4.0.0: 1164 1510 resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} ··· 1261 1607 tslib@2.8.1: 1262 1608 resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1263 1609 1610 + tsx@4.21.0: 1611 + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} 1612 + engines: {node: '>=18.0.0'} 1613 + hasBin: true 1614 + 1264 1615 type-fest@4.41.0: 1265 1616 resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 1266 1617 engines: {node: '>=16'} 1267 1618 1619 + typesafe-path@0.2.2: 1620 + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} 1621 + 1622 + typescript-auto-import-cache@0.3.6: 1623 + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} 1624 + 1268 1625 typescript@5.9.3: 1269 1626 resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1270 1627 engines: {node: '>=14.17'} ··· 1278 1635 1279 1636 uncrypto@0.1.3: 1280 1637 resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} 1638 + 1639 + undici-types@6.21.0: 1640 + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1281 1641 1282 1642 unified@11.0.5: 1283 1643 resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} ··· 1431 1791 vite: 1432 1792 optional: true 1433 1793 1794 + volar-service-css@0.0.68: 1795 + resolution: {integrity: sha512-lJSMh6f3QzZ1tdLOZOzovLX0xzAadPhx8EKwraDLPxBndLCYfoTvnNuiFFV8FARrpAlW5C0WkH+TstPaCxr00Q==} 1796 + peerDependencies: 1797 + '@volar/language-service': ~2.4.0 1798 + peerDependenciesMeta: 1799 + '@volar/language-service': 1800 + optional: true 1801 + 1802 + volar-service-emmet@0.0.68: 1803 + resolution: {integrity: sha512-nHvixrRQ83EzkQ4G/jFxu9Y4eSsXS/X2cltEPDM+K9qZmIv+Ey1w0tg1+6caSe8TU5Hgw4oSTwNMf/6cQb3LzQ==} 1804 + peerDependencies: 1805 + '@volar/language-service': ~2.4.0 1806 + peerDependenciesMeta: 1807 + '@volar/language-service': 1808 + optional: true 1809 + 1810 + volar-service-html@0.0.68: 1811 + resolution: {integrity: sha512-fru9gsLJxy33xAltXOh4TEdi312HP80hpuKhpYQD4O5hDnkNPEBdcQkpB+gcX0oK0VxRv1UOzcGQEUzWCVHLfA==} 1812 + peerDependencies: 1813 + '@volar/language-service': ~2.4.0 1814 + peerDependenciesMeta: 1815 + '@volar/language-service': 1816 + optional: true 1817 + 1818 + volar-service-prettier@0.0.68: 1819 + resolution: {integrity: sha512-grUmWHkHlebMOd6V8vXs2eNQUw/bJGJMjekh/EPf/p2ZNTK0Uyz7hoBRngcvGfJHMsSXZH8w/dZTForIW/4ihw==} 1820 + peerDependencies: 1821 + '@volar/language-service': ~2.4.0 1822 + prettier: ^2.2 || ^3.0 1823 + peerDependenciesMeta: 1824 + '@volar/language-service': 1825 + optional: true 1826 + prettier: 1827 + optional: true 1828 + 1829 + volar-service-typescript-twoslash-queries@0.0.68: 1830 + resolution: {integrity: sha512-NugzXcM0iwuZFLCJg47vI93su5YhTIweQuLmZxvz5ZPTaman16JCvmDZexx2rd5T/75SNuvvZmrTOTNYUsfe5w==} 1831 + peerDependencies: 1832 + '@volar/language-service': ~2.4.0 1833 + peerDependenciesMeta: 1834 + '@volar/language-service': 1835 + optional: true 1836 + 1837 + volar-service-typescript@0.0.68: 1838 + resolution: {integrity: sha512-z7B/7CnJ0+TWWFp/gh2r5/QwMObHNDiQiv4C9pTBNI2Wxuwymd4bjEORzrJ/hJ5Yd5+OzeYK+nFCKevoGEEeKw==} 1839 + peerDependencies: 1840 + '@volar/language-service': ~2.4.0 1841 + peerDependenciesMeta: 1842 + '@volar/language-service': 1843 + optional: true 1844 + 1845 + volar-service-yaml@0.0.68: 1846 + resolution: {integrity: sha512-84XgE02LV0OvTcwfqhcSwVg4of3MLNUWPMArO6Aj8YXqyEVnPu8xTEMY2btKSq37mVAPuaEVASI4e3ptObmqcA==} 1847 + peerDependencies: 1848 + '@volar/language-service': ~2.4.0 1849 + peerDependenciesMeta: 1850 + '@volar/language-service': 1851 + optional: true 1852 + 1853 + vscode-css-languageservice@6.3.9: 1854 + resolution: {integrity: sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==} 1855 + 1856 + vscode-html-languageservice@5.6.1: 1857 + resolution: {integrity: sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA==} 1858 + 1859 + vscode-json-languageservice@4.1.8: 1860 + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} 1861 + engines: {npm: '>=7.0.0'} 1862 + 1863 + vscode-jsonrpc@8.2.0: 1864 + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} 1865 + engines: {node: '>=14.0.0'} 1866 + 1867 + vscode-languageserver-protocol@3.17.5: 1868 + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} 1869 + 1870 + vscode-languageserver-textdocument@1.0.12: 1871 + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} 1872 + 1873 + vscode-languageserver-types@3.17.5: 1874 + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} 1875 + 1876 + vscode-languageserver@9.0.1: 1877 + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} 1878 + hasBin: true 1879 + 1880 + vscode-nls@5.2.0: 1881 + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} 1882 + 1883 + vscode-uri@3.1.0: 1884 + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} 1885 + 1434 1886 web-namespaces@2.0.1: 1435 1887 resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 1436 1888 ··· 1442 1894 resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} 1443 1895 engines: {node: '>=18'} 1444 1896 1897 + wrap-ansi@7.0.0: 1898 + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1899 + engines: {node: '>=10'} 1900 + 1445 1901 wrap-ansi@9.0.2: 1446 1902 resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} 1447 1903 engines: {node: '>=18'} ··· 1449 1905 xxhash-wasm@1.1.0: 1450 1906 resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 1451 1907 1908 + y18n@5.0.8: 1909 + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1910 + engines: {node: '>=10'} 1911 + 1912 + yaml-language-server@1.19.2: 1913 + resolution: {integrity: sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==} 1914 + hasBin: true 1915 + 1916 + yaml@2.7.1: 1917 + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} 1918 + engines: {node: '>= 14'} 1919 + hasBin: true 1920 + 1921 + yaml@2.8.2: 1922 + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} 1923 + engines: {node: '>= 14.6'} 1924 + hasBin: true 1925 + 1452 1926 yargs-parser@21.1.1: 1453 1927 resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1928 + engines: {node: '>=12'} 1929 + 1930 + yargs@17.7.2: 1931 + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1454 1932 engines: {node: '>=12'} 1455 1933 1456 1934 yocto-queue@1.2.2: ··· 1484 1962 1485 1963 snapshots: 1486 1964 1965 + '@astrojs/check@0.9.6(prettier@3.8.1)(typescript@5.9.3)': 1966 + dependencies: 1967 + '@astrojs/language-server': 2.16.3(prettier@3.8.1)(typescript@5.9.3) 1968 + chokidar: 4.0.3 1969 + kleur: 4.1.5 1970 + typescript: 5.9.3 1971 + yargs: 17.7.2 1972 + transitivePeerDependencies: 1973 + - prettier 1974 + - prettier-plugin-astro 1975 + 1487 1976 '@astrojs/compiler@2.13.0': {} 1488 1977 1489 1978 '@astrojs/internal-helpers@0.7.5': {} 1490 1979 1980 + '@astrojs/language-server@2.16.3(prettier@3.8.1)(typescript@5.9.3)': 1981 + dependencies: 1982 + '@astrojs/compiler': 2.13.0 1983 + '@astrojs/yaml2ts': 0.2.2 1984 + '@jridgewell/sourcemap-codec': 1.5.5 1985 + '@volar/kit': 2.4.28(typescript@5.9.3) 1986 + '@volar/language-core': 2.4.28 1987 + '@volar/language-server': 2.4.28 1988 + '@volar/language-service': 2.4.28 1989 + muggle-string: 0.4.1 1990 + tinyglobby: 0.2.15 1991 + volar-service-css: 0.0.68(@volar/language-service@2.4.28) 1992 + volar-service-emmet: 0.0.68(@volar/language-service@2.4.28) 1993 + volar-service-html: 0.0.68(@volar/language-service@2.4.28) 1994 + volar-service-prettier: 0.0.68(@volar/language-service@2.4.28)(prettier@3.8.1) 1995 + volar-service-typescript: 0.0.68(@volar/language-service@2.4.28) 1996 + volar-service-typescript-twoslash-queries: 0.0.68(@volar/language-service@2.4.28) 1997 + volar-service-yaml: 0.0.68(@volar/language-service@2.4.28) 1998 + vscode-html-languageservice: 5.6.1 1999 + vscode-uri: 3.1.0 2000 + optionalDependencies: 2001 + prettier: 3.8.1 2002 + transitivePeerDependencies: 2003 + - typescript 2004 + 1491 2005 '@astrojs/markdown-remark@6.3.10': 1492 2006 dependencies: 1493 2007 '@astrojs/internal-helpers': 0.7.5 ··· 1530 2044 transitivePeerDependencies: 1531 2045 - supports-color 1532 2046 2047 + '@astrojs/yaml2ts@0.2.2': 2048 + dependencies: 2049 + yaml: 2.8.2 2050 + 1533 2051 '@babel/helper-string-parser@7.27.1': {} 1534 2052 1535 2053 '@babel/helper-validator-identifier@7.28.5': {} ··· 1547 2065 dependencies: 1548 2066 fontkitten: 1.0.2 1549 2067 2068 + '@emmetio/abbreviation@2.3.3': 2069 + dependencies: 2070 + '@emmetio/scanner': 1.0.4 2071 + 2072 + '@emmetio/css-abbreviation@2.1.8': 2073 + dependencies: 2074 + '@emmetio/scanner': 1.0.4 2075 + 2076 + '@emmetio/css-parser@0.4.1': 2077 + dependencies: 2078 + '@emmetio/stream-reader': 2.2.0 2079 + '@emmetio/stream-reader-utils': 0.1.0 2080 + 2081 + '@emmetio/html-matcher@1.3.0': 2082 + dependencies: 2083 + '@emmetio/scanner': 1.0.4 2084 + 2085 + '@emmetio/scanner@1.0.4': {} 2086 + 2087 + '@emmetio/stream-reader-utils@0.1.0': {} 2088 + 2089 + '@emmetio/stream-reader@2.2.0': {} 2090 + 1550 2091 '@emnapi/runtime@1.8.1': 1551 2092 dependencies: 1552 2093 tslib: 2.8.1 1553 2094 optional: true 1554 2095 1555 2096 '@esbuild/aix-ppc64@0.25.12': 2097 + optional: true 2098 + 2099 + '@esbuild/aix-ppc64@0.27.2': 1556 2100 optional: true 1557 2101 1558 2102 '@esbuild/android-arm64@0.25.12': 1559 2103 optional: true 1560 2104 2105 + '@esbuild/android-arm64@0.27.2': 2106 + optional: true 2107 + 1561 2108 '@esbuild/android-arm@0.25.12': 1562 2109 optional: true 1563 2110 2111 + '@esbuild/android-arm@0.27.2': 2112 + optional: true 2113 + 1564 2114 '@esbuild/android-x64@0.25.12': 1565 2115 optional: true 1566 2116 2117 + '@esbuild/android-x64@0.27.2': 2118 + optional: true 2119 + 1567 2120 '@esbuild/darwin-arm64@0.25.12': 2121 + optional: true 2122 + 2123 + '@esbuild/darwin-arm64@0.27.2': 1568 2124 optional: true 1569 2125 1570 2126 '@esbuild/darwin-x64@0.25.12': 2127 + optional: true 2128 + 2129 + '@esbuild/darwin-x64@0.27.2': 1571 2130 optional: true 1572 2131 1573 2132 '@esbuild/freebsd-arm64@0.25.12': 1574 2133 optional: true 1575 2134 2135 + '@esbuild/freebsd-arm64@0.27.2': 2136 + optional: true 2137 + 1576 2138 '@esbuild/freebsd-x64@0.25.12': 1577 2139 optional: true 1578 2140 2141 + '@esbuild/freebsd-x64@0.27.2': 2142 + optional: true 2143 + 1579 2144 '@esbuild/linux-arm64@0.25.12': 1580 2145 optional: true 1581 2146 2147 + '@esbuild/linux-arm64@0.27.2': 2148 + optional: true 2149 + 1582 2150 '@esbuild/linux-arm@0.25.12': 2151 + optional: true 2152 + 2153 + '@esbuild/linux-arm@0.27.2': 1583 2154 optional: true 1584 2155 1585 2156 '@esbuild/linux-ia32@0.25.12': 2157 + optional: true 2158 + 2159 + '@esbuild/linux-ia32@0.27.2': 1586 2160 optional: true 1587 2161 1588 2162 '@esbuild/linux-loong64@0.25.12': 1589 2163 optional: true 1590 2164 2165 + '@esbuild/linux-loong64@0.27.2': 2166 + optional: true 2167 + 1591 2168 '@esbuild/linux-mips64el@0.25.12': 1592 2169 optional: true 1593 2170 2171 + '@esbuild/linux-mips64el@0.27.2': 2172 + optional: true 2173 + 1594 2174 '@esbuild/linux-ppc64@0.25.12': 1595 2175 optional: true 1596 2176 2177 + '@esbuild/linux-ppc64@0.27.2': 2178 + optional: true 2179 + 1597 2180 '@esbuild/linux-riscv64@0.25.12': 1598 2181 optional: true 1599 2182 2183 + '@esbuild/linux-riscv64@0.27.2': 2184 + optional: true 2185 + 1600 2186 '@esbuild/linux-s390x@0.25.12': 1601 2187 optional: true 1602 2188 2189 + '@esbuild/linux-s390x@0.27.2': 2190 + optional: true 2191 + 1603 2192 '@esbuild/linux-x64@0.25.12': 2193 + optional: true 2194 + 2195 + '@esbuild/linux-x64@0.27.2': 1604 2196 optional: true 1605 2197 1606 2198 '@esbuild/netbsd-arm64@0.25.12': 1607 2199 optional: true 1608 2200 2201 + '@esbuild/netbsd-arm64@0.27.2': 2202 + optional: true 2203 + 1609 2204 '@esbuild/netbsd-x64@0.25.12': 1610 2205 optional: true 1611 2206 2207 + '@esbuild/netbsd-x64@0.27.2': 2208 + optional: true 2209 + 1612 2210 '@esbuild/openbsd-arm64@0.25.12': 1613 2211 optional: true 1614 2212 2213 + '@esbuild/openbsd-arm64@0.27.2': 2214 + optional: true 2215 + 1615 2216 '@esbuild/openbsd-x64@0.25.12': 2217 + optional: true 2218 + 2219 + '@esbuild/openbsd-x64@0.27.2': 1616 2220 optional: true 1617 2221 1618 2222 '@esbuild/openharmony-arm64@0.25.12': 1619 2223 optional: true 1620 2224 2225 + '@esbuild/openharmony-arm64@0.27.2': 2226 + optional: true 2227 + 1621 2228 '@esbuild/sunos-x64@0.25.12': 1622 2229 optional: true 1623 2230 2231 + '@esbuild/sunos-x64@0.27.2': 2232 + optional: true 2233 + 1624 2234 '@esbuild/win32-arm64@0.25.12': 1625 2235 optional: true 1626 2236 2237 + '@esbuild/win32-arm64@0.27.2': 2238 + optional: true 2239 + 1627 2240 '@esbuild/win32-ia32@0.25.12': 2241 + optional: true 2242 + 2243 + '@esbuild/win32-ia32@0.27.2': 1628 2244 optional: true 1629 2245 1630 2246 '@esbuild/win32-x64@0.25.12': 2247 + optional: true 2248 + 2249 + '@esbuild/win32-x64@0.27.2': 1631 2250 optional: true 1632 2251 1633 2252 '@img/colour@1.0.0': ··· 1867 2486 dependencies: 1868 2487 '@types/unist': 3.0.3 1869 2488 2489 + '@types/node@22.19.7': 2490 + dependencies: 2491 + undici-types: 6.21.0 2492 + 1870 2493 '@types/unist@3.0.3': {} 1871 2494 1872 2495 '@ungap/structured-clone@1.3.0': {} 1873 2496 2497 + '@volar/kit@2.4.28(typescript@5.9.3)': 2498 + dependencies: 2499 + '@volar/language-service': 2.4.28 2500 + '@volar/typescript': 2.4.28 2501 + typesafe-path: 0.2.2 2502 + typescript: 5.9.3 2503 + vscode-languageserver-textdocument: 1.0.12 2504 + vscode-uri: 3.1.0 2505 + 2506 + '@volar/language-core@2.4.28': 2507 + dependencies: 2508 + '@volar/source-map': 2.4.28 2509 + 2510 + '@volar/language-server@2.4.28': 2511 + dependencies: 2512 + '@volar/language-core': 2.4.28 2513 + '@volar/language-service': 2.4.28 2514 + '@volar/typescript': 2.4.28 2515 + path-browserify: 1.0.1 2516 + request-light: 0.7.0 2517 + vscode-languageserver: 9.0.1 2518 + vscode-languageserver-protocol: 3.17.5 2519 + vscode-languageserver-textdocument: 1.0.12 2520 + vscode-uri: 3.1.0 2521 + 2522 + '@volar/language-service@2.4.28': 2523 + dependencies: 2524 + '@volar/language-core': 2.4.28 2525 + vscode-languageserver-protocol: 3.17.5 2526 + vscode-languageserver-textdocument: 1.0.12 2527 + vscode-uri: 3.1.0 2528 + 2529 + '@volar/source-map@2.4.28': {} 2530 + 2531 + '@volar/typescript@2.4.28': 2532 + dependencies: 2533 + '@volar/language-core': 2.4.28 2534 + path-browserify: 1.0.1 2535 + vscode-uri: 3.1.0 2536 + 2537 + '@vscode/emmet-helper@2.11.0': 2538 + dependencies: 2539 + emmet: 2.4.11 2540 + jsonc-parser: 2.3.1 2541 + vscode-languageserver-textdocument: 1.0.12 2542 + vscode-languageserver-types: 3.17.5 2543 + vscode-uri: 3.1.0 2544 + 2545 + '@vscode/l10n@0.0.18': {} 2546 + 1874 2547 acorn@8.15.0: {} 1875 2548 2549 + ajv-draft-04@1.0.0(ajv@8.17.1): 2550 + optionalDependencies: 2551 + ajv: 8.17.1 2552 + 2553 + ajv@8.17.1: 2554 + dependencies: 2555 + fast-deep-equal: 3.1.3 2556 + fast-uri: 3.1.0 2557 + json-schema-traverse: 1.0.0 2558 + require-from-string: 2.0.2 2559 + 1876 2560 ansi-align@3.0.1: 1877 2561 dependencies: 1878 2562 string-width: 4.2.3 ··· 1881 2565 1882 2566 ansi-regex@6.2.2: {} 1883 2567 2568 + ansi-styles@4.3.0: 2569 + dependencies: 2570 + color-convert: 2.0.1 2571 + 1884 2572 ansi-styles@6.2.3: {} 1885 2573 1886 2574 anymatch@3.1.3: ··· 1894 2582 1895 2583 array-iterate@2.0.1: {} 1896 2584 1897 - astro@5.17.1(rollup@4.57.1)(typescript@5.9.3): 2585 + astro@5.17.1(@types/node@22.19.7)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): 1898 2586 dependencies: 1899 2587 '@astrojs/compiler': 2.13.0 1900 2588 '@astrojs/internal-helpers': 0.7.5 ··· 1951 2639 unist-util-visit: 5.1.0 1952 2640 unstorage: 1.17.4 1953 2641 vfile: 6.0.3 1954 - vite: 6.4.1 1955 - vitefu: 1.1.1(vite@6.4.1) 2642 + vite: 6.4.1(@types/node@22.19.7)(tsx@4.21.0)(yaml@2.8.2) 2643 + vitefu: 1.1.1(vite@6.4.1(@types/node@22.19.7)(tsx@4.21.0)(yaml@2.8.2)) 1956 2644 xxhash-wasm: 1.1.0 1957 2645 yargs-parser: 21.1.1 1958 2646 yocto-spinner: 0.2.3 ··· 2027 2715 2028 2716 character-entities@2.0.2: {} 2029 2717 2718 + chokidar@4.0.3: 2719 + dependencies: 2720 + readdirp: 4.1.2 2721 + 2030 2722 chokidar@5.0.0: 2031 2723 dependencies: 2032 2724 readdirp: 5.0.0 ··· 2035 2727 2036 2728 cli-boxes@3.0.0: {} 2037 2729 2730 + cliui@8.0.1: 2731 + dependencies: 2732 + string-width: 4.2.3 2733 + strip-ansi: 6.0.1 2734 + wrap-ansi: 7.0.0 2735 + 2038 2736 clsx@2.1.1: {} 2039 2737 2738 + color-convert@2.0.1: 2739 + dependencies: 2740 + color-name: 1.1.4 2741 + 2742 + color-name@1.1.4: {} 2743 + 2040 2744 comma-separated-tokens@2.0.3: {} 2041 2745 2042 2746 commander@11.1.0: {} ··· 2128 2832 2129 2833 dset@3.1.4: {} 2130 2834 2835 + emmet@2.4.11: 2836 + dependencies: 2837 + '@emmetio/abbreviation': 2.3.3 2838 + '@emmetio/css-abbreviation': 2.1.8 2839 + 2131 2840 emoji-regex@10.6.0: {} 2132 2841 2133 2842 emoji-regex@8.0.0: {} ··· 2167 2876 '@esbuild/win32-ia32': 0.25.12 2168 2877 '@esbuild/win32-x64': 0.25.12 2169 2878 2879 + esbuild@0.27.2: 2880 + optionalDependencies: 2881 + '@esbuild/aix-ppc64': 0.27.2 2882 + '@esbuild/android-arm': 0.27.2 2883 + '@esbuild/android-arm64': 0.27.2 2884 + '@esbuild/android-x64': 0.27.2 2885 + '@esbuild/darwin-arm64': 0.27.2 2886 + '@esbuild/darwin-x64': 0.27.2 2887 + '@esbuild/freebsd-arm64': 0.27.2 2888 + '@esbuild/freebsd-x64': 0.27.2 2889 + '@esbuild/linux-arm': 0.27.2 2890 + '@esbuild/linux-arm64': 0.27.2 2891 + '@esbuild/linux-ia32': 0.27.2 2892 + '@esbuild/linux-loong64': 0.27.2 2893 + '@esbuild/linux-mips64el': 0.27.2 2894 + '@esbuild/linux-ppc64': 0.27.2 2895 + '@esbuild/linux-riscv64': 0.27.2 2896 + '@esbuild/linux-s390x': 0.27.2 2897 + '@esbuild/linux-x64': 0.27.2 2898 + '@esbuild/netbsd-arm64': 0.27.2 2899 + '@esbuild/netbsd-x64': 0.27.2 2900 + '@esbuild/openbsd-arm64': 0.27.2 2901 + '@esbuild/openbsd-x64': 0.27.2 2902 + '@esbuild/openharmony-arm64': 0.27.2 2903 + '@esbuild/sunos-x64': 0.27.2 2904 + '@esbuild/win32-arm64': 0.27.2 2905 + '@esbuild/win32-ia32': 0.27.2 2906 + '@esbuild/win32-x64': 0.27.2 2907 + 2908 + escalade@3.2.0: {} 2909 + 2170 2910 escape-string-regexp@5.0.0: {} 2171 2911 2172 2912 estree-walker@2.0.2: {} ··· 2179 2919 2180 2920 extend@3.0.2: {} 2181 2921 2922 + fast-deep-equal@3.1.3: {} 2923 + 2924 + fast-uri@3.1.0: {} 2925 + 2182 2926 fdir@6.5.0(picomatch@4.0.3): 2183 2927 optionalDependencies: 2184 2928 picomatch: 4.0.3 ··· 2196 2940 fsevents@2.3.3: 2197 2941 optional: true 2198 2942 2943 + get-caller-file@2.0.5: {} 2944 + 2199 2945 get-east-asian-width@1.4.0: {} 2946 + 2947 + get-tsconfig@4.13.1: 2948 + dependencies: 2949 + resolve-pkg-maps: 1.0.0 2200 2950 2201 2951 github-slugger@2.0.0: {} 2202 2952 ··· 2327 3077 dependencies: 2328 3078 argparse: 2.0.1 2329 3079 3080 + json-schema-traverse@1.0.0: {} 3081 + 3082 + jsonc-parser@2.3.1: {} 3083 + 3084 + jsonc-parser@3.3.1: {} 3085 + 2330 3086 kleur@3.0.3: {} 2331 3087 3088 + kleur@4.1.5: {} 3089 + 3090 + lodash@4.17.21: {} 3091 + 2332 3092 longest-streak@3.1.0: {} 2333 3093 2334 3094 lru-cache@11.2.5: {} ··· 2664 3424 2665 3425 ms@2.1.3: {} 2666 3426 3427 + muggle-string@0.4.1: {} 3428 + 2667 3429 nanoid@3.3.11: {} 2668 3430 2669 3431 neotraverse@0.6.18: {} ··· 2724 3486 dependencies: 2725 3487 entities: 6.0.1 2726 3488 3489 + path-browserify@1.0.1: {} 3490 + 2727 3491 piccolore@0.1.3: {} 2728 3492 2729 3493 picocolors@1.1.1: {} ··· 2738 3502 picocolors: 1.1.1 2739 3503 source-map-js: 1.2.1 2740 3504 3505 + prettier@3.8.1: {} 3506 + 2741 3507 prismjs@1.30.0: {} 2742 3508 2743 3509 prompts@2.4.2: ··· 2749 3515 2750 3516 radix3@1.1.2: {} 2751 3517 3518 + readdirp@4.1.2: {} 3519 + 2752 3520 readdirp@5.0.0: {} 2753 3521 2754 3522 regex-recursion@6.0.2: ··· 2827 3595 mdast-util-to-markdown: 2.1.2 2828 3596 unified: 11.0.5 2829 3597 3598 + request-light@0.5.8: {} 3599 + 3600 + request-light@0.7.0: {} 3601 + 3602 + require-directory@2.1.1: {} 3603 + 3604 + require-from-string@2.0.2: {} 3605 + 3606 + resolve-pkg-maps@1.0.0: {} 3607 + 2830 3608 retext-latin@4.0.0: 2831 3609 dependencies: 2832 3610 '@types/nlcst': 2.0.3 ··· 2993 3771 tslib@2.8.1: 2994 3772 optional: true 2995 3773 3774 + tsx@4.21.0: 3775 + dependencies: 3776 + esbuild: 0.27.2 3777 + get-tsconfig: 4.13.1 3778 + optionalDependencies: 3779 + fsevents: 2.3.3 3780 + 2996 3781 type-fest@4.41.0: {} 2997 3782 3783 + typesafe-path@0.2.2: {} 3784 + 3785 + typescript-auto-import-cache@0.3.6: 3786 + dependencies: 3787 + semver: 7.7.3 3788 + 2998 3789 typescript@5.9.3: {} 2999 3790 3000 3791 ufo@1.6.3: {} ··· 3002 3793 ultrahtml@1.6.0: {} 3003 3794 3004 3795 uncrypto@0.1.3: {} 3796 + 3797 + undici-types@6.21.0: {} 3005 3798 3006 3799 unified@11.0.5: 3007 3800 dependencies: ··· 3087 3880 '@types/unist': 3.0.3 3088 3881 vfile-message: 4.0.3 3089 3882 3090 - vite@6.4.1: 3883 + vite@6.4.1(@types/node@22.19.7)(tsx@4.21.0)(yaml@2.8.2): 3091 3884 dependencies: 3092 3885 esbuild: 0.25.12 3093 3886 fdir: 6.5.0(picomatch@4.0.3) ··· 3096 3889 rollup: 4.57.1 3097 3890 tinyglobby: 0.2.15 3098 3891 optionalDependencies: 3892 + '@types/node': 22.19.7 3099 3893 fsevents: 2.3.3 3894 + tsx: 4.21.0 3895 + yaml: 2.8.2 3100 3896 3101 - vitefu@1.1.1(vite@6.4.1): 3897 + vitefu@1.1.1(vite@6.4.1(@types/node@22.19.7)(tsx@4.21.0)(yaml@2.8.2)): 3898 + optionalDependencies: 3899 + vite: 6.4.1(@types/node@22.19.7)(tsx@4.21.0)(yaml@2.8.2) 3900 + 3901 + volar-service-css@0.0.68(@volar/language-service@2.4.28): 3902 + dependencies: 3903 + vscode-css-languageservice: 6.3.9 3904 + vscode-languageserver-textdocument: 1.0.12 3905 + vscode-uri: 3.1.0 3102 3906 optionalDependencies: 3103 - vite: 6.4.1 3907 + '@volar/language-service': 2.4.28 3908 + 3909 + volar-service-emmet@0.0.68(@volar/language-service@2.4.28): 3910 + dependencies: 3911 + '@emmetio/css-parser': 0.4.1 3912 + '@emmetio/html-matcher': 1.3.0 3913 + '@vscode/emmet-helper': 2.11.0 3914 + vscode-uri: 3.1.0 3915 + optionalDependencies: 3916 + '@volar/language-service': 2.4.28 3917 + 3918 + volar-service-html@0.0.68(@volar/language-service@2.4.28): 3919 + dependencies: 3920 + vscode-html-languageservice: 5.6.1 3921 + vscode-languageserver-textdocument: 1.0.12 3922 + vscode-uri: 3.1.0 3923 + optionalDependencies: 3924 + '@volar/language-service': 2.4.28 3925 + 3926 + volar-service-prettier@0.0.68(@volar/language-service@2.4.28)(prettier@3.8.1): 3927 + dependencies: 3928 + vscode-uri: 3.1.0 3929 + optionalDependencies: 3930 + '@volar/language-service': 2.4.28 3931 + prettier: 3.8.1 3932 + 3933 + volar-service-typescript-twoslash-queries@0.0.68(@volar/language-service@2.4.28): 3934 + dependencies: 3935 + vscode-uri: 3.1.0 3936 + optionalDependencies: 3937 + '@volar/language-service': 2.4.28 3938 + 3939 + volar-service-typescript@0.0.68(@volar/language-service@2.4.28): 3940 + dependencies: 3941 + path-browserify: 1.0.1 3942 + semver: 7.7.3 3943 + typescript-auto-import-cache: 0.3.6 3944 + vscode-languageserver-textdocument: 1.0.12 3945 + vscode-nls: 5.2.0 3946 + vscode-uri: 3.1.0 3947 + optionalDependencies: 3948 + '@volar/language-service': 2.4.28 3949 + 3950 + volar-service-yaml@0.0.68(@volar/language-service@2.4.28): 3951 + dependencies: 3952 + vscode-uri: 3.1.0 3953 + yaml-language-server: 1.19.2 3954 + optionalDependencies: 3955 + '@volar/language-service': 2.4.28 3956 + 3957 + vscode-css-languageservice@6.3.9: 3958 + dependencies: 3959 + '@vscode/l10n': 0.0.18 3960 + vscode-languageserver-textdocument: 1.0.12 3961 + vscode-languageserver-types: 3.17.5 3962 + vscode-uri: 3.1.0 3963 + 3964 + vscode-html-languageservice@5.6.1: 3965 + dependencies: 3966 + '@vscode/l10n': 0.0.18 3967 + vscode-languageserver-textdocument: 1.0.12 3968 + vscode-languageserver-types: 3.17.5 3969 + vscode-uri: 3.1.0 3970 + 3971 + vscode-json-languageservice@4.1.8: 3972 + dependencies: 3973 + jsonc-parser: 3.3.1 3974 + vscode-languageserver-textdocument: 1.0.12 3975 + vscode-languageserver-types: 3.17.5 3976 + vscode-nls: 5.2.0 3977 + vscode-uri: 3.1.0 3978 + 3979 + vscode-jsonrpc@8.2.0: {} 3980 + 3981 + vscode-languageserver-protocol@3.17.5: 3982 + dependencies: 3983 + vscode-jsonrpc: 8.2.0 3984 + vscode-languageserver-types: 3.17.5 3985 + 3986 + vscode-languageserver-textdocument@1.0.12: {} 3987 + 3988 + vscode-languageserver-types@3.17.5: {} 3989 + 3990 + vscode-languageserver@9.0.1: 3991 + dependencies: 3992 + vscode-languageserver-protocol: 3.17.5 3993 + 3994 + vscode-nls@5.2.0: {} 3995 + 3996 + vscode-uri@3.1.0: {} 3104 3997 3105 3998 web-namespaces@2.0.1: {} 3106 3999 ··· 3110 4003 dependencies: 3111 4004 string-width: 7.2.0 3112 4005 4006 + wrap-ansi@7.0.0: 4007 + dependencies: 4008 + ansi-styles: 4.3.0 4009 + string-width: 4.2.3 4010 + strip-ansi: 6.0.1 4011 + 3113 4012 wrap-ansi@9.0.2: 3114 4013 dependencies: 3115 4014 ansi-styles: 6.2.3 ··· 3118 4017 3119 4018 xxhash-wasm@1.1.0: {} 3120 4019 4020 + y18n@5.0.8: {} 4021 + 4022 + yaml-language-server@1.19.2: 4023 + dependencies: 4024 + '@vscode/l10n': 0.0.18 4025 + ajv: 8.17.1 4026 + ajv-draft-04: 1.0.0(ajv@8.17.1) 4027 + lodash: 4.17.21 4028 + prettier: 3.8.1 4029 + request-light: 0.5.8 4030 + vscode-json-languageservice: 4.1.8 4031 + vscode-languageserver: 9.0.1 4032 + vscode-languageserver-textdocument: 1.0.12 4033 + vscode-languageserver-types: 3.17.5 4034 + vscode-uri: 3.1.0 4035 + yaml: 2.7.1 4036 + 4037 + yaml@2.7.1: {} 4038 + 4039 + yaml@2.8.2: {} 4040 + 3121 4041 yargs-parser@21.1.1: {} 4042 + 4043 + yargs@17.7.2: 4044 + dependencies: 4045 + cliui: 8.0.1 4046 + escalade: 3.2.0 4047 + get-caller-file: 2.0.5 4048 + require-directory: 2.1.1 4049 + string-width: 4.2.3 4050 + y18n: 5.0.8 4051 + yargs-parser: 21.1.1 3122 4052 3123 4053 yocto-queue@1.2.2: {} 3124 4054
public/favicon.ico

This is a binary file and will not be displayed.

public/favicon.png

This is a binary file and will not be displayed.

-9
public/favicon.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128"> 2 - <path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" /> 3 - <style> 4 - path { fill: #000; } 5 - @media (prefers-color-scheme: dark) { 6 - path { fill: #FFF; } 7 - } 8 - </style> 9 - </svg>
+81
scripts/generate-digest.ts
··· 1 + import { writeFile, mkdir } from "node:fs/promises"; 2 + import { join } from "node:path"; 3 + import { PostSchema, type Topic } from "../src/lib/schema"; 4 + import { 5 + fetchGitHubEvents, 6 + fetchBlueskyEvents, 7 + generateSmartDigest, 8 + generateCatchyTitle, 9 + } from "../src/lib/events"; 10 + 11 + const POST_DIR = join(process.cwd(), "src/content/posts"); 12 + 13 + function pickWeightedTopic(topics: Topic[]): Topic { 14 + const totalWeight = topics.reduce((sum, t) => sum + t.relevanceScore, 0); 15 + let random = Math.random() * totalWeight; 16 + 17 + for (const topic of topics) { 18 + if (random < topic.relevanceScore) return topic; 19 + random -= topic.relevanceScore; 20 + } 21 + 22 + return topics[0]; 23 + } 24 + 25 + function getPostType(date: Date): "daily" | "nightly" { 26 + const hour = date.getUTCHours() + 1; 27 + const isMorning = hour >= 6 && hour <= 12; 28 + return isMorning ? "daily" : "nightly"; 29 + } 30 + 31 + async function run() { 32 + console.log("\n\x1b[1m🚀 Generating Intelligent Topic Digest\x1b[0m"); 33 + 34 + const now = new Date(); 35 + const twelveHoursAgo = new Date(now.getTime() - 12 * 60 * 60 * 1000); 36 + 37 + try { 38 + const [gh, bs] = await Promise.all([ 39 + fetchGitHubEvents(twelveHoursAgo), 40 + fetchBlueskyEvents(twelveHoursAgo), 41 + ]); 42 + 43 + const allEvents = [...gh, ...bs]; 44 + const topics = await generateSmartDigest(allEvents); 45 + 46 + if (topics.length === 0) { 47 + console.log("\x1b[33mNo topics found. Skipping generation.\x1b[0m"); 48 + return; 49 + } 50 + 51 + const heroTopic = pickWeightedTopic(topics); 52 + const catchyTitle = await generateCatchyTitle(heroTopic); 53 + 54 + const type = getPostType(now); 55 + const dateStr = now.toISOString().split("T")[0]; 56 + const slug = `${dateStr}-${type}`; 57 + 58 + const postData = { 59 + title: catchyTitle, 60 + date: now.toISOString(), 61 + type, 62 + topics, 63 + }; 64 + 65 + const validatedPost = PostSchema.parse(postData); 66 + 67 + await mkdir(POST_DIR, { recursive: true }); 68 + await writeFile( 69 + join(POST_DIR, `${slug}.json`), 70 + JSON.stringify(validatedPost, null, 2), 71 + ); 72 + 73 + console.log(`\x1b[32m✅ Digest complete: ${slug}.json\x1b[0m`); 74 + console.log(`\x1b[35m[TITLE]\x1b[0m ${catchyTitle}\n`); 75 + } catch (error) { 76 + console.error("\x1b[31mCritical Failure:\x1b[0m", error); 77 + process.exit(1); 78 + } 79 + } 80 + 81 + run();
+10
src/content.config.ts
··· 1 + import { defineCollection } from "astro:content"; 2 + import { glob } from "astro/loaders"; 3 + import { PostSchema } from "./lib/schema"; 4 + 5 + const posts = defineCollection({ 6 + loader: glob({ pattern: "**/[^_]*.json", base: "./src/content/posts" }), 7 + schema: PostSchema, 8 + }); 9 + 10 + export const collections = { posts };
+112
src/layouts/Layout.astro
··· 1 + --- 2 + interface Props { 3 + title: string; 4 + } 5 + 6 + const { title } = Astro.props; 7 + --- 8 + 9 + <!doctype html> 10 + <html lang="en"> 11 + <head> 12 + <meta charset="UTF-8" /> 13 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 14 + <link rel="icon" type="image/png" href="/favicon.png" /> 15 + <title>{title}</title> 16 + </head> 17 + <body> 18 + <div class="wrapper"> 19 + <header> 20 + <nav> 21 + <a href="/" class="logo">npmx.<span>digest</span></a> 22 + <div class="links"> 23 + <a href="/archive">Archive</a> 24 + <a href="https://github.com/npmx-dev/npmx.dev">GitHub</a 25 + > 26 + </div> 27 + </nav> 28 + </header> 29 + <main> 30 + <slot /> 31 + </main> 32 + <footer> 33 + <p>AI generated updates for the npmx ecosystem.</p> 34 + </footer> 35 + </div> 36 + </body> 37 + </html> 38 + 39 + <style is:global> 40 + :root { 41 + --bg: #050505; 42 + --text: #e5e5e5; 43 + --text-muted: #737373; 44 + --accent: #fff; 45 + } 46 + 47 + * { 48 + margin: 0; 49 + padding: 0; 50 + box-sizing: border-box; 51 + } 52 + 53 + body { 54 + background: var(--bg); 55 + color: var(--text); 56 + font-family: ui-sans-serif, system-ui, sans-serif; 57 + -webkit-font-smoothing: antialiased; 58 + } 59 + 60 + .wrapper { 61 + max-width: 650px; 62 + margin: 0 auto; 63 + padding: 2rem 1.5rem; 64 + } 65 + 66 + header { 67 + margin-bottom: 4rem; 68 + } 69 + 70 + nav { 71 + display: flex; 72 + justify-content: space-between; 73 + align-items: baseline; 74 + } 75 + 76 + .logo { 77 + font-weight: 700; 78 + text-decoration: none; 79 + color: var(--accent); 80 + font-size: 1.2rem; 81 + letter-spacing: -0.02em; 82 + } 83 + 84 + .logo span { 85 + color: var(--text-muted); 86 + font-weight: 400; 87 + } 88 + 89 + .links { 90 + display: flex; 91 + gap: 1.5rem; 92 + } 93 + 94 + .links a { 95 + color: var(--text-muted); 96 + text-decoration: none; 97 + font-size: 0.9rem; 98 + transition: color 0.2s; 99 + } 100 + 101 + .links a:hover { 102 + color: var(--accent); 103 + } 104 + 105 + footer { 106 + margin-top: 6rem; 107 + padding-top: 2rem; 108 + border-top: 1px solid #1a1a1a; 109 + font-size: 0.8rem; 110 + color: var(--text-muted); 111 + } 112 + </style>
+240
src/lib/events.ts
··· 1 + import { z } from "astro/zod"; 2 + import { TopicSchema, type Topic } from "../lib/schema"; 3 + 4 + const EventSchema = z.object({ 5 + source: z.enum(["github", "bluesky"]), 6 + title: z.string(), 7 + description: z.string(), 8 + url: z.string().url().optional(), 9 + timestamp: z.string(), 10 + }); 11 + 12 + export type Event = z.infer<typeof EventSchema>; 13 + 14 + const LOG = { 15 + info: (msg: string) => console.log(`\x1b[34m[INFO]\x1b[0m ${msg}`), 16 + success: (msg: string) => console.log(`\x1b[32m[SUCCESS]\x1b[0m ${msg}`), 17 + warn: (msg: string) => console.log(`\x1b[33m[WARN]\x1b[0m ${msg}`), 18 + error: (msg: string) => console.error(`\x1b[31m[ERROR]\x1b[0m ${msg}`), 19 + ai: (msg: string) => console.log(`\x1b[35m[AI]\x1b[0m ${msg}`), 20 + }; 21 + 22 + function getRequiredEnv(key: string): string { 23 + const value = process.env[key]; 24 + if (!value) { 25 + throw new Error(`Environment variable ${key} is missing.`); 26 + } 27 + return value; 28 + } 29 + 30 + async function isUrlReachable(url: string): Promise<boolean> { 31 + try { 32 + const response = await fetch(url, { 33 + method: "HEAD", 34 + signal: AbortSignal.timeout(3000), 35 + }); 36 + return response.ok; 37 + } catch { 38 + return false; 39 + } 40 + } 41 + 42 + function sanitizeBrand(text: string): string { 43 + return text.replace(/npmx/gi, "npmx"); 44 + } 45 + 46 + export async function fetchGitHubEvents(since: Date): Promise<Event[]> { 47 + const owner = "npmx-dev"; 48 + const repo = "npmx.dev"; 49 + const token = getRequiredEnv("GITHUB_TOKEN"); 50 + const events: Event[] = []; 51 + 52 + const halfDayInMs = 12 * 60 * 60 * 1000; 53 + const until = new Date(since.getTime() + halfDayInMs); 54 + const startIso = since.toISOString().split(".")[0]; 55 + const endIso = until.toISOString().split(".")[0]; 56 + const dateRange = `${startIso}Z..${endIso}Z`; 57 + 58 + const query = encodeURIComponent( 59 + `repo:${owner}/${repo} is:closed created:${dateRange}`, 60 + ); 61 + 62 + const headers = { 63 + Accept: "application/vnd.github.v3+json", 64 + "User-Agent": "npmx-digest-bot", 65 + Authorization: `Bearer ${token}`, 66 + }; 67 + 68 + try { 69 + const response = await fetch( 70 + `https://api.github.com/search/issues?q=${query}`, 71 + { headers }, 72 + ); 73 + 74 + if (response.ok) { 75 + const data = await response.json(); 76 + const items = data.items || []; 77 + 78 + items.forEach((item: any) => { 79 + const isPR = !!item.pull_request; 80 + events.push({ 81 + source: "github", 82 + title: `${isPR ? "Merged PR" : "Closed Issue"} #${item.number}: ${item.title}`, 83 + description: item.body || "No description provided", 84 + url: item.html_url, 85 + timestamp: item.created_at, 86 + }); 87 + }); 88 + LOG.success(`GitHub: Found ${events.length} finalized items.`); 89 + } 90 + } catch { 91 + LOG.error("GitHub fetch failed."); 92 + } 93 + 94 + return events; 95 + } 96 + 97 + export async function fetchBlueskyEvents(since: Date): Promise<Event[]> { 98 + const handle = "npmx.dev"; 99 + const events: Event[] = []; 100 + 101 + try { 102 + const resolve = await fetch( 103 + `https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=${handle}`, 104 + ); 105 + if (!resolve.ok) return events; 106 + const { did } = await resolve.json(); 107 + 108 + const feedRes = await fetch( 109 + `https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor=${did}&limit=30&filter=posts_with_replies`, 110 + ); 111 + 112 + if (feedRes.ok) { 113 + const { feed } = await feedRes.json(); 114 + 115 + const candidates = feed.reduce((acc: Event[], item: any) => { 116 + const actionTimestamp = item.reason?.indexedAt || item.post.indexedAt; 117 + const isRecent = new Date(actionTimestamp) >= since; 118 + 119 + if (isRecent) { 120 + const author = item.post.author.handle; 121 + const isRepost = !!item.reason; 122 + const postText = item.post.record.text; 123 + 124 + acc.push({ 125 + source: "bluesky", 126 + title: `${isRepost ? `[Repost from @${author}] ` : ""}${postText.substring(0, 80)}`, 127 + description: postText, 128 + url: `https://bsky.app/profile/${handle}/post/${item.post.uri.split("/").pop()}`, 129 + timestamp: actionTimestamp, 130 + }); 131 + } 132 + return acc; 133 + }, []); 134 + 135 + const reachabilityResults = await Promise.all( 136 + candidates.map(async (c: Event) => ({ 137 + event: c, 138 + isAlive: c.url ? await isUrlReachable(c.url) : false, 139 + })), 140 + ); 141 + 142 + const aliveEvents = reachabilityResults 143 + .filter((r) => r.isAlive) 144 + .map((r) => r.event); 145 + 146 + events.push(...aliveEvents); 147 + LOG.success(`Bluesky: Collected ${events.length} active items.`); 148 + } 149 + } catch { 150 + LOG.error("Bluesky fetch failed."); 151 + } 152 + return events; 153 + } 154 + 155 + export async function generateSmartDigest(events: Event[]): Promise<Topic[]> { 156 + const token = getRequiredEnv("GITHUB_TOKEN"); 157 + if (!token || events.length === 0) return []; 158 + 159 + LOG.ai(`Clustering ${events.length} signals into topics...`); 160 + 161 + const prompt = `You are a technical analyst for npmx. Group the following events into 5-6 logical "Topics". 162 + Sort by relevanceScore (1-10). Refer to the project strictly as "npmx" (lowercase). 163 + Return ONLY a JSON array with this structure: { "topics": Topic[] }. 164 + Events: ${JSON.stringify(events)}`; 165 + 166 + try { 167 + const response = await fetch( 168 + "https://models.inference.ai.azure.com/chat/completions", 169 + { 170 + method: "POST", 171 + headers: { 172 + "Content-Type": "application/json", 173 + Authorization: `Bearer ${token}`, 174 + }, 175 + body: JSON.stringify({ 176 + messages: [{ role: "user", content: prompt }], 177 + model: "gpt-4o-mini", 178 + temperature: 0.3, 179 + response_format: { type: "json_object" }, 180 + }), 181 + }, 182 + ); 183 + 184 + if (response.ok) { 185 + const data = await response.json(); 186 + const parsed = JSON.parse(data.choices[0].message.content); 187 + 188 + const topics = parsed.topics.map((t: any) => { 189 + const validated = TopicSchema.parse(t); 190 + return { 191 + ...validated, 192 + title: sanitizeBrand(validated.title), 193 + summary: sanitizeBrand(validated.summary), 194 + }; 195 + }); 196 + 197 + LOG.success(`Successfully clustered into ${topics.length} topics.`); 198 + return topics; 199 + } 200 + } catch { 201 + LOG.error("AI Clustering failed."); 202 + } 203 + return []; 204 + } 205 + 206 + export async function generateCatchyTitle(topic: Topic): Promise<string> { 207 + const token = getRequiredEnv("GITHUB_TOKEN"); 208 + if (!token) return "New Update"; 209 + 210 + const prompt = `You are a tech journalist for npmx. Create a very short (max 5-7 words), catchy headline for this topic. 211 + Return ONLY the text, no quotes. Topic: ${topic.title} - ${topic.summary}`; 212 + 213 + try { 214 + const response = await fetch( 215 + "https://models.inference.ai.azure.com/chat/completions", 216 + { 217 + method: "POST", 218 + headers: { 219 + "Content-Type": "application/json", 220 + Authorization: `Bearer ${token}`, 221 + }, 222 + body: JSON.stringify({ 223 + messages: [{ role: "user", content: prompt }], 224 + model: "gpt-4o-mini", 225 + temperature: 0.8, 226 + max_tokens: 30, 227 + }), 228 + }, 229 + ); 230 + 231 + if (response.ok) { 232 + const data = await response.json(); 233 + const title = data.choices[0].message.content.trim(); 234 + return sanitizeBrand(title); 235 + } 236 + } catch { 237 + LOG.error("Failed to generate title"); 238 + } 239 + return sanitizeBrand(topic.title); 240 + }
+24
src/lib/schema.ts
··· 1 + import { z } from "zod"; 2 + 3 + export const SourceSchema = z.object({ 4 + platform: z.string(), 5 + url: z.string().url(), 6 + }); 7 + 8 + export const TopicSchema = z.object({ 9 + title: z.string(), 10 + summary: z.string(), 11 + relevanceScore: z.number().min(0).max(10), 12 + sources: z.array(SourceSchema), 13 + }); 14 + 15 + export const PostSchema = z.object({ 16 + title: z.string(), 17 + date: z.coerce.date(), 18 + type: z.enum(["daily", "nightly"]), 19 + topics: z.array(TopicSchema), 20 + }); 21 + 22 + export type Source = z.infer<typeof SourceSchema>; 23 + export type Topic = z.infer<typeof TopicSchema>; 24 + export type Post = z.infer<typeof PostSchema>;
+85
src/pages/archive.astro
··· 1 + --- 2 + import { getCollection } from "astro:content"; 3 + import Layout from "../layouts/Layout.astro"; 4 + 5 + const posts = await getCollection("posts"); 6 + 7 + const sortedPosts = posts.sort( 8 + (a, b) => b.data.date.valueOf() - a.data.date.valueOf(), 9 + ); 10 + 11 + const formatDate = (date: Date) => date.toISOString().split("T")[0]; 12 + --- 13 + 14 + <Layout title="Archive | npmx.digest"> 15 + <h1 class="page-title">Archives</h1> 16 + 17 + <div class="archive-list"> 18 + { 19 + sortedPosts.map(({ data, id }) => { 20 + const displayDate = formatDate(data.date); 21 + const postUrl = `/posts/${id}`; 22 + 23 + return ( 24 + <a href={postUrl} class="archive-item"> 25 + <span class="date">{displayDate}</span> 26 + <span class="title">{data.title}</span> 27 + <span class="dot" /> 28 + <span class="type">{data.type}</span> 29 + </a> 30 + ); 31 + }) 32 + } 33 + </div> 34 + </Layout> 35 + 36 + <style> 37 + .page-title { 38 + font-size: 1.2rem; 39 + margin-bottom: 2rem; 40 + color: var(--text-muted); 41 + } 42 + 43 + .archive-list { 44 + display: flex; 45 + flex-direction: column; 46 + } 47 + 48 + .archive-item { 49 + display: flex; 50 + align-items: baseline; 51 + padding: 0.8rem 0; 52 + border-bottom: 1px solid #151515; 53 + text-decoration: none; 54 + color: var(--text-muted); 55 + font-size: 0.95rem; 56 + } 57 + 58 + .archive-item:hover { 59 + color: var(--accent); 60 + } 61 + 62 + .date { 63 + font-family: monospace; 64 + width: 120px; 65 + flex-shrink: 0; 66 + font-size: 0.85rem; 67 + } 68 + 69 + .title { 70 + color: var(--text); 71 + } 72 + 73 + .type { 74 + font-size: 0.75rem; 75 + text-transform: capitalize; 76 + margin-left: 1rem; 77 + } 78 + 79 + .dot { 80 + align-self: center; 81 + flex-grow: 1; 82 + border-bottom: 1px dotted #333; 83 + margin: 0.2rem 1rem 0; 84 + } 85 + </style>
+175 -13
src/pages/index.astro
··· 1 1 --- 2 + import { getCollection } from "astro:content"; 3 + import Layout from "../layouts/Layout.astro"; 2 4 5 + const allPosts = await getCollection("posts"); 6 + const posts = allPosts.sort( 7 + (a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime(), 8 + ); 9 + 10 + const latestPosts = posts.slice(0, 5); 3 11 --- 4 12 5 - <html lang="en"> 6 - <head> 7 - <meta charset="utf-8" /> 8 - <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 9 - <link rel="icon" href="/favicon.ico" /> 10 - <meta name="viewport" content="width=device-width" /> 11 - <meta name="generator" content={Astro.generator} /> 12 - <title>Astro</title> 13 - </head> 14 - <body> 15 - <h1>Astro</h1> 16 - </body> 17 - </html> 13 + <Layout title="npmx.digest"> 14 + <section class="intro"> 15 + <h1>Latest Intelligence</h1> 16 + <p> 17 + A semi-daily report on the progress of npmx across GitHub and 18 + Bluesky. 19 + </p> 20 + </section> 21 + 22 + <div class="post-list"> 23 + { 24 + latestPosts.map((post) => ( 25 + <a href={`/posts/${post.id}`} class="post-entry"> 26 + <div class="post-meta"> 27 + <time datetime={post.data.date.toString()}> 28 + {new Date(post.data.date).toLocaleDateString( 29 + "en-US", 30 + { 31 + month: "short", 32 + day: "numeric", 33 + }, 34 + )} 35 + </time> 36 + <span class={`type-tag ${post.data.type}`}> 37 + {post.data.type} 38 + </span> 39 + </div> 40 + <div class="post-content"> 41 + <h2>{post.data.title}</h2> 42 + <div class="topic-preview"> 43 + {post.data.topics.slice(0, 3).map((topic, i) => ( 44 + <span> 45 + {topic.title} 46 + {i < 47 + Math.min(post.data.topics.length, 3) - 1 48 + ? " • " 49 + : ""} 50 + </span> 51 + ))} 52 + {post.data.topics.length > 3 && ( 53 + <span class="more"> 54 + {" "} 55 + +{post.data.topics.length - 3} more 56 + </span> 57 + )} 58 + </div> 59 + </div> 60 + </a> 61 + )) 62 + } 63 + </div> 64 + 65 + { 66 + posts.length > 5 && ( 67 + <a href="/archive" class="archive-link"> 68 + Explore the archives → 69 + </a> 70 + ) 71 + } 72 + </Layout> 73 + 74 + <style> 75 + .intro { 76 + margin-bottom: 3rem; 77 + } 78 + 79 + h1 { 80 + font-size: 1.5rem; 81 + font-weight: 600; 82 + margin-bottom: 0.5rem; 83 + color: var(--accent); 84 + } 85 + 86 + .intro p { 87 + color: var(--text-muted); 88 + line-height: 1.5; 89 + } 90 + 91 + .post-list { 92 + display: flex; 93 + flex-direction: column; 94 + gap: 3rem; 95 + } 96 + 97 + .post-entry { 98 + text-decoration: none; 99 + color: inherit; 100 + display: grid; 101 + grid-template-columns: 100px 1fr; 102 + gap: 1.5rem; 103 + transition: transform 0.2s; 104 + } 105 + 106 + .post-entry:hover { 107 + transform: translateX(4px); 108 + } 109 + 110 + .post-meta { 111 + font-size: 0.85rem; 112 + color: var(--text-muted); 113 + display: flex; 114 + flex-direction: column; 115 + gap: 0.4rem; 116 + font-family: monospace; 117 + } 118 + 119 + .type-tag { 120 + text-transform: uppercase; 121 + font-size: 0.7rem; 122 + letter-spacing: 0.05em; 123 + font-weight: 700; 124 + } 125 + 126 + .daily { 127 + color: #fbbf24; 128 + } 129 + .nightly { 130 + color: #818cf8; 131 + } 132 + 133 + h2 { 134 + font-size: 1.1rem; 135 + font-weight: 600; 136 + margin-bottom: 0.4rem; 137 + color: var(--text); 138 + } 139 + 140 + .topic-preview { 141 + font-size: 0.9rem; 142 + color: var(--text-muted); 143 + line-height: 1.4; 144 + } 145 + 146 + .topic-preview span { 147 + display: inline; 148 + } 149 + 150 + .topic-preview .more { 151 + opacity: 0.5; 152 + font-style: italic; 153 + } 154 + 155 + .archive-link { 156 + display: block; 157 + margin-top: 5rem; 158 + color: var(--text-muted); 159 + text-decoration: none; 160 + font-size: 0.9rem; 161 + font-weight: 500; 162 + } 163 + 164 + .archive-link:hover { 165 + color: var(--accent); 166 + } 167 + 168 + @media (max-width: 500px) { 169 + .post-entry { 170 + grid-template-columns: 1fr; 171 + gap: 0.5rem; 172 + } 173 + .post-meta { 174 + flex-direction: row; 175 + align-items: center; 176 + gap: 1rem; 177 + } 178 + } 179 + </style>
+280
src/pages/posts/[id].astro
··· 1 + --- 2 + import { getCollection, getEntry } from "astro:content"; 3 + import Layout from "../../layouts/Layout.astro"; 4 + 5 + export async function getStaticPaths() { 6 + const posts = await getCollection("posts"); 7 + return posts.map((post) => ({ 8 + params: { id: post.id }, 9 + })); 10 + } 11 + 12 + const { id } = Astro.params; 13 + const postEntry = await getEntry("posts", id); 14 + 15 + if (!postEntry) { 16 + return Astro.redirect("/404"); 17 + } 18 + 19 + const { data } = postEntry; 20 + 21 + const formattedDate = data.date.toLocaleDateString("en-US", { 22 + weekday: "short", 23 + year: "numeric", 24 + month: "long", 25 + day: "numeric", 26 + }); 27 + 28 + const getGithubId = (url?: string) => { 29 + if (!url) return ""; 30 + const match = url.match(/\/(pull|issues)\/(\d+)$/); 31 + return match ? ` (#${match[2]})` : ""; 32 + }; 33 + --- 34 + 35 + <Layout title={`${data.title} | npmx.digest`}> 36 + <article class="report"> 37 + <header class="report-header"> 38 + <div class="meta"> 39 + <time datetime={data.date.toISOString()}>{formattedDate}</time> 40 + <span class="slash">/</span> 41 + <span class={`tag ${data.type}`}>{data.type}</span> 42 + </div> 43 + <h1>{data.title}</h1> 44 + </header> 45 + 46 + <section class="topics-section"> 47 + <div class="section-divider"> 48 + <span>Intelligence Topics</span> 49 + <hr /> 50 + </div> 51 + 52 + <div class="topic-list"> 53 + { 54 + data.topics.map((topic, index) => { 55 + const displayIndex = (index + 1) 56 + .toString() 57 + .padStart(2, "0"); 58 + 59 + return ( 60 + <div class="topic-item"> 61 + <div class="topic-meta"> 62 + <span class="index">{displayIndex}</span> 63 + <span class="score"> 64 + Signal: {topic.relevanceScore}/10 65 + </span> 66 + </div> 67 + <div class="topic-body"> 68 + <h2>{topic.title}</h2> 69 + <p>{topic.summary}</p> 70 + <div class="topic-sources"> 71 + {topic.sources.map((source) => ( 72 + <a 73 + href={source.url} 74 + target="_blank" 75 + rel="noopener noreferrer" 76 + class={`source-link ${source.platform}`} 77 + > 78 + {source.platform} 79 + {source.platform === "github" 80 + ? getGithubId(source.url) 81 + : ""} 82 + 83 + </a> 84 + ))} 85 + </div> 86 + </div> 87 + </div> 88 + ); 89 + }) 90 + } 91 + </div> 92 + </section> 93 + 94 + <footer class="report-footer"> 95 + <a href="/" class="back-btn">← Back to Index</a> 96 + <p class="bot-note"> 97 + Automated cluster analysis performed by npmx-bot 98 + </p> 99 + </footer> 100 + </article> 101 + </Layout> 102 + 103 + <style> 104 + .report { 105 + margin-top: 2rem; 106 + } 107 + 108 + .report-header { 109 + margin-bottom: 4rem; 110 + } 111 + 112 + .meta { 113 + font-family: monospace; 114 + font-size: 0.8rem; 115 + text-transform: uppercase; 116 + color: var(--text-muted); 117 + display: flex; 118 + gap: 0.6rem; 119 + margin-bottom: 0.8rem; 120 + } 121 + 122 + .slash { 123 + color: #333; 124 + } 125 + 126 + .tag.daily { 127 + color: #fbbf24; 128 + } 129 + .tag.nightly { 130 + color: #818cf8; 131 + } 132 + 133 + h1 { 134 + font-size: 2.5rem; 135 + font-weight: 700; 136 + letter-spacing: -0.04em; 137 + line-height: 1.1; 138 + color: var(--accent); 139 + } 140 + 141 + .section-divider { 142 + display: flex; 143 + align-items: center; 144 + gap: 1rem; 145 + margin-bottom: 3rem; 146 + } 147 + 148 + .section-divider span { 149 + font-family: monospace; 150 + font-size: 0.75rem; 151 + text-transform: uppercase; 152 + color: var(--text-muted); 153 + white-space: nowrap; 154 + } 155 + 156 + .section-divider hr { 157 + flex-grow: 1; 158 + border: 0; 159 + border-top: 1px solid #1a1a1a; 160 + } 161 + 162 + .topic-list { 163 + display: flex; 164 + flex-direction: column; 165 + gap: 4rem; 166 + } 167 + 168 + .topic-item { 169 + display: grid; 170 + grid-template-columns: 120px 1fr; 171 + gap: 2rem; 172 + } 173 + 174 + .topic-meta { 175 + display: flex; 176 + flex-direction: column; 177 + gap: 0.5rem; 178 + font-family: monospace; 179 + font-size: 0.8rem; 180 + } 181 + 182 + .index { 183 + color: var(--accent); 184 + font-weight: 700; 185 + font-size: 1.2rem; 186 + } 187 + 188 + .score { 189 + color: var(--text-muted); 190 + font-size: 0.7rem; 191 + text-transform: uppercase; 192 + } 193 + 194 + .topic-body h2 { 195 + font-size: 1.4rem; 196 + font-weight: 600; 197 + margin-bottom: 0.75rem; 198 + color: var(--text); 199 + letter-spacing: -0.02em; 200 + } 201 + 202 + .topic-body p { 203 + font-size: 1.05rem; 204 + color: var(--text-muted); 205 + line-height: 1.6; 206 + margin-bottom: 1.5rem; 207 + } 208 + 209 + .topic-sources { 210 + display: flex; 211 + flex-wrap: wrap; 212 + gap: 0.75rem; 213 + } 214 + 215 + .source-link { 216 + font-size: 0.75rem; 217 + font-family: monospace; 218 + text-decoration: none; 219 + padding: 0.2rem 0.5rem; 220 + border: 1px solid #222; 221 + color: var(--text-muted); 222 + text-transform: uppercase; 223 + transition: all 0.2s; 224 + } 225 + 226 + .source-link:hover { 227 + border-color: var(--accent); 228 + color: var(--accent); 229 + background: #111; 230 + } 231 + 232 + .source-link.github:hover { 233 + color: #fff; 234 + border-color: #fff; 235 + } 236 + .source-link.bluesky:hover { 237 + color: #0285ff; 238 + border-color: #0285ff; 239 + } 240 + 241 + .report-footer { 242 + margin-top: 6rem; 243 + padding-top: 2rem; 244 + border-top: 1px solid #1a1a1a; 245 + display: flex; 246 + justify-content: space-between; 247 + align-items: center; 248 + } 249 + 250 + .back-btn { 251 + text-decoration: none; 252 + color: var(--text-muted); 253 + font-size: 0.9rem; 254 + } 255 + 256 + .back-btn:hover { 257 + color: var(--accent); 258 + } 259 + 260 + .bot-note { 261 + font-family: monospace; 262 + font-size: 0.7rem; 263 + color: #333; 264 + } 265 + 266 + @media (max-width: 600px) { 267 + .topic-item { 268 + grid-template-columns: 1fr; 269 + gap: 1rem; 270 + } 271 + .topic-meta { 272 + flex-direction: row; 273 + align-items: center; 274 + gap: 1rem; 275 + } 276 + h1 { 277 + font-size: 2rem; 278 + } 279 + } 280 + </style>