millionsend 0.0.1 → 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.
Files changed (48) hide show
  1. package/README.md +153 -4
  2. package/dist/error.d.ts +24 -0
  3. package/dist/error.d.ts.map +1 -0
  4. package/dist/error.js +16 -0
  5. package/dist/error.js.map +1 -0
  6. package/dist/http.d.ts +34 -0
  7. package/dist/http.d.ts.map +1 -0
  8. package/dist/http.js +75 -0
  9. package/dist/http.js.map +1 -0
  10. package/dist/index.d.ts +40 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +50 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/query.d.ts +4 -0
  15. package/dist/query.d.ts.map +1 -0
  16. package/dist/query.js +7 -0
  17. package/dist/query.js.map +1 -0
  18. package/dist/resources/audiences.d.ts +17 -0
  19. package/dist/resources/audiences.d.ts.map +1 -0
  20. package/dist/resources/audiences.js +25 -0
  21. package/dist/resources/audiences.js.map +1 -0
  22. package/dist/resources/broadcasts.d.ts +16 -0
  23. package/dist/resources/broadcasts.d.ts.map +1 -0
  24. package/dist/resources/broadcasts.js +54 -0
  25. package/dist/resources/broadcasts.js.map +1 -0
  26. package/dist/resources/contacts.d.ts +22 -0
  27. package/dist/resources/contacts.d.ts.map +1 -0
  28. package/dist/resources/contacts.js +73 -0
  29. package/dist/resources/contacts.js.map +1 -0
  30. package/dist/resources/emails.d.ts +28 -0
  31. package/dist/resources/emails.d.ts.map +1 -0
  32. package/dist/resources/emails.js +64 -0
  33. package/dist/resources/emails.js.map +1 -0
  34. package/dist/resources/segments.d.ts +17 -0
  35. package/dist/resources/segments.d.ts.map +1 -0
  36. package/dist/resources/segments.js +35 -0
  37. package/dist/resources/segments.js.map +1 -0
  38. package/dist/resources/topics.d.ts +16 -0
  39. package/dist/resources/topics.d.ts.map +1 -0
  40. package/dist/resources/topics.js +29 -0
  41. package/dist/resources/topics.js.map +1 -0
  42. package/dist/types.d.ts +254 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +7 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +34 -9
  47. package/index.d.ts +0 -4
  48. package/index.js +0 -14
