@mailerport/testing 0.1.0

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.
@@ -0,0 +1,6 @@
1
+ import type { MailMessage, MailTransport, DeliveryResult } from "@mailerport/core";
2
+ export class MemoryTransport implements MailTransport { kind:string; send(message:MailMessage):Promise<DeliveryResult> }
3
+ export class LocalTransport extends MemoryTransport {}
4
+ export function extractLinks(message:{html?:string;text?:string}):string[];
5
+ export interface TestInbox { deliver(message:MailMessage):MailMessage;list(filters?:Record<string,unknown>):MailMessage[];get(id:string):MailMessage|null;clear(filters?:Record<string,unknown>):void;waitFor(filters?:Record<string,unknown>&{timeoutMs?:number;intervalMs?:number}):Promise<MailMessage|null> }
6
+ export function createTestInbox():TestInbox;
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ const clone = (value) => structuredClone(value);
2
+ export class MemoryTransport { constructor() { this.kind="memory"; } async send() { return {status:"sent",transport:"memory"}; } }
3
+ export class LocalTransport extends MemoryTransport { constructor(){super();this.kind="local";} }
4
+ export function extractLinks({html="",text=""}={}) { return [...new Set(`${html} ${text}`.match(/https?:\/\/[^\s"'<>]+|\/(?:[A-Za-z0-9._~!$&'()*+,;=:@%-]+\/?)+/g)||[])]; }
5
+ export function createTestInbox() {
6
+ const messages=[];
7
+ const matches=(message,filters)=>Object.entries(filters).every(([key,value])=>key==="to"?message.to?.includes(value):key==="testRunId"?message.metadata?.testRunId===value:message[key]===value);
8
+ return { deliver(message){const item={...clone(message),links:message.links||extractLinks(message),sent_at:message.sent_at||new Date().toISOString()};messages.push(item);return clone(item);},
9
+ list(filters={}){return messages.filter((item)=>matches(item,filters)).map(clone);},get(id){const item=messages.find((value)=>value.message_id===id);return item?clone(item):null;},
10
+ clear(filters){for(let index=messages.length-1;index>=0;index-=1)if(!filters||matches(messages[index],filters))messages.splice(index,1);},
11
+ async waitFor({timeoutMs=5000,intervalMs=25,...filters}={}){const start=Date.now();while(Date.now()-start<timeoutMs){const item=messages.find((value)=>matches(value,filters));if(item)return clone(item);await new Promise((resolve)=>setTimeout(resolve,intervalMs));}return null;} };
12
+ }
package/package.json ADDED
@@ -0,0 +1 @@
1
+ {"name":"@mailerport/testing","version":"0.1.0","description":"Deterministic test inbox helpers for MailPort","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"types":"./dist/index.d.ts","files":["dist"],"scripts":{"build":"node ../../scripts/build-package.js testing","prepack":"npm run build"},"dependencies":{"@mailerport/core":"0.1.0"},"engines":{"node":">=20"},"license":"MIT","publishConfig":{"access":"public"}}