diff --git a/packages/poster/dts/index.d.ts b/packages/poster/dts/index.d.ts index d7b271d..3ec9d55 100644 --- a/packages/poster/dts/index.d.ts +++ b/packages/poster/dts/index.d.ts @@ -16,30 +16,31 @@ type GuildEdit = paths["/applications/{application_id}/guilds/{guild_id}/command type GuildDelete = paths["/applications/{application_id}/guilds/{guild_id}/commands/{command_id}"]["delete"] type GuildPut = paths["/applications/{application_id}/guilds/{guild_id}/commands"]["put"] -type AnyRoute = - | GlobalGetAll - | GlobalGet - | GlobalPost - | GlobalEdit - | GlobalPut - | GlobalDelete - | GuildPost - | GuildGet - | GuildEdit - | GuildDelete - | GuildPut; +//We create a discriminating union to ensure Responses are typed correctly +//type AnyRoute = +// | GlobalGetAll & { type: "global/get-all" } +// | GlobalGet & { type: "global/get" } +// | GlobalPost & { type: "global/post" } +// | GlobalEdit & { type: "global/edit" } +// | GlobalPut & { type: "global/put" } +// | GlobalDelete & { type: "global/delete" } +// | GuildPost & { type: "global/post" } +// | GuildGet & { type: "global/x" } +// | GuildEdit & { type: "global/get" } +// | GuildDelete & { type: "global/delete" } +// | GuildPut & { type: "global/put" }; interface RoutesOptions { - "global/get-all": []; - "global/get": [GlobalGet["parameters"]["path"] & { application_id?: never }]; + "global/get-all": [GlobalGetAll['parameters']]; + "global/get": [GlobalGet["parameters"]["path"] & { application_id?: never }]; "global/post": [{ body: GlobalPost["requestBody"]["content"]['application/json'] } & GlobalPost["parameters"]["path"] & { application_id?: never }]; "global/edit": [{ body: GlobalEdit["requestBody"]["content"]['application/json']} & GlobalEdit["parameters"]["path"] & { application_id?: never }]; - "global/put": [{ body: GlobalPut["requestBody"]["content"]['application/json']} + "global/put": [{ body: GlobalPut["requestBody"]["content"]['application/json']} & GlobalPut["parameters"]['path'] & { application_id?: never } ]; "global/delete": []; @@ -55,12 +56,17 @@ interface RoutesOptions { & { application_id?: never }]; } -interface TypedResponse extends Response { - body?: { } & AnyRoute['responses'] -} +//interface TypedResponse extends Response { +// /** +// * Please do not use `.type` in runtime. It is merely a way to get accurate typings +// * It does not exist in runtime. +// */ +// json(): ({ type: T } & AnyRoute)['responses'] +//} interface Send { - (command : T, ...opts: RoutesOptions[T]): Promise + + (command : T, ...opts: RoutesOptions[T]): Promise } export default function (token: string, appid: string): Send; diff --git a/packages/poster/shadow-cljs.edn b/packages/poster/shadow-cljs.edn index a355731..fba4c18 100644 --- a/packages/poster/shadow-cljs.edn +++ b/packages/poster/shadow-cljs.edn @@ -9,6 +9,5 @@ {:poster {:target :node-library :output-to "dist/index.js" :exports-var core.poster/poster - :build-hooks - [(dev.mv/hook 1 2 3)] + :build-hooks [(dev.mv/hook 1 2 3)] }}} diff --git a/packages/poster/src/core/actions.cljs b/packages/poster/src/core/actions.cljs index 65d59fe..70cc521 100644 --- a/packages/poster/src/core/actions.cljs +++ b/packages/poster/src/core/actions.cljs @@ -16,7 +16,7 @@ :guild/put ["PUT" "/applications/{application.id}/guilds/{guild.id}/commands"] }) -(defn request-init [spec] +(defn- request-init [spec] (let [[method url] (routes spec)] [url (fn [body headers] #js { "method" method @@ -24,7 +24,7 @@ "body" (.stringify js/JSON body )}) ])) -(defn keyword->str [ky] +(defn- keyword->str [ky] (subs (str ky) 1)) (def actions (into {} diff --git a/packages/poster/src/core/poster.cljs b/packages/poster/src/core/poster.cljs index 8e604c2..e74ba5a 100644 --- a/packages/poster/src/core/poster.cljs +++ b/packages/poster/src/core/poster.cljs @@ -2,20 +2,28 @@ (:require [clojure.string :refer [replace]] [core.actions :refer [actions]])) -(def base-url "https://discord.com/api/v10/applications") +(def base-url "https://discord.com/api/v10") -(defn processed-url [remaining-url opts] +(defn- inject [remaining-url opts] (-> (str base-url remaining-url) (replace #"\{application\.id\}" (.-app_id ^js opts)) (replace #"\{guild\.id\}" (.-guild_id ^js opts)) (replace #"\{command\.id\}" (.-command_id ^js opts)))) +(defn ?params [^js query] + (new js/URLSearchParams query)) + (defn poster [token, appid] (let [header #js{ "Content-Type" "application/json" "Authorization" (str "Bot " token) }] (fn [action opts] (let [[url mkrequest] (actions action) - full-url (processed-url url #js{"app_id" appid - "guild_id" (.-guild_id ^js opts) - "command_id" (.-command_id ^js opts)})] - (js/fetch full-url (mkrequest (.-body ^js opts ) header)))))) + options #js{"app_id" appid + "guild_id" (.-guild_id ^js opts) + "command_id" (.-command_id ^js opts)} + url (new js/URL (inject url options))] + (set! (.-search url) (?params (.-query ^js opts))) + (js/fetch url (mkrequest (.-body ^js opts) header)))))) + + + diff --git a/packages/poster/test/spec.mjs b/packages/poster/test/spec.mjs index 2c21a04..6c1287b 100644 --- a/packages/poster/test/spec.mjs +++ b/packages/poster/test/spec.mjs @@ -3,8 +3,10 @@ import poster from '../dist/index.js'; const send = poster("token", "appid"); -const req = await send("global/get-all"); +const req = await send("global/get-all", { + +}); -console.log(req); +console.log(await req.json());