From 76af3a0b4efa380b0d495c2532a308123902d074 Mon Sep 17 00:00:00 2001 From: Mentlegen <9807008+gentlementlegen@users.noreply.github.com> Date: Fri, 12 Jul 2024 13:59:04 +0900 Subject: [PATCH] feat: manifest is now read and cached from the target repo --- bun.lockb | Bin 288957 -> 288553 bytes package.json | 6 +-- src/github/handlers/help-command.ts | 37 +++------------ src/github/handlers/index.ts | 9 +--- src/github/types/plugin-configuration.ts | 2 +- src/github/utils/config.ts | 22 +++++---- src/github/utils/plugins.ts | 55 +++++++++++++++++++++++ src/types/manifest.ts | 6 +-- 8 files changed, 83 insertions(+), 54 deletions(-) create mode 100644 src/github/utils/plugins.ts diff --git a/bun.lockb b/bun.lockb index 6b04d5217b26a2feb1978d22539e87ab3fa0e693..7ed8c7bceada2889015f1b258665134f99216995 100644 GIT binary patch delta 52400 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

P!O6odo#V91z$q5IY(0i^-o1m^~R#D)5_W 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 diff --git a/package.json b/package.json index d8e556a..84199e4 100644 --- a/package.json +++ b/package.json @@ -37,12 +37,12 @@ "dependencies": { "@octokit/auth-app": "7.1.0", "@octokit/core": "6.1.2", - "@octokit/plugin-paginate-rest": "11.3.0", - "@octokit/plugin-rest-endpoint-methods": "13.2.1", + "@octokit/plugin-paginate-rest": "11.3.3", + "@octokit/plugin-rest-endpoint-methods": "13.2.4", "@octokit/plugin-retry": "7.1.1", "@octokit/plugin-throttling": "9.3.0", "@octokit/types": "13.5.0", - "@octokit/webhooks": "13.2.7", + "@octokit/webhooks": "13.2.8", "@octokit/webhooks-types": "7.5.1", "@sinclair/typebox": "0.32.33", "dotenv": "16.4.5", diff --git a/src/github/handlers/help-command.ts b/src/github/handlers/help-command.ts index 561b892..8d36ec9 100644 --- a/src/github/handlers/help-command.ts +++ b/src/github/handlers/help-command.ts @@ -1,12 +1,13 @@ import { getConfig } from "../utils/config"; -import { GithubPlugin, isGithubPlugin } from "../types/plugin-configuration"; +import { GithubPlugin } from "../types/plugin-configuration"; import { GitHubContext } from "../github-context"; -import { Manifest, manifestSchema, manifestValidator } from "../../types/manifest"; +import { manifestSchema, manifestValidator } from "../../types/manifest"; import { Value } from "@sinclair/typebox/value"; +import { getManifest } from "../utils/plugins"; async function parseCommandsFromManifest(context: GitHubContext<"issue_comment.created">, plugin: string | GithubPlugin) { const commands: string[] = []; - const manifest = await (isGithubPlugin(plugin) ? fetchActionManifest(context, plugin) : fetchWorkerManifest(plugin)); + const manifest = await getManifest(context, plugin); if (manifest) { Value.Default(manifestSchema, manifest); const errors = manifestValidator.testReturningErrors(manifest); @@ -18,7 +19,7 @@ async function parseCommandsFromManifest(context: GitHubContext<"issue_comment.c } else { if (manifest?.commands) { for (const [key, value] of Object.entries(manifest.commands)) { - commands.push(`| \`/${getContent(key)}\` | ${getContent(value.description)} | \`${getContent(value["ubiquity:example"])}\` |`); + commands.push(`| \`/${getContent(key)}\` | ${getContent(value.description)} | \`${getContent(value["ubiquibot:example"])}\` |`); } } } @@ -55,31 +56,3 @@ export async function postHelpCommand(context: GitHubContext<"issue_comment.crea function getContent(content: string | undefined) { return content ? content.replace("|", "\\|") : "-"; } - -async function fetchActionManifest(context: GitHubContext<"issue_comment.created">, { owner, repo }: GithubPlugin): Promise { - try { - const { data } = await context.octokit.repos.getContent({ - owner, - repo, - path: "manifest.json", - }); - if ("content" in data) { - const content = Buffer.from(data.content, "base64").toString(); - return JSON.parse(content); - } - } catch (e) { - console.warn(`Could not find a manifest for ${owner}/${repo}: ${e}`); - } - return null; -} - -async function fetchWorkerManifest(url: string): Promise { - const manifestUrl = `${url}/manifest.json`; - try { - const result = await fetch(manifestUrl); - return await result.json(); - } catch (e) { - console.warn(`Could not find a manifest for ${manifestUrl}: ${e}`); - } - return null; -} diff --git a/src/github/handlers/index.ts b/src/github/handlers/index.ts index 44835fa..3cd3635 100644 --- a/src/github/handlers/index.ts +++ b/src/github/handlers/index.ts @@ -7,6 +7,7 @@ import { repositoryDispatch } from "./repository-dispatch"; import { dispatchWorker, dispatchWorkflow, getDefaultBranch } from "../utils/workflow-dispatch"; import { PluginInput } from "../types/plugin"; import { isGithubPlugin, PluginConfiguration } from "../types/plugin-configuration"; +import { getPluginsForEvent } from "../utils/plugins"; function tryCatchWrapper(fn: (event: EmitterWebhookEvent) => unknown) { return async (event: EmitterWebhookEvent) => { @@ -57,13 +58,7 @@ async function handleEvent(event: EmitterWebhookEvent, eventHandler: InstanceTyp return; } - const pluginChains = config.plugins.filter((plugin) => { - console.log("Plugin runs on", plugin.name, plugin.runsOn); - if (plugin.runsOn) { - return plugin.runsOn.includes(event.name); - } - return false; - }); + const pluginChains = getPluginsForEvent(config.plugins, event.key); if (pluginChains.length === 0) { console.log(`No handler found for event ${event.name}`); diff --git a/src/github/types/plugin-configuration.ts b/src/github/types/plugin-configuration.ts index 31c80ad..98f4e5d 100644 --- a/src/github/types/plugin-configuration.ts +++ b/src/github/types/plugin-configuration.ts @@ -51,6 +51,7 @@ const pluginChainSchema = T.Array( id: T.Optional(T.String()), plugin: githubPluginType(), with: T.Record(T.String(), T.Unknown(), { default: {} }), + runsOn: T.Optional(T.Array(runEvent, { default: [] })), }), { minItems: 1, default: [] } ); @@ -65,7 +66,6 @@ const handlerSchema = T.Array( example: T.Optional(T.String()), uses: pluginChainSchema, skipBotEvents: T.Boolean({ default: true }), - runsOn: T.Optional(T.Array(runEvent, { default: [] })), }), { default: [] } ); diff --git a/src/github/utils/config.ts b/src/github/utils/config.ts index c3a563a..214b1b6 100644 --- a/src/github/utils/config.ts +++ b/src/github/utils/config.ts @@ -4,6 +4,7 @@ import { GitHubContext } from "../github-context"; import { expressionRegex } from "../types/plugin"; import { configSchema, configSchemaValidator, PluginConfiguration } from "../types/plugin-configuration"; import { eventNames } from "../types/webhook-events"; +import { getManifest, getPluginsForEvent } from "./plugins"; const UBIQUIBOT_CONFIG_FULL_PATH = ".github/.ubiquibot-config.yml"; const UBIQUIBOT_CONFIG_ORG_REPO = "ubiquibot-config"; @@ -39,11 +40,8 @@ async function getConfigurationFromRepo(context: GitHubContext, repository: stri */ function mergeConfigurations(configuration1: PluginConfiguration, configuration2: PluginConfiguration): PluginConfiguration { const mergedConfiguration = { ...configuration1 }; - for (const key of Object.keys(configuration2.plugins)) { - const pluginKey = key as keyof PluginConfiguration["plugins"]; - if (configuration2.plugins[pluginKey]?.length) { - mergedConfiguration.plugins[pluginKey] = configuration2.plugins[pluginKey]; - } + if (configuration2.plugins?.length) { + mergedConfiguration.plugins = configuration2.plugins; } return mergedConfiguration; } @@ -75,12 +73,20 @@ export async function getConfig(context: GitHubContext): Promise(); for (const use of plugin.uses) { if (!use.id) continue; @@ -101,7 +107,7 @@ function checkPluginChainUniqueIds(plugin: PluginConfiguration["plugins"]["*"][0 return allIds; } -function checkPluginChainExpressions(plugin: PluginConfiguration["plugins"]["*"][0], allIds: Set) { +function checkPluginChainExpressions(plugin: PluginConfiguration["plugins"][0], allIds: Set) { const calledIds = new Set(); for (const use of plugin.uses) { if (!use.id) continue; diff --git a/src/github/utils/plugins.ts b/src/github/utils/plugins.ts new file mode 100644 index 0000000..e0ba200 --- /dev/null +++ b/src/github/utils/plugins.ts @@ -0,0 +1,55 @@ +import { GithubPlugin, isGithubPlugin, PluginConfiguration } from "../types/plugin-configuration"; +import { EmitterWebhookEventName } from "@octokit/webhooks"; +import { GitHubContext } from "../github-context"; +import { Manifest } from "../../types/manifest"; + +const _manifestCache: Record = {}; + +export function getPluginsForEvent(plugins: PluginConfiguration["plugins"], event: EmitterWebhookEventName) { + return plugins.filter((plugin) => { + return plugin.uses?.[0].runsOn?.includes(event); + }); +} + +export function getManifest(context: GitHubContext, plugin: string | GithubPlugin) { + return isGithubPlugin(plugin) ? fetchActionManifest(context, plugin) : fetchWorkerManifest(plugin); +} + +async function fetchActionManifest(context: GitHubContext<"issue_comment.created">, { owner, repo }: GithubPlugin): Promise { + const manifestKey = `${owner}:${repo}`; + if (_manifestCache[manifestKey]) { + return _manifestCache[manifestKey]; + } + try { + const { data } = await context.octokit.repos.getContent({ + owner, + repo, + path: "manifest.json", + }); + if ("content" in data) { + const content = Buffer.from(data.content, "base64").toString(); + const manifest = JSON.parse(content) as Manifest; + _manifestCache[manifestKey] = manifest; + return manifest; + } + } catch (e) { + console.warn(`Could not find a manifest for ${owner}/${repo}: ${e}`); + } + return null; +} + +async function fetchWorkerManifest(url: string): Promise { + if (_manifestCache[url]) { + return _manifestCache[url]; + } + const manifestUrl = `${url}/manifest.json`; + try { + const result = await fetch(manifestUrl); + const manifest = (await result.json()) as Manifest; + _manifestCache[url] = manifest; + return manifest; + } catch (e) { + console.warn(`Could not find a manifest for ${manifestUrl}: ${e}`); + } + return null; +} diff --git a/src/types/manifest.ts b/src/types/manifest.ts index 49a896c..2c9aa19 100644 --- a/src/types/manifest.ts +++ b/src/types/manifest.ts @@ -1,19 +1,19 @@ import { type Static, Type as T } from "@sinclair/typebox"; import { StandardValidator } from "typebox-validators"; -import { emitterEventNames } from "@octokit/webhooks/dist-types/generated/webhook-names"; +import { emitterEventNames } from "@octokit/webhooks"; export const runEvent = T.Union(emitterEventNames.map((o) => T.Literal(o))); export const commandSchema = T.Object({ description: T.String({ minLength: 1 }), - "ubiquity:example": T.String({ minLength: 1 }), + "ubiquibot:example": T.String({ minLength: 1 }), }); export const manifestSchema = T.Object({ name: T.String({ minLength: 1 }), description: T.String({ minLength: 1 }), commands: T.Record(T.String(), commandSchema), - "ubiquity:runsOn": T.Optional(T.Array(runEvent, { default: [] })), + "ubiquibot:listeners": T.Optional(T.Array(runEvent, { default: [] })), }); export const manifestValidator = new StandardValidator(manifestSchema);