Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/llms-txt-hub / packages/newsletter/src/types.ts |
| Date | Not specified in source |
| Repository | Janady13/llms-txt-hub |
| Revision | e0f4bf978d4df168369c7601d9c5f5ea89e84377 |
| Branch | main |
| Path or archive member | packages/newsletter/src/types.ts |
| Original SHA-256 | 6c84a810f6606adbbdd3b429aab398ae20d9a6294610cc4d11f90bf2c7896339 |
| Git blob SHA | a15be3c2189653b76f78c6f11689a03769913d0d |
| Reading-copy SHA-256 | f15a320a71668cb1d5a811205b6de3abfdfe7e7e161b0ee07ddc2c20e0e91ef5 |
Recovered source transcript
Download complete source text ↓73 lines · 1.9 KB
Credential-bearing and unrelated personal details were removed from this reading copy. The source identity and original checksum remain recorded.
import { z } from 'zod'
// Common validation schemas - matching exactly what's in apps/web
export const subscribeSchema = z.object({
email: z.string().email('Invalid email address'),
groups: z.array(z.string()).optional()
})
export type SubscribeRequest = z.infer<typeof subscribeSchema>
// Common response format
export interface NewsletterSubscriber {
id: string | number
email: string
status: string
createdAt: string
updatedAt?: string
groups?: string[]
}
export interface SubscribeResponse {
success: boolean
message: string
subscriber?: NewsletterSubscriber
error?: string
}
// Provider configuration
export type NewsletterProvider = 'mailerlite' | 'kit' | 'substack'
export interface BaseProviderConfig {
provider: NewsletterProvider
apiKey?: string
logger?: {
debug: (message: string, options?: any) => void
warn: (message: string, options?: any) => void
error: (message: string, options?: any) => void
}
}
export interface MailerLiteConfig extends BaseProviderConfig {
provider: 'mailerlite'
apiKey: [credential removed]
// Optional: fallback groups if none provided in request
defaultGroupIds?: string[]
}
export interface KitConfig extends BaseProviderConfig {
provider: 'kit'
apiKey: [credential removed]
formId: string
// Optional: fallback tags if none provided in request
defaultTagIds?: number[]
}
export interface SubstackConfig extends BaseProviderConfig {
provider: 'substack'
publicationUrl: string
embedUrl?: string
}
export type ProviderConfig = MailerLiteConfig | KitConfig | SubstackConfig
// Provider interface
export interface NewsletterProviderInterface {
subscribe(data: SubscribeRequest): Promise<SubscribeResponse>
unsubscribe?(email: string): Promise<{ success: boolean; message: string }>
getSubscriber?(email: string): Promise<NewsletterSubscriber | null>
// For iframe-based providers like Substack
getEmbedUrl?(): string
isIframeOnly?(): boolean
}