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.
Files changed (63) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/Constants.d.ts +7 -5
  3. package/dist/Constants.d.ts.map +1 -0
  4. package/dist/Constants.js +15 -10
  5. package/dist/Constants.js.map +1 -1
  6. package/dist/Utils.d.ts +12 -3
  7. package/dist/Utils.d.ts.map +1 -0
  8. package/dist/Utils.js +49 -19
  9. package/dist/Utils.js.map +1 -1
  10. package/dist/boorus/Booru.d.ts +34 -4
  11. package/dist/boorus/Booru.d.ts.map +1 -0
  12. package/dist/boorus/Booru.js +114 -37
  13. package/dist/boorus/Booru.js.map +1 -1
  14. package/dist/boorus/Derpibooru.d.ts +4 -10
  15. package/dist/boorus/Derpibooru.d.ts.map +1 -0
  16. package/dist/boorus/Derpibooru.js +0 -8
  17. package/dist/boorus/Derpibooru.js.map +1 -1
  18. package/dist/boorus/XmlBooru.d.ts +2 -8
  19. package/dist/boorus/XmlBooru.d.ts.map +1 -0
  20. package/dist/boorus/XmlBooru.js +0 -8
  21. package/dist/boorus/XmlBooru.js.map +1 -1
  22. package/dist/index.d.ts +22 -2
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +30 -5
  25. package/dist/index.js.map +1 -1
  26. package/dist/sites.json +231 -1
  27. package/dist/structures/InternalSearchParameters.d.ts +2 -1
  28. package/dist/structures/InternalSearchParameters.d.ts.map +1 -0
  29. package/dist/structures/InternalSearchParameters.js.map +1 -1
  30. package/dist/structures/Post.d.ts +2 -1
  31. package/dist/structures/Post.d.ts.map +1 -0
  32. package/dist/structures/Post.js +46 -44
  33. package/dist/structures/Post.js.map +1 -1
  34. package/dist/structures/SearchParameters.d.ts +5 -4
  35. package/dist/structures/SearchParameters.d.ts.map +1 -0
  36. package/dist/structures/SearchParameters.js.map +1 -1
  37. package/dist/structures/SearchResults.d.ts +4 -3
  38. package/dist/structures/SearchResults.d.ts.map +1 -0
  39. package/dist/structures/SearchResults.js +20 -12
  40. package/dist/structures/SearchResults.js.map +1 -1
  41. package/dist/structures/Site.d.ts +3 -2
  42. package/dist/structures/Site.d.ts.map +1 -0
  43. package/dist/structures/Site.js.map +1 -1
  44. package/dist/structures/SiteApi.d.ts +3 -0
  45. package/dist/structures/SiteApi.d.ts.map +1 -0
  46. package/dist/structures/SiteApi.js.map +1 -1
  47. package/dist/structures/SiteInfo.d.ts +2 -1
  48. package/dist/structures/SiteInfo.d.ts.map +1 -0
  49. package/dist/structures/SiteInfo.js.map +1 -1
  50. package/dist/structures/Tag.d.ts +42 -0
  51. package/dist/structures/Tag.d.ts.map +1 -0
  52. package/dist/structures/Tag.js +52 -0
  53. package/dist/structures/Tag.js.map +1 -0
  54. package/dist/structures/TagListParameters.d.ts +14 -0
  55. package/dist/structures/TagListParameters.d.ts.map +1 -0
  56. package/dist/structures/TagListParameters.js +7 -0
  57. package/dist/structures/TagListParameters.js.map +1 -0
  58. package/dist/structures/TagListResults.d.ts +53 -0
  59. package/dist/structures/TagListResults.d.ts.map +1 -0
  60. package/dist/structures/TagListResults.js +73 -0
  61. package/dist/structures/TagListResults.js.map +1 -0
  62. package/package.json +17 -34
  63. package/readme.md +22 -5
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # The MIT License (MIT)
2
2
 
3
- Copyright © `2022` `Atora Suunva`
3
+ Copyright © 2016-2025 Atora Suunva
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person
6
6
  obtaining a copy of this software and associated documentation
@@ -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 = "booru (https://github.com/AtoraSuunva/booru)";
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
- const sites_json_1 = __importDefault(require("./sites.json"));
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 = sites_json_1.default;
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 (`http${site.insecure ? '' : 's'}://` +
76
- `${site.domain}${site.api.search}` +
77
- query);
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
@@ -1 +1 @@
1
- {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AA2FH,8BAwBC;AA/GD,8DAAmC;AAGnC,mCAAqC;AA2BrC,MAAM,YAAY,GAAY;IAC5B,UAAU,EAAE,iBAAiB;IAC7B,UAAU,EAAE,qBAAqB;IACjC,UAAU,EAAE,aAAa;CAC1B,CAAA;AAED;;GAEG;AACU,QAAA,KAAK,GAAG,oBAAqC,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,CAAA;QAC5B,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,8CAA8C,CAAA;AAExE;;;;;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,CACL,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK;QACpC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;QAClC,KAAK,CACN,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACU,QAAA,cAAc,GAAgB;IACzC,OAAO,EAAE;QACP,MAAM,EAAE,oDAAoD;QAC5D,YAAY,EAAE,kBAAU;KACzB;CACF,CAAA"}
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 jsonfy(xml: string): object[];
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.jsonfy = jsonfy;
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
- domain = domain.toLowerCase();
29
+ const lowerDomain = domain.toLowerCase();
29
30
  for (const [site, info] of Object.entries(Constants_1.sites)) {
30
- if (site === domain ||
31
- info.domain === domain ||
32
- info.aliases.includes(domain)) {
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 jsonfy(xml) {
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 || data['!doctype']?.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
- min = Math.ceil(min);
118
- max = Math.floor(max);
119
- return Math.floor(Math.random() * (max - min + 1)) + min;
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
- if (typeof limit !== 'number') {
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
- else {
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"]}
@@ -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"}