waitkit 0.1.0 → 0.2.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 +68 -0
- package/dist/{index-5GjaWT5y.d.cts → index-B-G7fuyH.d.cts} +21 -3
- package/dist/{index-5GjaWT5y.d.ts → index-B-G7fuyH.d.ts} +21 -3
- package/dist/index.cjs +26 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +26 -8
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +2 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +2 -2
- package/dist/react.js.map +1 -1
- package/package.json +19 -3
package/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
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
|
|
22
|
+
await wk.subscribers.create({ email: "user@example.com" });
|
|
23
|
+
|
|
24
|
+
// Get subscriber count
|
|
25
|
+
const count = await wk.subscribers.count();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### React
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
import { WaitKit } from "waitkit";
|
|
32
|
+
import { useWaitlist } from "waitkit/react";
|
|
33
|
+
|
|
34
|
+
const wk = new WaitKit({ apiKey: "wk_...", projectSlug: "my-project" });
|
|
35
|
+
|
|
36
|
+
function WaitlistForm() {
|
|
37
|
+
const { join, count, isJoining, error } = useWaitlist(wk);
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<form onSubmit={() => join({ email: "user@example.com" })}>
|
|
41
|
+
<p>Joined: {count}</p>
|
|
42
|
+
<button disabled={isJoining} type="submit">
|
|
43
|
+
Join
|
|
44
|
+
</button>
|
|
45
|
+
{error && <p>{error.message}</p>}
|
|
46
|
+
</form>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## API
|
|
52
|
+
|
|
53
|
+
### `wk.subscribers.create(options)`
|
|
54
|
+
|
|
55
|
+
| Param | Type | Required |
|
|
56
|
+
| ---------- | ------------------------- | -------- |
|
|
57
|
+
| `email` | `string` | yes |
|
|
58
|
+
| `name` | `string` | no |
|
|
59
|
+
| `source` | `string` | no |
|
|
60
|
+
| `metadata` | `Record<string, unknown>` | no |
|
|
61
|
+
|
|
62
|
+
### `wk.subscribers.count(projectSlug?)`
|
|
63
|
+
|
|
64
|
+
Returns total subscriber count. Optionally pass a different project slug.
|
|
65
|
+
|
|
66
|
+
## License
|
|
67
|
+
|
|
68
|
+
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
|
|
27
|
+
declare class SubscribersResource {
|
|
18
28
|
private client;
|
|
19
29
|
private apiKey;
|
|
20
30
|
private projectSlug;
|
|
21
|
-
constructor(
|
|
31
|
+
constructor(client: HttpClient, apiKey: string, projectSlug: string);
|
|
22
32
|
private get headers();
|
|
23
|
-
|
|
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
|
|
27
|
+
declare class SubscribersResource {
|
|
18
28
|
private client;
|
|
19
29
|
private apiKey;
|
|
20
30
|
private projectSlug;
|
|
21
|
-
constructor(
|
|
31
|
+
constructor(client: HttpClient, apiKey: string, projectSlug: string);
|
|
22
32
|
private get headers();
|
|
23
|
-
|
|
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/
|
|
75
|
-
var
|
|
76
|
-
var WaitKit = class {
|
|
74
|
+
// src/resources/subscribers.ts
|
|
75
|
+
var SubscribersResource = class {
|
|
77
76
|
client;
|
|
78
77
|
apiKey;
|
|
79
78
|
projectSlug;
|
|
80
|
-
constructor(
|
|
81
|
-
this.
|
|
82
|
-
this.
|
|
83
|
-
this.
|
|
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
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["import { HttpClient } from \"./client\";\nimport type {
|
|
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-
|
|
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-
|
|
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/
|
|
49
|
-
var
|
|
50
|
-
var WaitKit = class {
|
|
48
|
+
// src/resources/subscribers.ts
|
|
49
|
+
var SubscribersResource = class {
|
|
51
50
|
client;
|
|
52
51
|
apiKey;
|
|
53
52
|
projectSlug;
|
|
54
|
-
constructor(
|
|
55
|
-
this.
|
|
56
|
-
this.
|
|
57
|
-
this.
|
|
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
|
|
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 \"
|
|
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.
|
|
53
|
+
const result = await wk.subscribers.create(data);
|
|
54
54
|
await fetchCount();
|
|
55
55
|
return result;
|
|
56
56
|
} catch (err) {
|
package/dist/react.cjs.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.
|
|
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
package/dist/react.d.ts
CHANGED
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.
|
|
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.
|
|
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.
|
|
3
|
+
"version": "0.2.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":
|
|
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": {
|