@geekapps/post-nextjs 0.1.5 → 0.1.7

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.
package/dist/index.d.ts CHANGED
@@ -204,6 +204,16 @@ interface AreaCode {
204
204
  state: string;
205
205
  available: boolean;
206
206
  }
207
+ interface TemplateVariable {
208
+ name: string;
209
+ value: string;
210
+ }
211
+ interface TemplateVariables {
212
+ header?: TemplateVariable[];
213
+ body?: TemplateVariable[];
214
+ footer?: TemplateVariable[];
215
+ buttons?: Record<number, TemplateVariable[]>;
216
+ }
207
217
  interface SendMessageInput {
208
218
  type: MessageType;
209
219
  to: string;
@@ -213,10 +223,7 @@ interface SendMessageInput {
213
223
  template?: string;
214
224
  subject?: string;
215
225
  body?: string;
216
- variables?: Array<{
217
- name: string;
218
- value: string;
219
- }>;
226
+ variables?: TemplateVariable[] | TemplateVariables;
220
227
  }
221
228
  interface CreateTemplateInput {
222
229
  name: string;
@@ -517,13 +524,14 @@ declare class PostClient {
517
524
  }
518
525
 
519
526
  interface ServiceAccountOptions {
527
+ issuerUrl: string;
520
528
  clientId: string;
521
529
  clientSecret: string;
522
530
  }
523
531
  interface GeekappsPostOptions {
524
- issuer: string;
525
532
  serviceAccount: ServiceAccountOptions;
526
533
  baseUrl?: string;
534
+ logLevel?: "trace" | "debug" | "info" | "warn" | "error" | "silent";
527
535
  }
528
536
  declare class GeekappsPost extends PostClient {
529
537
  constructor(options: GeekappsPostOptions);
@@ -540,4 +548,4 @@ declare class PostApiError extends Error {
540
548
  get isValidationError(): boolean;
541
549
  }
542
550
 
543
- export { type AreaCode, type AvailablePlan, type ConnectWabaInput, type ConnectWhatsappNumberInput, type CreateDomainInput, type CreateDomainResult, type CreateTemplateInput, type CreateWebhookInput, type CreateWhatsappTemplateInput, type DnsRecord, type DomainStatus, type DomainType, DomainsResource, GeekappsPost, type GeekappsPostOptions, HistoryResource, type HttpClientOptions, type ListHistoryParams, type ManagedNumber, type ManagedNumberStatus, ManagedNumbersResource, type MessageLog, type MessageLogDetail, type MessageStatus, type MessageTemplate, type MessageType, MessagesResource, type OrgDomain, type OrgPlan, type OrgUsage, type OrgWaba, type OrgWebhook, type OrgWebhookWithSecret, type PaginatedResult, type PhoneNumberStatusResult, type PlanTier, PlansResource, type PlansResult, PostApiError, PostClient, type RegisterWhatsappNumberInput, type RotateSecretResult, type SaveDraftInput, type SendMessageInput, type SendMessageResult, type SmtpConfig, SmtpResource, type StatisticsParams, StatisticsResource, type StatisticsResult, type SyncWhatsappTemplatesResult, TemplatesResource, type TokenResolver, type UpdatePlanInput, type UpdateTemplateInput, type UpdateWebhookInput, type UpdateWhatsappProfileInput, type UpdateWhatsappTemplateInput, type UpsertSmtpConfigInput, type WabaStatus, type WebhookDelivery, type WebhookEvent, WebhooksResource, type WhatsappNumber, type WhatsappNumberProfile, type WhatsappNumberStatus, WhatsappNumbersResource, type WhatsappTemplate, type WhatsappTemplateCategory, type WhatsappTemplateStatus, WhatsappTemplatesResource };
551
+ export { type AreaCode, type AvailablePlan, type ConnectWabaInput, type ConnectWhatsappNumberInput, type CreateDomainInput, type CreateDomainResult, type CreateTemplateInput, type CreateWebhookInput, type CreateWhatsappTemplateInput, type DnsRecord, type DomainStatus, type DomainType, DomainsResource, GeekappsPost, type GeekappsPostOptions, HistoryResource, type HttpClientOptions, type ListHistoryParams, type ManagedNumber, type ManagedNumberStatus, ManagedNumbersResource, type MessageLog, type MessageLogDetail, type MessageStatus, type MessageTemplate, type MessageType, MessagesResource, type OrgDomain, type OrgPlan, type OrgUsage, type OrgWaba, type OrgWebhook, type OrgWebhookWithSecret, type PaginatedResult, type PhoneNumberStatusResult, type PlanTier, PlansResource, type PlansResult, PostApiError, PostClient, type RegisterWhatsappNumberInput, type RotateSecretResult, type SaveDraftInput, type SendMessageInput, type SendMessageResult, type SmtpConfig, SmtpResource, type StatisticsParams, StatisticsResource, type StatisticsResult, type SyncWhatsappTemplatesResult, type TemplateVariable, type TemplateVariables, TemplatesResource, type TokenResolver, type UpdatePlanInput, type UpdateTemplateInput, type UpdateWebhookInput, type UpdateWhatsappProfileInput, type UpdateWhatsappTemplateInput, type UpsertSmtpConfigInput, type WabaStatus, type WebhookDelivery, type WebhookEvent, WebhooksResource, type WhatsappNumber, type WhatsappNumberProfile, type WhatsappNumberStatus, WhatsappNumbersResource, type WhatsappTemplate, type WhatsappTemplateCategory, type WhatsappTemplateStatus, WhatsappTemplatesResource };
package/dist/index.js CHANGED
@@ -372,7 +372,7 @@ var TokenProvider = class {
372
372
  constructor(options) {
373
373
  this.cached = null;
374
374
  this.inflight = null;
375
- this.issuerUrl = options.issuer.replace(/\/$/, "");
375
+ this.issuerUrl = options.serviceAccount.issuerUrl.replace(/\/$/, "");
376
376
  this.clientId = options.serviceAccount.clientId;
377
377
  this.clientSecret = options.serviceAccount.clientSecret;
378
378
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/domains.ts","../src/resources/history.ts","../src/resources/managed-numbers.ts","../src/resources/messages.ts","../src/resources/plans.ts","../src/resources/smtp.ts","../src/resources/statistics.ts","../src/resources/templates.ts","../src/resources/webhooks.ts","../src/resources/whatsapp-numbers.ts","../src/resources/whatsapp-templates.ts","../src/client.ts","../src/geekapps-post.ts"],"sourcesContent":["export class PostApiError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly detail?: string,\n ) {\n super(detail ? `${message}: ${detail}` : message);\n this.name = \"PostApiError\";\n }\n\n get isNotFound() { return this.status === 404; }\n get isUnauthorized() { return this.status === 401; }\n get isForbidden() { return this.status === 403; }\n get isRateLimited() { return this.status === 429; }\n get isValidationError() { return this.status === 400; }\n}\n","import { PostApiError } from \"./errors.js\";\n\nexport type TokenResolver = string | (() => string | Promise<string>);\n\nexport interface HttpClientOptions {\n baseUrl: string;\n token?: TokenResolver;\n organizationId?: string | (() => string | Promise<string>);\n}\n\nexport interface RequestOptions {\n token?: string;\n organizationId?: string;\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token?: TokenResolver;\n private readonly organizationId?: string | (() => string | Promise<string>);\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n this.organizationId = options.organizationId;\n }\n\n private async resolveToken(override?: string): Promise<string> {\n if (override) return override;\n if (!this.token) throw new Error(\"@geekapps/post-nextjs: no token provided\");\n return typeof this.token === \"function\" ? await this.token() : this.token;\n }\n\n private async resolveOrgId(override?: string): Promise<string | undefined> {\n if (override) return override;\n if (!this.organizationId) return undefined;\n return typeof this.organizationId === \"function\"\n ? await this.organizationId()\n : this.organizationId;\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n body?: unknown,\n opts?: RequestOptions,\n ): Promise<T> {\n const token = await this.resolveToken(opts?.token);\n const orgId = await this.resolveOrgId(opts?.organizationId);\n\n const res = await fetch(`${this.baseUrl}/v1${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n ...(body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n ...(orgId ? { \"X-Organization-Id\": orgId } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n cache: \"no-store\" as RequestCache,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string; detail?: string };\n throw new PostApiError(res.status, err.error ?? `HTTP ${res.status}`, err.detail);\n }\n\n if (res.status === 204) return undefined as T;\n return res.json() as Promise<T>;\n }\n\n get<T>(path: string, opts?: RequestOptions) { return this.request<T>(\"GET\", path, undefined, opts); }\n post<T>(path: string, body?: unknown, opts?: RequestOptions) { return this.request<T>(\"POST\", path, body, opts); }\n put<T>(path: string, body?: unknown, opts?: RequestOptions) { return this.request<T>(\"PUT\", path, body, opts); }\n patch<T>(path: string, body?: unknown, opts?: RequestOptions) { return this.request<T>(\"PATCH\", path, body, opts); }\n delete<T = void>(path: string, opts?: RequestOptions) { return this.request<T>(\"DELETE\", path, undefined, opts); }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { CreateDomainInput, CreateDomainResult, OrgDomain } from \"../types.js\";\n\nexport class DomainsResource {\n constructor(private readonly http: HttpClient) {}\n\n list(opts?: RequestOptions): Promise<OrgDomain[]> {\n return this.http.get<OrgDomain[]>(\"/domains\", opts);\n }\n\n get(id: string, opts?: RequestOptions): Promise<OrgDomain> {\n return this.http.get<OrgDomain>(`/domains/${id}`, opts);\n }\n\n create(input: CreateDomainInput, opts?: RequestOptions): Promise<CreateDomainResult> {\n return this.http.post<CreateDomainResult>(\"/domains\", input, opts);\n }\n\n verify(id: string, opts?: RequestOptions): Promise<{ status: \"verified\" | \"failed\" }> {\n return this.http.post<{ status: \"verified\" | \"failed\" }>(`/domains/${id}/verify`, undefined, opts);\n }\n\n delete(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/domains/${id}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { ListHistoryParams, MessageLog, MessageLogDetail, PaginatedResult } from \"../types.js\";\n\nexport class HistoryResource {\n constructor(private readonly http: HttpClient) {}\n\n list(params?: ListHistoryParams, opts?: RequestOptions): Promise<PaginatedResult<MessageLog>> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set(\"type\", params.type);\n if (params?.status) qs.set(\"status\", params.status);\n if (params?.from) qs.set(\"from\", params.from);\n if (params?.to) qs.set(\"to\", params.to);\n if (params?.page !== undefined) qs.set(\"page\", String(params.page));\n if (params?.limit !== undefined) qs.set(\"limit\", String(params.limit));\n const query = qs.toString();\n return this.http.get<PaginatedResult<MessageLog>>(`/history${query ? `?${query}` : \"\"}`, opts);\n }\n\n get(id: string, opts?: RequestOptions): Promise<MessageLogDetail> {\n return this.http.get<MessageLogDetail>(`/history/${id}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { AreaCode, ManagedNumber } from \"../types.js\";\n\nexport interface ProvisionManagedNumberInput {\n areaCode: number;\n name?: string;\n displayName: string;\n otpMethod?: \"SMS\" | \"VOICE\";\n otpLanguage?: string;\n pin?: string;\n orgWabaId?: string;\n wabaId?: string;\n accessToken?: string;\n}\n\nexport interface RetryVerificationInput {\n otpMethod?: \"SMS\" | \"VOICE\";\n otpLanguage?: string;\n}\n\nexport class ManagedNumbersResource {\n constructor(private readonly http: HttpClient) {}\n\n listAreaCodes(opts?: RequestOptions): Promise<AreaCode[]> {\n return this.http.get<AreaCode[]>(\"/managed-numbers/area-codes\", opts);\n }\n\n list(opts?: RequestOptions): Promise<ManagedNumber[]> {\n return this.http.get<ManagedNumber[]>(\"/managed-numbers\", opts);\n }\n\n get(id: string, opts?: RequestOptions): Promise<ManagedNumber> {\n return this.http.get<ManagedNumber>(`/managed-numbers/${id}`, opts);\n }\n\n provision(input: ProvisionManagedNumberInput, opts?: RequestOptions): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(\"/managed-numbers\", input, opts);\n }\n\n retryVerification(id: string, input?: RetryVerificationInput, opts?: RequestOptions): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(`/managed-numbers/${id}/retry-verification`, input, opts);\n }\n\n cancel(id: string, opts?: RequestOptions): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(`/managed-numbers/${id}/cancel`, undefined, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { SendMessageInput, SendMessageResult } from \"../types.js\";\n\nexport class MessagesResource {\n constructor(private readonly http: HttpClient) {}\n\n send(input: SendMessageInput, opts?: RequestOptions): Promise<SendMessageResult> {\n return this.http.post<SendMessageResult>(\"/messages\", input, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { AvailablePlan, OrgPlan, PlansResult, UpdatePlanInput } from \"../types.js\";\n\nexport class PlansResource {\n constructor(private readonly http: HttpClient) {}\n\n get(opts?: RequestOptions): Promise<PlansResult> {\n return this.http.get<PlansResult>(\"/plans\", opts);\n }\n\n update(input: UpdatePlanInput, opts?: RequestOptions): Promise<OrgPlan> {\n return this.http.put<OrgPlan>(\"/plans\", input, opts);\n }\n\n listAvailable(opts?: RequestOptions): Promise<AvailablePlan[]> {\n return this.http.get<AvailablePlan[]>(\"/plans/available\", opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { SmtpConfig, UpsertSmtpConfigInput } from \"../types.js\";\n\nexport class SmtpResource {\n constructor(private readonly http: HttpClient) {}\n\n get(opts?: RequestOptions): Promise<SmtpConfig> {\n return this.http.get<SmtpConfig>(\"/smtp-config\", opts);\n }\n\n upsert(input: UpsertSmtpConfigInput, opts?: RequestOptions): Promise<SmtpConfig> {\n return this.http.put<SmtpConfig>(\"/smtp-config\", input, opts);\n }\n\n delete(opts?: RequestOptions): Promise<void> {\n return this.http.delete(\"/smtp-config\", opts);\n }\n\n test(to: string, opts?: RequestOptions): Promise<{ success: boolean; error?: string }> {\n return this.http.post<{ success: boolean; error?: string }>(\"/smtp-config/test\", { to }, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { StatisticsParams, StatisticsResult } from \"../types.js\";\n\nexport class StatisticsResource {\n constructor(private readonly http: HttpClient) {}\n\n get(params?: StatisticsParams, opts?: RequestOptions): Promise<StatisticsResult> {\n const qs = new URLSearchParams();\n if (params?.from) qs.set(\"from\", params.from);\n if (params?.to) qs.set(\"to\", params.to);\n if (params?.groupBy) qs.set(\"groupBy\", params.groupBy);\n const query = qs.toString();\n return this.http.get<StatisticsResult>(`/statistics${query ? `?${query}` : \"\"}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type {\n CreateTemplateInput,\n MessageTemplate,\n MessageType,\n SaveDraftInput,\n UpdateTemplateInput,\n} from \"../types.js\";\n\nexport class TemplatesResource {\n constructor(private readonly http: HttpClient) {}\n\n list(params?: { type?: MessageType; isActive?: boolean }, opts?: RequestOptions): Promise<MessageTemplate[]> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set(\"type\", params.type);\n if (params?.isActive !== undefined) qs.set(\"isActive\", String(params.isActive));\n const query = qs.toString();\n return this.http.get<MessageTemplate[]>(`/templates${query ? `?${query}` : \"\"}`, opts);\n }\n\n get(id: string, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.get<MessageTemplate>(`/templates/${id}`, opts);\n }\n\n create(input: CreateTemplateInput, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.post<MessageTemplate>(\"/templates\", input, opts);\n }\n\n update(id: string, input: UpdateTemplateInput, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.put<MessageTemplate>(`/templates/${id}`, input, opts);\n }\n\n saveDraft(id: string, input: SaveDraftInput, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.patch<MessageTemplate>(`/templates/${id}/draft`, input, opts);\n }\n\n publish(id: string, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.post<MessageTemplate>(`/templates/${id}/publish`, undefined, opts);\n }\n\n delete(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/templates/${id}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type {\n CreateWebhookInput,\n OrgWebhook,\n OrgWebhookWithSecret,\n RotateSecretResult,\n UpdateWebhookInput,\n WebhookDelivery,\n} from \"../types.js\";\n\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n list(opts?: RequestOptions): Promise<OrgWebhook[]> {\n return this.http.get<OrgWebhook[]>(\"/webhooks\", opts);\n }\n\n create(input: CreateWebhookInput, opts?: RequestOptions): Promise<OrgWebhookWithSecret> {\n return this.http.post<OrgWebhookWithSecret>(\"/webhooks\", input, opts);\n }\n\n update(id: string, input: UpdateWebhookInput, opts?: RequestOptions): Promise<OrgWebhook> {\n return this.http.put<OrgWebhook>(`/webhooks/${id}`, input, opts);\n }\n\n delete(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/webhooks/${id}`, opts);\n }\n\n listDeliveries(id: string, opts?: RequestOptions): Promise<WebhookDelivery[]> {\n return this.http.get<WebhookDelivery[]>(`/webhooks/${id}/deliveries`, opts);\n }\n\n rotateSecret(id: string, opts?: RequestOptions): Promise<RotateSecretResult> {\n return this.http.post<RotateSecretResult>(`/webhooks/${id}/rotate-secret`, undefined, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type {\n ConnectWabaInput,\n ConnectWhatsappNumberInput,\n OrgWaba,\n PhoneNumberStatusResult,\n RegisterWhatsappNumberInput,\n UpdateWhatsappProfileInput,\n WabaHealthResult,\n WhatsappNumber,\n WhatsappNumberProfile,\n} from \"../types.js\";\n\nexport class WhatsappNumbersResource {\n constructor(private readonly http: HttpClient) {}\n\n listWabas(opts?: RequestOptions): Promise<OrgWaba[]> {\n return this.http.get<OrgWaba[]>(\"/whatsapp/wabas\", opts);\n }\n\n connectWaba(input: ConnectWabaInput, opts?: RequestOptions): Promise<OrgWaba> {\n return this.http.post<OrgWaba>(\"/whatsapp/wabas/connect\", input, opts);\n }\n\n reconnectWaba(id: string, opts?: RequestOptions): Promise<OrgWaba> {\n return this.http.post<OrgWaba>(`/whatsapp/wabas/${id}/reconnect`, undefined, opts);\n }\n\n disconnectWaba(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/whatsapp/wabas/${id}`, opts);\n }\n\n getWabaHealth(id: string, opts?: RequestOptions): Promise<WabaHealthResult> {\n return this.http.get<WabaHealthResult>(`/whatsapp/wabas/${id}/health`, opts);\n }\n\n listNumbers(opts?: RequestOptions): Promise<WhatsappNumber[]> {\n return this.http.get<WhatsappNumber[]>(\"/whatsapp/numbers\", opts);\n }\n\n connectNumber(input: ConnectWhatsappNumberInput, opts?: RequestOptions): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(\"/whatsapp/numbers/connect\", input, opts);\n }\n\n registerNumber(input: RegisterWhatsappNumberInput, opts?: RequestOptions): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(\"/whatsapp/numbers\", input, opts);\n }\n\n verifyCode(id: string, code: string, opts?: RequestOptions): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(`/whatsapp/numbers/${id}/verify-code`, { code }, opts);\n }\n\n resendCode(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.post(`/whatsapp/numbers/${id}/resend-code`, undefined, opts);\n }\n\n getProfile(id: string, opts?: RequestOptions): Promise<WhatsappNumberProfile> {\n return this.http.get<WhatsappNumberProfile>(`/whatsapp/numbers/${id}/profile`, opts);\n }\n\n updateProfile(id: string, input: UpdateWhatsappProfileInput, opts?: RequestOptions): Promise<WhatsappNumberProfile> {\n return this.http.patch<WhatsappNumberProfile>(`/whatsapp/numbers/${id}/profile`, input, opts);\n }\n\n updateDisplayName(id: string, displayName: string, opts?: RequestOptions): Promise<WhatsappNumber> {\n return this.http.patch<WhatsappNumber>(`/whatsapp/numbers/${id}`, { displayName }, opts);\n }\n\n getStatus(id: string, opts?: RequestOptions): Promise<PhoneNumberStatusResult> {\n return this.http.get<PhoneNumberStatusResult>(`/whatsapp/numbers/${id}/status`, opts);\n }\n\n refreshNumbers(opts?: RequestOptions): Promise<WhatsappNumber[]> {\n return this.http.post<WhatsappNumber[]>(\"/whatsapp/numbers/refresh\", undefined, opts);\n }\n\n deleteNumber(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/whatsapp/numbers/${id}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type {\n CreateWhatsappTemplateInput,\n SyncWhatsappTemplatesResult,\n UpdateWhatsappTemplateInput,\n WhatsappTemplate,\n} from \"../types.js\";\n\nexport class WhatsappTemplatesResource {\n constructor(private readonly http: HttpClient) {}\n\n list(opts?: RequestOptions): Promise<WhatsappTemplate[]> {\n return this.http.get<WhatsappTemplate[]>(\"/whatsapp/templates\", opts);\n }\n\n create(input: CreateWhatsappTemplateInput, opts?: RequestOptions): Promise<WhatsappTemplate> {\n return this.http.post<WhatsappTemplate>(\"/whatsapp/templates\", input, opts);\n }\n\n update(id: string, input: UpdateWhatsappTemplateInput, opts?: RequestOptions): Promise<WhatsappTemplate> {\n return this.http.put<WhatsappTemplate>(`/whatsapp/templates/${id}`, input, opts);\n }\n\n sync(opts?: RequestOptions): Promise<SyncWhatsappTemplatesResult> {\n return this.http.post<SyncWhatsappTemplatesResult>(\"/whatsapp/templates/sync\", undefined, opts);\n }\n\n delete(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/whatsapp/templates/${id}`, opts);\n }\n}\n","import { HttpClient, type HttpClientOptions } from \"./http.js\";\nimport { DomainsResource } from \"./resources/domains.js\";\nimport { HistoryResource } from \"./resources/history.js\";\nimport { ManagedNumbersResource } from \"./resources/managed-numbers.js\";\nimport { MessagesResource } from \"./resources/messages.js\";\nimport { PlansResource } from \"./resources/plans.js\";\nimport { SmtpResource } from \"./resources/smtp.js\";\nimport { StatisticsResource } from \"./resources/statistics.js\";\nimport { TemplatesResource } from \"./resources/templates.js\";\nimport { WebhooksResource } from \"./resources/webhooks.js\";\nimport { WhatsappNumbersResource } from \"./resources/whatsapp-numbers.js\";\nimport { WhatsappTemplatesResource } from \"./resources/whatsapp-templates.js\";\n\nexport interface PostClientOptions extends Omit<HttpClientOptions, \"baseUrl\"> {\n baseUrl?: string;\n}\n\nexport class PostClient {\n private readonly http: HttpClient;\n\n readonly messages: MessagesResource;\n readonly templates: TemplatesResource;\n readonly whatsappTemplates: WhatsappTemplatesResource;\n readonly whatsappNumbers: WhatsappNumbersResource;\n readonly domains: DomainsResource;\n readonly webhooks: WebhooksResource;\n readonly smtp: SmtpResource;\n readonly plans: PlansResource;\n readonly history: HistoryResource;\n readonly statistics: StatisticsResource;\n readonly managedNumbers: ManagedNumbersResource;\n\n constructor(options: HttpClientOptions) {\n this.http = new HttpClient(options);\n\n this.messages = new MessagesResource(this.http);\n this.templates = new TemplatesResource(this.http);\n this.whatsappTemplates = new WhatsappTemplatesResource(this.http);\n this.whatsappNumbers = new WhatsappNumbersResource(this.http);\n this.domains = new DomainsResource(this.http);\n this.webhooks = new WebhooksResource(this.http);\n this.smtp = new SmtpResource(this.http);\n this.plans = new PlansResource(this.http);\n this.history = new HistoryResource(this.http);\n this.statistics = new StatisticsResource(this.http);\n this.managedNumbers = new ManagedNumbersResource(this.http);\n }\n}\n","import { PostClient } from \"./client.js\";\n\nexport interface ServiceAccountOptions {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface GeekappsPostOptions {\n issuer: string;\n serviceAccount: ServiceAccountOptions;\n baseUrl?: string;\n}\n\ninterface CachedToken {\n value: string;\n expiresAt: number;\n organizationId: string | undefined;\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> {\n try {\n const [, payload] = token.split(\".\");\n if (!payload) return {};\n const json = atob(payload.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nclass TokenProvider {\n private readonly issuerUrl: string;\n private readonly clientId: string;\n private readonly clientSecret: string;\n private cached: CachedToken | null = null;\n private inflight: Promise<CachedToken> | null = null;\n\n constructor(options: GeekappsPostOptions) {\n this.issuerUrl = options.issuer.replace(/\\/$/, \"\");\n this.clientId = options.serviceAccount.clientId;\n this.clientSecret = options.serviceAccount.clientSecret;\n }\n\n private async ensureFresh(): Promise<CachedToken> {\n const now = Date.now();\n if (this.cached && this.cached.expiresAt - now > 30_000) return this.cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.fetchToken().finally(() => { this.inflight = null; });\n return this.inflight;\n }\n\n getToken(): Promise<string> {\n return this.ensureFresh().then((c) => c.value);\n }\n\n getOrganizationId(): Promise<string | undefined> {\n return this.ensureFresh().then((c) => c.organizationId);\n }\n\n private async fetchToken(): Promise<CachedToken> {\n const credentials = btoa(`${this.clientId}:${this.clientSecret}`);\n const res = await fetch(`${this.issuerUrl}/auth/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify({ grant_type: \"service_account\" }),\n cache: \"no-store\" as RequestCache,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new Error(`GeekappsPost auth failed (${res.status}): ${err.error ?? \"unknown error\"}`);\n }\n\n const data = await res.json() as { access_token: string; expires_in?: number };\n const claims = decodeJwtPayload(data.access_token);\n const organizationId =\n typeof claims.organizationId === \"string\" ? claims.organizationId :\n typeof claims.organization_id === \"string\" ? claims.organization_id :\n undefined;\n\n this.cached = {\n value: data.access_token,\n expiresAt: Date.now() + (data.expires_in ?? 420) * 1000,\n organizationId,\n };\n return this.cached;\n }\n}\n\nexport class GeekappsPost extends PostClient {\n constructor(options: GeekappsPostOptions) {\n const baseUrl = options.baseUrl ?? \"https://post-api.geekapps.com.br\";\n const provider = new TokenProvider(options);\n\n super({\n baseUrl,\n token: () => provider.getToken(),\n organizationId: () => provider.getOrganizationId() as Promise<string>,\n });\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/domains.ts","../src/resources/history.ts","../src/resources/managed-numbers.ts","../src/resources/messages.ts","../src/resources/plans.ts","../src/resources/smtp.ts","../src/resources/statistics.ts","../src/resources/templates.ts","../src/resources/webhooks.ts","../src/resources/whatsapp-numbers.ts","../src/resources/whatsapp-templates.ts","../src/client.ts","../src/geekapps-post.ts"],"sourcesContent":["export class PostApiError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly detail?: string,\n ) {\n super(detail ? `${message}: ${detail}` : message);\n this.name = \"PostApiError\";\n }\n\n get isNotFound() { return this.status === 404; }\n get isUnauthorized() { return this.status === 401; }\n get isForbidden() { return this.status === 403; }\n get isRateLimited() { return this.status === 429; }\n get isValidationError() { return this.status === 400; }\n}\n","import { PostApiError } from \"./errors.js\";\n\nexport type TokenResolver = string | (() => string | Promise<string>);\n\nexport interface HttpClientOptions {\n baseUrl: string;\n token?: TokenResolver;\n organizationId?: string | (() => string | Promise<string>);\n}\n\nexport interface RequestOptions {\n token?: string;\n organizationId?: string;\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token?: TokenResolver;\n private readonly organizationId?: string | (() => string | Promise<string>);\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n this.organizationId = options.organizationId;\n }\n\n private async resolveToken(override?: string): Promise<string> {\n if (override) return override;\n if (!this.token) throw new Error(\"@geekapps/post-nextjs: no token provided\");\n return typeof this.token === \"function\" ? await this.token() : this.token;\n }\n\n private async resolveOrgId(override?: string): Promise<string | undefined> {\n if (override) return override;\n if (!this.organizationId) return undefined;\n return typeof this.organizationId === \"function\"\n ? await this.organizationId()\n : this.organizationId;\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n body?: unknown,\n opts?: RequestOptions,\n ): Promise<T> {\n const token = await this.resolveToken(opts?.token);\n const orgId = await this.resolveOrgId(opts?.organizationId);\n\n const res = await fetch(`${this.baseUrl}/v1${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n ...(body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n ...(orgId ? { \"X-Organization-Id\": orgId } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n cache: \"no-store\" as RequestCache,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string; detail?: string };\n throw new PostApiError(res.status, err.error ?? `HTTP ${res.status}`, err.detail);\n }\n\n if (res.status === 204) return undefined as T;\n return res.json() as Promise<T>;\n }\n\n get<T>(path: string, opts?: RequestOptions) { return this.request<T>(\"GET\", path, undefined, opts); }\n post<T>(path: string, body?: unknown, opts?: RequestOptions) { return this.request<T>(\"POST\", path, body, opts); }\n put<T>(path: string, body?: unknown, opts?: RequestOptions) { return this.request<T>(\"PUT\", path, body, opts); }\n patch<T>(path: string, body?: unknown, opts?: RequestOptions) { return this.request<T>(\"PATCH\", path, body, opts); }\n delete<T = void>(path: string, opts?: RequestOptions) { return this.request<T>(\"DELETE\", path, undefined, opts); }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { CreateDomainInput, CreateDomainResult, OrgDomain } from \"../types.js\";\n\nexport class DomainsResource {\n constructor(private readonly http: HttpClient) {}\n\n list(opts?: RequestOptions): Promise<OrgDomain[]> {\n return this.http.get<OrgDomain[]>(\"/domains\", opts);\n }\n\n get(id: string, opts?: RequestOptions): Promise<OrgDomain> {\n return this.http.get<OrgDomain>(`/domains/${id}`, opts);\n }\n\n create(input: CreateDomainInput, opts?: RequestOptions): Promise<CreateDomainResult> {\n return this.http.post<CreateDomainResult>(\"/domains\", input, opts);\n }\n\n verify(id: string, opts?: RequestOptions): Promise<{ status: \"verified\" | \"failed\" }> {\n return this.http.post<{ status: \"verified\" | \"failed\" }>(`/domains/${id}/verify`, undefined, opts);\n }\n\n delete(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/domains/${id}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { ListHistoryParams, MessageLog, MessageLogDetail, PaginatedResult } from \"../types.js\";\n\nexport class HistoryResource {\n constructor(private readonly http: HttpClient) {}\n\n list(params?: ListHistoryParams, opts?: RequestOptions): Promise<PaginatedResult<MessageLog>> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set(\"type\", params.type);\n if (params?.status) qs.set(\"status\", params.status);\n if (params?.from) qs.set(\"from\", params.from);\n if (params?.to) qs.set(\"to\", params.to);\n if (params?.page !== undefined) qs.set(\"page\", String(params.page));\n if (params?.limit !== undefined) qs.set(\"limit\", String(params.limit));\n const query = qs.toString();\n return this.http.get<PaginatedResult<MessageLog>>(`/history${query ? `?${query}` : \"\"}`, opts);\n }\n\n get(id: string, opts?: RequestOptions): Promise<MessageLogDetail> {\n return this.http.get<MessageLogDetail>(`/history/${id}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { AreaCode, ManagedNumber } from \"../types.js\";\n\nexport interface ProvisionManagedNumberInput {\n areaCode: number;\n name?: string;\n displayName: string;\n otpMethod?: \"SMS\" | \"VOICE\";\n otpLanguage?: string;\n pin?: string;\n orgWabaId?: string;\n wabaId?: string;\n accessToken?: string;\n}\n\nexport interface RetryVerificationInput {\n otpMethod?: \"SMS\" | \"VOICE\";\n otpLanguage?: string;\n}\n\nexport class ManagedNumbersResource {\n constructor(private readonly http: HttpClient) {}\n\n listAreaCodes(opts?: RequestOptions): Promise<AreaCode[]> {\n return this.http.get<AreaCode[]>(\"/managed-numbers/area-codes\", opts);\n }\n\n list(opts?: RequestOptions): Promise<ManagedNumber[]> {\n return this.http.get<ManagedNumber[]>(\"/managed-numbers\", opts);\n }\n\n get(id: string, opts?: RequestOptions): Promise<ManagedNumber> {\n return this.http.get<ManagedNumber>(`/managed-numbers/${id}`, opts);\n }\n\n provision(input: ProvisionManagedNumberInput, opts?: RequestOptions): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(\"/managed-numbers\", input, opts);\n }\n\n retryVerification(id: string, input?: RetryVerificationInput, opts?: RequestOptions): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(`/managed-numbers/${id}/retry-verification`, input, opts);\n }\n\n cancel(id: string, opts?: RequestOptions): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(`/managed-numbers/${id}/cancel`, undefined, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { SendMessageInput, SendMessageResult } from \"../types.js\";\n\nexport class MessagesResource {\n constructor(private readonly http: HttpClient) {}\n\n send(input: SendMessageInput, opts?: RequestOptions): Promise<SendMessageResult> {\n return this.http.post<SendMessageResult>(\"/messages\", input, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { AvailablePlan, OrgPlan, PlansResult, UpdatePlanInput } from \"../types.js\";\n\nexport class PlansResource {\n constructor(private readonly http: HttpClient) {}\n\n get(opts?: RequestOptions): Promise<PlansResult> {\n return this.http.get<PlansResult>(\"/plans\", opts);\n }\n\n update(input: UpdatePlanInput, opts?: RequestOptions): Promise<OrgPlan> {\n return this.http.put<OrgPlan>(\"/plans\", input, opts);\n }\n\n listAvailable(opts?: RequestOptions): Promise<AvailablePlan[]> {\n return this.http.get<AvailablePlan[]>(\"/plans/available\", opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { SmtpConfig, UpsertSmtpConfigInput } from \"../types.js\";\n\nexport class SmtpResource {\n constructor(private readonly http: HttpClient) {}\n\n get(opts?: RequestOptions): Promise<SmtpConfig> {\n return this.http.get<SmtpConfig>(\"/smtp-config\", opts);\n }\n\n upsert(input: UpsertSmtpConfigInput, opts?: RequestOptions): Promise<SmtpConfig> {\n return this.http.put<SmtpConfig>(\"/smtp-config\", input, opts);\n }\n\n delete(opts?: RequestOptions): Promise<void> {\n return this.http.delete(\"/smtp-config\", opts);\n }\n\n test(to: string, opts?: RequestOptions): Promise<{ success: boolean; error?: string }> {\n return this.http.post<{ success: boolean; error?: string }>(\"/smtp-config/test\", { to }, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type { StatisticsParams, StatisticsResult } from \"../types.js\";\n\nexport class StatisticsResource {\n constructor(private readonly http: HttpClient) {}\n\n get(params?: StatisticsParams, opts?: RequestOptions): Promise<StatisticsResult> {\n const qs = new URLSearchParams();\n if (params?.from) qs.set(\"from\", params.from);\n if (params?.to) qs.set(\"to\", params.to);\n if (params?.groupBy) qs.set(\"groupBy\", params.groupBy);\n const query = qs.toString();\n return this.http.get<StatisticsResult>(`/statistics${query ? `?${query}` : \"\"}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type {\n CreateTemplateInput,\n MessageTemplate,\n MessageType,\n SaveDraftInput,\n UpdateTemplateInput,\n} from \"../types.js\";\n\nexport class TemplatesResource {\n constructor(private readonly http: HttpClient) {}\n\n list(params?: { type?: MessageType; isActive?: boolean }, opts?: RequestOptions): Promise<MessageTemplate[]> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set(\"type\", params.type);\n if (params?.isActive !== undefined) qs.set(\"isActive\", String(params.isActive));\n const query = qs.toString();\n return this.http.get<MessageTemplate[]>(`/templates${query ? `?${query}` : \"\"}`, opts);\n }\n\n get(id: string, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.get<MessageTemplate>(`/templates/${id}`, opts);\n }\n\n create(input: CreateTemplateInput, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.post<MessageTemplate>(\"/templates\", input, opts);\n }\n\n update(id: string, input: UpdateTemplateInput, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.put<MessageTemplate>(`/templates/${id}`, input, opts);\n }\n\n saveDraft(id: string, input: SaveDraftInput, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.patch<MessageTemplate>(`/templates/${id}/draft`, input, opts);\n }\n\n publish(id: string, opts?: RequestOptions): Promise<MessageTemplate> {\n return this.http.post<MessageTemplate>(`/templates/${id}/publish`, undefined, opts);\n }\n\n delete(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/templates/${id}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type {\n CreateWebhookInput,\n OrgWebhook,\n OrgWebhookWithSecret,\n RotateSecretResult,\n UpdateWebhookInput,\n WebhookDelivery,\n} from \"../types.js\";\n\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n list(opts?: RequestOptions): Promise<OrgWebhook[]> {\n return this.http.get<OrgWebhook[]>(\"/webhooks\", opts);\n }\n\n create(input: CreateWebhookInput, opts?: RequestOptions): Promise<OrgWebhookWithSecret> {\n return this.http.post<OrgWebhookWithSecret>(\"/webhooks\", input, opts);\n }\n\n update(id: string, input: UpdateWebhookInput, opts?: RequestOptions): Promise<OrgWebhook> {\n return this.http.put<OrgWebhook>(`/webhooks/${id}`, input, opts);\n }\n\n delete(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/webhooks/${id}`, opts);\n }\n\n listDeliveries(id: string, opts?: RequestOptions): Promise<WebhookDelivery[]> {\n return this.http.get<WebhookDelivery[]>(`/webhooks/${id}/deliveries`, opts);\n }\n\n rotateSecret(id: string, opts?: RequestOptions): Promise<RotateSecretResult> {\n return this.http.post<RotateSecretResult>(`/webhooks/${id}/rotate-secret`, undefined, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type {\n ConnectWabaInput,\n ConnectWhatsappNumberInput,\n OrgWaba,\n PhoneNumberStatusResult,\n RegisterWhatsappNumberInput,\n UpdateWhatsappProfileInput,\n WabaHealthResult,\n WhatsappNumber,\n WhatsappNumberProfile,\n} from \"../types.js\";\n\nexport class WhatsappNumbersResource {\n constructor(private readonly http: HttpClient) {}\n\n listWabas(opts?: RequestOptions): Promise<OrgWaba[]> {\n return this.http.get<OrgWaba[]>(\"/whatsapp/wabas\", opts);\n }\n\n connectWaba(input: ConnectWabaInput, opts?: RequestOptions): Promise<OrgWaba> {\n return this.http.post<OrgWaba>(\"/whatsapp/wabas/connect\", input, opts);\n }\n\n reconnectWaba(id: string, opts?: RequestOptions): Promise<OrgWaba> {\n return this.http.post<OrgWaba>(`/whatsapp/wabas/${id}/reconnect`, undefined, opts);\n }\n\n disconnectWaba(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/whatsapp/wabas/${id}`, opts);\n }\n\n getWabaHealth(id: string, opts?: RequestOptions): Promise<WabaHealthResult> {\n return this.http.get<WabaHealthResult>(`/whatsapp/wabas/${id}/health`, opts);\n }\n\n listNumbers(opts?: RequestOptions): Promise<WhatsappNumber[]> {\n return this.http.get<WhatsappNumber[]>(\"/whatsapp/numbers\", opts);\n }\n\n connectNumber(input: ConnectWhatsappNumberInput, opts?: RequestOptions): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(\"/whatsapp/numbers/connect\", input, opts);\n }\n\n registerNumber(input: RegisterWhatsappNumberInput, opts?: RequestOptions): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(\"/whatsapp/numbers\", input, opts);\n }\n\n verifyCode(id: string, code: string, opts?: RequestOptions): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(`/whatsapp/numbers/${id}/verify-code`, { code }, opts);\n }\n\n resendCode(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.post(`/whatsapp/numbers/${id}/resend-code`, undefined, opts);\n }\n\n getProfile(id: string, opts?: RequestOptions): Promise<WhatsappNumberProfile> {\n return this.http.get<WhatsappNumberProfile>(`/whatsapp/numbers/${id}/profile`, opts);\n }\n\n updateProfile(id: string, input: UpdateWhatsappProfileInput, opts?: RequestOptions): Promise<WhatsappNumberProfile> {\n return this.http.patch<WhatsappNumberProfile>(`/whatsapp/numbers/${id}/profile`, input, opts);\n }\n\n updateDisplayName(id: string, displayName: string, opts?: RequestOptions): Promise<WhatsappNumber> {\n return this.http.patch<WhatsappNumber>(`/whatsapp/numbers/${id}`, { displayName }, opts);\n }\n\n getStatus(id: string, opts?: RequestOptions): Promise<PhoneNumberStatusResult> {\n return this.http.get<PhoneNumberStatusResult>(`/whatsapp/numbers/${id}/status`, opts);\n }\n\n refreshNumbers(opts?: RequestOptions): Promise<WhatsappNumber[]> {\n return this.http.post<WhatsappNumber[]>(\"/whatsapp/numbers/refresh\", undefined, opts);\n }\n\n deleteNumber(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/whatsapp/numbers/${id}`, opts);\n }\n}\n","import type { HttpClient, RequestOptions } from \"../http.js\";\nimport type {\n CreateWhatsappTemplateInput,\n SyncWhatsappTemplatesResult,\n UpdateWhatsappTemplateInput,\n WhatsappTemplate,\n} from \"../types.js\";\n\nexport class WhatsappTemplatesResource {\n constructor(private readonly http: HttpClient) {}\n\n list(opts?: RequestOptions): Promise<WhatsappTemplate[]> {\n return this.http.get<WhatsappTemplate[]>(\"/whatsapp/templates\", opts);\n }\n\n create(input: CreateWhatsappTemplateInput, opts?: RequestOptions): Promise<WhatsappTemplate> {\n return this.http.post<WhatsappTemplate>(\"/whatsapp/templates\", input, opts);\n }\n\n update(id: string, input: UpdateWhatsappTemplateInput, opts?: RequestOptions): Promise<WhatsappTemplate> {\n return this.http.put<WhatsappTemplate>(`/whatsapp/templates/${id}`, input, opts);\n }\n\n sync(opts?: RequestOptions): Promise<SyncWhatsappTemplatesResult> {\n return this.http.post<SyncWhatsappTemplatesResult>(\"/whatsapp/templates/sync\", undefined, opts);\n }\n\n delete(id: string, opts?: RequestOptions): Promise<void> {\n return this.http.delete(`/whatsapp/templates/${id}`, opts);\n }\n}\n","import { HttpClient, type HttpClientOptions } from \"./http.js\";\nimport { DomainsResource } from \"./resources/domains.js\";\nimport { HistoryResource } from \"./resources/history.js\";\nimport { ManagedNumbersResource } from \"./resources/managed-numbers.js\";\nimport { MessagesResource } from \"./resources/messages.js\";\nimport { PlansResource } from \"./resources/plans.js\";\nimport { SmtpResource } from \"./resources/smtp.js\";\nimport { StatisticsResource } from \"./resources/statistics.js\";\nimport { TemplatesResource } from \"./resources/templates.js\";\nimport { WebhooksResource } from \"./resources/webhooks.js\";\nimport { WhatsappNumbersResource } from \"./resources/whatsapp-numbers.js\";\nimport { WhatsappTemplatesResource } from \"./resources/whatsapp-templates.js\";\n\nexport interface PostClientOptions extends Omit<HttpClientOptions, \"baseUrl\"> {\n baseUrl?: string;\n}\n\nexport class PostClient {\n private readonly http: HttpClient;\n\n readonly messages: MessagesResource;\n readonly templates: TemplatesResource;\n readonly whatsappTemplates: WhatsappTemplatesResource;\n readonly whatsappNumbers: WhatsappNumbersResource;\n readonly domains: DomainsResource;\n readonly webhooks: WebhooksResource;\n readonly smtp: SmtpResource;\n readonly plans: PlansResource;\n readonly history: HistoryResource;\n readonly statistics: StatisticsResource;\n readonly managedNumbers: ManagedNumbersResource;\n\n constructor(options: HttpClientOptions) {\n this.http = new HttpClient(options);\n\n this.messages = new MessagesResource(this.http);\n this.templates = new TemplatesResource(this.http);\n this.whatsappTemplates = new WhatsappTemplatesResource(this.http);\n this.whatsappNumbers = new WhatsappNumbersResource(this.http);\n this.domains = new DomainsResource(this.http);\n this.webhooks = new WebhooksResource(this.http);\n this.smtp = new SmtpResource(this.http);\n this.plans = new PlansResource(this.http);\n this.history = new HistoryResource(this.http);\n this.statistics = new StatisticsResource(this.http);\n this.managedNumbers = new ManagedNumbersResource(this.http);\n }\n}\n","import { PostClient } from \"./client.js\";\n\nexport interface ServiceAccountOptions {\n issuerUrl: string;\n clientId: string;\n clientSecret: string;\n}\n\nexport interface GeekappsPostOptions {\n serviceAccount: ServiceAccountOptions;\n baseUrl?: string;\n logLevel?: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n}\n\ninterface CachedToken {\n value: string;\n expiresAt: number;\n organizationId: string | undefined;\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> {\n try {\n const [, payload] = token.split(\".\");\n if (!payload) return {};\n const json = atob(payload.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nclass TokenProvider {\n private readonly issuerUrl: string;\n private readonly clientId: string;\n private readonly clientSecret: string;\n private cached: CachedToken | null = null;\n private inflight: Promise<CachedToken> | null = null;\n\n constructor(options: GeekappsPostOptions) {\n this.issuerUrl = options.serviceAccount.issuerUrl.replace(/\\/$/, \"\");\n this.clientId = options.serviceAccount.clientId;\n this.clientSecret = options.serviceAccount.clientSecret;\n }\n\n private async ensureFresh(): Promise<CachedToken> {\n const now = Date.now();\n if (this.cached && this.cached.expiresAt - now > 30_000) return this.cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.fetchToken().finally(() => { this.inflight = null; });\n return this.inflight;\n }\n\n getToken(): Promise<string> {\n return this.ensureFresh().then((c) => c.value);\n }\n\n getOrganizationId(): Promise<string | undefined> {\n return this.ensureFresh().then((c) => c.organizationId);\n }\n\n private async fetchToken(): Promise<CachedToken> {\n const credentials = btoa(`${this.clientId}:${this.clientSecret}`);\n const res = await fetch(`${this.issuerUrl}/auth/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify({ grant_type: \"service_account\" }),\n cache: \"no-store\" as RequestCache,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new Error(`GeekappsPost auth failed (${res.status}): ${err.error ?? \"unknown error\"}`);\n }\n\n const data = await res.json() as { access_token: string; expires_in?: number };\n const claims = decodeJwtPayload(data.access_token);\n const organizationId =\n typeof claims.organizationId === \"string\" ? claims.organizationId :\n typeof claims.organization_id === \"string\" ? claims.organization_id :\n undefined;\n\n this.cached = {\n value: data.access_token,\n expiresAt: Date.now() + (data.expires_in ?? 420) * 1000,\n organizationId,\n };\n return this.cached;\n }\n}\n\nexport class GeekappsPost extends PostClient {\n constructor(options: GeekappsPostOptions) {\n const baseUrl = options.baseUrl ?? \"https://post-api.geekapps.com.br\";\n const provider = new TokenProvider(options);\n\n super({\n baseUrl,\n token: () => provider.getToken(),\n organizationId: () => provider.getOrganizationId() as Promise<string>,\n });\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekapps/post-nextjs",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Geekapps Post SDK for Next.js",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,14 +1,15 @@
1
1
  import { PostClient } from "./client.js";
2
2
 
3
3
  export interface ServiceAccountOptions {
4
+ issuerUrl: string;
4
5
  clientId: string;
5
6
  clientSecret: string;
6
7
  }
7
8
 
8
9
  export interface GeekappsPostOptions {
9
- issuer: string;
10
10
  serviceAccount: ServiceAccountOptions;
11
11
  baseUrl?: string;
12
+ logLevel?: "trace" | "debug" | "info" | "warn" | "error" | "silent";
12
13
  }
13
14
 
14
15
  interface CachedToken {
@@ -36,7 +37,7 @@ class TokenProvider {
36
37
  private inflight: Promise<CachedToken> | null = null;
37
38
 
38
39
  constructor(options: GeekappsPostOptions) {
39
- this.issuerUrl = options.issuer.replace(/\/$/, "");
40
+ this.issuerUrl = options.serviceAccount.issuerUrl.replace(/\/$/, "");
40
41
  this.clientId = options.serviceAccount.clientId;
41
42
  this.clientSecret = options.serviceAccount.clientSecret;
42
43
  }
package/src/index.ts CHANGED
@@ -52,6 +52,8 @@ export type {
52
52
  SaveDraftInput,
53
53
  SendMessageInput,
54
54
  SendMessageResult,
55
+ TemplateVariable,
56
+ TemplateVariables,
55
57
  SmtpConfig,
56
58
  StatisticsParams,
57
59
  StatisticsResult,
package/src/types.ts CHANGED
@@ -239,6 +239,18 @@ export interface AreaCode {
239
239
 
240
240
  // ─── Request types ────────────────────────────────────────────────────────────
241
241
 
242
+ export interface TemplateVariable {
243
+ name: string;
244
+ value: string;
245
+ }
246
+
247
+ export interface TemplateVariables {
248
+ header?: TemplateVariable[];
249
+ body?: TemplateVariable[];
250
+ footer?: TemplateVariable[];
251
+ buttons?: Record<number, TemplateVariable[]>;
252
+ }
253
+
242
254
  export interface SendMessageInput {
243
255
  type: MessageType;
244
256
  to: string;
@@ -248,7 +260,7 @@ export interface SendMessageInput {
248
260
  template?: string;
249
261
  subject?: string;
250
262
  body?: string;
251
- variables?: Array<{ name: string; value: string }>;
263
+ variables?: TemplateVariable[] | TemplateVariables;
252
264
  }
253
265
 
254
266
  export interface CreateTemplateInput {