@discordkit/core 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/DiscordSession.d.ts +16 -0
- package/dist/cjs/DiscordSession.js +44 -0
- package/dist/cjs/DiscordSession.js.map +1 -0
- package/dist/cjs/addParams.d.ts +2 -0
- package/dist/cjs/addParams.js +15 -0
- package/dist/cjs/addParams.js.map +1 -0
- package/dist/cjs/buildURL.d.ts +1 -0
- package/dist/cjs/buildURL.js +8 -0
- package/dist/cjs/buildURL.js.map +1 -0
- package/dist/cjs/getAsset.d.ts +2 -0
- package/dist/cjs/getAsset.js +7 -0
- package/dist/cjs/getAsset.js.map +1 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +15 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/isNonNullable.d.ts +19 -0
- package/dist/cjs/isNonNullable.js +24 -0
- package/dist/cjs/isNonNullable.js.map +1 -0
- package/dist/cjs/isObject.d.ts +1 -0
- package/dist/cjs/isObject.js +6 -0
- package/dist/cjs/isObject.js.map +1 -0
- package/dist/cjs/methods.d.ts +9 -0
- package/dist/cjs/methods.js +16 -0
- package/dist/cjs/methods.js.map +1 -0
- package/dist/cjs/request.d.ts +2 -0
- package/dist/cjs/request.js +25 -0
- package/dist/cjs/request.js.map +1 -0
- package/dist/cjs/snowflake.d.ts +2 -0
- package/dist/cjs/snowflake.js +20 -0
- package/dist/cjs/snowflake.js.map +1 -0
- package/dist/cjs/toCamelCase.d.ts +1 -0
- package/dist/cjs/toCamelCase.js +6 -0
- package/dist/cjs/toCamelCase.js.map +1 -0
- package/dist/cjs/toCamelKeys.d.ts +2 -0
- package/dist/cjs/toCamelKeys.js +19 -0
- package/dist/cjs/toCamelKeys.js.map +1 -0
- package/dist/cjs/toProcedure.d.ts +35 -0
- package/dist/cjs/toProcedure.js +30 -0
- package/dist/cjs/toProcedure.js.map +1 -0
- package/dist/cjs/toQuery.d.ts +9 -0
- package/dist/cjs/toQuery.js +13 -0
- package/dist/cjs/toQuery.js.map +1 -0
- package/dist/cjs/toSnakeCase.d.ts +1 -0
- package/dist/cjs/toSnakeCase.js +8 -0
- package/dist/cjs/toSnakeCase.js.map +1 -0
- package/dist/cjs/toSnakeKeys.d.ts +2 -0
- package/dist/cjs/toSnakeKeys.js +19 -0
- package/dist/cjs/toSnakeKeys.js.map +1 -0
- package/dist/cjs/toValidated.d.ts +12 -0
- package/dist/cjs/toValidated.js +27 -0
- package/dist/cjs/toValidated.js.map +1 -0
- package/dist/esm/DiscordSession.d.ts +16 -0
- package/dist/esm/DiscordSession.js +40 -0
- package/dist/esm/DiscordSession.js.map +1 -0
- package/dist/esm/addParams.d.ts +2 -0
- package/dist/esm/addParams.js +11 -0
- package/dist/esm/addParams.js.map +1 -0
- package/dist/esm/buildURL.d.ts +1 -0
- package/dist/esm/buildURL.js +4 -0
- package/dist/esm/buildURL.js.map +1 -0
- package/dist/esm/getAsset.d.ts +2 -0
- package/dist/esm/getAsset.js +3 -0
- package/dist/esm/getAsset.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/isNonNullable.d.ts +19 -0
- package/dist/esm/isNonNullable.js +20 -0
- package/dist/esm/isNonNullable.js.map +1 -0
- package/dist/esm/isObject.d.ts +1 -0
- package/dist/esm/isObject.js +2 -0
- package/dist/esm/isObject.js.map +1 -0
- package/dist/esm/methods.d.ts +9 -0
- package/dist/esm/methods.js +8 -0
- package/dist/esm/methods.js.map +1 -0
- package/dist/esm/request.d.ts +2 -0
- package/dist/esm/request.js +21 -0
- package/dist/esm/request.js.map +1 -0
- package/dist/esm/snowflake.d.ts +2 -0
- package/dist/esm/snowflake.js +17 -0
- package/dist/esm/snowflake.js.map +1 -0
- package/dist/esm/toCamelCase.d.ts +1 -0
- package/dist/esm/toCamelCase.js +2 -0
- package/dist/esm/toCamelCase.js.map +1 -0
- package/dist/esm/toCamelKeys.d.ts +2 -0
- package/dist/esm/toCamelKeys.js +15 -0
- package/dist/esm/toCamelKeys.js.map +1 -0
- package/dist/esm/toProcedure.d.ts +35 -0
- package/dist/esm/toProcedure.js +26 -0
- package/dist/esm/toProcedure.js.map +1 -0
- package/dist/esm/toQuery.d.ts +9 -0
- package/dist/esm/toQuery.js +9 -0
- package/dist/esm/toQuery.js.map +1 -0
- package/dist/esm/toSnakeCase.d.ts +1 -0
- package/dist/esm/toSnakeCase.js +4 -0
- package/dist/esm/toSnakeCase.js.map +1 -0
- package/dist/esm/toSnakeKeys.d.ts +2 -0
- package/dist/esm/toSnakeKeys.js +15 -0
- package/dist/esm/toSnakeKeys.js.map +1 -0
- package/dist/esm/toValidated.d.ts +12 -0
- package/dist/esm/toValidated.js +23 -0
- package/dist/esm/toValidated.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const endpoint = "https://discord.com/api/v10/";
|
|
2
|
+
/** @internal */
|
|
3
|
+
export declare class DiscordSession {
|
|
4
|
+
#private;
|
|
5
|
+
endpoint: string;
|
|
6
|
+
get ready(): boolean;
|
|
7
|
+
constructor(authToken?: string | null);
|
|
8
|
+
/**
|
|
9
|
+
* Clears the current session details, then attempts to set
|
|
10
|
+
* new session values
|
|
11
|
+
*/
|
|
12
|
+
setToken: (token: string) => void;
|
|
13
|
+
clearSession: () => void;
|
|
14
|
+
getSession: () => string;
|
|
15
|
+
}
|
|
16
|
+
export declare const discord: DiscordSession;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.discord = exports.DiscordSession = exports.endpoint = void 0;
|
|
4
|
+
exports.endpoint = `https://discord.com/api/v10/`;
|
|
5
|
+
/** @internal */
|
|
6
|
+
class DiscordSession {
|
|
7
|
+
endpoint = exports.endpoint;
|
|
8
|
+
#authToken = null;
|
|
9
|
+
get ready() {
|
|
10
|
+
return Boolean(this.#authToken);
|
|
11
|
+
}
|
|
12
|
+
constructor(authToken) {
|
|
13
|
+
if (authToken) {
|
|
14
|
+
this.setToken(authToken);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Clears the current session details, then attempts to set
|
|
19
|
+
* new session values
|
|
20
|
+
*/
|
|
21
|
+
setToken = (token) => {
|
|
22
|
+
this.#authToken = null;
|
|
23
|
+
if (!token) {
|
|
24
|
+
throw new Error(`Must provide a non-empty string to set Auth Token`);
|
|
25
|
+
}
|
|
26
|
+
if (!token.startsWith(`Bot `) && !token.startsWith(`Bearer `)) {
|
|
27
|
+
throw new Error(`Token must begin with either "Bot " or "Bearer ", received: ${token}`);
|
|
28
|
+
}
|
|
29
|
+
this.#authToken = token;
|
|
30
|
+
};
|
|
31
|
+
clearSession = () => {
|
|
32
|
+
this.#authToken = null;
|
|
33
|
+
};
|
|
34
|
+
getSession = () => {
|
|
35
|
+
const token = this.#authToken;
|
|
36
|
+
if (!token) {
|
|
37
|
+
throw new Error(`Auth Token must be set before requests can be made.`);
|
|
38
|
+
}
|
|
39
|
+
return token;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
exports.DiscordSession = DiscordSession;
|
|
43
|
+
exports.discord = new DiscordSession();
|
|
44
|
+
//# sourceMappingURL=DiscordSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiscordSession.js","sourceRoot":"","sources":["../../src/DiscordSession.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG,8BAA8B,CAAC;AAEvD,gBAAgB;AAChB,MAAa,cAAc;IACzB,QAAQ,GAAW,gBAAQ,CAAC;IAC5B,UAAU,GAAkB,IAAI,CAAC;IACjC,IAAI,KAAK;QACP,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,YAAY,SAAyB;QACnC,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SAC1B;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ,GAAG,CAAC,KAAa,EAAQ,EAAE;QACjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;SACtE;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC7D,MAAM,IAAI,KAAK,CACb,+DAA+D,KAAK,EAAE,CACvE,CAAC;SACH;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC,CAAC;IAEF,YAAY,GAAG,GAAS,EAAE;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC,CAAC;IAEF,UAAU,GAAG,GAAW,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAE9B,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;SACxE;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;CACH;AA3CD,wCA2CC;AAEY,QAAA,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export type RequestParams = Partial<Record<string, number[] | string[] | boolean | number | string | null | undefined>>;
|
|
2
|
+
export declare const addParams: <P extends Partial<Record<string, string | number | boolean | string[] | number[] | null | undefined>>>(url: URL, params: P) => URL;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addParams = void 0;
|
|
4
|
+
const isNonNullable_js_1 = require("./isNonNullable.js");
|
|
5
|
+
const toSnakeCase_js_1 = require("./toSnakeCase.js");
|
|
6
|
+
const addParams = (url, params) => {
|
|
7
|
+
for (const [key, value] of Object.entries(params)) {
|
|
8
|
+
if ((0, isNonNullable_js_1.isNonNullable)(value)) {
|
|
9
|
+
url.searchParams.set((0, toSnakeCase_js_1.toSnakeCase)(key), value.toString());
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return url;
|
|
13
|
+
};
|
|
14
|
+
exports.addParams = addParams;
|
|
15
|
+
//# sourceMappingURL=addParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addParams.js","sourceRoot":"","sources":["../../src/addParams.ts"],"names":[],"mappings":";;;AAAA,yDAAmD;AACnD,qDAA+C;AASxC,MAAM,SAAS,GAAG,CACvB,GAAQ,EACR,MAAS,EACJ,EAAE;IACP,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACjD,IAAI,IAAA,gCAAa,EAAC,KAAK,CAAC,EAAE;YACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAA,4BAAW,EAAC,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC1D;KACF;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAXW,QAAA,SAAS,aAWpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const buildURL: <P extends Partial<Record<string, string | number | boolean | string[] | number[] | null | undefined>>>(resource: string, params?: P | undefined, base?: string) => URL;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildURL = void 0;
|
|
4
|
+
const DiscordSession_js_1 = require("./DiscordSession.js");
|
|
5
|
+
const addParams_js_1 = require("./addParams.js");
|
|
6
|
+
const buildURL = (resource, params, base) => (0, addParams_js_1.addParams)(new URL(resource.replace(/^\//, ``), base ?? DiscordSession_js_1.endpoint), params ?? {});
|
|
7
|
+
exports.buildURL = buildURL;
|
|
8
|
+
//# sourceMappingURL=buildURL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildURL.js","sourceRoot":"","sources":["../../src/buildURL.ts"],"names":[],"mappings":";;;AAAA,2DAA+C;AAC/C,iDAA+D;AAExD,MAAM,QAAQ,GAAG,CACtB,QAAgB,EAChB,MAAU,EACV,IAAa,EACR,EAAE,CACP,IAAA,wBAAS,EACP,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI,4BAAQ,CAAC,EACtD,MAAM,IAAI,EAAE,CACb,CAAC;AARS,QAAA,QAAQ,YAQjB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAsset = void 0;
|
|
4
|
+
const buildURL_js_1 = require("./buildURL.js");
|
|
5
|
+
const getAsset = (resource, params) => (0, buildURL_js_1.buildURL)(resource, params, `https://cdn.discordapp.com/`).href;
|
|
6
|
+
exports.getAsset = getAsset;
|
|
7
|
+
//# sourceMappingURL=getAsset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAsset.js","sourceRoot":"","sources":["../../src/getAsset.ts"],"names":[],"mappings":";;;AAAA,+CAAyC;AAElC,MAAM,QAAQ,GAAG,CACtB,QAAgB,EAChB,MAAuC,EAC/B,EAAE,CAAC,IAAA,sBAAQ,EAAC,QAAQ,EAAE,MAAM,EAAE,6BAA6B,CAAC,CAAC,IAAI,CAAC;AAH/D,QAAA,QAAQ,YAGuD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { endpoint, discord } from "./DiscordSession.js";
|
|
2
|
+
export * from "./buildURL.js";
|
|
3
|
+
export * from "./getAsset.js";
|
|
4
|
+
export * from "./methods.js";
|
|
5
|
+
export * from "./toProcedure.js";
|
|
6
|
+
export * from "./toQuery.js";
|
|
7
|
+
export * from "./toValidated.js";
|
|
8
|
+
export * from "./snowflake.js";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.discord = exports.endpoint = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
var DiscordSession_js_1 = require("./DiscordSession.js");
|
|
6
|
+
Object.defineProperty(exports, "endpoint", { enumerable: true, get: function () { return DiscordSession_js_1.endpoint; } });
|
|
7
|
+
Object.defineProperty(exports, "discord", { enumerable: true, get: function () { return DiscordSession_js_1.discord; } });
|
|
8
|
+
tslib_1.__exportStar(require("./buildURL.js"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./getAsset.js"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./methods.js"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./toProcedure.js"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./toQuery.js"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./toValidated.js"), exports);
|
|
14
|
+
tslib_1.__exportStar(require("./snowflake.js"), exports);
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAAA,yDAAwD;AAA/C,6GAAA,QAAQ,OAAA;AAAE,4GAAA,OAAO,OAAA;AAC1B,wDAA8B;AAC9B,wDAA8B;AAC9B,uDAA6B;AAC7B,2DAAiC;AACjC,uDAA6B;AAC7B,2DAAiC;AACjC,yDAA+B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Used to test whether a `Maybe` typed value is `null` or `undefined`.
|
|
3
|
+
*
|
|
4
|
+
* When called, the given value's type is narrowed to `NonNullable<T>`.
|
|
5
|
+
*
|
|
6
|
+
* ### Example Usage:
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const fn = (str: Maybe<string>) => {
|
|
10
|
+
* if (!isNonNullable(str)) {
|
|
11
|
+
* // typeof str = null | undefined
|
|
12
|
+
* // ...
|
|
13
|
+
* }
|
|
14
|
+
* // typeof str = string
|
|
15
|
+
* // ...
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare const isNonNullable: <T extends unknown>(val?: T | undefined) => val is NonNullable<T>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isNonNullable = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Used to test whether a `Maybe` typed value is `null` or `undefined`.
|
|
6
|
+
*
|
|
7
|
+
* When called, the given value's type is narrowed to `NonNullable<T>`.
|
|
8
|
+
*
|
|
9
|
+
* ### Example Usage:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const fn = (str: Maybe<string>) => {
|
|
13
|
+
* if (!isNonNullable(str)) {
|
|
14
|
+
* // typeof str = null | undefined
|
|
15
|
+
* // ...
|
|
16
|
+
* }
|
|
17
|
+
* // typeof str = string
|
|
18
|
+
* // ...
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
const isNonNullable = (val) => typeof val !== `undefined` && val !== null;
|
|
23
|
+
exports.isNonNullable = isNonNullable;
|
|
24
|
+
//# sourceMappingURL=isNonNullable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNonNullable.js","sourceRoot":"","sources":["../../src/isNonNullable.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;GAiBG;AACI,MAAM,aAAa,GAAG,CAC3B,GAAO,EACgB,EAAE,CAAC,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,CAAC;AAF1D,QAAA,aAAa,iBAE6C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isObject: (val: unknown) => val is object;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isObject.js","sourceRoot":"","sources":["../../src/isObject.ts"],"names":[],"mappings":";;;AAAO,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAiB,EAAE,CACtD,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AADpD,QAAA,QAAQ,YAC4C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { RequestParams } from "./addParams.js";
|
|
3
|
+
import type { RequestBody } from "./request.js";
|
|
4
|
+
export type Fetcher<S extends z.ZodTypeAny | null = null, R = void> = S extends null ? () => Promise<R> : (config: z.infer<NonNullable<S>>) => Promise<R>;
|
|
5
|
+
export declare const get: <T>(url: string, params?: RequestParams) => Promise<T>;
|
|
6
|
+
export declare const post: <T>(url: string, body?: RequestBody) => Promise<T>;
|
|
7
|
+
export declare const put: <T>(url: string, body?: RequestBody) => Promise<T>;
|
|
8
|
+
export declare const patch: <T>(url: string, body?: RequestBody) => Promise<T>;
|
|
9
|
+
export declare const remove: <T = void>(url: string) => Promise<T>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.remove = exports.patch = exports.put = exports.post = exports.get = void 0;
|
|
4
|
+
const buildURL_js_1 = require("./buildURL.js");
|
|
5
|
+
const request_js_1 = require("./request.js");
|
|
6
|
+
const get = async (url, params) => (0, request_js_1.request)((0, buildURL_js_1.buildURL)(url, params));
|
|
7
|
+
exports.get = get;
|
|
8
|
+
const post = async (url, body) => (0, request_js_1.request)((0, buildURL_js_1.buildURL)(url), `POST`, body);
|
|
9
|
+
exports.post = post;
|
|
10
|
+
const put = async (url, body) => (0, request_js_1.request)((0, buildURL_js_1.buildURL)(url), `PUT`, body);
|
|
11
|
+
exports.put = put;
|
|
12
|
+
const patch = async (url, body) => (0, request_js_1.request)((0, buildURL_js_1.buildURL)(url), `PATCH`, body);
|
|
13
|
+
exports.patch = patch;
|
|
14
|
+
const remove = async (url) => (0, request_js_1.request)((0, buildURL_js_1.buildURL)(url), `DELETE`);
|
|
15
|
+
exports.remove = remove;
|
|
16
|
+
//# sourceMappingURL=methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../src/methods.ts"],"names":[],"mappings":";;;AAEA,+CAAyC;AAEzC,6CAAuC;AAShC,MAAM,GAAG,GAAG,KAAK,EAAK,GAAW,EAAE,MAAsB,EAAc,EAAE,CAC9E,IAAA,oBAAO,EAAC,IAAA,sBAAQ,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AADpB,QAAA,GAAG,OACiB;AAE1B,MAAM,IAAI,GAAG,KAAK,EAAK,GAAW,EAAE,IAAkB,EAAc,EAAE,CAC3E,IAAA,oBAAO,EAAC,IAAA,sBAAQ,EAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAD1B,QAAA,IAAI,QACsB;AAEhC,MAAM,GAAG,GAAG,KAAK,EAAK,GAAW,EAAE,IAAkB,EAAc,EAAE,CAC1E,IAAA,oBAAO,EAAC,IAAA,sBAAQ,EAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AADzB,QAAA,GAAG,OACsB;AAE/B,MAAM,KAAK,GAAG,KAAK,EAAK,GAAW,EAAE,IAAkB,EAAc,EAAE,CAC5E,IAAA,oBAAO,EAAC,IAAA,sBAAQ,EAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAD3B,QAAA,KAAK,SACsB;AAEjC,MAAM,MAAM,GAAG,KAAK,EAAY,GAAW,EAAc,EAAE,CAChE,IAAA,oBAAO,EAAC,IAAA,sBAAQ,EAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AADtB,QAAA,MAAM,UACgB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.request = void 0;
|
|
4
|
+
const DiscordSession_js_1 = require("./DiscordSession.js");
|
|
5
|
+
const toCamelKeys_js_1 = require("./toCamelKeys.js");
|
|
6
|
+
const toSnakeKeys_js_1 = require("./toSnakeKeys.js");
|
|
7
|
+
const request = async (resource, method = `GET`, body) => {
|
|
8
|
+
const token = DiscordSession_js_1.discord.getSession();
|
|
9
|
+
if (!token) {
|
|
10
|
+
throw new Error(`Auth Token must be set before requests can be made.`);
|
|
11
|
+
}
|
|
12
|
+
const res = await fetch(resource.toString(), {
|
|
13
|
+
method,
|
|
14
|
+
body: body ? JSON.stringify((0, toSnakeKeys_js_1.toSnakeKeys)(body)) : body,
|
|
15
|
+
headers: {
|
|
16
|
+
Authorization: token
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
if (!res.ok) {
|
|
20
|
+
throw new Error(`Request to resource '${resource.toString()}' failed:\n\n${res.statusText}`);
|
|
21
|
+
}
|
|
22
|
+
return (0, toCamelKeys_js_1.toCamelKeys)(await res.json());
|
|
23
|
+
};
|
|
24
|
+
exports.request = request;
|
|
25
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":";;;AAAA,2DAA8C;AAC9C,qDAA+C;AAC/C,qDAA+C;AAIxC,MAAM,OAAO,GAAG,KAAK,EAC1B,QAAa,EACb,MAAM,GAAG,KAAK,EACd,IAAkB,EACN,EAAE;IACd,MAAM,KAAK,GAAG,2BAAO,CAAC,UAAU,EAAE,CAAC;IAEnC,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;KACxE;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE;QAC3C,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,4BAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACrD,OAAO,EAAE;YACP,aAAa,EAAE,KAAK;SACrB;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;QACX,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,CAAC,QAAQ,EAAE,gBACzC,GAAG,CAAC,UACN,EAAE,CACH,CAAC;KACH;IAED,OAAO,IAAA,4BAAW,EAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC,CAAC;AA5BW,QAAA,OAAO,WA4BlB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.snowflake = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const isNonNullable_js_1 = require("./isNonNullable.js");
|
|
6
|
+
exports.snowflake = zod_1.z
|
|
7
|
+
.custom((val) => {
|
|
8
|
+
if ((0, isNonNullable_js_1.isNonNullable)(val) &&
|
|
9
|
+
(typeof val === `bigint` ||
|
|
10
|
+
typeof val === `number` ||
|
|
11
|
+
typeof val === `string`)) {
|
|
12
|
+
return (zod_1.z.coerce
|
|
13
|
+
.date()
|
|
14
|
+
// eslint-disable-next-line no-bitwise
|
|
15
|
+
.safeParse(Number((BigInt(val) >> 22n) + 1420070400000n)));
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
}, `Invalid Snowflake ID`)
|
|
19
|
+
.describe(`Discord Snowflake ID`);
|
|
20
|
+
//# sourceMappingURL=snowflake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snowflake.js","sourceRoot":"","sources":["../../src/snowflake.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,yDAAmD;AAEtC,QAAA,SAAS,GAAG,OAAC;KACvB,MAAM,CAAS,CAAC,GAAG,EAAE,EAAE;IACtB,IACE,IAAA,gCAAa,EAAC,GAAG,CAAC;QAClB,CAAC,OAAO,GAAG,KAAK,QAAQ;YACtB,OAAO,GAAG,KAAK,QAAQ;YACvB,OAAO,GAAG,KAAK,QAAQ,CAAC,EAC1B;QACA,OAAO,CACL,OAAC,CAAC,MAAM;aACL,IAAI,EAAE;YACP,sCAAsC;aACrC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAC5D,CAAC;KACH;IACD,OAAO,KAAK,CAAC;AACf,CAAC,EAAE,sBAAsB,CAAC;KACzB,QAAQ,CAAC,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const toCamelCase: (str: string) => string;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toCamelCase = void 0;
|
|
4
|
+
const toCamelCase = (str) => str.replace(/_(?<char>[a-zA-Z])/g, (g) => g[1].toUpperCase());
|
|
5
|
+
exports.toCamelCase = toCamelCase;
|
|
6
|
+
//# sourceMappingURL=toCamelCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCamelCase.js","sourceRoot":"","sources":["../../src/toCamelCase.ts"],"names":[],"mappings":";;;AAAO,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CACjD,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AADnD,QAAA,WAAW,eACwC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toCamelKeys = void 0;
|
|
4
|
+
const isObject_js_1 = require("./isObject.js");
|
|
5
|
+
const toCamelCase_js_1 = require("./toCamelCase.js");
|
|
6
|
+
const toCamelKeys = (o) => {
|
|
7
|
+
if (Array.isArray(o)) {
|
|
8
|
+
return o.map(exports.toCamelKeys);
|
|
9
|
+
}
|
|
10
|
+
else if ((0, isObject_js_1.isObject)(o)) {
|
|
11
|
+
return Object.entries(o).reduce((acc, [key, value]) => {
|
|
12
|
+
acc[(0, toCamelCase_js_1.toCamelCase)(key)] = (0, exports.toCamelKeys)(value);
|
|
13
|
+
return acc;
|
|
14
|
+
}, {});
|
|
15
|
+
}
|
|
16
|
+
return o;
|
|
17
|
+
};
|
|
18
|
+
exports.toCamelKeys = toCamelKeys;
|
|
19
|
+
//# sourceMappingURL=toCamelKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCamelKeys.js","sourceRoot":"","sources":["../../src/toCamelKeys.ts"],"names":[],"mappings":";;;AACA,+CAAyC;AACzC,qDAA+C;AAExC,MAAM,WAAW,GAAG,CACzB,CAAI,EACyB,EAAE;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACpB,OAAO,CAAC,CAAC,GAAG,CAAC,mBAAW,CAAgC,CAAC;KAC1D;SAAM,IAAI,IAAA,sBAAQ,EAAC,CAAC,CAAC,EAAE;QACtB,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACpD,GAAG,CAAC,IAAA,4BAAW,EAAC,GAAG,CAAC,CAAC,GAAG,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAgC,CAAC;KACvC;IAED,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAbW,QAAA,WAAW,eAatB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { AnyRootConfig, inferParser, Procedure, unsetMarker } from "@trpc/server";
|
|
3
|
+
import type { Fetcher } from "./methods.js";
|
|
4
|
+
type Result<T = void> = T extends z.ZodTypeAny ? z.infer<T> : T;
|
|
5
|
+
type UnsetMarker = typeof unsetMarker;
|
|
6
|
+
type BaseProcedure<T extends "mutation" | "query" | "subscription", I extends z.ZodTypeAny | null = null, O extends z.ZodTypeAny | null = null> = Procedure<T, {
|
|
7
|
+
_config: AnyRootConfig;
|
|
8
|
+
_ctx_out: object;
|
|
9
|
+
_input_in: I extends z.ZodTypeAny ? inferParser<I>["in"] : UnsetMarker;
|
|
10
|
+
_input_out: I extends z.ZodTypeAny ? inferParser<I>["out"] : UnsetMarker;
|
|
11
|
+
_output_in: O extends z.ZodTypeAny ? inferParser<O>["in"] : UnsetMarker;
|
|
12
|
+
_output_out: O extends z.ZodTypeAny ? inferParser<O>["out"] : UnsetMarker;
|
|
13
|
+
_meta: object;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Given a {@link Fetcher | Fetcher} function and it's associated input and
|
|
17
|
+
* output Zod schemas, this produces a function which accepts a tRPC procedure
|
|
18
|
+
* builder of the given procedure type. This can then be used in a tRPC router
|
|
19
|
+
* to scaffold an API route to forward a request to Discord's API.
|
|
20
|
+
*/
|
|
21
|
+
export declare const toProcedure: <T extends "query" | "mutation" | "subscription", I extends z.ZodTypeAny | null = null, O extends z.ZodTypeAny | null = null>(type: T, fn: Fetcher<I extends z.ZodTypeAny ? I : z.ZodUnknown, Result<O>>, input?: I | undefined, output?: O | undefined) => (procedure: import("@trpc/server").ProcedureBuilder<{
|
|
22
|
+
_config: import("@trpc/server").RootConfig<{
|
|
23
|
+
ctx: object;
|
|
24
|
+
meta: object;
|
|
25
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
26
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
27
|
+
}>;
|
|
28
|
+
_ctx_out: object;
|
|
29
|
+
_input_in: typeof unsetMarker;
|
|
30
|
+
_input_out: typeof unsetMarker;
|
|
31
|
+
_output_in: typeof unsetMarker;
|
|
32
|
+
_output_out: typeof unsetMarker;
|
|
33
|
+
_meta: object;
|
|
34
|
+
}>) => BaseProcedure<T, I, O>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toProcedure = void 0;
|
|
4
|
+
const isNonNullable_js_1 = require("./isNonNullable.js");
|
|
5
|
+
/**
|
|
6
|
+
* Given a {@link Fetcher | Fetcher} function and it's associated input and
|
|
7
|
+
* output Zod schemas, this produces a function which accepts a tRPC procedure
|
|
8
|
+
* builder of the given procedure type. This can then be used in a tRPC router
|
|
9
|
+
* to scaffold an API route to forward a request to Discord's API.
|
|
10
|
+
*/
|
|
11
|
+
const toProcedure = (type, fn, input, output) => (procedure) => {
|
|
12
|
+
if ((0, isNonNullable_js_1.isNonNullable)(input) && (0, isNonNullable_js_1.isNonNullable)(output)) {
|
|
13
|
+
// @ts-expect-error
|
|
14
|
+
return procedure
|
|
15
|
+
.input(input)
|
|
16
|
+
.output(output)[type](async (opts) => fn(opts.input));
|
|
17
|
+
}
|
|
18
|
+
if ((0, isNonNullable_js_1.isNonNullable)(input) && !(0, isNonNullable_js_1.isNonNullable)(output)) {
|
|
19
|
+
// @ts-expect-error
|
|
20
|
+
return procedure.input(input)[type](async (opts) => fn(opts.input));
|
|
21
|
+
}
|
|
22
|
+
if (!(0, isNonNullable_js_1.isNonNullable)(input) && (0, isNonNullable_js_1.isNonNullable)(output)) {
|
|
23
|
+
// @ts-expect-error
|
|
24
|
+
return procedure.output(output)[type](async () => fn());
|
|
25
|
+
}
|
|
26
|
+
// @ts-expect-error
|
|
27
|
+
return procedure[type](async () => fn());
|
|
28
|
+
};
|
|
29
|
+
exports.toProcedure = toProcedure;
|
|
30
|
+
//# sourceMappingURL=toProcedure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toProcedure.js","sourceRoot":"","sources":["../../src/toProcedure.ts"],"names":[],"mappings":";;;AAQA,yDAAmD;AA0BnD;;;;;GAKG;AACI,MAAM,WAAW,GACtB,CAKE,IAAO,EACP,EAAiE,EACjE,KAAS,EACT,MAAU,EACV,EAAE,CACJ,CAAC,SAA2B,EAA0B,EAAE;IACtD,IAAI,IAAA,gCAAa,EAAC,KAAK,CAAC,IAAI,IAAA,gCAAa,EAAC,MAAM,CAAC,EAAE;QACjD,mBAAmB;QACnB,OAAO,SAAS;aACb,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,MAAM,CAAC,CACd,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KAC1C;IACD,IAAI,IAAA,gCAAa,EAAC,KAAK,CAAC,IAAI,CAAC,IAAA,gCAAa,EAAC,MAAM,CAAC,EAAE;QAClD,mBAAmB;QACnB,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KACrE;IACD,IAAI,CAAC,IAAA,gCAAa,EAAC,KAAK,CAAC,IAAI,IAAA,gCAAa,EAAC,MAAM,CAAC,EAAE;QAClD,mBAAmB;QACnB,OAAO,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;KACzD;IACD,mBAAmB;IACnB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC,CAAC;AA7BS,QAAA,WAAW,eA6BpB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { QueryFunction } from "@tanstack/react-query";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { Fetcher } from "./methods.js";
|
|
4
|
+
/**
|
|
5
|
+
* Given a {@link Fetcher | Fetcher} function, transforms it into a curried function
|
|
6
|
+
* which can then be used with React-Query as a query function without
|
|
7
|
+
* the need for any additional boilerplate.
|
|
8
|
+
*/
|
|
9
|
+
export declare const toQuery: <S extends z.ZodTypeAny | null, R, T extends Fetcher<S, R>>(fn: T) => Parameters<T>["length"] extends 0 ? () => QueryFunction<Awaited<ReturnType<T>>> : (config: Parameters<T>[0]) => QueryFunction<Awaited<ReturnType<T>>>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toQuery = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Given a {@link Fetcher | Fetcher} function, transforms it into a curried function
|
|
6
|
+
* which can then be used with React-Query as a query function without
|
|
7
|
+
* the need for any additional boilerplate.
|
|
8
|
+
*/
|
|
9
|
+
const toQuery = (fn) =>
|
|
10
|
+
// @ts-expect-error
|
|
11
|
+
(...config) => async () => fn(...config);
|
|
12
|
+
exports.toQuery = toQuery;
|
|
13
|
+
//# sourceMappingURL=toQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toQuery.js","sourceRoot":"","sources":["../../src/toQuery.ts"],"names":[],"mappings":";;;AAIA;;;;GAIG;AACI,MAAM,OAAO,GAClB,CACE,EAAK,EAGiE,EAAE;AAC1E,mBAAmB;AACnB,CAAC,GAAG,MAAiB,EAAE,EAAE,CACzB,KAAK,IAAI,EAAE,CACT,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;AATL,QAAA,OAAO,WASF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const toSnakeCase: (str: string) => string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toSnakeCase = void 0;
|
|
4
|
+
const toSnakeCase = (str) => str
|
|
5
|
+
.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)
|
|
6
|
+
.substring(str.slice(0, 1).match(/(?<char>[A-Z])/g) ? 1 : 0);
|
|
7
|
+
exports.toSnakeCase = toSnakeCase;
|
|
8
|
+
//# sourceMappingURL=toSnakeCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toSnakeCase.js","sourceRoot":"","sources":["../../src/toSnakeCase.ts"],"names":[],"mappings":";;;AAAO,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CACjD,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;KACzD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAHpD,QAAA,WAAW,eAGyC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toSnakeKeys = void 0;
|
|
4
|
+
const isObject_js_1 = require("./isObject.js");
|
|
5
|
+
const toSnakeCase_js_1 = require("./toSnakeCase.js");
|
|
6
|
+
const toSnakeKeys = (o) => {
|
|
7
|
+
if (Array.isArray(o)) {
|
|
8
|
+
return o.map(exports.toSnakeKeys);
|
|
9
|
+
}
|
|
10
|
+
else if ((0, isObject_js_1.isObject)(o)) {
|
|
11
|
+
return Object.entries(o).reduce((acc, [key, value]) => {
|
|
12
|
+
acc[(0, toSnakeCase_js_1.toSnakeCase)(key)] = (0, exports.toSnakeKeys)(value);
|
|
13
|
+
return acc;
|
|
14
|
+
}, {});
|
|
15
|
+
}
|
|
16
|
+
return o;
|
|
17
|
+
};
|
|
18
|
+
exports.toSnakeKeys = toSnakeKeys;
|
|
19
|
+
//# sourceMappingURL=toSnakeKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toSnakeKeys.js","sourceRoot":"","sources":["../../src/toSnakeKeys.ts"],"names":[],"mappings":";;;AACA,+CAAyC;AACzC,qDAA+C;AAExC,MAAM,WAAW,GAAG,CACzB,CAAI,EACyB,EAAE;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACpB,OAAO,CAAC,CAAC,GAAG,CAAC,mBAAW,CAAgC,CAAC;KAC1D;SAAM,IAAI,IAAA,sBAAQ,EAAC,CAAC,CAAC,EAAE;QACtB,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACpD,GAAG,CAAC,IAAA,4BAAW,EAAC,GAAG,CAAC,CAAC,GAAG,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAgC,CAAC;KACvC;IAED,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAbW,QAAA,WAAW,eAatB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { Fetcher } from "./methods.js";
|
|
3
|
+
type ToValidated = <F extends Fetcher<null, null> | Fetcher<null, z.infer<z.ZodTypeAny>> | Fetcher<z.ZodTypeAny, z.infer<z.ZodTypeAny>> | Fetcher<z.ZodTypeAny>>(...args: F extends Fetcher<infer I, ReturnType<F> extends Promise<void> ? never : z.infer<infer O & z.ZodTypeAny>> ? [fn: F, input: I, output: O] : F extends Fetcher<null, ReturnType<F> extends Promise<void> ? never : z.infer<infer O & z.ZodTypeAny>> ? [fn: F, input: null, output: O] : F extends Fetcher<infer I> ? [fn: F, input: I] : F extends Fetcher<null, null> ? [fn: F] : never) => F;
|
|
4
|
+
/**
|
|
5
|
+
* Given a {@link Fetcher | Fetcher} function and it's associated input
|
|
6
|
+
* and output Zod schemas, this returns a new validated {@link Fetcher | Fetcher} function which will validate it's input and result at runtime.
|
|
7
|
+
* This is useful in contexts where you want strong guarantees on runtime
|
|
8
|
+
* type-safety when dealing with raw user input in a framework agnostic
|
|
9
|
+
* environment.
|
|
10
|
+
*/
|
|
11
|
+
export declare const toValidated: ToValidated;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toValidated = void 0;
|
|
4
|
+
const isNonNullable_js_1 = require("./isNonNullable.js");
|
|
5
|
+
const isObject_js_1 = require("./isObject.js");
|
|
6
|
+
const isSchema = (val) => (0, isNonNullable_js_1.isNonNullable)(val) && (0, isObject_js_1.isObject)(val) && `parse` in val;
|
|
7
|
+
/**
|
|
8
|
+
* Given a {@link Fetcher | Fetcher} function and it's associated input
|
|
9
|
+
* and output Zod schemas, this returns a new validated {@link Fetcher | Fetcher} function which will validate it's input and result at runtime.
|
|
10
|
+
* This is useful in contexts where you want strong guarantees on runtime
|
|
11
|
+
* type-safety when dealing with raw user input in a framework agnostic
|
|
12
|
+
* environment.
|
|
13
|
+
*/
|
|
14
|
+
const toValidated = (fn, input, output) =>
|
|
15
|
+
// @ts-expect-error
|
|
16
|
+
async (config) => {
|
|
17
|
+
if (isSchema(input)) {
|
|
18
|
+
input.parse(config);
|
|
19
|
+
}
|
|
20
|
+
const result = await fn(config);
|
|
21
|
+
if (isSchema(output)) {
|
|
22
|
+
output.parse(result);
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
exports.toValidated = toValidated;
|
|
27
|
+
//# sourceMappingURL=toValidated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toValidated.js","sourceRoot":"","sources":["../../src/toValidated.ts"],"names":[],"mappings":";;;AACA,yDAAmD;AACnD,+CAAyC;AAGzC,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAuB,EAAE,CACrD,IAAA,gCAAa,EAAC,GAAG,CAAC,IAAI,IAAA,sBAAQ,EAAC,GAAG,CAAC,IAAI,OAAO,IAAI,GAAG,CAAC;AA8BxD;;;;;;GAMG;AACI,MAAM,WAAW,GACtB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;AACtB,mBAAmB;AACnB,KAAK,EAAE,MAAM,EAAE,EAAE;IACf,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;QACnB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KACrB;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAEhC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;QACpB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KACtB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAfS,QAAA,WAAW,eAepB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const endpoint = "https://discord.com/api/v10/";
|
|
2
|
+
/** @internal */
|
|
3
|
+
export declare class DiscordSession {
|
|
4
|
+
#private;
|
|
5
|
+
endpoint: string;
|
|
6
|
+
get ready(): boolean;
|
|
7
|
+
constructor(authToken?: string | null);
|
|
8
|
+
/**
|
|
9
|
+
* Clears the current session details, then attempts to set
|
|
10
|
+
* new session values
|
|
11
|
+
*/
|
|
12
|
+
setToken: (token: string) => void;
|
|
13
|
+
clearSession: () => void;
|
|
14
|
+
getSession: () => string;
|
|
15
|
+
}
|
|
16
|
+
export declare const discord: DiscordSession;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const endpoint = `https://discord.com/api/v10/`;
|
|
2
|
+
/** @internal */
|
|
3
|
+
export class DiscordSession {
|
|
4
|
+
endpoint = endpoint;
|
|
5
|
+
#authToken = null;
|
|
6
|
+
get ready() {
|
|
7
|
+
return Boolean(this.#authToken);
|
|
8
|
+
}
|
|
9
|
+
constructor(authToken) {
|
|
10
|
+
if (authToken) {
|
|
11
|
+
this.setToken(authToken);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Clears the current session details, then attempts to set
|
|
16
|
+
* new session values
|
|
17
|
+
*/
|
|
18
|
+
setToken = (token) => {
|
|
19
|
+
this.#authToken = null;
|
|
20
|
+
if (!token) {
|
|
21
|
+
throw new Error(`Must provide a non-empty string to set Auth Token`);
|
|
22
|
+
}
|
|
23
|
+
if (!token.startsWith(`Bot `) && !token.startsWith(`Bearer `)) {
|
|
24
|
+
throw new Error(`Token must begin with either "Bot " or "Bearer ", received: ${token}`);
|
|
25
|
+
}
|
|
26
|
+
this.#authToken = token;
|
|
27
|
+
};
|
|
28
|
+
clearSession = () => {
|
|
29
|
+
this.#authToken = null;
|
|
30
|
+
};
|
|
31
|
+
getSession = () => {
|
|
32
|
+
const token = this.#authToken;
|
|
33
|
+
if (!token) {
|
|
34
|
+
throw new Error(`Auth Token must be set before requests can be made.`);
|
|
35
|
+
}
|
|
36
|
+
return token;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export const discord = new DiscordSession();
|
|
40
|
+
//# sourceMappingURL=DiscordSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiscordSession.js","sourceRoot":"","sources":["../../src/DiscordSession.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,8BAA8B,CAAC;AAEvD,gBAAgB;AAChB,MAAM,OAAO,cAAc;IACzB,QAAQ,GAAW,QAAQ,CAAC;IAC5B,UAAU,GAAkB,IAAI,CAAC;IACjC,IAAI,KAAK;QACP,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,YAAY,SAAyB;QACnC,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SAC1B;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ,GAAG,CAAC,KAAa,EAAQ,EAAE;QACjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;SACtE;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC7D,MAAM,IAAI,KAAK,CACb,+DAA+D,KAAK,EAAE,CACvE,CAAC;SACH;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC,CAAC;IAEF,YAAY,GAAG,GAAS,EAAE;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC,CAAC;IAEF,UAAU,GAAG,GAAW,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAE9B,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;SACxE;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;CACH;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export type RequestParams = Partial<Record<string, number[] | string[] | boolean | number | string | null | undefined>>;
|
|
2
|
+
export declare const addParams: <P extends Partial<Record<string, string | number | boolean | string[] | number[] | null | undefined>>>(url: URL, params: P) => URL;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { isNonNullable } from "./isNonNullable.js";
|
|
2
|
+
import { toSnakeCase } from "./toSnakeCase.js";
|
|
3
|
+
export const addParams = (url, params) => {
|
|
4
|
+
for (const [key, value] of Object.entries(params)) {
|
|
5
|
+
if (isNonNullable(value)) {
|
|
6
|
+
url.searchParams.set(toSnakeCase(key), value.toString());
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return url;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=addParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addParams.js","sourceRoot":"","sources":["../../src/addParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAS/C,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,GAAQ,EACR,MAAS,EACJ,EAAE;IACP,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACjD,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;YACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC1D;KACF;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const buildURL: <P extends Partial<Record<string, string | number | boolean | string[] | number[] | null | undefined>>>(resource: string, params?: P | undefined, base?: string) => URL;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildURL.js","sourceRoot":"","sources":["../../src/buildURL.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAE/D,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,QAAgB,EAChB,MAAU,EACV,IAAa,EACR,EAAE,CACP,SAAS,CACP,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI,QAAQ,CAAC,EACtD,MAAM,IAAI,EAAE,CACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAsset.js","sourceRoot":"","sources":["../../src/getAsset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,QAAgB,EAChB,MAAuC,EAC/B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,6BAA6B,CAAC,CAAC,IAAI,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { endpoint, discord } from "./DiscordSession.js";
|
|
2
|
+
export * from "./buildURL.js";
|
|
3
|
+
export * from "./getAsset.js";
|
|
4
|
+
export * from "./methods.js";
|
|
5
|
+
export * from "./toProcedure.js";
|
|
6
|
+
export * from "./toQuery.js";
|
|
7
|
+
export * from "./toValidated.js";
|
|
8
|
+
export * from "./snowflake.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { endpoint, discord } from "./DiscordSession.js";
|
|
2
|
+
export * from "./buildURL.js";
|
|
3
|
+
export * from "./getAsset.js";
|
|
4
|
+
export * from "./methods.js";
|
|
5
|
+
export * from "./toProcedure.js";
|
|
6
|
+
export * from "./toQuery.js";
|
|
7
|
+
export * from "./toValidated.js";
|
|
8
|
+
export * from "./snowflake.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACxD,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Used to test whether a `Maybe` typed value is `null` or `undefined`.
|
|
3
|
+
*
|
|
4
|
+
* When called, the given value's type is narrowed to `NonNullable<T>`.
|
|
5
|
+
*
|
|
6
|
+
* ### Example Usage:
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const fn = (str: Maybe<string>) => {
|
|
10
|
+
* if (!isNonNullable(str)) {
|
|
11
|
+
* // typeof str = null | undefined
|
|
12
|
+
* // ...
|
|
13
|
+
* }
|
|
14
|
+
* // typeof str = string
|
|
15
|
+
* // ...
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare const isNonNullable: <T extends unknown>(val?: T | undefined) => val is NonNullable<T>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Used to test whether a `Maybe` typed value is `null` or `undefined`.
|
|
3
|
+
*
|
|
4
|
+
* When called, the given value's type is narrowed to `NonNullable<T>`.
|
|
5
|
+
*
|
|
6
|
+
* ### Example Usage:
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const fn = (str: Maybe<string>) => {
|
|
10
|
+
* if (!isNonNullable(str)) {
|
|
11
|
+
* // typeof str = null | undefined
|
|
12
|
+
* // ...
|
|
13
|
+
* }
|
|
14
|
+
* // typeof str = string
|
|
15
|
+
* // ...
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const isNonNullable = (val) => typeof val !== `undefined` && val !== null;
|
|
20
|
+
//# sourceMappingURL=isNonNullable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNonNullable.js","sourceRoot":"","sources":["../../src/isNonNullable.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,GAAO,EACgB,EAAE,CAAC,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isObject: (val: unknown) => val is object;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isObject.js","sourceRoot":"","sources":["../../src/isObject.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAiB,EAAE,CACtD,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { RequestParams } from "./addParams.js";
|
|
3
|
+
import type { RequestBody } from "./request.js";
|
|
4
|
+
export type Fetcher<S extends z.ZodTypeAny | null = null, R = void> = S extends null ? () => Promise<R> : (config: z.infer<NonNullable<S>>) => Promise<R>;
|
|
5
|
+
export declare const get: <T>(url: string, params?: RequestParams) => Promise<T>;
|
|
6
|
+
export declare const post: <T>(url: string, body?: RequestBody) => Promise<T>;
|
|
7
|
+
export declare const put: <T>(url: string, body?: RequestBody) => Promise<T>;
|
|
8
|
+
export declare const patch: <T>(url: string, body?: RequestBody) => Promise<T>;
|
|
9
|
+
export declare const remove: <T = void>(url: string) => Promise<T>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { buildURL } from "./buildURL.js";
|
|
2
|
+
import { request } from "./request.js";
|
|
3
|
+
export const get = async (url, params) => request(buildURL(url, params));
|
|
4
|
+
export const post = async (url, body) => request(buildURL(url), `POST`, body);
|
|
5
|
+
export const put = async (url, body) => request(buildURL(url), `PUT`, body);
|
|
6
|
+
export const patch = async (url, body) => request(buildURL(url), `PATCH`, body);
|
|
7
|
+
export const remove = async (url) => request(buildURL(url), `DELETE`);
|
|
8
|
+
//# sourceMappingURL=methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../src/methods.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AASvC,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAK,GAAW,EAAE,MAAsB,EAAc,EAAE,CAC9E,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjC,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAK,GAAW,EAAE,IAAkB,EAAc,EAAE,CAC3E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAEvC,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAK,GAAW,EAAE,IAAkB,EAAc,EAAE,CAC1E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EAAK,GAAW,EAAE,IAAkB,EAAc,EAAE,CAC5E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAY,GAAW,EAAc,EAAE,CAChE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { discord } from "./DiscordSession.js";
|
|
2
|
+
import { toCamelKeys } from "./toCamelKeys.js";
|
|
3
|
+
import { toSnakeKeys } from "./toSnakeKeys.js";
|
|
4
|
+
export const request = async (resource, method = `GET`, body) => {
|
|
5
|
+
const token = discord.getSession();
|
|
6
|
+
if (!token) {
|
|
7
|
+
throw new Error(`Auth Token must be set before requests can be made.`);
|
|
8
|
+
}
|
|
9
|
+
const res = await fetch(resource.toString(), {
|
|
10
|
+
method,
|
|
11
|
+
body: body ? JSON.stringify(toSnakeKeys(body)) : body,
|
|
12
|
+
headers: {
|
|
13
|
+
Authorization: token
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
if (!res.ok) {
|
|
17
|
+
throw new Error(`Request to resource '${resource.toString()}' failed:\n\n${res.statusText}`);
|
|
18
|
+
}
|
|
19
|
+
return toCamelKeys(await res.json());
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,QAAa,EACb,MAAM,GAAG,KAAK,EACd,IAAkB,EACN,EAAE;IACd,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAEnC,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;KACxE;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE;QAC3C,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACrD,OAAO,EAAE;YACP,aAAa,EAAE,KAAK;SACrB;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;QACX,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,CAAC,QAAQ,EAAE,gBACzC,GAAG,CAAC,UACN,EAAE,CACH,CAAC;KACH;IAED,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { isNonNullable } from "./isNonNullable.js";
|
|
3
|
+
export const snowflake = z
|
|
4
|
+
.custom((val) => {
|
|
5
|
+
if (isNonNullable(val) &&
|
|
6
|
+
(typeof val === `bigint` ||
|
|
7
|
+
typeof val === `number` ||
|
|
8
|
+
typeof val === `string`)) {
|
|
9
|
+
return (z.coerce
|
|
10
|
+
.date()
|
|
11
|
+
// eslint-disable-next-line no-bitwise
|
|
12
|
+
.safeParse(Number((BigInt(val) >> 22n) + 1420070400000n)));
|
|
13
|
+
}
|
|
14
|
+
return false;
|
|
15
|
+
}, `Invalid Snowflake ID`)
|
|
16
|
+
.describe(`Discord Snowflake ID`);
|
|
17
|
+
//# sourceMappingURL=snowflake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snowflake.js","sourceRoot":"","sources":["../../src/snowflake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACvB,MAAM,CAAS,CAAC,GAAG,EAAE,EAAE;IACtB,IACE,aAAa,CAAC,GAAG,CAAC;QAClB,CAAC,OAAO,GAAG,KAAK,QAAQ;YACtB,OAAO,GAAG,KAAK,QAAQ;YACvB,OAAO,GAAG,KAAK,QAAQ,CAAC,EAC1B;QACA,OAAO,CACL,CAAC,CAAC,MAAM;aACL,IAAI,EAAE;YACP,sCAAsC;aACrC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAC5D,CAAC;KACH;IACD,OAAO,KAAK,CAAC;AACf,CAAC,EAAE,sBAAsB,CAAC;KACzB,QAAQ,CAAC,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const toCamelCase: (str: string) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCamelCase.js","sourceRoot":"","sources":["../../src/toCamelCase.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CACjD,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isObject } from "./isObject.js";
|
|
2
|
+
import { toCamelCase } from "./toCamelCase.js";
|
|
3
|
+
export const toCamelKeys = (o) => {
|
|
4
|
+
if (Array.isArray(o)) {
|
|
5
|
+
return o.map(toCamelKeys);
|
|
6
|
+
}
|
|
7
|
+
else if (isObject(o)) {
|
|
8
|
+
return Object.entries(o).reduce((acc, [key, value]) => {
|
|
9
|
+
acc[toCamelCase(key)] = toCamelKeys(value);
|
|
10
|
+
return acc;
|
|
11
|
+
}, {});
|
|
12
|
+
}
|
|
13
|
+
return o;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=toCamelKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCamelKeys.js","sourceRoot":"","sources":["../../src/toCamelKeys.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAI,EACyB,EAAE;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACpB,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAgC,CAAC;KAC1D;SAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;QACtB,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACpD,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAgC,CAAC;KACvC;IAED,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { AnyRootConfig, inferParser, Procedure, unsetMarker } from "@trpc/server";
|
|
3
|
+
import type { Fetcher } from "./methods.js";
|
|
4
|
+
type Result<T = void> = T extends z.ZodTypeAny ? z.infer<T> : T;
|
|
5
|
+
type UnsetMarker = typeof unsetMarker;
|
|
6
|
+
type BaseProcedure<T extends "mutation" | "query" | "subscription", I extends z.ZodTypeAny | null = null, O extends z.ZodTypeAny | null = null> = Procedure<T, {
|
|
7
|
+
_config: AnyRootConfig;
|
|
8
|
+
_ctx_out: object;
|
|
9
|
+
_input_in: I extends z.ZodTypeAny ? inferParser<I>["in"] : UnsetMarker;
|
|
10
|
+
_input_out: I extends z.ZodTypeAny ? inferParser<I>["out"] : UnsetMarker;
|
|
11
|
+
_output_in: O extends z.ZodTypeAny ? inferParser<O>["in"] : UnsetMarker;
|
|
12
|
+
_output_out: O extends z.ZodTypeAny ? inferParser<O>["out"] : UnsetMarker;
|
|
13
|
+
_meta: object;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Given a {@link Fetcher | Fetcher} function and it's associated input and
|
|
17
|
+
* output Zod schemas, this produces a function which accepts a tRPC procedure
|
|
18
|
+
* builder of the given procedure type. This can then be used in a tRPC router
|
|
19
|
+
* to scaffold an API route to forward a request to Discord's API.
|
|
20
|
+
*/
|
|
21
|
+
export declare const toProcedure: <T extends "query" | "mutation" | "subscription", I extends z.ZodTypeAny | null = null, O extends z.ZodTypeAny | null = null>(type: T, fn: Fetcher<I extends z.ZodTypeAny ? I : z.ZodUnknown, Result<O>>, input?: I | undefined, output?: O | undefined) => (procedure: import("@trpc/server").ProcedureBuilder<{
|
|
22
|
+
_config: import("@trpc/server").RootConfig<{
|
|
23
|
+
ctx: object;
|
|
24
|
+
meta: object;
|
|
25
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
26
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
27
|
+
}>;
|
|
28
|
+
_ctx_out: object;
|
|
29
|
+
_input_in: typeof unsetMarker;
|
|
30
|
+
_input_out: typeof unsetMarker;
|
|
31
|
+
_output_in: typeof unsetMarker;
|
|
32
|
+
_output_out: typeof unsetMarker;
|
|
33
|
+
_meta: object;
|
|
34
|
+
}>) => BaseProcedure<T, I, O>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { isNonNullable } from "./isNonNullable.js";
|
|
2
|
+
/**
|
|
3
|
+
* Given a {@link Fetcher | Fetcher} function and it's associated input and
|
|
4
|
+
* output Zod schemas, this produces a function which accepts a tRPC procedure
|
|
5
|
+
* builder of the given procedure type. This can then be used in a tRPC router
|
|
6
|
+
* to scaffold an API route to forward a request to Discord's API.
|
|
7
|
+
*/
|
|
8
|
+
export const toProcedure = (type, fn, input, output) => (procedure) => {
|
|
9
|
+
if (isNonNullable(input) && isNonNullable(output)) {
|
|
10
|
+
// @ts-expect-error
|
|
11
|
+
return procedure
|
|
12
|
+
.input(input)
|
|
13
|
+
.output(output)[type](async (opts) => fn(opts.input));
|
|
14
|
+
}
|
|
15
|
+
if (isNonNullable(input) && !isNonNullable(output)) {
|
|
16
|
+
// @ts-expect-error
|
|
17
|
+
return procedure.input(input)[type](async (opts) => fn(opts.input));
|
|
18
|
+
}
|
|
19
|
+
if (!isNonNullable(input) && isNonNullable(output)) {
|
|
20
|
+
// @ts-expect-error
|
|
21
|
+
return procedure.output(output)[type](async () => fn());
|
|
22
|
+
}
|
|
23
|
+
// @ts-expect-error
|
|
24
|
+
return procedure[type](async () => fn());
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=toProcedure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toProcedure.js","sourceRoot":"","sources":["../../src/toProcedure.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA0BnD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GACtB,CAKE,IAAO,EACP,EAAiE,EACjE,KAAS,EACT,MAAU,EACV,EAAE,CACJ,CAAC,SAA2B,EAA0B,EAAE;IACtD,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;QACjD,mBAAmB;QACnB,OAAO,SAAS;aACb,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,MAAM,CAAC,CACd,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KAC1C;IACD,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;QAClD,mBAAmB;QACnB,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KACrE;IACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;QAClD,mBAAmB;QACnB,OAAO,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;KACzD;IACD,mBAAmB;IACnB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { QueryFunction } from "@tanstack/react-query";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { Fetcher } from "./methods.js";
|
|
4
|
+
/**
|
|
5
|
+
* Given a {@link Fetcher | Fetcher} function, transforms it into a curried function
|
|
6
|
+
* which can then be used with React-Query as a query function without
|
|
7
|
+
* the need for any additional boilerplate.
|
|
8
|
+
*/
|
|
9
|
+
export declare const toQuery: <S extends z.ZodTypeAny | null, R, T extends Fetcher<S, R>>(fn: T) => Parameters<T>["length"] extends 0 ? () => QueryFunction<Awaited<ReturnType<T>>> : (config: Parameters<T>[0]) => QueryFunction<Awaited<ReturnType<T>>>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Given a {@link Fetcher | Fetcher} function, transforms it into a curried function
|
|
3
|
+
* which can then be used with React-Query as a query function without
|
|
4
|
+
* the need for any additional boilerplate.
|
|
5
|
+
*/
|
|
6
|
+
export const toQuery = (fn) =>
|
|
7
|
+
// @ts-expect-error
|
|
8
|
+
(...config) => async () => fn(...config);
|
|
9
|
+
//# sourceMappingURL=toQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toQuery.js","sourceRoot":"","sources":["../../src/toQuery.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAClB,CACE,EAAK,EAGiE,EAAE;AAC1E,mBAAmB;AACnB,CAAC,GAAG,MAAiB,EAAE,EAAE,CACzB,KAAK,IAAI,EAAE,CACT,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const toSnakeCase: (str: string) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toSnakeCase.js","sourceRoot":"","sources":["../../src/toSnakeCase.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CACjD,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;KACzD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isObject } from "./isObject.js";
|
|
2
|
+
import { toSnakeCase } from "./toSnakeCase.js";
|
|
3
|
+
export const toSnakeKeys = (o) => {
|
|
4
|
+
if (Array.isArray(o)) {
|
|
5
|
+
return o.map(toSnakeKeys);
|
|
6
|
+
}
|
|
7
|
+
else if (isObject(o)) {
|
|
8
|
+
return Object.entries(o).reduce((acc, [key, value]) => {
|
|
9
|
+
acc[toSnakeCase(key)] = toSnakeKeys(value);
|
|
10
|
+
return acc;
|
|
11
|
+
}, {});
|
|
12
|
+
}
|
|
13
|
+
return o;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=toSnakeKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toSnakeKeys.js","sourceRoot":"","sources":["../../src/toSnakeKeys.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAI,EACyB,EAAE;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACpB,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAgC,CAAC;KAC1D;SAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;QACtB,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACpD,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAgC,CAAC;KACvC;IAED,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { Fetcher } from "./methods.js";
|
|
3
|
+
type ToValidated = <F extends Fetcher<null, null> | Fetcher<null, z.infer<z.ZodTypeAny>> | Fetcher<z.ZodTypeAny, z.infer<z.ZodTypeAny>> | Fetcher<z.ZodTypeAny>>(...args: F extends Fetcher<infer I, ReturnType<F> extends Promise<void> ? never : z.infer<infer O & z.ZodTypeAny>> ? [fn: F, input: I, output: O] : F extends Fetcher<null, ReturnType<F> extends Promise<void> ? never : z.infer<infer O & z.ZodTypeAny>> ? [fn: F, input: null, output: O] : F extends Fetcher<infer I> ? [fn: F, input: I] : F extends Fetcher<null, null> ? [fn: F] : never) => F;
|
|
4
|
+
/**
|
|
5
|
+
* Given a {@link Fetcher | Fetcher} function and it's associated input
|
|
6
|
+
* and output Zod schemas, this returns a new validated {@link Fetcher | Fetcher} function which will validate it's input and result at runtime.
|
|
7
|
+
* This is useful in contexts where you want strong guarantees on runtime
|
|
8
|
+
* type-safety when dealing with raw user input in a framework agnostic
|
|
9
|
+
* environment.
|
|
10
|
+
*/
|
|
11
|
+
export declare const toValidated: ToValidated;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isNonNullable } from "./isNonNullable.js";
|
|
2
|
+
import { isObject } from "./isObject.js";
|
|
3
|
+
const isSchema = (val) => isNonNullable(val) && isObject(val) && `parse` in val;
|
|
4
|
+
/**
|
|
5
|
+
* Given a {@link Fetcher | Fetcher} function and it's associated input
|
|
6
|
+
* and output Zod schemas, this returns a new validated {@link Fetcher | Fetcher} function which will validate it's input and result at runtime.
|
|
7
|
+
* This is useful in contexts where you want strong guarantees on runtime
|
|
8
|
+
* type-safety when dealing with raw user input in a framework agnostic
|
|
9
|
+
* environment.
|
|
10
|
+
*/
|
|
11
|
+
export const toValidated = (fn, input, output) =>
|
|
12
|
+
// @ts-expect-error
|
|
13
|
+
async (config) => {
|
|
14
|
+
if (isSchema(input)) {
|
|
15
|
+
input.parse(config);
|
|
16
|
+
}
|
|
17
|
+
const result = await fn(config);
|
|
18
|
+
if (isSchema(output)) {
|
|
19
|
+
output.parse(result);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=toValidated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toValidated.js","sourceRoot":"","sources":["../../src/toValidated.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAuB,EAAE,CACrD,aAAa,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,GAAG,CAAC;AA8BxD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GACtB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;AACtB,mBAAmB;AACnB,KAAK,EAAE,MAAM,EAAE,EAAE;IACf,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;QACnB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KACrB;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAEhC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;QACpB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KACtB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|