@@ -0,0 +1,73 @@
1
+ import { listQuery } from "../query.js";
2
+ function normalize(address) {
3
+ return typeof address === "string" ? { id: address } : address;
4
+ }
5
+ /** Contact path: email wins over id; audience-scoped when audienceId is set. */
6
+ function contactPath(addr) {
7
+ const key = encodeURIComponent(addr.email ?? addr.id ?? "");
8
+ return addr.audienceId
9
+ ? `/audiences/${encodeURIComponent(addr.audienceId)}/contacts/${key}`
10
+ : `/contacts/${key}`;
11
+ }
12
+ function createBody(o) {
13
+ return {
14
+ email: o.email,
15
+ first_name: o.firstName,
16
+ last_name: o.lastName,
17
+ unsubscribed: o.unsubscribed,
18
+ properties: o.properties,
19
+ };
20
+ }
21
+ function updateBody(o) {
22
+ return {
23
+ first_name: o.firstName,
24
+ last_name: o.lastName,
25
+ unsubscribed: o.unsubscribed,
26
+ properties: o.properties,
27
+ };
28
+ }
29
+ /** Per-contact topic subscriptions (opt in/out of a topic). */
30
+ export class ContactTopics {
31
+ http;
32
+ constructor(http) {
33
+ this.http = http;
34
+ }
35
+ update(options) {
36
+ const key = encodeURIComponent(options.email ?? options.id ?? "");
37
+ return this.http.request({
38
+ method: "PATCH",
39
+ path: `/contacts/${key}/topics`,
40
+ body: options.topics,
41
+ });
42
+ }
43
+ }
44
+ export class Contacts {
45
+ http;
46
+ topics;
47
+ constructor(http) {
48
+ this.http = http;
49
+ this.topics = new ContactTopics(http);
50
+ }
51
+ create(payload) {
52
+ const path = payload.audienceId
53
+ ? `/audiences/${encodeURIComponent(payload.audienceId)}/contacts`
54
+ : "/contacts";
55
+ return this.http.request({ method: "POST", path, body: createBody(payload) });
56
+ }
57
+ get(address) {
58
+ return this.http.request({ method: "GET", path: contactPath(normalize(address)) });
59
+ }
60
+ update(options) {
61
+ return this.http.request({ method: "PATCH", path: contactPath(options), body: updateBody(options) });
62
+ }
63
+ remove(address) {
64
+ return this.http.request({ method: "DELETE", path: contactPath(normalize(address)) });
65
+ }
66
+ list(options) {
67
+ const path = options?.audienceId
68
+ ? `/audiences/${encodeURIComponent(options.audienceId)}/contacts`
69
+ : "/contacts";
70
+ return this.http.request({ method: "GET", path, query: listQuery(options) });
71
+ }
72
+ }
73
+ //# sourceMappingURL=contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/resources/contacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Result } from "../error.js";
2
+ import type { HttpClient, RequestOptions } from "../http.js";
3
+ import type { CancelEmailResponse, CreateEmailResponse, Email, SendEmailOptions } from "../types.js";
4
+ export declare class Emails {
5
+ private readonly http;
6
+ constructor(http: HttpClient);
7
+ /** POST /emails — supports an Idempotency-Key. */
8
+ send(payload: SendEmailOptions, options?: RequestOptions): Promise<Result<CreateEmailResponse>>;
9
+ /** Alias of {@link send}, mirroring Resend. */
10
+ create(payload: SendEmailOptions, options?: RequestOptions): Promise<Result<CreateEmailResponse>>;
11
+ /** GET /emails/:id */
12
+ get(id: string): Promise<Result<Email>>;
13
+ /** POST /emails/:id/cancel — only scheduled, unsent emails. */
14
+ cancel(id: string): Promise<Result<CancelEmailResponse>>;
15
+ }
16
+ export declare class Batch {
17
+ private readonly http;
18
+ constructor(http: HttpClient);
19
+ /** POST /emails/batch — 1–100 emails in one call; supports an Idempotency-Key. */
20
+ send(payload: SendEmailOptions[], options?: RequestOptions): Promise<Result<{
21
+ data: CreateEmailResponse[];
22
+ }>>;
23
+ /** Alias of {@link send}, mirroring Resend. */
24
+ create(payload: SendEmailOptions[], options?: RequestOptions): Promise<Result<{
25
+ data: CreateEmailResponse[];
26
+ }>>;
27
+ }
28
+ //# sourceMappingURL=emails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emails.d.ts","sourceRoot":"","sources":["../../src/resources/emails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,EACL,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAiBrB,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,kDAAkD;IAClD,IAAI,CACF,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IASvC,+CAA+C;IAC/C,MAAM,CACJ,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAIvC,sBAAsB;IACtB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAIvC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;CAMzD;AAED,qBAAa,KAAK;IACJ,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,kFAAkF;IAClF,IAAI,CACF,OAAO,EAAE,gBAAgB,EAAE,EAC3B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC,CAAC;IASnD,+CAA+C;IAC/C,MAAM,CACJ,OAAO,EAAE,gBAAgB,EAAE,EAC3B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC,CAAC;CAGpD"}
@@ -0,0 +1,64 @@
1
+ function toWire(o) {
2
+ return {
3
+ from: o.from,
4
+ to: o.to,
5
+ subject: o.subject,
6
+ html: o.html,
7
+ text: o.text,
8
+ cc: o.cc,
9
+ bcc: o.bcc,
10
+ reply_to: o.replyTo,
11
+ scheduled_at: o.scheduledAt,
12
+ tags: o.tags,
13
+ };
14
+ }
15
+ export class Emails {
16
+ http;
17
+ constructor(http) {
18
+ this.http = http;
19
+ }
20
+ /** POST /emails — supports an Idempotency-Key. */
21
+ send(payload, options = {}) {
22
+ return this.http.request({
23
+ method: "POST",
24
+ path: "/emails",
25
+ body: toWire(payload),
26
+ idempotencyKey: options.idempotencyKey,
27
+ });
28
+ }
29
+ /** Alias of {@link send}, mirroring Resend. */
30
+ create(payload, options = {}) {
31
+ return this.send(payload, options);
32
+ }
33
+ /** GET /emails/:id */
34
+ get(id) {
35
+ return this.http.request({ method: "GET", path: `/emails/${encodeURIComponent(id)}` });
36
+ }
37
+ /** POST /emails/:id/cancel — only scheduled, unsent emails. */
38
+ cancel(id) {
39
+ return this.http.request({
40
+ method: "POST",
41
+ path: `/emails/${encodeURIComponent(id)}/cancel`,
42
+ });
43
+ }
44
+ }
45
+ export class Batch {
46
+ http;
47
+ constructor(http) {
48
+ this.http = http;
49
+ }
50
+ /** POST /emails/batch — 1–100 emails in one call; supports an Idempotency-Key. */
51
+ send(payload, options = {}) {
52
+ return this.http.request({
53
+ method: "POST",
54
+ path: "/emails/batch",
55
+ body: payload.map(toWire),
56
+ idempotencyKey: options.idempotencyKey,
57
+ });
58
+ }
59
+ /** Alias of {@link send}, mirroring Resend. */
60
+ create(payload, options = {}) {
61
+ return this.send(payload, options);
62
+ }
63
+ }
64
+ //# sourceMappingURL=emails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emails.js","sourceRoot":"","sources":["../../src/resources/emails.ts"],"names":[],"mappings":"AASA,SAAS,MAAM,CAAC,CAAmB;IACjC,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,QAAQ,EAAE,CAAC,CAAC,OAAO;QACnB,YAAY,EAAE,CAAC,CAAC,WAAW;QAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD,kDAAkD;IAClD,IAAI,CACF,OAAyB,EACzB,UAA0B,EAAE;QAE5B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;YACrB,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;IACL,CAAC;IAED,+CAA+C;IAC/C,MAAM,CACJ,OAAyB,EACzB,UAA0B,EAAE;QAE5B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,sBAAsB;IACtB,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,+DAA+D;IAC/D,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW,kBAAkB,CAAC,EAAE,CAAC,SAAS;SACjD,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,OAAO,KAAK;IACa;IAA7B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD,kFAAkF;IAClF,IAAI,CACF,OAA2B,EAC3B,UAA0B,EAAE;QAE5B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YACzB,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;IACL,CAAC;IAED,+CAA+C;IAC/C,MAAM,CACJ,OAA2B,EAC3B,UAA0B,EAAE;QAE5B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import type { Result } from "../error.js";
2
+ import type { HttpClient } from "../http.js";
3
+ import type { CreateSegmentOptions, List, ListOptions, RemoveSegmentResponse, Segment, UpdateSegmentOptions } from "../types.js";
4
+ /**
5
+ * Dynamic segments — a saved filter over an audience's contacts (MillionSend
6
+ * extension, no Resend equivalent). `get` returns a live `contact_count`.
7
+ */
8
+ export declare class Segments {
9
+ private readonly http;
10
+ constructor(http: HttpClient);
11
+ create(payload: CreateSegmentOptions): Promise<Result<Segment>>;
12
+ get(id: string): Promise<Result<Segment>>;
13
+ list(options?: ListOptions): Promise<Result<List<Segment>>>;
14
+ update(id: string, payload: UpdateSegmentOptions): Promise<Result<Segment>>;
15
+ remove(id: string): Promise<Result<RemoveSegmentResponse>>;
16
+ }
17
+ //# sourceMappingURL=segments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segments.d.ts","sourceRoot":"","sources":["../../src/resources/segments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,KAAK,EACV,oBAAoB,EACpB,IAAI,EACJ,WAAW,EACX,qBAAqB,EACrB,OAAO,EACP,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAQ/D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAIzC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAI3D,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAQ3E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;CAG3D"}
@@ -0,0 +1,35 @@
1
+ import { listQuery } from "../query.js";
2
+ /**
3
+ * Dynamic segments — a saved filter over an audience's contacts (MillionSend
4
+ * extension, no Resend equivalent). `get` returns a live `contact_count`.
5
+ */
6
+ export class Segments {
7
+ http;
8
+ constructor(http) {
9
+ this.http = http;
10
+ }
11
+ create(payload) {
12
+ return this.http.request({
13
+ method: "POST",
14
+ path: "/segments2",
15
+ body: { name: payload.name, audience_id: payload.audienceId, filter: payload.filter },
16
+ });
17
+ }
18
+ get(id) {
19
+ return this.http.request({ method: "GET", path: `/segments2/${encodeURIComponent(id)}` });
20
+ }
21
+ list(options) {
22
+ return this.http.request({ method: "GET", path: "/segments2", query: listQuery(options) });
23
+ }
24
+ update(id, payload) {
25
+ return this.http.request({
26
+ method: "PATCH",
27
+ path: `/segments2/${encodeURIComponent(id)}`,
28
+ body: { name: payload.name, filter: payload.filter },
29
+ });
30
+ }
31
+ remove(id) {
32
+ return this.http.request({ method: "DELETE", path: `/segments2/${encodeURIComponent(id)}` });
33
+ }
34
+ }
35
+ //# sourceMappingURL=segments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segments.js","sourceRoot":"","sources":["../../src/resources/segments.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxC;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD,MAAM,CAAC,OAA6B;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;SACtF,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,CAAC,OAAqB;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,OAA6B;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE;YAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;SACrD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type { Result } from "../error.js";
2
+ import type { HttpClient } from "../http.js";
3
+ import type { CreateTopicOptions, RemoveTopicResponse, Topic, TopicId } from "../types.js";
4
+ /** Subscription topics — granular unsubscribe categories for a team. */
5
+ export declare class Topics {
6
+ private readonly http;
7
+ constructor(http: HttpClient);
8
+ create(payload: CreateTopicOptions): Promise<Result<TopicId>>;
9
+ get(id: string): Promise<Result<Topic>>;
10
+ /** GET /topics — a bare `{ data }` list (topics are unpaginated). */
11
+ list(): Promise<Result<{
12
+ data: Topic[];
13
+ }>>;
14
+ remove(id: string): Promise<Result<RemoveTopicResponse>>;
15
+ }
16
+ //# sourceMappingURL=topics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topics.d.ts","sourceRoot":"","sources":["../../src/resources/topics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3F,wEAAwE;AACxE,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAY7D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAIvC,qEAAqE;IACrE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC,CAAC;IAI1C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;CAGzD"}
@@ -0,0 +1,29 @@
1
+ /** Subscription topics — granular unsubscribe categories for a team. */
2
+ export class Topics {
3
+ http;
4
+ constructor(http) {
5
+ this.http = http;
6
+ }
7
+ create(payload) {
8
+ return this.http.request({
9
+ method: "POST",
10
+ path: "/topics",
11
+ body: {
12
+ name: payload.name,
13
+ description: payload.description,
14
+ default_subscription: payload.defaultSubscription,
15
+ },
16
+ });
17
+ }
18
+ get(id) {
19
+ return this.http.request({ method: "GET", path: `/topics/${encodeURIComponent(id)}` });
20
+ }
21
+ /** GET /topics — a bare `{ data }` list (topics are unpaginated). */
22
+ list() {
23
+ return this.http.request({ method: "GET", path: "/topics" });
24
+ }
25
+ remove(id) {
26
+ return this.http.request({ method: "DELETE", path: `/topics/${encodeURIComponent(id)}` });
27
+ }
28
+ }
29
+ //# sourceMappingURL=topics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topics.js","sourceRoot":"","sources":["../../src/resources/topics.ts"],"names":[],"mappings":"AAIA,wEAAwE;AACxE,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD,MAAM,CAAC,OAA2B;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,oBAAoB,EAAE,OAAO,CAAC,mBAAmB;aAClD;SACF,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,qEAAqE;IACrE,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;CACF"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Public request/response types. Inputs are camelCase (mapped to the wire's
3
+ * snake_case by each resource); responses are the wire shape verbatim, so the
4
+ * `object`/`created_at`/`first_name` fields read exactly as the API returns.
5
+ */
6
+ export type Recipients = string | string[];
7
+ export interface Tag {
8
+ name: string;
9
+ value: string;
10
+ }
11
+ export interface ListOptions {
12
+ limit?: number;
13
+ /** Keyset cursor: return items after this id. Mutually exclusive with `before`. */
14
+ after?: string;
15
+ before?: string;
16
+ }
17
+ export interface List<T> {
18
+ object: "list";
19
+ data: T[];
20
+ has_more: boolean;
21
+ }
22
+ export interface SendEmailOptions {
23
+ from: string;
24
+ to: Recipients;
25
+ subject: string;
26
+ html?: string;
27
+ text?: string;
28
+ cc?: Recipients;
29
+ bcc?: Recipients;
30
+ replyTo?: Recipients;
31
+ /** ISO 8601 with offset; up to 30 days ahead. */
32
+ scheduledAt?: string;
33
+ tags?: Tag[];
34
+ }
35
+ export interface CreateEmailResponse {
36
+ id: string;
37
+ }
38
+ export interface Email {
39
+ object: "email";
40
+ id: string;
41
+ from: string;
42
+ to: string[];
43
+ cc: string[] | null;
44
+ bcc: string[] | null;
45
+ reply_to: string[] | null;
46
+ subject: string;
47
+ html: string | null;
48
+ text: string | null;
49
+ created_at: string;
50
+ scheduled_at: string | null;
51
+ message_id: string;
52
+ last_event: string;
53
+ }
54
+ export interface CancelEmailResponse {
55
+ object: "email";
56
+ id: string;
57
+ }
58
+ export interface BatchResponse {
59
+ data: CreateEmailResponse[];
60
+ }
61
+ export interface CreateAudienceOptions {
62
+ name: string;
63
+ }
64
+ export interface Audience {
65
+ object: string;
66
+ id: string;
67
+ name: string;
68
+ created_at?: string;
69
+ }
70
+ export interface AudienceListItem {
71
+ id: string;
72
+ name: string;
73
+ created_at: string;
74
+ }
75
+ export interface RemoveAudienceResponse {
76
+ object: string;
77
+ id: string;
78
+ deleted: true;
79
+ }
80
+ export interface CreateContactOptions {
81
+ /**
82
+ * The audience to create the contact in. The API requires it — omitting it
83
+ * posts to /contacts, which always answers 422 "audience_id is required"
84
+ * (kept optional here only to mirror resend's shape).
85
+ */
86
+ audienceId?: string;
87
+ email: string;
88
+ firstName?: string;
89
+ lastName?: string;
90
+ unsubscribed?: boolean;
91
+ properties?: Record<string, string | number | boolean | null>;
92
+ }
93
+ /** Address a contact by id or email (email wins if both are given). */
94
+ export interface ContactAddress {
95
+ audienceId?: string;
96
+ id?: string;
97
+ email?: string;
98
+ }
99
+ export interface UpdateContactOptions extends ContactAddress {
100
+ firstName?: string | null;
101
+ lastName?: string | null;
102
+ unsubscribed?: boolean;
103
+ properties?: Record<string, string | number | boolean | null>;
104
+ }
105
+ export interface ContactId {
106
+ object: "contact";
107
+ id: string;
108
+ }
109
+ export interface Contact {
110
+ object: "contact";
111
+ id: string;
112
+ email: string;
113
+ first_name: string | null;
114
+ last_name: string | null;
115
+ created_at: string;
116
+ unsubscribed: boolean;
117
+ properties: Record<string, string>;
118
+ }
119
+ export interface ContactListItem {
120
+ id: string;
121
+ email: string;
122
+ first_name: string | null;
123
+ last_name: string | null;
124
+ created_at: string;
125
+ unsubscribed: boolean;
126
+ }
127
+ export interface RemoveContactResponse {
128
+ object: "contact";
129
+ contact: string;
130
+ deleted: true;
131
+ }
132
+ export type TopicSubscription = "opt_in" | "opt_out";
133
+ export interface ContactTopicUpdate {
134
+ id: string;
135
+ subscription: TopicSubscription;
136
+ }
137
+ export interface UpdateContactTopicsOptions extends ContactAddress {
138
+ topics: ContactTopicUpdate[];
139
+ }
140
+ export interface UpdateContactTopicsResponse {
141
+ id: string;
142
+ }
143
+ export interface CreateTopicOptions {
144
+ name: string;
145
+ description?: string;
146
+ defaultSubscription: TopicSubscription;
147
+ }
148
+ export interface Topic {
149
+ id: string;
150
+ name: string;
151
+ description?: string;
152
+ default_subscription: TopicSubscription;
153
+ created_at: string;
154
+ }
155
+ export interface TopicId {
156
+ id: string;
157
+ }
158
+ export interface RemoveTopicResponse {
159
+ id: string;
160
+ object: "topic";
161
+ deleted: true;
162
+ }
163
+ export interface CreateBroadcastOptions {
164
+ name?: string;
165
+ audienceId?: string;
166
+ segmentId?: string;
167
+ from: string;
168
+ subject: string;
169
+ html?: string;
170
+ text?: string;
171
+ replyTo?: Recipients;
172
+ topicId?: string | null;
173
+ }
174
+ export interface UpdateBroadcastOptions {
175
+ name?: string;
176
+ audienceId?: string;
177
+ segmentId?: string;
178
+ from?: string;
179
+ subject?: string;
180
+ html?: string;
181
+ text?: string;
182
+ replyTo?: Recipients;
183
+ topicId?: string | null;
184
+ }
185
+ export interface SendBroadcastOptions {
186
+ /** ISO 8601 with offset; omit to send now. */
187
+ scheduledAt?: string;
188
+ }
189
+ export interface BroadcastId {
190
+ id: string;
191
+ }
192
+ export interface BroadcastListItem {
193
+ id: string;
194
+ name: string | null;
195
+ audience_id: string | null;
196
+ segment_id: string | null;
197
+ status: string;
198
+ created_at: string;
199
+ scheduled_at: string | null;
200
+ sent_at: string | null;
201
+ }
202
+ export interface Broadcast extends BroadcastListItem {
203
+ object: "broadcast";
204
+ from: string;
205
+ subject: string;
206
+ reply_to: string[] | null;
207
+ preview_text: string | null;
208
+ topic_id: string | null;
209
+ html: string | null;
210
+ text: string | null;
211
+ }
212
+ export interface CancelBroadcastResponse {
213
+ object: "broadcast";
214
+ id: string;
215
+ }
216
+ export interface RemoveBroadcastResponse {
217
+ object: "broadcast";
218
+ id: string;
219
+ deleted: true;
220
+ }
221
+ export type SegmentMatch = "all" | "any";
222
+ export interface SegmentCondition {
223
+ field: string;
224
+ op: string;
225
+ value?: string | null;
226
+ }
227
+ export interface SegmentFilter {
228
+ match: SegmentMatch;
229
+ conditions: SegmentCondition[];
230
+ }
231
+ export interface CreateSegmentOptions {
232
+ name: string;
233
+ audienceId: string;
234
+ filter: SegmentFilter;
235
+ }
236
+ export interface UpdateSegmentOptions {
237
+ name?: string;
238
+ filter?: SegmentFilter;
239
+ }
240
+ export interface Segment {
241
+ object: "segment";
242
+ id: string;
243
+ name: string;
244
+ audience_id: string;
245
+ filter: SegmentFilter;
246
+ created_at: string;
247
+ contact_count?: number;
248
+ }
249
+ export interface RemoveSegmentResponse {
250
+ object: "segment";
251
+ id: string;
252
+ deleted: true;
253
+ }
254
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Public request/response types. Inputs are camelCase (mapped to the wire's
3
+ * snake_case by each resource); responses are the wire shape verbatim, so the
4
+ * `object`/`created_at`/`first_name` fields read exactly as the API returns.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
package/package.json CHANGED
@@ -1,13 +1,38 @@
1
1
  {
2
2
  "name": "millionsend",
3
- "version": "0.0.1",
4
- "description": "Official Node.js SDK for MillionSend — the open-source email platform. Under active development; API coming soon.",
5
- "main": "index.js",
6
- "types": "index.d.ts",
7
- "files": ["index.js", "index.d.ts", "README.md", "LICENSE"],
8
- "keywords": ["email", "millionsend", "ses", "transactional-email"],
9
- "homepage": "https://github.com/MillionSend",
10
- "repository": { "type": "git", "url": "git+https://github.com/MillionSend/millionsend-node.git" },
3
+ "version": "0.1.0",
4
+ "description": "Official MillionSend SDK for Node.js — a Resend-compatible email API you can self-host.",
5
+ "type": "module",
11
6
  "license": "MIT",
12
- "engines": { "node": ">=18" }
7
+ "author": "MillionSend",
8
+ "homepage": "https://github.com/MillionSend/millionsend-node#readme",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/MillionSend/millionsend-node.git"
12
+ },
13
+ "keywords": ["millionsend", "resend", "email", "ses", "sdk", "transactional", "broadcast"],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ }
19
+ },
20
+ "main": "./dist/index.js",
21
+ "module": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "files": ["dist", "README.md", "LICENSE"],
24
+ "engines": {
25
+ "node": ">=18"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.build.json",
29
+ "typecheck": "tsc --noEmit",
30
+ "test": "vitest run",
31
+ "prepack": "pnpm build"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^22.20.1",
35
+ "typescript": "^5.9.3",
36
+ "vitest": "^3.2.4"
37
+ }
13
38
  }
package/index.d.ts DELETED
@@ -1,4 +0,0 @@
1
- export declare class MillionSend {
2
- constructor(apiKey?: string);
3
- }
4
- export default MillionSend;
package/index.js DELETED
@@ -1,14 +0,0 @@
1
- // MillionSend Node.js SDK — under active development.
2
- // The published API will mirror the shape you already know:
3
- // const millionsend = new MillionSend(process.env.MILLIONSEND_API_KEY);
4
- // await millionsend.emails.send({ from, to, subject, html });
5
- // Follow https://github.com/MillionSend for progress.
6
- class MillionSend {
7
- constructor() {
8
- throw new Error(
9
- 'The MillionSend SDK is under active development — this placeholder release only reserves the package name. Follow https://github.com/MillionSend for the first working release.'
10
- );
11
- }
12
- }
13
- module.exports = { MillionSend };
14
- module.exports.default = MillionSend;