From 2f0040e349c26d2768d475d0c342a9fdd5571b1c Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Tue, 21 May 2024 03:18:07 +0900 Subject: [PATCH 01/56] chore: setup wrangler --- .cspell.json | 2 +- .github/workflows/knip.yml | 4 +- README.md | 15 +- package.json | 10 +- src/adapters/index.ts | 8 + src/run.ts | 6 + src/types/context.ts | 21 + src/types/env.ts | 8 + src/types/plugin-input.ts | 32 ++ src/worker.ts | 35 ++ wrangler.toml | 6 + yarn.lock | 779 ++++++++++++++++++++++++++++++++++++- 12 files changed, 896 insertions(+), 30 deletions(-) create mode 100644 src/adapters/index.ts create mode 100644 src/run.ts create mode 100644 src/types/context.ts create mode 100644 src/types/env.ts create mode 100644 src/types/plugin-input.ts create mode 100644 src/worker.ts create mode 100644 wrangler.toml diff --git a/.cspell.json b/.cspell.json index dfd6093..ae85a2a 100644 --- a/.cspell.json +++ b/.cspell.json @@ -4,7 +4,7 @@ "ignorePaths": ["**/*.json", "**/*.css", "node_modules", "**/*.log"], "useGitignore": true, "language": "en", - "words": ["dataurl", "devpool", "outdir", "servedir"], + "words": ["dataurl", "devpool", "outdir", "servedir", "typebox"], "dictionaries": ["typescript", "node", "software-terms"], "import": ["@cspell/dict-typescript/cspell-ext.json", "@cspell/dict-node/cspell-ext.json", "@cspell/dict-software-terms"], "ignoreRegExpList": ["[0-9a-fA-F]{6}"] diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml index 50a1a2a..1b2136e 100644 --- a/.github/workflows/knip.yml +++ b/.github/workflows/knip.yml @@ -1,7 +1,9 @@ name: Knip on: - pull_request_target: + push: + branches: + - development workflow_dispatch: permissions: write-all diff --git a/README.md b/README.md index 7b0867a..86ffb81 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ -# `@ubiquity/ts-template` +# `@ubiquibot/command-query-user` -This template repository includes support for the following: +This package helps users querying their information, from they wallet address, label access control or current XP. -- TypeScript -- Environment Variables -- Conventional Commits -- Automatic deployment to Cloudflare Pages +## Usage + +The following commands are allowed: + +```shell +/query @user +``` ## Testing diff --git a/package.json b/package.json index ec1b4ae..5ba653b 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "node": ">=20.10.0" }, "scripts": { + "dev": "wrangler dev --env dev --port 4000", "start": "tsx build/esbuild-server.ts", "build": "tsx build/esbuild-build.ts", "format": "run-s format:lint format:prettier format:cspell", @@ -30,7 +31,11 @@ "open-source" ], "dependencies": { - "dotenv": "^16.4.4" + "@octokit/rest": "20.1.1", + "@octokit/webhooks": "13.2.7", + "@sinclair/typebox": "0.32.30", + "@supabase/supabase-js": "2.43.2", + "dotenv": "16.4.5" }, "devDependencies": { "@commitlint/cli": "^18.6.1", @@ -61,7 +66,8 @@ "prettier": "^3.2.5", "ts-jest": "29.1.2", "tsx": "^4.7.1", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "wrangler": "3.57.0" }, "lint-staged": { "*.ts": [ diff --git a/src/adapters/index.ts b/src/adapters/index.ts new file mode 100644 index 0000000..287e59c --- /dev/null +++ b/src/adapters/index.ts @@ -0,0 +1,8 @@ +import { SupabaseClient } from "@supabase/supabase-js"; +import { Context } from "../types/context"; + +export function createAdapters(supabaseClient: SupabaseClient, context: Context) { + return { + supabase: {}, + }; +} diff --git a/src/run.ts b/src/run.ts new file mode 100644 index 0000000..776ad93 --- /dev/null +++ b/src/run.ts @@ -0,0 +1,6 @@ +import { Env } from "./types/env"; +import { PluginInputs } from "./types/plugin-input"; + +export async function run(payload: PluginInputs, env: Env) { + console.log(payload, env); +} diff --git a/src/types/context.ts b/src/types/context.ts new file mode 100644 index 0000000..fa534f7 --- /dev/null +++ b/src/types/context.ts @@ -0,0 +1,21 @@ +import { EmitterWebhookEvent as WebhookEvent, EmitterWebhookEventName as WebhookEventName } from "@octokit/webhooks"; +import { Octokit } from "@octokit/rest"; +import { AssistivePricingSettings } from "./plugin-input"; +import { createAdapters } from "../adapters"; + +export type SupportedEvents = "issue_comment.created"; + +export interface Context { + eventName: T; + payload: WebhookEvent["payload"]; + octokit: InstanceType; + adapters: ReturnType; + config: AssistivePricingSettings; + logger: { + fatal: (message: unknown, ...optionalParams: unknown[]) => void; + error: (message: unknown, ...optionalParams: unknown[]) => void; + warn: (message: unknown, ...optionalParams: unknown[]) => void; + info: (message: unknown, ...optionalParams: unknown[]) => void; + debug: (message: unknown, ...optionalParams: unknown[]) => void; + }; +} diff --git a/src/types/env.ts b/src/types/env.ts new file mode 100644 index 0000000..0fc6dad --- /dev/null +++ b/src/types/env.ts @@ -0,0 +1,8 @@ +import { Type as T, StaticDecode } from "@sinclair/typebox"; + +export const envSchema = T.Object({ + SUPABASE_URL: T.String(), + SUPABASE_KEY: T.String(), +}); + +export type Env = StaticDecode; diff --git a/src/types/plugin-input.ts b/src/types/plugin-input.ts new file mode 100644 index 0000000..a5944cb --- /dev/null +++ b/src/types/plugin-input.ts @@ -0,0 +1,32 @@ +import { EmitterWebhookEvent as WebhookEvent, EmitterWebhookEventName as WebhookEventName } from "@octokit/webhooks"; +import { SupportedEvents } from "./context"; +import { StaticDecode, Type as T } from "@sinclair/typebox"; + +export interface PluginInputs { + stateId: string; + eventName: T; + eventPayload: WebhookEvent["payload"]; + settings: AssistivePricingSettings; + authToken: string; + ref: string; +} + +export const commandQueryUserScheme = T.Object({ + labels: T.Object( + { + time: T.Array(T.String(), { default: [] }), + priority: T.Array(T.String(), { default: [] }), + }, + { default: {} } + ), + basePriceMultiplier: T.Number({ default: 1 }), + publicAccessControl: T.Object( + { + setLabel: T.Boolean({ default: false }), + fundExternalClosedIssue: T.Boolean({ default: false }), + }, + { default: {} } + ), +}); + +export type AssistivePricingSettings = StaticDecode; diff --git a/src/worker.ts b/src/worker.ts new file mode 100644 index 0000000..6b2c22b --- /dev/null +++ b/src/worker.ts @@ -0,0 +1,35 @@ +import { Value } from "@sinclair/typebox/value"; +import { config } from "dotenv"; +import { run } from "./run"; +import { Env } from "./types/env"; +import { commandQueryUserScheme } from "./types/plugin-input"; + +config(); + +export default { + async fetch(request: Request, env: Env): Promise { + try { + const contentType = request.headers.get("content-type"); + if (contentType !== "application/json") { + return new Response(JSON.stringify({ error: `Error: ${contentType} is not a valid content type` }), { + status: 400, + headers: { "content-type": "application/json" }, + }); + } + const webhookPayload = await request.json(); + const settings = Value.Decode(commandQueryUserScheme, Value.Default(commandQueryUserScheme, JSON.parse(webhookPayload.settings))); + webhookPayload.eventPayload = JSON.parse(webhookPayload.eventPayload); + webhookPayload.settings = settings; + await run(webhookPayload, env); + return new Response(JSON.stringify("OK"), { status: 200, headers: { "content-type": "application/json" } }); + } catch (error) { + return handleUncaughtError(error); + } + }, +}; + +function handleUncaughtError(error: unknown) { + console.error(error); + const status = 500; + return new Response(JSON.stringify({ error }), { status: status, headers: { "content-type": "application/json" } }); +} diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 0000000..5835cc5 --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,6 @@ +name = "ubiquibot-command-query-user" +main = "src/worker.ts" +compatibility_date = "2024-01-01" +node_compat = true +[env.dev] +[env.prod] diff --git a/yarn.lock b/yarn.lock index 0c43b39..a8faa36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -323,6 +323,38 @@ dependencies: statuses "^2.0.1" +"@cloudflare/kv-asset-handler@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.2.tgz#06437b75664729823ac9033b89f06a3b078e4f55" + integrity sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA== + dependencies: + mime "^3.0.0" + +"@cloudflare/workerd-darwin-64@1.20240512.0": + version "1.20240512.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240512.0.tgz#9c72a4d960e1bd69a83d1917b6be54254fc93742" + integrity sha512-VMp+CsSHFALQiBzPdQ5dDI4T1qwLu0mQ0aeKVNDosXjueN0f3zj/lf+mFil5/9jBbG3t4mG0y+6MMnalP9Lobw== + +"@cloudflare/workerd-darwin-arm64@1.20240512.0": + version "1.20240512.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240512.0.tgz#e7dba44d6eb59b13ccf8c92c089e5c6126b76e6e" + integrity sha512-lZktXGmzMrB5rJqY9+PmnNfv1HKlj/YLZwMjPfF0WVKHUFdvQbAHsi7NlKv6mW9uIvlZnS+K4sIkWc0MDXcRnA== + +"@cloudflare/workerd-linux-64@1.20240512.0": + version "1.20240512.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240512.0.tgz#fd226eae1d5895820111144c0b09abc0e0bdd434" + integrity sha512-wrHvqCZZqXz6Y3MUTn/9pQNsvaoNjbJpuA6vcXsXu8iCzJi911iVW2WUEBX+MpUWD+mBIP0oXni5tTlhkokOPw== + +"@cloudflare/workerd-linux-arm64@1.20240512.0": + version "1.20240512.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240512.0.tgz#64d79e06019e8fb52e82d7898d14eed4cdfdeb6b" + integrity sha512-YPezHMySL9J9tFdzxz390eBswQ//QJNYcZolz9Dgvb3FEfdpK345cE/bsWbMOqw5ws2f82l388epoenghtYvAg== + +"@cloudflare/workerd-windows-64@1.20240512.0": + version "1.20240512.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240512.0.tgz#c4cd1673a690b9f7f8fb413a9ff16592cdf847f1" + integrity sha512-SxKapDrIYSscMR7lGIp/av0l6vokjH4xQ9ACxHgXh+OdOus9azppSmjaPyw4/ePvg7yqpkaNjf9o258IxWtvKQ== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -828,6 +860,13 @@ resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-8.4.0.tgz#5ec08fd969dea90fb2da4bda903e943f63740041" integrity sha512-R/fWW9S3oypKOTkxRZeJqcWl4f+v5w8Bejaj5rcRwztwAM/xdOGSelGhPdNnTazciINegbmTa4XiurUCN9E8Mg== +"@cspotcode/source-map-support@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@cypress/request@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" @@ -885,6 +924,19 @@ to-pascal-case "^1.0.0" unescape-js "^1.0.5" +"@esbuild-plugins/node-globals-polyfill@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz#0e4497a2b53c9e9485e149bc92ddb228438d6bcf" + integrity sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw== + +"@esbuild-plugins/node-modules-polyfill@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz#cefa3dc0bd1c16277a8338b52833420c94987327" + integrity sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA== + dependencies: + escape-string-regexp "^4.0.0" + rollup-plugin-node-polyfills "^0.2.1" + "@esbuild/aix-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" @@ -895,6 +947,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz#eafa8775019b3650a77e8310ba4dbd17ca7af6d5" integrity sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA== +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" @@ -905,6 +962,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz#68791afa389550736f682c15b963a4f37ec2f5f6" integrity sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A== +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" @@ -915,6 +977,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.1.tgz#38c91d8ee8d5196f7fbbdf4f0061415dde3a473a" integrity sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw== +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" @@ -925,6 +992,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.1.tgz#93f6190ce997b313669c20edbf3645fc6c8d8f22" integrity sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA== +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" @@ -935,6 +1007,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz#0d391f2e81fda833fe609182cc2fbb65e03a3c46" integrity sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA== +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" @@ -945,6 +1022,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz#92504077424584684862f483a2242cfde4055ba2" integrity sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA== +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" @@ -955,6 +1037,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz#a1646fa6ba87029c67ac8a102bb34384b9290774" integrity sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw== +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" @@ -965,6 +1052,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz#41c9243ab2b3254ea7fb512f71ffdb341562e951" integrity sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg== +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" @@ -975,6 +1067,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz#f3c1e1269fbc9eedd9591a5bdd32bf707a883156" integrity sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w== +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" @@ -985,6 +1082,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz#4503ca7001a8ee99589c072801ce9d7540717a21" integrity sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw== +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" @@ -995,6 +1097,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz#98c474e3e0cbb5bcbdd8561a6e65d18f5767ce48" integrity sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw== +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" @@ -1005,6 +1112,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz#a8097d28d14b9165c725fe58fc438f80decd2f33" integrity sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA== +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" @@ -1015,6 +1127,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz#c44f6f0d7d017c41ad3bb15bfdb69b690656b5ea" integrity sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA== +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" @@ -1025,6 +1142,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz#0765a55389a99237b3c84227948c6e47eba96f0d" integrity sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw== +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" @@ -1035,6 +1157,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz#e4153b032288e3095ddf4c8be07893781b309a7e" integrity sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg== +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" @@ -1045,6 +1172,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz#b9ab8af6e4b73b26d63c1c426d7669a5d53eb5a7" integrity sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ== +"@esbuild/linux-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== + "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" @@ -1055,6 +1187,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz#0b25da17ac38c3e11cdd06ca3691d4d6bef2755f" integrity sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA== +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" @@ -1065,6 +1202,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz#3148e48406cd0d4f7ba1e0bf3f4d77d548c98407" integrity sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg== +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" @@ -1075,6 +1217,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz#7b73e852986a9750192626d377ac96ac2b749b76" integrity sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw== +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" @@ -1085,6 +1232,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz#402a441cdac2eee98d8be378c7bc23e00c1861c5" integrity sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q== +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" @@ -1095,6 +1247,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz#36c4e311085806a6a0c5fc54d1ac4d7b27e94d7b" integrity sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A== +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" @@ -1105,6 +1262,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz#0cf933be3fb9dc58b45d149559fe03e9e22b54fe" integrity sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw== +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" @@ -1147,6 +1309,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + "@humanwhocodes/config-array@^0.11.13": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -1428,7 +1595,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== @@ -1443,6 +1610,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" @@ -1580,6 +1755,128 @@ dependencies: which "^4.0.0" +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/core@^5.0.2": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" + integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.1.0" + "@octokit/request" "^8.3.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^9.0.1": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" + integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== + dependencies: + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" + integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== + dependencies: + "@octokit/request" "^8.3.0" + "@octokit/types" "^13.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^22.2.0": + version "22.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" + integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== + +"@octokit/openapi-webhooks-types@8.2.1": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-8.2.1.tgz#08b974f1e83a75c4d3ce23f798c7667b433bf4cd" + integrity sha512-msAU1oTSm0ZmvAE0xDemuF4tVs5i0xNnNGtNmr4EuATi+1Rn8cZDetj6NXioSf5LwnxEc209COa/WOSbjuhLUA== + +"@octokit/plugin-paginate-rest@11.3.1": + version "11.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz#fe92d04b49f134165d6fbb716e765c2f313ad364" + integrity sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g== + dependencies: + "@octokit/types" "^13.5.0" + +"@octokit/plugin-request-log@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" + integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== + +"@octokit/plugin-rest-endpoint-methods@13.2.2": + version "13.2.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz#af8e5dd2cddfea576f92ffaf9cb84659f302a638" + integrity sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA== + dependencies: + "@octokit/types" "^13.5.0" + +"@octokit/request-error@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" + integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== + dependencies: + "@octokit/types" "^13.1.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request-error@^6.0.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.1.tgz#bed1b5f52ce7fefb1077a92bf42124ff36f73f2c" + integrity sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg== + dependencies: + "@octokit/types" "^13.0.0" + +"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" + integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== + dependencies: + "@octokit/endpoint" "^9.0.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@20.1.1": + version "20.1.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.1.1.tgz#ec775864f53fb42037a954b9a40d4f5275b3dc95" + integrity sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw== + dependencies: + "@octokit/core" "^5.0.2" + "@octokit/plugin-paginate-rest" "11.3.1" + "@octokit/plugin-request-log" "^4.0.0" + "@octokit/plugin-rest-endpoint-methods" "13.2.2" + +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.5.0": + version "13.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883" + integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== + dependencies: + "@octokit/openapi-types" "^22.2.0" + +"@octokit/webhooks-methods@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-5.1.0.tgz#13b6c08f89902c1ab0ddf31c6eeeec9c2772cfe6" + integrity sha512-yFZa3UH11VIxYnnoOYCVoJ3q4ChuSOk2IVBBQ0O3xtKX4x9bmKb/1t+Mxixv2iUhzMdOl1qeWJqEhouXXzB3rQ== + +"@octokit/webhooks@13.2.7": + version "13.2.7" + resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-13.2.7.tgz#03f89b278cd63f271eba3062f0b75ddd18a82252" + integrity sha512-sPHCyi9uZuCs1gg0yF53FFocM+GsiiBEhQQV/itGzzQ8gjyv2GMJ1YvgdDY4lC0ePZeiV3juEw4GbS6w1VHhRw== + dependencies: + "@octokit/openapi-webhooks-types" "8.2.1" + "@octokit/request-error" "^6.0.1" + "@octokit/webhooks-methods" "^5.0.0" + aggregate-error "^5.0.0" + "@open-draft/deferred-promise@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" @@ -1715,6 +2012,11 @@ "@pnpm/resolve-workspace-range" "5.0.1" ramda "npm:@pnpm/ramda@0.28.1" +"@sinclair/typebox@0.32.30": + version "0.32.30" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.32.30.tgz#91ecaad8ed9e5972a2ee52df049b6bd5da93fad7" + integrity sha512-IYK1H0k2sHVB2GjzBK2DXBErhex45GoLuPdgn8lNw5t0+5elIuhpixOMPobFyq6kE0AGIBa4+76Ph4enco0q2Q== + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -1743,6 +2045,63 @@ ignore "^5.1.8" p-map "^4.0.0" +"@supabase/auth-js@2.64.2": + version "2.64.2" + resolved "https://registry.yarnpkg.com/@supabase/auth-js/-/auth-js-2.64.2.tgz#fe6828ed2c9844bf2e71b27f88ddfb635f24d1c1" + integrity sha512-s+lkHEdGiczDrzXJ1YWt2y3bxRi+qIUnXcgkpLSrId7yjBeaXBFygNjTaoZLG02KNcYwbuZ9qkEIqmj2hF7svw== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/functions-js@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@supabase/functions-js/-/functions-js-2.3.1.tgz#bddc12a97872f3978a733b66bddac53370721589" + integrity sha512-QyzNle/rVzlOi4BbVqxLSH828VdGY1RElqGFAj+XeVypj6+PVtMlD21G8SDnsPQDtlqqTtoGRgdMlQZih5hTuw== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/node-fetch@2.6.15", "@supabase/node-fetch@^2.6.14": + version "2.6.15" + resolved "https://registry.yarnpkg.com/@supabase/node-fetch/-/node-fetch-2.6.15.tgz#731271430e276983191930816303c44159e7226c" + integrity sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ== + dependencies: + whatwg-url "^5.0.0" + +"@supabase/postgrest-js@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@supabase/postgrest-js/-/postgrest-js-1.15.2.tgz#c0a725706e3d534570d014d7b713cea12553ab98" + integrity sha512-9/7pUmXExvGuEK1yZhVYXPZnLEkDTwxgMQHXLrN5BwPZZm4iUCL1YEyep/Z2lIZah8d8M433mVAUEGsihUj5KQ== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/realtime-js@2.9.5": + version "2.9.5" + resolved "https://registry.yarnpkg.com/@supabase/realtime-js/-/realtime-js-2.9.5.tgz#22b7de952a7f37868ffc25d32d19f03f27bfcb40" + integrity sha512-TEHlGwNGGmKPdeMtca1lFTYCedrhTAv3nZVoSjrKQ+wkMmaERuCe57zkC5KSWFzLYkb5FVHW8Hrr+PX1DDwplQ== + dependencies: + "@supabase/node-fetch" "^2.6.14" + "@types/phoenix" "^1.5.4" + "@types/ws" "^8.5.10" + ws "^8.14.2" + +"@supabase/storage-js@2.5.5": + version "2.5.5" + resolved "https://registry.yarnpkg.com/@supabase/storage-js/-/storage-js-2.5.5.tgz#2958e2a2cec8440e605bb53bd36649288c4dfa01" + integrity sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/supabase-js@2.43.2": + version "2.43.2" + resolved "https://registry.yarnpkg.com/@supabase/supabase-js/-/supabase-js-2.43.2.tgz#86ee9379d4441c2773b1a84919770ac704c5cfb4" + integrity sha512-F9CljeJBo5aPucNhrLoMnpEHi5yqNZ0vH0/CL4mGy+/Ggr7FUrYErVJisa1NptViqyhs1HGNzzwjOYG6626h8g== + dependencies: + "@supabase/auth-js" "2.64.2" + "@supabase/functions-js" "2.3.1" + "@supabase/node-fetch" "2.6.15" + "@supabase/postgrest-js" "1.15.2" + "@supabase/realtime-js" "2.9.5" + "@supabase/storage-js" "2.5.5" + "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -1842,6 +2201,13 @@ dependencies: "@types/node" "*" +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@^20.11.16": version "20.11.24" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792" @@ -1861,6 +2227,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== +"@types/phoenix@^1.5.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@types/phoenix/-/phoenix-1.6.4.tgz#cceac93a827555473ad38057d1df7d06eef1ed71" + integrity sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA== + "@types/picomatch@2.3.3": version "2.3.3" resolved "https://registry.yarnpkg.com/@types/picomatch/-/picomatch-2.3.3.tgz#be60498568c19e989e43fb39aa84be1ed3655e92" @@ -1906,6 +2277,13 @@ resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== +"@types/ws@^8.5.10": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -2041,7 +2419,12 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +acorn-walk@^8.2.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.8.0, acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -2054,6 +2437,14 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +aggregate-error@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-5.0.0.tgz#ffe15045d7521c51c9d618e3d7f37c13f29b3fd3" + integrity sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw== + dependencies: + clean-stack "^5.2.0" + indent-string "^5.0.0" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -2127,7 +2518,7 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -anymatch@^3.0.3: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -2206,6 +2597,13 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +as-table@^1.0.36: + version "1.0.55" + resolved "https://registry.yarnpkg.com/as-table/-/as-table-1.0.55.tgz#dc984da3937745de902cea1d45843c01bdbbec4f" + integrity sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ== + dependencies: + printable-characters "^1.0.42" + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -2335,6 +2733,21 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +blake3-wasm@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/blake3-wasm/-/blake3-wasm-2.1.5.tgz#b22dbb84bc9419ed0159caa76af4b1b132e6ba52" + integrity sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g== + blob-util@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" @@ -2368,7 +2781,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -2469,6 +2882,14 @@ caniuse-lite@^1.0.30001587: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz#7cda1d9e5b0cad6ebab4133b1f239d4ea44fe659" integrity sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ== +capnp-ts@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/capnp-ts/-/capnp-ts-0.7.0.tgz#16fd8e76b667d002af8fcf4bf92bf15d1a7b54a9" + integrity sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g== + dependencies: + debug "^4.3.1" + tslib "^2.2.0" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -2518,6 +2939,21 @@ check-more-types@^2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -2533,6 +2969,13 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-stack@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-5.2.0.tgz#c7a0c91939c7caace30a3bf254e8a8ac276d1189" + integrity sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ== + dependencies: + escape-string-regexp "5.0.0" + clear-module@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" @@ -2998,6 +3441,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-uri-to-buffer@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" + integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== + data-uri-to-buffer@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" @@ -3092,6 +3540,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3130,10 +3583,10 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" -dotenv@^16.4.4: - version "16.4.4" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.4.tgz#a26e7bb95ebd36272ebb56edb80b826aecf224c1" - integrity sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg== +dotenv@16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== eastasianwidth@^0.2.0: version "0.2.0" @@ -3293,6 +3746,34 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild@0.17.19: + version "0.17.19" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== + optionalDependencies: + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + esbuild@^0.20.1: version "0.20.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.1.tgz#1e4cbb380ad1959db7609cb9573ee77257724a3e" @@ -3356,6 +3837,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escape-string-regexp@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3484,6 +3970,11 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -3551,6 +4042,11 @@ executable@^4.1.1: dependencies: pify "^2.2.0" +exit-hook@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" + integrity sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw== + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -3795,7 +4291,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.3: +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -3856,6 +4352,14 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-source@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/get-source/-/get-source-2.0.12.tgz#0b47d57ea1e53ce0d3a69f4f3d277eb8047da944" + integrity sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w== + dependencies: + data-uri-to-buffer "^2.0.0" + source-map "^0.6.1" + get-stdin@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" @@ -3919,7 +4423,7 @@ git-raw-commits@^2.0.11: split2 "^3.0.0" through2 "^4.0.0" -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3933,6 +4437,11 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + glob@^10.2.2, glob@^10.3.7: version "10.3.10" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" @@ -4195,6 +4704,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + individual@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/individual/-/individual-3.0.0.tgz#e7ca4f85f8957b018734f285750dc22ec2f9862d" @@ -4257,6 +4771,13 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" @@ -4323,7 +4844,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -5294,6 +5815,13 @@ magic-string@^0.16.0: dependencies: vlq "^0.2.1" +magic-string@^0.25.3: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -5417,6 +5945,11 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.52.0" +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -5437,6 +5970,24 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +miniflare@3.20240512.0: + version "3.20240512.0" + resolved "https://registry.yarnpkg.com/miniflare/-/miniflare-3.20240512.0.tgz#2ca99ca04cffead8dcfe002f0d179fae1d649b55" + integrity sha512-X0PlKR0AROKpxFoJNmRtCMIuJxj+ngEcyTOlEokj2rAQ0TBwUhB4/1uiPvdI6ofW5NugPOD1uomAv+gLjwsLDQ== + dependencies: + "@cspotcode/source-map-support" "0.8.1" + acorn "^8.8.0" + acorn-walk "^8.2.0" + capnp-ts "^0.7.0" + exit-hook "^2.2.1" + glob-to-regexp "^0.4.1" + stoppable "^1.1.0" + undici "^5.28.2" + workerd "1.20240512.0" + ws "^8.11.0" + youch "^3.2.2" + zod "^3.20.6" + minimatch@9.0.3, minimatch@^9.0.0, minimatch@^9.0.1: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -5508,11 +6059,21 @@ msw@^2.0.8: type-fest "^4.9.0" yargs "^17.7.2" +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + mute-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== +nanoid@^3.3.3: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5542,6 +6103,11 @@ node-fetch@3.0.0-beta.9: data-uri-to-buffer "^3.0.1" fetch-blob "^2.1.1" +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -5582,7 +6148,7 @@ normalize-package-data@^6.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -5900,7 +6466,7 @@ picomatch@4.0.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.1.tgz#68c26c8837399e5819edce48590412ea07f17a07" integrity sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg== -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -5980,6 +6546,11 @@ pretty-ms@9.0.0: dependencies: parse-ms "^4.0.0" +printable-characters@^1.0.42: + version "1.0.42" + resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8" + integrity sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ== + proc-log@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" @@ -6116,6 +6687,13 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -6203,12 +6781,12 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve.exports@^2.0.0: +resolve.exports@^2.0.0, resolve.exports@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.10.0, resolve@^1.20.0: +resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.8: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -6267,6 +6845,29 @@ rimraf@^5.0.5: dependencies: glob "^10.3.7" +rollup-plugin-inject@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz#e4233855bfba6c0c12a312fd6649dff9a13ee9f4" + integrity sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w== + dependencies: + estree-walker "^0.6.1" + magic-string "^0.25.3" + rollup-pluginutils "^2.8.1" + +rollup-plugin-node-polyfills@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz#53092a2744837164d5b8a28812ba5f3ff61109fd" + integrity sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA== + dependencies: + rollup-plugin-inject "^3.0.0" + +rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + run-async@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" @@ -6315,6 +6916,14 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +selfsigned@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + "semver@2 || 3 || 4 || 5", semver@^5.5.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" @@ -6464,11 +7073,16 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + spdx-correct@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" @@ -6541,11 +7155,24 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stacktracey@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/stacktracey/-/stacktracey-2.1.8.tgz#bf9916020738ce3700d1323b32bd2c91ea71199d" + integrity sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw== + dependencies: + as-table "^1.0.36" + get-source "^2.0.12" + statuses@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +stoppable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" + integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== + strict-event-emitter@^0.5.0, strict-event-emitter@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" @@ -6564,7 +7191,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6639,7 +7275,14 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6816,6 +7459,11 @@ tough-cookie@^4.1.3: universalify "^0.2.0" url-parse "^1.5.3" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -6840,7 +7488,7 @@ ts-jest@29.1.2: semver "^7.5.3" yargs-parser "^21.0.1" -tslib@^2.1.0, tslib@^2.6.2: +tslib@^2.1.0, tslib@^2.2.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -6985,6 +7633,13 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici@^5.28.2: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + unescape-js@^1.0.5: version "1.1.4" resolved "https://registry.yarnpkg.com/unescape-js/-/unescape-js-1.1.4.tgz#4bc6389c499cb055a98364a0b3094e1c3d5da395" @@ -7006,6 +7661,11 @@ unique-string@^3.0.0: dependencies: crypto-random-string "^4.0.0" +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -7130,6 +7790,19 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -7173,7 +7846,40 @@ which@^4.0.0: dependencies: isexe "^3.1.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +workerd@1.20240512.0: + version "1.20240512.0" + resolved "https://registry.yarnpkg.com/workerd/-/workerd-1.20240512.0.tgz#235047894d29b755effb18907fc55503930182fc" + integrity sha512-VUBmR1PscAPHEE0OF/G2K7/H1gnr9aDWWZzdkIgWfNKkv8dKFCT75H+GJtUHjfwqz3rYCzaNZmatSXOpLGpF8A== + optionalDependencies: + "@cloudflare/workerd-darwin-64" "1.20240512.0" + "@cloudflare/workerd-darwin-arm64" "1.20240512.0" + "@cloudflare/workerd-linux-64" "1.20240512.0" + "@cloudflare/workerd-linux-arm64" "1.20240512.0" + "@cloudflare/workerd-windows-64" "1.20240512.0" + +wrangler@3.57.0: + version "3.57.0" + resolved "https://registry.yarnpkg.com/wrangler/-/wrangler-3.57.0.tgz#4c8f30e07a185ecef2c1a467323c084020c3d765" + integrity sha512-izK3AZtlFoTq8N0EZjLOQ7hqwsjaXCc1cbNKuhsLJjDX1jB1YZBDPhIhtXL4VVzkJAcH+0Zw2gguOePFCHNaxw== + dependencies: + "@cloudflare/kv-asset-handler" "0.3.2" + "@esbuild-plugins/node-globals-polyfill" "^0.2.3" + "@esbuild-plugins/node-modules-polyfill" "^0.2.2" + blake3-wasm "^2.1.5" + chokidar "^3.5.3" + esbuild "0.17.19" + miniflare "3.20240512.0" + nanoid "^3.3.3" + path-to-regexp "^6.2.0" + resolve "^1.22.8" + resolve.exports "^2.0.2" + selfsigned "^2.0.1" + source-map "0.6.1" + xxhash-wasm "^1.0.1" + optionalDependencies: + fsevents "~2.3.2" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -7191,6 +7897,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -7232,6 +7947,11 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@^8.11.0, ws@^8.14.2: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + xdg-basedir@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" @@ -7242,6 +7962,11 @@ xml@^1.0.1: resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== +xxhash-wasm@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz#ecc0f813219b727af4d5f3958ca6becee2f2f1ff" + integrity sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -7298,6 +8023,15 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +youch@^3.2.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/youch/-/youch-3.3.3.tgz#50cfdf5bc395ce664a5073e31b712ff4a859d928" + integrity sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA== + dependencies: + cookie "^0.5.0" + mustache "^4.2.0" + stacktracey "^2.1.8" + zod-validation-error@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-3.0.0.tgz#69dee45a03ccf9739456bddb50b4d27f121c6f45" @@ -7307,3 +8041,8 @@ zod@3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + +zod@^3.20.6: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From 3f1dd192ece05146e745835cfefb60a3b75e6c29 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Tue, 21 May 2024 16:29:55 +0900 Subject: [PATCH 02/56] chore: removed unused code --- .github/workflows/cypress-testing.yml | 35 - .github/workflows/deploy.yml | 6 +- build/esbuild-build.ts | 33 - build/esbuild-server.ts | 18 - build/index.ts | 4 - cypress.config.ts | 11 - cypress/e2e/main.cy.ts | 11 - cypress/fixtures/example.json | 5 - cypress/support/commands.ts | 37 - cypress/support/e2e.ts | 20 - package.json | 9 +- src/handlers/command-parser.ts | 54 ++ src/handlers/query-user.ts | 15 + src/run.ts | 26 +- src/types/context.ts | 4 +- src/types/env.ts | 1 + src/types/plugin-input.ts | 23 +- static/fonts/ubiquity-nova-standard.eot | Bin 56807 -> 0 bytes static/fonts/ubiquity-nova-standard.ttf | Bin 187128 -> 0 bytes static/fonts/ubiquity-nova-standard.woff | Bin 77756 -> 0 bytes static/index.html | 13 - static/main.ts | 10 - static/style.css | 16 - tests/__mocks__/payloads/comment-created.json | 246 ++++++ tests/main.test.ts | 23 +- yarn.lock | 763 +----------------- 26 files changed, 393 insertions(+), 990 deletions(-) delete mode 100644 .github/workflows/cypress-testing.yml delete mode 100644 build/esbuild-build.ts delete mode 100644 build/esbuild-server.ts delete mode 100644 build/index.ts delete mode 100644 cypress.config.ts delete mode 100644 cypress/e2e/main.cy.ts delete mode 100644 cypress/fixtures/example.json delete mode 100644 cypress/support/commands.ts delete mode 100644 cypress/support/e2e.ts create mode 100644 src/handlers/command-parser.ts create mode 100644 src/handlers/query-user.ts delete mode 100644 static/fonts/ubiquity-nova-standard.eot delete mode 100644 static/fonts/ubiquity-nova-standard.ttf delete mode 100644 static/fonts/ubiquity-nova-standard.woff delete mode 100644 static/index.html delete mode 100644 static/main.ts delete mode 100644 static/style.css create mode 100644 tests/__mocks__/payloads/comment-created.json diff --git a/.github/workflows/cypress-testing.yml b/.github/workflows/cypress-testing.yml deleted file mode 100644 index 1cf9d5a..0000000 --- a/.github/workflows/cypress-testing.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Run Cypress testing suite -on: - workflow_dispatch: - pull_request: - types: [opened, synchronize] - -jobs: - cypress-run: - runs-on: ubuntu-latest - steps: - - uses: actions/setup-node@v4 - with: - node-version: 20.10.0 - - name: Checkout - uses: actions/checkout@v4 - - name: Cypress run - uses: cypress-io/github-action@v6 - with: - build: yarn run build - start: yarn start - env: - CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/upload-artifact@v4 - if: failure() - with: - name: cypress-screenshots - path: cypress/screenshots - if-no-files-found: ignore - - uses: actions/upload-artifact@v4 - if: failure() - with: - name: cypress-videos - path: cypress/videos - if-no-files-found: ignore diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2d51792..d97febd 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,10 +17,12 @@ jobs: with: repository: ${{ github.repository }} production_branch: ${{ github.event.repository.default_branch }} - build_artifact_name: "static" - output_directory: "static" current_branch: ${{ github.event.workflow_run.head_branch }} cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }} commit_sha: ${{ github.event.workflow_run.head_sha }} workflow_run_id: ${{ github.event.workflow_run.id }} + secrets: | + SUPABASE_URL + SUPABASE_KEY + GITHUB_TOKEN diff --git a/build/esbuild-build.ts b/build/esbuild-build.ts deleted file mode 100644 index 3004b1d..0000000 --- a/build/esbuild-build.ts +++ /dev/null @@ -1,33 +0,0 @@ -import esbuild from "esbuild"; -const typescriptEntries = ["static/main.ts"]; -// const cssEntries = ["static/style.css"]; -const entries = [ - ...typescriptEntries, - // ...cssEntries -]; - -export const esBuildContext: esbuild.BuildOptions = { - sourcemap: true, - entryPoints: entries, - bundle: true, - minify: false, - loader: { - ".png": "dataurl", - ".woff": "dataurl", - ".woff2": "dataurl", - ".eot": "dataurl", - ".ttf": "dataurl", - ".svg": "dataurl", - }, - outdir: "static/dist", -}; - -esbuild - .build(esBuildContext) - .then(() => { - console.log("\tesbuild complete"); - }) - .catch((err) => { - console.error(err); - process.exit(1); - }); diff --git a/build/esbuild-server.ts b/build/esbuild-server.ts deleted file mode 100644 index bb992ae..0000000 --- a/build/esbuild-server.ts +++ /dev/null @@ -1,18 +0,0 @@ -import esbuild from "esbuild"; -import { esBuildContext } from "./esbuild-build"; - -(async () => { - await server(); -})().catch((error) => { - console.error("Unhandled error:", error); - process.exit(1); -}); - -export async function server() { - const _context = await esbuild.context(esBuildContext); - const { port } = await _context.serve({ - servedir: "static", - port: 8080, - }); - console.log(`http://localhost:${port}`); -} diff --git a/build/index.ts b/build/index.ts deleted file mode 100644 index e1cf0b8..0000000 --- a/build/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import * as dotenv from "dotenv"; -// load environment variables (if you have them) -dotenv.config(); -console.log("Welcome to ts-template"); diff --git a/cypress.config.ts b/cypress.config.ts deleted file mode 100644 index 7272f26..0000000 --- a/cypress.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from "cypress"; - -export default defineConfig({ - e2e: { - setupNodeEvents() { - // implement node event listeners here - }, - experimentalStudio: true, - baseUrl: "http://localhost:8080", - }, -}); diff --git a/cypress/e2e/main.cy.ts b/cypress/e2e/main.cy.ts deleted file mode 100644 index 7e96d3d..0000000 --- a/cypress/e2e/main.cy.ts +++ /dev/null @@ -1,11 +0,0 @@ -describe("Homepage tests", () => { - it("Console is cleared of errors and warnings", () => { - cy.visit("/", { - onBeforeLoad(win) { - cy.stub(win.console, "error").as("consoleError"); - }, - }); - cy.get("@consoleError").should("not.be.called"); - cy.get("body").should("exist"); - }); -}); diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json deleted file mode 100644 index 02e4254..0000000 --- a/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts deleted file mode 100644 index 95857ae..0000000 --- a/cypress/support/commands.ts +++ /dev/null @@ -1,37 +0,0 @@ -/// -// *********************************************** -// This example commands.ts shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -// -// declare global { -// namespace Cypress { -// interface Chainable { -// login(email: string, password: string): Chainable -// drag(subject: string, options?: Partial): Chainable -// dismiss(subject: string, options?: Partial): Chainable -// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable -// } -// } -// } diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts deleted file mode 100644 index 6a173d6..0000000 --- a/cypress/support/e2e.ts +++ /dev/null @@ -1,20 +0,0 @@ -// *********************************************************** -// This example support/e2e.ts is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import "./commands"; - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/package.json b/package.json index 5ba653b..c0cfde2 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,6 @@ }, "scripts": { "dev": "wrangler dev --env dev --port 4000", - "start": "tsx build/esbuild-server.ts", - "build": "tsx build/esbuild-build.ts", "format": "run-s format:lint format:prettier format:cspell", "format:lint": "eslint --fix .", "format:prettier": "prettier --write .", @@ -19,9 +17,7 @@ "knip": "knip --config .github/knip.ts", "knip-ci": "knip --no-exit-code --reporter json --config .github/knip.ts", "prepare": "husky install", - "test": "jest --setupFiles dotenv/config --coverage", - "cy:open": "cypress open", - "cy:run": "cypress run" + "test": "jest --setupFiles dotenv/config --coverage" }, "keywords": [ "typescript", @@ -31,10 +27,12 @@ "open-source" ], "dependencies": { + "@commander-js/extra-typings": "12.1.0", "@octokit/rest": "20.1.1", "@octokit/webhooks": "13.2.7", "@sinclair/typebox": "0.32.30", "@supabase/supabase-js": "2.43.2", + "commander": "12.1.0", "dotenv": "16.4.5" }, "devDependencies": { @@ -50,7 +48,6 @@ "@typescript-eslint/eslint-plugin": "^7.0.1", "@typescript-eslint/parser": "^7.0.1", "cspell": "^8.4.0", - "cypress": "13.6.6", "esbuild": "^0.20.1", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", diff --git a/src/handlers/command-parser.ts b/src/handlers/command-parser.ts new file mode 100644 index 0000000..a790b47 --- /dev/null +++ b/src/handlers/command-parser.ts @@ -0,0 +1,54 @@ +import { InvalidArgumentError, program } from "@commander-js/extra-typings"; +import packageJson from "../../package.json"; +import { Context } from "../types/context"; +import { queryUser } from "./query-user"; + +export class CommandParser { + readonly _program; + + constructor(context: Context) { + program + .command("/query") + .usage("@") + .argument("", "User name to query, e.g. @ubiquibot", this._parseUser) + .action((username) => queryUser(context, username)) + .version(packageJson.version); + + // Overrides to make sure we do not use TTY outputs as they are not available outside Node.js env + program.configureOutput({ + writeOut(str: string) { + console.log(str); + }, + writeErr(str: string) { + console.error(str); + }, + getErrHelpWidth(): number { + return 0; + }, + getOutHelpWidth(): number { + return 0; + }, + }); + + program.exitOverride(); + + this._program = program; + } + + parse(args: string[]) { + return this._program.parseAsync(args, { from: "user" }); + } + + _parseUser(value: string) { + if (!value.length || value.length < 2) { + throw new InvalidArgumentError("Username should be at least 2 characters long."); + } + if (value[0] !== "@") { + throw new InvalidArgumentError("Username should start with @."); + } + // Remove @ character + return value.slice(1); + } +} + +export default program; diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts new file mode 100644 index 0000000..139be9b --- /dev/null +++ b/src/handlers/query-user.ts @@ -0,0 +1,15 @@ +import { Context } from "../types/context"; + +export async function queryUser(context: Context, username: string) { + const { octokit, payload } = context; + try { + await octokit.issues.createComment({ + body: `Hello ${username}`, + owner: payload.repository.owner.login, + repo: payload.repository.name, + issue_number: payload.issue.number, + }); + } catch (e) { + console.error("Could not query user.", e); + } +} diff --git a/src/run.ts b/src/run.ts index 776ad93..724876b 100644 --- a/src/run.ts +++ b/src/run.ts @@ -1,6 +1,28 @@ +import { CommanderError } from "@commander-js/extra-typings"; +import { Octokit } from "@octokit/rest"; +import { CommandParser } from "./handlers/command-parser"; +import { Context } from "./types/context"; import { Env } from "./types/env"; import { PluginInputs } from "./types/plugin-input"; -export async function run(payload: PluginInputs, env: Env) { - console.log(payload, env); +export async function run(inputs: PluginInputs, env: Env) { + if (inputs.eventName !== "issue_comment.created") { + console.warn(`Unsupported event ${inputs.eventName}, skipping.`); + return; + } + const args = inputs.eventPayload.comment.body.trim().split(/\s+/); + try { + const octokit = new Octokit({ auth: env.GITHUB_TOKEN }); + const commandParser = new CommandParser({ octokit, payload: inputs.eventPayload } as Context); + await commandParser.parse(args); + } catch (e) { + if (e instanceof CommanderError) { + if (e.code !== "commander.unknownCommand") { + // post error + console.error(e); + } + } else { + throw e; + } + } } diff --git a/src/types/context.ts b/src/types/context.ts index fa534f7..4023a1a 100644 --- a/src/types/context.ts +++ b/src/types/context.ts @@ -1,6 +1,6 @@ import { EmitterWebhookEvent as WebhookEvent, EmitterWebhookEventName as WebhookEventName } from "@octokit/webhooks"; import { Octokit } from "@octokit/rest"; -import { AssistivePricingSettings } from "./plugin-input"; +import { CommandQuerySettings } from "./plugin-input"; import { createAdapters } from "../adapters"; export type SupportedEvents = "issue_comment.created"; @@ -10,7 +10,7 @@ export interface Context { payload: WebhookEvent["payload"]; octokit: InstanceType; adapters: ReturnType; - config: AssistivePricingSettings; + config: CommandQuerySettings; logger: { fatal: (message: unknown, ...optionalParams: unknown[]) => void; error: (message: unknown, ...optionalParams: unknown[]) => void; diff --git a/src/types/env.ts b/src/types/env.ts index 0fc6dad..161f5e8 100644 --- a/src/types/env.ts +++ b/src/types/env.ts @@ -3,6 +3,7 @@ import { Type as T, StaticDecode } from "@sinclair/typebox"; export const envSchema = T.Object({ SUPABASE_URL: T.String(), SUPABASE_KEY: T.String(), + GITHUB_TOKEN: T.String(), }); export type Env = StaticDecode; diff --git a/src/types/plugin-input.ts b/src/types/plugin-input.ts index a5944cb..a515e68 100644 --- a/src/types/plugin-input.ts +++ b/src/types/plugin-input.ts @@ -6,27 +6,16 @@ export interface PluginInputs { stateId: string; eventName: T; eventPayload: WebhookEvent["payload"]; - settings: AssistivePricingSettings; + settings: CommandQuerySettings; authToken: string; ref: string; } export const commandQueryUserScheme = T.Object({ - labels: T.Object( - { - time: T.Array(T.String(), { default: [] }), - priority: T.Array(T.String(), { default: [] }), - }, - { default: {} } - ), - basePriceMultiplier: T.Number({ default: 1 }), - publicAccessControl: T.Object( - { - setLabel: T.Boolean({ default: false }), - fundExternalClosedIssue: T.Boolean({ default: false }), - }, - { default: {} } - ), + /** + * Allows any user to query anyone else. If false, only org members can query others. + */ + allowPublicQuery: T.Boolean({ default: true }), }); -export type AssistivePricingSettings = StaticDecode; +export type CommandQuerySettings = StaticDecode; diff --git a/static/fonts/ubiquity-nova-standard.eot b/static/fonts/ubiquity-nova-standard.eot deleted file mode 100644 index 1e46099c15e2689320d5364ce9efe044a746c4d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56807 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

