diff --git a/package-lock.json b/package-lock.json index f29b6ff5da3..55ed88bda27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@headlessui/tailwindcss": "^0.2.2", "@hookform/resolvers": "^3.3.4", "@inkeep/cxkit-react": "^0.5.116", - "@next/bundle-analyzer": "^16.1.6", + "@next/bundle-analyzer": "16.3.3", "@octokit/core": "^6.1.2", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-toast": "^1.2.19", @@ -45,7 +45,7 @@ "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "mermaid": "^11.15.0", - "next": "^16.1.6", + "next": "16.3.3", "next-mdx-remote": "^6.0.0", "next-sitemap": "^4.2.3", "next-themes": "^0.4.6", @@ -80,7 +80,7 @@ "@eslint/compat": "^1.2.0", "@eslint/js": "^9.0.0", "@neon/sdk": "^2.0.0", - "@next/eslint-plugin-next": "^16.2.1", + "@next/eslint-plugin-next": "16.3.3", "@playwright/test": "1.61.1", "@scalar/openapi-parser": "^0.28.2", "@shikijs/transformers": "^1.3.0", @@ -2451,6 +2451,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -2904,9 +2905,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", + "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", "cpu": [ "arm64" ], @@ -2916,19 +2917,19 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "@img/sharp-libvips-darwin-arm64": "1.3.3" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", + "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", "cpu": [ "x64" ], @@ -2938,19 +2939,38 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "@img/sharp-libvips-darwin-x64": "1.3.3" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", + "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", + "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", "cpu": [ "arm64" ], @@ -2964,9 +2984,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", + "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", "cpu": [ "x64" ], @@ -2980,9 +3000,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", + "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", "cpu": [ "arm" ], @@ -2996,9 +3016,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", + "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", "cpu": [ "arm64" ], @@ -3012,9 +3032,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", + "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", "cpu": [ "ppc64" ], @@ -3028,9 +3048,9 @@ } }, "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", + "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", "cpu": [ "riscv64" ], @@ -3044,9 +3064,9 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", + "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", "cpu": [ "s390x" ], @@ -3060,9 +3080,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", + "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", "cpu": [ "x64" ], @@ -3076,9 +3096,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", + "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", "cpu": [ "arm64" ], @@ -3092,9 +3112,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", + "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", "cpu": [ "x64" ], @@ -3108,9 +3128,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", + "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", "cpu": [ "arm" ], @@ -3120,19 +3140,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" + "@img/sharp-libvips-linux-arm": "1.3.3" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", + "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", "cpu": [ "arm64" ], @@ -3142,19 +3162,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" + "@img/sharp-libvips-linux-arm64": "1.3.3" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", + "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", "cpu": [ "ppc64" ], @@ -3164,19 +3184,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" + "@img/sharp-libvips-linux-ppc64": "1.3.3" } }, "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", + "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", "cpu": [ "riscv64" ], @@ -3186,19 +3206,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" + "@img/sharp-libvips-linux-riscv64": "1.3.3" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", + "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", "cpu": [ "s390x" ], @@ -3208,19 +3228,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "@img/sharp-libvips-linux-s390x": "1.3.3" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", + "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", "cpu": [ "x64" ], @@ -3230,19 +3250,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "@img/sharp-libvips-linux-x64": "1.3.3" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", + "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", "cpu": [ "arm64" ], @@ -3252,19 +3272,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", + "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", "cpu": [ "x64" ], @@ -3274,38 +3294,64 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "1.3.3" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", + "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", + "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", "cpu": [ "wasm32" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "license": "Apache-2.0", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.7.0" + "@img/sharp-wasm32": "0.35.4" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", + "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", "cpu": [ "arm64" ], @@ -3315,16 +3361,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", + "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", "cpu": [ "ia32" ], @@ -3334,16 +3380,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz", + "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==", "cpu": [ "x64" ], @@ -3353,7 +3399,7 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" @@ -4250,27 +4296,28 @@ } }, "node_modules/@next/bundle-analyzer": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-16.2.1.tgz", - "integrity": "sha512-fbj2WE6dnCyG8CvQnrBfpHyxdOIyZ4aEHJY0bSqAmamRiIXDqunFQPDvuSOPo24mJE9zQHw7TY6d+sGrXO98TQ==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-16.3.3.tgz", + "integrity": "sha512-pJFJrjUnxac2RBEgRIhXqoRkaSxMGQEGvvLhPKA2h1hXAzq60DzRj8Vp8+um2cMuHRuLcwRFYNlcuS74/hZ7AQ==", "license": "MIT", "dependencies": { "webpack-bundle-analyzer": "4.10.1" } }, "node_modules/@next/env": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.1.tgz", - "integrity": "sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.3.3.tgz", + "integrity": "sha512-U2eYQRwXj+dsqxV79zFqExDdatnNY/ZWc2nsJU1p/OgT7fd3dXwlF6OjYaFQCfMoeTA19PWq+wVmYgimVA+V+g==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.1.tgz", - "integrity": "sha512-r0epZGo24eT4g08jJlg2OEryBphXqO8aL18oajoTKLzHJ6jVr6P6FI58DLMug04MwD3j8Fj0YK0slyzneKVyzA==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.3.3.tgz", + "integrity": "sha512-pbEh30vvjKpDoTAmo1v3q2uM4JUi8QaEBpbmjWvGfoec2jLghy/WNtvzAT0bk+Ik9oz6etjt4YjXEk4BQnicCw==", "dev": true, "license": "MIT", "dependencies": { + "@eslint-community/eslint-utils": "4.9.1", "fast-glob": "3.3.1" } }, @@ -4304,9 +4351,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.1.tgz", - "integrity": "sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.3.3.tgz", + "integrity": "sha512-8Hiv32QJPwdV6KYJ8meR9SBA061tQqnIKTJDocvOXlEQqib0xMFpzArosuffFUUc0sslbh7QQ8a3Yey1QV8EIw==", "cpu": [ "arm64" ], @@ -4320,12 +4367,13 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.1.tgz", - "integrity": "sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.3.3.tgz", + "integrity": "sha512-A1lgKgwVchRYmSe467zdwhxT9040dd8lH+o65sL5Jet8fjB4kegw/rDyPIpYVRb6jAqwXFOJpjIXJLxQKLiE3A==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4335,12 +4383,13 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.1.tgz", - "integrity": "sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.3.3.tgz", + "integrity": "sha512-bf0FIssMFueU2dm7vQEWWxk0c8UjKTdW0yzuh0sQsD8pf1+KCLDdaqhYZNMYGmXwEOiHAUzgBKudovIlcvvBjg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -4350,12 +4399,13 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.1.tgz", - "integrity": "sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.3.3.tgz", + "integrity": "sha512-W7viwCk9JY/cAkdz/A273rd5bb3RgT/IHwR7Upv90tunjBWNtAAhGhoecHh+teRNRSinuAFmE+l7fwZ4YKkrXg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -4365,12 +4415,13 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.1.tgz", - "integrity": "sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.3.3.tgz", + "integrity": "sha512-0W46zw1N3ODpI6n0GeivHvvob1pooozgZVqy65k0mh4/7vr+FbY9+WpHzNVXjHipJf/A3FDheBG19H1s5A25rA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -4380,12 +4431,13 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.1.tgz", - "integrity": "sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.3.3.tgz", + "integrity": "sha512-H4mBso8ZTMBPtdT0PN0pBx2ayTvQuTuvS6qT13d77yVFJXAPCxkyIhLTmdMaGTJs0krQYI/qpzdHijCeihXhbg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -4395,12 +4447,13 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.1.tgz", - "integrity": "sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.3.3.tgz", + "integrity": "sha512-cTMUJpcEGmeywofCUfhR+rSsoE33+rVPnPEYNTNdLNlsOeEg/vktOsKUSTb28vUGqD2jkm4Zaskcwn7OCI6FQg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -4410,12 +4463,13 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.1.tgz", - "integrity": "sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.3.3.tgz", + "integrity": "sha512-2VR4cTBzHXaBjnGsuH6GyJjENzQOmHeAh11uY1iUhjm3j5dEUrVJuUj+VL78jaGi/Dik8xS76zEj18BsFhlVZQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -8322,9 +8376,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -18043,9 +18097,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.13", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.13.tgz", - "integrity": "sha512-sPdqC6ByMVVGvF1ynvvMo0/o+oD1VX7DaHhijt1bFgjvBkHBib4t49GoNDhf2NDta4oeUNlaGbSt5K7qjZ955Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { "type": "github", @@ -18068,16 +18122,16 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/next/-/next-16.2.1.tgz", - "integrity": "sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/next/-/next-16.3.3.tgz", + "integrity": "sha512-tuRTx1nQ/yVw83cwJBo9F+njGUgMn3UHQycreWHB8XsStvvAh1AthbI8/4IpKnFaF58F+iSiHejYOlMQ/eq83g==", "license": "MIT", "dependencies": { - "@next/env": "16.2.1", - "@swc/helpers": "0.5.15", + "@next/env": "16.3.3", + "@swc/helpers": "0.5.23", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", + "postcss": "8.5.23", "styled-jsx": "5.1.6" }, "bin": { @@ -18087,15 +18141,15 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.2.1", - "@next/swc-darwin-x64": "16.2.1", - "@next/swc-linux-arm64-gnu": "16.2.1", - "@next/swc-linux-arm64-musl": "16.2.1", - "@next/swc-linux-x64-gnu": "16.2.1", - "@next/swc-linux-x64-musl": "16.2.1", - "@next/swc-win32-arm64-msvc": "16.2.1", - "@next/swc-win32-x64-msvc": "16.2.1", - "sharp": "^0.34.5" + "@next/swc-darwin-arm64": "16.3.3", + "@next/swc-darwin-x64": "16.3.3", + "@next/swc-linux-arm64-gnu": "16.3.3", + "@next/swc-linux-arm64-musl": "16.3.3", + "@next/swc-linux-x64-gnu": "16.3.3", + "@next/swc-linux-x64-musl": "16.3.3", + "@next/swc-win32-arm64-msvc": "16.3.3", + "@next/swc-win32-x64-msvc": "16.3.3", + "sharp": "^0.35.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -18232,34 +18286,6 @@ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -18827,6 +18853,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -18864,9 +18891,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", "funding": [ { "type": "opencollective", @@ -18883,7 +18910,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -20266,9 +20293,9 @@ } }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "devOptional": true, "license": "ISC", "bin": { @@ -20337,48 +20364,53 @@ } }, "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz", + "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@img/colour": "^1.0.0", + "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", - "semver": "^7.7.3" + "semver": "^7.8.5" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" + "@img/sharp-darwin-arm64": "0.35.4", + "@img/sharp-darwin-x64": "0.35.4", + "@img/sharp-freebsd-wasm32": "0.35.4", + "@img/sharp-libvips-darwin-arm64": "1.3.3", + "@img/sharp-libvips-darwin-x64": "1.3.3", + "@img/sharp-libvips-linux-arm": "1.3.3", + "@img/sharp-libvips-linux-arm64": "1.3.3", + "@img/sharp-libvips-linux-ppc64": "1.3.3", + "@img/sharp-libvips-linux-riscv64": "1.3.3", + "@img/sharp-libvips-linux-s390x": "1.3.3", + "@img/sharp-libvips-linux-x64": "1.3.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", + "@img/sharp-libvips-linuxmusl-x64": "1.3.3", + "@img/sharp-linux-arm": "0.35.4", + "@img/sharp-linux-arm64": "0.35.4", + "@img/sharp-linux-ppc64": "0.35.4", + "@img/sharp-linux-riscv64": "0.35.4", + "@img/sharp-linux-s390x": "0.35.4", + "@img/sharp-linux-x64": "0.35.4", + "@img/sharp-linuxmusl-arm64": "0.35.4", + "@img/sharp-linuxmusl-x64": "0.35.4", + "@img/sharp-webcontainers-wasm32": "0.35.4", + "@img/sharp-win32-arm64": "0.35.4", + "@img/sharp-win32-ia32": "0.35.4", + "@img/sharp-win32-x64": "0.35.4" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/shebang-command": { diff --git a/package.json b/package.json index b55561f9d52..c0bdd179a7f 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "@headlessui/tailwindcss": "^0.2.2", "@hookform/resolvers": "^3.3.4", "@inkeep/cxkit-react": "^0.5.116", - "@next/bundle-analyzer": "^16.1.6", + "@next/bundle-analyzer": "16.3.3", "@octokit/core": "^6.1.2", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-toast": "^1.2.19", @@ -95,7 +95,7 @@ "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "mermaid": "^11.15.0", - "next": "^16.1.6", + "next": "16.3.3", "next-mdx-remote": "^6.0.0", "next-sitemap": "^4.2.3", "next-themes": "^0.4.6", @@ -130,7 +130,7 @@ "@eslint/compat": "^1.2.0", "@eslint/js": "^9.0.0", "@neon/sdk": "^2.0.0", - "@next/eslint-plugin-next": "^16.2.1", + "@next/eslint-plugin-next": "16.3.3", "@playwright/test": "1.61.1", "@scalar/openapi-parser": "^0.28.2", "@shikijs/transformers": "^1.3.0", diff --git a/public/pricing.md b/public/pricing.md index 4b7ee36e681..091a265f2c3 100644 --- a/public/pricing.md +++ b/public/pricing.md @@ -109,4 +109,3 @@ See [Cost optimization](https://neon.com/docs/introduction/cost-optimization.md) - Get credits for building Open Source on Neon: https://neon.com/programs/open-source.md - Apply for the Agent Plan (for AI agent platforms): https://neon.com/docs/introduction/agent-plan.md - More plan details: https://neon.com/docs/introduction/plans.md - diff --git a/src/components/pages/pricing/hero/plans/data/plans.js b/src/components/pages/pricing/hero/plans/data/plans.js index 04b81b5c809..a54f059ee9e 100644 --- a/src/components/pages/pricing/hero/plans/data/plans.js +++ b/src/components/pages/pricing/hero/plans/data/plans.js @@ -1,5 +1,8 @@ +import BACKEND_PRICING from 'constants/backend-pricing'; import LINKS from 'constants/links'; +const { objectStorage, functions } = BACKEND_PRICING; + export default [ { planId: 'free', @@ -37,14 +40,14 @@ export default [ features: [ { title: 'Managed Better Auth', info: 'Up to 60k MAUs' }, { - title: 'Object Storage', + title: `${objectStorage.freeAllowanceGb} GB of Object Storage`, tag: { label: 'Beta', theme: 'orange-muted' }, - info: 'No charges applied during beta, with usage limits', + info: '

Measured across your account, not per project

', }, { title: 'Functions', tag: { label: 'Beta', theme: 'orange-muted' }, - info: 'No charges applied during beta, with usage limits', + info: `

${functions.free.activeCapacityHours} active capacity-hours per month

${functions.free.waitingCapacityHours} waiting capacity-hours per month

${functions.free.invocations} invocations per month

`, }, ], }, @@ -91,12 +94,12 @@ export default [ { title: 'Object Storage', tag: { label: 'Beta', theme: 'orange-muted' }, - info: 'No charges applied during beta, with usage limits', + info: `

$${objectStorage.storageRatePerGbMonth} per GB-month

No charges applied during beta

`, }, { title: 'Functions', tag: { label: 'Beta', theme: 'orange-muted' }, - info: 'No charges applied during beta, with usage limits', + info: `

$${functions.launch.activeCapacityHourRate} per active capacity-hour

$${functions.launch.waitingCapacityHourRate} per waiting capacity-hour

$${functions.launch.invocationRatePerMillion} per million invocations

No charges applied during beta

`, }, { title: 'AI Gateway', @@ -148,12 +151,12 @@ export default [ { title: 'Object Storage', tag: { label: 'Beta', theme: 'orange-muted' }, - info: 'No charges applied during beta, with usage limits', + info: `

$${objectStorage.storageRatePerGbMonth} per GB-month

No charges applied during beta

`, }, { title: 'Functions', tag: { label: 'Beta', theme: 'orange-muted' }, - info: 'No charges applied during beta, with usage limits', + info: `

$${functions.scale.activeCapacityHourRate} per active capacity-hour

$${functions.scale.waitingCapacityHourRate} per waiting capacity-hour

$${functions.scale.invocationRatePerMillion} per million invocations

No charges applied during beta

`, }, { title: 'AI Gateway', diff --git a/src/components/pages/pricing/plans/data/plans.js b/src/components/pages/pricing/plans/data/plans.js index 6e84c9f39fd..aa4b9d66fb8 100644 --- a/src/components/pages/pricing/plans/data/plans.js +++ b/src/components/pages/pricing/plans/data/plans.js @@ -1,3 +1,7 @@ +import BACKEND_PRICING from 'constants/backend-pricing'; + +const { objectStorage, functions } = BACKEND_PRICING; + export default { headings: { feature: '', @@ -163,20 +167,72 @@ export default { feature: { title: 'Object Storage', tag: { label: 'Beta', theme: 'orange-muted' }, + subtitle: 'Stored volume', }, - free: 'No charges applied during beta, with usage limits', - launch: 'No charges applied during beta, with usage limits', - scale: 'No charges applied during beta, with usage limits', + free: `${objectStorage.freeAllowanceGb} GB included`, + launch: `$${objectStorage.storageRatePerGbMonth} per GB-monthNo charges during beta`, + scale: `$${objectStorage.storageRatePerGbMonth} per GB-monthNo charges during beta`, }, { - rows: '2', + fluid: true, feature: { title: 'Functions', tag: { label: 'Beta', theme: 'orange-muted' }, + subtitle: 'Compute and invocations', + }, + free: { + sections: [ + { + title: 'Compute', + details: [ + `${functions.free.activeCapacityHours} active capacity-hours`, + `${functions.free.waitingCapacityHours} waiting capacity-hours`, + ], + }, + { + title: 'Invocations', + details: [`${functions.free.invocations} invocations`], + }, + ], + }, + launch: { + sections: [ + { + title: 'Compute', + details: [ + `$${functions.launch.activeCapacityHourRate} per active capacity-hour`, + `$${functions.launch.waitingCapacityHourRate} per waiting capacity-hour`, + ], + }, + { + title: 'Invocations', + details: [`$${functions.launch.invocationRatePerMillion} per 1M invocations`], + }, + { + title: 'Charges', + details: ['No charges during beta'], + }, + ], + }, + scale: { + sections: [ + { + title: 'Compute', + details: [ + `$${functions.scale.activeCapacityHourRate} per active capacity-hour`, + `$${functions.scale.waitingCapacityHourRate} per waiting capacity-hour`, + ], + }, + { + title: 'Invocations', + details: [`$${functions.scale.invocationRatePerMillion} per 1M invocations`], + }, + { + title: 'Charges', + details: ['No charges during beta'], + }, + ], }, - free: 'No charges applied during beta, with usage limits', - launch: 'No charges applied during beta, with usage limits', - scale: 'No charges applied during beta, with usage limits', }, { rows: '2', diff --git a/src/components/pages/pricing/plans/table/table.jsx b/src/components/pages/pricing/plans/table/table.jsx index e1007c942eb..0d4512d7b24 100644 --- a/src/components/pages/pricing/plans/table/table.jsx +++ b/src/components/pages/pricing/plans/table/table.jsx @@ -19,6 +19,30 @@ const rowClass = { 3: 'h-[92px] xl:h-[108px]', }; +const PricingSections = ({ sections }) => ( +
+ {sections.map(({ title, details }) => ( +
+ {title} + {details.map((detail) => ( + + {detail} + + ))} +
+ ))} +
+); + +PricingSections.propTypes = { + sections: PropTypes.arrayOf( + PropTypes.shape({ + title: PropTypes.string.isRequired, + details: PropTypes.arrayOf(PropTypes.string).isRequired, + }) + ).isRequired, +}; + const TableHeading = ({ className, label, price, isLabelsColumn, isFeaturedPlan }) => { // placeholder for the labels column if (isLabelsColumn) { @@ -86,7 +110,7 @@ const Table = () => { return (
  • { isGroupTitle ? 'h-[86px] justify-end border-t pb-[18px] lg:h-[66px]' : ['py-[14px] lg:py-2.5', rowClass[item.rows]], + item.fluid && 'grow', i === 1 && 'lg:pl-5', index === 0 && 'border-t-0', 'before:opacity-0', @@ -179,8 +204,10 @@ const Table = () => { ); } else if (typeof item[key] === 'object') { - const { title, info, moreLink } = item[key]; - cell = ( + const { title, info, moreLink, sections } = item[key]; + cell = sections ? ( + + ) : (
    {title} {info && ( @@ -226,6 +253,7 @@ const Table = () => { rowsWithGroupTitles.includes(index) ? 'h-[86px] lg:h-[66px]' : ['py-[14px] lg:py-2.5', rowClass[item.rows]], + item.fluid && 'grow', item[key] !== undefined && !rowsWithGroupTitles.includes(index), i === arr.length - 1 && 'before:absolute before:-inset-y-px before:-right-4 before:z-0 before:w-4 before:rounded-tr-lg before:rounded-br-lg before:bg-gray-new-8 before:opacity-0 before:transition-opacity lg:before:hidden' diff --git a/src/constants/backend-pricing.js b/src/constants/backend-pricing.js new file mode 100644 index 00000000000..ddad23c46da --- /dev/null +++ b/src/constants/backend-pricing.js @@ -0,0 +1,25 @@ +const BACKEND_PRICING = { + objectStorage: { + freeAllowanceGb: '5', + storageRatePerGbMonth: '0.023', + }, + functions: { + free: { + activeCapacityHours: '10', + waitingCapacityHours: '400', + invocations: '1M', + }, + launch: { + activeCapacityHourRate: '0.10', + waitingCapacityHourRate: '0.025', + invocationRatePerMillion: '0.60', + }, + scale: { + activeCapacityHourRate: '0.12', + waitingCapacityHourRate: '0.03', + invocationRatePerMillion: '0.60', + }, + }, +}; + +export default BACKEND_PRICING; diff --git a/src/scripts/check-pricing-sync.js b/src/scripts/check-pricing-sync.js index d7553a099f1..031875fb9e5 100644 --- a/src/scripts/check-pricing-sync.js +++ b/src/scripts/check-pricing-sync.js @@ -36,6 +36,7 @@ function stripHtml(str) { if (typeof str !== 'string') return str; return str .replace(/]*>([^<]+)<\/a>/gi, '$2') + .replace(/<\/?(?:p|div|li|strong)[^>]*>/gi, ' ') .replace(/]*>/gi, ' ') .replace(/<\/span>/gi, '') .replace(//gi, ' ') @@ -59,6 +60,9 @@ function extractCellValue(cell) { if (cell === true) return 'Yes'; if (cell === false) return '--'; if (cell === undefined || cell === null) return undefined; + if (typeof cell === 'object' && Array.isArray(cell.sections)) { + return cell.sections.flatMap(({ title, details }) => [title, ...details]).join(' '); + } if (typeof cell === 'object' && cell.title) return stripHtml(cell.title); if (typeof cell === 'string') return stripHtml(cell); return String(cell); @@ -127,6 +131,17 @@ const betaValue = (val) => { return normalizeValue(val); }; +// The overview table intentionally summarizes beta availability while the +// pricing table leads with Free-plan allowances. This normalizer compares only +// availability here; exact allowances and rates are verified separately by the +// backend pricing checks below. +const offeredValue = (val) => { + if (val === false || val === undefined || val === null) return '--'; + const s = String(val).trim(); + if (!s || s === '--' || s === '—' || s === '-') return '--'; + return 'offered'; +}; + function extractCore(pattern, replacement) { return (val) => { if (!val || val === '--') return val; @@ -152,12 +167,14 @@ function loadEsmModule(filePath, globalStubs = {}) { } function loadComponentData() { + const backendPricing = loadEsmModule(path.join(PROJECT_ROOT, 'src/constants/backend-pricing.js')); const heroPlans = loadEsmModule( path.join(PROJECT_ROOT, 'src/components/pages/pricing/hero/plans/data/plans.js'), - { LINKS: {} } + { LINKS: {}, BACKEND_PRICING: backendPricing } ); const tableData = loadEsmModule( - path.join(PROJECT_ROOT, 'src/components/pages/pricing/plans/data/plans.js') + path.join(PROJECT_ROOT, 'src/components/pages/pricing/plans/data/plans.js'), + { BACKEND_PRICING: backendPricing } ); const tableRows = {}; @@ -174,18 +191,31 @@ function loadComponentData() { const heroPlanMap = {}; for (const p of heroPlans) { - const allFeatures = [ + const features = [ ...(p.features?.database?.features || []), ...(p.features?.other?.features || []), - ].map((f) => f.title); + ]; + const featureTitles = features.map((feature) => feature.title); + const backendFeatureCopy = {}; + for (const feature of features) { + const canonicalTitle = feature.title.includes('Object Storage') + ? 'Object Storage' + : feature.title; + if (canonicalTitle === 'Object Storage' || canonicalTitle === 'Functions') { + backendFeatureCopy[canonicalTitle] = stripHtml( + [feature.title, feature.info].filter(Boolean).join(' ') + ); + } + } heroPlanMap[p.planId] = { computeRate: p.computeRate, storageRate: p.storageRate, - featureTitles: allFeatures, + featureTitles, + backendFeatureCopy, }; } - return { heroPlans: heroPlanMap, tableRows }; + return { backendPricing, heroPlans: heroPlanMap, tableRows }; } // --------------------------------------------------------------------------- @@ -619,9 +649,13 @@ const CROSS_SOURCE_CHECKS = [ }, // --- Backend (Beta) --- - // These features are free during beta with no per-plan numbers to drift, so we - // only verify that each source agrees they're offered (betaValue collapses the + // These features are free during beta, so on Launch and Scale we only verify + // that each source agrees they're offered (betaValue collapses the // differently-worded "free/no charge during beta" prose to a single concept). + // Object Storage and Functions publish their post-beta rates on the pricing + // page, but the cells keep a beta note, so betaValue still applies there. + // The Free cells lead with the included allowance instead of a beta note and + // have nothing comparable in the docs table, hence offeredValue. ...['free', 'launch', 'scale'].flatMap((plan) => [ { id: `object-storage-${plan}`, @@ -629,7 +663,7 @@ const CROSS_SOURCE_CHECKS = [ comp: 'Object Storage', docs: 'Object Storage (Beta)', plan, - norm: betaValue, + norm: plan === 'free' ? offeredValue : betaValue, agentLabel: 'Object Storage', }, { @@ -638,7 +672,7 @@ const CROSS_SOURCE_CHECKS = [ comp: 'Functions', docs: 'Functions (Beta)', plan, - norm: betaValue, + norm: plan === 'free' ? offeredValue : betaValue, agentLabel: 'Functions', }, { @@ -847,6 +881,56 @@ const HERO_RATE_CHECKS = [ ], ]; +function normalizeBackendPricingCopy(value) { + return normalizeValue(value) + ?.toLowerCase() + .replace(/\bmillion\b/g, '1m') + .replace(/capacity-hours?/g, 'capacity-hour'); +} + +function buildBackendUiChecks(backendPricing) { + const { objectStorage, functions } = backendPricing; + + return [ + { + id: 'backend-object-storage-free', + label: 'Hero vs Table: Object Storage allowance (Free)', + feature: 'Object Storage', + plan: 'free', + expected: [`${objectStorage.freeAllowanceGb} GB`], + }, + ...['launch', 'scale'].map((plan) => ({ + id: `backend-object-storage-${plan}`, + label: `Hero vs Table: Object Storage rate (${plan})`, + feature: 'Object Storage', + plan, + expected: [`$${objectStorage.storageRatePerGbMonth} per GB-month`], + })), + { + id: 'backend-functions-free', + label: 'Hero vs Table: Functions allowances (Free)', + feature: 'Functions', + plan: 'free', + expected: [ + `${functions.free.activeCapacityHours} active capacity-hour`, + `${functions.free.waitingCapacityHours} waiting capacity-hour`, + `${functions.free.invocations} invocations`, + ], + }, + ...['launch', 'scale'].map((plan) => ({ + id: `backend-functions-${plan}`, + label: `Hero vs Table: Functions rates (${plan})`, + feature: 'Functions', + plan, + expected: [ + `$${functions[plan].activeCapacityHourRate} per active capacity-hour`, + `$${functions[plan].waitingCapacityHourRate} per waiting capacity-hour`, + `$${functions[plan].invocationRatePerMillion} per 1M invocations`, + ], + })), + ]; +} + // --------------------------------------------------------------------------- // Run comparisons // --------------------------------------------------------------------------- @@ -942,6 +1026,27 @@ function runChecks(componentData, docsTable) { }); } + for (const { id, label, feature, plan, expected } of buildBackendUiChecks( + componentData.backendPricing + )) { + const rawHero = componentData.heroPlans[plan]?.backendFeatureCopy?.[feature]; + const rawTable = componentData.tableRows[feature]?.[plan]; + const normalizedHero = normalizeBackendPricingCopy(rawHero); + const normalizedTable = normalizeBackendPricingCopy(rawTable); + const expectedValues = expected.map(normalizeBackendPricingCopy); + const heroMatches = expectedValues.every((value) => normalizedHero?.includes(value)); + const tableMatches = expectedValues.every((value) => normalizedTable?.includes(value)); + + results.push({ + id, + label, + status: heroMatches && tableMatches ? 'ok' : 'mismatch', + isInternal: true, + component: { raw: rawHero, normalized: normalizedHero }, + docs: { raw: rawTable, normalized: normalizedTable }, + }); + } + // Coverage: find rows in each source not covered by any comparison const uncoveredComponent = Object.keys(componentData.tableRows).filter( (k) => @@ -993,10 +1098,64 @@ function checkRates(content, knownRates) { return knownRates.filter((rate) => !content.includes(rate)); } -function runPricingMdChecks(docsContent, pricingMdContent) { +function normalizePricingSource(content) { + return content.replace(/\s+/g, ' ').trim(); +} + +function buildBackendCopyRequirements(backendPricing) { + const { objectStorage, functions } = backendPricing; + const functionDocsTable = [ + `| Active compute | $${functions.launch.activeCapacityHourRate}/Capacity-Hour | $${functions.scale.activeCapacityHourRate}/Capacity-Hour |`, + `| Waiting compute | $${functions.launch.waitingCapacityHourRate}/Capacity-Hour | $${functions.scale.waitingCapacityHourRate}/Capacity-Hour |`, + `| Invocations | $${functions.launch.invocationRatePerMillion}/M | $${functions.scale.invocationRatePerMillion}/M |`, + ]; + + return [ + { + source: 'content/docs/introduction/plans.md', + contentKey: 'docs', + values: [ + `**Storage**: $${objectStorage.storageRatePerGbMonth}/GB-month`, + `you get ${objectStorage.freeAllowanceGb} GB of Object Storage`, + ...functionDocsTable, + `you get ${functions.free.activeCapacityHours} active Capacity-Hours, ${functions.free.waitingCapacityHours} waiting Capacity-Hours, and 1 million invocations`, + ], + }, + { + source: 'public/pricing.md', + contentKey: 'pricingMd', + values: [ + `Object Storage is $${objectStorage.storageRatePerGbMonth}/GB-month`, + `active compute is $${functions.launch.activeCapacityHourRate}/Capacity-Hour (Launch) or $${functions.scale.activeCapacityHourRate}/Capacity-Hour (Scale)`, + `waiting compute is $${functions.launch.waitingCapacityHourRate}/Capacity-Hour (Launch) or $${functions.scale.waitingCapacityHourRate}/Capacity-Hour (Scale)`, + `invocations are $${functions.launch.invocationRatePerMillion}/M on both plans`, + `${objectStorage.freeAllowanceGb} GB Object Storage and, for Functions, ${functions.free.activeCapacityHours} active Capacity-Hours, ${functions.free.waitingCapacityHours} waiting Capacity-Hours, and ${functions.free.invocations} invocations`, + ], + }, + ]; +} + +function checkBackendCopy(docsContent, pricingMdContent, backendPricing) { + const sources = { + docs: normalizePricingSource(docsContent), + pricingMd: normalizePricingSource(pricingMdContent), + }; + const requirements = buildBackendCopyRequirements(backendPricing); + const missingBackendFacts = requirements.flatMap(({ source, contentKey, values }) => + values + .filter((value) => !sources[contentKey].includes(value)) + .map((value) => ({ source, value })) + ); + const totalBackendFacts = requirements.reduce((total, { values }) => total + values.length, 0); + + return { missingBackendFacts, totalBackendFacts }; +} + +function runPricingMdChecks(docsContent, pricingMdContent, backendPricing) { const knownRates = buildKnownRates(docsContent); const missingRates = checkRates(pricingMdContent, knownRates); - return { missingRates, knownRates }; + const backendCopy = checkBackendCopy(docsContent, pricingMdContent, backendPricing); + return { missingRates, knownRates, ...backendCopy }; } function runAgentChecks(checks, pricingMdContent, docsTable) { @@ -1070,7 +1229,9 @@ function summarize(results, pricingMd, agentChecks) { const counts = { ok: 0, mismatch: 0, missing: 0, skip: 0 }; for (const r of results) counts[r.status]++; const pricingIssues = pricingMd - ? (pricingMd.readError ? 1 : 0) + pricingMd.missingRates.length + ? (pricingMd.readError ? 1 : 0) + + pricingMd.missingRates.length + + pricingMd.missingBackendFacts.length : 0; const agentIssues = agentChecks ? (agentChecks.parseError ? 1 : 0) + @@ -1152,6 +1313,15 @@ Source 3: Hand-edited agent markdown console.log(` Missing rates (${pricingMd.missingRates.length}):`); pricingMd.missingRates.forEach((r) => console.log(` - ${r}`)); } + console.log( + ` OK ${pricingMd.totalBackendFacts - pricingMd.missingBackendFacts.length}/${pricingMd.totalBackendFacts} backend pricing facts present` + ); + if (pricingMd.missingBackendFacts.length) { + console.log(` Missing backend pricing facts (${pricingMd.missingBackendFacts.length}):`); + pricingMd.missingBackendFacts.forEach(({ source, value }) => + console.log(` - ${source}: ${value}`) + ); + } } } @@ -1170,7 +1340,7 @@ Source 3: Hand-edited agent markdown agentChecks ); console.log( - `\nSummary: ${ok} match, ${mismatch} mismatch, ${missing} missing, ${skip} skipped, ${pricingIssues} rate issue(s), ${agentIssues} cell issue(s)` + `\nSummary: ${ok} match, ${mismatch} mismatch, ${missing} missing, ${skip} skipped, ${pricingIssues} pricing source issue(s), ${agentIssues} cell issue(s)` ); if (mismatch > 0 || pricingIssues > 0 || agentIssues > 0) { console.log('\nResult: FAIL — drift detected\n'); @@ -1215,6 +1385,12 @@ function printTerseReport(results, pricingMd, agentChecks) { if (pricingMd.missingRates.length) { console.log(` Missing rates: ${pricingMd.missingRates.join(', ')}`); } + if (pricingMd.missingBackendFacts.length) { + console.log(' Missing backend pricing facts:'); + pricingMd.missingBackendFacts.forEach(({ source, value }) => + console.log(` - ${source}: ${value}`) + ); + } console.log(''); } @@ -1230,7 +1406,7 @@ function printTerseReport(results, pricingMd, agentChecks) { } console.log( - `Summary: ${ok} match, ${mismatch} mismatch, ${missing} missing, ${pricingIssues} rate issue(s), ${agentIssues} cell issue(s).` + `Summary: ${ok} match, ${mismatch} mismatch, ${missing} missing, ${pricingIssues} pricing source issue(s), ${agentIssues} cell issue(s).` ); console.log('Run with --verbose to see all checks.'); } @@ -1292,11 +1468,17 @@ function main() { pricingMdContent = fs.readFileSync(PRICING_MD_PATH, 'utf-8'); } catch (err) { const readError = `Failed to read ${path.relative(PROJECT_ROOT, PRICING_MD_PATH)}: ${err.message}`; - pricingMd = { readError, missingRates: [], knownRates: [] }; + pricingMd = { + readError, + missingRates: [], + knownRates: [], + missingBackendFacts: [], + totalBackendFacts: 0, + }; agentChecks = { results: [] }; } if (pricingMdContent !== undefined) { - pricingMd = runPricingMdChecks(docsContent, pricingMdContent); + pricingMd = runPricingMdChecks(docsContent, pricingMdContent, componentData.backendPricing); agentChecks = runAgentChecks(CROSS_SOURCE_CHECKS, pricingMdContent, docsTable); }