import { HUB_URL } from "../consts"; import { createApiError } from "../error"; import type { ApiCreateRepoPayload } from "../types/api/api-create-repo"; import type { CredentialsParams, RepoDesignation, SpaceSdk } from "../types/public"; import { base64FromBytes } from "../utils/base64FromBytes"; import { checkCredentials } from "../utils/checkCredentials"; import { toRepoId } from "../utils/toRepoId"; export async function createRepo( params: { repo: RepoDesignation; /** * If unset, will follow the organization's default setting. (typically public, except for some Enterprise organizations) */ private?: boolean; license?: string; /** * Only a few lightweight files are supported at repo creation */ files?: Array<{ content: ArrayBuffer | Blob; path: string }>; /** @required for when {@link repo.type} === "space" */ sdk?: SpaceSdk; hubUrl?: string; /** * Custom fetch function to use instead of the default one, for example to use a proxy or edit headers. */ fetch?: typeof fetch; } & CredentialsParams ): Promise<{ repoUrl: string }> { const accessToken = checkCredentials(params); const repoId = toRepoId(params.repo); const [namespace, repoName] = repoId.name.split("/"); if (!namespace || !repoName) { throw new TypeError( `"${repoId.name}" is not a fully qualified repo name. It should be of the form "{namespace}/{repoName}".` ); } const res = await (params.fetch ?? fetch)(`${params.hubUrl ?? HUB_URL}/api/repos/create`, { method: "POST", body: JSON.stringify({ name: repoName, private: params.private, organization: namespace, license: params.license, ...(repoId.type === "space" ? { type: "space", sdk: "static", } : { type: repoId.type, }), files: params.files ? await Promise.all( params.files.map(async (file) => ({ encoding: "base64", path: file.path, content: base64FromBytes( new Uint8Array(file.content instanceof Blob ? await file.content.arrayBuffer() : file.content) ), })) ) : undefined, } satisfies ApiCreateRepoPayload), headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!res.ok) { throw await createApiError(res); } const output = await res.json(); return { repoUrl: output.url }; }