@owlmeans/mailer 0.1.18-rc.35 → 0.1.18-rc.36

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/README.md CHANGED
@@ -13,7 +13,7 @@ Provider-agnostic email dispatch interface for the OwlMeans framework — `Maile
13
13
  ## Installation
14
14
 
15
15
  ```bash
16
- bun add @owlmeans/mailer@^0.1.18-rc.35
16
+ bun add @owlmeans/mailer@^0.1.18-rc.36
17
17
  ```
18
18
 
19
19
  ## Usage
@@ -37,7 +37,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
37
37
  your project's skill store (`.agents/skills/`):
38
38
 
39
39
  ```sh
40
- npx @owlmeans/agent-skills@^0.1.18-rc.48
40
+ npx @owlmeans/agent-skills@^0.1.18-rc.49
41
41
  ```
42
42
 
43
43
  The embedded files are version-matched to this package release. Do not edit them
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@owlmeans/mailer",
4
- "version": "0.1.18-rc.35",
5
- "generatedAt": "2026-10-05T08:32:19.129Z",
4
+ "version": "0.1.18-rc.36",
5
+ "generatedAt": "2026-10-05T21:03:06.407Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -8,7 +8,7 @@ metadata:
8
8
 
9
9
  # Using `@owlmeans/mailer`
10
10
 
11
- **Install:** `"@owlmeans/mailer": "^0.1.18-rc.35"` in `dependencies`
11
+ **Install:** `"@owlmeans/mailer": "^0.1.18-rc.36"` in `dependencies`
12
12
 
13
13
  Provider-agnostic email dispatch service. It defines the `MailerService` interface and ships one
14
14
  transport of its own — the console/dev one. Real delivery is a separate package:
@@ -1,11 +1,8 @@
1
- import type { MailerService, MailMessage } from './types.js';
1
+ import type { ConsoleMailerService } from './types.js';
2
2
  /** Dev/test transport: logs the message to console and stores it for inspection. */
3
- export declare const makeConsoleMailerService: (alias?: string) => MailerService & {
4
- /** Messages captured since the service was created (use in tests). */
5
- captured: MailMessage[];
6
- };
3
+ export declare const makeConsoleMailerService: (alias?: string) => ConsoleMailerService;
7
4
  /** Alias of makeConsoleMailerService registered under the default MAILER_SERVICE alias.
8
5
  * Useful as a drop-in replacement during development and integration tests.
9
6
  */
10
- export declare const makeDefaultConsoleMailerService: () => ReturnType<typeof makeConsoleMailerService>;
7
+ export declare const makeDefaultConsoleMailerService: () => ConsoleMailerService;
11
8
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAM5D,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,sBAA6B,aAAa,GAAG;IAChF,sEAAsE;IACtE,QAAQ,EAAE,WAAW,EAAE,CAAA;CAmBxB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,+BAA+B,QAAO,UAAU,CAAC,OAAO,wBAAwB,CACnD,CAAA"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAA8B,MAAM,YAAY,CAAA;AAMlF,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,sBAA6B,oBAkBjE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,+BAA+B,QAAO,oBACT,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AAE5B,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,GAAG,cAAc,EAG7D,EAAE;IACF,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAElC,MAAM,OAAO,GAAG,aAAa,CAAgB,KAAK,EAAE;QAClD,IAAI,EAAE,KAAK,EAAE,OAAoB,EAAiB,EAAE;YAClD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACtB,4FAA4F;YAC5F,6FAA6F;YAC7F,uDAAuD;YACvD,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACtC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE;aACnF,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;QAC/B,CAAC;KACF,CAAgD,CAAA;IAEjD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC3B,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAgD,EAAE,CAC/F,wBAAwB,CAAC,cAAc,CAAC,CAAA"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AAE5B,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,GAAG,cAAc,EAAwB,EAAE;IACvF,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAElC,MAAM,OAAO,GAAG,aAAa,CAAgB,KAAK,EAAE;QAClD,IAAI,EAAE,KAAK,EAAE,OAAoB,EAAiB,EAAE;YAClD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACtB,4FAA4F;YAC5F,6FAA6F;YAC7F,uDAAuD;YACvD,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACtC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE;aACnF,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;QAC/B,CAAC;KACF,CAAyB,CAAA;IAE1B,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC3B,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAyB,EAAE,CACxE,wBAAwB,CAAC,cAAc,CAAC,CAAA"}
package/build/types.d.ts CHANGED
@@ -14,4 +14,9 @@ export interface MailMessage {
14
14
  export interface MailerService extends InitializedService {
15
15
  send: (message: MailMessage) => Promise<void>;
16
16
  }
17
+ /** The dev/test transport: delivers by logging, and keeps what it sent for inspection. */
18
+ export interface ConsoleMailerService extends MailerService {
19
+ /** Messages captured since the service was created (use in tests). */
20
+ captured: MailMessage[];
21
+ }
17
22
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,+CAA+C;AAC/C,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,+CAA+C;AAC/C,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9C;AAED,0FAA0F;AAC1F,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,sEAAsE;IACtE,QAAQ,EAAE,WAAW,EAAE,CAAA;CACxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/mailer",
3
- "version": "0.1.18-rc.35",
3
+ "version": "0.1.18-rc.36",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -22,9 +22,9 @@
22
22
  }
23
23
  },
24
24
  "dependencies": {
25
- "@owlmeans/context": "^0.1.18-rc.33",
26
- "@owlmeans/error": "^0.1.18-rc.37",
27
- "@owlmeans/log": "^0.1.18-rc.1"
25
+ "@owlmeans/context": "^0.1.18-rc.34",
26
+ "@owlmeans/error": "^0.1.18-rc.38",
27
+ "@owlmeans/log": "^0.1.18-rc.2"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@owlmeans/dep-config": "workspace:*",
package/src/service.ts CHANGED
@@ -1,15 +1,12 @@
1
1
  import { createService } from '@owlmeans/context'
2
- import type { MailerService, MailMessage } from './types.js'
2
+ import type { ConsoleMailerService, MailerService, MailMessage } from './types.js'
3
3
  import { MAILER_SERVICE, CONSOLE_MAILER } from './consts.js'
4
4
  import { logger } from '@owlmeans/log'
5
5
 
6
6
  const log = logger('mailer')
7
7
 
8
8
  /** Dev/test transport: logs the message to console and stores it for inspection. */
9
- export const makeConsoleMailerService = (alias = CONSOLE_MAILER): MailerService & {
10
- /** Messages captured since the service was created (use in tests). */
11
- captured: MailMessage[]
12
- } => {
9
+ export const makeConsoleMailerService = (alias = CONSOLE_MAILER): ConsoleMailerService => {
13
10
  const captured: MailMessage[] = []
14
11
 
15
12
  const service = createService<MailerService>(alias, {
@@ -23,7 +20,7 @@ export const makeConsoleMailerService = (alias = CONSOLE_MAILER): MailerService
23
20
  to: message.to, subject: message.subject, body: message.text ?? message.html ?? '',
24
21
  }, { event: 'mail.console' })
25
22
  },
26
- }) as MailerService & { captured: MailMessage[] }
23
+ }) as ConsoleMailerService
27
24
 
28
25
  service.captured = captured
29
26
  return service
@@ -32,5 +29,5 @@ export const makeConsoleMailerService = (alias = CONSOLE_MAILER): MailerService
32
29
  /** Alias of makeConsoleMailerService registered under the default MAILER_SERVICE alias.
33
30
  * Useful as a drop-in replacement during development and integration tests.
34
31
  */
35
- export const makeDefaultConsoleMailerService = (): ReturnType<typeof makeConsoleMailerService> =>
32
+ export const makeDefaultConsoleMailerService = (): ConsoleMailerService =>
36
33
  makeConsoleMailerService(MAILER_SERVICE)
package/src/types.ts CHANGED
@@ -16,3 +16,9 @@ export interface MailMessage {
16
16
  export interface MailerService extends InitializedService {
17
17
  send: (message: MailMessage) => Promise<void>
18
18
  }
19
+
20
+ /** The dev/test transport: delivers by logging, and keeps what it sent for inspection. */
21
+ export interface ConsoleMailerService extends MailerService {
22
+ /** Messages captured since the service was created (use in tests). */
23
+ captured: MailMessage[]
24
+ }
@@ -0,0 +1,53 @@
1
+ import { describe, expect, test } from 'bun:test'
2
+ import { AppType, makeBasicContext } from '@owlmeans/context'
3
+ import type { BasicConfig } from '@owlmeans/context'
4
+ import { CONSOLE_MAILER, MAILER_SERVICE, makeConsoleMailerService, makeDefaultConsoleMailerService } from '../src/index.js'
5
+ import type { MailerService } from '../src/index.js'
6
+
7
+ /** Registered and initialized the way an application does it, then looked up by alias. */
8
+ const booted = async (service: MailerService) => {
9
+ const ctx = makeBasicContext<BasicConfig>({ ready: false, service: 'mailer-tests', type: AppType.Backend })
10
+ ctx.registerService(service)
11
+ ctx.configure()
12
+ await ctx.init()
13
+
14
+ return ctx
15
+ }
16
+
17
+ describe('@owlmeans/mailer — console transport', () => {
18
+ test('is registered under its own alias unless told otherwise', () => {
19
+ expect(makeConsoleMailerService().alias).toBe(CONSOLE_MAILER)
20
+ expect(makeConsoleMailerService('outbox').alias).toBe('outbox')
21
+ })
22
+
23
+ test('the default variant answers the alias every consumer looks the mailer up by', async () => {
24
+ const mailer = makeDefaultConsoleMailerService()
25
+ const ctx = await booted(mailer)
26
+
27
+ expect(ctx.service<MailerService>(MAILER_SERVICE)).toBe(mailer)
28
+ })
29
+
30
+ test('captures every message as sent, in order, without touching it', async () => {
31
+ const mailer = makeConsoleMailerService()
32
+ await booted(mailer)
33
+ const first = { to: 'a@example.com', subject: 'Code', text: '123456' }
34
+ const second = {
35
+ to: 'b@example.com', subject: 'Report', html: '<b>done</b>', from: 'Ops <ops@example.com>',
36
+ replyTo: 'help@example.com', headers: { 'X-Run': '7' },
37
+ }
38
+
39
+ await mailer.send(first)
40
+ await mailer.send(second)
41
+
42
+ expect(mailer.captured).toEqual([first, second])
43
+ })
44
+
45
+ test('each instance keeps its own outbox', async () => {
46
+ const one = makeConsoleMailerService('one')
47
+ const two = makeConsoleMailerService('two')
48
+ await one.send({ to: 'a@example.com', subject: 'only one' })
49
+
50
+ expect(one.captured).toHaveLength(1)
51
+ expect(two.captured).toHaveLength(0)
52
+ })
53
+ })