Skip to content

Commit

Permalink
chore: self review clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
JuroUhlar committed Jan 2, 2024
1 parent 9dd2f99 commit 9018756
Show file tree
Hide file tree
Showing 9 changed files with 226 additions and 25 deletions.
19 changes: 10 additions & 9 deletions cron-jobs/delete_expired_ip_rules.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { BlockedIpDbModel, getBlockedIps } from '../src/server/botd-firewall/blockedIpsDatabase';
import { BlockedIpDbModel } from '../src/server/botd-firewall/blockedIpsDatabase';
import { Op } from 'sequelize';
import { buildFirewallRules, updateFirewallRuleset } from '../src/server/botd-firewall/updateFirewallRule';
import { syncFirewallRuleset } from '../src/server/botd-firewall/updateFirewallRule';
import { schedule } from 'node-cron';
import { HOUR_MS } from '../src/shared/timeUtils';
import 'dotenv/config';
Expand Down Expand Up @@ -30,13 +30,14 @@ async function deleteOldIpBlocks() {

console.log(`Deleted ${deletedCount} expired blocked IPs from the database.`);

if (deletedCount > 0) {
// Construct updated firewall rules from the blocked IP database and apply them to the Cloudflare application
const blockedIps = await getBlockedIps();
const newRules = await buildFirewallRules(blockedIps);
await updateFirewallRuleset(newRules);
console.log(`Updated Cloudflare firewall.`);
}
/**
* Construct updated firewall rules from the blocked IP database and apply them to the Cloudflare application.
* Note: We do this even if no IPs were deleted:
* A user might have blocked their IP but the database might have been cleared during site deployment right after,
* potentially leaving the IP blocked beyond the desired TTL. Safer to sync the firewall ruleset every time.
*/
await syncFirewallRuleset();
console.log(`Updated Cloudflare firewall.`);
} catch (error) {
console.log(`Error deleting old blocked IPs: ${error}`);
}
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"react-syntax-highlighter": "^15.5.0",
"react-use": "^17.4.0",
"sequelize": "^6.35.2",
"sharp": "^0.33.1",
"socket.io": "^4.5.4",
"socket.io-client": "^4.5.4",
"sqlite3": "^5.0.8",
Expand Down
5 changes: 4 additions & 1 deletion src/client/components/common/content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,10 @@ export const USE_CASES = {
Click <b>Block this bot IP</b> to prevent the bot from loading the page at all going forward. For demo purposes,
you are only allowed to block your own IP.
</>,
<>Try visiting the web scraping demo again (either as a bot or using your regular browser).</>,
<>
Try visiting the <Link href={'/web-scraping'}>web scraping demo</Link> again (either as a bot or using your
regular browser).
</>,
<>Your IP address is blocked from the page completely.</>,
],
moreResources: [
Expand Down
11 changes: 3 additions & 8 deletions src/pages/api/bot-firewall/block-ip.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import { NextApiRequest, NextApiResponse } from 'next';
import { deleteBlockedIp, getBlockedIps, saveBlockedIp } from '../../../server/botd-firewall/blockedIpsDatabase';
import {
buildFirewallRules,
updateFirewallRuleset as updateCloudflareRuleset,
} from '../../../server/botd-firewall/updateFirewallRule';
import { deleteBlockedIp, saveBlockedIp } from '../../../server/botd-firewall/blockedIpsDatabase';
import { syncFirewallRuleset } from '../../../server/botd-firewall/updateFirewallRule';
import { FingerprintJsServerApiClient, isEventError } from '@fingerprintjs/fingerprintjs-pro-server-api';
import { ALLOWED_REQUEST_TIMESTAMP_DIFF_MS, BACKEND_REGION, SERVER_API_KEY } from '../../../server/const';
import { ensurePostRequest } from '../../../server/server';
Expand Down Expand Up @@ -46,9 +43,7 @@ export default async function blockIp(req: NextApiRequest, res: NextApiResponse<
}

// Construct updated firewall rules from the blocked IP database and apply them to your Cloudflare application
const blockedIps = await getBlockedIps();
const newRules = await buildFirewallRules(blockedIps);
await updateCloudflareRuleset(newRules);
await syncFirewallRuleset();

// Return success
return res.status(200).json({ result: 'success', message: 'OK', ip, blocked });
Expand Down
12 changes: 9 additions & 3 deletions src/pages/api/bot-firewall/get-blocked-ips.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import { NextApiRequest, NextApiResponse } from 'next';
import { getBlockedIps } from '../../../server/botd-firewall/blockedIpsDatabase';

export default async function handler(req: NextApiRequest, res: NextApiResponse<string[]>) {
const blockedIps = await getBlockedIps();
res.status(200).json(blockedIps);
export default async function handler(_req: NextApiRequest, res: NextApiResponse<string[]>) {
try {
const blockedIps = await getBlockedIps();
res.status(200).json(blockedIps);
} catch (error) {
console.log(error);
res.statusMessage = `Something went wrong ${error}`;
return res.status(500).end();
}
}
9 changes: 8 additions & 1 deletion src/pages/api/bot-firewall/get-bot-visits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,12 @@ import { NextApiRequest, NextApiResponse } from 'next';
import { BotVisit, getBotVisits } from '../../../server/botd-firewall/botVisitDatabase';

export default async function handler(_req: NextApiRequest, res: NextApiResponse<BotVisit[]>) {
res.status(200).json(await getBotVisits());
try {
const blockedIps = await getBotVisits();
res.status(200).json(blockedIps);
} catch (error) {
console.log(error);
res.statusMessage = `Something went wrong ${error}`;
return res.status(500).end();
}
}
5 changes: 4 additions & 1 deletion src/pages/bot-firewall/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,10 @@ export const BotFirewall: NextPage<CustomPageProps> = ({ embed }) => {
>
{isLoadingBotVisits || isLoadingVisitorData ? 'Loading ⏳' : 'Reload'}
</Button>
<i>Note: For the purposes of this demo, you can only block/unblock your own IP address ({visitorData?.ip})</i>
<i>
Note: For the purposes of this demo, you can only block/unblock your own IP address ({visitorData?.ip}). The
block expires after one hour. The database of bot visits is cleared on every website update.
</i>
<table className={styles.ipsTable}>
<thead>
<tr>
Expand Down
8 changes: 8 additions & 0 deletions src/server/botd-firewall/updateFirewallRule.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { chunk } from '../../shared/utils';
import { getBlockedIps } from './blockedIpsDatabase';

/**
* Rule expression is limited to [4096 characters](https://developers.cloudflare.com/ruleset-engine/rules-language/expressions/#maximum-rule-expression-length).
Expand Down Expand Up @@ -76,6 +77,13 @@ export async function updateFirewallRuleset(rules: CloudflareRule[]) {
}
}

// Construct updated firewall rules from the blocked IP database and apply them to your Cloudflare application
export const syncFirewallRuleset = async () => {
const blockedIps = await getBlockedIps();
const newRules = await buildFirewallRules(blockedIps);
await updateFirewallRuleset(newRules);
};

// You might need to call the Cloudflare API to find the custom ruleset ID, here is a helper for that.
// Once you have the ID, you can save it in your env variables to avoid having to retrieve it for every request.
// @ts-expect-error
Expand Down
181 changes: 179 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,13 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"

"@emnapi/runtime@^0.44.0":
version "0.44.0"
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-0.44.0.tgz#1ef702f846cfcd559d28eb7673919087ba5b63e3"
integrity sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==
dependencies:
tslib "^2.4.0"

"@emotion/babel-plugin@^11.11.0":
version "11.11.0"
resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
Expand Down Expand Up @@ -677,6 +684,119 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044"
integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.1.tgz#9d3cb0e4899b10b003608a018877b45b6db02861"
integrity sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==
optionalDependencies:
"@img/sharp-libvips-darwin-arm64" "1.0.0"

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.1.tgz#3ad6b275dba0ed9995ce4403fc2c59b0475a0162"
integrity sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==
optionalDependencies:
"@img/sharp-libvips-darwin-x64" "1.0.0"

"@img/[email protected]":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.0.tgz#8baf27b01dabba524e885c30287e1916ab978de7"
integrity sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==

"@img/[email protected]":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.0.tgz#509113f649d3ea0e99b76d41437fc0049d8ba2f9"
integrity sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==

"@img/[email protected]":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.0.tgz#9e131cc95f9f8aa36da9addee89efead21ad9993"
integrity sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==

"@img/[email protected]":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.0.tgz#a529f68a28ab1d219907071c41ace029121d1c4f"
integrity sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==

"@img/[email protected]":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.0.tgz#c26aaa9ee58b47ff901bb5f93f29c4ab3f03caf7"
integrity sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==

"@img/[email protected]":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.0.tgz#7a04795fbf2668b9dd7c74bf8326cb779131d809"
integrity sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==

"@img/[email protected]":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.0.tgz#600e7322faa5ce124d3ae2cbf63808ea47678591"
integrity sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==

"@img/[email protected]":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.0.tgz#af33a04e75f192c5396c6a41df8b7b7bf15a8006"
integrity sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.1.tgz#3f419eb6f9ace924c511903a4d9034fb847de06b"
integrity sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==
optionalDependencies:
"@img/sharp-libvips-linux-arm64" "1.0.0"

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.1.tgz#87e157716c55fa274dd652e71bf9a5b7c260f8ab"
integrity sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==
optionalDependencies:
"@img/sharp-libvips-linux-arm" "1.0.0"

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.1.tgz#c554567bb211cb1e916562752e70ef65df0cdcb7"
integrity sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==
optionalDependencies:
"@img/sharp-libvips-linux-s390x" "1.0.0"

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.1.tgz#c8623c743e2a68b460b63bd2e225b1b5a485d144"
integrity sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==
optionalDependencies:
"@img/sharp-libvips-linux-x64" "1.0.0"

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.1.tgz#1b17f9950246108cb22cf98f1822fbe4a5b0dc9e"
integrity sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==
optionalDependencies:
"@img/sharp-libvips-linuxmusl-arm64" "1.0.0"

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.1.tgz#69e2ab197c6d6e7a09748e0f2d03244d2c2afed7"
integrity sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==
optionalDependencies:
"@img/sharp-libvips-linuxmusl-x64" "1.0.0"

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.1.tgz#aa6f33a8535e6bd4a66c59aeb569499db9d30043"
integrity sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==
dependencies:
"@emnapi/runtime" "^0.44.0"

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.1.tgz#8df522d79b3c08f59e65fbe773849daa353c4f12"
integrity sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==

"@img/[email protected]":
version "0.33.1"
resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.1.tgz#8b56e97dc9d987b070d7530a357161d0f057c5af"
integrity sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==

"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
version "0.3.3"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
Expand Down Expand Up @@ -2078,16 +2198,32 @@ [email protected]:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==

color-name@~1.1.4:
color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==

color-string@^1.9.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"

color-support@^1.1.2, color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==

color@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a"
integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==
dependencies:
color-convert "^2.0.1"
color-string "^1.9.0"

combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
Expand Down Expand Up @@ -2281,7 +2417,7 @@ dequal@^2.0.3:
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==

detect-libc@^2.0.0:
detect-libc@^2.0.0, detect-libc@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d"
integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==
Expand Down Expand Up @@ -3441,6 +3577,11 @@ is-arrayish@^0.2.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==

is-arrayish@^0.3.1:
version "0.3.2"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==

is-async-function@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
Expand Down Expand Up @@ -5039,6 +5180,35 @@ set-harmonic-interval@^1.0.1:
resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249"
integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==

sharp@^0.33.1:
version "0.33.1"
resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.1.tgz#81e8778b9f5e2b195666cf56b2e5a110c2399d70"
integrity sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==
dependencies:
color "^4.2.3"
detect-libc "^2.0.2"
semver "^7.5.4"
optionalDependencies:
"@img/sharp-darwin-arm64" "0.33.1"
"@img/sharp-darwin-x64" "0.33.1"
"@img/sharp-libvips-darwin-arm64" "1.0.0"
"@img/sharp-libvips-darwin-x64" "1.0.0"
"@img/sharp-libvips-linux-arm" "1.0.0"
"@img/sharp-libvips-linux-arm64" "1.0.0"
"@img/sharp-libvips-linux-s390x" "1.0.0"
"@img/sharp-libvips-linux-x64" "1.0.0"
"@img/sharp-libvips-linuxmusl-arm64" "1.0.0"
"@img/sharp-libvips-linuxmusl-x64" "1.0.0"
"@img/sharp-linux-arm" "0.33.1"
"@img/sharp-linux-arm64" "0.33.1"
"@img/sharp-linux-s390x" "0.33.1"
"@img/sharp-linux-x64" "0.33.1"
"@img/sharp-linuxmusl-arm64" "0.33.1"
"@img/sharp-linuxmusl-x64" "0.33.1"
"@img/sharp-wasm32" "0.33.1"
"@img/sharp-win32-ia32" "0.33.1"
"@img/sharp-win32-x64" "0.33.1"

shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
Expand Down Expand Up @@ -5087,6 +5257,13 @@ signal-exit@^3.0.0, signal-exit@^3.0.7:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==

simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
dependencies:
is-arrayish "^0.3.1"

slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
Expand Down

0 comments on commit 9018756

Please sign in to comment.