{"version":3,"sources":["../src/client.ts","../src/util.ts","../src/noop.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { type PipeErrorResponse, eventIngestReponseData, pipeResponseWithoutData } from \"./util\";\n\nexport type Config = {\n  baseUrl?: string;\n} & (\n  | {\n      token: string;\n      noop?: never;\n    }\n  | {\n      token?: never;\n      noop: true;\n    }\n);\n\nexport class Tinybird {\n  private readonly baseUrl: string;\n  private readonly token: string;\n  private readonly noop: boolean;\n\n  constructor(config: Config) {\n    this.baseUrl = config.baseUrl ?? \"https://api.tinybird.co\";\n    if (config.noop) {\n      this.token = \"\";\n      this.noop = true;\n    } else {\n      this.token = config.token;\n      this.noop = false;\n    }\n  }\n\n  private async fetch(\n    url: string | URL,\n    opts: {\n      method: string;\n      headers?: Record<string, string>;\n      body?: string;\n      cache?: RequestCache;\n      next?: {\n        revalidate?: number;\n      };\n    },\n  ): Promise<unknown> {\n    for (let i = 0; i < 10; i++) {\n      const res = await fetch(url, opts);\n      if (res.ok) {\n        return res.json();\n      }\n\n      if (res.status === 429 || res.status >= 500) {\n        await new Promise((r) => setTimeout(r, 1000 + i ** 2 * 50));\n        continue;\n      }\n\n      if (res.status === 403) {\n        throw new Error(\"Unauthorized\");\n      }\n\n      if (!res.ok) {\n        const error = (await res.json()) as PipeErrorResponse;\n        throw new Error(error.error);\n      }\n    }\n  }\n\n  public buildPipe<TParameters extends z.ZodSchema<any>, TData extends z.ZodSchema<any>>(req: {\n    pipe: string;\n    parameters?: TParameters;\n    data: TData;\n    opts?: {\n      cache?: RequestCache;\n      next?: {\n        /**\n         * Number of seconds to revalidate the cache (nextjs specific)\n         */\n        revalidate?: number;\n      };\n    };\n  }): (\n    params: z.input<TParameters>,\n  ) => Promise<z.infer<typeof pipeResponseWithoutData> & { data: z.output<TData>[] }> {\n    const outputSchema = pipeResponseWithoutData.extend({ data: z.array(req.data) });\n    return async (params: z.input<TParameters>) => {\n      let validatedParams: z.input<TParameters> | undefined = undefined;\n      if (req.parameters) {\n        const v = req.parameters.safeParse(params);\n        if (!v.success) {\n          throw new Error(v.error.message);\n        }\n        validatedParams = v.data;\n      }\n      if (this.noop) {\n        return { meta: [], data: [] };\n      }\n      const url = new URL(`/v0/pipes/${req.pipe}.json`, this.baseUrl);\n      if (validatedParams) {\n        for (const [key, value] of Object.entries(validatedParams)) {\n          if (typeof value === \"undefined\" || value === null) {\n            continue;\n          }\n          url.searchParams.set(key, value.toString());\n        }\n      }\n      const res = await this.fetch(url, {\n        ...req.opts,\n        method: \"GET\",\n        headers: { Authorization: `Bearer ${this.token}` },\n      });\n      const validatedResponse = outputSchema.safeParse(res);\n      if (!validatedResponse.success) {\n        throw new Error(validatedResponse.error.message);\n      }\n\n      return validatedResponse.data;\n    };\n  }\n\n  public buildIngestEndpoint<TSchema extends z.ZodSchema<any>>(req: {\n    datasource: string;\n    event: TSchema;\n    wait?: boolean;\n  }): (\n    events: z.input<TSchema> | z.input<TSchema>[],\n  ) => Promise<z.infer<typeof eventIngestReponseData>> {\n    return async (events: z.input<TSchema> | z.input<TSchema>[]) => {\n      let validatedEvents: z.output<TSchema> | z.output<TSchema>[] | undefined = undefined;\n      if (req.event) {\n        const v = Array.isArray(events)\n          ? req.event.array().safeParse(events)\n          : req.event.safeParse(events);\n        if (!v.success) {\n          throw new Error(v.error.message);\n        }\n        validatedEvents = v.data;\n      }\n\n      if (this.noop) {\n        return {\n          successful_rows: Array.isArray(validatedEvents) ? validatedEvents.length : 1,\n          quarantined_rows: 0,\n        };\n      }\n      const url = new URL(\"/v0/events\", this.baseUrl);\n      url.searchParams.set(\"name\", req.datasource);\n\n      if (req.wait) {\n        url.searchParams.set(\"wait\", \"true\");\n      }\n\n      const body = (Array.isArray(validatedEvents) ? validatedEvents : [validatedEvents])\n        .map((p) => JSON.stringify(p))\n        .join(\"\\n\");\n\n      const res = await this.fetch(url, {\n        method: \"POST\",\n        body,\n        headers: { Authorization: `Bearer ${this.token}`, \"Content-Type\": \"application/json\" },\n      }).catch((err) => {\n        throw new Error(`Unable to ingest to ${req.datasource}: ${err.message}`);\n      });\n\n      const validatedResponse = eventIngestReponseData.safeParse(res);\n\n      if (!validatedResponse.success) {\n        throw new Error(validatedResponse.error.message);\n      }\n\n      return validatedResponse.data;\n    };\n  }\n}\n","import { z } from \"zod\";\nexport type PipeErrorResponse = {\n  error: string;\n  documentation: string;\n};\n\nexport const meta = z.object({\n  name: z.string(),\n  type: z.string(),\n});\n\nexport type Meta = z.infer<typeof meta>;\n\nexport const pipeResponseWithoutData = z.object({\n  meta: z.array(meta),\n  rows: z.number().optional(),\n  rows_before_limit_at_least: z.number().optional(),\n  statistics: z\n    .object({\n      elapsed: z.number().optional(),\n      rows_read: z.number().optional(),\n      bytes_read: z.number().optional(),\n    })\n    .optional(),\n});\n\nexport const eventIngestReponseData = z.object({\n  successful_rows: z.number(),\n  quarantined_rows: z.number(),\n});\n","import { Tinybird } from \"./client\";\n/**\n * NoopTinybird is a mock implementation of the Tinybird client that doesn't do anything and returns empty data.\n */\nexport class NoopTinybird extends Tinybird {\n  constructor() {\n    super({ noop: true });\n  }\n}\n"],"mappings":"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","names":["z","z"]}