pesde/website/src/lib/registry-api.ts
Luka f0d04fc87c
feat: website
* feat(website): init

* feat(website): home page

* feat(website): make page more responsive

* feat(website): layout

* feat(website): package page

* feat(website): update PackageResponse type

* feat(website): display package readme

* feat(website): use new /latest/any endpoint

* feat(website): make website lg instead of xl

* fix(website): use NodeJS.Timeout

* feat(website): versions page

* feat(website): add latest version indicator

* feat(website): add target select menu

* feat(website): indicate current version

* feat(website): add package metadata

* feat(website): add hamburger

* fix(website): header responsiveness

* feat(website): better package layout

* feat(website): display authors on package page

* fix(website): only display relative dates on client

* feat(docs): init docs site

* chore(website): read .env from project root

* feat(website): add gemoji support

* fix(website): overflow on code blocks

* chore(docs): read .env from project root

* feat(docs): config changes

* fix: authors not displaying

* fix(website): use fallback language

* refactor(website): use predefined target names

* refactor(website): change Github to GitHub

* chore: remove starter readmes

* chore(docs): remove .vscode

* chore(docs): remove unused assets folder

* fix(website): fix missing datetime attribute

* feat(website): switch to universal loaders

* feat(docs): search

* fix(website): type errors

* fix(website): use provided fetch instead of global

* feat(website): remove isr

* chore(website): add .env.example

* feat(website): add icons and metadata

* chore(website): add debug logs

* chore(website): remove shiki temporarily

* fix(website): rehype shiki lazy load

* fix(website): use custom highlighter

* fix(website): move highlighter creation into load

* docs: write docs

* feat(website): add og image

* feat(website): fix accessibility issues

* fix(website): no target selector on mobile

* fix(website): close dialog on navigation

* fix(website): logo is not a link in hamburger menu

* feat(website): dependencies tab

* fix(website): use correct dependency target

* fix(website): navigation links

* feat(website): support wally dependencies

* feat(website): metadata + case insensitivity

* fix(website): manually implement groupBy

`Object.groupBy` isn't supported on Vercel right now.

* fix(website): code block with an unknown language

* docs(policies): explain & cover more cases

* docs: update cli reference

* docs: add self hosting registries guide

* docs: update README

* docs: add more configs to registry guide

* fix: favicon and logomark

* feat(website): package documentation

* fix(website): missing $derive for toc

* docs: change SENTRY_URL to SENTRY_DSN

* chore(website): remove unused file

* chore: remove favicon.zip

* fix(website): strip wally# prefix

* chore: add changelog entry

---------

Co-authored-by: daimond113 <72147841+daimond113@users.noreply.github.com>
2024-10-29 20:06:00 +01:00

106 lines
2.2 KiB
TypeScript

import { PUBLIC_REGISTRY_URL } from "$env/static/public"
export type SearchResponse = {
count: number
data: PackageResponse[]
}
export type PackageVersionsResponse = PackageResponse[]
export type PackageVersionResponse = PackageResponse
export type PackageResponse = {
name: string
version: string
targets: TargetInfo[]
description: string
published_at: string
license?: string
authors?: string[]
repository?: string
dependencies: Record<string, DependencyEntry>
docs?: DocEntry[]
}
export type TargetInfo = {
kind: TargetKind
lib: boolean
bin: boolean
}
export type TargetKind = "roblox" | "roblox_server" | "lune" | "luau"
export type DependencyEntry = [DependencyInfo, DependencyKind]
export type DependencyInfo =
| {
index: string
name: string
target?: string
version: string
}
| {
index: string
wally: string
version: string
}
export type DependencyKind = "standard" | "peer" | "dev"
export type DocEntry = DocEntryCategory | DocEntryPage
export type DocEntryBase = {
label: string
position: number
}
export type DocEntryCategory = DocEntryBase & {
items?: DocEntry[]
collapsed?: boolean
}
export type DocEntryPage = DocEntryBase & {
name: string
hash: string
}
export const TARGET_KIND_DISPLAY_NAMES: Record<TargetKind, string> = {
roblox: "Roblox",
roblox_server: "Roblox (server)",
lune: "Lune",
luau: "Luau",
}
export const DEPENDENCY_KIND_DISPLAY_NAMES: Record<DependencyKind, string> = {
standard: "Dependencies",
peer: "Peer Dependencies",
dev: "Dev Dependencies",
}
export class RegistryHttpError extends Error {
name = "RegistryError"
constructor(
message: string,
public response: Response,
) {
super(message)
}
}
export async function fetchRegistryJson<T>(
path: string,
fetcher: typeof fetch,
options?: RequestInit,
): Promise<T> {
const response = await fetchRegistry(path, fetcher, options)
return response.json()
}
export async function fetchRegistry(path: string, fetcher: typeof fetch, options?: RequestInit) {
const response = await fetcher(new URL(path, PUBLIC_REGISTRY_URL), options)
if (!response.ok) {
throw new RegistryHttpError(`Failed to fetch ${response.url}: ${response.statusText}`, response)
}
return response
}