import type { env as publicEnv } from "$env/dynamic/public"; import { page } from "$app/state"; import { base } from "$app/paths"; import type { Transporter } from "@sveltejs/kit"; import { getContext } from "svelte"; type PublicConfigKey = keyof typeof publicEnv; class PublicConfigManager { #configStore = $state>({}); constructor(initialConfig?: Record) { this.init = this.init.bind(this); this.getPublicConfig = this.getPublicConfig.bind(this); if (initialConfig) { this.init(initialConfig); } } init(publicConfig: Record) { this.#configStore = publicConfig; } get(key: PublicConfigKey) { return this.#configStore[key]; } getPublicConfig() { return this.#configStore; } get isHuggingChat() { return this.#configStore.PUBLIC_APP_ASSETS === "huggingchat"; } get assetPath() { return ( (this.#configStore.PUBLIC_ORIGIN || page.url.origin) + base + "/" + this.#configStore.PUBLIC_APP_ASSETS ); } } type ConfigProxy = PublicConfigManager & { [K in PublicConfigKey]: string }; export function getConfigManager(initialConfig?: Record) { const publicConfigManager = new PublicConfigManager(initialConfig); const publicConfig: ConfigProxy = new Proxy(publicConfigManager, { get(target, prop) { if (prop in target) { return Reflect.get(target, prop); } if (typeof prop === "string") { return target.get(prop as PublicConfigKey); } return undefined; }, set(target, prop, value, receiver) { if (prop in target) { return Reflect.set(target, prop, value, receiver); } return false; }, }) as ConfigProxy; return publicConfig; } export const publicConfigTransporter: Transporter = { encode: (value) => value instanceof PublicConfigManager ? JSON.stringify(value.getPublicConfig()) : false, decode: (value) => getConfigManager(JSON.parse(value)), }; export const usePublicConfig = () => getContext("publicConfig");