booru 2.6.9 → 2.8.0
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/LICENSE.md +1 -1
- package/dist/Constants.d.ts +7 -5
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +15 -10
- package/dist/Constants.js.map +1 -1
- package/dist/Utils.d.ts +12 -3
- package/dist/Utils.d.ts.map +1 -0
- package/dist/Utils.js +49 -19
- package/dist/Utils.js.map +1 -1
- package/dist/boorus/Booru.d.ts +34 -4
- package/dist/boorus/Booru.d.ts.map +1 -0
- package/dist/boorus/Booru.js +114 -37
- package/dist/boorus/Booru.js.map +1 -1
- package/dist/boorus/Derpibooru.d.ts +4 -10
- package/dist/boorus/Derpibooru.d.ts.map +1 -0
- package/dist/boorus/Derpibooru.js +0 -8
- package/dist/boorus/Derpibooru.js.map +1 -1
- package/dist/boorus/XmlBooru.d.ts +2 -8
- package/dist/boorus/XmlBooru.d.ts.map +1 -0
- package/dist/boorus/XmlBooru.js +0 -8
- package/dist/boorus/XmlBooru.js.map +1 -1
- package/dist/index.d.ts +22 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -5
- package/dist/index.js.map +1 -1
- package/dist/sites.json +231 -1
- package/dist/structures/InternalSearchParameters.d.ts +2 -1
- package/dist/structures/InternalSearchParameters.d.ts.map +1 -0
- package/dist/structures/InternalSearchParameters.js.map +1 -1
- package/dist/structures/Post.d.ts +2 -1
- package/dist/structures/Post.d.ts.map +1 -0
- package/dist/structures/Post.js +46 -44
- package/dist/structures/Post.js.map +1 -1
- package/dist/structures/SearchParameters.d.ts +5 -4
- package/dist/structures/SearchParameters.d.ts.map +1 -0
- package/dist/structures/SearchParameters.js.map +1 -1
- package/dist/structures/SearchResults.d.ts +4 -3
- package/dist/structures/SearchResults.d.ts.map +1 -0
- package/dist/structures/SearchResults.js +20 -12
- package/dist/structures/SearchResults.js.map +1 -1
- package/dist/structures/Site.d.ts +3 -2
- package/dist/structures/Site.d.ts.map +1 -0
- package/dist/structures/Site.js.map +1 -1
- package/dist/structures/SiteApi.d.ts +3 -0
- package/dist/structures/SiteApi.d.ts.map +1 -0
- package/dist/structures/SiteApi.js.map +1 -1
- package/dist/structures/SiteInfo.d.ts +2 -1
- package/dist/structures/SiteInfo.d.ts.map +1 -0
- package/dist/structures/SiteInfo.js.map +1 -1
- package/dist/structures/Tag.d.ts +42 -0
- package/dist/structures/Tag.d.ts.map +1 -0
- package/dist/structures/Tag.js +52 -0
- package/dist/structures/Tag.js.map +1 -0
- package/dist/structures/TagListParameters.d.ts +14 -0
- package/dist/structures/TagListParameters.d.ts.map +1 -0
- package/dist/structures/TagListParameters.js +7 -0
- package/dist/structures/TagListParameters.js.map +1 -0
- package/dist/structures/TagListResults.d.ts +53 -0
- package/dist/structures/TagListResults.d.ts.map +1 -0
- package/dist/structures/TagListResults.js +73 -0
- package/dist/structures/TagListResults.js.map +1 -0
- package/package.json +17 -34
- package/readme.md +22 -5
package/LICENSE.md
CHANGED
package/dist/Constants.d.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* @module Constants
|
|
4
4
|
*/
|
|
5
|
-
import { RequestInit } from 'undici';
|
|
6
|
-
import { BooruCredentials } from './boorus/Booru';
|
|
7
|
-
import Site from './structures/Site';
|
|
8
|
-
import SiteInfo from './structures/SiteInfo';
|
|
5
|
+
import type { RequestInit } from 'undici';
|
|
6
|
+
import type { BooruCredentials } from './boorus/Booru';
|
|
7
|
+
import type Site from './structures/Site';
|
|
8
|
+
import type SiteInfo from './structures/SiteInfo';
|
|
9
9
|
export type AnySite = 'e621.net' | 'e926.net' | 'hypnohub.net' | 'danbooru.donmai.us' | 'konachan.com' | 'konachan.net' | 'yande.re' | 'gelbooru.com' | 'rule34.xxx' | 'safebooru.org' | 'tbib.org' | 'xbooru.com' | 'rule34.paheal.net' | 'derpibooru.org' | 'realbooru.com';
|
|
10
10
|
/**
|
|
11
11
|
* A map of site url/{@link SiteInfo}
|
|
@@ -23,7 +23,7 @@ export declare class BooruError extends Error {
|
|
|
23
23
|
* The user-agent to use for searches
|
|
24
24
|
* @private
|
|
25
25
|
*/
|
|
26
|
-
export declare const USER_AGENT
|
|
26
|
+
export declare const USER_AGENT: string;
|
|
27
27
|
/**
|
|
28
28
|
* Create a full uri to search with
|
|
29
29
|
*
|
|
@@ -36,6 +36,7 @@ export declare const USER_AGENT = "booru (https://github.com/AtoraSuunva/booru)"
|
|
|
36
36
|
* @param {BooryCredentials} [credentials] The credentials to use for the search, appended to the querystring
|
|
37
37
|
*/
|
|
38
38
|
export declare function searchURI(site: Site, tags?: string[], limit?: number, page?: number, credentials?: BooruCredentials): string;
|
|
39
|
+
export declare function tagListURI(site: Site, limit?: number, page?: number, credentials?: BooruCredentials): string;
|
|
39
40
|
/**
|
|
40
41
|
* The default options to use for requests
|
|
41
42
|
* <p>I could document this better but meh
|
|
@@ -43,3 +44,4 @@ export declare function searchURI(site: Site, tags?: string[], limit?: number, p
|
|
|
43
44
|
* @private
|
|
44
45
|
*/
|
|
45
46
|
export declare const defaultOptions: RequestInit;
|
|
47
|
+
//# sourceMappingURL=Constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constants.d.ts","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAA;AACzC,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAA;AAMjD,MAAM,MAAM,OAAO,GACf,UAAU,GACV,UAAU,GACV,cAAc,GACd,oBAAoB,GACpB,cAAc,GACd,cAAc,GACd,UAAU,GACV,cAAc,GACd,YAAY,GACZ,eAAe,GACf,UAAU,GACV,YAAY,GACZ,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,CAAA;AAgBnB;;GAEG;AACH,eAAO,MAAM,KAAK,EAAe,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAE1D;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,GAAG,KAAK;CAWpC;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAyE,CAAA;AAYhG;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,IAAI,EACV,IAAI,GAAE,MAAM,EAAO,EACnB,KAAK,SAAM,EACX,IAAI,SAAI,EACR,WAAW,GAAE,gBAAqB,GACjC,MAAM,CAcR;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,EACV,KAAK,SAAM,EACX,IAAI,SAAI,EACR,WAAW,GAAE,gBAAqB,GACjC,MAAM,CAQR;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,WAK5B,CAAA"}
|
package/dist/Constants.js
CHANGED
|
@@ -3,14 +3,13 @@
|
|
|
3
3
|
* @packageDocumentation
|
|
4
4
|
* @module Constants
|
|
5
5
|
*/
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
7
|
exports.defaultOptions = exports.USER_AGENT = exports.BooruError = exports.sites = void 0;
|
|
11
8
|
exports.searchURI = searchURI;
|
|
12
|
-
|
|
9
|
+
exports.tagListURI = tagListURI;
|
|
13
10
|
const Utils_1 = require("./Utils");
|
|
11
|
+
const siteJson = require('./sites.json');
|
|
12
|
+
const packageJson = require('../package.json');
|
|
14
13
|
const expandedTags = {
|
|
15
14
|
'rating:e': 'rating:explicit',
|
|
16
15
|
'rating:q': 'rating:questionable',
|
|
@@ -19,7 +18,7 @@ const expandedTags = {
|
|
|
19
18
|
/**
|
|
20
19
|
* A map of site url/{@link SiteInfo}
|
|
21
20
|
*/
|
|
22
|
-
exports.sites =
|
|
21
|
+
exports.sites = siteJson;
|
|
23
22
|
/**
|
|
24
23
|
* Custom error type for when the boorus error or for user-side error, not my code (probably)
|
|
25
24
|
* <p>The name of the error is 'BooruError'
|
|
@@ -29,7 +28,7 @@ class BooruError extends Error {
|
|
|
29
28
|
constructor(message) {
|
|
30
29
|
super(message instanceof Error ? message.message : message);
|
|
31
30
|
if (message instanceof Error) {
|
|
32
|
-
this.stack = message.stack;
|
|
31
|
+
this.stack = message.stack ?? '<No Stack>';
|
|
33
32
|
}
|
|
34
33
|
else {
|
|
35
34
|
Error.captureStackTrace(this, BooruError);
|
|
@@ -42,7 +41,7 @@ exports.BooruError = BooruError;
|
|
|
42
41
|
* The user-agent to use for searches
|
|
43
42
|
* @private
|
|
44
43
|
*/
|
|
45
|
-
exports.USER_AGENT = `booru (https://github.com/AtoraSuunva/booru)`;
|
|
44
|
+
exports.USER_AGENT = `booru/${packageJson.version} (+https://github.com/AtoraSuunva/booru)`;
|
|
46
45
|
/**
|
|
47
46
|
* Expands tags based on a simple map, used for gelbooru/safebooru/etc compat :(
|
|
48
47
|
*
|
|
@@ -72,9 +71,15 @@ function searchURI(site, tags = [], limit = 100, page = 0, credentials = {}) {
|
|
|
72
71
|
}, {
|
|
73
72
|
arrayJoin: site.tagJoin,
|
|
74
73
|
});
|
|
75
|
-
return
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
return `http${site.insecure ? '' : 's'}://${site.domain}${site.api.search}${query}`;
|
|
75
|
+
}
|
|
76
|
+
function tagListURI(site, limit = 100, page = 0, credentials = {}) {
|
|
77
|
+
const query = (0, Utils_1.querystring)({
|
|
78
|
+
limit,
|
|
79
|
+
[site.paginate]: page,
|
|
80
|
+
...credentials,
|
|
81
|
+
});
|
|
82
|
+
return `http${site.insecure ? '' : 's'}://${site.domain}${site.api.tagList}${query}`;
|
|
78
83
|
}
|
|
79
84
|
/**
|
|
80
85
|
* The default options to use for requests
|
package/dist/Constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Constants.js","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":";AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"Constants.js","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA6FH,8BAoBC;AAED,gCAaC;AA1HD,mCAAqC;AAErC,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AACxC,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AA2B9C,MAAM,YAAY,GAAY;IAC5B,UAAU,EAAE,iBAAiB;IAC7B,UAAU,EAAE,qBAAqB;IACjC,UAAU,EAAE,aAAa;CAC1B,CAAA;AAED;;GAEG;AACU,QAAA,KAAK,GAAG,QAAqC,CAAA;AAE1D;;;;GAIG;AACH,MAAa,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAuB;QACjC,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAE3D,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC3C,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,YAAY,CAAA;IAC1B,CAAC;CACF;AAZD,gCAYC;AAED;;;GAGG;AACU,QAAA,UAAU,GAAG,SAAS,WAAW,CAAC,OAAO,0CAA0C,CAAA;AAEhG;;;;;GAKG;AACH,SAAS,UAAU,CAAC,IAAc;IAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CACvB,IAAU,EACV,OAAiB,EAAE,EACnB,KAAK,GAAG,GAAG,EACX,IAAI,GAAG,CAAC,EACR,cAAgC,EAAE;IAElC,MAAM,KAAK,GAAG,IAAA,mBAAW,EACvB;QACE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC;QACjC,KAAK;QACL,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI;QACrB,GAAG,WAAW;KACf,EACD;QACE,SAAS,EAAE,IAAI,CAAC,OAAO;KACxB,CACF,CAAA;IAED,OAAO,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,CAAA;AACrF,CAAC;AAED,SAAgB,UAAU,CACxB,IAAU,EACV,KAAK,GAAG,GAAG,EACX,IAAI,GAAG,CAAC,EACR,cAAgC,EAAE;IAElC,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC;QACxB,KAAK;QACL,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI;QACrB,GAAG,WAAW;KACf,CAAC,CAAA;IAEF,OAAO,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,EAAE,CAAA;AACtF,CAAC;AAED;;;;;GAKG;AACU,QAAA,cAAc,GAAgB;IACzC,OAAO,EAAE;QACP,MAAM,EAAE,oDAAoD;QAC5D,YAAY,EAAE,kBAAU;KACzB;CACF,CAAA","sourcesContent":["/**\n * @packageDocumentation\n * @module Constants\n */\n\nimport type { RequestInit } from 'undici'\nimport type { BooruCredentials } from './boorus/Booru'\nimport type Site from './structures/Site'\nimport type SiteInfo from './structures/SiteInfo'\nimport { querystring } from './Utils'\n\nconst siteJson = require('./sites.json')\nconst packageJson = require('../package.json')\n\nexport type AnySite =\n | 'e621.net'\n | 'e926.net'\n | 'hypnohub.net'\n | 'danbooru.donmai.us'\n | 'konachan.com'\n | 'konachan.net'\n | 'yande.re'\n | 'gelbooru.com'\n | 'rule34.xxx'\n | 'safebooru.org'\n | 'tbib.org'\n | 'xbooru.com'\n | 'rule34.paheal.net'\n | 'derpibooru.org'\n | 'realbooru.com'\n\ntype gelTags = {\n 'rating:e': 'rating:explicit'\n 'rating:q': 'rating:questionable'\n 'rating:s': 'rating:safe'\n\n [key: string]: string\n}\n\nconst expandedTags: gelTags = {\n 'rating:e': 'rating:explicit',\n 'rating:q': 'rating:questionable',\n 'rating:s': 'rating:safe',\n}\n\n/**\n * A map of site url/{@link SiteInfo}\n */\nexport const sites = siteJson as Record<AnySite, SiteInfo>\n\n/**\n * Custom error type for when the boorus error or for user-side error, not my code (probably)\n * <p>The name of the error is 'BooruError'\n * @type {Error}\n */\nexport class BooruError extends Error {\n constructor(message: string | Error) {\n super(message instanceof Error ? message.message : message)\n\n if (message instanceof Error) {\n this.stack = message.stack ?? '<No Stack>'\n } else {\n Error.captureStackTrace(this, BooruError)\n }\n\n this.name = 'BooruError'\n }\n}\n\n/**\n * The user-agent to use for searches\n * @private\n */\nexport const USER_AGENT = `booru/${packageJson.version} (+https://github.com/AtoraSuunva/booru)`\n\n/**\n * Expands tags based on a simple map, used for gelbooru/safebooru/etc compat :(\n *\n * @private\n * @param {String[]} tags The tags to expand\n */\nfunction expandTags(tags: string[]): string[] {\n return tags.map((v) => expandedTags[v.toLowerCase()] ?? v)\n}\n\n/**\n * Create a full uri to search with\n *\n * @private\n * @param {string} domain The domain to search\n * @param {Site} site The site to search\n * @param {string[]} [tags=[]] The tags to search for\n * @param {number} [limit=100] The limit for images to return\n * @param {number} [page=0] The page to get\n * @param {BooryCredentials} [credentials] The credentials to use for the search, appended to the querystring\n */\nexport function searchURI(\n site: Site,\n tags: string[] = [],\n limit = 100,\n page = 0,\n credentials: BooruCredentials = {},\n): string {\n const query = querystring(\n {\n [site.tagQuery]: expandTags(tags),\n limit,\n [site.paginate]: page,\n ...credentials,\n },\n {\n arrayJoin: site.tagJoin,\n },\n )\n\n return `http${site.insecure ? '' : 's'}://${site.domain}${site.api.search}${query}`\n}\n\nexport function tagListURI(\n site: Site,\n limit = 100,\n page = 0,\n credentials: BooruCredentials = {},\n): string {\n const query = querystring({\n limit,\n [site.paginate]: page,\n ...credentials,\n })\n\n return `http${site.insecure ? '' : 's'}://${site.domain}${site.api.tagList}${query}`\n}\n\n/**\n * The default options to use for requests\n * <p>I could document this better but meh\n *\n * @private\n */\nexport const defaultOptions: RequestInit = {\n headers: {\n Accept: 'application/json, application/xml;q=0.9, */*;q=0.8',\n 'User-Agent': USER_AGENT,\n },\n}\n"]}
|
package/dist/Utils.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* @module Utils
|
|
4
4
|
*/
|
|
5
|
-
import { AnySite } from './Constants';
|
|
5
|
+
import { type AnySite } from './Constants';
|
|
6
6
|
/**
|
|
7
7
|
* Check if `site` is a supported site (and check if it's an alias and return the sites's true name)
|
|
8
8
|
*
|
|
@@ -11,13 +11,21 @@ import { AnySite } from './Constants';
|
|
|
11
11
|
*/
|
|
12
12
|
export declare function resolveSite(domain: string): AnySite | null;
|
|
13
13
|
/**
|
|
14
|
-
* Parses xml to json, which can be used with js
|
|
14
|
+
* Parses posts xml to json, which can be used with js
|
|
15
15
|
*
|
|
16
16
|
* @private
|
|
17
17
|
* @param {String} xml The xml to convert to json
|
|
18
18
|
* @return {Object[]} A Promise with an array of objects created from the xml
|
|
19
19
|
*/
|
|
20
|
-
export declare function
|
|
20
|
+
export declare function jsonifyPosts(xml: string): object[];
|
|
21
|
+
/**
|
|
22
|
+
* Parses tags xml to json, which can be used with js
|
|
23
|
+
*
|
|
24
|
+
* @private
|
|
25
|
+
* @param {String} xml The xml to convert to json
|
|
26
|
+
* @return {Object[]} A Promise with an array of objects created from the xml
|
|
27
|
+
*/
|
|
28
|
+
export declare function jsonifyTags(xml: string): object[];
|
|
21
29
|
/**
|
|
22
30
|
* Try to parse JSON, and then return an empty array if data is an empty string, or the parsed JSON
|
|
23
31
|
*
|
|
@@ -91,3 +99,4 @@ export declare function querystring(query: Record<string, QueryValue>, { arrayJo
|
|
|
91
99
|
*/
|
|
92
100
|
export declare function encodeURIQueryValue(value: QueryValue, { arrayJoin }?: EncodeURIQueryValueOptions): string;
|
|
93
101
|
export {};
|
|
102
|
+
//# sourceMappingURL=Utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Utils.d.ts","sourceRoot":"","sources":["../src/Utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,OAAO,EAAqB,MAAM,aAAa,CAAA;AAE7D;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAkB1D;AAiCD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAgClD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA+BjD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAMpE;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAe1C;AAGD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,MAAM,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAejC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAItE;AAED,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAC7C,KAAK,UAAU,GAAG,YAAY,GAAG,YAAY,EAAE,CAAA;AAE/C,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,UAAU,0BAA0B;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACjC,EAAE,SAAe,EAAE,GAAE,kBAAuB,GAC3C,MAAM,CASR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,EAAE,SAAe,EAAE,GAAE,0BAA+B,GACnD,MAAM,CAMR"}
|
package/dist/Utils.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.resolveSite = resolveSite;
|
|
8
|
-
exports.
|
|
8
|
+
exports.jsonifyPosts = jsonifyPosts;
|
|
9
|
+
exports.jsonifyTags = jsonifyTags;
|
|
9
10
|
exports.tryParseJSON = tryParseJSON;
|
|
10
11
|
exports.shuffle = shuffle;
|
|
11
12
|
exports.randInt = randInt;
|
|
@@ -13,8 +14,8 @@ exports.validateSearchParams = validateSearchParams;
|
|
|
13
14
|
exports.compareArrays = compareArrays;
|
|
14
15
|
exports.querystring = querystring;
|
|
15
16
|
exports.encodeURIQueryValue = encodeURIQueryValue;
|
|
16
|
-
const Constants_1 = require("./Constants");
|
|
17
17
|
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
18
|
+
const Constants_1 = require("./Constants");
|
|
18
19
|
/**
|
|
19
20
|
* Check if `site` is a supported site (and check if it's an alias and return the sites's true name)
|
|
20
21
|
*
|
|
@@ -25,11 +26,11 @@ function resolveSite(domain) {
|
|
|
25
26
|
if (typeof domain !== 'string') {
|
|
26
27
|
return null;
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
+
const lowerDomain = domain.toLowerCase();
|
|
29
30
|
for (const [site, info] of Object.entries(Constants_1.sites)) {
|
|
30
|
-
if (site ===
|
|
31
|
-
info.domain ===
|
|
32
|
-
info.aliases.includes(
|
|
31
|
+
if (site === lowerDomain ||
|
|
32
|
+
info.domain === lowerDomain ||
|
|
33
|
+
info.aliases.includes(lowerDomain)) {
|
|
33
34
|
return site;
|
|
34
35
|
}
|
|
35
36
|
}
|
|
@@ -40,20 +41,20 @@ const xmlParser = new fast_xml_parser_1.XMLParser({
|
|
|
40
41
|
attributeNamePrefix: '',
|
|
41
42
|
});
|
|
42
43
|
/**
|
|
43
|
-
* Parses xml to json, which can be used with js
|
|
44
|
+
* Parses posts xml to json, which can be used with js
|
|
44
45
|
*
|
|
45
46
|
* @private
|
|
46
47
|
* @param {String} xml The xml to convert to json
|
|
47
48
|
* @return {Object[]} A Promise with an array of objects created from the xml
|
|
48
49
|
*/
|
|
49
|
-
function
|
|
50
|
+
function jsonifyPosts(xml) {
|
|
50
51
|
if (typeof xml === 'object')
|
|
51
52
|
return xml;
|
|
52
53
|
const data = xmlParser.parse(xml);
|
|
53
54
|
if (data.html || data['!doctype']) {
|
|
54
55
|
// Some boorus return HTML error pages instead of JSON responses on errors
|
|
55
56
|
// So try scraping off what we can in that case
|
|
56
|
-
const page = data.html
|
|
57
|
+
const page = data.html ?? data['!doctype']?.html;
|
|
57
58
|
const message = [];
|
|
58
59
|
if (page.body.h1) {
|
|
59
60
|
message.push(page.body.h1);
|
|
@@ -71,6 +72,39 @@ function jsonfy(xml) {
|
|
|
71
72
|
}
|
|
72
73
|
return [];
|
|
73
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Parses tags xml to json, which can be used with js
|
|
77
|
+
*
|
|
78
|
+
* @private
|
|
79
|
+
* @param {String} xml The xml to convert to json
|
|
80
|
+
* @return {Object[]} A Promise with an array of objects created from the xml
|
|
81
|
+
*/
|
|
82
|
+
function jsonifyTags(xml) {
|
|
83
|
+
if (typeof xml === 'object')
|
|
84
|
+
return xml;
|
|
85
|
+
const data = xmlParser.parse(xml);
|
|
86
|
+
if (data.html || data['!doctype']) {
|
|
87
|
+
// Some boorus return HTML error pages instead of JSON responses on errors
|
|
88
|
+
// So try scraping off what we can in that case
|
|
89
|
+
const page = data.html ?? data['!doctype']?.html;
|
|
90
|
+
const message = [];
|
|
91
|
+
if (page.body.h1) {
|
|
92
|
+
message.push(page.body.h1);
|
|
93
|
+
}
|
|
94
|
+
if (page.body.p) {
|
|
95
|
+
message.push(page.body.p['#text']);
|
|
96
|
+
}
|
|
97
|
+
throw new Constants_1.BooruError(`The Booru sent back an error: '${message.join(': ')}'`);
|
|
98
|
+
}
|
|
99
|
+
if (data.tags.tag) {
|
|
100
|
+
return data.tags.tag
|
|
101
|
+
? Array.isArray(data.tags.tag)
|
|
102
|
+
? data.tags.tag
|
|
103
|
+
: [data.tags.tag]
|
|
104
|
+
: [];
|
|
105
|
+
}
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
74
108
|
/**
|
|
75
109
|
* Try to parse JSON, and then return an empty array if data is an empty string, or the parsed JSON
|
|
76
110
|
*
|
|
@@ -114,9 +148,9 @@ function shuffle(array) {
|
|
|
114
148
|
* @param {Number} max The maximum (inclusive)
|
|
115
149
|
*/
|
|
116
150
|
function randInt(min, max) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
return Math.floor(Math.random() * (
|
|
151
|
+
const nmin = Math.ceil(min);
|
|
152
|
+
const nmax = Math.floor(max);
|
|
153
|
+
return Math.floor(Math.random() * (nmax - nmin + 1)) + nmin;
|
|
120
154
|
}
|
|
121
155
|
/**
|
|
122
156
|
* Performs some basic search validation
|
|
@@ -127,16 +161,14 @@ function randInt(min, max) {
|
|
|
127
161
|
*/
|
|
128
162
|
function validateSearchParams(site, limit) {
|
|
129
163
|
const resolvedSite = resolveSite(site);
|
|
130
|
-
|
|
131
|
-
limit = parseInt(limit, 10);
|
|
132
|
-
}
|
|
164
|
+
const resolvedLimit = typeof limit !== 'number' ? Number.parseInt(limit, 10) : limit;
|
|
133
165
|
if (resolvedSite === null) {
|
|
134
166
|
throw new Constants_1.BooruError('Site not supported');
|
|
135
167
|
}
|
|
136
168
|
if (typeof limit !== 'number' || Number.isNaN(limit)) {
|
|
137
169
|
throw new Constants_1.BooruError('`limit` should be an int');
|
|
138
170
|
}
|
|
139
|
-
return { site: resolvedSite, limit };
|
|
171
|
+
return { site: resolvedSite, limit: resolvedLimit };
|
|
140
172
|
}
|
|
141
173
|
/**
|
|
142
174
|
* Finds the matching strings between two arrays
|
|
@@ -177,8 +209,6 @@ function encodeURIQueryValue(value, { arrayJoin = '+' } = {}) {
|
|
|
177
209
|
if (Array.isArray(value)) {
|
|
178
210
|
return value.map(encodeURIComponent).join(arrayJoin);
|
|
179
211
|
}
|
|
180
|
-
|
|
181
|
-
return encodeURIComponent(value);
|
|
182
|
-
}
|
|
212
|
+
return encodeURIComponent(value);
|
|
183
213
|
}
|
|
184
214
|
//# sourceMappingURL=Utils.js.map
|
package/dist/Utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../src/Utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../src/Utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @packageDocumentation\n * @module Utils\n */\n\nimport { XMLParser } from 'fast-xml-parser'\nimport { type AnySite, BooruError, sites } from './Constants'\n\n/**\n * Check if `site` is a supported site (and check if it's an alias and return the sites's true name)\n *\n * @param {String} domain The site to resolveSite\n * @return {String?} null if site is not supported, the site otherwise\n */\nexport function resolveSite(domain: string): AnySite | null {\n if (typeof domain !== 'string') {\n return null\n }\n\n const lowerDomain = domain.toLowerCase()\n\n for (const [site, info] of Object.entries(sites)) {\n if (\n site === lowerDomain ||\n info.domain === lowerDomain ||\n info.aliases.includes(lowerDomain)\n ) {\n return site as AnySite\n }\n }\n\n return null\n}\n\ninterface XMLPage {\n html: any\n}\n\ninterface XMLPosts {\n post?: any[]\n tag?: any\n}\n\ninterface XMLTags {\n tag?: any[]\n}\n\ninterface BooruXML {\n html?: XMLPage\n '!doctype'?: XMLPage\n}\n\ninterface BooruXMLPosts extends BooruXML {\n posts: XMLPosts\n}\n\ninterface BooruXMLTags extends BooruXML {\n tags: XMLTags\n}\n\nconst xmlParser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '',\n})\n\n/**\n * Parses posts xml to json, which can be used with js\n *\n * @private\n * @param {String} xml The xml to convert to json\n * @return {Object[]} A Promise with an array of objects created from the xml\n */\nexport function jsonifyPosts(xml: string): object[] {\n if (typeof xml === 'object') return xml\n\n const data = xmlParser.parse(xml) as BooruXMLPosts\n\n if (data.html || data['!doctype']) {\n // Some boorus return HTML error pages instead of JSON responses on errors\n // So try scraping off what we can in that case\n const page = data.html ?? data['!doctype']?.html\n const message = []\n if (page.body.h1) {\n message.push(page.body.h1)\n }\n\n if (page.body.p) {\n message.push(page.body.p['#text'])\n }\n\n throw new BooruError(\n `The Booru sent back an error: '${message.join(': ')}'`,\n )\n }\n\n if (data.posts.post) {\n return data.posts.post\n }\n\n if (data.posts.tag) {\n return Array.isArray(data.posts.tag) ? data.posts.tag : [data.posts.tag]\n }\n\n return []\n}\n\n/**\n * Parses tags xml to json, which can be used with js\n *\n * @private\n * @param {String} xml The xml to convert to json\n * @return {Object[]} A Promise with an array of objects created from the xml\n */\nexport function jsonifyTags(xml: string): object[] {\n if (typeof xml === 'object') return xml\n\n const data = xmlParser.parse(xml) as BooruXMLTags\n\n if (data.html || data['!doctype']) {\n // Some boorus return HTML error pages instead of JSON responses on errors\n // So try scraping off what we can in that case\n const page = data.html ?? data['!doctype']?.html\n const message = []\n if (page.body.h1) {\n message.push(page.body.h1)\n }\n\n if (page.body.p) {\n message.push(page.body.p['#text'])\n }\n\n throw new BooruError(\n `The Booru sent back an error: '${message.join(': ')}'`,\n )\n }\n\n if (data.tags.tag) {\n return data.tags.tag\n ? Array.isArray(data.tags.tag)\n ? data.tags.tag\n : [data.tags.tag]\n : []\n }\n return []\n}\n\n/**\n * Try to parse JSON, and then return an empty array if data is an empty string, or the parsed JSON\n *\n * Blame rule34.xxx for returning literally an empty response with HTTP 200 for this\n * @param data The data to try and parse\n * @returns Either the parsed data, or an empty array\n */\nexport function tryParseJSON(data: string): Record<string, unknown>[] {\n if (data === '') {\n return []\n }\n\n return JSON.parse(data)\n}\n\n/**\n * Yay fisher-bates\n * Taken from http://stackoverflow.com/a/2450976\n *\n * @private\n * @param {Array} array Array of something\n * @return {Array} Shuffled array of something\n */\nexport function shuffle<T>(array: T[]): T[] {\n let currentIndex: number = array.length\n let temporaryValue: T\n let randomIndex: number\n\n while (currentIndex !== 0) {\n randomIndex = Math.floor(Math.random() * currentIndex)\n currentIndex -= 1\n\n temporaryValue = array[currentIndex]\n array[currentIndex] = array[randomIndex]\n array[randomIndex] = temporaryValue\n }\n\n return array\n}\n\n// Thanks mdn and damnit derpibooru\n/**\n * Generate a random int between [min, max]\n *\n * @private\n * @param {Number} min The minimum (inclusive)\n * @param {Number} max The maximum (inclusive)\n */\nexport function randInt(min: number, max: number): number {\n const nmin = Math.ceil(min)\n const nmax = Math.floor(max)\n return Math.floor(Math.random() * (nmax - nmin + 1)) + nmin\n}\n\n/**\n * Performs some basic search validation\n *\n * @private\n * @param {String} site The site to resolve\n * @param {Number|String} limit The limit for the amount of images to fetch\n */\nexport function validateSearchParams(\n site: string,\n limit: number | string,\n): { site: string; limit: number } {\n const resolvedSite = resolveSite(site)\n\n const resolvedLimit =\n typeof limit !== 'number' ? Number.parseInt(limit, 10) : limit\n\n if (resolvedSite === null) {\n throw new BooruError('Site not supported')\n }\n\n if (typeof limit !== 'number' || Number.isNaN(limit)) {\n throw new BooruError('`limit` should be an int')\n }\n\n return { site: resolvedSite, limit: resolvedLimit }\n}\n\n/**\n * Finds the matching strings between two arrays\n *\n * @private\n * @param {String[]} arr1 The first array\n * @param {String[]} arr2 The second array\n * @return {String[]} The shared strings between the arrays\n */\nexport function compareArrays(arr1: string[], arr2: string[]): string[] {\n return arr1.filter((e1) =>\n arr2.some((e2) => e1.toLowerCase() === e2.toLowerCase()),\n )\n}\n\ntype URIEncodable = string | number | boolean\ntype QueryValue = URIEncodable | URIEncodable[]\n\ninterface QuerystringOptions {\n arrayJoin?: string\n}\n\ninterface EncodeURIQueryValueOptions {\n arrayJoin?: string\n}\n\n/**\n * Turns an object into a query string, correctly encoding uri components\n *\n * @example\n * const options = { page: 10, limit: 100 }\n * const query = querystring(options) // 'page=10&limit=100'\n * console.log(`https://example.com?${query}`)\n *\n * @param query An object with key/value pairs that will be turned into a string\n * @returns A string that can be appended to a url (after `?`)\n */\nexport function querystring(\n query: Record<string, QueryValue>,\n { arrayJoin = '+' }: QuerystringOptions = {},\n): string {\n return Object.entries(query)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIQueryValue(value, {\n arrayJoin,\n })}`,\n )\n .join('&')\n}\n\n/**\n * Encodes a single value or an array of values to be usable in as a URI component,\n * joining array elements with '+'\n * @param value The value to encode\n * @returns An encoded value that can be passed to a querystring\n */\nexport function encodeURIQueryValue(\n value: QueryValue,\n { arrayJoin = '+' }: EncodeURIQueryValueOptions = {},\n): string {\n if (Array.isArray(value)) {\n return value.map(encodeURIComponent).join(arrayJoin)\n }\n\n return encodeURIComponent(value)\n}\n"]}
|
package/dist/boorus/Booru.d.ts
CHANGED
|
@@ -2,16 +2,21 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* @module Boorus
|
|
4
4
|
*/
|
|
5
|
-
import InternalSearchParameters from '../structures/InternalSearchParameters';
|
|
6
|
-
import SearchParameters from '../structures/SearchParameters';
|
|
5
|
+
import type InternalSearchParameters from '../structures/InternalSearchParameters';
|
|
6
|
+
import type SearchParameters from '../structures/SearchParameters';
|
|
7
7
|
import SearchResults from '../structures/SearchResults';
|
|
8
|
-
import Site from '../structures/Site';
|
|
8
|
+
import type Site from '../structures/Site';
|
|
9
|
+
import TagListResults from '../structures/TagListResults';
|
|
9
10
|
export type BooruCredentials = Record<string, string>;
|
|
10
11
|
interface SearchUrlParams {
|
|
11
12
|
tags: string[];
|
|
12
13
|
limit: number;
|
|
13
14
|
page: number;
|
|
14
15
|
}
|
|
16
|
+
interface TagsURLParams {
|
|
17
|
+
limit?: number | undefined;
|
|
18
|
+
page?: number | undefined;
|
|
19
|
+
}
|
|
15
20
|
/**
|
|
16
21
|
* A basic, JSON booru
|
|
17
22
|
* @example
|
|
@@ -36,7 +41,7 @@ export declare class Booru {
|
|
|
36
41
|
/** The site object representing this booru */
|
|
37
42
|
site: Site;
|
|
38
43
|
/** The credentials to use for this booru */
|
|
39
|
-
credentials?: BooruCredentials;
|
|
44
|
+
credentials?: BooruCredentials | undefined;
|
|
40
45
|
/**
|
|
41
46
|
* Create a new booru from a site
|
|
42
47
|
*
|
|
@@ -60,6 +65,14 @@ export declare class Booru {
|
|
|
60
65
|
* @return {String} The url to the post
|
|
61
66
|
*/
|
|
62
67
|
postView(id: string | number): string;
|
|
68
|
+
/**
|
|
69
|
+
* Gets a list of tags from the booru
|
|
70
|
+
* @param {Partial<TagsURLParams>} [params] The parameters for the tags list
|
|
71
|
+
* @param {number} [params.limit=100] The limit of tags to return
|
|
72
|
+
* @param {number} [params.page=1] The page of tags to return
|
|
73
|
+
* @return {Promise<any[]>} A promise with the tags as an array
|
|
74
|
+
*/
|
|
75
|
+
tagList({ limit, page, }?: Partial<TagsURLParams>): Promise<TagListResults>;
|
|
63
76
|
/**
|
|
64
77
|
* The internal & common searching logic, pls dont use this use .search instead
|
|
65
78
|
*
|
|
@@ -78,6 +91,14 @@ export declare class Booru {
|
|
|
78
91
|
* @returns A URL to search the booru
|
|
79
92
|
*/
|
|
80
93
|
getSearchUrl({ tags, limit, page, }?: Partial<SearchUrlParams>): string;
|
|
94
|
+
/**
|
|
95
|
+
* Generates a URL to get a list of tags from the booru
|
|
96
|
+
* @param opt
|
|
97
|
+
* @param {number} [opt.limit] The limit of tags to return
|
|
98
|
+
* @param {number} [opt.page] The page of tags to return
|
|
99
|
+
* @returns {string} A URL to get the tags list
|
|
100
|
+
*/
|
|
101
|
+
getTagListUrl({ limit, page, }?: Partial<TagsURLParams>): string;
|
|
81
102
|
/**
|
|
82
103
|
* Parse the response from the booru
|
|
83
104
|
*
|
|
@@ -87,5 +108,14 @@ export declare class Booru {
|
|
|
87
108
|
* @return {SearchResults} The results of this search
|
|
88
109
|
*/
|
|
89
110
|
protected parseSearchResult(result: any, { fakeLimit, tags, limit, random, page, showUnavailable, }: InternalSearchParameters): SearchResults;
|
|
111
|
+
/**
|
|
112
|
+
* Parse the response from the booru for a tag list
|
|
113
|
+
*
|
|
114
|
+
* @param result
|
|
115
|
+
* @param param1
|
|
116
|
+
* @returns
|
|
117
|
+
*/
|
|
118
|
+
protected parseTagListResult(result: any, { limit, page }?: Partial<TagsURLParams>): TagListResults;
|
|
90
119
|
}
|
|
91
120
|
export default Booru;
|
|
121
|
+
//# sourceMappingURL=Booru.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Booru.d.ts","sourceRoot":"","sources":["../../src/boorus/Booru.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,wBAAwB,MAAM,wCAAwC,CAAA;AAElF,OAAO,KAAK,gBAAgB,MAAM,gCAAgC,CAAA;AAClE,OAAO,aAAa,MAAM,6BAA6B,CAAA;AACvD,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,cAAc,MAAM,8BAA8B,CAAA;AAgBzD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAErD,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1B;AAUD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,KAAK;IAChB,8BAA8B;IACvB,MAAM,EAAE,MAAM,CAAA;IACrB,8CAA8C;IACvC,IAAI,EAAE,IAAI,CAAA;IACjB,4CAA4C;IACrC,WAAW,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAA;IAEjD;;;;;;OAMG;gBACS,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,gBAAgB;IAYtD,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE;IAQ1D;;;;;OAKG;IACU,MAAM,CACjB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,EACE,KAAS,EACT,MAAc,EACd,IAAQ,EACR,eAAuB,GACxB,GAAE,gBAAqB,GACvB,OAAO,CAAC,aAAa,CAAC;IA4BzB;;;;;OAKG;IACI,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAU5C;;;;;;OAMG;IACU,OAAO,CAAC,EACnB,KAAW,EACX,IAAQ,GACT,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6CxD;;;;;;;OAOG;cACa,eAAe,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,EACE,GAAU,EACV,KAAS,EACT,MAAc,EACd,IAAQ,GACT,GAAE,wBAA6B,GAC/B,OAAO,CAAC,GAAG,CAAC;IA2Df;;;;;;;OAOG;IACH,YAAY,CAAC,EACX,IAAS,EACT,KAAW,EACX,IAAQ,GACT,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,MAAM;IAIzC;;;;;;OAMG;IACH,aAAa,CAAC,EACZ,KAAW,EACX,IAAQ,GACT,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,MAAM;IASvC;;;;;;;OAOG;IACH,SAAS,CAAC,iBAAiB,CACzB,MAAM,EAAE,GAAG,EACX,EACE,SAAS,EACT,IAAI,EACJ,KAAK,EACL,MAAM,EACN,IAAI,EACJ,eAAe,GAChB,EAAE,wBAAwB,GAC1B,aAAa;IAuDhB;;;;;;OAMG;IACH,SAAS,CAAC,kBAAkB,CAC1B,MAAM,EAAE,GAAG,EACX,EAAE,KAAW,EAAE,IAAQ,EAAE,GAAE,OAAO,CAAC,aAAa,CAAM,GACrD,cAAc;CAiBlB;AAED,eAAe,KAAK,CAAA"}
|