{"version":3,"sources":["../src/queries/bbox.ts","../src/queries/centroid.ts","../src/queries/geobuf.ts","../src/queries/geojson.ts","../src/queries/intersect_feature.ts","../src/utils/validation.ts","../src/queries/intersect_point.ts","../src/queries/list_columns.ts","../src/queries/list_tables.ts","../src/queries/mvt.ts","../src/queries/nearest.ts","../src/queries/query_table.ts","../src/queries/transform_point.ts","../src/utils/logger.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Generates a SQL query that returns the bounding box (spatial extent)\n * of all geometries in a table, transformed to the given SRID.\n */\nexport function bbox(\n  table: string,\n  geom_column: string,\n  srid: number,\n  filter?: string\n): string {\n  return `\n    SELECT\n      ST_Extent(ST_Transform(${geom_column}, ${srid})) as bbox\n    FROM\n      ${table}\n    ${filter ? `WHERE ${filter}` : ''}\n  `;\n}\n","/**\n * Generates a SQL query that returns the centroid (x, y) of each geometry\n * in a table, transformed to the given SRID.\n */\nexport function centroid(\n  table: string,\n  force_on_surface: boolean,\n  geom_column: string,\n  srid: string | number,\n  filter?: string\n): string {\n  const fn = force_on_surface ? 'ST_PointOnSurface' : 'ST_Centroid';\n  return `\n    SELECT\n      ST_X(\n        ST_Transform(\n          ${fn}(\n            ${geom_column}\n          ), ${srid})\n      ) as x,\n      ST_Y(\n        ST_Transform(\n          ${fn}(\n            ${geom_column}\n          ), ${srid})\n      ) as y\n  \n    FROM\n      ${table}\n  \n    ${filter ? `WHERE ${filter}` : ''}\n  `;\n}\n","/**\n * Generates a SQL query that returns features from a table encoded as\n * a Geobuf binary protobuf, optionally filtered by a bounding box.\n */\nexport function geobuf(\n  table: string,\n  bounds: string | undefined,\n  geom_column: string,\n  columns?: string,\n  filter?: string\n): string {\n  const bounds_value = bounds ? bounds.split(',').map(Number) : null;\n\n  return `\n    SELECT\n      ST_AsGeobuf(q, 'geom')\n  \n    FROM\n    (\n  \n      SELECT\n        ST_Transform(${geom_column}, 4326) as geom\n        ${columns ? `, ${columns}` : ''}\n  \n      FROM\n        ${table}\n        ${\n          bounds_value\n            ? `, (SELECT ST_SRID(${geom_column}) AS srid FROM ${table} WHERE ${geom_column} IS NOT NULL LIMIT 1) sq`\n            : ''\n        }\n  \n      ${filter || bounds_value ? 'WHERE' : ''}\n      ${filter ? `${filter}` : ''}\n      ${filter && bounds_value ? 'AND' : ''}\n      ${\n        bounds_value && bounds_value.length === 4\n          ? `${geom_column} &&\n        ST_Transform(\n          ST_MakeEnvelope(${bounds_value.join()}, 4326),\n          srid\n        )\n        `\n          : ''\n      }\n      ${\n        bounds_value && bounds_value.length === 3\n          ? `${geom_column} &&\n        ST_Transform(\n          ST_TileEnvelope(${bounds_value.join()}),\n          srid\n        )\n        `\n          : ''\n      }\n  \n    ) as q;\n  \n    `;\n}\n","/**\n * Generates a SQL query that returns features from a table as GeoJSON objects,\n * optionally filtered by a bounding box or spatial bounds.\n */\nexport function geojson(\n  table: string,\n  bounds: string | undefined,\n  id_column: string | undefined,\n  precision: number,\n  geom_column: string,\n  columns?: string,\n  filter?: string\n): string {\n  const bounds_value = bounds ? bounds.split(',').map(Number) : null;\n\n  return `\n      SELECT\n        jsonb_build_object(\n          'type',       'Feature',\n          ${id_column ? `'id', ${id_column},` : ''}\n          'geometry',   ST_AsGeoJSON(geom, ${parseInt(String(precision), 10)})::jsonb,\n          'properties', to_jsonb( subq.* ) - 'geom' ${id_column ? `- '${id_column}'` : ''}\n        ) AS geojson\n  \n      FROM (\n        SELECT\n          ST_Transform(${geom_column}, 4326) as geom\n          ${columns ? `, ${columns}` : ''}\n          ${id_column ? `, ${id_column}` : ''}\n        FROM\n          ${table},\n          (SELECT ST_SRID(${geom_column}) AS srid FROM ${table} WHERE ${geom_column} IS NOT NULL LIMIT 1) a\n        ${filter || bounds_value ? 'WHERE' : ''}\n          ${filter ? `${filter}` : ''}\n          ${filter && bounds_value ? 'AND' : ''}\n          ${\n            bounds_value && bounds_value.length === 4\n              ? `${geom_column} &&\n            ST_Transform(\n              ST_MakeEnvelope(${bounds_value.join()}, 4326),\n              srid\n            )\n            `\n              : ''\n          }\n          ${\n            bounds_value && bounds_value.length === 3\n              ? `${geom_column} &&\n            ST_Transform(\n              ST_TileEnvelope(${bounds_value.join()}),\n              srid\n            )\n            `\n              : ''\n          }\n      ) as subq\n    `;\n}\n","/**\n * Generates a SQL query that returns features from `table_from` that are\n * within `distance` units of any feature in `table_to`.\n */\nexport function intersect_feature(\n  table_from: string,\n  table_to: string,\n  columns: string,\n  distance: string | number,\n  geom_column_from: string,\n  geom_column_to: string,\n  filter?: string,\n  sort?: string,\n  limit?: number | null\n): string {\n  return `\n   SELECT\n    ${columns}\n\n  FROM\n    ${table_from},\n    ${table_to}\n\n  WHERE\n    ST_DWithin(\n      ${table_from}.${geom_column_from},\n      ${table_to}.${geom_column_to},\n      ${distance}\n    )\n    ${filter ? `AND ${filter}` : ''}\n\n  ${sort ? `ORDER BY ${sort}` : ''}\n\n  ${limit ? `LIMIT ${limit}` : ''}\n  `;\n}\n","import type { ParsedPoint } from '../types/index.js';\n\n/**\n * Assert that a value is a non-empty string.\n * @throws {TypeError} if the assertion fails\n */\nexport function assertString(value: unknown, name: string): asserts value is string {\n  if (typeof value !== 'string' || value.trim() === '') {\n    throw new TypeError(`[postgis] \"${name}\" must be a non-empty string, got: ${JSON.stringify(value)}`);\n  }\n}\n\n/**\n * Assert that a value is a finite number >= 0.\n * @throws {TypeError} if the assertion fails\n */\nexport function assertPositiveNumber(value: unknown, name: string): asserts value is number {\n  if (typeof value !== 'number' || !isFinite(value) || value < 0) {\n    throw new TypeError(`[postgis] \"${name}\" must be a non-negative finite number, got: ${JSON.stringify(value)}`);\n  }\n}\n\n/**\n * Parse a point string in the format `\"x,y,srid\"` (e.g. `\"73.5,14.9,4326\"`).\n *\n * Supports coordinates with optional decimal parts and up to 5-digit SRIDs.\n * @throws {Error} if the format is invalid\n */\nexport function parsePoint(point: string): ParsedPoint {\n  if (typeof point !== 'string') {\n    throw new TypeError(`[postgis] Point must be a string, got: ${typeof point}`);\n  }\n\n  const match = point.match(/^(-?\\d+\\.?\\d*),(-?\\d+\\.?\\d*),(\\d{4,5})$/);\n  if (!match) {\n    throw new Error(\n      `[postgis] Invalid point format \"${point}\". Expected \"x,y,srid\" (e.g. \"73.5,14.9,4326\").`\n    );\n  }\n\n  const [, x, y, srid] = match;\n  return { x: x!, y: y!, srid: srid! };\n}\n","import { parsePoint } from '../utils/validation.js';\n\n/**\n * Generates a SQL query that returns features from `table` that are\n * within `distance` units of the given point.\n *\n * @throws {Error} if `point` is not in the format `\"x,y,srid\"`\n */\nexport function intersect_point(\n  table: string,\n  point: string,\n  columns: string,\n  distance: string | number,\n  geom_column: string,\n  filter?: string,\n  sort?: string,\n  limit?: number | null\n): string {\n  const { x, y, srid } = parsePoint(point);\n\n  return `\n  SELECT\n    ${columns}\n\n  FROM\n    ${table}\n\n  WHERE\n    ST_DWithin(\n      ${geom_column},\n      ST_Transform(\n        st_setsrid(\n           st_makepoint(${x}, ${y}),\n          ${srid}\n        ),\n        (SELECT ST_SRID(${geom_column}) FROM ${table} LIMIT 1)\n      ),\n      ${distance}\n    )\n    ${filter ? `AND ${filter}` : ''}\n\n  ${sort ? `ORDER BY ${sort}` : ''}\n\n  ${limit ? `LIMIT ${limit}` : ''}\n  `;\n}\n","/**\n * Generates a SQL query that lists all columns of a given table\n * using PostgreSQL system catalogs.\n */\nexport function list_columns(table: string): string {\n  return `\n    SELECT\n    attname as field_name,\n        typname as field_type\n\n    FROM\n    pg_namespace, pg_attribute, pg_type, pg_class\n\n    WHERE\n    pg_type.oid = atttypid AND\n    pg_class.oid = attrelid AND\n    relnamespace = pg_namespace.oid AND\n    attnum >= 1 AND\n    relname = '${table}'\n        `;\n}\n","/**\n * Generates a SQL query that lists all user-accessible tables (with their\n * geometry column metadata from PostGIS) that the current user can SELECT.\n */\nexport function list_tables(filter?: string): string {\n  return `\n    SELECT\n      i.table_name,\n      i.table_type,\n      g.f_geometry_column as geometry_column,\n      g.coord_dimension,\n      g.srid,\n      g.type\n    FROM\n      information_schema.tables i\n    LEFT JOIN geometry_columns g\n    ON i.table_name = g.f_table_name\n    INNER JOIN information_schema.table_privileges p\n    ON i.table_name = p.table_name\n    AND p.grantee in (current_user, 'PUBLIC')\n    AND p.privilege_type = 'SELECT'\n    WHERE\n    i.table_schema not in  ('pg_catalog', 'information_schema')\n  \n      -- Optional where filter\n      ${filter ? `and ${filter}` : ''}\n  \n    ORDER BY table_name\n    `;\n}\n","/**\n * Generates a SQL query that returns Mapbox Vector Tile (MVT) binary data\n * for the given tile coordinate (z/x/y).\n */\nexport function mvt(\n  table: string,\n  x: number,\n  y: number,\n  z: number,\n  columns?: string,\n  id_column?: string,\n  geom_column: string = 'geom',\n  filter?: string\n): string {\n  return `\n      WITH mvtgeom as (\n        SELECT\n          ST_AsMVTGeom (\n            ST_Transform(${geom_column}, 3857),\n            ST_TileEnvelope(${z}, ${x}, ${y})\n          ) as geom\n          ${columns ? `, ${columns}` : ''}\n          ${id_column ? `, ${id_column}` : ''}\n        FROM\n          ${table},\n          (SELECT ST_SRID(${geom_column}) AS srid FROM ${table} WHERE ${geom_column} IS NOT NULL LIMIT 1) a\n        WHERE\n          ST_Intersects(\n            ${geom_column},\n            ST_Transform(\n              ST_TileEnvelope(${z}, ${x}, ${y}),\n              srid\n            )\n          )\n  \n          ${filter ? ` AND ${filter}` : ''}\n      )\n      SELECT ST_AsMVT(mvtgeom.*, '${table}', 4096, 'geom' ${\n        id_column ? `, '${id_column}'` : ''\n      }) AS mvt from mvtgeom;\n    `;\n}\n","import { parsePoint } from '../utils/validation.js';\n\n/**\n * Generates a SQL query that returns the nearest features to a given point,\n * ordered by distance using the PostGIS KNN `<->` operator.\n *\n * @throws {Error} if `point` is not in the format `\"x,y,srid\"`\n */\nexport function nearest(\n  table: string,\n  point: string,\n  columns: string,\n  geom_column: string,\n  filter?: string,\n  limit: number = 10\n): string {\n  const { x, y, srid } = parsePoint(point);\n\n  return `\n    SELECT\n      ${columns},\n      ST_Distance(\n        ST_Transform(\n          st_setsrid( st_makepoint(${x}, ${y}), ${srid} ),\n          (SELECT ST_SRID(${geom_column}) FROM ${table} LIMIT 1)\n        ),\n        ${geom_column}\n      ) as distance\n  \n    FROM\n    ${table}\n  \n    ${filter ? `WHERE ${filter}` : ''}\n  \n    ORDER BY\n      ${geom_column} <-> ST_Transform(\n        st_setsrid( st_makepoint(${x}, ${y}), ${srid} ),\n        (SELECT ST_SRID(${geom_column}) FROM ${table} LIMIT 1)\n      )\n  \n    LIMIT ${limit}\n    `;\n}\n","/**\n * Generates a SQL query that selects rows from a table with optional\n * filtering, grouping, sorting and limiting.\n */\nexport function query_table(\n  table: string,\n  columns: string,\n  filter?: string,\n  group?: string,\n  sort?: string,\n  limit?: number | null\n): string {\n  return `SELECT\n    ${columns}\n  FROM\n  ${table}\n  ${filter ? `WHERE ${filter}` : ''}\n  ${group ? `GROUP BY ${group}` : ''}\n  ${sort ? `ORDER BY ${sort}` : ''}\n  ${limit ? `LIMIT ${limit}` : ''}\n`;\n}\n","import { parsePoint } from '../utils/validation.js';\n\n/**\n * Generates a SQL query that transforms a point from one SRID to another.\n *\n * @throws {Error} if `point` is not in the format `\"x,y,srid\"`\n */\nexport function transform_point(point: string, srid: number): string {\n  const { x, y, srid: srid1 } = parsePoint(point);\n\n  return `\n  SELECT\n    ST_X(\n      ST_Transform(\n        ST_SetSRID(\n          ST_MakePoint(${x}, ${y}),\n          ${srid1}\n        ),\n        ${srid}\n      )\n    ) as x,\n    ST_Y(\n      ST_Transform(\n        ST_SetSRID(\n          ST_MakePoint(${x}, ${y}),\n          ${srid1}\n        ),\n        ${srid}\n      )\n    ) as y\n  `;\n}\n","/**\n * Lightweight structured logger for the postgis library.\n * Enabled by setting the `POSTGIS_DEBUG=true` environment variable.\n */\n\nconst DEBUG = process.env['POSTGIS_DEBUG'] === 'true';\n\ntype LogArgs = unknown[];\n\nfunction formatMessage(level: string, args: LogArgs): string {\n  const ts = new Date().toISOString();\n  return `[postgis:${level}] ${ts} ${args.map(String).join(' ')}`;\n}\n\nexport const logger = {\n  debug(...args: LogArgs): void {\n    if (DEBUG) {\n      console.debug(formatMessage('debug', args));\n    }\n  },\n  warn(...args: LogArgs): void {\n    console.warn(formatMessage('warn', args));\n  },\n  error(...args: LogArgs): void {\n    console.error(formatMessage('error', args));\n  },\n};\n","/**\n * @packageDocumentation\n * # postgis\n *\n * A lightweight, type-safe Node.js library for interacting with\n * PostGIS-enabled PostgreSQL databases.\n *\n * @example\n * ```typescript\n * import Postgis from 'postgis';\n * import { Client } from 'pg';\n *\n * const client = new Client({ connectionString: process.env.DATABASE_URL });\n * await client.connect();\n *\n * const postgis = new Postgis(client);\n * const tables = await postgis.list_tables();\n * ```\n */\n\nimport { bbox } from './queries/bbox.js';\nimport { centroid } from './queries/centroid.js';\nimport { geobuf } from './queries/geobuf.js';\nimport { geojson } from './queries/geojson.js';\nimport { intersect_feature } from './queries/intersect_feature.js';\nimport { intersect_point } from './queries/intersect_point.js';\nimport { list_columns } from './queries/list_columns.js';\nimport { list_tables } from './queries/list_tables.js';\nimport { mvt } from './queries/mvt.js';\nimport { nearest } from './queries/nearest.js';\nimport { query_table } from './queries/query_table.js';\nimport { transform_point } from './queries/transform_point.js';\nimport { logger } from './utils/logger.js';\n\nimport type {\n  PostgisClient,\n  ListTablesOptions,\n  QueryTableOptions,\n  BboxOptions,\n  CentroidOptions,\n  IntersectFeatureOptions,\n  IntersectPointOptions,\n  GeoJSONOptions,\n  GeobufOptions,\n  MvtOptions,\n  NearestOptions,\n  TransformPointOptions,\n  FeatureCollection,\n} from './types/index.js';\n\nexport type {\n  PostgisClient,\n  ListTablesOptions,\n  QueryTableOptions,\n  BboxOptions,\n  CentroidOptions,\n  IntersectFeatureOptions,\n  IntersectPointOptions,\n  GeoJSONOptions,\n  GeobufOptions,\n  MvtOptions,\n  NearestOptions,\n  TransformPointOptions,\n  FeatureCollection,\n};\n\n/**\n * Main class for interacting with a PostGIS-enabled PostgreSQL database.\n *\n * Wrap any `pg.Client` (or pool client) with this class to get access\n * to high-level spatial query helpers.\n *\n * @example\n * ```typescript\n * const postgis = new Postgis(client);\n * const bbox = await postgis.bbox('my_layer');\n * ```\n */\nexport class Postgis {\n  private readonly client: PostgisClient;\n\n  /**\n   * @param client - A connected `pg.Client` or any object with a `query(sql)` method.\n   * @throws {TypeError} if `client` is missing or does not expose a `query` function.\n   */\n  constructor(client: PostgisClient) {\n    if (!client || typeof client.query !== 'function') {\n      throw new TypeError('A valid pg.Client instance is required.');\n    }\n    this.client = client;\n  }\n\n  // ─── Schema Introspection ────────────────────────────────────────────────\n\n  /**\n   * List all user-accessible tables in the database, joined with PostGIS\n   * geometry metadata where available.\n   *\n   * @param options.filter - Optional SQL WHERE clause fragment.\n   * @returns Array of table metadata rows.\n   *\n   * @example\n   * ```typescript\n   * const tables = await postgis.list_tables({ filter: \"table_type = 'BASE TABLE'\" });\n   * ```\n   */\n  async list_tables({ filter }: ListTablesOptions = {}): Promise<Record<string, unknown>[]> {\n    const sql = list_tables(filter);\n    return this._executeQuery(sql);\n  }\n\n  /**\n   * List all columns of a given table using PostgreSQL system catalogs.\n   *\n   * @param table - Table name.\n   * @returns Array of `{ field_name, field_type }` rows.\n   *\n   * @example\n   * ```typescript\n   * const columns = await postgis.list_columns('my_layer');\n   * ```\n   */\n  async list_columns(table: string): Promise<Record<string, unknown>[]> {\n    const sql = list_columns(table);\n    return this._executeQuery(sql);\n  }\n\n  // ─── General Querying ────────────────────────────────────────────────────\n\n  /**\n   * Query a table with optional column selection, filtering, grouping,\n   * sorting and limiting.\n   *\n   * @param table - Table name.\n   * @param options - Query options.\n   * @returns Array of result rows.\n   *\n   * @example\n   * ```typescript\n   * const rows = await postgis.query_table('parcels', {\n   *   columns: 'id, name',\n   *   filter: \"status = 'active'\",\n   *   sort: 'name ASC',\n   *   limit: 50,\n   * });\n   * ```\n   */\n  async query_table(\n    table: string,\n    { columns = '*', filter, group, sort, limit = 100 }: QueryTableOptions = {}\n  ): Promise<Record<string, unknown>[]> {\n    const sql = query_table(table, columns, filter, group, sort, limit);\n    return this._executeQuery(sql);\n  }\n\n  // ─── Spatial Operations ──────────────────────────────────────────────────\n\n  /**\n   * Calculate the spatial bounding box (extent) of all geometries in a table.\n   *\n   * @param table - Table name.\n   * @param options.geom_column - Geometry column (default `'geom'`).\n   * @param options.srid - Target SRID (default `4326`).\n   * @param options.filter - Optional SQL WHERE clause fragment.\n   * @returns Array containing a single `{ bbox }` row.\n   *\n   * @example\n   * ```typescript\n   * const [result] = await postgis.bbox('parcels');\n   * console.log(result.bbox); // BOX(lng1 lat1, lng2 lat2)\n   * ```\n   */\n  async bbox(\n    table: string,\n    { geom_column = 'geom', srid = 4326, filter }: BboxOptions = {}\n  ): Promise<Record<string, unknown>[]> {\n    const sql = bbox(table, geom_column, srid, filter);\n    return this._executeQuery(sql);\n  }\n\n  /**\n   * Calculate the centroid (x, y) of each geometry in a table.\n   *\n   * @param table - Table name.\n   * @param options.force_on_surface - Use `ST_PointOnSurface` instead of `ST_Centroid` (default `false`).\n   * @param options.geom_column - Geometry column (default `'geom'`).\n   * @param options.srid - Target SRID (default `'4326'`).\n   * @param options.filter - Optional SQL WHERE clause fragment.\n   * @returns Array of `{ x, y }` rows.\n   */\n  async centroid(\n    table: string,\n    {\n      force_on_surface = false,\n      geom_column = 'geom',\n      srid = '4326',\n      filter,\n    }: CentroidOptions = {}\n  ): Promise<Record<string, unknown>[]> {\n    const sql = centroid(table, force_on_surface, geom_column, srid, filter);\n    return this._executeQuery(sql);\n  }\n\n  /**\n   * Find features from `table_from` that are within `distance` of any feature\n   * in `table_to` (using `ST_DWithin`).\n   *\n   * @param table_from - Source table.\n   * @param table_to - Target table.\n   * @param options - Intersection options.\n   * @returns Array of matching feature rows.\n   */\n  async intersect_feature(\n    table_from: string,\n    table_to: string,\n    {\n      columns = '*',\n      distance = '0',\n      geom_column_from = 'geom',\n      geom_column_to = 'geom',\n      filter,\n      sort,\n      limit,\n    }: IntersectFeatureOptions = {}\n  ): Promise<Record<string, unknown>[]> {\n    const sql = intersect_feature(\n      table_from,\n      table_to,\n      columns,\n      distance,\n      geom_column_from,\n      geom_column_to,\n      filter,\n      sort,\n      limit\n    );\n    return this._executeQuery(sql);\n  }\n\n  /**\n   * Find features in `table` that are within `distance` of the given point.\n   *\n   * @param table - Table name.\n   * @param point - Point string in `\"x,y,srid\"` format (e.g. `\"73.5,14.9,4326\"`).\n   * @param options - Intersection options.\n   * @returns Array of matching feature rows.\n   * @throws {Error} if `point` format is invalid.\n   */\n  async intersect_point(\n    table: string,\n    point: string,\n    {\n      columns = '*',\n      distance = '0',\n      geom_column = 'geom',\n      filter,\n      sort,\n      limit = 10,\n    }: IntersectPointOptions = {}\n  ): Promise<Record<string, unknown>[]> {\n    const sql = intersect_point(table, point, columns, distance, geom_column, filter, sort, limit);\n    return this._executeQuery(sql);\n  }\n\n  // ─── Geometry Export ─────────────────────────────────────────────────────\n\n  /**\n   * Export features from `table` as a GeoJSON `FeatureCollection`.\n   *\n   * @param table - Table name.\n   * @param options - GeoJSON export options.\n   * @returns A GeoJSON `FeatureCollection`.\n   *\n   * @example\n   * ```typescript\n   * const fc = await postgis.geojson('parcels', { precision: 6 });\n   * // { type: 'FeatureCollection', features: [...] }\n   * ```\n   */\n  async geojson(\n    table: string,\n    { bounds, id_column, precision = 9, geom_column = 'geom', columns, filter }: GeoJSONOptions = {}\n  ): Promise<FeatureCollection> {\n    const sql = geojson(table, bounds, id_column, precision, geom_column, columns, filter);\n    const rows = await this._executeQuery(sql);\n    return {\n      type: 'FeatureCollection',\n      features: rows.map((el) => (el as { geojson: unknown }).geojson),\n    };\n  }\n\n  /**\n   * Export features from `table` as a Geobuf binary buffer.\n   *\n   * @param table - Table name.\n   * @param options - Geobuf export options.\n   * @returns A `Buffer` containing the Geobuf-encoded data.\n   *\n   * @example\n   * ```typescript\n   * const buf = await postgis.geobuf('parcels');\n   * res.setHeader('Content-Type', 'application/x-protobuf');\n   * res.send(buf);\n   * ```\n   */\n  async geobuf(\n    table: string,\n    { bounds, geom_column = 'geom', columns, filter }: GeobufOptions = {}\n  ): Promise<Buffer> {\n    const sql = geobuf(table, bounds, geom_column, columns, filter);\n    const rows = await this._executeQuery(sql);\n    return (rows[0] as { st_asgeobuf: Buffer }).st_asgeobuf;\n  }\n\n  /**\n   * Generate a Mapbox Vector Tile (MVT) for the given `z/x/y` tile coordinate.\n   *\n   * @param table - Table name.\n   * @param x - Tile X coordinate.\n   * @param y - Tile Y coordinate.\n   * @param z - Zoom level.\n   * @param options - MVT options.\n   * @returns Array containing the raw MVT binary in a `{ mvt }` row.\n   *\n   * @example\n   * ```typescript\n   * const [{ mvt: tile }] = await postgis.mvt('parcels', 0, 0, 0);\n   * res.setHeader('Content-Type', 'application/vnd.mapbox-vector-tile');\n   * res.send(tile);\n   * ```\n   */\n  async mvt(\n    table: string,\n    x: number,\n    y: number,\n    z: number,\n    { columns, id_column, geom_column = 'geom', filter }: MvtOptions = {}\n  ): Promise<Record<string, unknown>[]> {\n    const sql = mvt(table, x, y, z, columns, id_column, geom_column, filter);\n    return this._executeQuery(sql);\n  }\n\n  /**\n   * Find the nearest features in `table` to a given point, ordered by distance.\n   *\n   * @param table - Table name.\n   * @param point - Point string in `\"x,y,srid\"` format (e.g. `\"73.5,14.9,4326\"`).\n   * @param options - Nearest options.\n   * @returns Array of nearest feature rows (each includes a `distance` column).\n   * @throws {Error} if `point` format is invalid.\n   */\n  async nearest(\n    table: string,\n    point: string,\n    { columns = '*', geom_column = 'geom', filter, limit = 10 }: NearestOptions = {}\n  ): Promise<Record<string, unknown>[]> {\n    const sql = nearest(table, point, columns, geom_column, filter, limit);\n    return this._executeQuery(sql);\n  }\n\n  /**\n   * Transform a point from one coordinate reference system to another.\n   *\n   * @param point - Point string in `\"x,y,srid\"` format (e.g. `\"73.5,14.9,4326\"`).\n   * @param options.srid - Target SRID (default `4326`).\n   * @returns Array of `{ x, y }` rows with the transformed coordinates.\n   * @throws {Error} if `point` format is invalid.\n   *\n   * @example\n   * ```typescript\n   * const [pt] = await postgis.transform_point('73.5,14.9,4326', { srid: 3857 });\n   * ```\n   */\n  async transform_point(\n    point: string,\n    { srid = 4326 }: TransformPointOptions = {}\n  ): Promise<Record<string, unknown>[]> {\n    const sql = transform_point(point, srid);\n    return this._executeQuery(sql);\n  }\n\n  // ─── Internal ────────────────────────────────────────────────────────────\n\n  /**\n   * Execute a raw SQL string against the client and return result rows.\n   * @internal\n   */\n  private async _executeQuery<T = Record<string, unknown>>(sql: string): Promise<T[]> {\n    logger.debug('Executing query:', sql.replace(/\\s+/g, ' ').trim().slice(0, 120));\n    try {\n      const res = await this.client.query(sql);\n      return (res.rows ?? []) as T[];\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      logger.error('Query execution failed:', message);\n      throw new Error(`Query execution failed: ${message}`);\n    }\n  }\n}\n\nexport default Postgis;\n"]}