Spaces:
Runtime error
Runtime error
// src/oauth.ts | |
var TokenManager = class { | |
constructor() { | |
this.token = null; | |
const storedToken = localStorage.getItem("token"); | |
if (storedToken) { | |
this.token = storedToken; | |
} | |
} | |
setToken(token) { | |
this.token = token; | |
localStorage.setItem("token", token); | |
} | |
logout() { | |
this.token = null; | |
localStorage.removeItem("token"); | |
window.location.reload(); | |
} | |
getAccessToken() { | |
return this.token; | |
} | |
isAuthenticated() { | |
return this.token !== null; | |
} | |
}; | |
var tokenManager = new TokenManager(); | |
// src/main.ts | |
async function getOrganizationInfo(accessToken) { | |
const response = await fetch("https://huggingface.co/api/whoami-v2", { | |
headers: { | |
Authorization: `Bearer ${accessToken}` | |
} | |
}); | |
if (!response.ok) { | |
throw new Error( | |
`Failed to fetch organization info: ${response.statusText}` | |
); | |
} | |
return response.json(); | |
} | |
async function getOrganizationMembers(accessToken, organization) { | |
const response = await fetch( | |
`https://huggingface.co/api/organizations/${organization}/members`, | |
{ | |
headers: { | |
Authorization: `Bearer ${accessToken}` | |
} | |
} | |
); | |
if (!response.ok) { | |
throw new Error( | |
`Failed to fetch organization members: ${response.statusText}` | |
); | |
} | |
return response.json(); | |
} | |
async function createResourceGroup(accessToken, organization, name, members) { | |
const response = await fetch( | |
`https://huggingface.co/api/organizations/${organization}/resource-groups`, | |
{ | |
method: "POST", | |
headers: { | |
"Content-Type": "application/json", | |
Authorization: `Bearer ${accessToken}` | |
}, | |
body: JSON.stringify({ | |
name, | |
description: `Resource group for repository ${name}`, | |
users: members.map((member) => ({ | |
user: member.user, | |
role: "admin" | |
})) | |
}) | |
} | |
); | |
if (!response.ok) { | |
throw new Error(`Failed to create resource group: ${response.statusText}`); | |
} | |
} | |
async function createRepository(accessToken, name, organization, resourceGroupName) { | |
const response = await fetch("https://huggingface.co/api/repos/create", { | |
method: "POST", | |
headers: { | |
"Content-Type": "application/json", | |
Authorization: `Bearer ${accessToken}` | |
}, | |
body: JSON.stringify({ | |
type: "model", | |
name, | |
organization, | |
private: false | |
}) | |
}); | |
if (!response.ok) { | |
throw new Error(`Failed to create repository: ${response.statusText}`); | |
} | |
if (organization && resourceGroupName) { | |
const members = await getOrganizationMembers(accessToken, organization); | |
await createResourceGroup( | |
accessToken, | |
organization, | |
resourceGroupName, | |
members | |
); | |
} | |
} | |
var init = async () => { | |
if (tokenManager.isAuthenticated()) { | |
showAuthenticatedUI(); | |
} else { | |
showUnauthenticatedUI(); | |
} | |
}; | |
var showAuthenticatedUI = async () => { | |
const accessToken = tokenManager.getAccessToken(); | |
if (!accessToken) { | |
throw new Error("Access token not found"); | |
} | |
const tokenForm = document.getElementById("token-form"); | |
if (tokenForm) { | |
tokenForm.style.display = "none"; | |
} | |
const repoForm = document.getElementById("repo-form"); | |
const signoutButton = document.getElementById("signout"); | |
if (repoForm) { | |
repoForm.style.removeProperty("display"); | |
} | |
if (signoutButton) { | |
signoutButton.style.removeProperty("display"); | |
signoutButton.onclick = () => tokenManager.logout(); | |
} | |
const createRepoButton = document.getElementById("create-repo"); | |
const repoNameInput = document.getElementById( | |
"repo-name" | |
); | |
const resourceGroupInput = document.getElementById( | |
"resource-group-name" | |
); | |
const resourceGroupContainer = document.getElementById( | |
"resource-group-container" | |
); | |
if (createRepoButton && repoNameInput) { | |
createRepoButton.onclick = async () => { | |
const repoName = repoNameInput.value.trim(); | |
const orgSelect2 = document.getElementById( | |
"org-select" | |
); | |
if (repoName) { | |
try { | |
const selectedOrg = orgSelect2?.value || void 0; | |
const resourceGroupName = selectedOrg ? resourceGroupInput?.value.trim() : void 0; | |
console.log({ selectedOrg, resourceGroupName }); | |
await createRepository( | |
accessToken, | |
repoName, | |
selectedOrg, | |
resourceGroupName | |
); | |
repoNameInput.value = ""; | |
if (resourceGroupInput) { | |
resourceGroupInput.value = ""; | |
} | |
alert("Repository and resource group created successfully!"); | |
} catch (error) { | |
console.error("Failed to create repository:", error); | |
alert("Failed to create repository. Please try again."); | |
} | |
} | |
}; | |
} | |
const orgSelect = document.getElementById("org-select"); | |
if (orgSelect && resourceGroupContainer) { | |
orgSelect.onchange = () => { | |
if (orgSelect.value) { | |
resourceGroupContainer.style.removeProperty("display"); | |
} else { | |
resourceGroupContainer.style.display = "none"; | |
} | |
}; | |
} | |
try { | |
const orgInfo = await getOrganizationInfo(accessToken); | |
if (orgSelect && orgInfo.orgs) { | |
orgInfo.orgs.forEach((org) => { | |
const option = document.createElement("option"); | |
option.value = org.name; | |
option.textContent = org.name; | |
orgSelect.appendChild(option); | |
}); | |
} | |
const preElement = document.querySelector("pre"); | |
if (preElement) { | |
preElement.textContent = JSON.stringify(orgInfo, null, 2); | |
} | |
} catch (error) { | |
console.error("Failed to fetch organization info:", error); | |
} | |
}; | |
var showUnauthenticatedUI = () => { | |
const tokenForm = document.getElementById("token-form"); | |
const tokenInput = document.getElementById("token-input"); | |
const tokenSubmit = document.getElementById("token-submit"); | |
if (tokenForm && tokenInput && tokenSubmit) { | |
tokenForm.style.removeProperty("display"); | |
tokenSubmit.onclick = () => { | |
const token = tokenInput.value.trim(); | |
if (token) { | |
tokenManager.setToken(token); | |
showAuthenticatedUI(); | |
} | |
}; | |
} | |
const repoForm = document.getElementById("repo-form"); | |
const signoutButton = document.getElementById("signout"); | |
if (repoForm) { | |
repoForm.style.display = "none"; | |
} | |
if (signoutButton) { | |
signoutButton.style.display = "none"; | |
} | |
}; | |
init().catch(console.error); | |