Openstatus www.openstatus.dev
6
fork

Configure Feed

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

๐Ÿš€ move to google task (#399)

* ๐Ÿš€ move to google task

* ๐Ÿ”ฅ

authored by

Thibault Le Ouay and committed by
GitHub
02d8d3ad f417b60e

+382 -30
+26 -26
.github/workflows/pull_request_template.md
··· 1 - ## Type of change 2 - 3 - <!--- What types of changes does your code introduce? Put an `x` in the box that apply: --> 4 - 5 - - [ ] ๐Ÿ› Bug fix 6 - - [ ] ๐ŸŒŸ New feature 7 - - [ ] ๐Ÿ”จ Breaking change 8 - - [ ] ๐Ÿ“– Refactoring / dependency upgrade / documentation 9 - 10 - ## Description 11 - 12 - <!--- Describe your changes in detail --> 13 - 14 - ### A picture tells a thousand words (if any) 15 - 16 - ### Before this PR 17 - 18 - {Please add a screenshot here} 19 - 20 - ### After this PR 21 - 22 - {Please add a screenshot here} 23 - 24 - ### Related Issue (optional) 25 - 26 - <!--- Please link to the issue here: --> 1 + ## Type of change 2 + 3 + <!--- What types of changes does your code introduce? Put an `x` in the box that apply: --> 4 + 5 + - [ ] ๐Ÿ› Bug fix 6 + - [ ] ๐ŸŒŸ New feature 7 + - [ ] ๐Ÿ”จ Breaking change 8 + - [ ] ๐Ÿ“– Refactoring / dependency upgrade / documentation 9 + 10 + ## Description 11 + 12 + <!--- Describe your changes in detail --> 13 + 14 + ### A picture tells a thousand words (if any) 15 + 16 + ### Before this PR 17 + 18 + {Please add a screenshot here} 19 + 20 + ### After this PR 21 + 22 + {Please add a screenshot here} 23 + 24 + ### Related Issue (optional) 25 + 26 + <!--- Please link to the issue here: -->
+28
apps/server/README.md
··· 12 12 ```bash 13 13 flyctl deploy --config apps/server/fly.toml --dockerfile apps/server/Dockerfile 14 14 ``` 15 + 16 + ## Docker 17 + 18 + Build the docker image locally 19 + 20 + ```bash 21 + docker build . -t registry.fly.io/openstatus-docker:openstatus-docker-v0 --file ./apps/server/Dockerfile --platform linux/amd64 22 + ``` 23 + 24 + if you want to run the docker image locally 25 + 26 + ```bash 27 + docker run -p 3000:3000 registry.fly.io/openstatus-docker:openstatus-docker-v0 28 + ``` 29 + 30 + Push to Fly Registry 31 + 32 + ```bash 33 + docker push registry.fly.io/openstatus-docker:openstatus-docker-v0 34 + 35 + ``` 36 + 37 + Deploy to Fly 38 + 39 + ```bash 40 + flyctl deploy --app openstatus-docker \ 41 + --image registry.fly.io/openstatus-docker:openstatus-docker-v0 42 + ```
+1
apps/server/src/checker/checker.ts
··· 84 84 }, {}) || {}; 85 85 86 86 const res = await fetch(data?.url, { 87 + verbose: true, 87 88 method: data?.method, 88 89 cache: "no-store", 89 90 headers: {
+26 -2
apps/server/src/checker/index.ts
··· 40 40 } 41 41 42 42 try { 43 - console.log(`start checker for ${result.data.url}`); 43 + console.log( 44 + `start checker URL: ${result.data.url} monitorId ${result.data.monitorId}`, 45 + ); 44 46 checker(result.data); 45 - console.log(`end checker for ${result.data.url}`); 47 + console.log( 48 + `end checker URL: ${result.data.url} monitorId ${result.data.monitorId}`, 49 + ); 46 50 return c.text("Ok", 200); 47 51 } catch (e) { 48 52 console.error(e); 49 53 return c.text("Internal Server Error", 500); 50 54 } 51 55 }); 56 + 57 + checkerRoute.post("/googleTest", async (c) => { 58 + const json = await c.req.json(); 59 + 60 + const auth = c.req.header("Authorization"); 61 + if (auth !== `Basic ${env.CRON_SECRET}`) { 62 + console.error("Unauthorized"); 63 + return c.text("Unauthorized", 401); 64 + } 65 + console.log("Retry : ", c.req.header("X-CloudTasks-TaskRetryCount")); 66 + const result = payloadSchema.safeParse(json); 67 + 68 + if (!result.success) { 69 + console.error(result.error); 70 + return c.text("Unprocessable Entity", 422); 71 + } 72 + 73 + console.log(`Google Checker should try this: ${result.data.url}`); 74 + return c.text("Ok", 200); 75 + });
+1
apps/server/src/env.ts
··· 11 11 QSTASH_CURRENT_SIGNING_KEY: z.string().min(1), 12 12 QSTASH_NEXT_SIGNING_KEY: z.string().min(1), 13 13 FLY_REGION: z.string(), 14 + CRON_SECRET: z.string(), 14 15 }, 15 16 16 17 /**
+1
apps/web/package.json
··· 11 11 }, 12 12 "dependencies": { 13 13 "@clerk/nextjs": "4.25.1", 14 + "@google-cloud/tasks": "4.0.1", 14 15 "@headlessui/react": "1.7.17", 15 16 "@hookform/resolvers": "3.3.1", 16 17 "@openstatus/analytics": "workspace:*",
+67
apps/web/src/app/api/checker/cron/test/route.ts
··· 1 + import type { NextRequest } from "next/server"; 2 + import { NextResponse } from "next/server"; 3 + import { CloudTasksClient } from "@google-cloud/tasks"; 4 + // import type { Payload } from "../../schema"; 5 + import type { google } from "@google-cloud/tasks/build/protos/protos"; 6 + 7 + import { flyRegions } from "@openstatus/tinybird"; 8 + 9 + import { env } from "@/env"; 10 + import { isAuthorizedDomain } from "../_cron"; 11 + 12 + export const dynamic = "force-dynamic"; 13 + export const maxDuration = 300; 14 + export const runtime = "nodejs"; // 'nodejs' is the default 15 + 16 + export async function GET(req: NextRequest) { 17 + // if (isAuthorizedDomain(req.url)) { 18 + const client = new CloudTasksClient({ 19 + projectId: env.GCP_PROJECT_ID, 20 + credentials: { 21 + client_email: process.env.GCP_CLIENT_EMAIL, 22 + private_key: env.GCP_PRIVATE_KEY.replaceAll("\\n", "\n"), 23 + }, 24 + }); 25 + // Just send 10 random ping to the checker 26 + for (let i = 0; i < 10; i++) { 27 + const parent = client.queuePath( 28 + env.GCP_PROJECT_ID, 29 + env.GCP_LOCATION, 30 + "10m", 31 + ); 32 + 33 + const url = "https://api.openstatus.dev/googleTest"; 34 + 35 + const payload = { 36 + status: "active", 37 + url: "https://www.openstatus.dev", 38 + method: "GET", 39 + workspaceId: "1", 40 + monitorId: "1", 41 + cronTimestamp: 0, 42 + pageIds: [], 43 + }; 44 + 45 + for (const region of flyRegions) { 46 + const task: google.cloud.tasks.v2beta3.ITask = { 47 + httpRequest: { 48 + headers: { 49 + "Content-Type": "application/json", // Set content type to ensure compatibility your application's request parsing 50 + "fly-prefer-region": region, 51 + Authorization: `Basic ${env.CRON_SECRET}`, 52 + }, 53 + httpMethod: "POST", 54 + url, 55 + body: Buffer.from(JSON.stringify(payload)).toString("base64"), 56 + }, 57 + }; 58 + console.log("Sending task:"); 59 + console.log(task); 60 + const request = { parent: parent, task: task }; 61 + const [response] = await client.createTask(request); 62 + console.log(`Created task ${response.name}`); 63 + } 64 + } 65 + // } 66 + return NextResponse.json({ success: true }); 67 + }
+10
apps/web/src/env.ts
··· 17 17 STRIPE_WEBHOOK_SECRET_KEY: z.string(), 18 18 UNKEY_TOKEN: z.string(), 19 19 UNKEY_API_ID: z.string(), 20 + GCP_PROJECT_ID: z.string(), 21 + GCP_LOCATION: z.string(), 22 + GCP_CLIENT_EMAIL: z.string(), 23 + GCP_PRIVATE_KEY: z.string(), 24 + CRON_SECRET: z.string(), 20 25 }, 21 26 client: { 22 27 NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().min(1), ··· 51 56 NEXT_PUBLIC_SENTRY_DSN: process.env.NEXT_PUBLIC_SENTRY_DSN, 52 57 UNKEY_TOKEN: process.env.UNKEY_TOKEN, 53 58 UNKEY_API_ID: process.env.UNKEY_API_ID, 59 + GCP_PROJECT_ID: process.env.GCP_PROJECT_ID, 60 + GCP_LOCATION: process.env.GCP_LOCATION, 61 + GCP_CLIENT_EMAIL: process.env.GCP_CLIENT_EMAIL, 62 + GCP_PRIVATE_KEY: process.env.GCP_PRIVATE_KEY, 63 + CRON_SECRET: process.env.CRON_SECRET, 54 64 }, 55 65 });
+222 -2
pnpm-lock.yaml
··· 127 127 '@clerk/nextjs': 128 128 specifier: 4.25.1 129 129 version: 4.25.1(next@13.5.3)(react-dom@18.2.0)(react@18.2.0) 130 + '@google-cloud/tasks': 131 + specifier: 4.0.1 132 + version: 4.0.1 130 133 '@headlessui/react': 131 134 specifier: 1.7.17 132 135 version: 1.7.17(react-dom@18.2.0)(react@18.2.0) ··· 2101 2104 resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} 2102 2105 dev: false 2103 2106 2107 + /@google-cloud/tasks@4.0.1: 2108 + resolution: {integrity: sha512-cluHSN52WgaNoDPVguxCeXZq4rTBHqJntXFB9aI9zG8n8MJukf6V0H7yoAXpKXQxyeXv4LRy108kAgLPgXP3yA==} 2109 + engines: {node: '>=14.0.0'} 2110 + dependencies: 2111 + google-gax: 4.0.5 2112 + transitivePeerDependencies: 2113 + - encoding 2114 + - supports-color 2115 + dev: false 2116 + 2104 2117 /@grpc/grpc-js@1.9.3: 2105 2118 resolution: {integrity: sha512-b8iWtdrYIeT5fdZdS4Br/6h/kuk0PW5EVBUGk1amSbrpL8DlktJD43CdcCWwRdd6+jgwHhADSbL9CsNnm6EUPA==} 2119 + engines: {node: ^8.13.0 || >=10.10.0} 2120 + dependencies: 2121 + '@grpc/proto-loader': 0.7.10 2122 + '@types/node': 20.8.0 2123 + dev: false 2124 + 2125 + /@grpc/grpc-js@1.9.7: 2126 + resolution: {integrity: sha512-yMaA/cIsRhGzW3ymCNpdlPcInXcovztlgu/rirThj2b87u3RzWUszliOqZ/pldy7yhmJPS8uwog+kZSTa4A0PQ==} 2106 2127 engines: {node: ^8.13.0 || >=10.10.0} 2107 2128 dependencies: 2108 2129 '@grpc/proto-loader': 0.7.10 ··· 5308 5329 '@types/node': 20.8.0 5309 5330 dev: false 5310 5331 5332 + /@types/caseless@0.12.4: 5333 + resolution: {integrity: sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g==} 5334 + dev: false 5335 + 5311 5336 /@types/chai-subset@1.3.3: 5312 5337 resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} 5313 5338 dependencies: ··· 5509 5534 resolution: {integrity: sha512-tfzBBb7OV2PbUfKbG6zRE5UbmtdLVCKT/XT364Z9ny6pXNbd9GnIB6aFYpq2A5lZ6mq9bhXgK6h5MFGNwhMmuQ==} 5510 5535 dev: false 5511 5536 5537 + /@types/long@4.0.2: 5538 + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} 5539 + dev: false 5540 + 5512 5541 /@types/luxon@3.3.1: 5513 5542 resolution: {integrity: sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==} 5514 5543 dev: true ··· 5610 5639 '@types/prop-types': 15.7.8 5611 5640 '@types/scheduler': 0.16.4 5612 5641 csstype: 3.1.2 5642 + 5643 + /@types/request@2.48.11: 5644 + resolution: {integrity: sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==} 5645 + dependencies: 5646 + '@types/caseless': 0.12.4 5647 + '@types/node': 20.8.0 5648 + '@types/tough-cookie': 4.0.3 5649 + form-data: 2.5.1 5650 + dev: false 5613 5651 5614 5652 /@types/resolve@1.20.2: 5615 5653 resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} ··· 5931 5969 resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 5932 5970 dev: false 5933 5971 5972 + /abort-controller@3.0.0: 5973 + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 5974 + engines: {node: '>=6.5'} 5975 + dependencies: 5976 + event-target-shim: 5.0.1 5977 + dev: false 5978 + 5934 5979 /acorn-globals@7.0.1: 5935 5980 resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} 5936 5981 dependencies: ··· 5989 6034 debug: 4.3.4 5990 6035 transitivePeerDependencies: 5991 6036 - supports-color 5992 - dev: true 5993 6037 5994 6038 /aggregate-error@3.1.0: 5995 6039 resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} ··· 6311 6355 engines: {node: '>=0.6'} 6312 6356 dev: false 6313 6357 6358 + /bignumber.js@9.1.2: 6359 + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} 6360 + dev: false 6361 + 6314 6362 /binary-extensions@2.2.0: 6315 6363 resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 6316 6364 engines: {node: '>=8'} ··· 6376 6424 node-releases: 2.0.13 6377 6425 update-browserslist-db: 1.0.13(browserslist@4.22.1) 6378 6426 dev: true 6427 + 6428 + /buffer-equal-constant-time@1.0.1: 6429 + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} 6430 + dev: false 6379 6431 6380 6432 /buffer-from@1.1.2: 6381 6433 resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} ··· 7717 7769 readable-stream: 2.3.8 7718 7770 dev: false 7719 7771 7772 + /duplexify@4.1.2: 7773 + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} 7774 + dependencies: 7775 + end-of-stream: 1.4.4 7776 + inherits: 2.0.4 7777 + readable-stream: 3.6.2 7778 + stream-shift: 1.0.1 7779 + dev: false 7780 + 7781 + /ecdsa-sig-formatter@1.0.11: 7782 + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} 7783 + dependencies: 7784 + safe-buffer: 5.2.1 7785 + dev: false 7786 + 7720 7787 /editorconfig@1.0.4: 7721 7788 resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} 7722 7789 engines: {node: '>=14'} ··· 8395 8462 es5-ext: 0.10.62 8396 8463 dev: true 8397 8464 8465 + /event-target-shim@5.0.1: 8466 + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 8467 + engines: {node: '>=6'} 8468 + dev: false 8469 + 8398 8470 /eventemitter3@4.0.7: 8399 8471 resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 8400 8472 dev: false ··· 8601 8673 is-callable: 1.2.7 8602 8674 dev: false 8603 8675 8676 + /form-data@2.5.1: 8677 + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} 8678 + engines: {node: '>= 0.12'} 8679 + dependencies: 8680 + asynckit: 0.4.0 8681 + combined-stream: 1.0.8 8682 + mime-types: 2.1.35 8683 + dev: false 8684 + 8604 8685 /form-data@3.0.1: 8605 8686 resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} 8606 8687 engines: {node: '>= 6'} ··· 8717 8798 resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 8718 8799 dev: false 8719 8800 8801 + /gaxios@6.1.1: 8802 + resolution: {integrity: sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==} 8803 + engines: {node: '>=14'} 8804 + dependencies: 8805 + extend: 3.0.2 8806 + https-proxy-agent: 7.0.2 8807 + is-stream: 2.0.1 8808 + node-fetch: 2.7.0(encoding@0.1.13) 8809 + transitivePeerDependencies: 8810 + - encoding 8811 + - supports-color 8812 + dev: false 8813 + 8814 + /gcp-metadata@6.0.0: 8815 + resolution: {integrity: sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==} 8816 + engines: {node: '>=14'} 8817 + dependencies: 8818 + gaxios: 6.1.1 8819 + json-bigint: 1.0.0 8820 + transitivePeerDependencies: 8821 + - encoding 8822 + - supports-color 8823 + dev: false 8824 + 8720 8825 /gensync@1.0.0-beta.2: 8721 8826 resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 8722 8827 engines: {node: '>=6.9.0'} ··· 8908 9013 merge2: 1.4.1 8909 9014 slash: 3.0.0 8910 9015 9016 + /google-auth-library@9.1.0: 9017 + resolution: {integrity: sha512-1M9HdOcQNPV5BwSXqwwT238MTKodJFBxZ/V2JP397ieOLv4FjQdfYb9SooR7Mb+oUT2IJ92mLJQf804dyx0MJA==} 9018 + engines: {node: '>=14'} 9019 + dependencies: 9020 + base64-js: 1.5.1 9021 + ecdsa-sig-formatter: 1.0.11 9022 + gaxios: 6.1.1 9023 + gcp-metadata: 6.0.0 9024 + gtoken: 7.0.1 9025 + jws: 4.0.0 9026 + lru-cache: 6.0.0 9027 + transitivePeerDependencies: 9028 + - encoding 9029 + - supports-color 9030 + dev: false 9031 + 9032 + /google-gax@4.0.5: 9033 + resolution: {integrity: sha512-yLoYtp4zE+8OQA74oBEbNkbzI6c95W01JSL7RqC8XERKpRvj3ytZp1dgnbA6G9aRsc8pZB25xWYBcCmrbYOEhA==} 9034 + engines: {node: '>=14'} 9035 + dependencies: 9036 + '@grpc/grpc-js': 1.9.7 9037 + '@grpc/proto-loader': 0.7.10 9038 + '@types/long': 4.0.2 9039 + abort-controller: 3.0.0 9040 + duplexify: 4.1.2 9041 + google-auth-library: 9.1.0 9042 + node-fetch: 2.7.0(encoding@0.1.13) 9043 + object-hash: 3.0.0 9044 + proto3-json-serializer: 2.0.0 9045 + protobufjs: 7.2.5 9046 + retry-request: 7.0.1 9047 + transitivePeerDependencies: 9048 + - encoding 9049 + - supports-color 9050 + dev: false 9051 + 8911 9052 /gopd@1.0.1: 8912 9053 resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 8913 9054 dependencies: ··· 8928 9069 kind-of: 6.0.3 8929 9070 section-matter: 1.0.0 8930 9071 strip-bom-string: 1.0.0 9072 + dev: false 9073 + 9074 + /gtoken@7.0.1: 9075 + resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} 9076 + engines: {node: '>=14.0.0'} 9077 + dependencies: 9078 + gaxios: 6.1.1 9079 + jws: 4.0.0 9080 + transitivePeerDependencies: 9081 + - encoding 9082 + - supports-color 8931 9083 dev: false 8932 9084 8933 9085 /handlebars@4.7.8: ··· 9431 9583 debug: 4.3.4 9432 9584 transitivePeerDependencies: 9433 9585 - supports-color 9434 - dev: true 9435 9586 9436 9587 /human-signals@2.1.0: 9437 9588 resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} ··· 10106 10257 engines: {node: '>=4'} 10107 10258 hasBin: true 10108 10259 10260 + /json-bigint@1.0.0: 10261 + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} 10262 + dependencies: 10263 + bignumber.js: 9.1.2 10264 + dev: false 10265 + 10109 10266 /json-buffer@3.0.1: 10110 10267 resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 10111 10268 ··· 10175 10332 object.values: 1.1.7 10176 10333 dev: false 10177 10334 10335 + /jwa@2.0.0: 10336 + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} 10337 + dependencies: 10338 + buffer-equal-constant-time: 1.0.1 10339 + ecdsa-sig-formatter: 1.0.11 10340 + safe-buffer: 5.2.1 10341 + dev: false 10342 + 10343 + /jws@4.0.0: 10344 + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} 10345 + dependencies: 10346 + jwa: 2.0.0 10347 + safe-buffer: 5.2.1 10348 + dev: false 10349 + 10178 10350 /katex@0.16.8: 10179 10351 resolution: {integrity: sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==} 10180 10352 hasBin: true ··· 12532 12704 resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 12533 12705 dev: false 12534 12706 12707 + /proto3-json-serializer@2.0.0: 12708 + resolution: {integrity: sha512-FB/YaNrpiPkyQNSNPilpn8qn0KdEfkgmJ9JP93PQyF/U4bAiXY5BiUdDhiDO4S48uSQ6AesklgVlrKiqZPzegw==} 12709 + engines: {node: '>=14.0.0'} 12710 + dependencies: 12711 + protobufjs: 7.2.5 12712 + dev: false 12713 + 12535 12714 /protobufjs@7.2.5: 12536 12715 resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} 12537 12716 engines: {node: '>=12.0.0'} ··· 13397 13576 engines: {node: '>=4'} 13398 13577 dev: false 13399 13578 13579 + /retry-request@7.0.1: 13580 + resolution: {integrity: sha512-ZI6vJp9rfB71mrZpw+n9p/B6HCsd7QJlSEQftZ+xfJzr3cQ9EPGKw1FF0BnViJ0fYREX6FhymBD2CARpmsFciQ==} 13581 + engines: {node: '>=14'} 13582 + dependencies: 13583 + '@types/request': 2.48.11 13584 + debug: 4.3.4 13585 + extend: 3.0.2 13586 + teeny-request: 9.0.0 13587 + transitivePeerDependencies: 13588 + - encoding 13589 + - supports-color 13590 + dev: false 13591 + 13400 13592 /reusify@1.0.4: 13401 13593 resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 13402 13594 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} ··· 13822 14014 resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} 13823 14015 dev: true 13824 14016 14017 + /stream-events@1.0.5: 14018 + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} 14019 + dependencies: 14020 + stubs: 3.0.0 14021 + dev: false 14022 + 14023 + /stream-shift@1.0.1: 14024 + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} 14025 + dev: false 14026 + 13825 14027 /streamsearch@1.1.0: 13826 14028 resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 13827 14029 engines: {node: '>=10.0.0'} ··· 13936 14138 dependencies: 13937 14139 '@types/node': 20.8.0 13938 14140 qs: 6.11.2 14141 + dev: false 14142 + 14143 + /stubs@3.0.0: 14144 + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} 13939 14145 dev: false 13940 14146 13941 14147 /style-to-js@1.1.3: ··· 14248 14454 fs-constants: 1.0.0 14249 14455 inherits: 2.0.4 14250 14456 readable-stream: 3.6.2 14457 + dev: false 14458 + 14459 + /teeny-request@9.0.0: 14460 + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} 14461 + engines: {node: '>=14'} 14462 + dependencies: 14463 + http-proxy-agent: 5.0.0 14464 + https-proxy-agent: 5.0.1 14465 + node-fetch: 2.7.0(encoding@0.1.13) 14466 + stream-events: 1.0.5 14467 + uuid: 9.0.1 14468 + transitivePeerDependencies: 14469 + - encoding 14470 + - supports-color 14251 14471 dev: false 14252 14472 14253 14473 /text-table@0.2.0: