@discordkit/core 3.2.0 → 4.0.1
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/CHANGELOG.md +423 -0
- package/README.md +52 -0
- package/dist/index.d.mts +23 -0
- package/dist/index.mjs +23 -0
- package/dist/requests/DiscordSession.d.mts +72 -0
- package/dist/requests/DiscordSession.d.mts.map +1 -0
- package/dist/requests/DiscordSession.mjs +262 -0
- package/dist/requests/DiscordSession.mjs.map +1 -0
- package/dist/requests/addParams.d.mts +16 -0
- package/dist/requests/addParams.d.mts.map +1 -0
- package/dist/requests/addParams.mjs +26 -0
- package/dist/requests/addParams.mjs.map +1 -0
- package/dist/requests/buildURL.d.mts +8 -0
- package/dist/requests/buildURL.d.mts.map +1 -0
- package/dist/requests/buildURL.mjs +9 -0
- package/dist/requests/buildURL.mjs.map +1 -0
- package/dist/requests/getAsset.d.mts +8 -0
- package/dist/requests/getAsset.d.mts.map +1 -0
- package/dist/requests/getAsset.mjs +8 -0
- package/dist/requests/getAsset.mjs.map +1 -0
- package/dist/requests/index.d.mts +9 -0
- package/dist/requests/index.mjs +9 -0
- package/dist/requests/methods.d.mts +64 -0
- package/dist/requests/methods.d.mts.map +1 -0
- package/dist/requests/methods.mjs +12 -0
- package/dist/requests/methods.mjs.map +1 -0
- package/dist/requests/request.d.mts +28 -0
- package/dist/requests/request.d.mts.map +1 -0
- package/dist/requests/request.mjs +31 -0
- package/dist/requests/request.mjs.map +1 -0
- package/dist/requests/toProcedure.d.mts +41 -0
- package/dist/requests/toProcedure.d.mts.map +1 -0
- package/dist/requests/toProcedure.mjs +29 -0
- package/dist/requests/toProcedure.mjs.map +1 -0
- package/dist/requests/toQuery.d.mts +37 -0
- package/dist/requests/toQuery.d.mts.map +1 -0
- package/dist/requests/toQuery.mjs +10 -0
- package/dist/requests/toQuery.mjs.map +1 -0
- package/dist/requests/toValidated.d.mts +17 -0
- package/dist/requests/toValidated.d.mts.map +1 -0
- package/dist/requests/toValidated.mjs +27 -0
- package/dist/requests/toValidated.mjs.map +1 -0
- package/dist/requests/{verifyKey.d.ts → verifyKey.d.mts} +5 -1
- package/dist/requests/verifyKey.d.mts.map +1 -0
- package/dist/requests/verifyKey.mjs +64 -0
- package/dist/requests/verifyKey.mjs.map +1 -0
- package/dist/utils/isBetween.d.mts +5 -0
- package/dist/utils/isBetween.d.mts.map +1 -0
- package/dist/utils/isBetween.mjs +6 -0
- package/dist/utils/isBetween.mjs.map +1 -0
- package/dist/utils/{isNonNullable.js → isNonNullable.d.mts} +6 -2
- package/dist/utils/isNonNullable.d.mts.map +1 -0
- package/dist/utils/isNonNullable.mjs +24 -0
- package/dist/utils/isNonNullable.mjs.map +1 -0
- package/dist/utils/isNumericString.d.mts +5 -0
- package/dist/utils/isNumericString.d.mts.map +1 -0
- package/dist/utils/isNumericString.mjs +6 -0
- package/dist/utils/isNumericString.mjs.map +1 -0
- package/dist/utils/isObject.d.mts +5 -0
- package/dist/utils/isObject.d.mts.map +1 -0
- package/dist/utils/isObject.mjs +6 -0
- package/dist/utils/isObject.mjs.map +1 -0
- package/dist/utils/sleep.d.mts +8 -0
- package/dist/utils/sleep.d.mts.map +1 -0
- package/dist/utils/sleep.mjs +9 -0
- package/dist/utils/sleep.mjs.map +1 -0
- package/dist/utils/toCamelCase.d.mts +5 -0
- package/dist/utils/toCamelCase.d.mts.map +1 -0
- package/dist/utils/toCamelCase.mjs +6 -0
- package/dist/utils/toCamelCase.mjs.map +1 -0
- package/dist/utils/toCamelKeys.d.mts +20 -0
- package/dist/utils/toCamelKeys.d.mts.map +1 -0
- package/dist/utils/toCamelKeys.mjs +15 -0
- package/dist/utils/toCamelKeys.mjs.map +1 -0
- package/dist/utils/toSnakeCase.d.mts +5 -0
- package/dist/utils/toSnakeCase.d.mts.map +1 -0
- package/dist/utils/toSnakeCase.mjs +6 -0
- package/dist/utils/toSnakeCase.mjs.map +1 -0
- package/dist/utils/toSnakeKeys.d.mts +24 -0
- package/dist/utils/toSnakeKeys.d.mts.map +1 -0
- package/dist/utils/toSnakeKeys.mjs +15 -0
- package/dist/utils/toSnakeKeys.mjs.map +1 -0
- package/dist/validations/asDigits.d.mts +13 -0
- package/dist/validations/asDigits.d.mts.map +1 -0
- package/dist/validations/asDigits.mjs +12 -0
- package/dist/validations/asDigits.mjs.map +1 -0
- package/dist/validations/asInteger.d.mts +13 -0
- package/dist/validations/asInteger.d.mts.map +1 -0
- package/dist/validations/asInteger.mjs +12 -0
- package/dist/validations/asInteger.mjs.map +1 -0
- package/dist/validations/bitfield.d.mts +24 -0
- package/dist/validations/bitfield.d.mts.map +1 -0
- package/dist/validations/bitfield.mjs +22 -0
- package/dist/validations/bitfield.mjs.map +1 -0
- package/dist/validations/boundedArray.d.mts +14 -0
- package/dist/validations/boundedArray.d.mts.map +1 -0
- package/dist/validations/boundedArray.mjs +11 -0
- package/dist/validations/boundedArray.mjs.map +1 -0
- package/dist/validations/boundedInteger.d.mts +14 -0
- package/dist/validations/boundedInteger.d.mts.map +1 -0
- package/dist/validations/boundedInteger.mjs +11 -0
- package/dist/validations/boundedInteger.mjs.map +1 -0
- package/dist/validations/boundedString.d.mts +15 -0
- package/dist/validations/boundedString.d.mts.map +1 -0
- package/dist/validations/boundedString.mjs +12 -0
- package/dist/validations/boundedString.mjs.map +1 -0
- package/dist/validations/datauri.d.mts +25 -0
- package/dist/validations/datauri.d.mts.map +1 -0
- package/dist/validations/datauri.mjs +19 -0
- package/dist/validations/datauri.mjs.map +1 -0
- package/dist/validations/fileUpload.d.mts +130 -0
- package/dist/validations/fileUpload.d.mts.map +1 -0
- package/dist/validations/fileUpload.mjs +116 -0
- package/dist/validations/fileUpload.mjs.map +1 -0
- package/dist/validations/hasMimeType.d.mts +17 -0
- package/dist/validations/hasMimeType.d.mts.map +1 -0
- package/dist/validations/hasMimeType.mjs +18 -0
- package/dist/validations/hasMimeType.mjs.map +1 -0
- package/dist/validations/hasSize.d.mts +11 -0
- package/dist/validations/hasSize.d.mts.map +1 -0
- package/dist/validations/hasSize.mjs +14 -0
- package/dist/validations/hasSize.mjs.map +1 -0
- package/dist/validations/index.d.mts +15 -0
- package/dist/validations/index.mjs +15 -0
- package/dist/validations/schema.d.mts +103 -0
- package/dist/validations/schema.d.mts.map +1 -0
- package/dist/validations/schema.mjs +111 -0
- package/dist/validations/schema.mjs.map +1 -0
- package/dist/validations/{snowflake.d.ts → snowflake.d.mts} +10 -7
- package/dist/validations/snowflake.d.mts.map +1 -0
- package/dist/validations/snowflake.mjs +30 -0
- package/dist/validations/snowflake.mjs.map +1 -0
- package/dist/validations/timestamp.d.mts +8 -0
- package/dist/validations/timestamp.d.mts.map +1 -0
- package/dist/validations/timestamp.mjs +8 -0
- package/dist/validations/timestamp.mjs.map +1 -0
- package/dist/validations/toBlob.d.mts +8 -0
- package/dist/validations/toBlob.d.mts.map +1 -0
- package/dist/validations/toBlob.mjs +19 -0
- package/dist/validations/toBlob.mjs.map +1 -0
- package/dist/validations/url.d.mts +7 -0
- package/dist/validations/url.d.mts.map +1 -0
- package/dist/validations/url.mjs +7 -0
- package/dist/validations/url.mjs.map +1 -0
- package/package.json +10 -23
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -3
- package/dist/index.js.map +0 -1
- package/dist/requests/DiscordSession.d.ts +0 -25
- package/dist/requests/DiscordSession.js +0 -255
- package/dist/requests/DiscordSession.js.map +0 -1
- package/dist/requests/addParams.d.ts +0 -2
- package/dist/requests/addParams.js +0 -11
- package/dist/requests/addParams.js.map +0 -1
- package/dist/requests/buildURL.d.ts +0 -2
- package/dist/requests/buildURL.js +0 -4
- package/dist/requests/buildURL.js.map +0 -1
- package/dist/requests/getAsset.d.ts +0 -2
- package/dist/requests/getAsset.js +0 -3
- package/dist/requests/getAsset.js.map +0 -1
- package/dist/requests/index.d.ts +0 -8
- package/dist/requests/index.js +0 -9
- package/dist/requests/index.js.map +0 -1
- package/dist/requests/methods.d.ts +0 -13
- package/dist/requests/methods.js +0 -8
- package/dist/requests/methods.js.map +0 -1
- package/dist/requests/request.d.ts +0 -2
- package/dist/requests/request.js +0 -30
- package/dist/requests/request.js.map +0 -1
- package/dist/requests/toProcedure.d.ts +0 -31
- package/dist/requests/toProcedure.js +0 -36
- package/dist/requests/toProcedure.js.map +0 -1
- package/dist/requests/toQuery.d.ts +0 -28
- package/dist/requests/toQuery.js +0 -9
- package/dist/requests/toQuery.js.map +0 -1
- package/dist/requests/toValidated.d.ts +0 -13
- package/dist/requests/toValidated.js +0 -29
- package/dist/requests/toValidated.js.map +0 -1
- package/dist/requests/verifyKey.js +0 -91
- package/dist/requests/verifyKey.js.map +0 -1
- package/dist/utils/isBetween.d.ts +0 -1
- package/dist/utils/isBetween.js +0 -2
- package/dist/utils/isBetween.js.map +0 -1
- package/dist/utils/isNonNullable.d.ts +0 -20
- package/dist/utils/isNonNullable.js.map +0 -1
- package/dist/utils/isNumericString.d.ts +0 -1
- package/dist/utils/isNumericString.js +0 -2
- package/dist/utils/isNumericString.js.map +0 -1
- package/dist/utils/isObject.d.ts +0 -1
- package/dist/utils/isObject.js +0 -2
- package/dist/utils/isObject.js.map +0 -1
- package/dist/utils/sleep.d.ts +0 -4
- package/dist/utils/sleep.js +0 -5
- package/dist/utils/sleep.js.map +0 -1
- package/dist/utils/toCamelCase.d.ts +0 -1
- package/dist/utils/toCamelCase.js +0 -2
- package/dist/utils/toCamelCase.js.map +0 -1
- package/dist/utils/toCamelKeys.d.ts +0 -2
- package/dist/utils/toCamelKeys.js +0 -16
- package/dist/utils/toCamelKeys.js.map +0 -1
- package/dist/utils/toSnakeCase.d.ts +0 -1
- package/dist/utils/toSnakeCase.js +0 -4
- package/dist/utils/toSnakeCase.js.map +0 -1
- package/dist/utils/toSnakeKeys.d.ts +0 -2
- package/dist/utils/toSnakeKeys.js +0 -16
- package/dist/utils/toSnakeKeys.js.map +0 -1
- package/dist/validations/asDigits.d.ts +0 -6
- package/dist/validations/asDigits.js +0 -6
- package/dist/validations/asDigits.js.map +0 -1
- package/dist/validations/asInteger.d.ts +0 -6
- package/dist/validations/asInteger.js +0 -6
- package/dist/validations/asInteger.js.map +0 -1
- package/dist/validations/bitfield.d.ts +0 -17
- package/dist/validations/bitfield.js +0 -37
- package/dist/validations/bitfield.js.map +0 -1
- package/dist/validations/boundedArray.d.ts +0 -6
- package/dist/validations/boundedArray.js +0 -8
- package/dist/validations/boundedArray.js.map +0 -1
- package/dist/validations/boundedInteger.d.ts +0 -6
- package/dist/validations/boundedInteger.js +0 -8
- package/dist/validations/boundedInteger.js.map +0 -1
- package/dist/validations/boundedString.d.ts +0 -6
- package/dist/validations/boundedString.js +0 -8
- package/dist/validations/boundedString.js.map +0 -1
- package/dist/validations/datauri.d.ts +0 -20
- package/dist/validations/datauri.js +0 -20
- package/dist/validations/datauri.js.map +0 -1
- package/dist/validations/hasMimeType.d.ts +0 -10
- package/dist/validations/hasMimeType.js +0 -18
- package/dist/validations/hasMimeType.js.map +0 -1
- package/dist/validations/hasSize.d.ts +0 -5
- package/dist/validations/hasSize.js +0 -13
- package/dist/validations/hasSize.js.map +0 -1
- package/dist/validations/index.d.ts +0 -12
- package/dist/validations/index.js +0 -13
- package/dist/validations/index.js.map +0 -1
- package/dist/validations/snowflake.js +0 -39
- package/dist/validations/snowflake.js.map +0 -1
- package/dist/validations/timestamp.d.ts +0 -3
- package/dist/validations/timestamp.js +0 -4
- package/dist/validations/timestamp.js.map +0 -1
- package/dist/validations/toBlob.d.ts +0 -4
- package/dist/validations/toBlob.js +0 -19
- package/dist/validations/toBlob.js.map +0 -1
- package/dist/validations/url.d.ts +0 -2
- package/dist/validations/url.js +0 -3
- package/dist/validations/url.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CheckAction } from "valibot";
|
|
2
|
+
|
|
3
|
+
//#region src/validations/hasSize.d.ts
|
|
4
|
+
/** @__NO_SIDE_EFFECTS__ */
|
|
5
|
+
declare const hasSize: (size: number | {
|
|
6
|
+
min?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
}, message?: "Data URI is the incorrect size") => CheckAction<string, typeof message>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { hasSize };
|
|
11
|
+
//# sourceMappingURL=hasSize.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasSize.d.mts","names":[],"sources":["../../src/validations/hasSize.ts"],"mappings":";;;;cAKa,OAAA,GACX,IAAA;EAAiB,GAAA;EAAc,GAAA;AAAA,GAC/B,OAAA,wCACC,WAAW,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { extractDataURIMetadata, toBase64 } from "./datauri.mjs";
|
|
2
|
+
import { check } from "valibot";
|
|
3
|
+
//#region src/validations/hasSize.ts
|
|
4
|
+
/** @__NO_SIDE_EFFECTS__ */
|
|
5
|
+
const hasSize = (size, message = `Data URI is the incorrect size`) => check((dataURI) => {
|
|
6
|
+
const { data } = extractDataURIMetadata(dataURI);
|
|
7
|
+
if (typeof data === `undefined`) throw new Error(`Received badly formatted Data URI`);
|
|
8
|
+
const actual = toBase64(data).length;
|
|
9
|
+
return typeof size === `number` ? size === actual : actual >= (size.min ?? 0) && actual <= (size.max ?? Infinity);
|
|
10
|
+
}, message);
|
|
11
|
+
//#endregion
|
|
12
|
+
export { hasSize };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=hasSize.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasSize.mjs","names":[],"sources":["../../src/validations/hasSize.ts"],"sourcesContent":["import type { CheckAction } from \"valibot\";\nimport { check } from \"valibot\";\nimport { extractDataURIMetadata, toBase64 } from \"./datauri.js\";\n\n/** @__NO_SIDE_EFFECTS__ */\nexport const hasSize = (\n size: number | { min?: number; max?: number },\n message = `Data URI is the incorrect size` as const\n): CheckAction<string, typeof message> =>\n check((dataURI: string) => {\n const { data } = extractDataURIMetadata(dataURI);\n\n if (typeof data === `undefined`) {\n throw new Error(`Received badly formatted Data URI`);\n }\n\n const actual = toBase64(data).length;\n return typeof size === `number`\n ? size === actual\n : actual >= (size.min ?? 0) && actual <= (size.max ?? Infinity);\n }, message);\n"],"mappings":";;;;AAKA,MAAa,WACX,MACA,UAAU,qCAEV,OAAO,YAAoB;CACzB,MAAM,EAAE,SAAS,uBAAuB,OAAO;CAE/C,IAAI,OAAO,SAAS,aAClB,MAAM,IAAI,MAAM,mCAAmC;CAGrD,MAAM,SAAS,SAAS,IAAI,EAAE;CAC9B,OAAO,OAAO,SAAS,WACnB,SAAS,SACT,WAAW,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO;AAC1D,GAAG,OAAO"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Flags, bitfield } from "./bitfield.mjs";
|
|
2
|
+
import { asDigits } from "./asDigits.mjs";
|
|
3
|
+
import { asInteger } from "./asInteger.mjs";
|
|
4
|
+
import { boundedArray } from "./boundedArray.mjs";
|
|
5
|
+
import { boundedInteger } from "./boundedInteger.mjs";
|
|
6
|
+
import { boundedString } from "./boundedString.mjs";
|
|
7
|
+
import { datauri, datauriRegex, extractDataURIMetadata, toBase64 } from "./datauri.mjs";
|
|
8
|
+
import { FileUpload, MULTIPART_MARKER, collectFileUploads, fileUpload, isFileUpload, multipart, shouldSerializeAsMultipart, toMultipartBody } from "./fileUpload.mjs";
|
|
9
|
+
import { hasMimeType } from "./hasMimeType.mjs";
|
|
10
|
+
import { omitFields, partialSchema, pickFields, requiredFields, schema, variantSchema } from "./schema.mjs";
|
|
11
|
+
import { toBlob } from "./toBlob.mjs";
|
|
12
|
+
import { DISCORD_EPOCH, snowflake, snowflakeToDate } from "./snowflake.mjs";
|
|
13
|
+
import { timestamp } from "./timestamp.mjs";
|
|
14
|
+
import { url } from "./url.mjs";
|
|
15
|
+
export { DISCORD_EPOCH, FileUpload, Flags, MULTIPART_MARKER, asDigits, asInteger, bitfield, boundedArray, boundedInteger, boundedString, collectFileUploads, datauri, datauriRegex, extractDataURIMetadata, fileUpload, hasMimeType, isFileUpload, multipart, omitFields, partialSchema, pickFields, requiredFields, schema, shouldSerializeAsMultipart, snowflake, snowflakeToDate, timestamp, toBase64, toBlob, toMultipartBody, url, variantSchema };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MULTIPART_MARKER, collectFileUploads, fileUpload, isFileUpload, multipart, shouldSerializeAsMultipart, toMultipartBody } from "./fileUpload.mjs";
|
|
2
|
+
import { asDigits } from "./asDigits.mjs";
|
|
3
|
+
import { asInteger } from "./asInteger.mjs";
|
|
4
|
+
import { bitfield } from "./bitfield.mjs";
|
|
5
|
+
import { boundedArray } from "./boundedArray.mjs";
|
|
6
|
+
import { boundedInteger } from "./boundedInteger.mjs";
|
|
7
|
+
import { boundedString } from "./boundedString.mjs";
|
|
8
|
+
import { datauri, datauriRegex, extractDataURIMetadata, toBase64 } from "./datauri.mjs";
|
|
9
|
+
import { hasMimeType } from "./hasMimeType.mjs";
|
|
10
|
+
import { omitFields, partialSchema, pickFields, requiredFields, schema, variantSchema } from "./schema.mjs";
|
|
11
|
+
import { toBlob } from "./toBlob.mjs";
|
|
12
|
+
import { DISCORD_EPOCH, snowflake, snowflakeToDate } from "./snowflake.mjs";
|
|
13
|
+
import { timestamp } from "./timestamp.mjs";
|
|
14
|
+
import { url } from "./url.mjs";
|
|
15
|
+
export { DISCORD_EPOCH, MULTIPART_MARKER, asDigits, asInteger, bitfield, boundedArray, boundedInteger, boundedString, collectFileUploads, datauri, datauriRegex, extractDataURIMetadata, fileUpload, hasMimeType, isFileUpload, multipart, omitFields, partialSchema, pickFields, requiredFields, schema, shouldSerializeAsMultipart, snowflake, snowflakeToDate, timestamp, toBase64, toBlob, toMultipartBody, url, variantSchema };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
|
|
3
|
+
//#region src/validations/schema.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Annotate a schema's *published* type as `v.GenericSchema<T>` so
|
|
6
|
+
* downstream `.d.ts` emit stops inlining the inner `ObjectSchema`'s
|
|
7
|
+
* entries map and instead references `T` by name. The runtime value
|
|
8
|
+
* is unchanged.
|
|
9
|
+
*
|
|
10
|
+
* Use at every type-defining schema export:
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const _userSchema = v.object({...});
|
|
14
|
+
* export interface User extends v.InferOutput<typeof _userSchema> {}
|
|
15
|
+
* export const userSchema = schema<User>(_userSchema);
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* **Why this exists**
|
|
19
|
+
*
|
|
20
|
+
* Without annotation, `typeof userSchema` is the full
|
|
21
|
+
* `v.ObjectSchema<{ id: v.GenericSchema<string>, ... }>` shape. Every
|
|
22
|
+
* downstream file that references `userSchema` (Guild, Application,
|
|
23
|
+
* Member, …) re-inlines that entries map into its own emitted
|
|
24
|
+
* declarations. This causes:
|
|
25
|
+
*
|
|
26
|
+
* - dramatic duplication of nested object shapes in `.d.ts` output
|
|
27
|
+
* - slow IDE hover (tsserver expands the full shape on every
|
|
28
|
+
* reference)
|
|
29
|
+
* - occasional TS2502 / type-too-complex errors on deeply circular
|
|
30
|
+
* schemas (Channel, Message, …)
|
|
31
|
+
*
|
|
32
|
+
* After annotation, downstream `.d.ts` files reference `User` by
|
|
33
|
+
* name from `./user/types/User.d.mts` and never inline its body.
|
|
34
|
+
*
|
|
35
|
+
* **Trade-off**
|
|
36
|
+
*
|
|
37
|
+
* `v.partial(userSchema)`, `v.pick(userSchema, [...])`, `v.omit(...)`,
|
|
38
|
+
* and `userSchema.entries.id` stop type-checking because the constraint
|
|
39
|
+
* is `ObjectSchema<...>` not `GenericSchema<T>`. Use the
|
|
40
|
+
* {@link partialSchema}, {@link pickFields}, {@link omitFields},
|
|
41
|
+
* {@link requiredFields}, and {@link variantSchema} helpers below for
|
|
42
|
+
* the common cases.
|
|
43
|
+
*
|
|
44
|
+
* @__NO_SIDE_EFFECTS__
|
|
45
|
+
*/
|
|
46
|
+
declare const schema: <T>(s: v.GenericSchema) => v.GenericSchema<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Make every key of `T` optional, both at the type level and at
|
|
49
|
+
* runtime. Equivalent to Valibot's `v.partial`, but accepts an
|
|
50
|
+
* annotated `GenericSchema<T>` (which `v.partial` would reject because
|
|
51
|
+
* its constraint is `ObjectSchema<...>`).
|
|
52
|
+
*
|
|
53
|
+
* @__NO_SIDE_EFFECTS__
|
|
54
|
+
*/
|
|
55
|
+
declare const partialSchema: <T>(s: v.GenericSchema<T>) => v.GenericSchema<Partial<T>>;
|
|
56
|
+
/**
|
|
57
|
+
* Pick a subset of fields from `T` at both type and runtime levels.
|
|
58
|
+
* Equivalent to Valibot's `v.pick`. See {@link partialSchema}.
|
|
59
|
+
*
|
|
60
|
+
* @__NO_SIDE_EFFECTS__
|
|
61
|
+
*/
|
|
62
|
+
declare const pickFields: <T, K extends keyof T & string>(s: v.GenericSchema<T>, keys: readonly K[]) => v.GenericSchema<Pick<T, K>>;
|
|
63
|
+
/**
|
|
64
|
+
* Omit a subset of fields from `T` at both type and runtime levels.
|
|
65
|
+
* Equivalent to Valibot's `v.omit`. See {@link partialSchema}.
|
|
66
|
+
*
|
|
67
|
+
* @__NO_SIDE_EFFECTS__
|
|
68
|
+
*/
|
|
69
|
+
declare const omitFields: <T, K extends keyof T & string>(s: v.GenericSchema<T>, keys: readonly K[]) => v.GenericSchema<Omit<T, K>>;
|
|
70
|
+
/**
|
|
71
|
+
* Mark a subset of fields on `T` as required at both type and runtime
|
|
72
|
+
* levels. Equivalent to Valibot's `v.required`. See {@link partialSchema}.
|
|
73
|
+
*
|
|
74
|
+
* @__NO_SIDE_EFFECTS__
|
|
75
|
+
*/
|
|
76
|
+
declare const requiredFields: <T, K extends keyof T & string>(s: v.GenericSchema<T>, keys: readonly K[]) => v.GenericSchema<T & Required<Pick<T, K>>>;
|
|
77
|
+
/**
|
|
78
|
+
* Build a discriminated union schema. Equivalent to Valibot's
|
|
79
|
+
* `v.variant`, but accepts annotated `GenericSchema<T>` variants
|
|
80
|
+
* (which `v.variant` would reject because its constraint is
|
|
81
|
+
* `ObjectSchema<...>`).
|
|
82
|
+
*
|
|
83
|
+
* Prefer `v.variant` whenever variants share a literal discriminator
|
|
84
|
+
* field — it dispatches on that field at runtime, producing focused
|
|
85
|
+
* error messages and O(1) validation, vs. {@link v.union}'s O(n)
|
|
86
|
+
* try-each behavior.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* export const channelSchema = variantSchema<Channel>(`type`, [
|
|
91
|
+
* guildTextChannelSchema,
|
|
92
|
+
* guildVoiceChannelSchema,
|
|
93
|
+
* threadChannelSchema,
|
|
94
|
+
* // ...
|
|
95
|
+
* ]);
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @__NO_SIDE_EFFECTS__
|
|
99
|
+
*/
|
|
100
|
+
declare const variantSchema: <T>(key: keyof T & string, schemas: readonly v.GenericSchema[]) => v.GenericSchema<T>;
|
|
101
|
+
//#endregion
|
|
102
|
+
export { omitFields, partialSchema, pickFields, requiredFields, schema, variantSchema };
|
|
103
|
+
//# sourceMappingURL=schema.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.mts","names":[],"sources":["../../src/validations/schema.ts"],"mappings":";;;;;AA4CA;;;;;;;;;;;;;;;;AAAgE;AAWhE;;;;;;;;;;;;;;;;;;;;AAE4B;AAc5B;;cA3Ba,MAAA,MAAa,CAAA,EAAG,CAAA,CAAE,aAAA,KAAgB,CAAA,CAAE,aAAA,CAAc,CAAA;;;;;;;;;cAWlD,aAAA,MACX,CAAA,EAAG,CAAA,CAAE,aAAA,CAAc,CAAA,MAClB,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,CAAA;;;;;;;cAcd,UAAA,sBAAiC,CAAA,WAC5C,CAAA,EAAG,CAAA,CAAE,aAAA,CAAc,CAAA,GACnB,IAAA,WAAe,CAAA,OACd,CAAA,CAAE,aAAA,CAAc,IAAA,CAAK,CAAA,EAAG,CAAA;;;;;;;cAcd,UAAA,sBAAiC,CAAA,WAC5C,CAAA,EAAG,CAAA,CAAE,aAAA,CAAc,CAAA,GACnB,IAAA,WAAe,CAAA,OACd,CAAA,CAAE,aAAA,CAAc,IAAA,CAAK,CAAA,EAAG,CAAA;;;AAjBC;AAc5B;;;cAiBa,cAAA,sBAAqC,CAAA,WAChD,CAAA,EAAG,CAAA,CAAE,aAAA,CAAc,CAAA,GACnB,IAAA,WAAe,CAAA,OACd,CAAA,CAAE,aAAA,CAAc,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;cA+B3B,aAAA,MACX,GAAA,QAAW,CAAA,WACX,OAAA,WAAkB,CAAA,CAAE,aAAA,OACnB,CAAA,CAAE,aAAA,CAAc,CAAA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
//#region src/validations/schema.ts
|
|
3
|
+
/**
|
|
4
|
+
* Annotate a schema's *published* type as `v.GenericSchema<T>` so
|
|
5
|
+
* downstream `.d.ts` emit stops inlining the inner `ObjectSchema`'s
|
|
6
|
+
* entries map and instead references `T` by name. The runtime value
|
|
7
|
+
* is unchanged.
|
|
8
|
+
*
|
|
9
|
+
* Use at every type-defining schema export:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const _userSchema = v.object({...});
|
|
13
|
+
* export interface User extends v.InferOutput<typeof _userSchema> {}
|
|
14
|
+
* export const userSchema = schema<User>(_userSchema);
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* **Why this exists**
|
|
18
|
+
*
|
|
19
|
+
* Without annotation, `typeof userSchema` is the full
|
|
20
|
+
* `v.ObjectSchema<{ id: v.GenericSchema<string>, ... }>` shape. Every
|
|
21
|
+
* downstream file that references `userSchema` (Guild, Application,
|
|
22
|
+
* Member, …) re-inlines that entries map into its own emitted
|
|
23
|
+
* declarations. This causes:
|
|
24
|
+
*
|
|
25
|
+
* - dramatic duplication of nested object shapes in `.d.ts` output
|
|
26
|
+
* - slow IDE hover (tsserver expands the full shape on every
|
|
27
|
+
* reference)
|
|
28
|
+
* - occasional TS2502 / type-too-complex errors on deeply circular
|
|
29
|
+
* schemas (Channel, Message, …)
|
|
30
|
+
*
|
|
31
|
+
* After annotation, downstream `.d.ts` files reference `User` by
|
|
32
|
+
* name from `./user/types/User.d.mts` and never inline its body.
|
|
33
|
+
*
|
|
34
|
+
* **Trade-off**
|
|
35
|
+
*
|
|
36
|
+
* `v.partial(userSchema)`, `v.pick(userSchema, [...])`, `v.omit(...)`,
|
|
37
|
+
* and `userSchema.entries.id` stop type-checking because the constraint
|
|
38
|
+
* is `ObjectSchema<...>` not `GenericSchema<T>`. Use the
|
|
39
|
+
* {@link partialSchema}, {@link pickFields}, {@link omitFields},
|
|
40
|
+
* {@link requiredFields}, and {@link variantSchema} helpers below for
|
|
41
|
+
* the common cases.
|
|
42
|
+
*
|
|
43
|
+
* @__NO_SIDE_EFFECTS__
|
|
44
|
+
*/
|
|
45
|
+
const schema = (s) => s;
|
|
46
|
+
/**
|
|
47
|
+
* Make every key of `T` optional, both at the type level and at
|
|
48
|
+
* runtime. Equivalent to Valibot's `v.partial`, but accepts an
|
|
49
|
+
* annotated `GenericSchema<T>` (which `v.partial` would reject because
|
|
50
|
+
* its constraint is `ObjectSchema<...>`).
|
|
51
|
+
*
|
|
52
|
+
* @__NO_SIDE_EFFECTS__
|
|
53
|
+
*/
|
|
54
|
+
const partialSchema = (s) => v.partial(s);
|
|
55
|
+
/**
|
|
56
|
+
* Pick a subset of fields from `T` at both type and runtime levels.
|
|
57
|
+
* Equivalent to Valibot's `v.pick`. See {@link partialSchema}.
|
|
58
|
+
*
|
|
59
|
+
* @__NO_SIDE_EFFECTS__
|
|
60
|
+
*/
|
|
61
|
+
const pickFields = (s, keys) => {
|
|
62
|
+
return v.pick(s, keys);
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Omit a subset of fields from `T` at both type and runtime levels.
|
|
66
|
+
* Equivalent to Valibot's `v.omit`. See {@link partialSchema}.
|
|
67
|
+
*
|
|
68
|
+
* @__NO_SIDE_EFFECTS__
|
|
69
|
+
*/
|
|
70
|
+
const omitFields = (s, keys) => {
|
|
71
|
+
return v.omit(s, keys);
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Mark a subset of fields on `T` as required at both type and runtime
|
|
75
|
+
* levels. Equivalent to Valibot's `v.required`. See {@link partialSchema}.
|
|
76
|
+
*
|
|
77
|
+
* @__NO_SIDE_EFFECTS__
|
|
78
|
+
*/
|
|
79
|
+
const requiredFields = (s, keys) => {
|
|
80
|
+
return v.required(s, keys);
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Build a discriminated union schema. Equivalent to Valibot's
|
|
84
|
+
* `v.variant`, but accepts annotated `GenericSchema<T>` variants
|
|
85
|
+
* (which `v.variant` would reject because its constraint is
|
|
86
|
+
* `ObjectSchema<...>`).
|
|
87
|
+
*
|
|
88
|
+
* Prefer `v.variant` whenever variants share a literal discriminator
|
|
89
|
+
* field — it dispatches on that field at runtime, producing focused
|
|
90
|
+
* error messages and O(1) validation, vs. {@link v.union}'s O(n)
|
|
91
|
+
* try-each behavior.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* export const channelSchema = variantSchema<Channel>(`type`, [
|
|
96
|
+
* guildTextChannelSchema,
|
|
97
|
+
* guildVoiceChannelSchema,
|
|
98
|
+
* threadChannelSchema,
|
|
99
|
+
* // ...
|
|
100
|
+
* ]);
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @__NO_SIDE_EFFECTS__
|
|
104
|
+
*/
|
|
105
|
+
const variantSchema = (key, schemas) => {
|
|
106
|
+
return v.variant(key, schemas);
|
|
107
|
+
};
|
|
108
|
+
//#endregion
|
|
109
|
+
export { omitFields, partialSchema, pickFields, requiredFields, schema, variantSchema };
|
|
110
|
+
|
|
111
|
+
//# sourceMappingURL=schema.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.mjs","names":[],"sources":["../../src/validations/schema.ts"],"sourcesContent":["import * as v from \"valibot\";\n\n/**\n * Annotate a schema's *published* type as `v.GenericSchema<T>` so\n * downstream `.d.ts` emit stops inlining the inner `ObjectSchema`'s\n * entries map and instead references `T` by name. The runtime value\n * is unchanged.\n *\n * Use at every type-defining schema export:\n *\n * ```ts\n * const _userSchema = v.object({...});\n * export interface User extends v.InferOutput<typeof _userSchema> {}\n * export const userSchema = schema<User>(_userSchema);\n * ```\n *\n * **Why this exists**\n *\n * Without annotation, `typeof userSchema` is the full\n * `v.ObjectSchema<{ id: v.GenericSchema<string>, ... }>` shape. Every\n * downstream file that references `userSchema` (Guild, Application,\n * Member, …) re-inlines that entries map into its own emitted\n * declarations. This causes:\n *\n * - dramatic duplication of nested object shapes in `.d.ts` output\n * - slow IDE hover (tsserver expands the full shape on every\n * reference)\n * - occasional TS2502 / type-too-complex errors on deeply circular\n * schemas (Channel, Message, …)\n *\n * After annotation, downstream `.d.ts` files reference `User` by\n * name from `./user/types/User.d.mts` and never inline its body.\n *\n * **Trade-off**\n *\n * `v.partial(userSchema)`, `v.pick(userSchema, [...])`, `v.omit(...)`,\n * and `userSchema.entries.id` stop type-checking because the constraint\n * is `ObjectSchema<...>` not `GenericSchema<T>`. Use the\n * {@link partialSchema}, {@link pickFields}, {@link omitFields},\n * {@link requiredFields}, and {@link variantSchema} helpers below for\n * the common cases.\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport const schema = <T>(s: v.GenericSchema): v.GenericSchema<T> =>\n s as v.GenericSchema<T>;\n\n/**\n * Make every key of `T` optional, both at the type level and at\n * runtime. Equivalent to Valibot's `v.partial`, but accepts an\n * annotated `GenericSchema<T>` (which `v.partial` would reject because\n * its constraint is `ObjectSchema<...>`).\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport const partialSchema = <T>(\n s: v.GenericSchema<T>\n): v.GenericSchema<Partial<T>> =>\n // The runtime cast is sound: schema<T>(...) returns an ObjectSchema\n // we only annotated as GenericSchema. v.partial reads from\n // ObjectSchema.entries, which is still there.\n v.partial(\n s as unknown as v.ObjectSchema<v.ObjectEntries, undefined>\n ) as unknown as v.GenericSchema<Partial<T>>;\n\n/**\n * Pick a subset of fields from `T` at both type and runtime levels.\n * Equivalent to Valibot's `v.pick`. See {@link partialSchema}.\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport const pickFields = <T, K extends keyof T & string>(\n s: v.GenericSchema<T>,\n keys: readonly K[]\n): v.GenericSchema<Pick<T, K>> => {\n type Erased = v.ObjectSchema<v.ObjectEntries, undefined>;\n return v.pick(\n s as unknown as Erased,\n keys as unknown as v.ObjectKeys<Erased>\n ) as unknown as v.GenericSchema<Pick<T, K>>;\n};\n\n/**\n * Omit a subset of fields from `T` at both type and runtime levels.\n * Equivalent to Valibot's `v.omit`. See {@link partialSchema}.\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport const omitFields = <T, K extends keyof T & string>(\n s: v.GenericSchema<T>,\n keys: readonly K[]\n): v.GenericSchema<Omit<T, K>> => {\n type Erased = v.ObjectSchema<v.ObjectEntries, undefined>;\n return v.omit(\n s as unknown as Erased,\n keys as unknown as v.ObjectKeys<Erased>\n ) as unknown as v.GenericSchema<Omit<T, K>>;\n};\n\n/**\n * Mark a subset of fields on `T` as required at both type and runtime\n * levels. Equivalent to Valibot's `v.required`. See {@link partialSchema}.\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport const requiredFields = <T, K extends keyof T & string>(\n s: v.GenericSchema<T>,\n keys: readonly K[]\n): v.GenericSchema<T & Required<Pick<T, K>>> => {\n type Erased = v.ObjectSchema<v.ObjectEntries, undefined>;\n return v.required(\n s as unknown as Erased,\n keys as unknown as v.ObjectKeys<Erased>\n ) as unknown as v.GenericSchema<T & Required<Pick<T, K>>>;\n};\n\n/**\n * Build a discriminated union schema. Equivalent to Valibot's\n * `v.variant`, but accepts annotated `GenericSchema<T>` variants\n * (which `v.variant` would reject because its constraint is\n * `ObjectSchema<...>`).\n *\n * Prefer `v.variant` whenever variants share a literal discriminator\n * field — it dispatches on that field at runtime, producing focused\n * error messages and O(1) validation, vs. {@link v.union}'s O(n)\n * try-each behavior.\n *\n * @example\n * ```ts\n * export const channelSchema = variantSchema<Channel>(`type`, [\n * guildTextChannelSchema,\n * guildVoiceChannelSchema,\n * threadChannelSchema,\n * // ...\n * ]);\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport const variantSchema = <T>(\n key: keyof T & string,\n schemas: readonly v.GenericSchema[]\n): v.GenericSchema<T> => {\n type Erased = v.ObjectSchema<v.ObjectEntries, undefined>;\n return v.variant(\n key as never,\n schemas as unknown as [Erased, Erased, ...Erased[]]\n ) as unknown as v.GenericSchema<T>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAa,UAAa,MACxB;;;;;;;;;AAUF,MAAa,iBACX,MAKA,EAAE,QACA,CACF;;;;;;;AAQF,MAAa,cACX,GACA,SACgC;CAEhC,OAAO,EAAE,KACP,GACA,IACF;AACF;;;;;;;AAQA,MAAa,cACX,GACA,SACgC;CAEhC,OAAO,EAAE,KACP,GACA,IACF;AACF;;;;;;;AAQA,MAAa,kBACX,GACA,SAC8C;CAE9C,OAAO,EAAE,SACP,GACA,IACF;AACF;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAa,iBACX,KACA,YACuB;CAEvB,OAAO,EAAE,QACP,KACA,OACF;AACF"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import * as v from "valibot";
|
|
2
|
+
|
|
3
|
+
//#region src/validations/snowflake.d.ts
|
|
2
4
|
/** UNIX timestamp representing the first second of 2015 */
|
|
3
|
-
|
|
5
|
+
declare const DISCORD_EPOCH = 1420070400000n;
|
|
4
6
|
/**
|
|
5
7
|
* Converts a `snowflake` string to a Date relative to the given epoch
|
|
6
8
|
*
|
|
7
9
|
* Uses Discord's epoch by default
|
|
8
10
|
*
|
|
9
11
|
* https://discord.com/developers/docs/reference#snowflakes
|
|
12
|
+
*
|
|
13
|
+
* @__NO_SIDE_EFFECTS__
|
|
10
14
|
*/
|
|
11
|
-
|
|
12
|
-
/** A snowflake string to convert */
|
|
13
|
-
val: string | number | bigint,
|
|
14
|
-
/** time in milliseconds to use as the epoch to derive a Date from */
|
|
15
|
-
epoch?: bigint) => Date;
|
|
15
|
+
declare const snowflakeToDate: (/** A snowflake string to convert */val: string | number | bigint, /** time in milliseconds to use as the epoch to derive a Date from */epoch?: bigint) => Date;
|
|
16
16
|
/**
|
|
17
17
|
* An up to 64-bit unsigned numeric value derived from a timestamp which
|
|
18
18
|
* serves as a unique identifier within Discord.
|
|
@@ -22,4 +22,7 @@ epoch?: bigint) => Date;
|
|
|
22
22
|
* by checking if it's derived timestamp is a valid time at or after
|
|
23
23
|
* the Discord epoch (the first second of 2015, ie: `1420070400000`).
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
declare const snowflake: v.GenericSchema<string>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { DISCORD_EPOCH, snowflake, snowflakeToDate };
|
|
28
|
+
//# sourceMappingURL=snowflake.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snowflake.d.mts","names":[],"sources":["../../src/validations/snowflake.ts"],"mappings":";;;;cAKa,aAAA;AAAb;;;;AAA0B;AAW1B;;;;AAXA,cAWa,eAAA,uCAEX,GAAA,iGAEA,KAAA,cACC,IAAsD;AAWzD;;;;AAAuC;;;;;AAAvC,cAAa,SAAA,EAAW,CAAA,CAAE,aAAa"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { isNonNullable } from "../utils/isNonNullable.mjs";
|
|
2
|
+
import { isNumericString } from "../utils/isNumericString.mjs";
|
|
3
|
+
import * as v from "valibot";
|
|
4
|
+
//#region src/validations/snowflake.ts
|
|
5
|
+
/** UNIX timestamp representing the first second of 2015 */
|
|
6
|
+
const DISCORD_EPOCH = 1420070400000n;
|
|
7
|
+
/**
|
|
8
|
+
* Converts a `snowflake` string to a Date relative to the given epoch
|
|
9
|
+
*
|
|
10
|
+
* Uses Discord's epoch by default
|
|
11
|
+
*
|
|
12
|
+
* https://discord.com/developers/docs/reference#snowflakes
|
|
13
|
+
*
|
|
14
|
+
* @__NO_SIDE_EFFECTS__
|
|
15
|
+
*/
|
|
16
|
+
const snowflakeToDate = (val, epoch = DISCORD_EPOCH) => new Date(Number((BigInt(val) >> 22n) + epoch));
|
|
17
|
+
/**
|
|
18
|
+
* An up to 64-bit unsigned numeric value derived from a timestamp which
|
|
19
|
+
* serves as a unique identifier within Discord.
|
|
20
|
+
*
|
|
21
|
+
* Validates whether a given `number`, `bigint`, or numeric `string` is
|
|
22
|
+
* a valid [Snowflake](https://discord.com/developers/docs/reference#snowflakes)
|
|
23
|
+
* by checking if it's derived timestamp is a valid time at or after
|
|
24
|
+
* the Discord epoch (the first second of 2015, ie: `1420070400000`).
|
|
25
|
+
*/
|
|
26
|
+
const snowflake = v.pipe(v.custom((val) => isNonNullable(val) && (typeof val === `bigint` || typeof val === `number` || isNumericString(val)) && snowflakeToDate(val).getTime() >= 1420070400000n, `Invalid Snowflake`), v.title(`snowflake`));
|
|
27
|
+
//#endregion
|
|
28
|
+
export { DISCORD_EPOCH, snowflake, snowflakeToDate };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=snowflake.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snowflake.mjs","names":[],"sources":["../../src/validations/snowflake.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { isNonNullable } from \"../utils/isNonNullable.js\";\nimport { isNumericString } from \"../utils/isNumericString.js\";\n\n/** UNIX timestamp representing the first second of 2015 */\nexport const DISCORD_EPOCH = 1420070400000n;\n\n/**\n * Converts a `snowflake` string to a Date relative to the given epoch\n *\n * Uses Discord's epoch by default\n *\n * https://discord.com/developers/docs/reference#snowflakes\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport const snowflakeToDate = (\n /** A snowflake string to convert */\n val: string | number | bigint,\n /** time in milliseconds to use as the epoch to derive a Date from */\n epoch = DISCORD_EPOCH\n): Date => new Date(Number((BigInt(val) >> 22n) + epoch));\n\n/**\n * An up to 64-bit unsigned numeric value derived from a timestamp which\n * serves as a unique identifier within Discord.\n *\n * Validates whether a given `number`, `bigint`, or numeric `string` is\n * a valid [Snowflake](https://discord.com/developers/docs/reference#snowflakes)\n * by checking if it's derived timestamp is a valid time at or after\n * the Discord epoch (the first second of 2015, ie: `1420070400000`).\n */\nexport const snowflake: v.GenericSchema<string> = v.pipe(\n v.custom<string, `Invalid Snowflake`>(\n (val) =>\n // at runtime this could be any value, so filter out\n // obviously invalid input first\n isNonNullable(val) &&\n // then verify we have a numeric value\n (typeof val === `bigint` ||\n typeof val === `number` ||\n isNumericString(val)) &&\n // finally, verify that it accurately represents ms\n // at or after the Discord epoch (timestamps before\n // that cannot possibly be a valid Discord snowflake)\n snowflakeToDate(val).getTime() >= DISCORD_EPOCH,\n `Invalid Snowflake`\n ),\n v.title(`snowflake`)\n);\n"],"mappings":";;;;;AAKA,MAAa,gBAAgB;;;;;;;;;;AAW7B,MAAa,mBAEX,KAEA,QAAQ,kBACC,IAAI,KAAK,QAAQ,OAAO,GAAG,KAAK,OAAO,KAAK,CAAC;;;;;;;;;;AAWxD,MAAa,YAAqC,EAAE,KAClD,EAAE,QACC,QAGC,cAAc,GAAG,MAEhB,OAAO,QAAQ,YACd,OAAO,QAAQ,YACf,gBAAgB,GAAG,MAIrB,gBAAgB,GAAG,EAAE,QAAQ,KAAA,gBAC/B,mBACF,GACA,EAAE,MAAM,WAAW,CACrB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
|
|
3
|
+
//#region src/validations/timestamp.d.ts
|
|
4
|
+
/** An [ISO8601](https://www.loc.gov/standards/datetime/iso-tc154-wg5_n0038_iso_wd_8601-1_2016-02-16.pdf) timestamp */
|
|
5
|
+
declare const timestamp: v.GenericSchema<string>;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { timestamp };
|
|
8
|
+
//# sourceMappingURL=timestamp.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp.d.mts","names":[],"sources":["../../src/validations/timestamp.ts"],"mappings":";;;;cAGa,SAAA,EAGR,CAAA,CAAE,aAAa"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
//#region src/validations/timestamp.ts
|
|
3
|
+
/** An [ISO8601](https://www.loc.gov/standards/datetime/iso-tc154-wg5_n0038_iso_wd_8601-1_2016-02-16.pdf) timestamp */
|
|
4
|
+
const timestamp = v.message(v.pipe(v.string(), v.isoTimestamp()), (issue) => `Expected a valid timestamp, received: ${issue.received}`);
|
|
5
|
+
//#endregion
|
|
6
|
+
export { timestamp };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=timestamp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp.mjs","names":[],"sources":["../../src/validations/timestamp.ts"],"sourcesContent":["import * as v from \"valibot\";\n\n/** An [ISO8601](https://www.loc.gov/standards/datetime/iso-tc154-wg5_n0038_iso_wd_8601-1_2016-02-16.pdf) timestamp */\nexport const timestamp = v.message(\n v.pipe(v.string(), v.isoTimestamp()),\n (issue) => `Expected a valid timestamp, received: ${issue.received}`\n) as v.GenericSchema<string>;\n"],"mappings":";;;AAGA,MAAa,YAAY,EAAE,QACzB,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,aAAa,CAAC,IAClC,UAAU,yCAAyC,MAAM,UAC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toBlob.d.mts","names":[],"sources":["../../src/validations/toBlob.ts"],"mappings":";;AAMA;;cAAa,MAAA,oBAAM,eAAA,SAAA,IAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { extractDataURIMetadata, toBase64 } from "./datauri.mjs";
|
|
2
|
+
import { transform } from "valibot";
|
|
3
|
+
//#region src/validations/toBlob.ts
|
|
4
|
+
/**
|
|
5
|
+
* Transforms a `datauri` string to a Blob
|
|
6
|
+
*/
|
|
7
|
+
const toBlob = transform((dataURI) => {
|
|
8
|
+
const { mimeType, data } = extractDataURIMetadata(dataURI);
|
|
9
|
+
if (typeof mimeType === `undefined` || typeof data === `undefined`) throw new Error(`Received badly formatted Data URI`);
|
|
10
|
+
const base64 = toBase64(data);
|
|
11
|
+
const ab = new ArrayBuffer(base64.length);
|
|
12
|
+
const ia = new Uint8Array(ab);
|
|
13
|
+
for (let i = 0; i < base64.length; i++) ia[i] = base64.charCodeAt(i);
|
|
14
|
+
return new Blob([ab], { type: mimeType });
|
|
15
|
+
});
|
|
16
|
+
//#endregion
|
|
17
|
+
export { toBlob };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=toBlob.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toBlob.mjs","names":[],"sources":["../../src/validations/toBlob.ts"],"sourcesContent":["import { transform } from \"valibot\";\nimport { extractDataURIMetadata, toBase64 } from \"./datauri.js\";\n\n/**\n * Transforms a `datauri` string to a Blob\n */\nexport const toBlob = transform((dataURI: string): Blob => {\n const { mimeType, data } = extractDataURIMetadata(dataURI);\n\n if (typeof mimeType === `undefined` || typeof data === `undefined`) {\n throw new Error(`Received badly formatted Data URI`);\n }\n\n const base64 = toBase64(data);\n\n const ab = new ArrayBuffer(base64.length);\n const ia = new Uint8Array(ab);\n\n for (let i = 0; i < base64.length; i++) {\n ia[i] = base64.charCodeAt(i);\n }\n\n return new Blob([ab], { type: mimeType });\n});\n"],"mappings":";;;;;;AAMA,MAAa,SAAS,WAAW,YAA0B;CACzD,MAAM,EAAE,UAAU,SAAS,uBAAuB,OAAO;CAEzD,IAAI,OAAO,aAAa,eAAe,OAAO,SAAS,aACrD,MAAM,IAAI,MAAM,mCAAmC;CAGrD,MAAM,SAAS,SAAS,IAAI;CAE5B,MAAM,KAAK,IAAI,YAAY,OAAO,MAAM;CACxC,MAAM,KAAK,IAAI,WAAW,EAAE;CAE5B,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,GAAG,KAAK,OAAO,WAAW,CAAC;CAG7B,OAAO,IAAI,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.mts","names":[],"sources":["../../src/validations/url.ts"],"mappings":";;;cAEa,GAAA,EAAK,CAAA,CAAE,aAAa"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.mjs","names":[],"sources":["../../src/validations/url.ts"],"sourcesContent":["import * as v from \"valibot\";\n\nexport const url: v.GenericSchema<string> = v.message(\n v.pipe(v.string(), v.url()),\n (issue) => `Expected a valid URL, received: ${issue.received}`\n);\n"],"mappings":";;AAEA,MAAa,MAA+B,EAAE,QAC5C,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,IAAI,CAAC,IACzB,UAAU,mCAAmC,MAAM,UACtD"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@discordkit/core",
|
|
3
3
|
"description": "Core utility functions for Discordkit",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "4.0.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Drake Costa <drake@saeris.gg> (https://saeris.gg)",
|
|
7
7
|
"keywords": [
|
|
@@ -20,21 +20,16 @@
|
|
|
20
20
|
"registry": "https://registry.npmjs.org"
|
|
21
21
|
},
|
|
22
22
|
"type": "module",
|
|
23
|
-
"main": "./dist/index.js",
|
|
24
|
-
"module": "./dist/index.js",
|
|
25
|
-
"types": "./dist/index.d.ts",
|
|
26
|
-
"imports": {
|
|
27
|
-
"#mock-utils": "../../scripts/mock-utils.ts",
|
|
28
|
-
"#test-utils": "../../scripts/test-utils.ts"
|
|
29
|
-
},
|
|
30
23
|
"exports": {
|
|
31
24
|
".": {
|
|
32
|
-
"
|
|
33
|
-
"
|
|
25
|
+
"@discordkit/source": "./src/index.ts",
|
|
26
|
+
"types": "./dist/index.d.mts",
|
|
27
|
+
"import": "./dist/index.mjs"
|
|
34
28
|
},
|
|
35
29
|
"./*": {
|
|
36
|
-
"
|
|
37
|
-
"
|
|
30
|
+
"@discordkit/source": "./src/*.ts",
|
|
31
|
+
"types": "./dist/*.d.mts",
|
|
32
|
+
"import": "./dist/*.mjs"
|
|
38
33
|
},
|
|
39
34
|
"./package.json": "./package.json"
|
|
40
35
|
},
|
|
@@ -42,18 +37,10 @@
|
|
|
42
37
|
"dist/**/*"
|
|
43
38
|
],
|
|
44
39
|
"sideEffects": false,
|
|
45
|
-
"scripts": {
|
|
46
|
-
"dev": "yarn build --watch --declarationmap",
|
|
47
|
-
"build": "tsc",
|
|
48
|
-
"lint": "eslint --cache"
|
|
49
|
-
},
|
|
50
40
|
"peerDependencies": {
|
|
51
|
-
"valibot": ">= 1.
|
|
41
|
+
"valibot": ">= 1.4.0"
|
|
52
42
|
},
|
|
53
43
|
"devDependencies": {
|
|
54
|
-
"
|
|
55
|
-
},
|
|
56
|
-
"dependencies": {
|
|
57
|
-
"type-fest": "^4.41.0"
|
|
44
|
+
"@discordkit/test-utils": "^0.0.0"
|
|
58
45
|
}
|
|
59
|
-
}
|
|
46
|
+
}
|
package/dist/index.d.ts
DELETED
package/dist/index.js
DELETED
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export declare const endpoint = "https://discord.com/api/v10/";
|
|
2
|
-
/** @internal */
|
|
3
|
-
export declare class DiscordSession {
|
|
4
|
-
#private;
|
|
5
|
-
endpoint: string;
|
|
6
|
-
maxRetries: number;
|
|
7
|
-
get ready(): boolean;
|
|
8
|
-
constructor(authToken?: `${`Bot` | `Bearer`} ${string}` | null);
|
|
9
|
-
/**
|
|
10
|
-
* Clears the current session details, then attempts to set
|
|
11
|
-
* new session values
|
|
12
|
-
*/
|
|
13
|
-
setToken: (token: `${`Bot` | `Bearer`} ${string}`) => this;
|
|
14
|
-
clearSession: () => this;
|
|
15
|
-
getSession: () => string;
|
|
16
|
-
/**
|
|
17
|
-
* Queue a request to be processed with rate limiting
|
|
18
|
-
*/
|
|
19
|
-
queueRequest: (resource: URL, method: string, body?: string | null) => Promise<Response>;
|
|
20
|
-
/**
|
|
21
|
-
* Get current queue size (useful for monitoring)
|
|
22
|
-
*/
|
|
23
|
-
getQueueSize: () => number;
|
|
24
|
-
}
|
|
25
|
-
export declare const discord: DiscordSession;
|