this repo has no description
0
fork

Configure Feed

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

Enforce remotePatterns when fetching external images (#727)

authored by

Victor Berchet and committed by
GitHub
36119c0f eb448362

+419 -40
+5
.changeset/plain-beds-win.md
··· 1 + --- 2 + "@opennextjs/cloudflare": minor 3 + --- 4 + 5 + Enforce remotePatterns when fetching external images
+2
packages/cloudflare/package.json
··· 64 64 "@tsconfig/strictest": "catalog:", 65 65 "@types/mock-fs": "catalog:", 66 66 "@types/node": "catalog:", 67 + "@types/picomatch": "^4.0.0", 67 68 "diff": "^8.0.2", 68 69 "esbuild": "catalog:", 69 70 "eslint": "catalog:", ··· 73 74 "globals": "catalog:", 74 75 "mock-fs": "catalog:", 75 76 "next": "catalog:", 77 + "picomatch": "^4.0.2", 76 78 "rimraf": "catalog:", 77 79 "typescript": "catalog:", 78 80 "typescript-eslint": "catalog:",
+25
packages/cloudflare/src/cli/build/open-next/compile-init.ts
··· 1 + /* eslint-disable @typescript-eslint/no-explicit-any */ 1 2 import path from "node:path"; 2 3 import { fileURLToPath } from "node:url"; 3 4 4 5 import { loadConfig } from "@opennextjs/aws/adapters/config/util.js"; 5 6 import type { BuildOptions } from "@opennextjs/aws/build/helper.js"; 6 7 import { build } from "esbuild"; 8 + import pm from "picomatch"; 7 9 8 10 /** 9 11 * Compiles the initialization code for the workerd runtime ··· 16 18 const nextConfig = loadConfig(path.join(options.appBuildOutputPath, ".next")); 17 19 const basePath = nextConfig.basePath ?? ""; 18 20 21 + // https://github.com/vercel/next.js/blob/d76f0b13/packages/next/src/build/index.ts#L573 22 + const nextRemotePatterns = nextConfig.images?.remotePatterns ?? []; 23 + 24 + const remotePatterns = nextRemotePatterns.map((p) => ({ 25 + protocol: p.protocol, 26 + hostname: p.hostname ? pm.makeRe(p.hostname).source : undefined, 27 + port: p.port, 28 + pathname: pm.makeRe(p.pathname ?? "**", { dot: true }).source, 29 + // search is canary only as of June 2025 30 + search: (p as any).search, 31 + })); 32 + 33 + // Local patterns are only in canary as of June 2025 34 + const nextLocalPatterns = (nextConfig.images as any)?.localPatterns ?? []; 35 + 36 + // https://github.com/vercel/next.js/blob/d76f0b13/packages/next/src/build/index.ts#L573 37 + const localPatterns = nextLocalPatterns.map((p: any) => ({ 38 + pathname: pm.makeRe(p.pathname ?? "**", { dot: true }).source, 39 + search: p.search, 40 + })); 41 + 19 42 await build({ 20 43 entryPoints: [initPath], 21 44 outdir: path.join(options.outputDir, "cloudflare"), ··· 27 50 define: { 28 51 __BUILD_TIMESTAMP_MS__: JSON.stringify(Date.now()), 29 52 __NEXT_BASE_PATH__: JSON.stringify(basePath), 53 + __IMAGES_REMOTE_PATTERNS__: JSON.stringify(remotePatterns), 54 + __IMAGES_LOCAL_PATTERNS__: JSON.stringify(localPatterns), 30 55 }, 31 56 }); 32 57 }
+98
packages/cloudflare/src/cli/templates/init.ts
··· 140 140 process.env.__NEXT_PRIVATE_ORIGIN = url.origin; 141 141 } 142 142 143 + export type RemotePattern = { 144 + protocol?: "http" | "https"; 145 + hostname: string; 146 + port?: string; 147 + pathname: string; 148 + search?: string; 149 + }; 150 + 151 + const imgRemotePatterns = __IMAGES_REMOTE_PATTERNS__; 152 + 153 + /** 154 + * Fetches an images. 155 + * 156 + * Local images (starting with a '/' as fetched using the passed fetcher). 157 + * Remote images should match the configured remote patterns or a 404 response is returned. 158 + */ 159 + export function fetchImage(fetcher: Fetcher | undefined, url: string) { 160 + // https://github.com/vercel/next.js/blob/d76f0b1/packages/next/src/server/image-optimizer.ts#L208 161 + if (!url || url.length > 3072 || url.startsWith("//")) { 162 + return new Response("Not Found", { status: 404 }); 163 + } 164 + 165 + // Local 166 + if (url.startsWith("/")) { 167 + if (/\/_next\/image($|\/)/.test(decodeURIComponent(parseUrl(url)?.pathname ?? ""))) { 168 + return new Response("Not Found", { status: 404 }); 169 + } 170 + 171 + return fetcher?.fetch(`http://assets.local${url}`); 172 + } 173 + 174 + // Remote 175 + let hrefParsed: URL; 176 + try { 177 + hrefParsed = new URL(url); 178 + } catch { 179 + return new Response("Not Found", { status: 404 }); 180 + } 181 + 182 + if (!["http:", "https:"].includes(hrefParsed.protocol)) { 183 + return new Response("Not Found", { status: 404 }); 184 + } 185 + 186 + if (!imgRemotePatterns.some((p: RemotePattern) => matchRemotePattern(p, hrefParsed))) { 187 + return new Response("Not Found", { status: 404 }); 188 + } 189 + 190 + return fetch(url, { cf: { cacheEverything: true } }); 191 + } 192 + 193 + export function matchRemotePattern(pattern: RemotePattern, url: URL): boolean { 194 + // https://github.com/vercel/next.js/blob/d76f0b1/packages/next/src/shared/lib/match-remote-pattern.ts 195 + if (pattern.protocol !== undefined) { 196 + if (pattern.protocol.replace(/:$/, "") !== url.protocol.replace(/:$/, "")) { 197 + return false; 198 + } 199 + } 200 + if (pattern.port !== undefined) { 201 + if (pattern.port !== url.port) { 202 + return false; 203 + } 204 + } 205 + 206 + if (pattern.hostname === undefined) { 207 + throw new Error(`Pattern should define hostname but found\n${JSON.stringify(pattern)}`); 208 + } else { 209 + if (!new RegExp(pattern.hostname).test(url.hostname)) { 210 + return false; 211 + } 212 + } 213 + 214 + if (pattern.search !== undefined) { 215 + if (pattern.search !== url.search) { 216 + return false; 217 + } 218 + } 219 + 220 + // Should be the same as writeImagesManifest() 221 + if (!new RegExp(pattern.pathname).test(url.pathname)) { 222 + return false; 223 + } 224 + 225 + return true; 226 + } 227 + 228 + function parseUrl(url: string): URL | undefined { 229 + let parsed: URL | undefined = undefined; 230 + try { 231 + parsed = new URL(url, "http://n"); 232 + } catch { 233 + // empty 234 + } 235 + return parsed; 236 + } 237 + 143 238 /* eslint-disable no-var */ 144 239 declare global { 145 240 // Build timestamp 146 241 var __BUILD_TIMESTAMP_MS__: number; 147 242 // Next basePath 148 243 var __NEXT_BASE_PATH__: string; 244 + // Images patterns 245 + var __IMAGES_REMOTE_PATTERNS__: RemotePattern[]; 246 + var __IMAGES_LOCAL_PATTERNS__: unknown[]; 149 247 } 150 248 /* eslint-enable no-var */
+2 -4
packages/cloudflare/src/cli/templates/worker.ts
··· 1 1 //@ts-expect-error: Will be resolved by wrangler build 2 - import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; 2 + import { fetchImage, runWithCloudflareRequestContext } from "./cloudflare/init.js"; 3 3 // @ts-expect-error: Will be resolved by wrangler build 4 4 import { handler as middlewareHandler } from "./middleware/handler.mjs"; 5 5 ··· 31 31 // Fallback for the Next default image loader. 32 32 if (url.pathname === `${globalThis.__NEXT_BASE_PATH__}/_next/image`) { 33 33 const imageUrl = url.searchParams.get("url") ?? ""; 34 - return imageUrl.startsWith("/") 35 - ? env.ASSETS?.fetch(`http://assets.local${imageUrl}`) 36 - : fetch(imageUrl, { cf: { cacheEverything: true } }); 34 + return fetchImage(env.ASSETS, imageUrl); 37 35 } 38 36 39 37 // - `Request`s are handled by the Next server
+287 -36
pnpm-lock.yaml
··· 192 192 version: 5.7.3 193 193 wrangler: 194 194 specifier: 'catalog:' 195 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 195 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 196 196 197 197 examples/bugs/gh-219: 198 198 dependencies: ··· 219 219 version: 2.1.1 220 220 drizzle-orm: 221 221 specifier: ^0.38.3 222 - version: 0.38.4(@cloudflare/workers-types@4.20250109.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@prisma/client@6.7.0(prisma@6.7.0(typescript@5.7.3))(typescript@5.7.3))(@types/better-sqlite3@7.6.12)(@types/react@19.0.0)(better-sqlite3@11.8.1)(prisma@6.7.0(typescript@5.7.3))(react@19.0.0) 222 + version: 0.38.4(@cloudflare/workers-types@4.20250109.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@prisma/client@6.7.0(prisma@6.7.0(typescript@5.7.3))(typescript@5.7.3))(@types/better-sqlite3@7.6.12)(@types/react@19.0.0)(better-sqlite3@11.8.1)(knex@3.1.0(better-sqlite3@11.8.1)(pg@8.16.0))(pg@8.16.0)(prisma@6.7.0(typescript@5.7.3))(react@19.0.0) 223 223 firebase: 224 224 specifier: ^11.1.0 225 225 version: 11.2.0 ··· 420 420 version: 5.7.3 421 421 wrangler: 422 422 specifier: 'catalog:' 423 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 423 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 424 424 425 425 examples/e2e/app-pages-router: 426 426 dependencies: ··· 466 466 version: 5.7.3 467 467 wrangler: 468 468 specifier: 'catalog:' 469 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 469 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 470 470 471 471 examples/e2e/app-router: 472 472 dependencies: ··· 512 512 version: 5.7.3 513 513 wrangler: 514 514 specifier: 'catalog:' 515 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 515 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 516 516 517 517 examples/e2e/experimental: 518 518 dependencies: ··· 546 546 version: 5.7.3 547 547 wrangler: 548 548 specifier: 'catalog:' 549 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 549 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 550 550 551 551 examples/e2e/pages-router: 552 552 dependencies: ··· 592 592 version: 5.7.3 593 593 wrangler: 594 594 specifier: 'catalog:' 595 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 595 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 596 596 597 597 examples/e2e/shared: 598 598 dependencies: ··· 651 651 version: 5.7.3 652 652 wrangler: 653 653 specifier: 'catalog:' 654 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 654 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 655 655 656 656 examples/next-partial-prerendering: 657 657 dependencies: ··· 712 712 version: 5.5.3 713 713 wrangler: 714 714 specifier: 'catalog:' 715 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 715 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 716 716 717 717 examples/overrides/d1-tag-next: 718 718 dependencies: ··· 746 746 version: 5.7.3 747 747 wrangler: 748 748 specifier: 'catalog:' 749 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 749 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 750 750 751 751 examples/overrides/memory-queue: 752 752 dependencies: ··· 780 780 version: 5.7.3 781 781 wrangler: 782 782 specifier: 'catalog:' 783 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 783 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 784 784 785 785 examples/overrides/r2-incremental-cache: 786 786 dependencies: ··· 814 814 version: 5.7.3 815 815 wrangler: 816 816 specifier: 'catalog:' 817 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 817 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 818 818 819 819 examples/overrides/static-assets-incremental-cache: 820 820 dependencies: ··· 848 848 version: 5.7.3 849 849 wrangler: 850 850 specifier: 'catalog:' 851 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 851 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 852 852 853 853 examples/playground14: 854 854 dependencies: ··· 873 873 version: 22.2.0 874 874 wrangler: 875 875 specifier: 'catalog:' 876 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 876 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 877 877 878 878 examples/playground15: 879 879 dependencies: ··· 898 898 version: 22.2.0 899 899 wrangler: 900 900 specifier: 'catalog:' 901 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 901 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 902 902 903 903 examples/prisma: 904 904 dependencies: ··· 938 938 version: 5.7.3 939 939 wrangler: 940 940 specifier: 'catalog:' 941 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 941 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 942 942 943 943 examples/ssg-app: 944 944 dependencies: ··· 972 972 version: 5.7.3 973 973 wrangler: 974 974 specifier: 'catalog:' 975 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 975 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 976 976 977 977 examples/vercel-blog-starter: 978 978 dependencies: ··· 1027 1027 version: 5.7.3 1028 1028 wrangler: 1029 1029 specifier: 'catalog:' 1030 - version: 4.19.1(@cloudflare/workers-types@4.20250109.0) 1030 + version: 4.19.1(@cloudflare/workers-types@4.20250224.0) 1031 1031 1032 1032 packages/cloudflare: 1033 1033 dependencies: ··· 1065 1065 '@types/node': 1066 1066 specifier: 'catalog:' 1067 1067 version: 22.2.0 1068 + '@types/picomatch': 1069 + specifier: ^4.0.0 1070 + version: 4.0.0 1068 1071 diff: 1069 1072 specifier: ^8.0.2 1070 1073 version: 8.0.2 ··· 1092 1095 next: 1093 1096 specifier: 'catalog:' 1094 1097 version: 14.2.24(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 1098 + picomatch: 1099 + specifier: ^4.0.2 1100 + version: 4.0.2 1095 1101 rimraf: 1096 1102 specifier: 'catalog:' 1097 1103 version: 6.0.1 ··· 4649 4655 '@types/normalize-package-data@2.4.4': 4650 4656 resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} 4651 4657 4658 + '@types/picomatch@4.0.0': 4659 + resolution: {integrity: sha512-J1Bng+wlyEERWSgJQU1Pi0HObCLVcr994xT/M+1wcl/yNRTGBupsCxthgkdYG+GCOMaQH7iSVUY3LJVBBqG7MQ==} 4660 + 4652 4661 '@types/prop-types@15.7.12': 4653 4662 resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 4654 4663 ··· 5290 5299 resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 5291 5300 engines: {node: '>=12.5.0'} 5292 5301 5302 + colorette@2.0.19: 5303 + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} 5304 + 5293 5305 combined-stream@1.0.8: 5294 5306 resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 5295 5307 engines: {node: '>= 0.8'} 5296 5308 5297 5309 comma-separated-tokens@2.0.3: 5298 5310 resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 5311 + 5312 + commander@10.0.1: 5313 + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 5314 + engines: {node: '>=14'} 5299 5315 5300 5316 commander@11.1.0: 5301 5317 resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} ··· 6142 6158 jiti: 6143 6159 optional: true 6144 6160 6161 + esm@3.2.25: 6162 + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} 6163 + engines: {node: '>=6'} 6164 + 6145 6165 espree@10.1.0: 6146 6166 resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} 6147 6167 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} ··· 6436 6456 resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 6437 6457 engines: {node: '>= 0.4'} 6438 6458 6459 + get-package-type@0.1.0: 6460 + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 6461 + engines: {node: '>=8.0.0'} 6462 + 6439 6463 get-proto@1.0.1: 6440 6464 resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 6441 6465 engines: {node: '>= 0.4'} ··· 6458 6482 get-tsconfig@4.8.0: 6459 6483 resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} 6460 6484 6485 + getopts@2.3.0: 6486 + resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} 6487 + 6461 6488 github-from-package@0.0.0: 6462 6489 resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} 6463 6490 ··· 6686 6713 internal-slot@1.1.0: 6687 6714 resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 6688 6715 engines: {node: '>= 0.4'} 6716 + 6717 + interpret@2.2.0: 6718 + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} 6719 + engines: {node: '>= 0.10'} 6689 6720 6690 6721 ipaddr.js@1.9.1: 6691 6722 resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} ··· 7012 7043 resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 7013 7044 engines: {node: '>=0.10.0'} 7014 7045 7046 + knex@3.1.0: 7047 + resolution: {integrity: sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==} 7048 + engines: {node: '>=16'} 7049 + hasBin: true 7050 + peerDependencies: 7051 + better-sqlite3: '*' 7052 + mysql: '*' 7053 + mysql2: '*' 7054 + pg: '*' 7055 + pg-native: '*' 7056 + sqlite3: '*' 7057 + tedious: '*' 7058 + peerDependenciesMeta: 7059 + better-sqlite3: 7060 + optional: true 7061 + mysql: 7062 + optional: true 7063 + mysql2: 7064 + optional: true 7065 + pg: 7066 + optional: true 7067 + pg-native: 7068 + optional: true 7069 + sqlite3: 7070 + optional: true 7071 + tedious: 7072 + optional: true 7073 + 7015 7074 ky@1.7.5: 7016 7075 resolution: {integrity: sha512-HzhziW6sc5m0pwi5M196+7cEBtbt0lCYi67wNsiwMUmz833wloE0gbzJPWKs1gliFKQb34huItDQX97LyOdPdA==} 7017 7076 engines: {node: '>=18'} ··· 7029 7088 7030 7089 libsql@0.4.7: 7031 7090 resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} 7032 - cpu: [x64, arm64, wasm32] 7033 7091 os: [darwin, linux, win32] 7034 7092 7035 7093 lilconfig@2.1.0: ··· 7093 7151 7094 7152 lodash.startcase@4.4.0: 7095 7153 resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 7154 + 7155 + lodash@4.17.21: 7156 + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 7096 7157 7097 7158 log-symbols@6.0.0: 7098 7159 resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} ··· 7903 7964 pend@1.2.0: 7904 7965 resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 7905 7966 7967 + pg-cloudflare@1.2.5: 7968 + resolution: {integrity: sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==} 7969 + 7970 + pg-connection-string@2.6.2: 7971 + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} 7972 + 7973 + pg-connection-string@2.9.0: 7974 + resolution: {integrity: sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==} 7975 + 7976 + pg-int8@1.0.1: 7977 + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} 7978 + engines: {node: '>=4.0.0'} 7979 + 7980 + pg-pool@3.10.0: 7981 + resolution: {integrity: sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA==} 7982 + peerDependencies: 7983 + pg: '>=8.0' 7984 + 7985 + pg-protocol@1.10.0: 7986 + resolution: {integrity: sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==} 7987 + 7988 + pg-types@2.2.0: 7989 + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} 7990 + engines: {node: '>=4'} 7991 + 7992 + pg@8.16.0: 7993 + resolution: {integrity: sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==} 7994 + engines: {node: '>= 8.0.0'} 7995 + peerDependencies: 7996 + pg-native: '>=3.0.1' 7997 + peerDependenciesMeta: 7998 + pg-native: 7999 + optional: true 8000 + 8001 + pgpass@1.0.5: 8002 + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} 8003 + 7906 8004 picocolors@1.0.0: 7907 8005 resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 7908 8006 ··· 8025 8123 resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 8026 8124 engines: {node: ^10 || ^12 || >=14} 8027 8125 8126 + postgres-array@2.0.0: 8127 + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} 8128 + engines: {node: '>=4'} 8129 + 8130 + postgres-bytea@1.0.0: 8131 + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} 8132 + engines: {node: '>=0.10.0'} 8133 + 8134 + postgres-date@1.0.7: 8135 + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} 8136 + engines: {node: '>=0.10.0'} 8137 + 8138 + postgres-interval@1.2.0: 8139 + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} 8140 + engines: {node: '>=0.10.0'} 8141 + 8028 8142 preact-render-to-string@5.2.6: 8029 8143 resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} 8030 8144 peerDependencies: ··· 8218 8332 resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} 8219 8333 engines: {node: '>= 14.18.0'} 8220 8334 8335 + rechoir@0.8.0: 8336 + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} 8337 + engines: {node: '>= 10.13.0'} 8338 + 8221 8339 reflect.getprototypeof@1.0.10: 8222 8340 resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 8223 8341 engines: {node: '>= 0.4'} ··· 8526 8644 resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} 8527 8645 engines: {node: '>=12'} 8528 8646 8647 + split2@4.2.0: 8648 + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 8649 + engines: {node: '>= 10.x'} 8650 + 8529 8651 sprintf-js@1.0.3: 8530 8652 resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 8531 8653 ··· 8757 8879 resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} 8758 8880 engines: {node: '>=18'} 8759 8881 8882 + tarn@3.0.2: 8883 + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} 8884 + engines: {node: '>=8.0.0'} 8885 + 8760 8886 teeny-request@9.0.0: 8761 8887 resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} 8762 8888 engines: {node: '>=14'} ··· 8779 8905 8780 8906 thenify@3.3.1: 8781 8907 resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 8908 + 8909 + tildify@2.0.0: 8910 + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} 8911 + engines: {node: '>=8'} 8782 8912 8783 8913 time-span@4.0.0: 8784 8914 resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} ··· 9271 9401 resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} 9272 9402 engines: {node: '>= 6.0'} 9273 9403 9404 + xtend@4.0.2: 9405 + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 9406 + engines: {node: '>=0.4'} 9407 + 9274 9408 y18n@5.0.8: 9275 9409 resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 9276 9410 engines: {node: '>=10'} ··· 9284 9418 yallist@5.0.0: 9285 9419 resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} 9286 9420 engines: {node: '>=18'} 9287 - 9288 - yaml@2.7.0: 9289 - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} 9290 - engines: {node: '>= 14'} 9291 - hasBin: true 9292 9421 9293 9422 yaml@2.7.1: 9294 9423 resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} ··· 11570 11699 '@eslint/config-array@0.19.2': 11571 11700 dependencies: 11572 11701 '@eslint/object-schema': 2.1.6 11573 - debug: 4.3.6 11702 + debug: 4.4.0 11574 11703 minimatch: 3.1.2 11575 11704 transitivePeerDependencies: 11576 11705 - supports-color ··· 11588 11717 '@eslint/eslintrc@2.1.4': 11589 11718 dependencies: 11590 11719 ajv: 6.12.6 11591 - debug: 4.3.6 11720 + debug: 4.4.0 11592 11721 espree: 9.6.1 11593 11722 globals: 13.24.0 11594 11723 ignore: 5.3.2 ··· 11616 11745 '@eslint/eslintrc@3.2.0': 11617 11746 dependencies: 11618 11747 ajv: 6.12.6 11619 - debug: 4.3.6 11748 + debug: 4.4.0 11620 11749 espree: 10.3.0 11621 11750 globals: 14.0.0 11622 11751 ignore: 5.3.2 ··· 12062 12191 '@humanwhocodes/config-array@0.13.0': 12063 12192 dependencies: 12064 12193 '@humanwhocodes/object-schema': 2.0.3 12065 - debug: 4.3.6 12194 + debug: 4.4.0 12066 12195 minimatch: 3.1.2 12067 12196 transitivePeerDependencies: 12068 12197 - supports-color ··· 13934 14063 13935 14064 '@types/normalize-package-data@2.4.4': {} 13936 14065 14066 + '@types/picomatch@4.0.0': {} 14067 + 13937 14068 '@types/prop-types@15.7.12': {} 13938 14069 13939 14070 '@types/qs@6.9.18': {} ··· 14843 14974 color-convert: 2.0.1 14844 14975 color-string: 1.9.1 14845 14976 14977 + colorette@2.0.19: 14978 + optional: true 14979 + 14846 14980 combined-stream@1.0.8: 14847 14981 dependencies: 14848 14982 delayed-stream: 1.0.0 14849 14983 optional: true 14850 14984 14851 14985 comma-separated-tokens@2.0.3: {} 14986 + 14987 + commander@10.0.1: 14988 + optional: true 14852 14989 14853 14990 commander@11.1.0: {} 14854 14991 ··· 15074 15211 transitivePeerDependencies: 15075 15212 - supports-color 15076 15213 15077 - drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250109.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@prisma/client@6.7.0(prisma@6.7.0(typescript@5.7.3))(typescript@5.7.3))(@types/better-sqlite3@7.6.12)(@types/react@19.0.0)(better-sqlite3@11.8.1)(prisma@6.7.0(typescript@5.7.3))(react@19.0.0): 15214 + drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250109.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@prisma/client@6.7.0(prisma@6.7.0(typescript@5.7.3))(typescript@5.7.3))(@types/better-sqlite3@7.6.12)(@types/react@19.0.0)(better-sqlite3@11.8.1)(knex@3.1.0(better-sqlite3@11.8.1)(pg@8.16.0))(pg@8.16.0)(prisma@6.7.0(typescript@5.7.3))(react@19.0.0): 15078 15215 optionalDependencies: 15079 15216 '@cloudflare/workers-types': 4.20250109.0 15080 15217 '@libsql/client': 0.14.0 ··· 15083 15220 '@types/better-sqlite3': 7.6.12 15084 15221 '@types/react': 19.0.0 15085 15222 better-sqlite3: 11.8.1 15223 + knex: 3.1.0(better-sqlite3@11.8.1)(pg@8.16.0) 15224 + pg: 8.16.0 15086 15225 prisma: 6.7.0(typescript@5.7.3) 15087 15226 react: 19.0.0 15088 15227 ··· 16193 16332 transitivePeerDependencies: 16194 16333 - supports-color 16195 16334 16335 + esm@3.2.25: 16336 + optional: true 16337 + 16196 16338 espree@10.1.0: 16197 16339 dependencies: 16198 16340 acorn: 8.14.0 ··· 16330 16472 '@nodelib/fs.walk': 1.2.8 16331 16473 glob-parent: 5.1.2 16332 16474 merge2: 1.4.1 16333 - micromatch: 4.0.7 16475 + micromatch: 4.0.8 16334 16476 16335 16477 fast-glob@3.3.2: 16336 16478 dependencies: ··· 16602 16744 hasown: 2.0.2 16603 16745 math-intrinsics: 1.1.0 16604 16746 16747 + get-package-type@0.1.0: 16748 + optional: true 16749 + 16605 16750 get-proto@1.0.1: 16606 16751 dependencies: 16607 16752 dunder-proto: 1.0.1 ··· 16627 16772 get-tsconfig@4.8.0: 16628 16773 dependencies: 16629 16774 resolve-pkg-maps: 1.0.0 16775 + 16776 + getopts@2.3.0: 16777 + optional: true 16630 16778 16631 16779 github-from-package@0.0.0: {} 16632 16780 ··· 16918 17066 es-errors: 1.3.0 16919 17067 hasown: 2.0.2 16920 17068 side-channel: 1.1.0 17069 + 17070 + interpret@2.2.0: 17071 + optional: true 16921 17072 16922 17073 ipaddr.js@1.9.1: {} 16923 17074 ··· 17263 17414 17264 17415 kind-of@6.0.3: {} 17265 17416 17417 + knex@3.1.0(better-sqlite3@11.8.1)(pg@8.16.0): 17418 + dependencies: 17419 + colorette: 2.0.19 17420 + commander: 10.0.1 17421 + debug: 4.3.4 17422 + escalade: 3.2.0 17423 + esm: 3.2.25 17424 + get-package-type: 0.1.0 17425 + getopts: 2.3.0 17426 + interpret: 2.2.0 17427 + lodash: 4.17.21 17428 + pg-connection-string: 2.6.2 17429 + rechoir: 0.8.0 17430 + resolve-from: 5.0.0 17431 + tarn: 3.0.2 17432 + tildify: 2.0.0 17433 + optionalDependencies: 17434 + better-sqlite3: 11.8.1 17435 + pg: 8.16.0 17436 + transitivePeerDependencies: 17437 + - supports-color 17438 + optional: true 17439 + 17266 17440 ky@1.7.5: {} 17267 17441 17268 17442 language-subtag-registry@0.3.23: {} ··· 17330 17504 lodash.once@4.1.1: {} 17331 17505 17332 17506 lodash.startcase@4.4.0: {} 17507 + 17508 + lodash@4.17.21: 17509 + optional: true 17333 17510 17334 17511 log-symbols@6.0.0: 17335 17512 dependencies: ··· 18258 18435 18259 18436 pend@1.2.0: {} 18260 18437 18438 + pg-cloudflare@1.2.5: 18439 + optional: true 18440 + 18441 + pg-connection-string@2.6.2: 18442 + optional: true 18443 + 18444 + pg-connection-string@2.9.0: 18445 + optional: true 18446 + 18447 + pg-int8@1.0.1: 18448 + optional: true 18449 + 18450 + pg-pool@3.10.0(pg@8.16.0): 18451 + dependencies: 18452 + pg: 8.16.0 18453 + optional: true 18454 + 18455 + pg-protocol@1.10.0: 18456 + optional: true 18457 + 18458 + pg-types@2.2.0: 18459 + dependencies: 18460 + pg-int8: 1.0.1 18461 + postgres-array: 2.0.0 18462 + postgres-bytea: 1.0.0 18463 + postgres-date: 1.0.7 18464 + postgres-interval: 1.2.0 18465 + optional: true 18466 + 18467 + pg@8.16.0: 18468 + dependencies: 18469 + pg-connection-string: 2.9.0 18470 + pg-pool: 3.10.0(pg@8.16.0) 18471 + pg-protocol: 1.10.0 18472 + pg-types: 2.2.0 18473 + pgpass: 1.0.5 18474 + optionalDependencies: 18475 + pg-cloudflare: 1.2.5 18476 + optional: true 18477 + 18478 + pgpass@1.0.5: 18479 + dependencies: 18480 + split2: 4.2.0 18481 + optional: true 18482 + 18261 18483 picocolors@1.0.0: {} 18262 18484 18263 18485 picocolors@1.0.1: {} ··· 18319 18541 postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)): 18320 18542 dependencies: 18321 18543 lilconfig: 3.1.2 18322 - yaml: 2.7.0 18544 + yaml: 2.7.1 18323 18545 optionalDependencies: 18324 18546 postcss: 8.5.1 18325 18547 ts-node: 10.9.1(@types/node@20.14.10)(typescript@5.5.3) ··· 18327 18549 postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.1(@types/node@20.17.6)(typescript@5.7.3)): 18328 18550 dependencies: 18329 18551 lilconfig: 3.1.2 18330 - yaml: 2.7.0 18552 + yaml: 2.7.1 18331 18553 optionalDependencies: 18332 18554 postcss: 8.5.1 18333 18555 ts-node: 10.9.1(@types/node@20.17.6)(typescript@5.7.3) ··· 18335 18557 postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.1(@types/node@22.12.0)(typescript@5.7.3)): 18336 18558 dependencies: 18337 18559 lilconfig: 3.1.2 18338 - yaml: 2.7.0 18560 + yaml: 2.7.1 18339 18561 optionalDependencies: 18340 18562 postcss: 8.5.1 18341 18563 ts-node: 10.9.1(@types/node@22.12.0)(typescript@5.7.3) ··· 18343 18565 postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.1(@types/node@22.2.0)(typescript@5.7.3)): 18344 18566 dependencies: 18345 18567 lilconfig: 3.1.2 18346 - yaml: 2.7.0 18568 + yaml: 2.7.1 18347 18569 optionalDependencies: 18348 18570 postcss: 8.5.1 18349 18571 ts-node: 10.9.1(@types/node@22.2.0)(typescript@5.7.3) ··· 18401 18623 picocolors: 1.1.1 18402 18624 source-map-js: 1.2.1 18403 18625 18626 + postgres-array@2.0.0: 18627 + optional: true 18628 + 18629 + postgres-bytea@1.0.0: 18630 + optional: true 18631 + 18632 + postgres-date@1.0.7: 18633 + optional: true 18634 + 18635 + postgres-interval@1.2.0: 18636 + dependencies: 18637 + xtend: 4.0.2 18638 + optional: true 18639 + 18404 18640 preact-render-to-string@5.2.6(preact@10.25.4): 18405 18641 dependencies: 18406 18642 preact: 10.25.4 ··· 18617 18853 18618 18854 readdirp@4.1.1: {} 18619 18855 18856 + rechoir@0.8.0: 18857 + dependencies: 18858 + resolve: 1.22.10 18859 + optional: true 18860 + 18620 18861 reflect.getprototypeof@1.0.10: 18621 18862 dependencies: 18622 18863 call-bind: 1.0.8 ··· 19067 19308 19068 19309 split-on-first@3.0.0: {} 19069 19310 19311 + split2@4.2.0: 19312 + optional: true 19313 + 19070 19314 sprintf-js@1.0.3: {} 19071 19315 19072 19316 stackback@0.0.2: {} ··· 19458 19702 mkdirp: 3.0.1 19459 19703 yallist: 5.0.0 19460 19704 19705 + tarn@3.0.2: 19706 + optional: true 19707 + 19461 19708 teeny-request@9.0.0: 19462 19709 dependencies: 19463 19710 http-proxy-agent: 5.0.0 ··· 19488 19735 thenify@3.3.1: 19489 19736 dependencies: 19490 19737 any-promise: 1.3.0 19738 + 19739 + tildify@2.0.0: 19740 + optional: true 19491 19741 19492 19742 time-span@4.0.0: 19493 19743 dependencies: ··· 20113 20363 dependencies: 20114 20364 os-paths: 4.4.0 20115 20365 20366 + xtend@4.0.2: 20367 + optional: true 20368 + 20116 20369 y18n@5.0.8: {} 20117 20370 20118 20371 yallist@3.1.1: {} ··· 20120 20373 yallist@4.0.0: {} 20121 20374 20122 20375 yallist@5.0.0: {} 20123 - 20124 - yaml@2.7.0: {} 20125 20376 20126 20377 yaml@2.7.1: {} 20127 20378