statocysts 0.9.0 → 0.9.1
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 +48 -1
- package/dist/browser.d.ts +3 -2
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +3 -2
- package/dist/browser.js.map +1 -0
- package/dist/{index-DcoOHy7e.d.ts → index-DoeDzTxL.d.ts} +3 -2
- package/dist/index-DoeDzTxL.d.ts.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -0
- package/dist/{json-DAUitIVf.js → json-BoTI0Hde.js} +8 -4
- package/dist/json-BoTI0Hde.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,3 +1,50 @@
|
|
|
1
1
|
# Statocysts
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A modern notification library for JavaScript. As the sensory organ for your infrastructure.
|
|
4
|
+
|
|
5
|
+
Highly inspired by [shoutrrr](https://github.com/containrrr/shoutrrr) and [apprise](https://github.com/caronc/apprise).
|
|
6
|
+
|
|
7
|
+
[](https://npmjs.com/statocysts)
|
|
8
|
+

|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
### using npm
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install statocysts
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### ussing CLI
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g @statocysts/cli
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
### As a package
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { send } from 'statocysts'
|
|
31
|
+
|
|
32
|
+
await send('slack://webhook/xxx/yyy/zzz', 'Hello World')
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { createSender } from 'statocysts'
|
|
37
|
+
|
|
38
|
+
const sender = createSender([
|
|
39
|
+
'slack://webhook/xxx/yyy/zzz',
|
|
40
|
+
'json://example.com/api/endpoint',
|
|
41
|
+
])
|
|
42
|
+
|
|
43
|
+
sender.send('Hello World')
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Using CLI
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
stato -u "slack://webhook/xxx/yyy/zzz" -m "Hello World"
|
|
50
|
+
```
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as defineTransport, a as discord, c as Sender, d as buildSenderRegistry, f as DefineProviderContext, g as Transport, h as defineProvider, i as slack, l as SenderRegistry, m as ServiceProvider, n as bark, o as HttpPayload, p as DefineProviderOptions, r as telegram, s as http, t as json, u as SenderUrl } from "./index-
|
|
1
|
+
import { _ as defineTransport, a as discord, c as Sender, d as buildSenderRegistry, f as DefineProviderContext, g as Transport, h as defineProvider, i as slack, l as SenderRegistry, m as ServiceProvider, n as bark, o as HttpPayload, p as DefineProviderOptions, r as telegram, s as http, t as json, u as SenderUrl } from "./index-DoeDzTxL.js";
|
|
2
2
|
|
|
3
3
|
//#region src/browser.d.ts
|
|
4
4
|
|
|
@@ -6,4 +6,5 @@ declare const senderRegistry: SenderRegistry;
|
|
|
6
6
|
declare function createSender(urls: SenderUrl[]): Sender;
|
|
7
7
|
declare function send(url: string | URL, title: string, body?: string): Promise<void>;
|
|
8
8
|
//#endregion
|
|
9
|
-
export { DefineProviderContext, DefineProviderOptions, HttpPayload, Sender, SenderRegistry, SenderUrl, ServiceProvider, Transport, bark, buildSenderRegistry, createSender, defineProvider, defineTransport, discord, http, json, send, senderRegistry, slack, telegram };
|
|
9
|
+
export { DefineProviderContext, DefineProviderOptions, HttpPayload, Sender, SenderRegistry, SenderUrl, ServiceProvider, Transport, bark, buildSenderRegistry, createSender, defineProvider, defineTransport, discord, http, json, send, senderRegistry, slack, telegram };
|
|
10
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","names":[],"sources":["../src/browser.ts"],"sourcesContent":[],"mappings":";;;;cAUa,gBAA4E;iBAEzE,YAAA,OAAmB,cAAc;iBAI3B,IAAA,eACN,oCAGb"}
|
package/dist/browser.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as slack, c as defineTransport, i as telegram, l as defineProvider, n as bark, o as discord, r as buildSenderRegistry, s as http, t as json, u as assert } from "./json-
|
|
1
|
+
import { a as slack, c as defineTransport, i as telegram, l as defineProvider, n as bark, o as discord, r as buildSenderRegistry, s as http, t as json, u as assert } from "./json-BoTI0Hde.js";
|
|
2
2
|
|
|
3
3
|
//#region src/browser.ts
|
|
4
4
|
const senderRegistry = buildSenderRegistry([
|
|
@@ -23,4 +23,5 @@ async function send(url, title, body) {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
//#endregion
|
|
26
|
-
export { bark, buildSenderRegistry, createSender, defineProvider, defineTransport, discord, http, json, send, senderRegistry, slack, telegram };
|
|
26
|
+
export { bark, buildSenderRegistry, createSender, defineProvider, defineTransport, discord, http, json, send, senderRegistry, slack, telegram };
|
|
27
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","names":[],"sources":["../src/browser.ts"],"sourcesContent":["import type { Sender, SenderUrl } from '#/shared'\nimport { discord } from '#/services/chat/discord'\nimport { slack } from '#/services/chat/slack'\nimport { telegram } from '#/services/chat/telegram'\nimport { bark } from '#/services/push/bark'\nimport { json } from '#/services/specialized/json'\nimport { buildSenderRegistry } from '#/shared'\n\nimport { assert } from '#/utils'\n\nexport const senderRegistry = buildSenderRegistry([bark, json, slack, telegram, discord])\n\nexport function createSender(urls: SenderUrl[]): Sender {\n return senderRegistry(urls)\n}\n\nexport async function send(\n url: string | URL,\n title: string,\n body?: string,\n): Promise<void> {\n const _url = typeof url === 'string' ? new URL(url) : url\n const provider = senderRegistry.resolveProvider(_url)\n assert(provider, `Unsupported protocol ${_url.protocol}`)\n const messageObj = { title, body }\n await provider.send(_url.toString(), messageObj)\n}\n\nexport { bark, discord, json, slack, telegram }\nexport * from './shared'\n"],"mappings":";;;AAUA,MAAa,iBAAiB,oBAAoB;CAAC;CAAM;CAAM;CAAO;CAAU;CAAQ,CAAC;AAEzF,SAAgB,aAAa,MAA2B;AACtD,QAAO,eAAe,KAAK;;AAG7B,eAAsB,KACpB,KACA,OACA,MACe;CACf,MAAM,OAAO,OAAO,QAAQ,WAAW,IAAI,IAAI,IAAI,GAAG;CACtD,MAAM,WAAW,eAAe,gBAAgB,KAAK;AACrD,QAAO,UAAU,wBAAwB,KAAK,WAAW;CACzD,MAAM,aAAa;EAAE;EAAO;EAAM;AAClC,OAAM,SAAS,KAAK,KAAK,UAAU,EAAE,WAAW"}
|
|
@@ -43,7 +43,7 @@ declare function defineProvider<const Protocol extends string, T extends Transpo
|
|
|
43
43
|
//#endregion
|
|
44
44
|
//#region src/core/sender.d.ts
|
|
45
45
|
interface Sender {
|
|
46
|
-
send: (
|
|
46
|
+
send: (title: string, body?: string) => Promise<void>;
|
|
47
47
|
}
|
|
48
48
|
type SenderUrl = string | URL;
|
|
49
49
|
interface SenderRegistry {
|
|
@@ -117,4 +117,5 @@ declare const bark: ServiceProvider<"bark:", HttpPayload, BarkOptions>;
|
|
|
117
117
|
//#region src/services/specialized/json/index.d.ts
|
|
118
118
|
declare const json: ServiceProvider<"json:", HttpPayload, FetchOptions<ofetch0.ResponseType, any>>;
|
|
119
119
|
//#endregion
|
|
120
|
-
export { defineTransport as _, discord as a, Sender as c, buildSenderRegistry as d, DefineProviderContext as f, Transport as g, defineProvider as h, slack as i, SenderRegistry as l, ServiceProvider as m, bark as n, HttpPayload as o, DefineProviderOptions as p, telegram as r, http as s, json as t, SenderUrl as u };
|
|
120
|
+
export { defineTransport as _, discord as a, Sender as c, buildSenderRegistry as d, DefineProviderContext as f, Transport as g, defineProvider as h, slack as i, SenderRegistry as l, ServiceProvider as m, bark as n, HttpPayload as o, DefineProviderOptions as p, telegram as r, http as s, json as t, SenderUrl as u };
|
|
121
|
+
//# sourceMappingURL=index-DoeDzTxL.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DoeDzTxL.d.ts","names":[],"sources":["../src/core/transport.ts","../src/core/provider.ts","../src/core/sender.ts","../src/core/transports/http.ts","../src/services/chat/discord/index.ts","../src/services/chat/slack/index.ts","../src/services/chat/telegram/index.ts","../src/services/push/bark/index.ts","../src/services/specialized/json/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAIiB;EAAA;AAQjB;;;EAEa,IAAA,EAAA,CAAA,OAAA,EALK,OAKL,EAAA,GALiB,OAKjB,CAAA,IAAA,CAAA;;AAAD,iBAFI,eAEJ,CAAA,OAAA,CAAA,CAAA,SAAA,EADC,SACD,CADW,OACX,CAAA,CAAA,EAAT,SAAS,CAAC,OAAD,CAAA;;;KCTP,2BAA2B,UAAU;UAEzB;uBAKM,UAAU;qBACZ;EDTJ,cAAS,ECUR,ODVQ,GAAA,SAKR;EAGF,IAAA,EAAA,CAAA,GAAA,EAAA,MAAe,EAAA,OAAA,EAAA;IACR,KAAA,EAAA,MAAA;IAAV,IAAA,CAAA,EAAA,MAAA;EACA,CAAA,EAAA,OAAA,CAAA,ECC8D,ODD9D,EAAA,GCC0E,ODD1E,CAAA,IAAA,CAAA;;AAAD,UCIK,qBAAA,CDJL;OCKL;;;IAdF,IAAA,CAAA,EAAA,MAAA;EAEY,CAAA;;AAKM,UAWN,qBAXM,CAAA,UAW0B,SAX1B,EAAA,OAAA,CAAA,CAAA;EACF,cAAA,CAAA,EAWF,OAXE;EACH,SAAA,EAWL,CAXK;EACyD,OAAA,EAAA,CAAA,IAAA,EAYjE,qBAZiE,EAAA,GAAA,EAalE,qBAbkE,EAAA,OAAA,EAc9D,OAd8D,EAAA,GAepE,OAfoE,CAe5D,qBAf4D,CAetC,CAfsC,CAAA,CAAA;;AAAmB,iBAkB9E,cAlB8E,CAAA,uBAAA,MAAA,EAAA,UAkBtB,SAlBsB,CAAA,GAAA,CAAA,EAAA,UAAA,IAAA,CAAA,CAAA,QAAA,EAmBlF,QAnBkF,EAAA,aAAA,EAoB7E,qBApB6E,CAoBvD,CApBuD,EAoBpD,OApBoD,CAAA,CAAA,EAqB3F,eArB2F,CAqB3E,QArB2E,EAqBjE,qBArBiE,CAqB3C,CArB2C,CAAA,EAqBvC,OArBuC,CAAA;;;UCb7E,MAAA;0CACyB;;KAG9B,SAAA,YAAqB;AFFhB,UEIA,cAAA,CFJS;EAQV,CAAA,IAAA,EEHP,SFGO,EAAe,CAAA,EEHR,MFGQ;EACR,eAAA,EAAA,CAAA,GAAA,EAAA,MAAA,GEHW,GFGX,EAAA,GEHmB,eFGnB,CAAA,MAAA,EAAA,GAAA,EAAA,GAAA,CAAA,GAAA,SAAA;;AACV,iBEDG,mBAAA,CFCH,SAAA,EEAA,eFAA,CAAA,MAAA,EAAA,GAAA,EAAA,GAAA,CAAA,EAAA,CAAA,EECV,cFDU;;;;;;UGPI,WAAA;EHHA,OAAA,EGIN,OHJe;EAQV,YAAA,CAAA,EGHC,YHGc;;;;;;cGIlB,MAAI,UAAA;;;UCTP,cAAA;iBACO;;cAeJ,SAAO,4BA2ClB,WAAA,EA3CkB;;;UCjBH,YAAA;;;;ALFjB;AAQA;EACuB,WAAA,CAAA,EAAA,MAAA;EAAV;;;;;;;ACb+B;AAO5C;;;EAMqB,IAAA,CAAA,EIYZ,MJZY,CAAA,MAAA,EAAA,GAAA,CAAA;EACH,YAAA,CAAA,EIaD,YJbC;;AACqE,cIe1E,KJf0E,EIerE,eJfqE,CAAA,QAAA,EIqGrF,WAAA,EAtFgB,YJfqE,CAAA;;;ADD1E,UMHI,eAAA,CNGJ;EAAV;;;;;ECTE,UAAA,CAAA,EAAA,MAAA;EAEY,YAAA,CAAA,EKYA,YLZe;;AAKT,cKUV,QLVU,EKUF,eLVE,CAAA,WAAA,EK0GrB,WAAA,EAhGmB,eLVE,CAAA;;;UMLN,WAAA;iBACA;;cAoBJ,MAAI,yBAyCf,WAAA,EAzCe;;;cCvBJ,MAAI,yBAmDf,WAAA,EAnDe,aAAA,OAAA,CAAA,YAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as defineTransport, a as discord, c as Sender, d as buildSenderRegistry, f as DefineProviderContext, g as Transport, h as defineProvider, i as slack, l as SenderRegistry, m as ServiceProvider, n as bark, o as HttpPayload, p as DefineProviderOptions, r as telegram, s as http, t as json, u as SenderUrl } from "./index-
|
|
1
|
+
import { _ as defineTransport, a as discord, c as Sender, d as buildSenderRegistry, f as DefineProviderContext, g as Transport, h as defineProvider, i as slack, l as SenderRegistry, m as ServiceProvider, n as bark, o as HttpPayload, p as DefineProviderOptions, r as telegram, s as http, t as json, u as SenderUrl } from "./index-DoeDzTxL.js";
|
|
2
2
|
import { Message, MessageHeaders, SMTPConnectionOptions } from "emailjs";
|
|
3
3
|
|
|
4
4
|
//#region src/core/transports/smtp.d.ts
|
|
@@ -28,4 +28,5 @@ declare const senderRegistry: SenderRegistry;
|
|
|
28
28
|
declare function createSender(urls: SenderUrl[]): Sender;
|
|
29
29
|
declare function send(url: string | URL, title: string, body?: string): Promise<void>;
|
|
30
30
|
//#endregion
|
|
31
|
-
export { DefineProviderContext, DefineProviderOptions, HttpPayload, Sender, SenderRegistry, SenderUrl, ServiceProvider, Transport, bark, buildSenderRegistry, createSender, defineProvider, defineTransport, discord, email, http, json, send, senderRegistry, slack, telegram };
|
|
31
|
+
export { DefineProviderContext, DefineProviderOptions, HttpPayload, Sender, SenderRegistry, SenderUrl, ServiceProvider, Transport, bark, buildSenderRegistry, createSender, defineProvider, defineTransport, discord, email, http, json, send, senderRegistry, slack, telegram };
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/core/transports/smtp.ts","../src/services/specialized/email/index.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;;;AAOiB,UAAA,WAAA,CAAW;EAIV;;;EAIG,MAAA,EAJX,OAIW,CAJH,qBAIG,CAAA;EAAc;;;WAAxB,UAAU;ACRrB;;;UAAiB,YAAA;;EDAA,UAAA,CAAA,ECIF,ODJa,CCIL,qBDJK,CAAA;;AAIlB,cCWG,KDXH,ECWQ,eDXR,CAAA,QAAA,ECWQ,WDXR,ECWQ,YDXR,CAAA;;;AAIC,cEJE,cFIF,EEJqF,cFIrF;AAAU,iBEFL,YAAA,CFEK,IAAA,EEFc,SFEd,EAAA,CAAA,EEF4B,MFE5B;AAAc,iBEEb,IAAA,CFFa,GAAA,EAAA,MAAA,GEGnB,GFHmB,EAAA,KAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EEMhC,OFNgC,CAAA,IAAA,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as slack, c as defineTransport, i as telegram, l as defineProvider, n as bark, o as discord, r as buildSenderRegistry, s as http, t as json, u as assert } from "./json-
|
|
1
|
+
import { a as slack, c as defineTransport, i as telegram, l as defineProvider, n as bark, o as discord, r as buildSenderRegistry, s as http, t as json, u as assert } from "./json-BoTI0Hde.js";
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { SMTPClient } from "emailjs";
|
|
4
4
|
|
|
@@ -98,4 +98,5 @@ async function send(url, title, body) {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
//#endregion
|
|
101
|
-
export { bark, buildSenderRegistry, createSender, defineProvider, defineTransport, discord, email, http, json, send, senderRegistry, slack, telegram };
|
|
101
|
+
export { bark, buildSenderRegistry, createSender, defineProvider, defineTransport, discord, email, http, json, send, senderRegistry, slack, telegram };
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/core/transports/smtp.ts","../src/services/specialized/email/index.ts","../src/index.ts"],"sourcesContent":["import type { Message, MessageHeaders, SMTPConnectionOptions } from 'emailjs'\nimport { SMTPClient } from 'emailjs'\nimport { defineTransport } from '../transport'\n\n/**\n * SMTP payload for SMTP transport\n */\nexport interface SmtpPayload {\n /**\n * SMTP client configuration\n */\n client: Partial<SMTPConnectionOptions>\n /**\n * Email message to send\n */\n message: Message | MessageHeaders\n}\n\n/**\n * SMTP transport implementation\n * Handles sending emails over SMTP protocol using emailjs\n */\nexport const smtp = defineTransport({\n async send(payload: SmtpPayload) {\n const client = new SMTPClient(payload.client)\n await client.sendAsync(payload.message)\n },\n})\n","import type { SmtpPayload } from '#/core/transports/smtp'\nimport type { SMTPConnectionOptions } from 'emailjs'\nimport { defineProvider } from '#/core/provider'\nimport { smtp } from '#/core/transports/smtp'\nimport { assert } from '#/utils'\nimport z from 'zod'\n\nexport interface EmailOptions {\n // Optional default sender email address\n defaultFrom?: string\n // Optional default SMTP configuration\n smtpConfig?: Partial<SMTPConnectionOptions>\n}\n\n// Zod schema for validating single-value query parameters\nconst queryParamSchema = z.object({\n from: z.string().email().optional(),\n subject: z.string().optional(),\n ssl: z.string().transform(val => val === 'true').optional(),\n tls: z.string().transform(val => val !== 'false').optional(),\n})\n\nexport const email = defineProvider('email:', {\n transport: smtp,\n defaultOptions: {} as EmailOptions,\n async prepare(ctx, options) {\n const { url, message } = ctx\n\n // Parse query parameters (use getAll for multi-value parameters)\n const to = url.searchParams.getAll('to')\n const cc = url.searchParams.getAll('cc')\n const bcc = url.searchParams.getAll('bcc')\n\n // Parse single-value parameters\n const from = url.searchParams.get('from')\n const subject = url.searchParams.get('subject')\n const sslParam = url.searchParams.get('ssl')\n const tlsParam = url.searchParams.get('tls')\n\n // Validate single-value parameters\n const queryResult = queryParamSchema.safeParse({\n from: from || undefined,\n subject: subject || undefined,\n ssl: sslParam || undefined,\n tls: tlsParam || undefined,\n })\n\n if (!queryResult.success) {\n throw new Error(`Invalid email query parameters: ${queryResult.error.message}`)\n }\n\n const query = queryResult.data\n\n // Build SMTP client configuration\n const host = url.hostname\n assert(host, 'SMTP host is required')\n\n const port = url.port ? Number.parseInt(url.port, 10) : 587\n const user = decodeURIComponent(url.username || '')\n const password = decodeURIComponent(url.password || '')\n\n // Determine sender address\n const fromAddress = query.from || options.defaultFrom || user\n assert(fromAddress, 'Sender email address (from) is required')\n\n // Ensure at least one recipient is provided\n assert(to.length > 0, 'At least one recipient email address (to) is required')\n\n // Build email message\n const emailSubject = query.subject || message.title\n const text = message.body\n ? `${message.title}\\n\\n${message.body}`\n : message.title\n\n // Build SMTP payload\n const smtpPayload: SmtpPayload = {\n client: {\n host,\n port,\n // Only include auth if both user and password are provided\n ...(user && password ? { user, password } : {}),\n ssl: query.ssl ?? false,\n tls: query.tls ?? (port === 587),\n ...options.smtpConfig,\n },\n message: {\n from: fromAddress,\n to: to.join(', '), // emailjs accepts comma-separated string\n cc: cc.length > 0 ? cc.join(', ') : undefined,\n bcc: bcc.length > 0 ? bcc.join(', ') : undefined,\n subject: emailSubject,\n text,\n },\n }\n\n return smtpPayload\n },\n})\n","import type { Sender, SenderUrl } from '#/shared'\nimport { discord } from '#/services/chat/discord'\nimport { slack } from '#/services/chat/slack'\nimport { telegram } from '#/services/chat/telegram'\nimport { bark } from '#/services/push/bark'\nimport { email } from '#/services/specialized/email'\nimport { json } from '#/services/specialized/json'\nimport { buildSenderRegistry } from '#/shared'\n\nimport { assert } from '#/utils'\n\nexport const senderRegistry = buildSenderRegistry([bark, email, json, slack, telegram, discord])\n\nexport function createSender(urls: SenderUrl[]): Sender {\n return senderRegistry(urls)\n}\n\nexport async function send(\n url: string | URL,\n title: string,\n body?: string,\n): Promise<void> {\n const _url = typeof url === 'string' ? new URL(url) : url\n const provider = senderRegistry.resolveProvider(_url)\n assert(provider, `Unsupported protocol ${_url.protocol}`)\n const messageObj = { title, body }\n await provider.send(_url.toString(), messageObj)\n}\n\nexport { bark, discord, email, json, slack, telegram }\nexport * from './shared'\n"],"mappings":";;;;;;;;;AAsBA,MAAa,OAAO,gBAAgB,EAClC,MAAM,KAAK,SAAsB;AAE/B,OADe,IAAI,WAAW,QAAQ,OAAO,CAChC,UAAU,QAAQ,QAAQ;GAE1C,CAAC;;;;ACZF,MAAM,mBAAmB,EAAE,OAAO;CAChC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU;CACnC,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,KAAK,EAAE,QAAQ,CAAC,WAAU,QAAO,QAAQ,OAAO,CAAC,UAAU;CAC3D,KAAK,EAAE,QAAQ,CAAC,WAAU,QAAO,QAAQ,QAAQ,CAAC,UAAU;CAC7D,CAAC;AAEF,MAAa,QAAQ,eAAe,UAAU;CAC5C,WAAW;CACX,gBAAgB,EAAE;CAClB,MAAM,QAAQ,KAAK,SAAS;EAC1B,MAAM,EAAE,KAAK,YAAY;EAGzB,MAAM,KAAK,IAAI,aAAa,OAAO,KAAK;EACxC,MAAM,KAAK,IAAI,aAAa,OAAO,KAAK;EACxC,MAAM,MAAM,IAAI,aAAa,OAAO,MAAM;EAG1C,MAAM,OAAO,IAAI,aAAa,IAAI,OAAO;EACzC,MAAM,UAAU,IAAI,aAAa,IAAI,UAAU;EAC/C,MAAM,WAAW,IAAI,aAAa,IAAI,MAAM;EAC5C,MAAM,WAAW,IAAI,aAAa,IAAI,MAAM;EAG5C,MAAM,cAAc,iBAAiB,UAAU;GAC7C,MAAM,QAAQ;GACd,SAAS,WAAW;GACpB,KAAK,YAAY;GACjB,KAAK,YAAY;GAClB,CAAC;AAEF,MAAI,CAAC,YAAY,QACf,OAAM,IAAI,MAAM,mCAAmC,YAAY,MAAM,UAAU;EAGjF,MAAM,QAAQ,YAAY;EAG1B,MAAM,OAAO,IAAI;AACjB,SAAO,MAAM,wBAAwB;EAErC,MAAM,OAAO,IAAI,OAAO,OAAO,SAAS,IAAI,MAAM,GAAG,GAAG;EACxD,MAAM,OAAO,mBAAmB,IAAI,YAAY,GAAG;EACnD,MAAM,WAAW,mBAAmB,IAAI,YAAY,GAAG;EAGvD,MAAM,cAAc,MAAM,QAAQ,QAAQ,eAAe;AACzD,SAAO,aAAa,0CAA0C;AAG9D,SAAO,GAAG,SAAS,GAAG,wDAAwD;EAG9E,MAAM,eAAe,MAAM,WAAW,QAAQ;EAC9C,MAAM,OAAO,QAAQ,OACjB,GAAG,QAAQ,MAAM,MAAM,QAAQ,SAC/B,QAAQ;AAuBZ,SApBiC;GAC/B,QAAQ;IACN;IACA;IAEA,GAAI,QAAQ,WAAW;KAAE;KAAM;KAAU,GAAG,EAAE;IAC9C,KAAK,MAAM,OAAO;IAClB,KAAK,MAAM,OAAQ,SAAS;IAC5B,GAAG,QAAQ;IACZ;GACD,SAAS;IACP,MAAM;IACN,IAAI,GAAG,KAAK,KAAK;IACjB,IAAI,GAAG,SAAS,IAAI,GAAG,KAAK,KAAK,GAAG;IACpC,KAAK,IAAI,SAAS,IAAI,IAAI,KAAK,KAAK,GAAG;IACvC,SAAS;IACT;IACD;GACF;;CAIJ,CAAC;;;;ACtFF,MAAa,iBAAiB,oBAAoB;CAAC;CAAM;CAAO;CAAM;CAAO;CAAU;CAAQ,CAAC;AAEhG,SAAgB,aAAa,MAA2B;AACtD,QAAO,eAAe,KAAK;;AAG7B,eAAsB,KACpB,KACA,OACA,MACe;CACf,MAAM,OAAO,OAAO,QAAQ,WAAW,IAAI,IAAI,IAAI,GAAG;CACtD,MAAM,WAAW,eAAe,gBAAgB,KAAK;AACrD,QAAO,UAAU,wBAAwB,KAAK,WAAW;CACzD,MAAM,aAAa;EAAE;EAAO;EAAM;AAClC,OAAM,SAAS,KAAK,KAAK,UAAU,EAAE,WAAW"}
|
|
@@ -240,10 +240,13 @@ function buildSenderRegistry(providers) {
|
|
|
240
240
|
url
|
|
241
241
|
};
|
|
242
242
|
}).filter((p) => !!p);
|
|
243
|
-
return { async send(
|
|
243
|
+
return { async send(title, body) {
|
|
244
244
|
for (const registry of registries) {
|
|
245
|
-
const messageObj = {
|
|
246
|
-
|
|
245
|
+
const messageObj = {
|
|
246
|
+
title,
|
|
247
|
+
body
|
|
248
|
+
};
|
|
249
|
+
await registry.provider.send(registry.url.toString(), messageObj);
|
|
247
250
|
}
|
|
248
251
|
} };
|
|
249
252
|
}
|
|
@@ -338,4 +341,5 @@ const json = defineProvider("json:", {
|
|
|
338
341
|
});
|
|
339
342
|
|
|
340
343
|
//#endregion
|
|
341
|
-
export { slack as a, defineTransport as c, telegram as i, defineProvider as l, bark as n, discord as o, buildSenderRegistry as r, http as s, json as t, assert as u };
|
|
344
|
+
export { slack as a, defineTransport as c, telegram as i, defineProvider as l, bark as n, discord as o, buildSenderRegistry as r, http as s, json as t, assert as u };
|
|
345
|
+
//# sourceMappingURL=json-BoTI0Hde.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-BoTI0Hde.js","names":["send: ServiceProvider<Protocol, InferTransportPayload<T>, Options>['send']","ctx: DefineProviderContext","querySchema","requestUrl: URL","body: Record<string, any>","text: string","titleFormatted: string","body: Record<string, any>","contentData: { body: string, title?: string }","body: Record<string, string>"],"sources":["../src/utils/assert.ts","../src/utils/markdown.ts","../src/utils/url.ts","../src/core/provider.ts","../src/core/transport.ts","../src/core/transports/http.ts","../src/services/chat/discord/index.ts","../src/services/chat/slack/index.ts","../src/services/chat/telegram/index.ts","../src/core/sender.ts","../src/services/push/bark/index.ts","../src/services/specialized/json/index.ts"],"sourcesContent":["export function assert(condition: any, message: string | Error): asserts condition {\n if (!condition) {\n throw typeof message === 'string' ? new Error(message) : message\n }\n}\n","/**\n * Escape special characters: _*[]()~`>#+-=|{}.!\n */\nexport function escapeMarkdown(text: string): string {\n return text.replace(/([_*[\\]()~`>#+\\-=|{}.!])/g, '\\\\$1')\n}\n","import { getQuery } from 'ufo'\n\nexport function getValidateQuery<T>(\n url: URL | string,\n parser: (params: unknown) => T,\n): T {\n const query = getQuery(url.toString())\n return parser(query)\n}\n\nexport function withoutPathname(input: string): string {\n const _url = new URL(input)\n _url.pathname = ''\n return _url.toString()\n}\n","import type { Transport } from './transport'\nimport { assert } from '#/utils'\nimport defu from 'defu'\n\n// Utility type to infer Payload from Transport\ntype InferTransportPayload<T> = T extends Transport<infer P> ? P : never\n\nexport interface ServiceProvider<\n Protocol extends string,\n Payload,\n Options = void,\n> {\n readonly $transport: Transport<Payload>\n readonly protocol: Protocol\n defaultOptions: Options | undefined\n send: (url: string, message: { title: string, body?: string }, options?: Options) => Promise<void>\n}\n\nexport interface DefineProviderContext {\n url: URL\n message: { title: string, body?: string }\n}\n\nexport interface DefineProviderOptions<T extends Transport, Options> {\n defaultOptions?: Options\n transport: T\n prepare: (\n this: DefineProviderContext,\n ctx: DefineProviderContext,\n options: Options,\n ) => Promise<InferTransportPayload<T>>\n}\n\nexport function defineProvider<const Protocol extends string, T extends Transport<any>, Options = void>(\n protocol: Protocol,\n createOptions: DefineProviderOptions<T, Options>,\n): ServiceProvider<Protocol, InferTransportPayload<T>, Options> {\n const send: ServiceProvider<Protocol, InferTransportPayload<T>, Options>['send'] = async (\n protocolUrl,\n message,\n options,\n ): Promise<void> => {\n const url = new URL(protocolUrl)\n\n assert(url.protocol === protocol, `Unexpected protocol \"${url.protocol}\"`)\n\n const ctx: DefineProviderContext = {\n url,\n message,\n }\n\n const opts = defu(options ?? {}, createOptions.defaultOptions ?? {}) as Options\n\n const payload = await createOptions.prepare.call(ctx, ctx, opts)\n\n await createOptions.transport.send(payload)\n }\n return {\n get protocol() {\n return protocol\n },\n get defaultOptions() {\n return createOptions.defaultOptions\n },\n get $transport() {\n return createOptions.transport\n },\n send,\n }\n}\n","/**\n * Transport interface for protocol-specific network communication\n * Each transport handles the actual sending of data over a specific protocol\n */\nexport interface Transport<Payload = unknown> {\n /**\n * Send data using the transport's protocol\n * @param payload Protocol-specific payload to send\n */\n send: (payload: Payload) => Promise<void>\n}\n\nexport function defineTransport<Payload>(\n transport: Transport<Payload>,\n): Transport<Payload> {\n return transport\n}\n","import type { FetchOptions } from 'ofetch'\nimport { ofetch } from 'ofetch'\nimport { defineTransport } from '../transport'\n\n/**\n * HTTP payload for HTTP transport\n */\nexport interface HttpPayload {\n request: Request\n fetchOptions?: FetchOptions\n}\n\n/**\n * HTTP transport implementation\n * Handles sending data over HTTP/HTTPS protocols\n */\nexport const http = defineTransport({\n async send(payload: HttpPayload) {\n await ofetch(payload.request, payload.fetchOptions)\n },\n})\n","import type { FetchOptions } from 'ofetch'\nimport { defineProvider } from '#/core/provider'\nimport { http } from '#/core/transports/http'\nimport { assert, getValidateQuery } from '#/utils'\nimport defu from 'defu'\nimport z from 'zod'\n\ninterface DiscordOptions {\n fetchOptions?: FetchOptions\n}\n\nconst querySchema = z.object({\n avatar_url: z.string().optional(),\n username: z.string().optional(),\n\n wait: z.string().transform((val) => {\n if (val === 'false' || val === '0' || val === '') {\n return false\n }\n return true\n }).optional(),\n})\n\nexport const discord = defineProvider('discord:', {\n transport: http,\n defaultOptions: {} as DiscordOptions,\n async prepare(ctx, options) {\n const { url } = ctx\n\n assert(url.hostname === 'webhook', 'Invalid discord URL')\n assert(url.username, 'Webhook ID is required')\n assert(url.password, 'Webhook token is required')\n\n const queryResult = getValidateQuery(url, querySchema.safeParse)\n\n if (!queryResult.success) {\n throw new Error('Invalid discord query')\n }\n\n const { wait, ...query } = queryResult.data\n\n const headers = new Headers([\n ['Content-Type', 'application/json'],\n ])\n\n const content = ctx.message.body ? `## ${ctx.message.title}\\n\\n${ctx.message.body}` : ctx.message.title\n\n const body = defu({ content }, query)\n\n const requestUrl = new URL(`/api/webhooks/${url.username}/${url.password}`, 'https://discord.com')\n\n if (wait) {\n requestUrl.searchParams.set('wait', 'true')\n }\n\n const request = new Request(requestUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n })\n\n return {\n request,\n fetchOptions: options.fetchOptions,\n }\n },\n})\n","import type { FetchOptions } from 'ofetch'\nimport { defineProvider } from '#/core/provider'\nimport { http } from '#/core/transports/http'\nimport { assert } from '#/utils'\nimport { withoutLeadingSlash } from 'ufo'\n\nexport interface SlackOptions {\n /**\n * The base URL for webhook services\n *\n * @default `https://hooks.slack.com/services`\n */\n hookBaseUrl?: string\n /**\n * The base URL for bot API services\n *\n * @default `https://slack.com/api`\n */\n botApiBaseUrl?: string\n\n /**\n * The body of the request\n *\n * NOTICE*: This will override the body of the request. You should known what you are doing.\n */\n body?: Record<string, any>\n\n fetchOptions?: FetchOptions\n}\n\nexport const slack = defineProvider('slack:', {\n transport: http,\n defaultOptions: {\n hookBaseUrl: 'https://hooks.slack.com/',\n botApiBaseUrl: 'https://slack.com/',\n } as SlackOptions,\n async prepare(_, options) {\n const { url } = this\n\n // Validate URL format\n assert(url.hostname === 'bot' || url.hostname === 'webhook', `Invalid slack URL: ${url.toString()}`)\n\n const type = url.hostname as 'bot' | 'webhook'\n\n if (type === 'bot') {\n assert(url.username, 'Channel ID is required')\n assert(url.password, 'Bot token is required')\n }\n else {\n const pathParts = url.pathname.split('/').filter(Boolean)\n assert(pathParts.length === 3, 'Webhook URL is invalid')\n }\n\n let requestUrl: URL\n const headers = new Headers([\n ['Content-Type', 'application/json'],\n ])\n const body: Record<string, any> = {}\n\n // Build message content based on title and body\n if (this.message.body) {\n // When body is present, use blocks for rich markdown formatting\n body.blocks = [\n {\n type: 'header',\n text: {\n type: 'plain_text',\n text: this.message.title,\n },\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: this.message.body,\n },\n },\n ]\n // Fallback text for notifications\n body.text = this.message.title\n }\n else {\n // When only title is present, use simple text format\n body.text = this.message.title\n }\n\n if (type === 'bot') {\n const { username: channel, password: token, searchParams } = url\n requestUrl = new URL('/api/chat.postMessage', options.botApiBaseUrl)\n searchParams.forEach((value, key) => {\n requestUrl.searchParams.set(key, value)\n })\n\n headers.set('Authorization', `Bearer ${token}`)\n\n body.channel = channel\n }\n else {\n const { searchParams } = url\n requestUrl = new URL(`/services/${withoutLeadingSlash(url.pathname)}`, options.hookBaseUrl)\n searchParams.forEach((value, key) => {\n requestUrl.searchParams.set(key, value)\n })\n }\n\n const request = new Request(requestUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(options.body ?? body),\n })\n\n return {\n request,\n fetchOptions: options.fetchOptions,\n }\n },\n})\n","import type { FetchOptions } from 'ofetch'\nimport { defineProvider } from '#/core/provider'\nimport { http } from '#/core/transports/http'\nimport { escapeMarkdown, getValidateQuery } from '#/utils'\nimport { assert } from '#/utils/assert'\nimport z from 'zod'\n\nexport const telegramQuerySchema = z.object({\n parse_mode: z.enum(['Markdown', 'MarkdownV2', 'HTML']).optional(),\n})\n\nexport interface TelegramOptions {\n /**\n * The base URL for Telegram Bot API\n *\n * @default `https://api.telegram.org`\n */\n apiBaseUrl?: string\n\n fetchOptions?: FetchOptions\n}\n\nexport const telegram = defineProvider('telegram:', {\n transport: http,\n defaultOptions: {\n apiBaseUrl: 'https://api.telegram.org',\n } as TelegramOptions,\n async prepare(_, options) {\n const { url } = this\n\n // Validate URL format\n assert(url.hostname === 'bot', `Invalid telegram URL: ${url.toString()}`)\n assert(url.username, 'Bot token is required')\n\n // Extract chat IDs from pathname (e.g., /chat-1/chat-2)\n const pathSegments = url.pathname.split('/').filter(Boolean)\n assert(pathSegments.length > 0, 'At least one chat ID is required')\n\n const queryResult = getValidateQuery(url, telegramQuerySchema.safeParse)\n\n if (!queryResult.success) {\n throw new Error('Invalid telegram query')\n }\n\n const query = queryResult.data\n\n // Bot token is in the username and password fields, because token contains `:` character\n const botToken = `${url.username}:${url.password}`\n\n // First chat ID from pathname (decode to handle @ symbols like @mychannel)\n // Support format: chat-id or chat-id:message-thread-id\n const chatPart = decodeURIComponent(pathSegments[0])\n const [chatId, messageThreadId] = chatPart.includes(':')\n ? chatPart.split(':', 2)\n : [chatPart, undefined]\n\n // Build API URL\n const requestUrl = new URL(`/bot${botToken}/sendMessage`, options.apiBaseUrl)\n\n const headers = new Headers([\n ['Content-Type', 'application/json'],\n ])\n\n // Build message text based on parse_mode\n let text: string\n if (this.message.body) {\n // Title as h1, body as content\n const parseMode = query.parse_mode\n let titleFormatted: string\n\n if (parseMode === 'HTML') {\n titleFormatted = `<b>${this.message.title}</b>`\n }\n else if (parseMode === 'MarkdownV2') {\n // MarkdownV2 requires escaping special characters\n const escapedTitle = escapeMarkdown(this.message.title)\n titleFormatted = `*${escapedTitle}*`\n }\n else {\n // Markdown or default\n titleFormatted = `*${this.message.title}*`\n }\n\n text = `${titleFormatted}\\n\\n${this.message.body}`\n }\n else {\n // No body, title is the main content\n // Need to escape special characters in MarkdownV2 mode\n if (query.parse_mode === 'MarkdownV2') {\n text = escapeMarkdown(this.message.title)\n }\n else {\n text = this.message.title\n }\n }\n\n const body: Record<string, any> = {\n chat_id: chatId,\n text,\n parse_mode: query.parse_mode,\n }\n\n // Add message_thread_id if specified (for topic/forum groups)\n if (messageThreadId) {\n body.message_thread_id = Number.parseInt(messageThreadId, 10)\n }\n\n const request = new Request(requestUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n })\n\n return {\n request,\n fetchOptions: options.fetchOptions,\n }\n },\n})\n","import type { ServiceProvider } from '#/core/provider'\n\nexport interface Sender {\n send: (title: string, body?: string) => Promise<void>\n}\n\nexport type SenderUrl = string | URL\n\nexport interface SenderRegistry {\n (urls: SenderUrl[]): Sender\n resolveProvider: (url: string | URL) => ServiceProvider<string, any, any> | undefined\n}\n\nexport function buildSenderRegistry(\n providers: ServiceProvider<string, any, any>[],\n): SenderRegistry {\n const providersRegistry = new Map<string, ServiceProvider<string, any, any>>()\n providers.forEach((provider) => {\n providersRegistry.set(provider.protocol, provider)\n })\n\n function resolveProvider(\n url: string | URL,\n ): ServiceProvider<string, any, any> | undefined {\n const _url = typeof url === 'string' ? new URL(url) : url\n\n return providersRegistry.get(_url.protocol)\n }\n\n function createSender(urls: SenderUrl[]): Sender {\n const registries = urls.map((url) => {\n const provider = resolveProvider(url)\n if (!provider) {\n return undefined\n }\n return { provider, url }\n }).filter((p): p is { provider: ServiceProvider<string, any, any>, url: SenderUrl } => !!p)\n\n return {\n async send(title: string, body?: string) {\n for (const registry of registries) {\n // Convert message string to { title, body? } format\n const messageObj = { title, body }\n await registry.provider.send(\n registry.url.toString(),\n messageObj,\n )\n }\n },\n }\n }\n\n return Object.assign(createSender, { resolveProvider })\n}\n","import type { FetchOptions } from 'ofetch'\nimport { defineProvider, http } from '#/shared'\nimport { assert, getValidateQuery, withoutPathname } from '#/utils'\nimport defu from 'defu'\nimport { withProtocol } from 'ufo'\nimport z from 'zod'\n\nexport interface BarkOptions {\n fetchOptions?: FetchOptions\n}\n\nconst querySchema = z.object({\n subtitle: z.string().optional(),\n group: z.string().optional(),\n url: z.string().optional(),\n icon: z.string().optional(),\n sound: z.string().optional(),\n call: z.enum(['1']).optional(),\n ciphertext: z.string().optional(),\n level: z.enum(['active', 'timeSensitive', 'passive', 'critical']).optional(),\n volume: z.string().optional(),\n badge: z.coerce.number().optional(),\n autoCopy: z.enum(['1']).optional(),\n copy: z.string().optional(),\n action: z.enum(['none']).optional(),\n isArchive: z.enum(['1']).optional(),\n})\n\nexport const bark = defineProvider('bark:', {\n transport: http,\n defaultOptions: {} as BarkOptions,\n async prepare(ctx, options) {\n const { message, url } = ctx\n\n assert(url.hostname, 'Server URL hostname is required')\n assert(url.pathname, 'Device key is required')\n\n const deviceKeys = url.pathname.split('/').filter(Boolean)\n assert(deviceKeys.length > 0, 'At least one device key is required')\n\n const queryResult = getValidateQuery(url, querySchema.safeParse)\n\n if (!queryResult.success) {\n throw new Error('Invalid Bark query parameters')\n }\n\n const query = queryResult.data\n\n const requestUrl = new URL(`/push`, withProtocol(withoutPathname(url.toString()), 'https:'))\n\n const headers = new Headers([\n ['Content-Type', 'application/json'],\n ])\n\n const contentData: { body: string, title?: string } = message.body ? { title: message.title, body: message.body } : { body: message.title }\n\n const body = defu({ device_keys: deviceKeys }, contentData, query)\n\n const request = new Request(requestUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n })\n\n return {\n request,\n fetchOptions: options.fetchOptions,\n }\n },\n})\n","import type { FetchOptions } from 'ofetch'\nimport { defineProvider } from '#/core/provider'\nimport { http } from '#/core/transports/http'\nimport { withProtocol } from 'ufo'\n\nexport const json = defineProvider('json:', {\n transport: http,\n defaultOptions: {} as FetchOptions,\n async prepare(_, options) {\n const url = new URL(this.url)\n\n const headers = new Headers([\n ['Content-Type', 'application/json'],\n ])\n\n const body: Record<string, string> = {\n title: this.message.title,\n }\n\n if (this.message.body) {\n body.body = this.message.body\n }\n\n Array.from(url.searchParams.entries()).forEach(([key, value]) => {\n if (key.startsWith(' ')) {\n // `+` prefix which will be encoded as ` ` is for headers, remove it on searchParams and add to headers\n url.searchParams.delete(key)\n const headerKey = key.slice(1)\n if (headers.has(headerKey)) {\n headers.set(headerKey, value)\n }\n else {\n headers.append(headerKey, value)\n }\n }\n else if (key.startsWith(':')) {\n // `:` prefix is for body properties, remove it on searchParams and add to body\n url.searchParams.delete(key)\n const propertyKey = key.slice(1)\n body[propertyKey] = value\n }\n })\n\n const requestUrl = withProtocol(url.toString(), 'https:')\n\n const request = new Request(requestUrl, {\n method: 'POST',\n body: JSON.stringify(body),\n headers,\n })\n\n return {\n request,\n fetchOptions: options,\n }\n },\n})\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "statocysts",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.1",
|
|
5
5
|
"description": "Notification library for JavaScript",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://github.com/octoplorer/statocysts",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@types/smtp-server": "^3.5.12",
|
|
58
58
|
"@vitest/coverage-v8": "4.0.16",
|
|
59
59
|
"smtp-server": "^3.18.0",
|
|
60
|
-
"tsdown": "^0.18.
|
|
60
|
+
"tsdown": "^0.18.3",
|
|
61
61
|
"typescript": "^5.9.3",
|
|
62
62
|
"vitest": "^4.0.16"
|
|
63
63
|
},
|