{"version":3,"file":"index.mjs","names":["fetch?: Fetch"],"sources":["../src/util/unzipp.ts","../src/narou-fetch.ts","../src/index.ts"],"sourcesContent":["import { gunzip, InputType } from \"zlib\";\nimport { promisify } from \"util\";\n\nconst gunzipAsync = promisify<InputType, Buffer>(gunzip);\n\nconst decoder = new TextDecoder()\n/**\n * 圧縮されたJSONデータを解凍して解析します。\n * \n * @param data - ArrayBuffer形式の圧縮データ\n * @returns 解凍されたデータからパースされたJSONオブジェクト\n * @throws {string} データが解凍できない、または解凍されたデータが有効なJSONでない場合、\n *                  解凍されたデータの文字列表現をスローします。\n * @throws {string} 解凍中にエラーが発生した場合、元のデータの文字列表現をスローします。\n */\nexport async function unzipp(data: ArrayBuffer) {\n  try {\n    const buffer = await gunzipAsync(data);\n    try {\n      return JSON.parse(decoder.decode(buffer));\n    } catch {\n      throw decoder.decode(buffer);\n    }\n  } catch (e) {\n    if (typeof e === \"string\") throw e;\n    throw decoder.decode(data);\n  }\n}\n","import { unzipp } from \"./util/unzipp.js\";\nimport NarouNovel from \"./narou.js\";\nimport type { NarouParams, ExecuteOptions } from \"./narou.js\";\n\ntype Fetch = typeof fetch;\n\n/**\n * なろう小説APIへのリクエストを実行する\n */\nexport default class NarouNovelFetch extends NarouNovel {\n  /**\n   * コンストラクタ\n   * @param fetch fetch関数（デフォルトはネイティブのfetch）\n   */\n  constructor(private fetch?: Fetch) {\n    super();\n  }\n\n  protected async execute<T>(\n    params: NarouParams,\n    endpoint: string,\n    options?: ExecuteOptions\n  ): Promise<T> {\n    const query = { ...params, out: \"json\" };\n\n    if (query.gzip === undefined) {\n      query.gzip = 5;\n    }\n    if (query.gzip === 0) {\n      delete query.gzip;\n    }\n    const url = new URL(endpoint);\n\n    Object.entries(query).forEach(([key, value]) => {\n      if (value !== undefined) {\n        url.searchParams.append(key, value.toString());\n      }\n    });\n\n    const res = await (this.fetch ?? fetch)(url, options?.fetchOptions);\n\n    if (!query.gzip) {\n      return (await res.json()) as T;\n    }\n\n    const buffer = await res.arrayBuffer();\n    return await unzipp(buffer);\n  }\n}\n","import type NarouNovel from \"./narou.js\";\nimport type { ExecuteOptions } from \"./narou.js\";\nimport NarouNovelFetch from \"./narou-fetch.js\";\nimport NarouNovelJsonp from \"./narou-jsonp.js\";\nimport RankingBuilder from \"./ranking.js\";\nimport { formatRankingHistory, RankingHistoryResult } from \"./ranking-history.js\";\nimport SearchBuilder from \"./search-builder.js\";\nimport SearchBuilderR18 from \"./search-builder-r18.js\";\nimport UserSearchBuilder from \"./user-search.js\";\n\nexport * from \"./index.common.js\";\nexport { NarouNovelFetch, NarouNovelJsonp };\n\nconst narouNovelFetch = new NarouNovelFetch();\n\n/**\n * なろう小説 API で小説を検索する\n * @param {string} [word] 検索ワード\n * @returns {SearchBuilder}\n * @see https://dev.syosetu.com/man/api/\n */\nexport function search(\n  word = \"\",\n  api: NarouNovel = narouNovelFetch\n): SearchBuilder {\n  const builder = new SearchBuilder({}, api);\n  if (word != \"\") builder.word(word);\n  return builder;\n}\n\n/**\n * 18禁小説 API で小説を検索する\n * @param {string} [word] 検索ワード\n * @returns {SearchBuilder}\n * @see https://dev.syosetu.com/xman/api/\n */\nexport function searchR18(\n  word = \"\",\n  api: NarouNovel = narouNovelFetch\n): SearchBuilderR18 {\n  const builder = new SearchBuilderR18({}, api);\n  if (word != \"\") builder.word(word);\n  return builder;\n}\n\n/**\n * なろうユーザ検索 API でユーザを検索する\n * @param {string} [word] - 検索ワード\n * @returns {UserSearchBuilder}\n * @see https://dev.syosetu.com/man/userapi/\n */\nexport function searchUser(word = \"\", api: NarouNovel = narouNovelFetch) {\n  const builder = new UserSearchBuilder({}, api);\n  if (word != \"\") builder.word(word);\n  return builder;\n}\n\n/**\n * なろう小説ランキング API でランキングを取得する\n * @returns {RankingBuilder}\n * @see https://dev.syosetu.com/man/rankapi/\n */\nexport function ranking(api: NarouNovel = narouNovelFetch): RankingBuilder {\n  const builder = new RankingBuilder({}, api);\n  return builder;\n}\n\n/**\n * なろう殿堂入り API でランキング履歴を取得する\n * @param {string} ncode 小説のNコード\n * @param {ExecuteOptions} [options] 実行オプション\n * @param {NarouNovel} [api] API実行クラスのインスタンス\n * @see https://dev.syosetu.com/man/rankinapi/\n */\nexport async function rankingHistory(\n  ncode: string,\n  options?: ExecuteOptions,\n  api: NarouNovel = narouNovelFetch\n): Promise<RankingHistoryResult[]> {\n  const result = await api.executeRankingHistory({ ncode }, options);\n  if (Array.isArray(result)) {\n    return result.map(formatRankingHistory);\n  } else {\n    throw new Error(result);\n  }\n}\n\nexport default {\n  search,\n  searchR18,\n  searchUser,\n  ranking,\n  rankingHistory,\n};\n"],"mappings":";;;;;AAGA,MAAM,cAAc,UAA6B,OAAO;AAExD,MAAM,UAAU,IAAI,aAAa;;;;;;;;;;AAUjC,eAAsB,OAAO,MAAmB;AAC9C,KAAI;EACF,MAAM,SAAS,MAAM,YAAY,KAAK;AACtC,MAAI;AACF,UAAO,KAAK,MAAM,QAAQ,OAAO,OAAO,CAAC;UACnC;AACN,SAAM,QAAQ,OAAO,OAAO;;UAEvB,GAAG;AACV,MAAI,OAAO,MAAM,SAAU,OAAM;AACjC,QAAM,QAAQ,OAAO,KAAK;;;;;;;;;AChB9B,IAAqB,kBAArB,cAA6C,WAAW;;;;;CAKtD,YAAY,AAAQA,SAAe;AACjC,SAAO;EADW;;CAIpB,MAAgB,QACd,QACA,UACA,SACY;EACZ,MAAM,QAAQ;GAAE,GAAG;GAAQ,KAAK;GAAQ;AAExC,MAAI,MAAM,SAAS,OACjB,OAAM,OAAO;AAEf,MAAI,MAAM,SAAS,EACjB,QAAO,MAAM;EAEf,MAAM,MAAM,IAAI,IAAI,SAAS;AAE7B,SAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,WAAW;AAC9C,OAAI,UAAU,OACZ,KAAI,aAAa,OAAO,KAAK,MAAM,UAAU,CAAC;IAEhD;EAEF,MAAM,MAAM,OAAO,KAAK,SAAS,OAAO,KAAK,SAAS,aAAa;AAEnE,MAAI,CAAC,MAAM,KACT,QAAQ,MAAM,IAAI,MAAM;AAI1B,SAAO,MAAM,OADE,MAAM,IAAI,aAAa,CACX;;;;;;ACjC/B,MAAM,kBAAkB,IAAI,iBAAiB;;;;;;;AAQ7C,SAAgB,OACd,OAAO,IACP,MAAkB,iBACH;CACf,MAAM,UAAU,IAAI,cAAc,EAAE,EAAE,IAAI;AAC1C,KAAI,QAAQ,GAAI,SAAQ,KAAK,KAAK;AAClC,QAAO;;;;;;;;AAST,SAAgB,UACd,OAAO,IACP,MAAkB,iBACA;CAClB,MAAM,UAAU,IAAI,iBAAiB,EAAE,EAAE,IAAI;AAC7C,KAAI,QAAQ,GAAI,SAAQ,KAAK,KAAK;AAClC,QAAO;;;;;;;;AAST,SAAgB,WAAW,OAAO,IAAI,MAAkB,iBAAiB;CACvE,MAAM,UAAU,IAAI,kBAAkB,EAAE,EAAE,IAAI;AAC9C,KAAI,QAAQ,GAAI,SAAQ,KAAK,KAAK;AAClC,QAAO;;;;;;;AAQT,SAAgB,QAAQ,MAAkB,iBAAiC;AAEzE,QADgB,IAAI,eAAe,EAAE,EAAE,IAAI;;;;;;;;;AAW7C,eAAsB,eACpB,OACA,SACA,MAAkB,iBACe;CACjC,MAAM,SAAS,MAAM,IAAI,sBAAsB,EAAE,OAAO,EAAE,QAAQ;AAClE,KAAI,MAAM,QAAQ,OAAO,CACvB,QAAO,OAAO,IAAI,qBAAqB;KAEvC,OAAM,IAAI,MAAM,OAAO;;AAI3B,kBAAe;CACb;CACA;CACA;CACA;CACA;CACD"}