+B!4@fPXK=MbH20b9;y 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 diff --git a/static/fonts/ubiquity-nova-standard.ttf b/static/fonts/ubiquity-nova-standard.ttf deleted file mode 100644 index d95348697ee4708a002df1f2d5f7651779a32347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187128 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�o)%n5Ro>)+X{RQp&#yU;IxEBgJqng`uq=ux+O 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 Qg*sdCOSBq--N{P*KZNstwg3PC diff --git a/static/fonts/ubiquity-nova-standard.woff b/static/fonts/ubiquity-nova-standard.woff deleted file mode 100644 index 0c2691e4352e99afb2390b0cee6734d71d5aa035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77756 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 EMtAR8XaE2J diff --git a/static/index.html b/static/index.html deleted file mode 100644 index dbae5f4..0000000 --- a/static/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Ubiquity TypeScript Template - - - -

Ubiquity TypeScript Template

- - - diff --git a/static/main.ts b/static/main.ts deleted file mode 100644 index b19bfa7..0000000 --- a/static/main.ts +++ /dev/null @@ -1,10 +0,0 @@ -export async function mainModule() { - console.log(`Hello from mainModule`); -} -mainModule() - .then(() => { - console.log("mainModule loaded"); - }) - .catch((error) => { - console.error(error); - }); diff --git a/static/style.css b/static/style.css deleted file mode 100644 index 3bbb3f0..0000000 --- a/static/style.css +++ /dev/null @@ -1,16 +0,0 @@ -body { - font-family: "Proxima Nova", "Ubiquity Nova", sans-serif; - background-color: #06061aff; - color: #fff; - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABYWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKIv64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYGRiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v////9uhJjXfgaGjUCdXDsRYhoWDAyC3AwMJ3YWJBYlgoWYgZgpLY2B4dNyBgbeSAYG4QtAPdHFacZGYHlGHicGBtZ7//9/VmNgYJ/MwPB3wv//vxf9//93MVDzHQaGA3kAFSFl7jXH0fsAAAA4ZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAwf1XlwAAACNJREFUSA3t0IEAAAAMBKFHm7/UTaQQWnXDgAEDBgwYMGDgAXaJAz4RVVHYAAAAAElFTkSuQmCC"); -} -@font-face { - font-family: "Ubiquity Nova"; - font-style: normal; - font-weight: 400; - src: url(./fonts/ubiquity-nova-standard.eot); - src: - url(./fonts/ubiquity-nova-standard.eot#iefix) format("embedded-opentype"), - url(./fonts/ubiquity-nova-standard.woff) format("woff"), - url(./fonts/ubiquity-nova-standard.ttf) format("truetype"); -} diff --git a/tests/__mocks__/payloads/comment-created.json b/tests/__mocks__/payloads/comment-created.json new file mode 100644 index 0000000..5e95054 --- /dev/null +++ b/tests/__mocks__/payloads/comment-created.json @@ -0,0 +1,246 @@ +{ + "action": "created", + "issue": { + "url": "https://api.github.com/repos/Meniole/bot/issues/5", + "repository_url": "https://api.github.com/repos/Meniole/bot", + "labels_url": "https://api.github.com/repos/Meniole/bot/issues/5/labels{/name}", + "comments_url": "https://api.github.com/repos/Meniole/bot/issues/5/comments", + "events_url": "https://api.github.com/repos/Meniole/bot/issues/5/events", + "html_url": "https://github.com/Meniole/bot/issues/5", + "id": 2297627819, + "node_id": "I_kwDOLy-Pv86I8wSr", + "number": 5, + "title": "New issue", + "user": { + "login": "gentlementlegen", + "id": 9807008, + "node_id": "MDQ6VXNlcjk4MDcwMDg=", + "avatar_url": "https://avatars.githubusercontent.com/u/9807008?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gentlementlegen", + "html_url": "https://github.com/gentlementlegen", + "followers_url": "https://api.github.com/users/gentlementlegen/followers", + "following_url": "https://api.github.com/users/gentlementlegen/following{/other_user}", + "gists_url": "https://api.github.com/users/gentlementlegen/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gentlementlegen/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gentlementlegen/subscriptions", + "organizations_url": "https://api.github.com/users/gentlementlegen/orgs", + "repos_url": "https://api.github.com/users/gentlementlegen/repos", + "events_url": "https://api.github.com/users/gentlementlegen/events{/privacy}", + "received_events_url": "https://api.github.com/users/gentlementlegen/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 34, + "created_at": "2024-05-15T11:22:48Z", + "updated_at": "2024-05-19T11:54:24Z", + "closed_at": null, + "author_association": "CONTRIBUTOR", + "active_lock_reason": null, + "body": "Another issue.", + "reactions": { + "url": "https://api.github.com/repos/Meniole/bot/issues/5/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/Meniole/bot/issues/5/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + "comment": { + "url": "https://api.github.com/repos/Meniole/bot/issues/comments/2119208855", + "html_url": "https://github.com/Meniole/bot/issues/5#issuecomment-2119208855", + "issue_url": "https://api.github.com/repos/Meniole/bot/issues/5", + "id": 2119208855, + "node_id": "IC_kwDOLy-Pv85-UI-X", + "user": { + "login": "gentlementlegen", + "id": 9807008, + "node_id": "MDQ6VXNlcjk4MDcwMDg=", + "avatar_url": "https://avatars.githubusercontent.com/u/9807008?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gentlementlegen", + "html_url": "https://github.com/gentlementlegen", + "followers_url": "https://api.github.com/users/gentlementlegen/followers", + "following_url": "https://api.github.com/users/gentlementlegen/following{/other_user}", + "gists_url": "https://api.github.com/users/gentlementlegen/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gentlementlegen/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gentlementlegen/subscriptions", + "organizations_url": "https://api.github.com/users/gentlementlegen/orgs", + "repos_url": "https://api.github.com/users/gentlementlegen/repos", + "events_url": "https://api.github.com/users/gentlementlegen/events{/privacy}", + "received_events_url": "https://api.github.com/users/gentlementlegen/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2024-05-19T11:54:23Z", + "updated_at": "2024-05-19T11:54:23Z", + "author_association": "CONTRIBUTOR", + "body": "/query @gentlementlegen", + "reactions": { + "url": "https://api.github.com/repos/Meniole/bot/issues/comments/2119208855/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + "repository": { + "id": 791646143, + "node_id": "R_kgDOLy-Pvw", + "name": "bot", + "full_name": "Meniole/bot", + "private": false, + "owner": { + "login": "Meniole", + "id": 159901852, + "node_id": "O_kgDOCYfonA", + "avatar_url": "https://avatars.githubusercontent.com/u/159901852?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Meniole", + "html_url": "https://github.com/Meniole", + "followers_url": "https://api.github.com/users/Meniole/followers", + "following_url": "https://api.github.com/users/Meniole/following{/other_user}", + "gists_url": "https://api.github.com/users/Meniole/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Meniole/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Meniole/subscriptions", + "organizations_url": "https://api.github.com/users/Meniole/orgs", + "repos_url": "https://api.github.com/users/Meniole/repos", + "events_url": "https://api.github.com/users/Meniole/events{/privacy}", + "received_events_url": "https://api.github.com/users/Meniole/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/Meniole/bot", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/Meniole/bot", + "forks_url": "https://api.github.com/repos/Meniole/bot/forks", + "keys_url": "https://api.github.com/repos/Meniole/bot/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/Meniole/bot/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/Meniole/bot/teams", + "hooks_url": "https://api.github.com/repos/Meniole/bot/hooks", + "issue_events_url": "https://api.github.com/repos/Meniole/bot/issues/events{/number}", + "events_url": "https://api.github.com/repos/Meniole/bot/events", + "assignees_url": "https://api.github.com/repos/Meniole/bot/assignees{/user}", + "branches_url": "https://api.github.com/repos/Meniole/bot/branches{/branch}", + "tags_url": "https://api.github.com/repos/Meniole/bot/tags", + "blobs_url": "https://api.github.com/repos/Meniole/bot/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/Meniole/bot/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/Meniole/bot/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/Meniole/bot/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/Meniole/bot/statuses/{sha}", + "languages_url": "https://api.github.com/repos/Meniole/bot/languages", + "stargazers_url": "https://api.github.com/repos/Meniole/bot/stargazers", + "contributors_url": "https://api.github.com/repos/Meniole/bot/contributors", + "subscribers_url": "https://api.github.com/repos/Meniole/bot/subscribers", + "subscription_url": "https://api.github.com/repos/Meniole/bot/subscription", + "commits_url": "https://api.github.com/repos/Meniole/bot/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/Meniole/bot/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/Meniole/bot/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/Meniole/bot/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/Meniole/bot/contents/{+path}", + "compare_url": "https://api.github.com/repos/Meniole/bot/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/Meniole/bot/merges", + "archive_url": "https://api.github.com/repos/Meniole/bot/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/Meniole/bot/downloads", + "issues_url": "https://api.github.com/repos/Meniole/bot/issues{/number}", + "pulls_url": "https://api.github.com/repos/Meniole/bot/pulls{/number}", + "milestones_url": "https://api.github.com/repos/Meniole/bot/milestones{/number}", + "notifications_url": "https://api.github.com/repos/Meniole/bot/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/Meniole/bot/labels{/name}", + "releases_url": "https://api.github.com/repos/Meniole/bot/releases{/id}", + "deployments_url": "https://api.github.com/repos/Meniole/bot/deployments", + "created_at": "2024-04-25T05:19:30Z", + "updated_at": "2024-05-19T09:47:02Z", + "pushed_at": "2024-05-19T09:46:59Z", + "git_url": "git://github.com/Meniole/bot.git", + "ssh_url": "git@github.com:Meniole/bot.git", + "clone_url": "https://github.com/Meniole/bot.git", + "svn_url": "https://github.com/Meniole/bot", + "homepage": null, + "size": 56, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 1, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "main", + "custom_properties": {} + }, + "organization": { + "login": "Meniole", + "id": 159901852, + "node_id": "O_kgDOCYfonA", + "url": "https://api.github.com/orgs/Meniole", + "repos_url": "https://api.github.com/orgs/Meniole/repos", + "events_url": "https://api.github.com/orgs/Meniole/events", + "hooks_url": "https://api.github.com/orgs/Meniole/hooks", + "issues_url": "https://api.github.com/orgs/Meniole/issues", + "members_url": "https://api.github.com/orgs/Meniole/members{/member}", + "public_members_url": "https://api.github.com/orgs/Meniole/public_members{/member}", + "avatar_url": "https://avatars.githubusercontent.com/u/159901852?v=4", + "description": null + }, + "sender": { + "login": "gentlementlegen", + "id": 9807008, + "node_id": "MDQ6VXNlcjk4MDcwMDg=", + "avatar_url": "https://avatars.githubusercontent.com/u/9807008?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gentlementlegen", + "html_url": "https://github.com/gentlementlegen", + "followers_url": "https://api.github.com/users/gentlementlegen/followers", + "following_url": "https://api.github.com/users/gentlementlegen/following{/other_user}", + "gists_url": "https://api.github.com/users/gentlementlegen/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gentlementlegen/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gentlementlegen/subscriptions", + "organizations_url": "https://api.github.com/users/gentlementlegen/orgs", + "repos_url": "https://api.github.com/users/gentlementlegen/repos", + "events_url": "https://api.github.com/users/gentlementlegen/events{/privacy}", + "received_events_url": "https://api.github.com/users/gentlementlegen/received_events", + "type": "User", + "site_admin": false + }, + "installation": { + "id": 48381972, + "node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uNDgzODE5NzI=" + } +} diff --git a/tests/main.test.ts b/tests/main.test.ts index d891c3c..cb75f62 100644 --- a/tests/main.test.ts +++ b/tests/main.test.ts @@ -1,8 +1,10 @@ -import { mainModule } from "../static/main"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, it } from "@jest/globals"; +import { run } from "../src/run"; +import { PluginInputs } from "../src/types/plugin-input"; import { db } from "./__mocks__/db"; import { server } from "./__mocks__/node"; +import commentCreatedPayload from "./__mocks__/payloads/comment-created.json"; import usersGet from "./__mocks__/users-get.json"; -import { expect, describe, beforeAll, beforeEach, afterAll, afterEach, it } from "@jest/globals"; beforeAll(() => server.listen()); afterEach(() => server.resetHandlers()); @@ -15,10 +17,17 @@ describe("User tests", () => { } }); - it("Should fetch all the users", async () => { - const res = await fetch("https://api.ubiquity.com/users"); - const data = await res.json(); - expect(data).toMatchObject(usersGet); - expect(async () => await mainModule()).not.toThrow(); + it("Should run the command", async () => { + await run( + { + eventName: "issue_comment.created", + ref: "", + authToken: "", + stateId: "", + settings: { allowPublicQuery: true }, + eventPayload: commentCreatedPayload, + } as PluginInputs, + { SUPABASE_URL: "", SUPABASE_KEY: "", GITHUB_TOKEN: "" } + ); }); }); diff --git a/yarn.lock b/yarn.lock index a8faa36..f3382a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -355,10 +355,10 @@ resolved "https://registry.yarnpkg.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240512.0.tgz#c4cd1673a690b9f7f8fb413a9ff16592cdf847f1" integrity sha512-SxKapDrIYSscMR7lGIp/av0l6vokjH4xQ9ACxHgXh+OdOus9azppSmjaPyw4/ePvg7yqpkaNjf9o258IxWtvKQ== -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@commander-js/extra-typings@12.1.0": + version "12.1.0" + resolved "https://registry.yarnpkg.com/@commander-js/extra-typings/-/extra-typings-12.1.0.tgz#5441bae756d326d34f1b9dceb0d78dbf5bc05d81" + integrity sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg== "@commitlint/cli@^18.6.1": version "18.6.1" @@ -867,38 +867,6 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@cypress/request@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" - integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - http-signature "~1.3.6" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - performance-now "^2.1.0" - qs "6.10.4" - safe-buffer "^5.1.2" - tough-cookie "^4.1.3" - tunnel-agent "^0.6.0" - uuid "^8.3.2" - -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" - "@ericcornelissen/bash-parser@0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@ericcornelissen/bash-parser/-/bash-parser-0.5.2.tgz#5eb3bc52020d97fbaebc63b5168ca0aa0b2e8418" @@ -2247,16 +2215,6 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.7.tgz#326f5fdda70d13580777bcaa1bc6fa772a5aef0e" integrity sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg== -"@types/sinonjs__fake-timers@8.1.1": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" - integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== - -"@types/sizzle@^2.3.2": - version "2.3.8" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" - integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== - "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" @@ -2296,13 +2254,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yauzl@^2.9.1": - version "2.10.3" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" - integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== - dependencies: - "@types/node" "*" - "@typescript-eslint/eslint-plugin@^7.0.1": version "7.0.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.1.tgz#407daffe09d964d57aceaf3ac51846359fbe61b0" @@ -2465,12 +2416,7 @@ ajv@^8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -2526,11 +2472,6 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2604,53 +2545,11 @@ as-table@^1.0.36: dependencies: printable-characters "^1.0.42" -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async@^3.2.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== - babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -2721,18 +2620,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - before-after-hook@^2.2.0: version "2.2.3" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" @@ -2748,16 +2635,6 @@ blake3-wasm@^2.1.5: resolved "https://registry.yarnpkg.com/blake3-wasm/-/blake3-wasm-2.1.5.tgz#b22dbb84bc9419ed0159caa76af4b1b132e6ba52" integrity sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g== -blob-util@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" - integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== - -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - bole@^5.0.0: version "5.0.11" resolved "https://registry.yarnpkg.com/bole/-/bole-5.0.11.tgz#c4a165975422daee6f576360e882a425c8e40617" @@ -2812,24 +2689,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - builtins@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" @@ -2837,11 +2701,6 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" -cachedir@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" - integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== - call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -2890,11 +2749,6 @@ capnp-ts@^0.7.0: debug "^4.3.1" tslib "^2.2.0" -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - chalk-template@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" @@ -2934,11 +2788,6 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -check-more-types@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" - integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== - chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -2984,13 +2833,6 @@ clear-module@^4.1.2: parent-module "^2.0.0" resolve-from "^5.0.0" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - cli-cursor@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" @@ -3003,23 +2845,6 @@ cli-spinners@^2.9.2: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== -cli-table3@~0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - cli-truncate@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" @@ -3081,23 +2906,21 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^2.0.16, colorette@^2.0.20: +colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - commander@11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== +commander@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" @@ -3108,11 +2931,6 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - comment-json@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.3.tgz#50b487ebbf43abe44431f575ebda07d30d015365" @@ -3124,11 +2942,6 @@ comment-json@^4.2.3: has-own-prop "^2.0.0" repeat-string "^1.6.1" -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -3194,11 +3007,6 @@ cookie@^0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - core-util-is@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -3381,66 +3189,11 @@ cspell@^8.4.0: strip-ansi "^7.1.0" vscode-uri "^3.0.8" -cypress@13.6.6: - version "13.6.6" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.6.6.tgz#5133f231ed1c6e57dc8dcbf60aade220bcd6884b" - integrity sha512-S+2S9S94611hXimH9a3EAYt81QM913ZVA03pUmGDfLTFa5gyp85NJ8dJGSlEAEmyRsYkioS1TtnWtbv/Fzt11A== - dependencies: - "@cypress/request" "^3.0.0" - "@cypress/xvfb" "^1.2.4" - "@types/sinonjs__fake-timers" "8.1.1" - "@types/sizzle" "^2.3.2" - arch "^2.2.0" - blob-util "^2.0.2" - bluebird "^3.7.2" - buffer "^5.7.1" - cachedir "^2.3.0" - chalk "^4.1.0" - check-more-types "^2.24.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.1" - commander "^6.2.1" - common-tags "^1.8.0" - dayjs "^1.10.4" - debug "^4.3.4" - enquirer "^2.3.6" - eventemitter2 "6.4.7" - execa "4.1.0" - executable "^4.1.1" - extract-zip "2.0.1" - figures "^3.2.0" - fs-extra "^9.1.0" - getos "^3.2.1" - is-ci "^3.0.1" - is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" - log-symbols "^4.0.0" - minimist "^1.2.8" - ospath "^1.2.2" - pretty-bytes "^5.6.0" - process "^0.11.10" - proxy-from-env "1.0.0" - request-progress "^3.0.0" - semver "^7.5.3" - supports-color "^8.1.1" - tmp "~0.2.1" - untildify "^4.0.0" - yauzl "^2.10.0" - dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - data-uri-to-buffer@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" @@ -3458,11 +3211,6 @@ date-fns@^2.21.1: dependencies: "@babel/runtime" "^7.21.0" -dayjs@^1.10.4: - version "1.11.10" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" - integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== - debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -3470,13 +3218,6 @@ debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3. dependencies: ms "2.1.2" -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -3535,11 +3276,6 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -3602,14 +3338,6 @@ easy-table@1.2.0: optionalDependencies: wcwidth "^1.0.1" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - electron-to-chromium@^1.4.668: version "1.4.690" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz#dd5145d45c49c08a9a6f7454127e660bdf9a3fa7" @@ -3642,21 +3370,6 @@ encode-registry@^3.0.1: dependencies: mem "^8.0.0" -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.6: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -3980,31 +3693,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eventemitter2@6.4.7: - version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" - integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== - eventemitter3@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -execa@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" @@ -4035,13 +3728,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - exit-hook@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" @@ -4063,32 +3749,6 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -4144,13 +3804,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - fetch-blob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-2.1.2.tgz#a7805db1361bd44c1ef62bb57fb5fe8ea173ef3c" @@ -4253,20 +3906,6 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - fs-extra@10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -4276,16 +3915,6 @@ fs-extra@10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -4365,13 +3994,6 @@ get-stdin@^9.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== -get-stream@^5.0.0, get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -4398,20 +4020,6 @@ get-tsconfig@^4.7.2: dependencies: resolve-pkg-maps "^1.0.0" -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - git-raw-commits@^2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" @@ -4479,13 +4087,6 @@ global-dirs@^0.1.1: dependencies: ini "^1.3.4" -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4629,20 +4230,6 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-signature@~1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" - integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== - dependencies: - assert-plus "^1.0.0" - jsprim "^2.0.2" - sshpk "^1.14.1" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -4663,11 +4250,6 @@ identity-function@^1.0.0: resolved "https://registry.yarnpkg.com/identity-function/-/identity-function-1.0.0.tgz#bea1159f0985239be3ca348edf40ce2f0dd2c21d" integrity sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw== -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^5.1.8, ignore@^5.2.0, ignore@^5.2.4: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" @@ -4727,11 +4309,6 @@ inherits@2, inherits@^2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" @@ -4796,13 +4373,6 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" @@ -4851,14 +4421,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-installed-globally@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - is-iterable@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/is-iterable/-/is-iterable-1.1.1.tgz#71f9aa6f113e1d968ebe1d41cff4c8fb23a817bc" @@ -4896,7 +4458,7 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -4959,16 +4521,11 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.13, is-typed-array@^1.1.9: dependencies: which-typed-array "^1.1.14" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -4991,11 +4548,6 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" @@ -5456,11 +5008,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -5496,17 +5043,12 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -5530,16 +5072,6 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsprim@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" - integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -5586,11 +5118,6 @@ knip@^5.0.1: zod "3.22.4" zod-validation-error "3.0.0" -lazy-ass@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" - integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5642,20 +5169,6 @@ listr2@8.0.1: rfdc "^1.3.0" wrap-ansi "^9.0.0" -listr2@^3.8.3: - version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" - integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.1" - through "^2.3.8" - wrap-ansi "^7.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -5730,11 +5243,6 @@ lodash.mergewith@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== -lodash.once@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - lodash.snakecase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -5760,24 +5268,6 @@ lodash@^4.17.15, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - log-update@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" @@ -5933,18 +5423,6 @@ micromatch@4.0.5, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - mime@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" @@ -6011,7 +5489,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@1.2.8, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: +minimist@1.2.8, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -6031,11 +5509,6 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - msw@^2.0.8: version "2.2.2" resolved "https://registry.yarnpkg.com/msw/-/msw-2.2.2.tgz#ead090ba02eb474425f45b09ea8d24cd2ff49629" @@ -6200,7 +5673,7 @@ npm-run-all@^4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" -npm-run-path@^4.0.0, npm-run-path@^4.0.1: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -6244,7 +5717,7 @@ object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -6277,11 +5750,6 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" - integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== - outvariant@^1.2.1, outvariant@^1.4.0, outvariant@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.2.tgz#f54f19240eeb7f15b28263d5147405752d8e2066" @@ -6446,16 +5914,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - picocolors@1.0.0, picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -6481,11 +5939,6 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== -pify@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -6525,11 +5978,6 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== -pretty-bytes@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -6556,11 +6004,6 @@ proc-log@^3.0.0: resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -6582,25 +6025,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -proxy-from-env@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -6610,18 +6035,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== -qs@6.10.4: - version "6.10.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" - integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== - dependencies: - side-channel "^1.0.4" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -6730,13 +6143,6 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== - dependencies: - throttleit "^1.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -6747,11 +6153,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -6795,14 +6196,6 @@ resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.8: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - restore-cursor@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" @@ -6880,13 +6273,6 @@ run-parallel@^1.1.9, run-parallel@^1.2.0: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - safe-array-concat@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" @@ -6897,7 +6283,7 @@ safe-array-concat@^1.1.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6911,11 +6297,6 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - selfsigned@^2.0.1: version "2.4.1" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" @@ -7026,24 +6407,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" @@ -7126,21 +6489,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.14.1: - version "1.18.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" - integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - ssri@10.0.5: version "10.0.5" resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" @@ -7352,7 +6700,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -7391,11 +6739,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -throttleit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" - integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== - through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" @@ -7403,16 +6746,11 @@ through2@^4.0.0: dependencies: readable-stream "3" -"through@>=2.2.7 <3", through@^2.3.8: +"through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tmp@~0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== - tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -7449,16 +6787,6 @@ to-space-case@^1.0.0: dependencies: to-no-case "^1.0.0" -tough-cookie@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -7488,7 +6816,7 @@ ts-jest@29.1.2: semver "^7.5.3" yargs-parser "^21.0.1" -tslib@^2.1.0, tslib@^2.2.0, tslib@^2.6.2: +tslib@^2.2.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -7503,18 +6831,6 @@ tsx@^4.7.1: optionalDependencies: fsevents "~2.3.3" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -7666,21 +6982,11 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" @@ -7696,14 +7002,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -7745,15 +7043,6 @@ validate-npm-package-name@^5.0.0: dependencies: builtins "^5.0.0" -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - version-selector-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/version-selector-type/-/version-selector-type-3.0.0.tgz#47c365fb4d9ca4a54e6dabcad6fb7a46265f7955" @@ -8010,14 +7299,6 @@ yargs@^17.0.0, yargs@^17.3.1, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From cdd285c4df93dc2637addd598801c4ad56d5b738 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Tue, 21 May 2024 18:02:44 +0900 Subject: [PATCH 03/56] chore: cloudflare build --- .github/workflows/deploy.yml | 8 ++++---- src/run.ts | 11 +++++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d97febd..034b413 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,10 +1,10 @@ name: Deploy to Cloudflare Pages on: - workflow_run: - workflows: ["Build"] - types: - - completed + workflow_dispatch: + push: + branches: + - main jobs: deploy-to-cloudflare: diff --git a/src/run.ts b/src/run.ts index 724876b..1b8ac64 100644 --- a/src/run.ts +++ b/src/run.ts @@ -11,15 +11,22 @@ export async function run(inputs: PluginInputs, env: Env) { return; } const args = inputs.eventPayload.comment.body.trim().split(/\s+/); + const octokit = new Octokit({ auth: env.GITHUB_TOKEN }); + const context = { octokit, payload: inputs.eventPayload } as Context; try { - const octokit = new Octokit({ auth: env.GITHUB_TOKEN }); - const commandParser = new CommandParser({ octokit, payload: inputs.eventPayload } as Context); + const commandParser = new CommandParser(context); await commandParser.parse(args); } catch (e) { if (e instanceof CommanderError) { if (e.code !== "commander.unknownCommand") { // post error console.error(e); + await octokit.issues.createComment({ + body: `${e}`, + owner: context.payload.repository.owner.login, + repo: context.payload.repository.name, + issue_number: context.payload.issue.number, + }); } } else { throw e; From cf8c61ac85d18d1c01e60a685964149898b1cd93 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Tue, 21 May 2024 18:04:52 +0900 Subject: [PATCH 04/56] chore: cloudflare build --- .cspell.json | 2 +- .github/workflows/deploy.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.cspell.json b/.cspell.json index ae85a2a..44418a4 100644 --- a/.cspell.json +++ b/.cspell.json @@ -4,7 +4,7 @@ "ignorePaths": ["**/*.json", "**/*.css", "node_modules", "**/*.log"], "useGitignore": true, "language": "en", - "words": ["dataurl", "devpool", "outdir", "servedir", "typebox"], + "words": ["dataurl", "devpool", "outdir", "servedir", "typebox", "supabase", "ubiquibot"], "dictionaries": ["typescript", "node", "software-terms"], "import": ["@cspell/dict-typescript/cspell-ext.json", "@cspell/dict-node/cspell-ext.json", "@cspell/dict-software-terms"], "ignoreRegExpList": ["[0-9a-fA-F]{6}"] diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 034b413..766a419 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,7 +12,6 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Deploy to Cloudflare - if: ${{ github.event.workflow_run.conclusion == 'success' }} uses: ubiquity/cloudflare-deploy-action@main with: repository: ${{ github.repository }} From db6fd260487afb6e94c4c1d8cda078af70858dcc Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Tue, 21 May 2024 18:09:55 +0900 Subject: [PATCH 05/56] chore: cloudflare action change --- .github/workflows/deploy.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 766a419..1367b58 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,8 +11,7 @@ jobs: name: Automatic Cloudflare Deploy runs-on: ubuntu-22.04 steps: - - name: Deploy to Cloudflare - uses: ubiquity/cloudflare-deploy-action@main + - uses: cloudflare/wrangler-action@v3 with: repository: ${{ github.repository }} production_branch: ${{ github.event.repository.default_branch }} From 8d60fea5360f0f46623d187c2c5d38258f9e1874 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 12:23:08 +0900 Subject: [PATCH 06/56] chore: added error posting --- .env.example | 4 +++- .gitignore | 1 + package.json | 4 ++-- src/handlers/command-parser.ts | 11 ++++++++--- src/run.ts | 14 ++++++++++---- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/.env.example b/.env.example index e49d79a..cc930f3 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,3 @@ -MY_SECRET="MY_SECRET" +SUPABASE_URL= +SUPABASE_KEY= +GITHUB_TOKEN= diff --git a/.gitignore b/.gitignore index 417a7b3..2e0cdd6 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ static/dist coverage junit.xml cypress/screenshots +.dev.vars diff --git a/package.json b/package.json index c0cfde2..e43ecd0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "ts-template", + "name": "command-query-user", "version": "1.0.0", - "description": "Template repository with TypeScript support.", + "description": "Queries a user and retrieves its related information, such as the wallet, the label access control, or the current XP.", "main": "build/index.ts", "author": "Ubiquity DAO", "license": "MIT", diff --git a/src/handlers/command-parser.ts b/src/handlers/command-parser.ts index a790b47..65f71a8 100644 --- a/src/handlers/command-parser.ts +++ b/src/handlers/command-parser.ts @@ -1,4 +1,4 @@ -import { InvalidArgumentError, program } from "@commander-js/extra-typings"; +import { Command, InvalidArgumentError } from "commander"; import packageJson from "../../package.json"; import { Context } from "../types/context"; import { queryUser } from "./query-user"; @@ -7,11 +7,14 @@ export class CommandParser { readonly _program; constructor(context: Context) { + const program = new Command(); program .command("/query") .usage("@") .argument("", "User name to query, e.g. @ubiquibot", this._parseUser) .action((username) => queryUser(context, username)) + .helpCommand(false) + .exitOverride() .version(packageJson.version); // Overrides to make sure we do not use TTY outputs as they are not available outside Node.js env @@ -39,6 +42,10 @@ export class CommandParser { return this._program.parseAsync(args, { from: "user" }); } + helpInformation() { + return this._program.helpInformation(); + } + _parseUser(value: string) { if (!value.length || value.length < 2) { throw new InvalidArgumentError("Username should be at least 2 characters long."); @@ -50,5 +57,3 @@ export class CommandParser { return value.slice(1); } } - -export default program; diff --git a/src/run.ts b/src/run.ts index 1b8ac64..65316ff 100644 --- a/src/run.ts +++ b/src/run.ts @@ -1,4 +1,4 @@ -import { CommanderError } from "@commander-js/extra-typings"; +import { CommanderError } from "commander"; import { Octokit } from "@octokit/rest"; import { CommandParser } from "./handlers/command-parser"; import { Context } from "./types/context"; @@ -13,16 +13,22 @@ export async function run(inputs: PluginInputs, env: Env) { const args = inputs.eventPayload.comment.body.trim().split(/\s+/); const octokit = new Octokit({ auth: env.GITHUB_TOKEN }); const context = { octokit, payload: inputs.eventPayload } as Context; + const commandParser = new CommandParser(context); try { - const commandParser = new CommandParser(context); await commandParser.parse(args); } catch (e) { + console.log("error", e); if (e instanceof CommanderError) { if (e.code !== "commander.unknownCommand") { - // post error console.error(e); + console.log("posting!"); await octokit.issues.createComment({ - body: `${e}`, + body: `\`\`\` +Failed to run command-query-user. +${e} + +${commandParser.helpInformation()} +\`\`\``, owner: context.payload.repository.owner.login, repo: context.payload.repository.name, issue_number: context.payload.issue.number, From 1f0c7fff85463a9e9c08914c1ea8053f9587f37f Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 13:00:52 +0900 Subject: [PATCH 07/56] chore: wallet and access query --- src/adapters/index.ts | 16 +++++++++++++++- src/handlers/query-user.ts | 36 ++++++++++++++++++++++++++++++++++-- src/run.ts | 29 ++++++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/src/adapters/index.ts b/src/adapters/index.ts index 287e59c..7f0c0d7 100644 --- a/src/adapters/index.ts +++ b/src/adapters/index.ts @@ -2,7 +2,21 @@ import { SupabaseClient } from "@supabase/supabase-js"; import { Context } from "../types/context"; export function createAdapters(supabaseClient: SupabaseClient, context: Context) { + void context; return { - supabase: {}, + supabase: { + access: { + async getAccess(userId: number) { + const { data } = await supabaseClient.from("users").select().eq("user_id", userId).single(); + return data; + }, + }, + wallet: { + async getWallet(userId: number) { + const { data } = await supabaseClient.from("users").select("*, wallets(address)").eq("id", userId).single(); + return data; + }, + }, + }, }; } diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 139be9b..f6b0da4 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -1,10 +1,42 @@ import { Context } from "../types/context"; export async function queryUser(context: Context, username: string) { - const { octokit, payload } = context; + const { + octokit, + payload, + adapters: { supabase }, + } = context; + const body: string[] = []; try { + const { + data: { id }, + } = await octokit.users.getByUsername({ + username, + }); + const access = await supabase.access.getAccess(id); + const wallet = await supabase.wallet.getWallet(id); + if (!access && !wallet) { + body.push(`\`\`\` +User information for ${username} was not found. +\`\`\``); + } else { + body.push(` +| Property | Value | +-----------|-------- +`); + if (wallet) { + body.push(` +| Wallet | ${wallet.address} | +`); + } + if (access) { + body.push(` +| Access | ${access.multiplier_reason} | +`); + } + } await octokit.issues.createComment({ - body: `Hello ${username}`, + body: body.join(""), owner: payload.repository.owner.login, repo: payload.repository.name, issue_number: payload.issue.number, diff --git a/src/run.ts b/src/run.ts index 65316ff..8565c02 100644 --- a/src/run.ts +++ b/src/run.ts @@ -1,5 +1,7 @@ +import { createClient } from "@supabase/supabase-js"; import { CommanderError } from "commander"; import { Octokit } from "@octokit/rest"; +import { createAdapters } from "./adapters"; import { CommandParser } from "./handlers/command-parser"; import { Context } from "./types/context"; import { Env } from "./types/env"; @@ -12,7 +14,32 @@ export async function run(inputs: PluginInputs, env: Env) { } const args = inputs.eventPayload.comment.body.trim().split(/\s+/); const octokit = new Octokit({ auth: env.GITHUB_TOKEN }); - const context = { octokit, payload: inputs.eventPayload } as Context; + const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY); + const context = { + eventName: inputs.eventName, + payload: inputs.eventPayload, + config: inputs.settings, + octokit, + logger: { + debug(message: unknown, ...optionalParams: unknown[]) { + console.debug(message, ...optionalParams); + }, + info(message: unknown, ...optionalParams: unknown[]) { + console.log(message, ...optionalParams); + }, + warn(message: unknown, ...optionalParams: unknown[]) { + console.warn(message, ...optionalParams); + }, + error(message: unknown, ...optionalParams: unknown[]) { + console.error(message, ...optionalParams); + }, + fatal(message: unknown, ...optionalParams: unknown[]) { + console.error(message, ...optionalParams); + }, + }, + adapters: {}, + } as Context; + context.adapters = createAdapters(supabase, context); const commandParser = new CommandParser(context); try { await commandParser.parse(args); From bbe52ba4f03c4b2c502b84c1964b0db1e5ce3e80 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 13:48:31 +0900 Subject: [PATCH 08/56] chore: proper formatting for comment --- .env.example => .dev.vars.example | 0 src/adapters/index.ts | 15 +++++++++++---- src/handlers/query-user.ts | 13 ++++--------- 3 files changed, 15 insertions(+), 13 deletions(-) rename .env.example => .dev.vars.example (100%) diff --git a/.env.example b/.dev.vars.example similarity index 100% rename from .env.example rename to .dev.vars.example diff --git a/src/adapters/index.ts b/src/adapters/index.ts index 7f0c0d7..c3f7e1f 100644 --- a/src/adapters/index.ts +++ b/src/adapters/index.ts @@ -2,19 +2,26 @@ import { SupabaseClient } from "@supabase/supabase-js"; import { Context } from "../types/context"; export function createAdapters(supabaseClient: SupabaseClient, context: Context) { - void context; return { supabase: { access: { async getAccess(userId: number) { - const { data } = await supabaseClient.from("users").select().eq("user_id", userId).single(); + const { data, error } = await supabaseClient.from("access").select("*, users(*)").eq("users.id", userId).single(); + if (error) { + context.logger.error(error.message, error); + return null; + } return data; }, }, wallet: { async getWallet(userId: number) { - const { data } = await supabaseClient.from("users").select("*, wallets(address)").eq("id", userId).single(); - return data; + const { data, error } = await supabaseClient.from("users").select("*, wallets(address)").eq("id", userId).single(); + if (error) { + context.logger.error("Failed to fetch wallet for user", userId, error); + return null; + } + return data.wallets; }, }, }, diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index f6b0da4..69fd9fb 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -22,21 +22,16 @@ User information for ${username} was not found. } else { body.push(` | Property | Value | ------------|-------- -`); +|----------|-------|`); if (wallet) { - body.push(` -| Wallet | ${wallet.address} | -`); + body.push(`| Wallet | ${wallet.address} |`); } if (access) { - body.push(` -| Access | ${access.multiplier_reason} | -`); + body.push(`| Access | ${access.multiplier_reason} |`); } } await octokit.issues.createComment({ - body: body.join(""), + body: body.join("\n"), owner: payload.repository.owner.login, repo: payload.repository.name, issue_number: payload.issue.number, From 59355b8c82e9470fd4549169d2aaad838a47c23c Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 13:58:13 +0900 Subject: [PATCH 09/56] chore: removed log --- src/run.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/run.ts b/src/run.ts index 8565c02..6b8cc3d 100644 --- a/src/run.ts +++ b/src/run.ts @@ -48,7 +48,6 @@ export async function run(inputs: PluginInputs, env: Env) { if (e instanceof CommanderError) { if (e.code !== "commander.unknownCommand") { console.error(e); - console.log("posting!"); await octokit.issues.createComment({ body: `\`\`\` Failed to run command-query-user. From 43355fda047f4500663fb939143ab0a4c351351f Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 14:55:14 +0900 Subject: [PATCH 10/56] chore: test for membership in org --- .github/workflows/deploy.yml | 1 + src/handlers/query-user.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1367b58..f5880a0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -5,6 +5,7 @@ on: push: branches: - main + - development jobs: deploy-to-cloudflare: diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 69fd9fb..d6d35f6 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -5,6 +5,7 @@ export async function queryUser(context: Context, username: string) { octokit, payload, adapters: { supabase }, + config, } = context; const body: string[] = []; try { @@ -13,6 +14,22 @@ export async function queryUser(context: Context, username: string) { } = await octokit.users.getByUsername({ username, }); + if (!config.allowPublicQuery && payload.organization) { + const { status } = await octokit.orgs.checkMembershipForUser({ + username, + org: payload.organization.login, + }); + if (status !== 204) { + body.push(`\`\`\`User ${username} cannot request another user as it is not member of the organization.\`\`\``); + await octokit.issues.createComment({ + body: body.join("\n"), + owner: payload.repository.owner.login, + repo: payload.repository.name, + issue_number: payload.issue.number, + }); + return; + } + } const access = await supabase.access.getAccess(id); const wallet = await supabase.wallet.getWallet(id); if (!access && !wallet) { From 6dcbd2f34139c7da57bfd3f45e1f47c49471a3a8 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 14:59:04 +0900 Subject: [PATCH 11/56] chore: fix cloudflare deploy --- .github/workflows/build.yml | 33 --------------------------------- .github/workflows/deploy.yml | 4 ++++ 2 files changed, 4 insertions(+), 33 deletions(-) delete mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 28d7188..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Build - -on: - push: - pull_request: - workflow_dispatch: - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-22.04 - - steps: - - name: Check out repository - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 20.10.0 - - - name: Build - run: | - yarn - yarn build - - - name: Upload build artifact - uses: actions/upload-artifact@v4 - with: - name: static - path: static diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f5880a0..e6367be 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -25,3 +25,7 @@ jobs: SUPABASE_URL SUPABASE_KEY GITHUB_TOKEN + env: + SUPABASE_URL: ${{ secrets.SUPABASE_URL }} + SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 412368b67ccc021b91c40027772ebcfd35f4b9b1 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 15:00:17 +0900 Subject: [PATCH 12/56] chore: fix cloudflare deploy --- .github/workflows/deploy.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e6367be..5a04a9e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -25,7 +25,7 @@ jobs: SUPABASE_URL SUPABASE_KEY GITHUB_TOKEN - env: - SUPABASE_URL: ${{ secrets.SUPABASE_URL }} - SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + env: + SUPABASE_URL: ${{ secrets.SUPABASE_URL }} + SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 18f11cff5ff969dce7d7889543ed92e3b4b9d271 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 15:02:36 +0900 Subject: [PATCH 13/56] chore: fix cloudflare deploy --- .github/workflows/deploy.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5a04a9e..416648f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -14,8 +14,9 @@ jobs: steps: - uses: cloudflare/wrangler-action@v3 with: + wranglerVersion: '3.57.0' repository: ${{ github.repository }} - production_branch: ${{ github.event.repository.default_branch }} + production_branch: 'main' current_branch: ${{ github.event.workflow_run.head_branch }} cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }} From 18cca30b7a4edde7655700ecd1e0f2470c7cc78a Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 15:05:43 +0900 Subject: [PATCH 14/56] chore: fixed knip workflow --- .github/workflows/knip-reporter.yml | 40 +++++++++++++++++++++++++++++ .github/workflows/knip.yml | 26 ++++++++++--------- 2 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/knip-reporter.yml diff --git a/.github/workflows/knip-reporter.yml b/.github/workflows/knip-reporter.yml new file mode 100644 index 0000000..f6e66ed --- /dev/null +++ b/.github/workflows/knip-reporter.yml @@ -0,0 +1,40 @@ +name: Knip-reporter + +on: + workflow_run: + workflows: ["Knip"] + types: + - completed + +permissions: write-all + +jobs: + knip-reporter: + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: knip-results + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Read pr number + id: pr-number + uses: juliangruber/read-file-action@v1 + with: + path: ./pr-number.txt + trim: true + + - name: Report knip results to pull request + if: ${{ github.event.workflow_run.conclusion != 'success' }} + uses: gitcoindev/knip-reporter@main + with: + verbose: true + comment_id: ${{ github.workflow }}-reporter + command_script_name: knip-ci + annotations: true + ignore_results: false + json_input: true + json_input_file_name: knip-results.json + pull_request_number: ${{ steps.pr-number.outputs.content }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml index 1b2136e..d9237eb 100644 --- a/.github/workflows/knip.yml +++ b/.github/workflows/knip.yml @@ -1,13 +1,9 @@ name: Knip on: - push: - branches: - - development + pull_request: workflow_dispatch: -permissions: write-all - jobs: run-knip: runs-on: ubuntu-latest @@ -23,11 +19,17 @@ jobs: - name: Install toolchain run: yarn install - - name: Report knip results to pull request - uses: Codex-/knip-reporter@v2 + - name: Store PR number + run: echo ${{ github.event.number }} > pr-number.txt + + - name: Run Knip + run: yarn knip || yarn knip --reporter json > knip-results.json + + - name: Upload knip result + if: failure() + uses: actions/upload-artifact@v4 with: - verbose: true - comment_id: ${{ github.workflow }}-reporter - command_script_name: knip-ci - annotations: true - ignore_results: false + name: knip-results + path: | + knip-results.json + pr-number.txt From c202a9960287895edf461f12458fd7e6167944fb Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 15:08:28 +0900 Subject: [PATCH 15/56] chore: fixed cloudflare workflow --- .github/workflows/deploy.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 416648f..ebc991c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -15,13 +15,7 @@ jobs: - uses: cloudflare/wrangler-action@v3 with: wranglerVersion: '3.57.0' - repository: ${{ github.repository }} - production_branch: 'main' - current_branch: ${{ github.event.workflow_run.head_branch }} - cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }} - commit_sha: ${{ github.event.workflow_run.head_sha }} - workflow_run_id: ${{ github.event.workflow_run.id }} + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} secrets: | SUPABASE_URL SUPABASE_KEY From 11fbf03e028ea552d43869680f44c4a8bc8e06e1 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 15:10:26 +0900 Subject: [PATCH 16/56] chore: fixed cloudflare workflow --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ebc991c..55ef478 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,6 +12,7 @@ jobs: name: Automatic Cloudflare Deploy runs-on: ubuntu-22.04 steps: + - uses: actions/checkout@v4 - uses: cloudflare/wrangler-action@v3 with: wranglerVersion: '3.57.0' From d98524ce3b79e5efec1a65f83eda798a276ab30c Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 15:11:27 +0900 Subject: [PATCH 17/56] chore: fixed cloudflare workflow --- .github/workflows/deploy.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 55ef478..7da40ae 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,6 +12,10 @@ jobs: name: Automatic Cloudflare Deploy runs-on: ubuntu-22.04 steps: + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "20" - uses: actions/checkout@v4 - uses: cloudflare/wrangler-action@v3 with: From 9d6da481686f1eede0c49888144ebc4a3f3f4bfd Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 15:23:57 +0900 Subject: [PATCH 18/56] chore: fixed cloudflare workflow --- .github/workflows/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7da40ae..caf806f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,8 +24,8 @@ jobs: secrets: | SUPABASE_URL SUPABASE_KEY - GITHUB_TOKEN + UBIQUIBOT_TOKEN env: SUPABASE_URL: ${{ secrets.SUPABASE_URL }} SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + UBIQUIBOT_TOKEN: ${{ secrets.UBIQUIBOT_TOKEN }} From 27a210b2468a92dfc8d3e56b945dc542c94ed5cf Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 15:27:57 +0900 Subject: [PATCH 19/56] chore: renamed token env var --- src/run.ts | 2 +- src/types/env.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/run.ts b/src/run.ts index 6b8cc3d..d163c22 100644 --- a/src/run.ts +++ b/src/run.ts @@ -13,7 +13,7 @@ export async function run(inputs: PluginInputs, env: Env) { return; } const args = inputs.eventPayload.comment.body.trim().split(/\s+/); - const octokit = new Octokit({ auth: env.GITHUB_TOKEN }); + const octokit = new Octokit({ auth: env.UBIQUIBOT_TOKEN }); const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY); const context = { eventName: inputs.eventName, diff --git a/src/types/env.ts b/src/types/env.ts index 161f5e8..7be4ee3 100644 --- a/src/types/env.ts +++ b/src/types/env.ts @@ -3,7 +3,7 @@ import { Type as T, StaticDecode } from "@sinclair/typebox"; export const envSchema = T.Object({ SUPABASE_URL: T.String(), SUPABASE_KEY: T.String(), - GITHUB_TOKEN: T.String(), + UBIQUIBOT_TOKEN: T.String(), }); export type Env = StaticDecode; From 14d22101d51d39dd681dfcdec3235941faaf0a8d Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 16:03:48 +0900 Subject: [PATCH 20/56] chore: added tests for run --- src/handlers/query-user.ts | 3 + tests/__mocks__/handlers.ts | 8 ++- tests/main.test.ts | 115 ++++++++++++++++++++++++++++++++---- 3 files changed, 112 insertions(+), 14 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index d6d35f6..c46641d 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -19,6 +19,9 @@ export async function queryUser(context: Context, username: string) { username, org: payload.organization.login, }); + // @ts-expect-error Somehow typing seems wrong but according to + // https://docs.github.com/en/rest/orgs/members?apiVersion=2022-11-28#check-organization-membership-for-a-user--status-codes + // 204 means the user is part of the Organization if (status !== 204) { body.push(`\`\`\`User ${username} cannot request another user as it is not member of the organization.\`\`\``); await octokit.issues.createComment({ diff --git a/tests/__mocks__/handlers.ts b/tests/__mocks__/handlers.ts index 0d31c3c..fe0d6b3 100644 --- a/tests/__mocks__/handlers.ts +++ b/tests/__mocks__/handlers.ts @@ -1,11 +1,13 @@ import { http, HttpResponse } from "msw"; -import { db } from "./db"; /** * Intercepts the routes and returns a custom payload */ export const handlers = [ - http.get("https://api.ubiquity.com/users", () => { - return HttpResponse.json(db.users.getAll()); + http.get("https://api.github.com/users/:user", () => { + return HttpResponse.json(); + }), + http.post("https://api.github.com/repos/:org/:repo/issues/:id/comments", () => { + return HttpResponse.json(); }), ]; diff --git a/tests/main.test.ts b/tests/main.test.ts index cb75f62..adba4bd 100644 --- a/tests/main.test.ts +++ b/tests/main.test.ts @@ -1,4 +1,5 @@ import { afterAll, afterEach, beforeAll, beforeEach, describe, it } from "@jest/globals"; +import { drop } from "@mswjs/data"; import { run } from "../src/run"; import { PluginInputs } from "../src/types/plugin-input"; import { db } from "./__mocks__/db"; @@ -10,24 +11,116 @@ beforeAll(() => server.listen()); afterEach(() => server.resetHandlers()); afterAll(() => server.close()); +jest.mock("@supabase/supabase-js", () => { + return { + createClient: jest.fn(() => { + return { + from: jest.fn((table: string) => { + return { + select: jest.fn(() => { + return { + eq: jest.fn(() => { + return { + single: jest.fn(() => { + if (table === "users") { + return { + data: { + id: 1, + wallets: { + address: "0x0", + }, + }, + }; + } else if (table === "access") { + return { + data: { + id: 1, + multiplier_reason: "Organization member", + }, + }; + } + }), + }; + }), + }; + }), + }; + }), + }; + }), + }; +}); + +const event = "issue_comment.created"; + describe("User tests", () => { beforeEach(() => { + drop(db); for (const item of usersGet) { db.users.create(item); } }); it("Should run the command", async () => { - await run( - { - eventName: "issue_comment.created", - ref: "", - authToken: "", - stateId: "", - settings: { allowPublicQuery: true }, - eventPayload: commentCreatedPayload, - } as PluginInputs, - { SUPABASE_URL: "", SUPABASE_KEY: "", GITHUB_TOKEN: "" } - ); + expect( + async () => + await run( + { + eventName: event, + ref: "", + authToken: "", + stateId: "", + settings: { allowPublicQuery: true }, + eventPayload: commentCreatedPayload, + } as PluginInputs, + { SUPABASE_URL: "", SUPABASE_KEY: "", UBIQUIBOT_TOKEN: "" } + ) + ).not.toThrow(); + }); + + it("Should ignore invalid command", async () => { + expect( + async () => + await run( + { + eventName: event, + ref: "", + authToken: "", + stateId: "", + settings: { allowPublicQuery: true }, + eventPayload: { + ...commentCreatedPayload, + comment: { + ...commentCreatedPayload.comment, + body: "/foobar @ubiquibot", + }, + }, + } as PluginInputs, + { SUPABASE_URL: "", SUPABASE_KEY: "", UBIQUIBOT_TOKEN: "" } + ) + ).not.toThrow(); + }); + + it("Should not throw on invalid arguments", async () => { + expect( + async () => + await run( + { + eventName: event, + ref: "", + authToken: "", + stateId: "", + settings: { allowPublicQuery: true }, + eventPayload: { + ...commentCreatedPayload, + comment: { + ...commentCreatedPayload.comment, + body: "/query ubiquibot", + }, + }, + } as PluginInputs, + { SUPABASE_URL: "", SUPABASE_KEY: "", UBIQUIBOT_TOKEN: "" } + ) + ).not.toThrow(); }); }); From 129aa44fea25c9be67a679c3ec9afe7e97dbb1ba Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 16:05:19 +0900 Subject: [PATCH 21/56] chore: fix cspell --- .cspell.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index 44418a4..2695d09 100644 --- a/.cspell.json +++ b/.cspell.json @@ -4,7 +4,7 @@ "ignorePaths": ["**/*.json", "**/*.css", "node_modules", "**/*.log"], "useGitignore": true, "language": "en", - "words": ["dataurl", "devpool", "outdir", "servedir", "typebox", "supabase", "ubiquibot"], + "words": ["dataurl", "devpool", "outdir", "servedir", "typebox", "supabase", "ubiquibot", "mswjs"], "dictionaries": ["typescript", "node", "software-terms"], "import": ["@cspell/dict-typescript/cspell-ext.json", "@cspell/dict-node/cspell-ext.json", "@cspell/dict-software-terms"], "ignoreRegExpList": ["[0-9a-fA-F]{6}"] From cdf8449b1c475a14cd7492ab8639abfc81ae2223 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 16:10:51 +0900 Subject: [PATCH 22/56] chore: fix knip --- .github/knip.ts | 2 +- package.json | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/knip.ts b/.github/knip.ts index 4c40256..b170948 100644 --- a/.github/knip.ts +++ b/.github/knip.ts @@ -6,7 +6,7 @@ const config: KnipConfig = { ignore: ["src/types/config.ts", "**/__mocks__/**", "**/__fixtures__/**"], ignoreExportsUsedInFile: true, // eslint can also be safely ignored as per the docs: https://knip.dev/guides/handling-issues#eslint--jest - ignoreDependencies: ["eslint-config-prettier", "eslint-plugin-prettier", "@types/jest", "@mswjs/data"], + ignoreDependencies: ["eslint-config-prettier", "eslint-plugin-prettier", "@types/jest"], eslint: true, }; diff --git a/package.json b/package.json index e43ecd0..84eb8cf 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "command-query-user", "version": "1.0.0", "description": "Queries a user and retrieves its related information, such as the wallet, the label access control, or the current XP.", - "main": "build/index.ts", + "main": "src/worker.ts", "author": "Ubiquity DAO", "license": "MIT", "engines": { @@ -27,7 +27,6 @@ "open-source" ], "dependencies": { - "@commander-js/extra-typings": "12.1.0", "@octokit/rest": "20.1.1", "@octokit/webhooks": "13.2.7", "@sinclair/typebox": "0.32.30", @@ -48,7 +47,6 @@ "@typescript-eslint/eslint-plugin": "^7.0.1", "@typescript-eslint/parser": "^7.0.1", "cspell": "^8.4.0", - "esbuild": "^0.20.1", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-filename-rules": "^1.3.1", @@ -62,7 +60,6 @@ "npm-run-all": "^4.1.5", "prettier": "^3.2.5", "ts-jest": "29.1.2", - "tsx": "^4.7.1", "typescript": "^5.3.3", "wrangler": "3.57.0" }, From 7f479655f1a16add5c8097a8c805892d147f4bfa Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 16:15:00 +0900 Subject: [PATCH 23/56] chore: improved docs --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 86ffb81..89d80d8 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,16 @@ The following commands are allowed: /query @user ``` +## Configuration +A valid configuration can be like: + +```yaml +- plugin: https://ubiquibot-command-query-user.ubq.fi + type: github + with: + allowPublicQuery: true +``` + ## Testing ### Cypress From 302ef17dd9aafb05fef2d64cd7923a9cf434cc04 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 16:15:41 +0900 Subject: [PATCH 24/56] chore: improved docs --- README.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/README.md b/README.md index 89d80d8..3d76173 100644 --- a/README.md +++ b/README.md @@ -21,21 +21,6 @@ A valid configuration can be like: ``` ## Testing - -### Cypress - -To test with Cypress Studio UI, run - -```shell -yarn cy:open -``` - -Otherwise to simply run the tests through the console, run - -```shell -yarn cy:run -``` - ### Jest To start Jest tests, run From ceb9a68f5ea8fda6a9965cdfe5e1388c5df5b60f Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 22 May 2024 16:25:28 +0900 Subject: [PATCH 25/56] chore: changed logger and rest repo target --- src/handlers/command-parser.ts | 4 +- src/handlers/query-user.ts | 2 +- src/run.ts | 3 +- tests/__mocks__/payloads/comment-created.json | 236 +++++++++--------- 4 files changed, 122 insertions(+), 123 deletions(-) diff --git a/src/handlers/command-parser.ts b/src/handlers/command-parser.ts index 65f71a8..d3fbd31 100644 --- a/src/handlers/command-parser.ts +++ b/src/handlers/command-parser.ts @@ -20,10 +20,10 @@ export class CommandParser { // Overrides to make sure we do not use TTY outputs as they are not available outside Node.js env program.configureOutput({ writeOut(str: string) { - console.log(str); + context.logger.info(str); }, writeErr(str: string) { - console.error(str); + context.logger.error(str); }, getErrHelpWidth(): number { return 0; diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index c46641d..f5d20f9 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -57,6 +57,6 @@ User information for ${username} was not found. issue_number: payload.issue.number, }); } catch (e) { - console.error("Could not query user.", e); + context.logger.error("Could not query user.", e); } } diff --git a/src/run.ts b/src/run.ts index d163c22..d30f531 100644 --- a/src/run.ts +++ b/src/run.ts @@ -44,10 +44,9 @@ export async function run(inputs: PluginInputs, env: Env) { try { await commandParser.parse(args); } catch (e) { - console.log("error", e); + context.logger.error("error", e); if (e instanceof CommanderError) { if (e.code !== "commander.unknownCommand") { - console.error(e); await octokit.issues.createComment({ body: `\`\`\` Failed to run command-query-user. diff --git a/tests/__mocks__/payloads/comment-created.json b/tests/__mocks__/payloads/comment-created.json index 5e95054..3881338 100644 --- a/tests/__mocks__/payloads/comment-created.json +++ b/tests/__mocks__/payloads/comment-created.json @@ -1,33 +1,33 @@ { "action": "created", "issue": { - "url": "https://api.github.com/repos/Meniole/bot/issues/5", - "repository_url": "https://api.github.com/repos/Meniole/bot", - "labels_url": "https://api.github.com/repos/Meniole/bot/issues/5/labels{/name}", - "comments_url": "https://api.github.com/repos/Meniole/bot/issues/5/comments", - "events_url": "https://api.github.com/repos/Meniole/bot/issues/5/events", - "html_url": "https://github.com/Meniole/bot/issues/5", + "url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/5", + "repository_url": "https://api.github.com/repos/ubiquibot/comment-query-user", + "labels_url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/5/labels{/name}", + "comments_url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/5/comments", + "events_url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/5/events", + "html_url": "https://github.com/ubiquibot/comment-query-user/issues/5", "id": 2297627819, "node_id": "I_kwDOLy-Pv86I8wSr", "number": 5, "title": "New issue", "user": { - "login": "gentlementlegen", - "id": 9807008, + "login": "ubiquibot", + "id": 1, "node_id": "MDQ6VXNlcjk4MDcwMDg=", - "avatar_url": "https://avatars.githubusercontent.com/u/9807008?v=4", + "avatar_url": "https://avatars.githubusercontent.com/u/1?v=4", "gravatar_id": "", - "url": "https://api.github.com/users/gentlementlegen", - "html_url": "https://github.com/gentlementlegen", - "followers_url": "https://api.github.com/users/gentlementlegen/followers", - "following_url": "https://api.github.com/users/gentlementlegen/following{/other_user}", - "gists_url": "https://api.github.com/users/gentlementlegen/gists{/gist_id}", - "starred_url": "https://api.github.com/users/gentlementlegen/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/gentlementlegen/subscriptions", - "organizations_url": "https://api.github.com/users/gentlementlegen/orgs", - "repos_url": "https://api.github.com/users/gentlementlegen/repos", - "events_url": "https://api.github.com/users/gentlementlegen/events{/privacy}", - "received_events_url": "https://api.github.com/users/gentlementlegen/received_events", + "url": "https://api.github.com/users/ubiquibot", + "html_url": "https://github.com/ubiquibot", + "followers_url": "https://api.github.com/users/ubiquibot/followers", + "following_url": "https://api.github.com/users/ubiquibot/following{/other_user}", + "gists_url": "https://api.github.com/users/ubiquibot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ubiquibot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ubiquibot/subscriptions", + "organizations_url": "https://api.github.com/users/ubiquibot/orgs", + "repos_url": "https://api.github.com/users/ubiquibot/repos", + "events_url": "https://api.github.com/users/ubiquibot/events{/privacy}", + "received_events_url": "https://api.github.com/users/ubiquibot/received_events", "type": "User", "site_admin": false }, @@ -45,7 +45,7 @@ "active_lock_reason": null, "body": "Another issue.", "reactions": { - "url": "https://api.github.com/repos/Meniole/bot/issues/5/reactions", + "url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/5/reactions", "total_count": 0, "+1": 0, "-1": 0, @@ -56,42 +56,42 @@ "rocket": 0, "eyes": 0 }, - "timeline_url": "https://api.github.com/repos/Meniole/bot/issues/5/timeline", + "timeline_url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/5/timeline", "performed_via_github_app": null, "state_reason": null }, "comment": { - "url": "https://api.github.com/repos/Meniole/bot/issues/comments/2119208855", - "html_url": "https://github.com/Meniole/bot/issues/5#issuecomment-2119208855", - "issue_url": "https://api.github.com/repos/Meniole/bot/issues/5", + "url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/comments/2119208855", + "html_url": "https://github.com/ubiquibot/comment-query-user/issues/5#issuecomment-2119208855", + "issue_url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/5", "id": 2119208855, "node_id": "IC_kwDOLy-Pv85-UI-X", "user": { - "login": "gentlementlegen", - "id": 9807008, + "login": "ubiquibot", + "id": 1, "node_id": "MDQ6VXNlcjk4MDcwMDg=", - "avatar_url": "https://avatars.githubusercontent.com/u/9807008?v=4", + "avatar_url": "https://avatars.githubusercontent.com/u/1?v=4", "gravatar_id": "", - "url": "https://api.github.com/users/gentlementlegen", - "html_url": "https://github.com/gentlementlegen", - "followers_url": "https://api.github.com/users/gentlementlegen/followers", - "following_url": "https://api.github.com/users/gentlementlegen/following{/other_user}", - "gists_url": "https://api.github.com/users/gentlementlegen/gists{/gist_id}", - "starred_url": "https://api.github.com/users/gentlementlegen/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/gentlementlegen/subscriptions", - "organizations_url": "https://api.github.com/users/gentlementlegen/orgs", - "repos_url": "https://api.github.com/users/gentlementlegen/repos", - "events_url": "https://api.github.com/users/gentlementlegen/events{/privacy}", - "received_events_url": "https://api.github.com/users/gentlementlegen/received_events", + "url": "https://api.github.com/users/ubiquibot", + "html_url": "https://github.com/ubiquibot", + "followers_url": "https://api.github.com/users/ubiquibot/followers", + "following_url": "https://api.github.com/users/ubiquibot/following{/other_user}", + "gists_url": "https://api.github.com/users/ubiquibot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ubiquibot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ubiquibot/subscriptions", + "organizations_url": "https://api.github.com/users/ubiquibot/orgs", + "repos_url": "https://api.github.com/users/ubiquibot/repos", + "events_url": "https://api.github.com/users/ubiquibot/events{/privacy}", + "received_events_url": "https://api.github.com/users/ubiquibot/received_events", "type": "User", "site_admin": false }, "created_at": "2024-05-19T11:54:23Z", "updated_at": "2024-05-19T11:54:23Z", "author_association": "CONTRIBUTOR", - "body": "/query @gentlementlegen", + "body": "/query @ubiquibot", "reactions": { - "url": "https://api.github.com/repos/Meniole/bot/issues/comments/2119208855/reactions", + "url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/comments/2119208855/reactions", "total_count": 0, "+1": 0, "-1": 0, @@ -108,75 +108,75 @@ "id": 791646143, "node_id": "R_kgDOLy-Pvw", "name": "bot", - "full_name": "Meniole/bot", + "full_name": "ubiquibot/comment-query-user", "private": false, "owner": { - "login": "Meniole", + "login": "ubiquibot", "id": 159901852, "node_id": "O_kgDOCYfonA", "avatar_url": "https://avatars.githubusercontent.com/u/159901852?v=4", "gravatar_id": "", - "url": "https://api.github.com/users/Meniole", - "html_url": "https://github.com/Meniole", - "followers_url": "https://api.github.com/users/Meniole/followers", - "following_url": "https://api.github.com/users/Meniole/following{/other_user}", - "gists_url": "https://api.github.com/users/Meniole/gists{/gist_id}", - "starred_url": "https://api.github.com/users/Meniole/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/Meniole/subscriptions", - "organizations_url": "https://api.github.com/users/Meniole/orgs", - "repos_url": "https://api.github.com/users/Meniole/repos", - "events_url": "https://api.github.com/users/Meniole/events{/privacy}", - "received_events_url": "https://api.github.com/users/Meniole/received_events", + "url": "https://api.github.com/users/ubiquibot", + "html_url": "https://github.com/ubiquibot", + "followers_url": "https://api.github.com/users/ubiquibot/followers", + "following_url": "https://api.github.com/users/ubiquibot/following{/other_user}", + "gists_url": "https://api.github.com/users/ubiquibot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ubiquibot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ubiquibot/subscriptions", + "organizations_url": "https://api.github.com/users/ubiquibot/orgs", + "repos_url": "https://api.github.com/users/ubiquibot/repos", + "events_url": "https://api.github.com/users/ubiquibot/events{/privacy}", + "received_events_url": "https://api.github.com/users/ubiquibot/received_events", "type": "Organization", "site_admin": false }, - "html_url": "https://github.com/Meniole/bot", + "html_url": "https://github.com/ubiquibot/comment-query-user", "description": null, "fork": false, - "url": "https://api.github.com/repos/Meniole/bot", - "forks_url": "https://api.github.com/repos/Meniole/bot/forks", - "keys_url": "https://api.github.com/repos/Meniole/bot/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/Meniole/bot/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/Meniole/bot/teams", - "hooks_url": "https://api.github.com/repos/Meniole/bot/hooks", - "issue_events_url": "https://api.github.com/repos/Meniole/bot/issues/events{/number}", - "events_url": "https://api.github.com/repos/Meniole/bot/events", - "assignees_url": "https://api.github.com/repos/Meniole/bot/assignees{/user}", - "branches_url": "https://api.github.com/repos/Meniole/bot/branches{/branch}", - "tags_url": "https://api.github.com/repos/Meniole/bot/tags", - "blobs_url": "https://api.github.com/repos/Meniole/bot/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/Meniole/bot/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/Meniole/bot/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/Meniole/bot/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/Meniole/bot/statuses/{sha}", - "languages_url": "https://api.github.com/repos/Meniole/bot/languages", - "stargazers_url": "https://api.github.com/repos/Meniole/bot/stargazers", - "contributors_url": "https://api.github.com/repos/Meniole/bot/contributors", - "subscribers_url": "https://api.github.com/repos/Meniole/bot/subscribers", - "subscription_url": "https://api.github.com/repos/Meniole/bot/subscription", - "commits_url": "https://api.github.com/repos/Meniole/bot/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/Meniole/bot/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/Meniole/bot/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/Meniole/bot/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/Meniole/bot/contents/{+path}", - "compare_url": "https://api.github.com/repos/Meniole/bot/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/Meniole/bot/merges", - "archive_url": "https://api.github.com/repos/Meniole/bot/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/Meniole/bot/downloads", - "issues_url": "https://api.github.com/repos/Meniole/bot/issues{/number}", - "pulls_url": "https://api.github.com/repos/Meniole/bot/pulls{/number}", - "milestones_url": "https://api.github.com/repos/Meniole/bot/milestones{/number}", - "notifications_url": "https://api.github.com/repos/Meniole/bot/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/Meniole/bot/labels{/name}", - "releases_url": "https://api.github.com/repos/Meniole/bot/releases{/id}", - "deployments_url": "https://api.github.com/repos/Meniole/bot/deployments", + "url": "https://api.github.com/repos/ubiquibot/comment-query-user", + "forks_url": "https://api.github.com/repos/ubiquibot/comment-query-user/forks", + "keys_url": "https://api.github.com/repos/ubiquibot/comment-query-user/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/ubiquibot/comment-query-user/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/ubiquibot/comment-query-user/teams", + "hooks_url": "https://api.github.com/repos/ubiquibot/comment-query-user/hooks", + "issue_events_url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/events{/number}", + "events_url": "https://api.github.com/repos/ubiquibot/comment-query-user/events", + "assignees_url": "https://api.github.com/repos/ubiquibot/comment-query-user/assignees{/user}", + "branches_url": "https://api.github.com/repos/ubiquibot/comment-query-user/branches{/branch}", + "tags_url": "https://api.github.com/repos/ubiquibot/comment-query-user/tags", + "blobs_url": "https://api.github.com/repos/ubiquibot/comment-query-user/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/ubiquibot/comment-query-user/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/ubiquibot/comment-query-user/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/ubiquibot/comment-query-user/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/ubiquibot/comment-query-user/statuses/{sha}", + "languages_url": "https://api.github.com/repos/ubiquibot/comment-query-user/languages", + "stargazers_url": "https://api.github.com/repos/ubiquibot/comment-query-user/stargazers", + "contributors_url": "https://api.github.com/repos/ubiquibot/comment-query-user/contributors", + "subscribers_url": "https://api.github.com/repos/ubiquibot/comment-query-user/subscribers", + "subscription_url": "https://api.github.com/repos/ubiquibot/comment-query-user/subscription", + "commits_url": "https://api.github.com/repos/ubiquibot/comment-query-user/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/ubiquibot/comment-query-user/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/ubiquibot/comment-query-user/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/ubiquibot/comment-query-user/contents/{+path}", + "compare_url": "https://api.github.com/repos/ubiquibot/comment-query-user/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/ubiquibot/comment-query-user/merges", + "archive_url": "https://api.github.com/repos/ubiquibot/comment-query-user/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/ubiquibot/comment-query-user/downloads", + "issues_url": "https://api.github.com/repos/ubiquibot/comment-query-user/issues{/number}", + "pulls_url": "https://api.github.com/repos/ubiquibot/comment-query-user/pulls{/number}", + "milestones_url": "https://api.github.com/repos/ubiquibot/comment-query-user/milestones{/number}", + "notifications_url": "https://api.github.com/repos/ubiquibot/comment-query-user/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/ubiquibot/comment-query-user/labels{/name}", + "releases_url": "https://api.github.com/repos/ubiquibot/comment-query-user/releases{/id}", + "deployments_url": "https://api.github.com/repos/ubiquibot/comment-query-user/deployments", "created_at": "2024-04-25T05:19:30Z", "updated_at": "2024-05-19T09:47:02Z", "pushed_at": "2024-05-19T09:46:59Z", - "git_url": "git://github.com/Meniole/bot.git", - "ssh_url": "git@github.com:Meniole/bot.git", - "clone_url": "https://github.com/Meniole/bot.git", - "svn_url": "https://github.com/Meniole/bot", + "git_url": "git://github.com/ubiquibot/comment-query-user.git", + "ssh_url": "git@github.com:ubiquibot/comment-query-user.git", + "clone_url": "https://github.com/ubiquibot/comment-query-user.git", + "svn_url": "https://github.com/ubiquibot/comment-query-user", "homepage": null, "size": 56, "stargazers_count": 0, @@ -206,36 +206,36 @@ "custom_properties": {} }, "organization": { - "login": "Meniole", + "login": "ubiquibot", "id": 159901852, "node_id": "O_kgDOCYfonA", - "url": "https://api.github.com/orgs/Meniole", - "repos_url": "https://api.github.com/orgs/Meniole/repos", - "events_url": "https://api.github.com/orgs/Meniole/events", - "hooks_url": "https://api.github.com/orgs/Meniole/hooks", - "issues_url": "https://api.github.com/orgs/Meniole/issues", - "members_url": "https://api.github.com/orgs/Meniole/members{/member}", - "public_members_url": "https://api.github.com/orgs/Meniole/public_members{/member}", + "url": "https://api.github.com/orgs/ubiquibot", + "repos_url": "https://api.github.com/orgs/ubiquibot/repos", + "events_url": "https://api.github.com/orgs/ubiquibot/events", + "hooks_url": "https://api.github.com/orgs/ubiquibot/hooks", + "issues_url": "https://api.github.com/orgs/ubiquibot/issues", + "members_url": "https://api.github.com/orgs/ubiquibot/members{/member}", + "public_members_url": "https://api.github.com/orgs/ubiquibot/public_members{/member}", "avatar_url": "https://avatars.githubusercontent.com/u/159901852?v=4", "description": null }, "sender": { - "login": "gentlementlegen", - "id": 9807008, + "login": "ubiquibot", + "id": 1, "node_id": "MDQ6VXNlcjk4MDcwMDg=", - "avatar_url": "https://avatars.githubusercontent.com/u/9807008?v=4", + "avatar_url": "https://avatars.githubusercontent.com/u/1?v=4", "gravatar_id": "", - "url": "https://api.github.com/users/gentlementlegen", - "html_url": "https://github.com/gentlementlegen", - "followers_url": "https://api.github.com/users/gentlementlegen/followers", - "following_url": "https://api.github.com/users/gentlementlegen/following{/other_user}", - "gists_url": "https://api.github.com/users/gentlementlegen/gists{/gist_id}", - "starred_url": "https://api.github.com/users/gentlementlegen/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/gentlementlegen/subscriptions", - "organizations_url": "https://api.github.com/users/gentlementlegen/orgs", - "repos_url": "https://api.github.com/users/gentlementlegen/repos", - "events_url": "https://api.github.com/users/gentlementlegen/events{/privacy}", - "received_events_url": "https://api.github.com/users/gentlementlegen/received_events", + "url": "https://api.github.com/users/ubiquibot", + "html_url": "https://github.com/ubiquibot", + "followers_url": "https://api.github.com/users/ubiquibot/followers", + "following_url": "https://api.github.com/users/ubiquibot/following{/other_user}", + "gists_url": "https://api.github.com/users/ubiquibot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ubiquibot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ubiquibot/subscriptions", + "organizations_url": "https://api.github.com/users/ubiquibot/orgs", + "repos_url": "https://api.github.com/users/ubiquibot/repos", + "events_url": "https://api.github.com/users/ubiquibot/events{/privacy}", + "received_events_url": "https://api.github.com/users/ubiquibot/received_events", "type": "User", "site_admin": false }, From de36110b49c03710765f099b2be1e5e20e90d295 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Thu, 23 May 2024 13:42:12 +0900 Subject: [PATCH 26/56] chore: only POST method are now valid --- src/worker.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/worker.ts b/src/worker.ts index 6b2c22b..1668258 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -9,6 +9,12 @@ config(); export default { async fetch(request: Request, env: Env): Promise { try { + if (request.method !== "POST") { + return new Response(JSON.stringify({ error: `Error: only POST requests are supported.` }), { + status: 405, + headers: { "content-type": "application/json", Allow: "POST" }, + }); + } const contentType = request.headers.get("content-type"); if (contentType !== "application/json") { return new Response(JSON.stringify({ error: `Error: ${contentType} is not a valid content type` }), { From 50769c4b1fdd441a27236b5fdb45f4787b59704b Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 24 May 2024 19:30:06 +0900 Subject: [PATCH 27/56] chore: added POST request example and docs --- .gitignore | 1 + README.md | 21 +++++++++++++++++++++ src/worker.ts | 2 +- tests/http/request.http | 18 ++++++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/http/request.http diff --git a/.gitignore b/.gitignore index 2e0cdd6..2c31e37 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ coverage junit.xml cypress/screenshots .dev.vars +/tests/http/http-client.private.env.json diff --git a/README.md b/README.md index 86ffb81..1e90a1e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,27 @@ The following commands are allowed: /query @user ``` +## Running locally +### Worker +Start the Worker by running +```shell +yarn dev +``` + +### Make requests +To trigger the worker, `POST` requests should be made to http://localhost:4000 with a `Content-Type: application/json` +header and a body looking like +```json +{ + "stateId": "", + "eventName": "", + "eventPayload": "", + "settings": "", + "ref": "" +} +``` +For convenience, you can find an `.http` file with a valid request [here](/tests/http/request.http). + ## Testing ### Cypress diff --git a/src/worker.ts b/src/worker.ts index 1668258..da55528 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -10,7 +10,7 @@ export default { async fetch(request: Request, env: Env): Promise { try { if (request.method !== "POST") { - return new Response(JSON.stringify({ error: `Error: only POST requests are supported.` }), { + return new Response(JSON.stringify({ error: `Only POST requests are supported.` }), { status: 405, headers: { "content-type": "application/json", Allow: "POST" }, }); diff --git a/tests/http/request.http b/tests/http/request.http new file mode 100644 index 0000000..0f5665c --- /dev/null +++ b/tests/http/request.http @@ -0,0 +1,18 @@ +### POST a successful request to the Worker +# Variables as follows: +# org_name: the organization you want to post to, e.g. "ubiquibot" +# repo_name: the target repository, e.g "command-query-user" +# issue_number: the number of the issue, same as the one you would see in the url to that issue, e.g. "1" +# command: the command you want to test, e.g. "/query @ubiquibot" +# token: a valid GitHub token for auth, e.g. "ghs_xxxxx" +POST http://localhost:4000/ +Content-Type: application/json + +{ + "stateId": "", + "eventName": "issue_comment.created", + "eventPayload": "{\"action\":\"created\",\"issue\":{\"url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/{{issue_number}}\",\"repository_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}\",\"labels_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/{{issue_number}}/labels{/name}\",\"comments_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/{{issue_number}}/comments\",\"events_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/{{issue_number}}/events\",\"html_url\":\"https://github.com/{{org_name}}/{{repo_name}}/issues/{{issue_number}}\",\"id\":2297627819,\"node_id\":\"I_kwDOLy-Pv86I8wSr\",\"number\":5,\"title\":\"New issue\",\"user\":{\"login\":\"ubiquibot\",\"id\":1,\"node_id\":\"MDQ6VXNlcjk4MDcwMDg=\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/1?v=4\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/ubiquibot\",\"html_url\":\"https://github.com/ubiquibot\",\"followers_url\":\"https://api.github.com/users/ubiquibot/followers\",\"following_url\":\"https://api.github.com/users/ubiquibot/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/ubiquibot/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/ubiquibot/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/ubiquibot/subscriptions\",\"organizations_url\":\"https://api.github.com/users/ubiquibot/orgs\",\"repos_url\":\"https://api.github.com/users/ubiquibot/repos\",\"events_url\":\"https://api.github.com/users/ubiquibot/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/ubiquibot/received_events\",\"type\":\"User\",\"site_admin\":false},\"labels\":[],\"state\":\"open\",\"locked\":false,\"assignee\":null,\"assignees\":[],\"milestone\":null,\"comments\":34,\"created_at\":\"2024-05-15T11:22:48Z\",\"updated_at\":\"2024-05-19T11:54:24Z\",\"closed_at\":null,\"author_association\":\"CONTRIBUTOR\",\"active_lock_reason\":null,\"body\":\"Another issue.\",\"reactions\":{\"url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/{{issue_number}}/reactions\",\"total_count\":0,\"+1\":0,\"-1\":0,\"laugh\":0,\"hooray\":0,\"confused\":0,\"heart\":0,\"rocket\":0,\"eyes\":0},\"timeline_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/{{issue_number}}/timeline\",\"performed_via_github_app\":null,\"state_reason\":null},\"comment\":{\"url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/comments/1\",\"html_url\":\"https://github.com/{{org_name}}/{{repo_name}}/issues/{{issue_number}}#issuecomment-1\",\"issue_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/{{issue_number}}\",\"id\":1,\"node_id\":\"IC_kwDOLy-Pv85-UI-X\",\"user\":{\"login\":\"ubiquibot\",\"id\":1,\"node_id\":\"MDQ6VXNlcjk4MDcwMDg=\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/1?v=4\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/ubiquibot\",\"html_url\":\"https://github.com/ubiquibot\",\"followers_url\":\"https://api.github.com/users/ubiquibot/followers\",\"following_url\":\"https://api.github.com/users/ubiquibot/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/ubiquibot/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/ubiquibot/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/ubiquibot/subscriptions\",\"organizations_url\":\"https://api.github.com/users/ubiquibot/orgs\",\"repos_url\":\"https://api.github.com/users/ubiquibot/repos\",\"events_url\":\"https://api.github.com/users/ubiquibot/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/ubiquibot/received_events\",\"type\":\"User\",\"site_admin\":false},\"created_at\":\"2024-05-19T11:54:23Z\",\"updated_at\":\"2024-05-19T11:54:23Z\",\"author_association\":\"CONTRIBUTOR\",\"body\":\"{{command}}\",\"reactions\":{\"url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/comments/1/reactions\",\"total_count\":0,\"+1\":0,\"-1\":0,\"laugh\":0,\"hooray\":0,\"confused\":0,\"heart\":0,\"rocket\":0,\"eyes\":0},\"performed_via_github_app\":null},\"repository\":{\"id\":1,\"node_id\":\"R_kgDOLy-Pvw\",\"name\":\"{{repo_name}}\",\"full_name\":\"{{org_name}}/{{repo_name}}\",\"private\":false,\"owner\":{\"login\":\"{{org_name}}\",\"id\":1,\"node_id\":\"O_kgDOCYfonA\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/1?v=4\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/{{org_name}}\",\"html_url\":\"https://github.com/{{org_name}}\",\"followers_url\":\"https://api.github.com/users/{{org_name}}/followers\",\"following_url\":\"https://api.github.com/users/{{org_name}}/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/{{org_name}}/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/{{org_name}}/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/{{org_name}}/subscriptions\",\"organizations_url\":\"https://api.github.com/users/{{org_name}}/orgs\",\"repos_url\":\"https://api.github.com/users/{{org_name}}/repos\",\"events_url\":\"https://api.github.com/users/{{org_name}}/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/{{org_name}}/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"html_url\":\"https://github.com/{{org_name}}/{{repo_name}}\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}\",\"forks_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/forks\",\"keys_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/teams\",\"hooks_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/hooks\",\"issue_events_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/events\",\"assignees_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/tags\",\"blobs_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/languages\",\"stargazers_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/stargazers\",\"contributors_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/contributors\",\"subscribers_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/subscribers\",\"subscription_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/subscription\",\"commits_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/merges\",\"archive_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/downloads\",\"issues_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/{{org_name}}/{{repo_name}}/deployments\",\"created_at\":\"2024-04-25T05:19:30Z\",\"updated_at\":\"2024-05-19T09:47:02Z\",\"pushed_at\":\"2024-05-19T09:46:59Z\",\"git_url\":\"git://github.com/{{org_name}}/{{repo_name}}.git\",\"ssh_url\":\"git@github.com:{{org_name}}/{{repo_name}}.git\",\"clone_url\":\"https://github.com/{{org_name}}/{{repo_name}}.git\",\"svn_url\":\"https://github.com/{{org_name}}/{{repo_name}}\",\"homepage\":null,\"size\":56,\"stargazers_count\":0,\"watchers_count\":0,\"language\":null,\"has_issues\":true,\"has_projects\":true,\"has_downloads\":true,\"has_wiki\":false,\"has_pages\":false,\"has_discussions\":false,\"forks_count\":0,\"mirror_url\":null,\"archived\":false,\"disabled\":false,\"open_issues_count\":1,\"license\":null,\"allow_forking\":true,\"is_template\":false,\"web_commit_signoff_required\":false,\"topics\":[],\"visibility\":\"public\",\"forks\":0,\"open_issues\":1,\"watchers\":0,\"default_branch\":\"main\",\"custom_properties\":{}},\"organization\":{\"login\":\"{{org_name}}\",\"id\":1,\"node_id\":\"O_kgDOCYfonA\",\"url\":\"https://api.github.com/orgs/{{org_name}}\",\"repos_url\":\"https://api.github.com/orgs/{{org_name}}/repos\",\"events_url\":\"https://api.github.com/orgs/{{org_name}}/events\",\"hooks_url\":\"https://api.github.com/orgs/{{org_name}}/hooks\",\"issues_url\":\"https://api.github.com/orgs/{{org_name}}/issues\",\"members_url\":\"https://api.github.com/orgs/{{org_name}}/members{/member}\",\"public_members_url\":\"https://api.github.com/orgs/{{org_name}}/public_members{/member}\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/1?v=4\",\"description\":null},\"sender\":{\"login\":\"ubiquibot\",\"id\":1,\"node_id\":\"MDQ6VXNlcjk4MDcwMDg=\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/1?v=4\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/ubiquibot\",\"html_url\":\"https://github.com/ubiquibot\",\"followers_url\":\"https://api.github.com/users/ubiquibot/followers\",\"following_url\":\"https://api.github.com/users/ubiquibot/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/ubiquibot/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/ubiquibot/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/ubiquibot/subscriptions\",\"organizations_url\":\"https://api.github.com/users/ubiquibot/orgs\",\"repos_url\":\"https://api.github.com/users/ubiquibot/repos\",\"events_url\":\"https://api.github.com/users/ubiquibot/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/ubiquibot/received_events\",\"type\":\"User\",\"site_admin\":false},\"installation\":{\"id\":1,\"node_id\":\"MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uNDgzODE5NzI=\"}}", + "settings": "{\"testing\":true}", + "ref": "", + "authToken": "{{token}}" +} From 062d04ef68e84ec1dbf71f1d906712f9272676e9 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 03:11:44 +0900 Subject: [PATCH 28/56] chore: error is posted to the issue if fatal --- src/adapters/index.ts | 2 +- src/handlers/query-user.ts | 2 +- src/run.ts | 10 +++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/adapters/index.ts b/src/adapters/index.ts index c3f7e1f..634f8a1 100644 --- a/src/adapters/index.ts +++ b/src/adapters/index.ts @@ -8,7 +8,7 @@ export function createAdapters(supabaseClient: SupabaseClient, context: Context) async getAccess(userId: number) { const { data, error } = await supabaseClient.from("access").select("*, users(*)").eq("users.id", userId).single(); if (error) { - context.logger.error(error.message, error); + context.logger.error("Failed to get access for user", error); return null; } return data; diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index f5d20f9..0fd5bbd 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -57,6 +57,6 @@ User information for ${username} was not found. issue_number: payload.issue.number, }); } catch (e) { - context.logger.error("Could not query user.", e); + context.logger.fatal("Could not query user.", e); } } diff --git a/src/run.ts b/src/run.ts index d30f531..494b3a9 100644 --- a/src/run.ts +++ b/src/run.ts @@ -34,7 +34,15 @@ export async function run(inputs: PluginInputs, env: Env) { console.error(message, ...optionalParams); }, fatal(message: unknown, ...optionalParams: unknown[]) { - console.error(message, ...optionalParams); + octokit.issues + .createComment({ + body: `command-query-user failed to run.\n\n${message}`, + owner: inputs.eventPayload.repository.owner.login, + repo: inputs.eventPayload.repository.name, + issue_number: inputs.eventPayload.issue.number, + }) + .catch(() => console.error(message, ...optionalParams)) + .finally(() => console.error(message, ...optionalParams)); }, }, adapters: {}, From 5238feacd236477550da3ba7a509abc9d4873c22 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 03:18:32 +0900 Subject: [PATCH 29/56] chore: remove type from README.md --- README.md | 1 - src/handlers/query-user.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 7ff5377..aaef118 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,6 @@ A valid configuration can be like: ```yaml - plugin: https://ubiquibot-command-query-user.ubq.fi - type: github with: allowPublicQuery: true ``` diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 0fd5bbd..97eb039 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -47,7 +47,7 @@ User information for ${username} was not found. body.push(`| Wallet | ${wallet.address} |`); } if (access) { - body.push(`| Access | ${access.multiplier_reason} |`); + body.push(`| Access | \`\`\`${JSON.stringify({ ...access.multiplier_reason, ...access.labels }, null, 2)}\`\`\` |`); } } await octokit.issues.createComment({ From a40e83a4305cbba0f823dcddecbde45c18d414b0 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 04:21:04 +0900 Subject: [PATCH 30/56] chore: added Supabase types --- .gitignore | 1 + README.md | 10 + package.json | 7 +- src/run.ts | 3 +- supabase/.gitignore | 4 + supabase/config.toml | 159 ++++++++++++++ supabase/seed.sql | 0 yarn.lock | 484 +++++++++++++++---------------------------- 8 files changed, 347 insertions(+), 321 deletions(-) create mode 100644 supabase/.gitignore create mode 100644 supabase/config.toml create mode 100644 supabase/seed.sql diff --git a/.gitignore b/.gitignore index 2c31e37..b001fe6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ junit.xml cypress/screenshots .dev.vars /tests/http/http-client.private.env.json +src/types/database.ts diff --git a/README.md b/README.md index aaef118..4a9f8f7 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,16 @@ The following commands are allowed: ``` ## Running locally +### Supabase types +You can run the type generations against a local database with +```shell +yarn supabase:generate:local +``` +Or against an instance by setting the `SUPABASE_ACCESS_TOKEN` and `SUPABASE_PROJECT_ID` in your `.env` file +```shell +yarn prebuild +``` + ### Worker Start the Worker by running ```shell diff --git a/package.json b/package.json index 84eb8cf..f0f9d1c 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "node": ">=20.10.0" }, "scripts": { + "prebuild": "dotenv -- cross-env yarn supabase:generate:remote", "dev": "wrangler dev --env dev --port 4000", "format": "run-s format:lint format:prettier format:cspell", "format:lint": "eslint --fix .", @@ -17,7 +18,8 @@ "knip": "knip --config .github/knip.ts", "knip-ci": "knip --no-exit-code --reporter json --config .github/knip.ts", "prepare": "husky install", - "test": "jest --setupFiles dotenv/config --coverage" + "supabase:generate:local": "supabase gen types typescript --local > src/types/database.ts", + "supabase:generate:remote": "cross-env-shell \"supabase gen types typescript --project-id $SUPABASE_PROJECT_ID --schema public > src/types/database.ts\"" }, "keywords": [ "typescript", @@ -46,7 +48,9 @@ "@types/node": "^20.11.19", "@typescript-eslint/eslint-plugin": "^7.0.1", "@typescript-eslint/parser": "^7.0.1", + "cross-env": "7.0.3", "cspell": "^8.4.0", + "dotenv-cli": "7.4.2", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-filename-rules": "^1.3.1", @@ -59,6 +63,7 @@ "lint-staged": "^15.2.2", "npm-run-all": "^4.1.5", "prettier": "^3.2.5", + "supabase": "1.167.4", "ts-jest": "29.1.2", "typescript": "^5.3.3", "wrangler": "3.57.0" diff --git a/src/run.ts b/src/run.ts index 494b3a9..8b5073f 100644 --- a/src/run.ts +++ b/src/run.ts @@ -4,6 +4,7 @@ import { Octokit } from "@octokit/rest"; import { createAdapters } from "./adapters"; import { CommandParser } from "./handlers/command-parser"; import { Context } from "./types/context"; +import { Database } from "./types/database"; import { Env } from "./types/env"; import { PluginInputs } from "./types/plugin-input"; @@ -14,7 +15,7 @@ export async function run(inputs: PluginInputs, env: Env) { } const args = inputs.eventPayload.comment.body.trim().split(/\s+/); const octokit = new Octokit({ auth: env.UBIQUIBOT_TOKEN }); - const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY); + const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY); const context = { eventName: inputs.eventName, payload: inputs.eventPayload, diff --git a/supabase/.gitignore b/supabase/.gitignore new file mode 100644 index 0000000..a3ad880 --- /dev/null +++ b/supabase/.gitignore @@ -0,0 +1,4 @@ +# Supabase +.branches +.temp +.env diff --git a/supabase/config.toml b/supabase/config.toml new file mode 100644 index 0000000..30616fb --- /dev/null +++ b/supabase/config.toml @@ -0,0 +1,159 @@ +# A string used to distinguish different Supabase projects on the same host. Defaults to the +# working directory name when running `supabase init`. +project_id = "command-query-user" + +[api] +enabled = true +# Port to use for the API URL. +port = 54321 +# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API +# endpoints. public and storage are always included. +schemas = ["public", "graphql_public"] +# Extra schemas to add to the search_path of every request. public is always included. +extra_search_path = ["public", "extensions"] +# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size +# for accidental or malicious requests. +max_rows = 1000 + +[db] +# Port to use for the local database URL. +port = 54322 +# Port used by db diff command to initialize the shadow database. +shadow_port = 54320 +# The database major version to use. This has to be the same as your remote database's. Run `SHOW +# server_version;` on the remote database to check. +major_version = 15 + +[db.pooler] +enabled = false +# Port to use for the local connection pooler. +port = 54329 +# Specifies when a server connection can be reused by other clients. +# Configure one of the supported pooler modes: `transaction`, `session`. +pool_mode = "transaction" +# How many server connections to allow per user/database pair. +default_pool_size = 20 +# Maximum number of client connections allowed. +max_client_conn = 100 + +[realtime] +enabled = true +# Bind realtime via either IPv4 or IPv6. (default: IPv6) +# ip_version = "IPv6" +# The maximum length in bytes of HTTP request headers. (default: 4096) +# max_header_length = 4096 + +[studio] +enabled = true +# Port to use for Supabase Studio. +port = 54323 +# External URL of the API server that frontend connects to. +api_url = "http://127.0.0.1" + +# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they +# are monitored, and you can view the emails that would have been sent from the web interface. +[inbucket] +enabled = true +# Port to use for the email testing server web interface. +port = 54324 +# Uncomment to expose additional ports for testing user applications that send emails. +# smtp_port = 54325 +# pop3_port = 54326 + +[storage] +enabled = true +# The maximum file size allowed (e.g. "5MB", "500KB"). +file_size_limit = "50MiB" + +[auth] +enabled = true +# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used +# in emails. +site_url = "http://127.0.0.1:3000" +# A list of *exact* URLs that auth providers are permitted to redirect to post authentication. +additional_redirect_urls = ["https://127.0.0.1:3000"] +# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). +jwt_expiry = 3600 +# If disabled, the refresh token will never expire. +enable_refresh_token_rotation = true +# Allows refresh tokens to be reused after expiry, up to the specified interval in seconds. +# Requires enable_refresh_token_rotation = true. +refresh_token_reuse_interval = 10 +# Allow/disallow new user signups to your project. +enable_signup = true +# Allow/disallow testing manual linking of accounts +enable_manual_linking = false + +[auth.email] +# Allow/disallow new user signups via email to your project. +enable_signup = true +# If enabled, a user will be required to confirm any email change on both the old, and new email +# addresses. If disabled, only the new email is required to confirm. +double_confirm_changes = true +# If enabled, users need to confirm their email address before signing in. +enable_confirmations = false + +# Uncomment to customize email template +# [auth.email.template.invite] +# subject = "You have been invited" +# content_path = "./supabase/templates/invite.html" + +[auth.sms] +# Allow/disallow new user signups via SMS to your project. +enable_signup = true +# If enabled, users need to confirm their phone number before signing in. +enable_confirmations = false +# Template for sending OTP to users +template = "Your code is {{ .Code }} ." + +# Use pre-defined map of phone number to OTP for testing. +[auth.sms.test_otp] +# 4152127777 = "123456" + +# This hook runs before a token is issued and allows you to add additional claims based on the authentication method used. +[auth.hook.custom_access_token] +# enabled = true +# uri = "pg-functions:////" + + +# Configure one of the supported SMS providers: `twilio`, `twilio_verify`, `messagebird`, `textlocal`, `vonage`. +[auth.sms.twilio] +enabled = false +account_sid = "" +message_service_sid = "" +# DO NOT commit your Twilio auth token to git. Use environment variable substitution instead: +auth_token = "env(SUPABASE_AUTH_SMS_TWILIO_AUTH_TOKEN)" + +# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, +# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin_oidc`, `notion`, `twitch`, +# `twitter`, `slack`, `spotify`, `workos`, `zoom`. +[auth.external.apple] +enabled = false +client_id = "" +# DO NOT commit your OAuth provider secret to git. Use environment variable substitution instead: +secret = "env(SUPABASE_AUTH_EXTERNAL_APPLE_SECRET)" +# Overrides the default auth redirectUrl. +redirect_uri = "" +# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, +# or any other third-party OIDC providers. +url = "" + +[analytics] +enabled = false +port = 54327 +vector_port = 54328 +# Configure one of the supported backends: `postgres`, `bigquery`. +backend = "postgres" + +# Experimental features may be deprecated any time +[experimental] +# Configures Postgres storage engine to use OrioleDB (S3) +orioledb_version = "" +# Configures S3 bucket URL, eg. .s3-.amazonaws.com +s3_host = "env(S3_HOST)" +# Configures S3 bucket region, eg. us-east-1 +s3_region = "env(S3_REGION)" +# Configures AWS_ACCESS_KEY_ID for S3 bucket +s3_access_key = "env(S3_ACCESS_KEY)" +# Configures AWS_SECRET_ACCESS_KEY for S3 bucket +s3_secret_key = "env(S3_SECRET_KEY)" diff --git a/supabase/seed.sql b/supabase/seed.sql new file mode 100644 index 0000000..e69de29 diff --git a/yarn.lock b/yarn.lock index f3382a3..d7c20e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -355,11 +355,6 @@ resolved "https://registry.yarnpkg.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240512.0.tgz#c4cd1673a690b9f7f8fb413a9ff16592cdf847f1" integrity sha512-SxKapDrIYSscMR7lGIp/av0l6vokjH4xQ9ACxHgXh+OdOus9azppSmjaPyw4/ePvg7yqpkaNjf9o258IxWtvKQ== -"@commander-js/extra-typings@12.1.0": - version "12.1.0" - resolved "https://registry.yarnpkg.com/@commander-js/extra-typings/-/extra-typings-12.1.0.tgz#5441bae756d326d34f1b9dceb0d78dbf5bc05d81" - integrity sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg== - "@commitlint/cli@^18.6.1": version "18.6.1" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.6.1.tgz#78bffdfa00d6f01425d53096954993d83f2b343d" @@ -905,346 +900,116 @@ escape-string-regexp "^4.0.0" rollup-plugin-node-polyfills "^0.2.1" -"@esbuild/aix-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" - integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== - -"@esbuild/aix-ppc64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz#eafa8775019b3650a77e8310ba4dbd17ca7af6d5" - integrity sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA== - "@esbuild/android-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== -"@esbuild/android-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" - integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== - -"@esbuild/android-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz#68791afa389550736f682c15b963a4f37ec2f5f6" - integrity sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A== - "@esbuild/android-arm@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== -"@esbuild/android-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" - integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== - -"@esbuild/android-arm@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.1.tgz#38c91d8ee8d5196f7fbbdf4f0061415dde3a473a" - integrity sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw== - "@esbuild/android-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== -"@esbuild/android-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" - integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== - -"@esbuild/android-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.1.tgz#93f6190ce997b313669c20edbf3645fc6c8d8f22" - integrity sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA== - "@esbuild/darwin-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== -"@esbuild/darwin-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" - integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== - -"@esbuild/darwin-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz#0d391f2e81fda833fe609182cc2fbb65e03a3c46" - integrity sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA== - "@esbuild/darwin-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== -"@esbuild/darwin-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" - integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== - -"@esbuild/darwin-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz#92504077424584684862f483a2242cfde4055ba2" - integrity sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA== - "@esbuild/freebsd-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== -"@esbuild/freebsd-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" - integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== - -"@esbuild/freebsd-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz#a1646fa6ba87029c67ac8a102bb34384b9290774" - integrity sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw== - "@esbuild/freebsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== -"@esbuild/freebsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" - integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== - -"@esbuild/freebsd-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz#41c9243ab2b3254ea7fb512f71ffdb341562e951" - integrity sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg== - "@esbuild/linux-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== -"@esbuild/linux-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" - integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== - -"@esbuild/linux-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz#f3c1e1269fbc9eedd9591a5bdd32bf707a883156" - integrity sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w== - "@esbuild/linux-arm@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== -"@esbuild/linux-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" - integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== - -"@esbuild/linux-arm@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz#4503ca7001a8ee99589c072801ce9d7540717a21" - integrity sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw== - "@esbuild/linux-ia32@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== -"@esbuild/linux-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" - integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== - -"@esbuild/linux-ia32@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz#98c474e3e0cbb5bcbdd8561a6e65d18f5767ce48" - integrity sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw== - "@esbuild/linux-loong64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== -"@esbuild/linux-loong64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" - integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== - -"@esbuild/linux-loong64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz#a8097d28d14b9165c725fe58fc438f80decd2f33" - integrity sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA== - "@esbuild/linux-mips64el@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== -"@esbuild/linux-mips64el@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" - integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== - -"@esbuild/linux-mips64el@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz#c44f6f0d7d017c41ad3bb15bfdb69b690656b5ea" - integrity sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA== - "@esbuild/linux-ppc64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== -"@esbuild/linux-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" - integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== - -"@esbuild/linux-ppc64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz#0765a55389a99237b3c84227948c6e47eba96f0d" - integrity sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw== - "@esbuild/linux-riscv64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== -"@esbuild/linux-riscv64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" - integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== - -"@esbuild/linux-riscv64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz#e4153b032288e3095ddf4c8be07893781b309a7e" - integrity sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg== - "@esbuild/linux-s390x@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== -"@esbuild/linux-s390x@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" - integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== - -"@esbuild/linux-s390x@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz#b9ab8af6e4b73b26d63c1c426d7669a5d53eb5a7" - integrity sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ== - "@esbuild/linux-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== -"@esbuild/linux-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" - integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== - -"@esbuild/linux-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz#0b25da17ac38c3e11cdd06ca3691d4d6bef2755f" - integrity sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA== - "@esbuild/netbsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== -"@esbuild/netbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" - integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== - -"@esbuild/netbsd-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz#3148e48406cd0d4f7ba1e0bf3f4d77d548c98407" - integrity sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg== - "@esbuild/openbsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== -"@esbuild/openbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" - integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== - -"@esbuild/openbsd-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz#7b73e852986a9750192626d377ac96ac2b749b76" - integrity sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw== - "@esbuild/sunos-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== -"@esbuild/sunos-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" - integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== - -"@esbuild/sunos-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz#402a441cdac2eee98d8be378c7bc23e00c1861c5" - integrity sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q== - "@esbuild/win32-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== -"@esbuild/win32-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" - integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== - -"@esbuild/win32-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz#36c4e311085806a6a0c5fc54d1ac4d7b27e94d7b" - integrity sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A== - "@esbuild/win32-ia32@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== -"@esbuild/win32-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" - integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== - -"@esbuild/win32-ia32@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz#0cf933be3fb9dc58b45d149559fe03e9e22b54fe" - integrity sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw== - "@esbuild/win32-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== -"@esbuild/win32-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" - integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== - -"@esbuild/win32-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz#77583b6ea54cee7c1410ebbd54051b6a3fcbd8ba" - integrity sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1346,6 +1111,13 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2380,6 +2152,13 @@ acorn@^8.8.0, acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +agent-base@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2625,6 +2404,16 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +bin-links@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" + integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -2803,6 +2592,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -2872,6 +2666,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +cmd-shim@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.3.tgz#c491e9656594ba17ac83c4bd931590a9d6e26033" + integrity sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3042,6 +2841,13 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" +cross-env@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -3053,7 +2859,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3204,6 +3010,11 @@ data-uri-to-buffer@^3.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + date-fns@^2.21.1: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -3211,7 +3022,7 @@ date-fns@^2.21.1: dependencies: "@babel/runtime" "^7.21.0" -debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3319,7 +3130,22 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" -dotenv@16.4.5: +dotenv-cli@7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/dotenv-cli/-/dotenv-cli-7.4.2.tgz#c158a818de08e1fbc51d310f628cbace9075b734" + integrity sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA== + dependencies: + cross-spawn "^7.0.3" + dotenv "^16.3.0" + dotenv-expand "^10.0.0" + minimist "^1.2.6" + +dotenv-expand@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + +dotenv@16.4.5, dotenv@^16.3.0: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== @@ -3487,64 +3313,6 @@ esbuild@0.17.19: "@esbuild/win32-ia32" "0.17.19" "@esbuild/win32-x64" "0.17.19" -esbuild@^0.20.1: - version "0.20.1" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.1.tgz#1e4cbb380ad1959db7609cb9573ee77257724a3e" - integrity sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA== - optionalDependencies: - "@esbuild/aix-ppc64" "0.20.1" - "@esbuild/android-arm" "0.20.1" - "@esbuild/android-arm64" "0.20.1" - "@esbuild/android-x64" "0.20.1" - "@esbuild/darwin-arm64" "0.20.1" - "@esbuild/darwin-x64" "0.20.1" - "@esbuild/freebsd-arm64" "0.20.1" - "@esbuild/freebsd-x64" "0.20.1" - "@esbuild/linux-arm" "0.20.1" - "@esbuild/linux-arm64" "0.20.1" - "@esbuild/linux-ia32" "0.20.1" - "@esbuild/linux-loong64" "0.20.1" - "@esbuild/linux-mips64el" "0.20.1" - "@esbuild/linux-ppc64" "0.20.1" - "@esbuild/linux-riscv64" "0.20.1" - "@esbuild/linux-s390x" "0.20.1" - "@esbuild/linux-x64" "0.20.1" - "@esbuild/netbsd-x64" "0.20.1" - "@esbuild/openbsd-x64" "0.20.1" - "@esbuild/sunos-x64" "0.20.1" - "@esbuild/win32-arm64" "0.20.1" - "@esbuild/win32-ia32" "0.20.1" - "@esbuild/win32-x64" "0.20.1" - -esbuild@~0.19.10: - version "0.19.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" - escalade@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -3809,6 +3577,14 @@ fetch-blob@^2.1.1: resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-2.1.2.tgz#a7805db1361bd44c1ef62bb57fb5fe8ea173ef3c" integrity sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow== +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -3906,6 +3682,13 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + fs-extra@10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -3920,7 +3703,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -4013,13 +3796,6 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" -get-tsconfig@^4.7.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" - integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== - dependencies: - resolve-pkg-maps "^1.0.0" - git-raw-commits@^2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" @@ -4230,6 +4006,14 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +https-proxy-agent@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -5499,11 +5283,29 @@ minimist@1.2.8, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +minipass@^7.0.4, minipass@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minizlib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.1.tgz#46d5329d1eb3c83924eff1d3b858ca0a31581012" + integrity sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg== + dependencies: + minipass "^7.0.4" + rimraf "^5.0.5" + mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -5568,6 +5370,11 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + node-fetch@3.0.0-beta.9: version "3.0.0-beta.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.0.0-beta.9.tgz#0a7554cfb824380dd6812864389923c783c80d9b" @@ -5576,6 +5383,15 @@ node-fetch@3.0.0-beta.9: data-uri-to-buffer "^3.0.1" fetch-blob "^2.1.1" +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -6055,6 +5871,11 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + read-package-json-fast@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" @@ -6177,11 +5998,6 @@ resolve-global@1.0.0, resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - resolve.exports@^2.0.0, resolve.exports@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" @@ -6686,6 +6502,16 @@ summary@2.1.0: resolved "https://registry.yarnpkg.com/summary/-/summary-2.1.0.tgz#be8a49a0aa34eb6ceea56042cae88f8add4b0885" integrity sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw== +supabase@1.167.4: + version "1.167.4" + resolved "https://registry.yarnpkg.com/supabase/-/supabase-1.167.4.tgz#95b4b7799daeda1e46d16698a71f19cc4fd1a304" + integrity sha512-DTaTsYQ48FdOPvTTl3H1cQnGDHvm4kQdBakeI5qbs7BFZgu2SRJDYRrCcSgH9sbZReOKrQdJCPfNpoy/Z359gA== + dependencies: + bin-links "^4.0.3" + https-proxy-agent "^7.0.2" + node-fetch "^3.3.2" + tar "7.1.0" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -6720,6 +6546,18 @@ synckit@^0.8.6: "@pkgr/core" "^0.1.0" tslib "^2.6.2" +tar@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.1.0.tgz#c6d4ec5b10ccdffe8bc412b206eaeaf5181f3098" + integrity sha512-ENhg4W6BmjYxl8GTaE7/h99f0aXiSWv4kikRZ9n2/JRxypZniE84ILZqimAhxxX7Zb8Px6pFdheW3EeHfhnXQQ== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.0" + minizlib "^3.0.1" + mkdirp "^3.0.1" + yallist "^5.0.0" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -6821,16 +6659,6 @@ tslib@^2.2.0, tslib@^2.6.2: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsx@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.7.1.tgz#27af6cbf4e1cdfcb9b5425b1c61bb7e668eb5e84" - integrity sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g== - dependencies: - esbuild "~0.19.10" - get-tsconfig "^4.7.2" - optionalDependencies: - fsevents "~2.3.3" - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -7079,6 +6907,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -7236,6 +7069,14 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +write-file-atomic@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + ws@^8.11.0, ws@^8.14.2: version "8.17.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" @@ -7271,6 +7112,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + yaml@2.3.4, yaml@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" From 50a43b7d21341dc6e7f8ee589942c44376b8eb71 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 04:22:27 +0900 Subject: [PATCH 31/56] chore: use authToken for Octokit auth --- src/run.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/run.ts b/src/run.ts index 8b5073f..4a8c466 100644 --- a/src/run.ts +++ b/src/run.ts @@ -14,7 +14,7 @@ export async function run(inputs: PluginInputs, env: Env) { return; } const args = inputs.eventPayload.comment.body.trim().split(/\s+/); - const octokit = new Octokit({ auth: env.UBIQUIBOT_TOKEN }); + const octokit = new Octokit({ auth: inputs.authToken }); const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY); const context = { eventName: inputs.eventName, From 1bce8f8852a9503d3743a2093db2498901d11bf4 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 04:33:05 +0900 Subject: [PATCH 32/56] chore: check invoking user instead of comment --- src/handlers/query-user.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 97eb039..997d1f6 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -14,9 +14,12 @@ export async function queryUser(context: Context, username: string) { } = await octokit.users.getByUsername({ username, }); - if (!config.allowPublicQuery && payload.organization) { + if (!config.allowPublicQuery) { + if (!payload.organization || !payload.comment.user?.name) { + throw new Error("Missing Organization / User from payload, cannot check for organization membership."); + } const { status } = await octokit.orgs.checkMembershipForUser({ - username, + username: payload.comment.user.name, org: payload.organization.login, }); // @ts-expect-error Somehow typing seems wrong but according to From 7e67ad7e27f0a370521fd5d51763eac20de9bf86 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 04:51:09 +0900 Subject: [PATCH 33/56] chore: update deploy --- .github/workflows/deploy.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index caf806f..4a8bb7c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,8 +24,6 @@ jobs: secrets: | SUPABASE_URL SUPABASE_KEY - UBIQUIBOT_TOKEN env: SUPABASE_URL: ${{ secrets.SUPABASE_URL }} SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }} - UBIQUIBOT_TOKEN: ${{ secrets.UBIQUIBOT_TOKEN }} From 3d0b2b04f4acb3655d34d026fc719314f0d51eab Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 04:53:17 +0900 Subject: [PATCH 34/56] chore: cspell ignore conf files --- .cspell.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index 2695d09..54dc4c5 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", "version": "0.2", - "ignorePaths": ["**/*.json", "**/*.css", "node_modules", "**/*.log"], + "ignorePaths": ["**/*.json", "**/*.css", "node_modules", "**/*.log", "**/*.http", "**/*.toml"], "useGitignore": true, "language": "en", "words": ["dataurl", "devpool", "outdir", "servedir", "typebox", "supabase", "ubiquibot", "mswjs"], From 66f57c4c33d118d6d52f010486cfe483d053181d Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 05:07:34 +0900 Subject: [PATCH 35/56] chore: fixed formatting --- src/run.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/run.ts b/src/run.ts index 4a8c466..649c0c8 100644 --- a/src/run.ts +++ b/src/run.ts @@ -37,7 +37,7 @@ export async function run(inputs: PluginInputs, env: Env) { fatal(message: unknown, ...optionalParams: unknown[]) { octokit.issues .createComment({ - body: `command-query-user failed to run.\n\n${message}`, + body: `\`\`\`command-query-user failed to run.\n\n${message}\`\`\``, owner: inputs.eventPayload.repository.owner.login, repo: inputs.eventPayload.repository.name, issue_number: inputs.eventPayload.issue.number, From 35727b2b35bcf94cb06f96417e08641d1b380371 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 05:15:12 +0900 Subject: [PATCH 36/56] chore: improved formatting --- src/handlers/query-user.ts | 2 +- src/run.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 997d1f6..bf36841 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -60,6 +60,6 @@ User information for ${username} was not found. issue_number: payload.issue.number, }); } catch (e) { - context.logger.fatal("Could not query user.", e); + context.logger.fatal(`Could not query user ${username}.`, e); } } diff --git a/src/run.ts b/src/run.ts index 649c0c8..fda3f78 100644 --- a/src/run.ts +++ b/src/run.ts @@ -37,7 +37,7 @@ export async function run(inputs: PluginInputs, env: Env) { fatal(message: unknown, ...optionalParams: unknown[]) { octokit.issues .createComment({ - body: `\`\`\`command-query-user failed to run.\n\n${message}\`\`\``, + body: `\`\`\`text\ncommand-query-user failed to run.\n\n${message}\n\`\`\``, owner: inputs.eventPayload.repository.owner.login, repo: inputs.eventPayload.repository.name, issue_number: inputs.eventPayload.issue.number, From e7fcf11cb727022765d6c316fe62cc90811922ea Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 05:21:20 +0900 Subject: [PATCH 37/56] chore: test log --- src/run.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/run.ts b/src/run.ts index fda3f78..78c9c9f 100644 --- a/src/run.ts +++ b/src/run.ts @@ -15,6 +15,7 @@ export async function run(inputs: PluginInputs, env: Env) { } const args = inputs.eventPayload.comment.body.trim().split(/\s+/); const octokit = new Octokit({ auth: inputs.authToken }); + console.log("inputs", inputs); const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY); const context = { eventName: inputs.eventName, @@ -35,6 +36,7 @@ export async function run(inputs: PluginInputs, env: Env) { console.error(message, ...optionalParams); }, fatal(message: unknown, ...optionalParams: unknown[]) { + console.log("got an error", message); octokit.issues .createComment({ body: `\`\`\`text\ncommand-query-user failed to run.\n\n${message}\n\`\`\``, From 2d45a41bb94ac9fcee313b37c10cccee9a4d09ef Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 05:38:39 +0900 Subject: [PATCH 38/56] chore: test log --- src/run.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/run.ts b/src/run.ts index 78c9c9f..df695b0 100644 --- a/src/run.ts +++ b/src/run.ts @@ -36,16 +36,17 @@ export async function run(inputs: PluginInputs, env: Env) { console.error(message, ...optionalParams); }, fatal(message: unknown, ...optionalParams: unknown[]) { - console.log("got an error", message); - octokit.issues - .createComment({ + console.log("here"); + (async () => + await octokit.issues.createComment({ body: `\`\`\`text\ncommand-query-user failed to run.\n\n${message}\n\`\`\``, owner: inputs.eventPayload.repository.owner.login, repo: inputs.eventPayload.repository.name, issue_number: inputs.eventPayload.issue.number, - }) + }))() .catch(() => console.error(message, ...optionalParams)) .finally(() => console.error(message, ...optionalParams)); + console.log("here 2"); }, }, adapters: {}, From 8a47b3650652e59bc6b9508f7cb638dc728b4e43 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 05:53:10 +0900 Subject: [PATCH 39/56] chore: changed fatal error --- src/adapters/index.ts | 3 ++- src/run.ts | 43 +++++++++++++++++++------------------------ 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/adapters/index.ts b/src/adapters/index.ts index 634f8a1..63dbfc9 100644 --- a/src/adapters/index.ts +++ b/src/adapters/index.ts @@ -1,7 +1,8 @@ import { SupabaseClient } from "@supabase/supabase-js"; import { Context } from "../types/context"; +import { Database } from "../types/database"; -export function createAdapters(supabaseClient: SupabaseClient, context: Context) { +export function createAdapters(supabaseClient: SupabaseClient, context: Context) { return { supabase: { access: { diff --git a/src/run.ts b/src/run.ts index df695b0..d51b56e 100644 --- a/src/run.ts +++ b/src/run.ts @@ -35,43 +35,38 @@ export async function run(inputs: PluginInputs, env: Env) { error(message: unknown, ...optionalParams: unknown[]) { console.error(message, ...optionalParams); }, - fatal(message: unknown, ...optionalParams: unknown[]) { - console.log("here"); - (async () => + async fatal(message: unknown, ...optionalParams: unknown[]) { + console.error(message, ...optionalParams); + try { await octokit.issues.createComment({ - body: `\`\`\`text\ncommand-query-user failed to run.\n\n${message}\n\`\`\``, - owner: inputs.eventPayload.repository.owner.login, - repo: inputs.eventPayload.repository.name, - issue_number: inputs.eventPayload.issue.number, - }))() - .catch(() => console.error(message, ...optionalParams)) - .finally(() => console.error(message, ...optionalParams)); - console.log("here 2"); + body: `\`\`\` +Failed to run command-query-user. +${message} + +${commandParser.helpInformation()} +\`\`\``, + owner: context.payload.repository.owner.login, + repo: context.payload.repository.name, + issue_number: context.payload.issue.number, + }); + } finally { + console.error(message, ...optionalParams); + } }, }, - adapters: {}, + adapters: {} as unknown as ReturnType, } as Context; context.adapters = createAdapters(supabase, context); const commandParser = new CommandParser(context); try { await commandParser.parse(args); } catch (e) { - context.logger.error("error", e); if (e instanceof CommanderError) { if (e.code !== "commander.unknownCommand") { - await octokit.issues.createComment({ - body: `\`\`\` -Failed to run command-query-user. -${e} - -${commandParser.helpInformation()} -\`\`\``, - owner: context.payload.repository.owner.login, - repo: context.payload.repository.name, - issue_number: context.payload.issue.number, - }); + context.logger.fatal(e); } } else { + context.logger.error("error", e); throw e; } } From bb4f0b7f87cec45f6abc09bc8970eb7ddbbe9a98 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 05:58:07 +0900 Subject: [PATCH 40/56] chore: test fix async --- src/handlers/query-user.ts | 4 ++-- src/run.ts | 2 +- src/types/context.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index bf36841..4bef1ed 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -50,7 +50,7 @@ User information for ${username} was not found. body.push(`| Wallet | ${wallet.address} |`); } if (access) { - body.push(`| Access | \`\`\`${JSON.stringify({ ...access.multiplier_reason, ...access.labels }, null, 2)}\`\`\` |`); + body.push(`| Access | \`\`\`${JSON.stringify({ multiplier_reason: access.multiplier_reason, labels: access.labels }, null, 2)}\`\`\` |`); } } await octokit.issues.createComment({ @@ -60,6 +60,6 @@ User information for ${username} was not found. issue_number: payload.issue.number, }); } catch (e) { - context.logger.fatal(`Could not query user ${username}.`, e); + await context.logger.fatal(`Could not query user ${username}.`, e); } } diff --git a/src/run.ts b/src/run.ts index d51b56e..9e380ea 100644 --- a/src/run.ts +++ b/src/run.ts @@ -63,7 +63,7 @@ ${commandParser.helpInformation()} } catch (e) { if (e instanceof CommanderError) { if (e.code !== "commander.unknownCommand") { - context.logger.fatal(e); + await context.logger.fatal(e); } } else { context.logger.error("error", e); diff --git a/src/types/context.ts b/src/types/context.ts index 4023a1a..e407655 100644 --- a/src/types/context.ts +++ b/src/types/context.ts @@ -12,7 +12,7 @@ export interface Context { adapters: ReturnType; config: CommandQuerySettings; logger: { - fatal: (message: unknown, ...optionalParams: unknown[]) => void; + fatal: (message: unknown, ...optionalParams: unknown[]) => Promise; error: (message: unknown, ...optionalParams: unknown[]) => void; warn: (message: unknown, ...optionalParams: unknown[]) => void; info: (message: unknown, ...optionalParams: unknown[]) => void; From 17234307bcf5d1905801c4bea067bfeeb6d5128b Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Mon, 27 May 2024 06:11:02 +0900 Subject: [PATCH 41/56] chore: added db for knip --- .eslintrc.js | 2 +- .github/knip.ts | 2 +- .gitignore | 1 - src/types/database.ts | 776 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 778 insertions(+), 3 deletions(-) create mode 100644 src/types/database.ts diff --git a/.eslintrc.js b/.eslintrc.js index d454c0f..1e44234 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,7 +9,7 @@ module.exports = { }, plugins: ["@typescript-eslint", "sonarjs", "filename-rules"], extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:sonarjs/recommended"], - ignorePatterns: ["**/*.js"], + ignorePatterns: ["**/*.js", "src/types/database.ts"], rules: { "filename-rules/match": [2, /^(e2e\.ts$|.*\/e2e\.ts$|[a-z]+(?:[-._a-z]+)*\.ts|\.[a-z]+)$/], "prefer-arrow-callback": ["warn", { allowNamedFunctions: true }], diff --git a/.github/knip.ts b/.github/knip.ts index b170948..b9bd752 100644 --- a/.github/knip.ts +++ b/.github/knip.ts @@ -3,7 +3,7 @@ import type { KnipConfig } from "knip"; const config: KnipConfig = { entry: ["build/index.ts"], project: ["src/**/*.ts"], - ignore: ["src/types/config.ts", "**/__mocks__/**", "**/__fixtures__/**"], + ignore: ["**/__mocks__/**", "**/__fixtures__/**", "src/types/database.ts"], ignoreExportsUsedInFile: true, // eslint can also be safely ignored as per the docs: https://knip.dev/guides/handling-issues#eslint--jest ignoreDependencies: ["eslint-config-prettier", "eslint-plugin-prettier", "@types/jest"], diff --git a/.gitignore b/.gitignore index b001fe6..2c31e37 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,3 @@ junit.xml cypress/screenshots .dev.vars /tests/http/http-client.private.env.json -src/types/database.ts diff --git a/src/types/database.ts b/src/types/database.ts new file mode 100644 index 0000000..8c30852 --- /dev/null +++ b/src/types/database.ts @@ -0,0 +1,776 @@ +export type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[]; + +export type Database = { + public: { + Tables: { + access: { + Row: { + created: string; + id: number; + labels: Json | null; + location_id: number | null; + multiplier: number; + multiplier_reason: string | null; + updated: string | null; + user_id: number; + }; + Insert: { + created?: string; + id?: number; + labels?: Json | null; + location_id?: number | null; + multiplier?: number; + multiplier_reason?: string | null; + updated?: string | null; + user_id: number; + }; + Update: { + created?: string; + id?: number; + labels?: Json | null; + location_id?: number | null; + multiplier?: number; + multiplier_reason?: string | null; + updated?: string | null; + user_id?: number; + }; + Relationships: [ + { + foreignKeyName: "access_user_id_fkey"; + columns: ["user_id"]; + isOneToOne: false; + referencedRelation: "users"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_access_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_access_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + credits: { + Row: { + amount: number; + created: string; + id: number; + location_id: number | null; + permit_id: number | null; + updated: string | null; + }; + Insert: { + amount: number; + created?: string; + id?: number; + location_id?: number | null; + permit_id?: number | null; + updated?: string | null; + }; + Update: { + amount?: number; + created?: string; + id?: number; + location_id?: number | null; + permit_id?: number | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "credits_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "credits_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "credits_permit_id_fkey"; + columns: ["permit_id"]; + isOneToOne: false; + referencedRelation: "permits"; + referencedColumns: ["id"]; + }, + ]; + }; + debits: { + Row: { + amount: number; + created: string; + id: number; + location_id: number | null; + token_id: number | null; + updated: string | null; + }; + Insert: { + amount: number; + created?: string; + id?: number; + location_id?: number | null; + token_id?: number | null; + updated?: string | null; + }; + Update: { + amount?: number; + created?: string; + id?: number; + location_id?: number | null; + token_id?: number | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "debits_token_id_fkey"; + columns: ["token_id"]; + isOneToOne: false; + referencedRelation: "tokens"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_debits_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_debits_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + labels: { + Row: { + authorized: boolean | null; + created: string; + id: number; + label_from: string | null; + label_to: string | null; + location_id: number | null; + updated: string | null; + }; + Insert: { + authorized?: boolean | null; + created?: string; + id?: number; + label_from?: string | null; + label_to?: string | null; + location_id?: number | null; + updated?: string | null; + }; + Update: { + authorized?: boolean | null; + created?: string; + id?: number; + label_from?: string | null; + label_to?: string | null; + location_id?: number | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "labels_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "labels_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + locations: { + Row: { + comment_id: number | null; + created: string; + id: number; + issue_id: number | null; + node_id: string | null; + node_type: string | null; + node_url: string | null; + organization_id: number | null; + repository_id: number | null; + updated: string | null; + user_id: number | null; + }; + Insert: { + comment_id?: number | null; + created?: string; + id?: number; + issue_id?: number | null; + node_id?: string | null; + node_type?: string | null; + node_url?: string | null; + organization_id?: number | null; + repository_id?: number | null; + updated?: string | null; + user_id?: number | null; + }; + Update: { + comment_id?: number | null; + created?: string; + id?: number; + issue_id?: number | null; + node_id?: string | null; + node_type?: string | null; + node_url?: string | null; + organization_id?: number | null; + repository_id?: number | null; + updated?: string | null; + user_id?: number | null; + }; + Relationships: []; + }; + logs: { + Row: { + created: string; + id: number; + level: string | null; + location_id: number | null; + log: string; + metadata: Json | null; + updated: string | null; + }; + Insert: { + created?: string; + id?: number; + level?: string | null; + location_id?: number | null; + log: string; + metadata?: Json | null; + updated?: string | null; + }; + Update: { + created?: string; + id?: number; + level?: string | null; + location_id?: number | null; + log?: string; + metadata?: Json | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "fk_logs_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_logs_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + partners: { + Row: { + created: string; + id: number; + location_id: number | null; + updated: string | null; + wallet_id: number | null; + }; + Insert: { + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + wallet_id?: number | null; + }; + Update: { + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + wallet_id?: number | null; + }; + Relationships: [ + { + foreignKeyName: "fk_partners_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_partners_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "partners_wallet_id_fkey"; + columns: ["wallet_id"]; + isOneToOne: true; + referencedRelation: "wallets"; + referencedColumns: ["id"]; + }, + ]; + }; + permits: { + Row: { + amount: string; + beneficiary_id: number; + created: string; + deadline: string; + id: number; + location_id: number | null; + nonce: string; + partner_id: number | null; + signature: string; + token_id: number | null; + transaction: string | null; + updated: string | null; + }; + Insert: { + amount: string; + beneficiary_id: number; + created?: string; + deadline: string; + id?: number; + location_id?: number | null; + nonce: string; + partner_id?: number | null; + signature: string; + token_id?: number | null; + transaction?: string | null; + updated?: string | null; + }; + Update: { + amount?: string; + beneficiary_id?: number; + created?: string; + deadline?: string; + id?: number; + location_id?: number | null; + nonce?: string; + partner_id?: number | null; + signature?: string; + token_id?: number | null; + transaction?: string | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "fk_permits_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_permits_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "permits_beneficiary_id_fkey"; + columns: ["beneficiary_id"]; + isOneToOne: false; + referencedRelation: "users"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "permits_partner_id_fkey"; + columns: ["partner_id"]; + isOneToOne: false; + referencedRelation: "partners"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "permits_token_fkey"; + columns: ["token_id"]; + isOneToOne: false; + referencedRelation: "tokens"; + referencedColumns: ["id"]; + }, + ]; + }; + settlements: { + Row: { + created: string; + credit_id: number | null; + debit_id: number | null; + id: number; + location_id: number | null; + updated: string | null; + user_id: number; + }; + Insert: { + created?: string; + credit_id?: number | null; + debit_id?: number | null; + id?: number; + location_id?: number | null; + updated?: string | null; + user_id: number; + }; + Update: { + created?: string; + credit_id?: number | null; + debit_id?: number | null; + id?: number; + location_id?: number | null; + updated?: string | null; + user_id?: number; + }; + Relationships: [ + { + foreignKeyName: "fk_settlements_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_settlements_location"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "settlements_credit_id_fkey"; + columns: ["credit_id"]; + isOneToOne: false; + referencedRelation: "credits"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "settlements_debit_id_fkey"; + columns: ["debit_id"]; + isOneToOne: false; + referencedRelation: "debits"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "settlements_user_id_fkey"; + columns: ["user_id"]; + isOneToOne: false; + referencedRelation: "users"; + referencedColumns: ["id"]; + }, + ]; + }; + tokens: { + Row: { + address: string; + created: string; + id: number; + location_id: number | null; + network: number; + updated: string | null; + }; + Insert: { + address: string; + created?: string; + id?: number; + location_id?: number | null; + network?: number; + updated?: string | null; + }; + Update: { + address?: string; + created?: string; + id?: number; + location_id?: number | null; + network?: number; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "tokens_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "tokens_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + users: { + Row: { + created: string; + id: number; + location_id: number | null; + updated: string | null; + wallet_id: number | null; + }; + Insert: { + created?: string; + id: number; + location_id?: number | null; + updated?: string | null; + wallet_id?: number | null; + }; + Update: { + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + wallet_id?: number | null; + }; + Relationships: [ + { + foreignKeyName: "users_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "users_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "users_wallet_id_fkey"; + columns: ["wallet_id"]; + isOneToOne: false; + referencedRelation: "wallets"; + referencedColumns: ["id"]; + }, + ]; + }; + wallets: { + Row: { + address: string | null; + created: string; + id: number; + location_id: number | null; + updated: string | null; + }; + Insert: { + address?: string | null; + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + }; + Update: { + address?: string | null; + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "wallets_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "issues_view"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "wallets_location_id_fkey"; + columns: ["location_id"]; + isOneToOne: false; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + }; + Views: { + issues_view: { + Row: { + comment_id: number | null; + created: string | null; + id: number | null; + issue_id: number | null; + node_id: string | null; + node_type: string | null; + node_url: string | null; + organization_id: number | null; + repository_id: number | null; + updated: string | null; + user_id: number | null; + }; + Relationships: []; + }; + }; + Functions: { + insert_with_exception_handling: { + Args: Record; + Returns: undefined; + }; + read_secret: { + Args: { + secret_name: string; + }; + Returns: string; + }; + }; + Enums: { + github_node_type: + | "App" + | "Bot" + | "CheckRun" + | "CheckSuite" + | "ClosedEvent" + | "CodeOfConduct" + | "Commit" + | "CommitComment" + | "CommitContributionsByRepository" + | "ContributingGuidelines" + | "ConvertToDraftEvent" + | "CreatedCommitContribution" + | "CreatedIssueContribution" + | "CreatedPullRequestContribution" + | "CreatedPullRequestReviewContribution" + | "CreatedRepositoryContribution" + | "CrossReferencedEvent" + | "Discussion" + | "DiscussionComment" + | "Enterprise" + | "EnterpriseUserAccount" + | "FundingLink" + | "Gist" + | "Issue" + | "IssueComment" + | "JoinedGitHubContribution" + | "Label" + | "License" + | "Mannequin" + | "MarketplaceCategory" + | "MarketplaceListing" + | "MergeQueue" + | "MergedEvent" + | "MigrationSource" + | "Milestone" + | "Organization" + | "PackageFile" + | "Project" + | "ProjectCard" + | "ProjectColumn" + | "ProjectV2" + | "PullRequest" + | "PullRequestCommit" + | "PullRequestReview" + | "PullRequestReviewComment" + | "ReadyForReviewEvent" + | "Release" + | "ReleaseAsset" + | "Repository" + | "RepositoryContactLink" + | "RepositoryTopic" + | "RestrictedContribution" + | "ReviewDismissedEvent" + | "SecurityAdvisoryReference" + | "SocialAccount" + | "SponsorsListing" + | "Team" + | "TeamDiscussion" + | "TeamDiscussionComment" + | "User" + | "Workflow" + | "WorkflowRun" + | "WorkflowRunFile"; + }; + CompositeTypes: { + [_ in never]: never; + }; + }; +}; + +type PublicSchema = Database[Extract]; + +export type Tables< + PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] & PublicSchema["Views"]) | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] & Database[PublicTableNameOrOptions["schema"]]["Views"]) + : never = never, +> = PublicTableNameOrOptions extends { schema: keyof Database } + ? (Database[PublicTableNameOrOptions["schema"]]["Tables"] & Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends { + Row: infer R; + } + ? R + : never + : PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] & PublicSchema["Views"]) + ? (PublicSchema["Tables"] & PublicSchema["Views"])[PublicTableNameOrOptions] extends { + Row: infer R; + } + ? R + : never + : never; + +export type TablesInsert< + PublicTableNameOrOptions extends keyof PublicSchema["Tables"] | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] : never = never, +> = PublicTableNameOrOptions extends { schema: keyof Database } + ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Insert: infer I; + } + ? I + : never + : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] + ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { + Insert: infer I; + } + ? I + : never + : never; + +export type TablesUpdate< + PublicTableNameOrOptions extends keyof PublicSchema["Tables"] | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] : never = never, +> = PublicTableNameOrOptions extends { schema: keyof Database } + ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Update: infer U; + } + ? U + : never + : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] + ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { + Update: infer U; + } + ? U + : never + : never; + +export type Enums< + PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] | { schema: keyof Database }, + EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database } ? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"] : never = never, +> = PublicEnumNameOrOptions extends { schema: keyof Database } + ? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName] + : PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] + ? PublicSchema["Enums"][PublicEnumNameOrOptions] + : never; From cbff9119df7daa3168cfc8041ef35787e04130ba Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Tue, 28 May 2024 02:07:35 +0900 Subject: [PATCH 42/56] chore: display only labels for access --- src/handlers/query-user.ts | 49 +++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 4bef1ed..759ebfd 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -1,5 +1,29 @@ import { Context } from "../types/context"; +async function checkUserAccess(context: Context, username: string) { + const { octokit, payload } = context; + if (!payload.organization || !payload.comment.user?.name) { + throw new Error("Missing Organization / User from payload, cannot check for organization membership."); + } + const { status } = await octokit.orgs.checkMembershipForUser({ + username: payload.comment.user.name, + org: payload.organization.login, + }); + // @ts-expect-error Somehow typing seems wrong but according to + // https://docs.github.com/en/rest/orgs/members?apiVersion=2022-11-28#check-organization-membership-for-a-user--status-codes + // 204 means the user is part of the Organization + if (status !== 204) { + await octokit.issues.createComment({ + body: `\`\`\`User ${username} cannot request another user as it is not member of the organization.\`\`\``, + owner: payload.repository.owner.login, + repo: payload.repository.name, + issue_number: payload.issue.number, + }); + return false; + } + return true; +} + export async function queryUser(context: Context, username: string) { const { octokit, @@ -14,27 +38,8 @@ export async function queryUser(context: Context, username: string) { } = await octokit.users.getByUsername({ username, }); - if (!config.allowPublicQuery) { - if (!payload.organization || !payload.comment.user?.name) { - throw new Error("Missing Organization / User from payload, cannot check for organization membership."); - } - const { status } = await octokit.orgs.checkMembershipForUser({ - username: payload.comment.user.name, - org: payload.organization.login, - }); - // @ts-expect-error Somehow typing seems wrong but according to - // https://docs.github.com/en/rest/orgs/members?apiVersion=2022-11-28#check-organization-membership-for-a-user--status-codes - // 204 means the user is part of the Organization - if (status !== 204) { - body.push(`\`\`\`User ${username} cannot request another user as it is not member of the organization.\`\`\``); - await octokit.issues.createComment({ - body: body.join("\n"), - owner: payload.repository.owner.login, - repo: payload.repository.name, - issue_number: payload.issue.number, - }); - return; - } + if (!config.allowPublicQuery && !(await checkUserAccess(context, username))) { + return; } const access = await supabase.access.getAccess(id); const wallet = await supabase.wallet.getWallet(id); @@ -50,7 +55,7 @@ User information for ${username} was not found. body.push(`| Wallet | ${wallet.address} |`); } if (access) { - body.push(`| Access | \`\`\`${JSON.stringify({ multiplier_reason: access.multiplier_reason, labels: access.labels }, null, 2)}\`\`\` |`); + body.push(`| Access | \`\`\`${Array.isArray(access.labels) ? access.labels.join(", ") : JSON.stringify(access.labels, null, 2)}\`\`\` |`); } } await octokit.issues.createComment({ From 745f4453c7b84e1f032ea32daf6f6062467547fa Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Tue, 28 May 2024 11:23:47 +0900 Subject: [PATCH 43/56] chore: always use logger for logs --- src/handlers/query-user.ts | 7 +--- src/run.ts | 70 +++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 759ebfd..751a5ac 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -13,12 +13,7 @@ async function checkUserAccess(context: Context, username: string) { // https://docs.github.com/en/rest/orgs/members?apiVersion=2022-11-28#check-organization-membership-for-a-user--status-codes // 204 means the user is part of the Organization if (status !== 204) { - await octokit.issues.createComment({ - body: `\`\`\`User ${username} cannot request another user as it is not member of the organization.\`\`\``, - owner: payload.repository.owner.login, - repo: payload.repository.name, - issue_number: payload.issue.number, - }); + await context.logger.fatal(`User ${username} cannot request another user as it is not member of the organization.`); return false; } return true; diff --git a/src/run.ts b/src/run.ts index 9e380ea..fcec147 100644 --- a/src/run.ts +++ b/src/run.ts @@ -9,51 +9,51 @@ import { Env } from "./types/env"; import { PluginInputs } from "./types/plugin-input"; export async function run(inputs: PluginInputs, env: Env) { + const octokit = new Octokit({ auth: inputs.authToken }); + const logger: Context["logger"] = { + debug(message: unknown, ...optionalParams: unknown[]) { + console.debug(message, ...optionalParams); + }, + info(message: unknown, ...optionalParams: unknown[]) { + console.log(message, ...optionalParams); + }, + warn(message: unknown, ...optionalParams: unknown[]) { + console.warn(message, ...optionalParams); + }, + error(message: unknown, ...optionalParams: unknown[]) { + console.error(message, ...optionalParams); + }, + async fatal(message: unknown, ...optionalParams: unknown[]) { + console.error(message, ...optionalParams); + try { + await octokit.issues.createComment({ + body: `\`\`\` +Failed to run command-query-user. +${message} + +${commandParser.helpInformation()} +\`\`\``, + owner: context.payload.repository.owner.login, + repo: context.payload.repository.name, + issue_number: context.payload.issue.number, + }); + } finally { + console.error(message, ...optionalParams); + } + }, + }; if (inputs.eventName !== "issue_comment.created") { - console.warn(`Unsupported event ${inputs.eventName}, skipping.`); + logger.warn(`Unsupported event ${inputs.eventName}, skipping.`); return; } const args = inputs.eventPayload.comment.body.trim().split(/\s+/); - const octokit = new Octokit({ auth: inputs.authToken }); - console.log("inputs", inputs); const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY); const context = { eventName: inputs.eventName, payload: inputs.eventPayload, config: inputs.settings, octokit, - logger: { - debug(message: unknown, ...optionalParams: unknown[]) { - console.debug(message, ...optionalParams); - }, - info(message: unknown, ...optionalParams: unknown[]) { - console.log(message, ...optionalParams); - }, - warn(message: unknown, ...optionalParams: unknown[]) { - console.warn(message, ...optionalParams); - }, - error(message: unknown, ...optionalParams: unknown[]) { - console.error(message, ...optionalParams); - }, - async fatal(message: unknown, ...optionalParams: unknown[]) { - console.error(message, ...optionalParams); - try { - await octokit.issues.createComment({ - body: `\`\`\` -Failed to run command-query-user. -${message} - -${commandParser.helpInformation()} -\`\`\``, - owner: context.payload.repository.owner.login, - repo: context.payload.repository.name, - issue_number: context.payload.issue.number, - }); - } finally { - console.error(message, ...optionalParams); - } - }, - }, + logger, adapters: {} as unknown as ReturnType, } as Context; context.adapters = createAdapters(supabase, context); From 6eff715a53454394245b4b843485aaba56fd2d26 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 29 May 2024 16:37:44 +0900 Subject: [PATCH 44/56] chore: removed unused UBIQUIBOT_TOKEN --- src/types/env.ts | 1 - tests/main.test.ts | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/types/env.ts b/src/types/env.ts index 7be4ee3..0fc6dad 100644 --- a/src/types/env.ts +++ b/src/types/env.ts @@ -3,7 +3,6 @@ import { Type as T, StaticDecode } from "@sinclair/typebox"; export const envSchema = T.Object({ SUPABASE_URL: T.String(), SUPABASE_KEY: T.String(), - UBIQUIBOT_TOKEN: T.String(), }); export type Env = StaticDecode; diff --git a/tests/main.test.ts b/tests/main.test.ts index adba4bd..2e07214 100644 --- a/tests/main.test.ts +++ b/tests/main.test.ts @@ -73,7 +73,7 @@ describe("User tests", () => { settings: { allowPublicQuery: true }, eventPayload: commentCreatedPayload, } as PluginInputs, - { SUPABASE_URL: "", SUPABASE_KEY: "", UBIQUIBOT_TOKEN: "" } + { SUPABASE_URL: "", SUPABASE_KEY: "" } ) ).not.toThrow(); }); @@ -96,7 +96,7 @@ describe("User tests", () => { }, }, } as PluginInputs, - { SUPABASE_URL: "", SUPABASE_KEY: "", UBIQUIBOT_TOKEN: "" } + { SUPABASE_URL: "", SUPABASE_KEY: "" } ) ).not.toThrow(); }); @@ -119,7 +119,7 @@ describe("User tests", () => { }, }, } as PluginInputs, - { SUPABASE_URL: "", SUPABASE_KEY: "", UBIQUIBOT_TOKEN: "" } + { SUPABASE_URL: "", SUPABASE_KEY: "" } ) ).not.toThrow(); }); From 1b99593831541c64db7c04fc647fdeecaff5c28d Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Wed, 29 May 2024 16:42:13 +0900 Subject: [PATCH 45/56] chore: removed unused env loading --- src/worker.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/worker.ts b/src/worker.ts index da55528..3bd4ec8 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -1,11 +1,8 @@ import { Value } from "@sinclair/typebox/value"; -import { config } from "dotenv"; import { run } from "./run"; import { Env } from "./types/env"; import { commandQueryUserScheme } from "./types/plugin-input"; -config(); - export default { async fetch(request: Request, env: Env): Promise { try { From 083f06d409266eec95289feb983a8ce5302f7f11 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Thu, 30 May 2024 11:34:57 +0900 Subject: [PATCH 46/56] chore: removed unused dep dotenv --- package.json | 3 +-- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f0f9d1c..b37de3b 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,7 @@ "@octokit/webhooks": "13.2.7", "@sinclair/typebox": "0.32.30", "@supabase/supabase-js": "2.43.2", - "commander": "12.1.0", - "dotenv": "16.4.5" + "commander": "12.1.0" }, "devDependencies": { "@commitlint/cli": "^18.6.1", diff --git a/yarn.lock b/yarn.lock index d7c20e8..c74f28f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3145,7 +3145,7 @@ dotenv-expand@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== -dotenv@16.4.5, dotenv@^16.3.0: +dotenv@^16.3.0: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== From a6921aef70ccb1d4a66b71b454f238d3bb4d5f59 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Thu, 30 May 2024 18:26:21 +0900 Subject: [PATCH 47/56] chore: changed check for members to checkCollaborator --- src/handlers/query-user.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 751a5ac..f10f231 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -5,15 +5,13 @@ async function checkUserAccess(context: Context, username: string) { if (!payload.organization || !payload.comment.user?.name) { throw new Error("Missing Organization / User from payload, cannot check for organization membership."); } - const { status } = await octokit.orgs.checkMembershipForUser({ + const { status } = await octokit.repos.checkCollaborator({ username: payload.comment.user.name, - org: payload.organization.login, + repo: payload.repository.name, + owner: payload.repository.owner.login, }); - // @ts-expect-error Somehow typing seems wrong but according to - // https://docs.github.com/en/rest/orgs/members?apiVersion=2022-11-28#check-organization-membership-for-a-user--status-codes - // 204 means the user is part of the Organization if (status !== 204) { - await context.logger.fatal(`User ${username} cannot request another user as it is not member of the organization.`); + await context.logger.fatal(`User ${payload.comment.user.name} cannot request user ${username} as it is not a collaborator.`); return false; } return true; From 566c04c75da4c3ff570f85e3e72eb07b3cac8215 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Thu, 30 May 2024 18:29:24 +0900 Subject: [PATCH 48/56] chore: log status --- src/handlers/query-user.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index f10f231..a1f57e2 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -10,6 +10,7 @@ async function checkUserAccess(context: Context, username: string) { repo: payload.repository.name, owner: payload.repository.owner.login, }); + console.log("status"); if (status !== 204) { await context.logger.fatal(`User ${payload.comment.user.name} cannot request user ${username} as it is not a collaborator.`); return false; From 595023a3e5955024c0c3fddfbd79756b68cf7211 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 31 May 2024 09:38:17 +0900 Subject: [PATCH 49/56] chore: log status --- src/handlers/query-user.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index a1f57e2..5463a66 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -10,7 +10,7 @@ async function checkUserAccess(context: Context, username: string) { repo: payload.repository.name, owner: payload.repository.owner.login, }); - console.log("status"); + console.log("status", status); if (status !== 204) { await context.logger.fatal(`User ${payload.comment.user.name} cannot request user ${username} as it is not a collaborator.`); return false; From 212e9c05c21ebeff27ecd0927a5ff9f2535d65a2 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 31 May 2024 09:45:17 +0900 Subject: [PATCH 50/56] chore: removed org check --- src/handlers/query-user.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 5463a66..0a828d5 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -2,8 +2,8 @@ import { Context } from "../types/context"; async function checkUserAccess(context: Context, username: string) { const { octokit, payload } = context; - if (!payload.organization || !payload.comment.user?.name) { - throw new Error("Missing Organization / User from payload, cannot check for organization membership."); + if (!payload.comment.user?.name) { + throw new Error("Missing User from payload, cannot check for collaborator status."); } const { status } = await octokit.repos.checkCollaborator({ username: payload.comment.user.name, From 2fc0a44be8f549b63dd326eb305296588b1f1a44 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 31 May 2024 09:47:30 +0900 Subject: [PATCH 51/56] chore: add log --- src/handlers/query-user.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 0a828d5..98cb688 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -2,6 +2,7 @@ import { Context } from "../types/context"; async function checkUserAccess(context: Context, username: string) { const { octokit, payload } = context; + console.log(JSON.stringify(payload, null, 2)); if (!payload.comment.user?.name) { throw new Error("Missing User from payload, cannot check for collaborator status."); } From fb895f4967c2e87e41a5e035054c37bb92df0ac0 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 31 May 2024 09:49:48 +0900 Subject: [PATCH 52/56] chore: add log --- src/handlers/query-user.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 98cb688..e52bd78 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -3,11 +3,11 @@ import { Context } from "../types/context"; async function checkUserAccess(context: Context, username: string) { const { octokit, payload } = context; console.log(JSON.stringify(payload, null, 2)); - if (!payload.comment.user?.name) { - throw new Error("Missing User from payload, cannot check for collaborator status."); + if (!payload.comment.user?.login) { + throw new Error("Missing User Login from payload, cannot check for collaborator status."); } const { status } = await octokit.repos.checkCollaborator({ - username: payload.comment.user.name, + username: payload.comment.user.login, repo: payload.repository.name, owner: payload.repository.owner.login, }); From 046fc632eb85c2f00e32d9af0080b2d1b00b3c88 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 31 May 2024 09:58:59 +0900 Subject: [PATCH 53/56] chore: add try catch --- src/handlers/query-user.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index e52bd78..a48effb 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -2,18 +2,20 @@ import { Context } from "../types/context"; async function checkUserAccess(context: Context, username: string) { const { octokit, payload } = context; - console.log(JSON.stringify(payload, null, 2)); if (!payload.comment.user?.login) { throw new Error("Missing User Login from payload, cannot check for collaborator status."); } - const { status } = await octokit.repos.checkCollaborator({ - username: payload.comment.user.login, - repo: payload.repository.name, - owner: payload.repository.owner.login, - }); - console.log("status", status); - if (status !== 204) { - await context.logger.fatal(`User ${payload.comment.user.name} cannot request user ${username} as it is not a collaborator.`); + try { + await octokit.repos.checkCollaborator({ + username: payload.comment.user.login, + repo: payload.repository.name, + owner: payload.repository.owner.login, + }); + } catch (e) { + console.log(JSON.stringify(e)); + if (!!e && typeof e === "object" && "statusCode" in e && e.statusCode === 404) { + await context.logger.fatal(`User ${payload.comment.user.name} cannot request user ${username} as it is not a collaborator. ${e}`); + } return false; } return true; From 7f15df7e994142e85eadbe32da8e1147de3c1f37 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 31 May 2024 10:02:05 +0900 Subject: [PATCH 54/56] chore: add try catch --- src/handlers/query-user.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index a48effb..a975176 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -13,10 +13,11 @@ async function checkUserAccess(context: Context, username: string) { }); } catch (e) { console.log(JSON.stringify(e)); - if (!!e && typeof e === "object" && "statusCode" in e && e.statusCode === 404) { + if (!!e && typeof e === "object" && "status" in e && e.status === 404) { await context.logger.fatal(`User ${payload.comment.user.name} cannot request user ${username} as it is not a collaborator. ${e}`); + return false; } - return false; + throw e; } return true; } From 0c58c30e33a5313a1e1eda2c323fd7cbf64f77d5 Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 31 May 2024 10:05:25 +0900 Subject: [PATCH 55/56] chore: fix log --- src/handlers/query-user.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index a975176..48f8c2b 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -14,7 +14,7 @@ async function checkUserAccess(context: Context, username: string) { } catch (e) { console.log(JSON.stringify(e)); if (!!e && typeof e === "object" && "status" in e && e.status === 404) { - await context.logger.fatal(`User ${payload.comment.user.name} cannot request user ${username} as it is not a collaborator. ${e}`); + await context.logger.fatal(`User @${payload.comment.user.login} cannot request user ${username} as it is not a collaborator.`); return false; } throw e; From 74913e642d1e1057c65eeee6a6060445bacc1e0a Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 31 May 2024 10:07:58 +0900 Subject: [PATCH 56/56] chore: removed debug --- src/handlers/query-user.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/handlers/query-user.ts b/src/handlers/query-user.ts index 48f8c2b..56b8dd4 100644 --- a/src/handlers/query-user.ts +++ b/src/handlers/query-user.ts @@ -12,7 +12,6 @@ async function checkUserAccess(context: Context, username: string) { owner: payload.repository.owner.login, }); } catch (e) { - console.log(JSON.stringify(e)); if (!!e && typeof e === "object" && "status" in e && e.status === 404) { await context.logger.fatal(`User @${payload.comment.user.login} cannot request user ${username} as it is not a collaborator.`); return false;