{"version":3,"file":"build-response.mjs","names":[],"sources":["../../../../src/libs/http/utils/build-response.ts"],"sourcesContent":["import type { Context } from \"hono\";\nimport type { ResponseBody } from \"../../../types/response.js\";\nimport { normalizeHost } from \"../../../utils/helpers/index.js\";\n\n// --------------------------------------------------\n// Types\ninterface BuildResponseParams {\n\tdata: unknown;\n\tpagination?: {\n\t\tcount: number;\n\t\tpage: number;\n\t\tperPage: number;\n\t};\n}\n\ntype FormatAPIResponse = (\n\tc: Context,\n\tparams: BuildResponseParams,\n) => ResponseBody;\n\n// --------------------------------------------------\n// Helpers\n\nconst constructBaseUrl = (c: Context): URL => {\n\tconst requestUrl = new URL(c.req.url);\n\tconst config = c.get(\"config\") as { host?: string } | undefined;\n\n\tif (!config?.host?.trim()) return requestUrl;\n\n\treturn new URL(\n\t\t`${requestUrl.pathname}${requestUrl.search}`,\n\t\tnormalizeHost(config.host),\n\t);\n};\n\nconst getPath = (c: Context) => {\n\ttry {\n\t\tconst url = constructBaseUrl(c);\n\t\treturn url.toString().split(\"?\")[0] || \"\";\n\t} catch (_error) {\n\t\treturn c.req.url || \"\";\n\t}\n};\n\nconst buildMetaLinks = (\n\tc: Context,\n\tparams: BuildResponseParams,\n): ResponseBody[\"meta\"][\"links\"] => {\n\tconst links: ResponseBody[\"meta\"][\"links\"] = [];\n\tif (!params.pagination) return links;\n\n\tconst { page, perPage, count } = params.pagination;\n\tconst totalPages =\n\t\tperPage === -1 ? (count > 0 ? 1 : 0) : Math.ceil(count / Number(perPage));\n\n\ttry {\n\t\tconst baseUrl = constructBaseUrl(c);\n\n\t\tfor (let i = 0; i < totalPages; i++) {\n\t\t\tconst pageUrl = new URL(baseUrl.toString());\n\t\t\tif (i !== 0) pageUrl.searchParams.set(\"page\", String(i + 1));\n\t\t\telse pageUrl.searchParams.delete(\"page\");\n\n\t\t\tlinks.push({\n\t\t\t\tactive: page === i + 1,\n\t\t\t\tlabel: String(i + 1),\n\t\t\t\turl: pageUrl.toString(),\n\t\t\t\tpage: i + 1,\n\t\t\t});\n\t\t}\n\t\treturn links;\n\t} catch (error) {\n\t\tconsole.error(\"Error in buildMetaLinks:\", error);\n\t\treturn links;\n\t}\n};\n\nconst buildLinks = (\n\tc: Context,\n\tparams: BuildResponseParams,\n): ResponseBody[\"links\"] => {\n\tif (!params.pagination) return undefined;\n\n\ttry {\n\t\tconst { page, perPage, count } = params.pagination;\n\t\tconst totalPages =\n\t\t\tperPage === -1 ? (count > 0 ? 1 : 0) : Math.ceil(count / Number(perPage));\n\t\tconst baseUrl = constructBaseUrl(c);\n\n\t\tconst links: ResponseBody[\"links\"] = {\n\t\t\tfirst: null,\n\t\t\tlast: null,\n\t\t\tnext: null,\n\t\t\tprev: null,\n\t\t};\n\n\t\t// Set First\n\t\tconst firstUrl = new URL(baseUrl.toString());\n\t\tfirstUrl.searchParams.delete(\"page\");\n\t\tlinks.first = firstUrl.toString();\n\n\t\t// Set Last\n\t\tconst lastUrl = new URL(baseUrl.toString());\n\t\tif (totalPages > 0 && page !== totalPages)\n\t\t\tlastUrl.searchParams.set(\"page\", String(totalPages));\n\t\tlinks.last = lastUrl.toString();\n\n\t\t// Set Next\n\t\tif (totalPages > 0 && page < totalPages) {\n\t\t\tconst nextUrl = new URL(baseUrl.toString());\n\t\t\tnextUrl.searchParams.set(\"page\", String(Number(page) + 1));\n\t\t\tlinks.next = nextUrl.toString();\n\t\t}\n\n\t\t// Set Prev\n\t\tif (page !== 1) {\n\t\t\tconst prevUrl = new URL(baseUrl.toString());\n\t\t\tprevUrl.searchParams.set(\"page\", String(Number(page) - 1));\n\t\t\tlinks.prev = prevUrl.toString();\n\t\t}\n\n\t\treturn links;\n\t} catch (error) {\n\t\tconsole.error(\"Error in buildLinks:\", error);\n\t\treturn undefined; // Return undefined on error\n\t}\n};\n\n// --------------------------------------------------\n// Main\nconst formatAPIResponse: FormatAPIResponse = (c, params) => {\n\tlet lastPage = null;\n\n\tif (params.pagination) {\n\t\tif (params.pagination.perPage === -1) {\n\t\t\tlastPage = params.pagination.count > 0 ? 1 : 0;\n\t\t} else {\n\t\t\tlastPage = Math.ceil(\n\t\t\t\tparams.pagination.count / Number(params.pagination.perPage),\n\t\t\t);\n\t\t}\n\t}\n\tconst meta: ResponseBody[\"meta\"] = {\n\t\tpath: getPath(c),\n\t\tlinks: buildMetaLinks(c, params),\n\t\tcurrentPage: params.pagination?.page ?? null,\n\t\tperPage: params.pagination?.perPage ?? null,\n\t\ttotal:\n\t\t\tparams.pagination?.count === undefined\n\t\t\t\t? null\n\t\t\t\t: Number(params.pagination.count),\n\t\tlastPage: lastPage,\n\t};\n\tconst links = buildLinks(c, params);\n\n\treturn {\n\t\tdata: params.data || null,\n\t\tmeta: meta,\n\t\tlinks,\n\t};\n};\n\nexport default formatAPIResponse;\n"],"mappings":"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"}