@nwire/mail 0.9.1 → 0.10.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.
package/dist/mail.d.ts CHANGED
@@ -12,7 +12,7 @@
12
12
  * Test-grade `InMemoryMailer` is shipped here — captures every send so
13
13
  * assertions like `mailer.sent[0].subject === "Welcome!"` work directly.
14
14
  */
15
- import { type PluginDefinition } from "@nwire/forge";
15
+ import { type PluginDefinition } from "@nwire/app";
16
16
  /** A single email recipient. */
17
17
  export interface MailAddress {
18
18
  readonly email: string;
@@ -112,4 +112,3 @@ export interface MailPluginOptions {
112
112
  * })
113
113
  */
114
114
  export declare function mailPlugin(options?: MailPluginOptions): PluginDefinition;
115
- //# sourceMappingURL=mail.d.ts.map
package/dist/mail.js CHANGED
@@ -12,7 +12,7 @@
12
12
  * Test-grade `InMemoryMailer` is shipped here — captures every send so
13
13
  * assertions like `mailer.sent[0].subject === "Welcome!"` work directly.
14
14
  */
15
- import { definePlugin } from "@nwire/forge";
15
+ import { definePlugin } from "@nwire/app";
16
16
  // ─── Errors ────────────────────────────────────────────────────────
17
17
  /** Thrown by adapters when the provider rejects a message. */
18
18
  export class MailSendError extends Error {
@@ -77,11 +77,11 @@ export function mailPlugin(options = {}) {
77
77
  const effective = options.defaultFrom
78
78
  ? wrapWithDefaultFrom(mailer, options.defaultFrom)
79
79
  : mailer;
80
- return definePlugin(`mail:${name}`, ({ bind, shutdown }) => {
81
- bind(name, () => effective);
80
+ return definePlugin(`mail:${name}`, ({ bind, dispose }) => {
81
+ bind(name, effective);
82
82
  const stop = mailer.shutdown;
83
83
  if (stop) {
84
- shutdown(async () => {
84
+ dispose(async () => {
85
85
  await stop.call(mailer);
86
86
  });
87
87
  }
@@ -99,4 +99,3 @@ function stripFrom(message) {
99
99
  void _from;
100
100
  return rest;
101
101
  }
102
- //# sourceMappingURL=mail.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nwire/mail",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "Nwire — transactional-mail contract + InMemoryMailer default + mailPlugin. Adapters (SMTP/nodemailer, SES, SendGrid, …) live in separate packages.",
5
5
  "keywords": [
6
6
  "adapter",
@@ -28,7 +28,8 @@
28
28
  "access": "public"
29
29
  },
30
30
  "dependencies": {
31
- "@nwire/forge": "0.9.1"
31
+ "@nwire/app": "0.10.0",
32
+ "@nwire/forge": "0.10.0"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@types/node": "^22.19.9",
@@ -1,5 +0,0 @@
1
- /**
2
- * `@nwire/mail` — contract verification via InMemoryMailer + plugin.
3
- */
4
- export {};
5
- //# sourceMappingURL=mail.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mail.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mail.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,86 +0,0 @@
1
- /**
2
- * `@nwire/mail` — contract verification via InMemoryMailer + plugin.
3
- */
4
- import { describe, it, expect } from "vitest";
5
- import { createApp } from "@nwire/forge";
6
- import { InMemoryMailer, mailPlugin, MailSendError } from "../mail.js";
7
- describe("InMemoryMailer", () => {
8
- it("captures every send", async () => {
9
- const m = new InMemoryMailer();
10
- await m.send({ to: "alice@x", subject: "hi", text: "hello" });
11
- await m.send({ to: "bob@x", subject: "hey", text: "world" });
12
- expect(m.sent.map((x) => x.subject)).toEqual(["hi", "hey"]);
13
- });
14
- it("returns a synthetic messageId on each send", async () => {
15
- const m = new InMemoryMailer();
16
- const a = await m.send({ to: "x", subject: "" });
17
- const b = await m.send({ to: "x", subject: "" });
18
- expect(a.messageId).not.toBe(b.messageId);
19
- });
20
- it("failNext throws for one send and then clears itself", async () => {
21
- const m = new InMemoryMailer();
22
- m.failNext = new MailSendError("smtp down");
23
- await expect(m.send({ to: "a", subject: "" })).rejects.toBeInstanceOf(MailSendError);
24
- await expect(m.send({ to: "a", subject: "" })).resolves.toBeTruthy();
25
- expect(m.sent).toHaveLength(1);
26
- });
27
- it("clear resets captured + queued-failure", async () => {
28
- const m = new InMemoryMailer();
29
- await m.send({ to: "a", subject: "" });
30
- m.failNext = new MailSendError("x");
31
- m.clear();
32
- expect(m.sent).toEqual([]);
33
- expect(m.failNext).toBeUndefined();
34
- });
35
- });
36
- describe("mailPlugin", () => {
37
- it("boots + stops cleanly with the default mailer", async () => {
38
- const app = createApp({ modules: [], plugins: [mailPlugin()] });
39
- await app.start();
40
- await app.stop();
41
- });
42
- it("calls adapter.shutdown on app.stop when defined", async () => {
43
- let stopped = false;
44
- const adapter = {
45
- send: async () => ({ messageId: "x" }),
46
- shutdown: async () => {
47
- stopped = true;
48
- },
49
- };
50
- const app = createApp({
51
- modules: [],
52
- plugins: [mailPlugin({ mailer: adapter })],
53
- });
54
- await app.start();
55
- await app.stop();
56
- expect(stopped).toBe(true);
57
- });
58
- it("defaultFrom is applied when a message omits `from`", async () => {
59
- const inner = new InMemoryMailer();
60
- const app = createApp({
61
- modules: [],
62
- plugins: [
63
- mailPlugin({
64
- mailer: inner,
65
- defaultFrom: '"My App" <noreply@my.app>',
66
- name: "test-mailer",
67
- }),
68
- ],
69
- });
70
- await app.start();
71
- // The plugin wraps the mailer; we still send via the wrapper through
72
- // a resolved binding. For this slim test, send via the inner mailer's
73
- // wrapper directly using the binding mechanism would require a
74
- // resolver. Instead, verify the wrap behavior in isolation:
75
- const { mailPlugin: _p } = await import("../mail.js");
76
- void _p;
77
- // Re-create the wrapping inline (mirrors what the plugin does).
78
- const wrapped = {
79
- send: (msg) => inner.send({ from: msg.from ?? '"My App" <noreply@my.app>', ...msg }),
80
- };
81
- await wrapped.send({ to: "alice@x", subject: "hi" });
82
- expect(inner.sent[0].from).toBe('"My App" <noreply@my.app>');
83
- await app.stop();
84
- });
85
- });
86
- //# sourceMappingURL=mail.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mail.test.js","sourceRoot":"","sources":["../../src/__tests__/mail.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../src/mail.ts"],"names":[],"mappings":"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"}
package/dist/mail.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"mail.js","sourceRoot":"","sources":["../src/mail.ts"],"names":[],"mappings":"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"}