this repo has no description
2
fork

Configure Feed

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

Change CICD to websocket

+111 -598
+104 -37
cicd/index.js
··· 1 - import express from "express"; 2 - import { exec as callback_exec } from "node:child_process"; 1 + import z from "zod"; 3 2 import path from "node:path"; 4 3 import { promisify } from "node:util"; 5 - 4 + import { exec as callback_exec } from "node:child_process"; 6 5 const exec = promisify(callback_exec); 7 6 8 - const app = express(); 9 - 10 - app.use((req, _, next) => { 11 - // mime doesnt matter 12 - let data = ""; 13 - req.setEncoding("utf8"); 14 - req.on("data", (chunk) => (data += chunk)); 15 - req.on("end", () => { 16 - req.body = data; 17 - next(); 18 - }); 7 + /** 8 + * manually translated from 9 + * https://tangled.sh/@tangled.sh/core/blob/master/lexicons/git/refUpdate.json 10 + * at commit ec0f9449c962ad6da54aeeb6e452b2bce0af7b35 11 + * (https://tangled.sh/@tangled.sh/core/commit/ec0f9449c962ad6da54aeeb6e452b2bce0af7b35) 12 + */ 13 + const sh_tangled_git_refUpdate = z.object({ 14 + ref: z.string().max(2560), 15 + commiterDid: z.string().regex(/^did:.+:.+$/), 16 + repoDid: z.string().regex(/^did:.+:.+$/), 17 + repoName: z.string(), 18 + oldSha: z.string().length(40), 19 + newSha: z.string().length(40), 20 + meta: z.object({ 21 + isDefaultRef: z.boolean(), 22 + langBreakdown: z 23 + .object({ 24 + inputs: z 25 + .array( 26 + z.object({ 27 + lang: z.string(), 28 + size: z.int(), 29 + }) 30 + ) 31 + .optional(), 32 + }) 33 + .optional(), 34 + commitCount: z.object({ 35 + byEmail: z 36 + .array(z.object({ email: z.email(), count: z.int() })) 37 + .optional(), 38 + }), 39 + }), 19 40 }); 20 41 21 - app.post("/rebuild", async (req, res) => { 22 - if (req.body !== process.env.KEY) { 23 - res.status(403).send("Key invalid"); 24 - return; 25 - } 42 + const connect = () => { 43 + const ws = new WebSocket("wss://knot1.tangled.sh/events"); 44 + ws.addEventListener("message", async (ev) => { 45 + // example data: 46 + // { 47 + // event: { 48 + // $type: "", 49 + // committerDid: "did:plc:4zht3z4caxwrw3dlsybodywc", 50 + // meta: { 51 + // commitCount: { 52 + // byEmail: [{ count: 1, email: "vielle.dev@proton.me" }], 53 + // }, 54 + // isDefaultRef: true, 55 + // langBreakdown: {}, 56 + // }, 57 + // newSha: "d4a994b4f986f1b6b90bbd89f8757ce49c955f03", 58 + // oldSha: "fe24ef62ae9ca66f587cc5c5b14e91675212d526", 59 + // ref: "refs/heads/master", 60 + // repoDid: "did:plc:4zht3z4caxwrw3dlsybodywc", 61 + // repoName: "server-config", 62 + // }, 63 + // nsid: "sh.tangled.git.refUpdate", 64 + // rkey: "3lxuycprda422", 65 + // }; 66 + const data = (() => { 67 + try { 68 + return sh_tangled_git_refUpdate.parse(JSON.parse(ev.data)); 69 + } catch { 70 + return undefined; 71 + } 72 + })(); 73 + // fail gracefully if not json 74 + if (!data) return; 26 75 27 - // key was valid so we can trigger commands from parent dir 28 - const options = { cwd: path.join(process.cwd(), "..") }; 29 - // stash so we can pull changes without conflicts 30 - await exec("git stash", options); 31 - console.log("completed `git stash`"); 32 - await exec("git pull", options); 33 - console.log("completed `git pull`"); 34 - // docker compose up -d --build --force-recreate 35 - await exec("docker compose up -d --build --force-recreate", options); 36 - console.log("completed `docker compose up -d --build --force-recreate`"); 37 - // pop the stash 38 - await exec("git stash pop", options); 39 - console.log("completed `git stash pop`"); 76 + // now check if its to this repo 77 + // assume it doesnt get renamed 78 + // and assume my did is constant 79 + // if this changes owner or name this needs updated 80 + // if its not the right repo just quit out 81 + if ( 82 + !( 83 + data.repoDid === "did:plc:4zht3z4caxwrw3dlsybodywc" && 84 + data.repoName === "server-config" 85 + ) 86 + ) 87 + return; 40 88 41 - res.send("Complete!"); 42 - }); 89 + // this is the correct repo 90 + // either code was changed (needing a rebuild) 91 + // or a site was updated here 92 + // either way we can stash, pull, docker, pop 93 + const options = { cwd: path.join(process.cwd(), "..") }; 94 + await exec("git stash", options); 95 + console.log("completed `git stash`"); 96 + await exec("git pull", options); 97 + console.log("completed `git pull`"); 98 + await exec("docker compose up -d --build --force-recreate", options); 99 + console.log("completed `docker compose up -d --build --force-recreate`"); 100 + await exec("git stash pop", options); 101 + console.log("completed `git stash pop`"); 102 + // the repo should be updated now 103 + }); 43 104 44 - app.listen(4321, () => { 45 - console.log("listening on :4321"); 46 - }); 105 + // when connection is closed or errors 106 + // just connect again 107 + ws.addEventListener("close", () => { 108 + connect(); 109 + }); 110 + ws.addEventListener("error", () => { 111 + connect(); 112 + }); 113 + };
+1 -1
cicd/package.json
··· 12 12 "license": "ISC", 13 13 "packageManager": "pnpm@10.14.0", 14 14 "dependencies": { 15 - "express": "^5.1.0" 15 + "zod": "^4.1.5" 16 16 } 17 17 }
+6 -560
cicd/pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 - express: 12 - specifier: ^5.1.0 13 - version: 5.1.0 11 + zod: 12 + specifier: ^4.1.5 13 + version: 4.1.5 14 14 15 15 packages: 16 16 17 - accepts@2.0.0: 18 - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 19 - engines: {node: '>= 0.6'} 20 - 21 - body-parser@2.2.0: 22 - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} 23 - engines: {node: '>=18'} 24 - 25 - bytes@3.1.2: 26 - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 27 - engines: {node: '>= 0.8'} 28 - 29 - call-bind-apply-helpers@1.0.2: 30 - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 31 - engines: {node: '>= 0.4'} 32 - 33 - call-bound@1.0.4: 34 - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 35 - engines: {node: '>= 0.4'} 36 - 37 - content-disposition@1.0.0: 38 - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} 39 - engines: {node: '>= 0.6'} 40 - 41 - content-type@1.0.5: 42 - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 43 - engines: {node: '>= 0.6'} 44 - 45 - cookie-signature@1.2.2: 46 - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 47 - engines: {node: '>=6.6.0'} 48 - 49 - cookie@0.7.2: 50 - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 51 - engines: {node: '>= 0.6'} 52 - 53 - debug@4.4.1: 54 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 55 - engines: {node: '>=6.0'} 56 - peerDependencies: 57 - supports-color: '*' 58 - peerDependenciesMeta: 59 - supports-color: 60 - optional: true 61 - 62 - depd@2.0.0: 63 - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 64 - engines: {node: '>= 0.8'} 65 - 66 - dunder-proto@1.0.1: 67 - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 68 - engines: {node: '>= 0.4'} 69 - 70 - ee-first@1.1.1: 71 - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 72 - 73 - encodeurl@2.0.0: 74 - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 75 - engines: {node: '>= 0.8'} 76 - 77 - es-define-property@1.0.1: 78 - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 79 - engines: {node: '>= 0.4'} 80 - 81 - es-errors@1.3.0: 82 - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 83 - engines: {node: '>= 0.4'} 84 - 85 - es-object-atoms@1.1.1: 86 - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 87 - engines: {node: '>= 0.4'} 88 - 89 - escape-html@1.0.3: 90 - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 91 - 92 - etag@1.8.1: 93 - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 94 - engines: {node: '>= 0.6'} 95 - 96 - express@5.1.0: 97 - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} 98 - engines: {node: '>= 18'} 99 - 100 - finalhandler@2.1.0: 101 - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} 102 - engines: {node: '>= 0.8'} 103 - 104 - forwarded@0.2.0: 105 - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 106 - engines: {node: '>= 0.6'} 107 - 108 - fresh@2.0.0: 109 - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 110 - engines: {node: '>= 0.8'} 111 - 112 - function-bind@1.1.2: 113 - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 114 - 115 - get-intrinsic@1.3.0: 116 - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 117 - engines: {node: '>= 0.4'} 118 - 119 - get-proto@1.0.1: 120 - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 121 - engines: {node: '>= 0.4'} 122 - 123 - gopd@1.2.0: 124 - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 125 - engines: {node: '>= 0.4'} 126 - 127 - has-symbols@1.1.0: 128 - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 129 - engines: {node: '>= 0.4'} 130 - 131 - hasown@2.0.2: 132 - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 133 - engines: {node: '>= 0.4'} 134 - 135 - http-errors@2.0.0: 136 - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 137 - engines: {node: '>= 0.8'} 138 - 139 - iconv-lite@0.6.3: 140 - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 141 - engines: {node: '>=0.10.0'} 142 - 143 - inherits@2.0.4: 144 - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 145 - 146 - ipaddr.js@1.9.1: 147 - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 148 - engines: {node: '>= 0.10'} 149 - 150 - is-promise@4.0.0: 151 - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 152 - 153 - math-intrinsics@1.1.0: 154 - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 155 - engines: {node: '>= 0.4'} 156 - 157 - media-typer@1.1.0: 158 - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 159 - engines: {node: '>= 0.8'} 160 - 161 - merge-descriptors@2.0.0: 162 - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 163 - engines: {node: '>=18'} 164 - 165 - mime-db@1.54.0: 166 - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} 167 - engines: {node: '>= 0.6'} 168 - 169 - mime-types@3.0.1: 170 - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} 171 - engines: {node: '>= 0.6'} 172 - 173 - ms@2.1.3: 174 - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 175 - 176 - negotiator@1.0.0: 177 - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 178 - engines: {node: '>= 0.6'} 179 - 180 - object-inspect@1.13.4: 181 - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 182 - engines: {node: '>= 0.4'} 183 - 184 - on-finished@2.4.1: 185 - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 186 - engines: {node: '>= 0.8'} 187 - 188 - once@1.4.0: 189 - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 190 - 191 - parseurl@1.3.3: 192 - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 193 - engines: {node: '>= 0.8'} 194 - 195 - path-to-regexp@8.2.0: 196 - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} 197 - engines: {node: '>=16'} 198 - 199 - proxy-addr@2.0.7: 200 - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 201 - engines: {node: '>= 0.10'} 202 - 203 - qs@6.14.0: 204 - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 205 - engines: {node: '>=0.6'} 206 - 207 - range-parser@1.2.1: 208 - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 209 - engines: {node: '>= 0.6'} 210 - 211 - raw-body@3.0.0: 212 - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} 213 - engines: {node: '>= 0.8'} 214 - 215 - router@2.2.0: 216 - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} 217 - engines: {node: '>= 18'} 218 - 219 - safe-buffer@5.2.1: 220 - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 221 - 222 - safer-buffer@2.1.2: 223 - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 224 - 225 - send@1.2.0: 226 - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} 227 - engines: {node: '>= 18'} 228 - 229 - serve-static@2.2.0: 230 - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} 231 - engines: {node: '>= 18'} 232 - 233 - setprototypeof@1.2.0: 234 - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 235 - 236 - side-channel-list@1.0.0: 237 - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 238 - engines: {node: '>= 0.4'} 239 - 240 - side-channel-map@1.0.1: 241 - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 242 - engines: {node: '>= 0.4'} 243 - 244 - side-channel-weakmap@1.0.2: 245 - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 246 - engines: {node: '>= 0.4'} 247 - 248 - side-channel@1.1.0: 249 - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 250 - engines: {node: '>= 0.4'} 251 - 252 - statuses@2.0.1: 253 - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 254 - engines: {node: '>= 0.8'} 255 - 256 - statuses@2.0.2: 257 - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} 258 - engines: {node: '>= 0.8'} 259 - 260 - toidentifier@1.0.1: 261 - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 262 - engines: {node: '>=0.6'} 263 - 264 - type-is@2.0.1: 265 - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} 266 - engines: {node: '>= 0.6'} 267 - 268 - unpipe@1.0.0: 269 - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 270 - engines: {node: '>= 0.8'} 271 - 272 - vary@1.1.2: 273 - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 274 - engines: {node: '>= 0.8'} 275 - 276 - wrappy@1.0.2: 277 - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 17 + zod@4.1.5: 18 + resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==} 278 19 279 20 snapshots: 280 21 281 - accepts@2.0.0: 282 - dependencies: 283 - mime-types: 3.0.1 284 - negotiator: 1.0.0 285 - 286 - body-parser@2.2.0: 287 - dependencies: 288 - bytes: 3.1.2 289 - content-type: 1.0.5 290 - debug: 4.4.1 291 - http-errors: 2.0.0 292 - iconv-lite: 0.6.3 293 - on-finished: 2.4.1 294 - qs: 6.14.0 295 - raw-body: 3.0.0 296 - type-is: 2.0.1 297 - transitivePeerDependencies: 298 - - supports-color 299 - 300 - bytes@3.1.2: {} 301 - 302 - call-bind-apply-helpers@1.0.2: 303 - dependencies: 304 - es-errors: 1.3.0 305 - function-bind: 1.1.2 306 - 307 - call-bound@1.0.4: 308 - dependencies: 309 - call-bind-apply-helpers: 1.0.2 310 - get-intrinsic: 1.3.0 311 - 312 - content-disposition@1.0.0: 313 - dependencies: 314 - safe-buffer: 5.2.1 315 - 316 - content-type@1.0.5: {} 317 - 318 - cookie-signature@1.2.2: {} 319 - 320 - cookie@0.7.2: {} 321 - 322 - debug@4.4.1: 323 - dependencies: 324 - ms: 2.1.3 325 - 326 - depd@2.0.0: {} 327 - 328 - dunder-proto@1.0.1: 329 - dependencies: 330 - call-bind-apply-helpers: 1.0.2 331 - es-errors: 1.3.0 332 - gopd: 1.2.0 333 - 334 - ee-first@1.1.1: {} 335 - 336 - encodeurl@2.0.0: {} 337 - 338 - es-define-property@1.0.1: {} 339 - 340 - es-errors@1.3.0: {} 341 - 342 - es-object-atoms@1.1.1: 343 - dependencies: 344 - es-errors: 1.3.0 345 - 346 - escape-html@1.0.3: {} 347 - 348 - etag@1.8.1: {} 349 - 350 - express@5.1.0: 351 - dependencies: 352 - accepts: 2.0.0 353 - body-parser: 2.2.0 354 - content-disposition: 1.0.0 355 - content-type: 1.0.5 356 - cookie: 0.7.2 357 - cookie-signature: 1.2.2 358 - debug: 4.4.1 359 - encodeurl: 2.0.0 360 - escape-html: 1.0.3 361 - etag: 1.8.1 362 - finalhandler: 2.1.0 363 - fresh: 2.0.0 364 - http-errors: 2.0.0 365 - merge-descriptors: 2.0.0 366 - mime-types: 3.0.1 367 - on-finished: 2.4.1 368 - once: 1.4.0 369 - parseurl: 1.3.3 370 - proxy-addr: 2.0.7 371 - qs: 6.14.0 372 - range-parser: 1.2.1 373 - router: 2.2.0 374 - send: 1.2.0 375 - serve-static: 2.2.0 376 - statuses: 2.0.2 377 - type-is: 2.0.1 378 - vary: 1.1.2 379 - transitivePeerDependencies: 380 - - supports-color 381 - 382 - finalhandler@2.1.0: 383 - dependencies: 384 - debug: 4.4.1 385 - encodeurl: 2.0.0 386 - escape-html: 1.0.3 387 - on-finished: 2.4.1 388 - parseurl: 1.3.3 389 - statuses: 2.0.2 390 - transitivePeerDependencies: 391 - - supports-color 392 - 393 - forwarded@0.2.0: {} 394 - 395 - fresh@2.0.0: {} 396 - 397 - function-bind@1.1.2: {} 398 - 399 - get-intrinsic@1.3.0: 400 - dependencies: 401 - call-bind-apply-helpers: 1.0.2 402 - es-define-property: 1.0.1 403 - es-errors: 1.3.0 404 - es-object-atoms: 1.1.1 405 - function-bind: 1.1.2 406 - get-proto: 1.0.1 407 - gopd: 1.2.0 408 - has-symbols: 1.1.0 409 - hasown: 2.0.2 410 - math-intrinsics: 1.1.0 411 - 412 - get-proto@1.0.1: 413 - dependencies: 414 - dunder-proto: 1.0.1 415 - es-object-atoms: 1.1.1 416 - 417 - gopd@1.2.0: {} 418 - 419 - has-symbols@1.1.0: {} 420 - 421 - hasown@2.0.2: 422 - dependencies: 423 - function-bind: 1.1.2 424 - 425 - http-errors@2.0.0: 426 - dependencies: 427 - depd: 2.0.0 428 - inherits: 2.0.4 429 - setprototypeof: 1.2.0 430 - statuses: 2.0.1 431 - toidentifier: 1.0.1 432 - 433 - iconv-lite@0.6.3: 434 - dependencies: 435 - safer-buffer: 2.1.2 436 - 437 - inherits@2.0.4: {} 438 - 439 - ipaddr.js@1.9.1: {} 440 - 441 - is-promise@4.0.0: {} 442 - 443 - math-intrinsics@1.1.0: {} 444 - 445 - media-typer@1.1.0: {} 446 - 447 - merge-descriptors@2.0.0: {} 448 - 449 - mime-db@1.54.0: {} 450 - 451 - mime-types@3.0.1: 452 - dependencies: 453 - mime-db: 1.54.0 454 - 455 - ms@2.1.3: {} 456 - 457 - negotiator@1.0.0: {} 458 - 459 - object-inspect@1.13.4: {} 460 - 461 - on-finished@2.4.1: 462 - dependencies: 463 - ee-first: 1.1.1 464 - 465 - once@1.4.0: 466 - dependencies: 467 - wrappy: 1.0.2 468 - 469 - parseurl@1.3.3: {} 470 - 471 - path-to-regexp@8.2.0: {} 472 - 473 - proxy-addr@2.0.7: 474 - dependencies: 475 - forwarded: 0.2.0 476 - ipaddr.js: 1.9.1 477 - 478 - qs@6.14.0: 479 - dependencies: 480 - side-channel: 1.1.0 481 - 482 - range-parser@1.2.1: {} 483 - 484 - raw-body@3.0.0: 485 - dependencies: 486 - bytes: 3.1.2 487 - http-errors: 2.0.0 488 - iconv-lite: 0.6.3 489 - unpipe: 1.0.0 490 - 491 - router@2.2.0: 492 - dependencies: 493 - debug: 4.4.1 494 - depd: 2.0.0 495 - is-promise: 4.0.0 496 - parseurl: 1.3.3 497 - path-to-regexp: 8.2.0 498 - transitivePeerDependencies: 499 - - supports-color 500 - 501 - safe-buffer@5.2.1: {} 502 - 503 - safer-buffer@2.1.2: {} 504 - 505 - send@1.2.0: 506 - dependencies: 507 - debug: 4.4.1 508 - encodeurl: 2.0.0 509 - escape-html: 1.0.3 510 - etag: 1.8.1 511 - fresh: 2.0.0 512 - http-errors: 2.0.0 513 - mime-types: 3.0.1 514 - ms: 2.1.3 515 - on-finished: 2.4.1 516 - range-parser: 1.2.1 517 - statuses: 2.0.2 518 - transitivePeerDependencies: 519 - - supports-color 520 - 521 - serve-static@2.2.0: 522 - dependencies: 523 - encodeurl: 2.0.0 524 - escape-html: 1.0.3 525 - parseurl: 1.3.3 526 - send: 1.2.0 527 - transitivePeerDependencies: 528 - - supports-color 529 - 530 - setprototypeof@1.2.0: {} 531 - 532 - side-channel-list@1.0.0: 533 - dependencies: 534 - es-errors: 1.3.0 535 - object-inspect: 1.13.4 536 - 537 - side-channel-map@1.0.1: 538 - dependencies: 539 - call-bound: 1.0.4 540 - es-errors: 1.3.0 541 - get-intrinsic: 1.3.0 542 - object-inspect: 1.13.4 543 - 544 - side-channel-weakmap@1.0.2: 545 - dependencies: 546 - call-bound: 1.0.4 547 - es-errors: 1.3.0 548 - get-intrinsic: 1.3.0 549 - object-inspect: 1.13.4 550 - side-channel-map: 1.0.1 551 - 552 - side-channel@1.1.0: 553 - dependencies: 554 - es-errors: 1.3.0 555 - object-inspect: 1.13.4 556 - side-channel-list: 1.0.0 557 - side-channel-map: 1.0.1 558 - side-channel-weakmap: 1.0.2 559 - 560 - statuses@2.0.1: {} 561 - 562 - statuses@2.0.2: {} 563 - 564 - toidentifier@1.0.1: {} 565 - 566 - type-is@2.0.1: 567 - dependencies: 568 - content-type: 1.0.5 569 - media-typer: 1.1.0 570 - mime-types: 3.0.1 571 - 572 - unpipe@1.0.0: {} 573 - 574 - vary@1.1.2: {} 575 - 576 - wrappy@1.0.2: {} 22 + zod@4.1.5: {}