From 6daed07b6d32be0d4deeb0504654b8b66dd3d63f Mon Sep 17 00:00:00 2001 From: NathanFlurry Date: Thu, 12 Sep 2024 20:09:25 +0000 Subject: [PATCH] feat(backend): allow specifying registry with "github" shorthand & add default local registry (#389) --- packages/backend/toolchain/config/project.ts | 34 +++++++++++------- packages/backend/toolchain/project/project.ts | 22 +++++++----- .../backend/toolchain/project/registry.ts | 35 +++++++++++++++---- .../backend/toolchain/template/project.ts | 7 ---- 4 files changed, 64 insertions(+), 34 deletions(-) diff --git a/packages/backend/toolchain/config/project.ts b/packages/backend/toolchain/config/project.ts index 17a62da6..2896b54d 100644 --- a/packages/backend/toolchain/config/project.ts +++ b/packages/backend/toolchain/config/project.ts @@ -10,10 +10,11 @@ const RegistryGitUrlConfigSchema = z.union([z.string(), z.object({ https: z.stri "The URL to the git repository. If both HTTPS and SSH URL are provided, they will both be tried and use the one that works", ); -const RegistryGitCommonConfigSchema = z.object({ - url: RegistryGitUrlConfigSchema, - directory: z.string().optional(), -}); +const RegistryGitRefSchema = z.union([ + z.object({ branch: z.string() }), + z.object({ tag: z.string() }), + z.object({ rev: z.string() }), +]); const RegistryLocalConfigSchema = z.object({ local: z.object({ @@ -25,16 +26,23 @@ const RegistryLocalConfigSchema = z.object({ }); const RegistryGitConfigSchema = z.object({ - git: z.union([ - RegistryGitCommonConfigSchema.merge(z.object({ branch: z.string() })), - RegistryGitCommonConfigSchema.merge(z.object({ tag: z.string() })), - RegistryGitCommonConfigSchema.merge(z.object({ rev: z.string() })), - ]), + git: z.object({ + url: RegistryGitUrlConfigSchema, + directory: z.string().optional(), + }).and(RegistryGitRefSchema) +}); + +const RegistryGitHubConfigSchema = z.object({ + github: z.object({ + repository: RegistryGitUrlConfigSchema, + directory: z.string().optional(), + }).and(RegistryGitRefSchema) }); const RegistryConfigSchema = z.union([ RegistryLocalConfigSchema, RegistryGitConfigSchema, + RegistryGitHubConfigSchema, ]); const CorsConfigSchema = z.object({ @@ -70,10 +78,10 @@ const ProjectModuleConfigSchema = z.object({ export const ProjectConfigSchema = z.object({ extends: z.string().optional().describe("Extends a different project config."), - registries: z.record(RegistryConfigSchema).default(() => ({})), - modules: z.record(ProjectModuleConfigSchema).default(() => ({})), + registries: z.record(RegistryConfigSchema).optional(), + modules: z.record(ProjectModuleConfigSchema), runtime: RuntimeConfigSchema.optional(), - sdks: z.array(SdkConfigSchema).optional(), + sdks: z.array(SdkConfigSchema).optional(), }); export type ProjectConfig = z.infer; @@ -82,8 +90,10 @@ export type RegistryConfig = z.infer; export type RegistryConfigLocal = z.infer["local"]; export type RegistryConfigGit = z.infer["git"]; +export type RegistryConfigGitHub = z.infer["github"]; export type RegistryConfigGitUrl = z.infer; +export type RegistryGitRef = z.infer; export type ProjectModuleConfig = z.infer; diff --git a/packages/backend/toolchain/project/project.ts b/packages/backend/toolchain/project/project.ts index 543fa76e..1655de02 100644 --- a/packages/backend/toolchain/project/project.ts +++ b/packages/backend/toolchain/project/project.ts @@ -59,20 +59,26 @@ export async function loadProject(opts: LoadProjectOpts, signal?: AbortSignal): // Load registries const registries = new Map(); - for (const [registryName, registryConfig] of Object.entries(projectConfig.registries)) { - const registry = await loadRegistry( - projectRoot, - registryName, - registryConfig, - signal, - ); - registries.set(registryName, registry); + if (projectConfig.registries) { + for (const [registryName, registryConfig] of Object.entries(projectConfig.registries)) { + const registry = await loadRegistry( + projectRoot, + registryName, + registryConfig, + signal, + ); + registries.set(registryName, registry); + } } if (!registries.has("default")) { const defaultRegistry = await loadDefaultRegistry(projectRoot, signal); registries.set("default", defaultRegistry); } + if (!registries.has("local")) { + const localRegistry = await loadDefaultRegistry(projectRoot, signal); + registries.set("local", localRegistry); + } // Validate local registry const localRegistry = registries.get("local"); diff --git a/packages/backend/toolchain/project/registry.ts b/packages/backend/toolchain/project/registry.ts index 2f19926b..a68d87d2 100644 --- a/packages/backend/toolchain/project/registry.ts +++ b/packages/backend/toolchain/project/registry.ts @@ -1,6 +1,6 @@ -import { emptyDir, exists } from "@std/fs"; +import { emptyDir, exists, walk } from "@std/fs"; import { resolve } from "@std/path"; -import { RegistryConfig, RegistryConfigGit, RegistryConfigLocal } from "../config/project.ts"; +import { RegistryConfig, RegistryConfigGit, RegistryConfigLocal, RegistryGitRef } from "../config/project.ts"; import { progress, warn } from "../term/status.ts"; import { UnreachableError, UserError } from "../error/mod.ts"; import { CommandError } from "../error/mod.ts"; @@ -37,6 +37,17 @@ export async function loadRegistry( output = await resolveRegistryLocal(projectRoot, name, config.local); } else if ("git" in config) { output = await resolveRegistryGit(projectRoot, name, config.git, signal); + } else if ("github" in config) { + const gitConfig: RegistryConfigGit = { + ...config.github, + url: { + https: `https://github.com/${config.github}.git`, + ssh: `git@github.com:${config.github}.git`, + }, + directory: config.github.directory, + }; + + output = await resolveRegistryGit(projectRoot, name, gitConfig, signal); } else { // Unknown project config throw new UnreachableError(config); @@ -55,11 +66,8 @@ export async function loadDefaultRegistry(projectRoot: string, signal?: AbortSig projectRoot, "default", { - git: { - url: { - https: "https://github.com/rivet-gg/modules.git", - ssh: "git@github.com:rivet-gg/modules.git", - }, + github: { + repository: "rivet-gg/modules", rev: registryDefaultReg, directory: "./modules", }, @@ -68,6 +76,19 @@ export async function loadDefaultRegistry(projectRoot: string, signal?: AbortSig ); } +export async function loadLocalRegistry(projectRoot: string, signal?: AbortSignal): Promise { + return await loadRegistry( + projectRoot, + "local", + { + local: { + directory: "./modules" + }, + }, + signal, + ); +} + interface ResolveRegistryOutput { path: string; isExternal: boolean; diff --git a/packages/backend/toolchain/template/project.ts b/packages/backend/toolchain/template/project.ts index cf3d098c..8f82cd2d 100644 --- a/packages/backend/toolchain/template/project.ts +++ b/packages/backend/toolchain/template/project.ts @@ -6,13 +6,6 @@ export async function templateProject(rootPath: string) { // Create rivet.json const defaultBackend: ProjectConfig = { - registries: { - local: { - local: { - directory: "modules", - }, - }, - }, modules: { rate_limit: {}, tokens: {},