waitkit 0.1.0 → 0.3.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/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # waitkit
2
+
3
+ > WaitKit SDK — waitlist infrastructure for your app.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ npm install waitkit
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import { WaitKit } from "waitkit";
15
+
16
+ const wk = new WaitKit({
17
+ apiKey: "wk_...",
18
+ projectSlug: "my-project",
19
+ });
20
+
21
+ // Add a subscriber (source defaults to "landing-page")
22
+ await wk.subscribers.create({ email: "user@example.com" });
23
+
24
+ // Override source per-signup
25
+ await wk.subscribers.create({ email: "user@example.com", source: "referral" });
26
+
27
+ // Get subscriber count
28
+ const count = await wk.subscribers.count();
29
+ ```
30
+
31
+ ### React
32
+
33
+ ```tsx
34
+ import { WaitKit } from "waitkit";
35
+ import { useWaitlist } from "waitkit/react";
36
+
37
+ const wk = new WaitKit({ apiKey: "wk_...", projectSlug: "my-project" });
38
+
39
+ function WaitlistForm() {
40
+ const { join, count, isJoining, error } = useWaitlist(wk);
41
+
42
+ return (
43
+ <form onSubmit={() => join({ email: "user@example.com" })}>
44
+ <p>Joined: {count}</p>
45
+ <button disabled={isJoining} type="submit">
46
+ Join
47
+ </button>
48
+ {error && <p>{error.message}</p>}
49
+ </form>
50
+ );
51
+ }
52
+ ```
53
+
54
+ ## API
55
+
56
+ ### `WaitKitConfig`
57
+
58
+ | Param | Type | Default | Description |
59
+ | ------------- | -------- | ------------------------- | ------------------------------ |
60
+ | `apiKey` | `string` | — | API key |
61
+ | `projectSlug` | `string` | — | Project slug |
62
+ | `baseUrl` | `string` | `https://api.waitkit.dev` | API base URL |
63
+ | `source` | `string` | `landing-page` | Default source for all signups |
64
+
65
+ ### `wk.subscribers.create(options)`
66
+
67
+ | Param | Type | Required | Description |
68
+ | ---------- | ------------------------- | -------- | -------------------------------------------- |
69
+ | `email` | `string` | yes | Subscriber email |
70
+ | `name` | `string` | no | Subscriber name |
71
+ | `source` | `string` | no | Overrides the default source for this signup |
72
+ | `metadata` | `Record<string, unknown>` | no | Arbitrary metadata |
73
+
74
+ The `source` value is resolved with this precedence:
75
+
76
+ 1. `create({ source })` — per-call override
77
+ 2. `new WaitKit({ source })` — instance default
78
+ 3. `"landing-page"` — built-in fallback
79
+
80
+ ### `wk.subscribers.count(projectSlug?)`
81
+
82
+ Returns total subscriber count. Optionally pass a different project slug.
83
+
84
+ ## License
85
+
86
+ ISC
@@ -1,3 +1,13 @@
1
+ declare class HttpClient {
2
+ private baseUrl;
3
+ constructor(baseUrl: string);
4
+ request<T>(method: string, path: string, options?: {
5
+ headers?: Record<string, string>;
6
+ body?: unknown;
7
+ query?: Record<string, string | number | undefined>;
8
+ }): Promise<T>;
9
+ }
10
+
1
11
  interface WaitKitConfig {
2
12
  apiKey: string;
3
13
  projectSlug: string;
@@ -14,14 +24,22 @@ interface JoinResult {
14
24
  email: string;
15
25
  }
16
26
 
17
- declare class WaitKit {
27
+ declare class SubscribersResource {
18
28
  private client;
19
29
  private apiKey;
20
30
  private projectSlug;
21
- constructor(config: WaitKitConfig);
31
+ constructor(client: HttpClient, apiKey: string, projectSlug: string);
22
32
  private get headers();
23
- join(options: JoinOptions): Promise<JoinResult>;
33
+ create(options: JoinOptions): Promise<JoinResult>;
24
34
  count(projectSlug?: string): Promise<number>;
25
35
  }
26
36
 
37
+ declare class WaitKit {
38
+ subscribers: SubscribersResource;
39
+ private client;
40
+ private apiKey;
41
+ private projectSlug;
42
+ constructor(config: WaitKitConfig);
43
+ }
44
+
27
45
  export { type JoinOptions as J, WaitKit as W, type JoinResult as a };
@@ -1,3 +1,13 @@
1
+ declare class HttpClient {
2
+ private baseUrl;
3
+ constructor(baseUrl: string);
4
+ request<T>(method: string, path: string, options?: {
5
+ headers?: Record<string, string>;
6
+ body?: unknown;
7
+ query?: Record<string, string | number | undefined>;
8
+ }): Promise<T>;
9
+ }
10
+
1
11
  interface WaitKitConfig {
2
12
  apiKey: string;
3
13
  projectSlug: string;
@@ -14,14 +24,22 @@ interface JoinResult {
14
24
  email: string;
15
25
  }
16
26
 
17
- declare class WaitKit {
27
+ declare class SubscribersResource {
18
28
  private client;
19
29
  private apiKey;
20
30
  private projectSlug;
21
- constructor(config: WaitKitConfig);
31
+ constructor(client: HttpClient, apiKey: string, projectSlug: string);
22
32
  private get headers();
23
- join(options: JoinOptions): Promise<JoinResult>;
33
+ create(options: JoinOptions): Promise<JoinResult>;
24
34
  count(projectSlug?: string): Promise<number>;
25
35
  }
26
36
 
37
+ declare class WaitKit {
38
+ subscribers: SubscribersResource;
39
+ private client;
40
+ private apiKey;
41
+ private projectSlug;
42
+ constructor(config: WaitKitConfig);
43
+ }
44
+
27
45
  export { type JoinOptions as J, WaitKit as W, type JoinResult as a };
package/dist/index.cjs CHANGED
@@ -71,21 +71,20 @@ var HttpClient = class {
71
71
  }
72
72
  };
73
73
 
74
- // src/index.ts
75
- var DEFAULT_BASE_URL = "https://api.waitkit.dev";
76
- var WaitKit = class {
74
+ // src/resources/subscribers.ts
75
+ var SubscribersResource = class {
77
76
  client;
78
77
  apiKey;
79
78
  projectSlug;
80
- constructor(config) {
81
- this.apiKey = config.apiKey;
82
- this.projectSlug = config.projectSlug;
83
- this.client = new HttpClient(config.baseUrl ?? DEFAULT_BASE_URL);
79
+ constructor(client, apiKey, projectSlug) {
80
+ this.client = client;
81
+ this.apiKey = apiKey;
82
+ this.projectSlug = projectSlug;
84
83
  }
85
84
  get headers() {
86
85
  return { Authorization: `Bearer ${this.apiKey}` };
87
86
  }
88
- async join(options) {
87
+ async create(options) {
89
88
  const data = await this.client.request(
90
89
  "POST",
91
90
  `/api/waitlist/${this.projectSlug}/join`,
@@ -106,6 +105,25 @@ var WaitKit = class {
106
105
  return data.count;
107
106
  }
108
107
  };
108
+
109
+ // src/index.ts
110
+ var DEFAULT_BASE_URL = "https://api.waitkit.dev";
111
+ var WaitKit = class {
112
+ subscribers;
113
+ client;
114
+ apiKey;
115
+ projectSlug;
116
+ constructor(config) {
117
+ this.apiKey = config.apiKey;
118
+ this.projectSlug = config.projectSlug;
119
+ this.client = new HttpClient(config.baseUrl ?? DEFAULT_BASE_URL);
120
+ this.subscribers = new SubscribersResource(
121
+ this.client,
122
+ this.apiKey,
123
+ this.projectSlug
124
+ );
125
+ }
126
+ };
109
127
  // Annotate the CommonJS export names for ESM import in node:
110
128
  0 && (module.exports = {
111
129
  WaitKit
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["import { HttpClient } from \"./client\";\nimport type { JoinOptions, JoinResult, WaitKitConfig } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.waitkit.dev\";\n\nexport class WaitKit {\n private client: HttpClient;\n private apiKey: string;\n private projectSlug: string;\n\n constructor(config: WaitKitConfig) {\n this.apiKey = config.apiKey;\n this.projectSlug = config.projectSlug;\n this.client = new HttpClient(config.baseUrl ?? DEFAULT_BASE_URL);\n }\n\n private get headers() {\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n async join(options: JoinOptions): Promise<JoinResult> {\n const data = await this.client.request<{ email: string }>(\n \"POST\",\n `/api/waitlist/${this.projectSlug}/join`,\n { headers: this.headers, body: options },\n );\n\n return {\n message: \"Thank you for joining the waitlist!\",\n email: data.email,\n };\n }\n\n async count(projectSlug?: string): Promise<number> {\n const slug = projectSlug ?? this.projectSlug;\n const data = await this.client.request<{ count: number }>(\n \"GET\",\n `/api/waitlist/${slug}/count`,\n { headers: this.headers },\n );\n\n return data.count;\n }\n}\n","import type { ErrorResponse } from \"./types\";\n\nexport class WaitKitError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public issues?: Array<{ path: string; message: string }>,\n ) {\n super(message);\n this.name = \"WaitKitError\";\n }\n\n static fromResponse(res: ErrorResponse): WaitKitError {\n return new WaitKitError(res.message, res.statusCode, res.issues);\n }\n}\n","import type { ApiResponse, ErrorResponse, SuccessResponse } from \"./types\";\nimport { WaitKitError } from \"./errors\";\n\nexport class HttpClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n headers?: Record<string, string>;\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n const json: ApiResponse<T> = await res.json();\n\n if (!res.ok || json.status === \"error\") {\n const err = json as ErrorResponse;\n throw WaitKitError.fromResponse(err);\n }\n\n return (json as SuccessResponse<T>).data;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YACE,SACO,YACA,QACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AAAA,EALS;AAAA,EACA;AAAA,EAMT,OAAO,aAAa,KAAkC;AACpD,WAAO,IAAI,cAAa,IAAI,SAAS,IAAI,YAAY,IAAI,MAAM;AAAA,EACjE;AACF;;;ACZO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAER,YAAY,SAAiB;AAC3B,SAAK,UAAU,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AAAA,EAEA,MAAM,QACJ,QACA,MACA,UAII,CAAC,GACO;AACZ,UAAM,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAAI,EAAE;AAE5C,QAAI,QAAQ,OAAO;AACjB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,YAAI,UAAU,QAAW;AACvB,cAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MACtC;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,IACtD,CAAC;AAED,UAAM,OAAuB,MAAM,IAAI,KAAK;AAE5C,QAAI,CAAC,IAAI,MAAM,KAAK,WAAW,SAAS;AACtC,YAAM,MAAM;AACZ,YAAM,aAAa,aAAa,GAAG;AAAA,IACrC;AAEA,WAAQ,KAA4B;AAAA,EACtC;AACF;;;AF5CA,IAAM,mBAAmB;AAElB,IAAM,UAAN,MAAc;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAuB;AACjC,SAAK,SAAS,OAAO;AACrB,SAAK,cAAc,OAAO;AAC1B,SAAK,SAAS,IAAI,WAAW,OAAO,WAAW,gBAAgB;AAAA,EACjE;AAAA,EAEA,IAAY,UAAU;AACpB,WAAO,EAAE,eAAe,UAAU,KAAK,MAAM,GAAG;AAAA,EAClD;AAAA,EAEA,MAAM,KAAK,SAA2C;AACpD,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,iBAAiB,KAAK,WAAW;AAAA,MACjC,EAAE,SAAS,KAAK,SAAS,MAAM,QAAQ;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,aAAuC;AACjD,UAAM,OAAO,eAAe,KAAK;AACjC,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,iBAAiB,IAAI;AAAA,MACrB,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC1B;AAEA,WAAO,KAAK;AAAA,EACd;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts","../src/resources/subscribers.ts"],"sourcesContent":["import { HttpClient } from \"./client\";\nimport { SubscribersResource } from \"./resources/subscribers\";\nimport type { WaitKitConfig } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.waitkit.dev\";\n\nexport class WaitKit {\n subscribers: SubscribersResource;\n private client: HttpClient;\n private apiKey: string;\n private projectSlug: string;\n\n constructor(config: WaitKitConfig) {\n this.apiKey = config.apiKey;\n this.projectSlug = config.projectSlug;\n this.client = new HttpClient(config.baseUrl ?? DEFAULT_BASE_URL);\n this.subscribers = new SubscribersResource(\n this.client,\n this.apiKey,\n this.projectSlug,\n );\n }\n}\n","import type { ErrorResponse } from \"./types\";\n\nexport class WaitKitError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public issues?: Array<{ path: string; message: string }>,\n ) {\n super(message);\n this.name = \"WaitKitError\";\n }\n\n static fromResponse(res: ErrorResponse): WaitKitError {\n return new WaitKitError(res.message, res.statusCode, res.issues);\n }\n}\n","import type { ApiResponse, ErrorResponse, SuccessResponse } from \"./types\";\nimport { WaitKitError } from \"./errors\";\n\nexport class HttpClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n headers?: Record<string, string>;\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n const json: ApiResponse<T> = await res.json();\n\n if (!res.ok || json.status === \"error\") {\n const err = json as ErrorResponse;\n throw WaitKitError.fromResponse(err);\n }\n\n return (json as SuccessResponse<T>).data;\n }\n}\n","import { HttpClient } from \"../client\";\nimport type { JoinOptions, JoinResult } from \"../types\";\n\nexport class SubscribersResource {\n private client: HttpClient;\n private apiKey: string;\n private projectSlug: string;\n\n constructor(client: HttpClient, apiKey: string, projectSlug: string) {\n this.client = client;\n this.apiKey = apiKey;\n this.projectSlug = projectSlug;\n }\n\n private get headers() {\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n async create(options: JoinOptions): Promise<JoinResult> {\n const data = await this.client.request<{ email: string }>(\n \"POST\",\n `/api/waitlist/${this.projectSlug}/join`,\n { headers: this.headers, body: options },\n );\n\n return {\n message: \"Thank you for joining the waitlist!\",\n email: data.email,\n };\n }\n\n async count(projectSlug?: string): Promise<number> {\n const slug = projectSlug ?? this.projectSlug;\n const data = await this.client.request<{ count: number }>(\n \"GET\",\n `/api/waitlist/${slug}/count`,\n { headers: this.headers },\n );\n\n return data.count;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YACE,SACO,YACA,QACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AAAA,EALS;AAAA,EACA;AAAA,EAMT,OAAO,aAAa,KAAkC;AACpD,WAAO,IAAI,cAAa,IAAI,SAAS,IAAI,YAAY,IAAI,MAAM;AAAA,EACjE;AACF;;;ACZO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAER,YAAY,SAAiB;AAC3B,SAAK,UAAU,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AAAA,EAEA,MAAM,QACJ,QACA,MACA,UAII,CAAC,GACO;AACZ,UAAM,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAAI,EAAE;AAE5C,QAAI,QAAQ,OAAO;AACjB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,YAAI,UAAU,QAAW;AACvB,cAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MACtC;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,IACtD,CAAC;AAED,UAAM,OAAuB,MAAM,IAAI,KAAK;AAE5C,QAAI,CAAC,IAAI,MAAM,KAAK,WAAW,SAAS;AACtC,YAAM,MAAM;AACZ,YAAM,aAAa,aAAa,GAAG;AAAA,IACrC;AAEA,WAAQ,KAA4B;AAAA,EACtC;AACF;;;AC5CO,IAAM,sBAAN,MAA0B;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAoB,QAAgB,aAAqB;AACnE,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAY,UAAU;AACpB,WAAO,EAAE,eAAe,UAAU,KAAK,MAAM,GAAG;AAAA,EAClD;AAAA,EAEA,MAAM,OAAO,SAA2C;AACtD,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,iBAAiB,KAAK,WAAW;AAAA,MACjC,EAAE,SAAS,KAAK,SAAS,MAAM,QAAQ;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,aAAuC;AACjD,UAAM,OAAO,eAAe,KAAK;AACjC,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,iBAAiB,IAAI;AAAA,MACrB,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC1B;AAEA,WAAO,KAAK;AAAA,EACd;AACF;;;AHrCA,IAAM,mBAAmB;AAElB,IAAM,UAAN,MAAc;AAAA,EACnB;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAuB;AACjC,SAAK,SAAS,OAAO;AACrB,SAAK,cAAc,OAAO;AAC1B,SAAK,SAAS,IAAI,WAAW,OAAO,WAAW,gBAAgB;AAC/D,SAAK,cAAc,IAAI;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1 +1 @@
1
- export { W as WaitKit } from './index-5GjaWT5y.cjs';
1
+ export { W as WaitKit } from './index-B-G7fuyH.cjs';
package/dist/index.d.ts CHANGED
@@ -1 +1 @@
1
- export { W as WaitKit } from './index-5GjaWT5y.js';
1
+ export { W as WaitKit } from './index-B-G7fuyH.js';
package/dist/index.js CHANGED
@@ -45,21 +45,20 @@ var HttpClient = class {
45
45
  }
46
46
  };
47
47
 
48
- // src/index.ts
49
- var DEFAULT_BASE_URL = "https://api.waitkit.dev";
50
- var WaitKit = class {
48
+ // src/resources/subscribers.ts
49
+ var SubscribersResource = class {
51
50
  client;
52
51
  apiKey;
53
52
  projectSlug;
54
- constructor(config) {
55
- this.apiKey = config.apiKey;
56
- this.projectSlug = config.projectSlug;
57
- this.client = new HttpClient(config.baseUrl ?? DEFAULT_BASE_URL);
53
+ constructor(client, apiKey, projectSlug) {
54
+ this.client = client;
55
+ this.apiKey = apiKey;
56
+ this.projectSlug = projectSlug;
58
57
  }
59
58
  get headers() {
60
59
  return { Authorization: `Bearer ${this.apiKey}` };
61
60
  }
62
- async join(options) {
61
+ async create(options) {
63
62
  const data = await this.client.request(
64
63
  "POST",
65
64
  `/api/waitlist/${this.projectSlug}/join`,
@@ -80,6 +79,25 @@ var WaitKit = class {
80
79
  return data.count;
81
80
  }
82
81
  };
82
+
83
+ // src/index.ts
84
+ var DEFAULT_BASE_URL = "https://api.waitkit.dev";
85
+ var WaitKit = class {
86
+ subscribers;
87
+ client;
88
+ apiKey;
89
+ projectSlug;
90
+ constructor(config) {
91
+ this.apiKey = config.apiKey;
92
+ this.projectSlug = config.projectSlug;
93
+ this.client = new HttpClient(config.baseUrl ?? DEFAULT_BASE_URL);
94
+ this.subscribers = new SubscribersResource(
95
+ this.client,
96
+ this.apiKey,
97
+ this.projectSlug
98
+ );
99
+ }
100
+ };
83
101
  export {
84
102
  WaitKit
85
103
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["import type { ErrorResponse } from \"./types\";\n\nexport class WaitKitError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public issues?: Array<{ path: string; message: string }>,\n ) {\n super(message);\n this.name = \"WaitKitError\";\n }\n\n static fromResponse(res: ErrorResponse): WaitKitError {\n return new WaitKitError(res.message, res.statusCode, res.issues);\n }\n}\n","import type { ApiResponse, ErrorResponse, SuccessResponse } from \"./types\";\nimport { WaitKitError } from \"./errors\";\n\nexport class HttpClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n headers?: Record<string, string>;\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n const json: ApiResponse<T> = await res.json();\n\n if (!res.ok || json.status === \"error\") {\n const err = json as ErrorResponse;\n throw WaitKitError.fromResponse(err);\n }\n\n return (json as SuccessResponse<T>).data;\n }\n}\n","import { HttpClient } from \"./client\";\nimport type { JoinOptions, JoinResult, WaitKitConfig } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.waitkit.dev\";\n\nexport class WaitKit {\n private client: HttpClient;\n private apiKey: string;\n private projectSlug: string;\n\n constructor(config: WaitKitConfig) {\n this.apiKey = config.apiKey;\n this.projectSlug = config.projectSlug;\n this.client = new HttpClient(config.baseUrl ?? DEFAULT_BASE_URL);\n }\n\n private get headers() {\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n async join(options: JoinOptions): Promise<JoinResult> {\n const data = await this.client.request<{ email: string }>(\n \"POST\",\n `/api/waitlist/${this.projectSlug}/join`,\n { headers: this.headers, body: options },\n );\n\n return {\n message: \"Thank you for joining the waitlist!\",\n email: data.email,\n };\n }\n\n async count(projectSlug?: string): Promise<number> {\n const slug = projectSlug ?? this.projectSlug;\n const data = await this.client.request<{ count: number }>(\n \"GET\",\n `/api/waitlist/${slug}/count`,\n { headers: this.headers },\n );\n\n return data.count;\n }\n}\n"],"mappings":";AAEO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YACE,SACO,YACA,QACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AAAA,EALS;AAAA,EACA;AAAA,EAMT,OAAO,aAAa,KAAkC;AACpD,WAAO,IAAI,cAAa,IAAI,SAAS,IAAI,YAAY,IAAI,MAAM;AAAA,EACjE;AACF;;;ACZO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAER,YAAY,SAAiB;AAC3B,SAAK,UAAU,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AAAA,EAEA,MAAM,QACJ,QACA,MACA,UAII,CAAC,GACO;AACZ,UAAM,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAAI,EAAE;AAE5C,QAAI,QAAQ,OAAO;AACjB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,YAAI,UAAU,QAAW;AACvB,cAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MACtC;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,IACtD,CAAC;AAED,UAAM,OAAuB,MAAM,IAAI,KAAK;AAE5C,QAAI,CAAC,IAAI,MAAM,KAAK,WAAW,SAAS;AACtC,YAAM,MAAM;AACZ,YAAM,aAAa,aAAa,GAAG;AAAA,IACrC;AAEA,WAAQ,KAA4B;AAAA,EACtC;AACF;;;AC5CA,IAAM,mBAAmB;AAElB,IAAM,UAAN,MAAc;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAuB;AACjC,SAAK,SAAS,OAAO;AACrB,SAAK,cAAc,OAAO;AAC1B,SAAK,SAAS,IAAI,WAAW,OAAO,WAAW,gBAAgB;AAAA,EACjE;AAAA,EAEA,IAAY,UAAU;AACpB,WAAO,EAAE,eAAe,UAAU,KAAK,MAAM,GAAG;AAAA,EAClD;AAAA,EAEA,MAAM,KAAK,SAA2C;AACpD,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,iBAAiB,KAAK,WAAW;AAAA,MACjC,EAAE,SAAS,KAAK,SAAS,MAAM,QAAQ;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,aAAuC;AACjD,UAAM,OAAO,eAAe,KAAK;AACjC,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,iBAAiB,IAAI;AAAA,MACrB,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC1B;AAEA,WAAO,KAAK;AAAA,EACd;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/resources/subscribers.ts","../src/index.ts"],"sourcesContent":["import type { ErrorResponse } from \"./types\";\n\nexport class WaitKitError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public issues?: Array<{ path: string; message: string }>,\n ) {\n super(message);\n this.name = \"WaitKitError\";\n }\n\n static fromResponse(res: ErrorResponse): WaitKitError {\n return new WaitKitError(res.message, res.statusCode, res.issues);\n }\n}\n","import type { ApiResponse, ErrorResponse, SuccessResponse } from \"./types\";\nimport { WaitKitError } from \"./errors\";\n\nexport class HttpClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n headers?: Record<string, string>;\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n const json: ApiResponse<T> = await res.json();\n\n if (!res.ok || json.status === \"error\") {\n const err = json as ErrorResponse;\n throw WaitKitError.fromResponse(err);\n }\n\n return (json as SuccessResponse<T>).data;\n }\n}\n","import { HttpClient } from \"../client\";\nimport type { JoinOptions, JoinResult } from \"../types\";\n\nexport class SubscribersResource {\n private client: HttpClient;\n private apiKey: string;\n private projectSlug: string;\n\n constructor(client: HttpClient, apiKey: string, projectSlug: string) {\n this.client = client;\n this.apiKey = apiKey;\n this.projectSlug = projectSlug;\n }\n\n private get headers() {\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n async create(options: JoinOptions): Promise<JoinResult> {\n const data = await this.client.request<{ email: string }>(\n \"POST\",\n `/api/waitlist/${this.projectSlug}/join`,\n { headers: this.headers, body: options },\n );\n\n return {\n message: \"Thank you for joining the waitlist!\",\n email: data.email,\n };\n }\n\n async count(projectSlug?: string): Promise<number> {\n const slug = projectSlug ?? this.projectSlug;\n const data = await this.client.request<{ count: number }>(\n \"GET\",\n `/api/waitlist/${slug}/count`,\n { headers: this.headers },\n );\n\n return data.count;\n }\n}\n","import { HttpClient } from \"./client\";\nimport { SubscribersResource } from \"./resources/subscribers\";\nimport type { WaitKitConfig } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.waitkit.dev\";\n\nexport class WaitKit {\n subscribers: SubscribersResource;\n private client: HttpClient;\n private apiKey: string;\n private projectSlug: string;\n\n constructor(config: WaitKitConfig) {\n this.apiKey = config.apiKey;\n this.projectSlug = config.projectSlug;\n this.client = new HttpClient(config.baseUrl ?? DEFAULT_BASE_URL);\n this.subscribers = new SubscribersResource(\n this.client,\n this.apiKey,\n this.projectSlug,\n );\n }\n}\n"],"mappings":";AAEO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YACE,SACO,YACA,QACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AAAA,EALS;AAAA,EACA;AAAA,EAMT,OAAO,aAAa,KAAkC;AACpD,WAAO,IAAI,cAAa,IAAI,SAAS,IAAI,YAAY,IAAI,MAAM;AAAA,EACjE;AACF;;;ACZO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAER,YAAY,SAAiB;AAC3B,SAAK,UAAU,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AAAA,EAEA,MAAM,QACJ,QACA,MACA,UAII,CAAC,GACO;AACZ,UAAM,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAAI,EAAE;AAE5C,QAAI,QAAQ,OAAO;AACjB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,YAAI,UAAU,QAAW;AACvB,cAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MACtC;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,IACtD,CAAC;AAED,UAAM,OAAuB,MAAM,IAAI,KAAK;AAE5C,QAAI,CAAC,IAAI,MAAM,KAAK,WAAW,SAAS;AACtC,YAAM,MAAM;AACZ,YAAM,aAAa,aAAa,GAAG;AAAA,IACrC;AAEA,WAAQ,KAA4B;AAAA,EACtC;AACF;;;AC5CO,IAAM,sBAAN,MAA0B;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAoB,QAAgB,aAAqB;AACnE,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAY,UAAU;AACpB,WAAO,EAAE,eAAe,UAAU,KAAK,MAAM,GAAG;AAAA,EAClD;AAAA,EAEA,MAAM,OAAO,SAA2C;AACtD,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,iBAAiB,KAAK,WAAW;AAAA,MACjC,EAAE,SAAS,KAAK,SAAS,MAAM,QAAQ;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,aAAuC;AACjD,UAAM,OAAO,eAAe,KAAK;AACjC,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,iBAAiB,IAAI;AAAA,MACrB,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC1B;AAEA,WAAO,KAAK;AAAA,EACd;AACF;;;ACrCA,IAAM,mBAAmB;AAElB,IAAM,UAAN,MAAc;AAAA,EACnB;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAuB;AACjC,SAAK,SAAS,OAAO;AACrB,SAAK,cAAc,OAAO;AAC1B,SAAK,SAAS,IAAI,WAAW,OAAO,WAAW,gBAAgB;AAC/D,SAAK,cAAc,IAAI;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
package/dist/react.cjs CHANGED
@@ -34,7 +34,7 @@ function useWaitlist(wk) {
34
34
  try {
35
35
  setIsLoading(true);
36
36
  setError(null);
37
- const result = await wk.count();
37
+ const result = await wk.subscribers.count();
38
38
  setCount(result);
39
39
  } catch (err) {
40
40
  setError(err instanceof Error ? err : new Error("Failed to fetch count"));
@@ -50,7 +50,7 @@ function useWaitlist(wk) {
50
50
  setIsJoining(true);
51
51
  setError(null);
52
52
  try {
53
- const result = await wk.join(data);
53
+ const result = await wk.subscribers.create(data);
54
54
  await fetchCount();
55
55
  return result;
56
56
  } catch (err) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.ts"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { WaitKit } from \"./index\";\nimport type { JoinOptions, JoinResult } from \"./types\";\n\nexport interface UseWaitlistReturn {\n join: (data: JoinOptions) => Promise<JoinResult>;\n count: number | null;\n isJoining: boolean;\n isLoading: boolean;\n error: Error | null;\n refetchCount: () => Promise<void>;\n}\n\nexport function useWaitlist(wk: WaitKit): UseWaitlistReturn {\n const [count, setCount] = useState<number | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isJoining, setIsJoining] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchCount = useCallback(async () => {\n try {\n setIsLoading(true);\n setError(null);\n const result = await wk.count();\n setCount(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch count\"));\n } finally {\n setIsLoading(false);\n }\n }, [wk]);\n\n useEffect(() => {\n fetchCount();\n }, [fetchCount]);\n\n const join = useCallback(\n async (data: JoinOptions): Promise<JoinResult> => {\n setIsJoining(true);\n setError(null);\n try {\n const result = await wk.join(data);\n await fetchCount();\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to join waitlist\");\n setError(error);\n throw error;\n } finally {\n setIsJoining(false);\n }\n },\n [wk, fetchCount],\n );\n\n return {\n join,\n count,\n isJoining,\n isLoading,\n error,\n refetchCount: fetchCount,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAiD;AAa1C,SAAS,YAAY,IAAgC;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AACtD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAC/C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,IAAI;AAErD,QAAM,iBAAa,0BAAY,YAAY;AACzC,QAAI;AACF,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,YAAM,SAAS,MAAM,GAAG,MAAM;AAC9B,eAAS,MAAM;AAAA,IACjB,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,uBAAuB,CAAC;AAAA,IAC1E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AAEP,8BAAU,MAAM;AACd,eAAW;AAAA,EACb,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,WAAO;AAAA,IACX,OAAO,SAA2C;AAChD,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,SAAS,MAAM,GAAG,KAAK,IAAI;AACjC,cAAM,WAAW;AACjB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAMA,SACJ,eAAe,QAAQ,MAAM,IAAI,MAAM,yBAAyB;AAClE,iBAASA,MAAK;AACd,cAAMA;AAAA,MACR,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,IAAI,UAAU;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB;AACF;","names":["error"]}
1
+ {"version":3,"sources":["../src/react.ts"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { WaitKit } from \"./index\";\nimport type { JoinOptions, JoinResult } from \"./types\";\n\nexport interface UseWaitlistReturn {\n join: (data: JoinOptions) => Promise<JoinResult>;\n count: number | null;\n isJoining: boolean;\n isLoading: boolean;\n error: Error | null;\n refetchCount: () => Promise<void>;\n}\n\nexport function useWaitlist(wk: WaitKit): UseWaitlistReturn {\n const [count, setCount] = useState<number | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isJoining, setIsJoining] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchCount = useCallback(async () => {\n try {\n setIsLoading(true);\n setError(null);\n const result = await wk.subscribers.count();\n setCount(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch count\"));\n } finally {\n setIsLoading(false);\n }\n }, [wk]);\n\n useEffect(() => {\n fetchCount();\n }, [fetchCount]);\n\n const join = useCallback(\n async (data: JoinOptions): Promise<JoinResult> => {\n setIsJoining(true);\n setError(null);\n try {\n const result = await wk.subscribers.create(data);\n await fetchCount();\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to join waitlist\");\n setError(error);\n throw error;\n } finally {\n setIsJoining(false);\n }\n },\n [wk, fetchCount],\n );\n\n return {\n join,\n count,\n isJoining,\n isLoading,\n error,\n refetchCount: fetchCount,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAiD;AAa1C,SAAS,YAAY,IAAgC;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AACtD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAC/C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,IAAI;AAErD,QAAM,iBAAa,0BAAY,YAAY;AACzC,QAAI;AACF,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,YAAM,SAAS,MAAM,GAAG,YAAY,MAAM;AAC1C,eAAS,MAAM;AAAA,IACjB,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,uBAAuB,CAAC;AAAA,IAC1E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AAEP,8BAAU,MAAM;AACd,eAAW;AAAA,EACb,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,WAAO;AAAA,IACX,OAAO,SAA2C;AAChD,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,SAAS,MAAM,GAAG,YAAY,OAAO,IAAI;AAC/C,cAAM,WAAW;AACjB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAMA,SACJ,eAAe,QAAQ,MAAM,IAAI,MAAM,yBAAyB;AAClE,iBAASA,MAAK;AACd,cAAMA;AAAA,MACR,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,IAAI,UAAU;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB;AACF;","names":["error"]}
package/dist/react.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { J as JoinOptions, a as JoinResult, W as WaitKit } from './index-5GjaWT5y.cjs';
1
+ import { J as JoinOptions, a as JoinResult, W as WaitKit } from './index-B-G7fuyH.cjs';
2
2
 
3
3
  interface UseWaitlistReturn {
4
4
  join: (data: JoinOptions) => Promise<JoinResult>;
package/dist/react.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { J as JoinOptions, a as JoinResult, W as WaitKit } from './index-5GjaWT5y.js';
1
+ import { J as JoinOptions, a as JoinResult, W as WaitKit } from './index-B-G7fuyH.js';
2
2
 
3
3
  interface UseWaitlistReturn {
4
4
  join: (data: JoinOptions) => Promise<JoinResult>;
package/dist/react.js CHANGED
@@ -11,7 +11,7 @@ function useWaitlist(wk) {
11
11
  try {
12
12
  setIsLoading(true);
13
13
  setError(null);
14
- const result = await wk.count();
14
+ const result = await wk.subscribers.count();
15
15
  setCount(result);
16
16
  } catch (err) {
17
17
  setError(err instanceof Error ? err : new Error("Failed to fetch count"));
@@ -27,7 +27,7 @@ function useWaitlist(wk) {
27
27
  setIsJoining(true);
28
28
  setError(null);
29
29
  try {
30
- const result = await wk.join(data);
30
+ const result = await wk.subscribers.create(data);
31
31
  await fetchCount();
32
32
  return result;
33
33
  } catch (err) {
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.ts"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { WaitKit } from \"./index\";\nimport type { JoinOptions, JoinResult } from \"./types\";\n\nexport interface UseWaitlistReturn {\n join: (data: JoinOptions) => Promise<JoinResult>;\n count: number | null;\n isJoining: boolean;\n isLoading: boolean;\n error: Error | null;\n refetchCount: () => Promise<void>;\n}\n\nexport function useWaitlist(wk: WaitKit): UseWaitlistReturn {\n const [count, setCount] = useState<number | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isJoining, setIsJoining] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchCount = useCallback(async () => {\n try {\n setIsLoading(true);\n setError(null);\n const result = await wk.count();\n setCount(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch count\"));\n } finally {\n setIsLoading(false);\n }\n }, [wk]);\n\n useEffect(() => {\n fetchCount();\n }, [fetchCount]);\n\n const join = useCallback(\n async (data: JoinOptions): Promise<JoinResult> => {\n setIsJoining(true);\n setError(null);\n try {\n const result = await wk.join(data);\n await fetchCount();\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to join waitlist\");\n setError(error);\n throw error;\n } finally {\n setIsJoining(false);\n }\n },\n [wk, fetchCount],\n );\n\n return {\n join,\n count,\n isJoining,\n isLoading,\n error,\n refetchCount: fetchCount,\n };\n}\n"],"mappings":";;;AAEA,SAAS,UAAU,WAAW,mBAAmB;AAa1C,SAAS,YAAY,IAAgC;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AAErD,QAAM,aAAa,YAAY,YAAY;AACzC,QAAI;AACF,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,YAAM,SAAS,MAAM,GAAG,MAAM;AAC9B,eAAS,MAAM;AAAA,IACjB,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,uBAAuB,CAAC;AAAA,IAC1E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AAEP,YAAU,MAAM;AACd,eAAW;AAAA,EACb,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,OAAO;AAAA,IACX,OAAO,SAA2C;AAChD,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,SAAS,MAAM,GAAG,KAAK,IAAI;AACjC,cAAM,WAAW;AACjB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAMA,SACJ,eAAe,QAAQ,MAAM,IAAI,MAAM,yBAAyB;AAClE,iBAASA,MAAK;AACd,cAAMA;AAAA,MACR,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,IAAI,UAAU;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB;AACF;","names":["error"]}
1
+ {"version":3,"sources":["../src/react.ts"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { WaitKit } from \"./index\";\nimport type { JoinOptions, JoinResult } from \"./types\";\n\nexport interface UseWaitlistReturn {\n join: (data: JoinOptions) => Promise<JoinResult>;\n count: number | null;\n isJoining: boolean;\n isLoading: boolean;\n error: Error | null;\n refetchCount: () => Promise<void>;\n}\n\nexport function useWaitlist(wk: WaitKit): UseWaitlistReturn {\n const [count, setCount] = useState<number | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isJoining, setIsJoining] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchCount = useCallback(async () => {\n try {\n setIsLoading(true);\n setError(null);\n const result = await wk.subscribers.count();\n setCount(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch count\"));\n } finally {\n setIsLoading(false);\n }\n }, [wk]);\n\n useEffect(() => {\n fetchCount();\n }, [fetchCount]);\n\n const join = useCallback(\n async (data: JoinOptions): Promise<JoinResult> => {\n setIsJoining(true);\n setError(null);\n try {\n const result = await wk.subscribers.create(data);\n await fetchCount();\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to join waitlist\");\n setError(error);\n throw error;\n } finally {\n setIsJoining(false);\n }\n },\n [wk, fetchCount],\n );\n\n return {\n join,\n count,\n isJoining,\n isLoading,\n error,\n refetchCount: fetchCount,\n };\n}\n"],"mappings":";;;AAEA,SAAS,UAAU,WAAW,mBAAmB;AAa1C,SAAS,YAAY,IAAgC;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AAErD,QAAM,aAAa,YAAY,YAAY;AACzC,QAAI;AACF,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,YAAM,SAAS,MAAM,GAAG,YAAY,MAAM;AAC1C,eAAS,MAAM;AAAA,IACjB,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,uBAAuB,CAAC;AAAA,IAC1E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AAEP,YAAU,MAAM;AACd,eAAW;AAAA,EACb,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,OAAO;AAAA,IACX,OAAO,SAA2C;AAChD,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,SAAS,MAAM,GAAG,YAAY,OAAO,IAAI;AAC/C,cAAM,WAAW;AACjB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAMA,SACJ,eAAe,QAAQ,MAAM,IAAI,MAAM,yBAAyB;AAClE,iBAASA,MAAK;AACd,cAAMA;AAAA,MACR,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,IAAI,UAAU;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB;AACF;","names":["error"]}
package/package.json CHANGED
@@ -1,13 +1,29 @@
1
1
  {
2
2
  "name": "waitkit",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "WaitKit SDK — waitlist infrastructure for your app",
5
5
  "keywords": [
6
6
  "waitkit",
7
- "waitlist"
7
+ "waitlist",
8
+ "sdk",
9
+ "api-client",
10
+ "saas",
11
+ "signup",
12
+ "subscribers"
8
13
  ],
9
14
  "license": "ISC",
10
- "author": "ubeyidah",
15
+ "author": {
16
+ "name": "ubeyidah",
17
+ "url": "https://github.com/ubeyidah"
18
+ },
19
+ "homepage": "https://waitkit.dev",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/ubeyidah/waitkit.git"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/ubeyidah/waitkit/issues"
26
+ },
11
27
  "sideEffects": false,
12
28
  "type": "module",
13
29
  "exports": {