{"version":3,"sources":["../src/PlumeURLError.ts","../src/PlumeURLREST.ts","../src/utils.ts","../src/PlumeURL.ts"],"sourcesContent":["export default class PlumeURLError extends Error {\n    public constructor(\n        message: string,\n        options?: ErrorOptions | undefined,\n        public res?: Response | null,\n    ) {\n        super(message, options);\n        this.res = res || null;\n    }\n}\n","import PlumeURLError from \"./PlumeURLError\";\n\nexport interface PlumeURLRESTOptions {\n    /**\n     * The API key to use.\n     */\n    apiKey?: string;\n    userAgent?: string;\n}\n\nexport default class PlumeURLREST {\n    public static readonly baseURL: string = \"https://url.sodiumlabs.xyz/api\";\n    public static readonly defaultUserAgent: string = \"plume-url.js\";\n\n    public constructor(public readonly options: PlumeURLRESTOptions = {}) {}\n\n    public async request(method: string, path: string, body?: object): Promise<Response> {\n        if (!path.startsWith(\"/\")) {\n            throw new Error(`Invalid path: ${path}`);\n        }\n\n        const headers = new Headers({\n            \"User-Agent\": `${PlumeURLREST.defaultUserAgent} ${this.options.userAgent || \"\"}`.trim(),\n        });\n        if (this.options.apiKey) {\n            headers.set(\"Authorization\", this.options.apiKey);\n        }\n        if (body) {\n            headers.append(\"Content-Type\", \"application/json\");\n        }\n\n        const url = `${PlumeURLREST.baseURL}${path}`;\n\n        let res;\n        try {\n            res = await fetch(url, { method, headers, body: body ? JSON.stringify(body) : undefined });\n        } catch (err) {\n            throw new PlumeURLError(`Failed to fetch ${url}`, { cause: err });\n        }\n\n        if (!res.ok) {\n            throw new PlumeURLError(`Invalid response ${url}: ${res.statusText}`, undefined, res);\n        }\n\n        return res;\n    }\n\n    public async get<T = unknown>(path: string): Promise<T> {\n        const res = await this.request(\"GET\", path);\n        return (await res.json()) as T;\n    }\n\n    public async post<T = unknown>(path: string, body?: object): Promise<T> {\n        const res = await this.request(\"POST\", path, body);\n        return (await res.json()) as T;\n    }\n}\n","/**\n * Encode a search params string.\n */\nexport const queryfy = (options: Record<string, unknown>): string => {\n    const params = new URLSearchParams(\n        Object.entries(options)\n            .filter(([, v]) => v !== undefined)\n            .map(([k, v]) => [k, `${v}`]),\n    );\n    const encoded = params.toString();\n    return encoded ? `?${encoded}` : \"\";\n};\n","import PlumeURLREST, { PlumeURLRESTOptions } from \"./PlumeURLREST\";\nimport { SearchURLOptions, SearchURLResults, URLData, CreateURLOptions, EditURLOptions } from \"./routes\";\nimport { queryfy } from \"./utils\";\n\nexport interface PlumeURLOptions extends PlumeURLRESTOptions {}\n\n/**\n * The client to interact with Plume URL.\n */\nexport default class PlumeURL {\n    public readonly rest: PlumeURLREST;\n\n    public constructor(options?: PlumeURLOptions) {\n        this.rest = new PlumeURLREST(options);\n    }\n\n    /**\n     * Create a new shortened URL.\n     */\n    public async createURL(options: CreateURLOptions): Promise<URLData> {\n        return await this.rest.post(\"/create\", options);\n    }\n\n    /**\n     * Search URLs.\n     */\n    public async search({ customId, limit, page, expired }: SearchURLOptions): Promise<SearchURLResults> {\n        const params = queryfy({ customId, limit, page, expired });\n        return await this.rest.get(`/search${params}`);\n    }\n\n    /**\n     * Get an URL.\n     */\n    public async getURL(id: string): Promise<URLData> {\n        return await this.rest.get(`/urls/${id}`);\n    }\n\n    /**\n     * Edit an URL.\n     */\n    public async editURL(id: string, options: EditURLOptions) {\n        await this.rest.request(\"PATCH\", `/urls/${id}`, options);\n    }\n\n    /**\n     * Delete an URL.\n     */\n    public async deleteURL(id: string) {\n        await this.rest.request(\"DELETE\", `/urls/${id}`);\n    }\n}\n"],"mappings":"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","names":[]}