Skip to content
This repository has been archived by the owner on Dec 21, 2024. It is now read-only.

Commit

Permalink
feat(backend): allow specifying registry with "github" shorthand & ad…
Browse files Browse the repository at this point in the history
…d default local registry (#389)
  • Loading branch information
NathanFlurry committed Sep 12, 2024
1 parent 21ff88f commit 6daed07
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 34 deletions.
34 changes: 22 additions & 12 deletions packages/backend/toolchain/config/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand All @@ -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({
Expand Down Expand Up @@ -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<typeof ProjectConfigSchema>;
Expand All @@ -82,8 +90,10 @@ export type RegistryConfig = z.infer<typeof RegistryConfigSchema>;
export type RegistryConfigLocal = z.infer<typeof RegistryLocalConfigSchema>["local"];

export type RegistryConfigGit = z.infer<typeof RegistryGitConfigSchema>["git"];
export type RegistryConfigGitHub = z.infer<typeof RegistryGitHubConfigSchema>["github"];

export type RegistryConfigGitUrl = z.infer<typeof RegistryGitUrlConfigSchema>;
export type RegistryGitRef = z.infer<typeof RegistryGitRefSchema>;

export type ProjectModuleConfig = z.infer<typeof ProjectModuleConfigSchema>;

Expand Down
22 changes: 14 additions & 8 deletions packages/backend/toolchain/project/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
35 changes: 28 additions & 7 deletions packages/backend/toolchain/project/registry.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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);
Expand All @@ -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",
},
Expand All @@ -68,6 +76,19 @@ export async function loadDefaultRegistry(projectRoot: string, signal?: AbortSig
);
}

export async function loadLocalRegistry(projectRoot: string, signal?: AbortSignal): Promise<Registry> {
return await loadRegistry(
projectRoot,
"local",
{
local: {
directory: "./modules"
},
},
signal,
);
}

interface ResolveRegistryOutput {
path: string;
isExternal: boolean;
Expand Down
7 changes: 0 additions & 7 deletions packages/backend/toolchain/template/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: {},
Expand Down

0 comments on commit 6daed07

Please sign in to comment.