@goodparty_org/sdk 0.0.7 → 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.
package/README.md CHANGED
@@ -11,9 +11,35 @@ npm install @goodparty_org/sdk
11
11
  ## Usage
12
12
 
13
13
  ```typescript
14
- import { GoodPartyClient } from '@goodparty_org/sdk'
14
+ import { GoodPartyClient, SdkError } from '@goodparty_org/sdk'
15
15
 
16
- const client = new GoodPartyClient()
16
+ const client = await GoodPartyClient.create({
17
+ m2mSecret: process.env.GP_MACHINE_SECRET,
18
+ gpApiRootUrl: 'https://gp-api.goodparty.org/v1',
19
+ })
20
+
21
+ const user = await client.users.get(1)
22
+
23
+ const users = await client.users.list({ page: 1, limit: 20 })
24
+
25
+ await client.users.updatePassword(1, {
26
+ oldPassword: 'old',
27
+ newPassword: 'new',
28
+ })
29
+
30
+ await client.users.delete(1)
31
+ ```
32
+
33
+ All methods throw `SdkError` on failure:
34
+
35
+ ```typescript
36
+ try {
37
+ const user = await client.users.get(999)
38
+ } catch (error) {
39
+ if (error instanceof SdkError) {
40
+ console.error(error.status, error.message)
41
+ }
42
+ }
17
43
  ```
18
44
 
19
45
  ## Development
@@ -32,6 +58,7 @@ npm install
32
58
 
33
59
  | Command | Description |
34
60
  | -------------------- | ------------------------------------ |
61
+ | `npm run dev` | Build in watch mode for local dev |
35
62
  | `npm run build` | Build the SDK with tsup |
36
63
  | `npm run typecheck` | Run TypeScript type checking |
37
64
  | `npm run lint` | Run ESLint |
package/dist/index.d.mts CHANGED
@@ -1,6 +1,101 @@
1
- type GoodPartyClientConfig = Record<string, never>;
1
+ import { FetchOptions } from 'ofetch';
2
+
3
+ declare class SdkError extends Error {
4
+ readonly status: number;
5
+ readonly response?: Response;
6
+ constructor(status: number, message: string, response?: Response);
7
+ }
8
+ type PaginationOptions = {
9
+ page?: number;
10
+ limit?: number;
11
+ };
12
+ type PaginationMeta = {
13
+ page: number;
14
+ limit: number;
15
+ total: number;
16
+ totalPages: number;
17
+ };
18
+ type PaginatedList<T> = {
19
+ data: T[];
20
+ pagination: PaginationMeta;
21
+ };
22
+
23
+ declare enum UserRole {
24
+ admin = "admin",
25
+ sales = "sales",
26
+ candidate = "candidate",
27
+ campaignManager = "campaignManager",
28
+ demo = "demo"
29
+ }
30
+ declare enum WhyBrowsing {
31
+ considering = "considering",
32
+ learning = "learning",
33
+ test = "test",
34
+ else = "else"
35
+ }
36
+ type UserMetaData = {
37
+ customerId?: string;
38
+ checkoutSessionId?: string | null;
39
+ accountType?: string | null;
40
+ lastVisited?: number;
41
+ sessionCount?: number;
42
+ isDeleted?: boolean;
43
+ fsUserId?: string;
44
+ whyBrowsing?: WhyBrowsing | null;
45
+ hubspotId?: string;
46
+ profile_updated_count?: number;
47
+ textNotifications?: boolean;
48
+ } | null;
49
+ type User = {
50
+ id: number;
51
+ firstName: string;
52
+ lastName: string;
53
+ name?: string | null;
54
+ email: string;
55
+ phone?: string | null;
56
+ zip?: string | null;
57
+ avatar?: string | null;
58
+ hasPassword: boolean;
59
+ roles?: UserRole[];
60
+ metaData?: UserMetaData;
61
+ };
62
+ type UpdatePasswordInput = {
63
+ oldPassword?: string;
64
+ newPassword: string;
65
+ };
66
+
67
+ type OfetchRequestBody = FetchOptions<'json'>['body'];
68
+ declare class HttpClient {
69
+ private baseUrl;
70
+ private m2mToken;
71
+ constructor(gpApiRootUrl: string, m2mToken: string);
72
+ request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
73
+ }
74
+
75
+ declare abstract class BaseResource {
76
+ protected httpClient: HttpClient;
77
+ constructor(httpClient: HttpClient);
78
+ protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
79
+ protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
80
+ protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
81
+ protected deleteRequest: <T>(path: string) => Promise<T>;
82
+ }
83
+
84
+ declare class UsersResource extends BaseResource {
85
+ list: (options?: PaginationOptions) => Promise<PaginatedList<User>>;
86
+ get: (id: number) => Promise<User>;
87
+ delete: (id: number) => Promise<void>;
88
+ updatePassword: (id: number, input: UpdatePasswordInput) => Promise<void>;
89
+ }
90
+
91
+ type GoodPartyClientConfig = {
92
+ m2mSecret: string;
93
+ gpApiRootUrl: string;
94
+ };
2
95
  declare class GoodPartyClient {
3
- constructor(_config?: GoodPartyClientConfig);
96
+ readonly users: UsersResource;
97
+ private constructor();
98
+ static create: (config: GoodPartyClientConfig) => Promise<GoodPartyClient>;
4
99
  }
5
100
 
6
- export { GoodPartyClient, type GoodPartyClientConfig };
101
+ export { GoodPartyClient, type GoodPartyClientConfig, type PaginatedList, type PaginationMeta, type PaginationOptions, SdkError, type UpdatePasswordInput, type User, type UserMetaData, UserRole, WhyBrowsing };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,101 @@
1
- type GoodPartyClientConfig = Record<string, never>;
1
+ import { FetchOptions } from 'ofetch';
2
+
3
+ declare class SdkError extends Error {
4
+ readonly status: number;
5
+ readonly response?: Response;
6
+ constructor(status: number, message: string, response?: Response);
7
+ }
8
+ type PaginationOptions = {
9
+ page?: number;
10
+ limit?: number;
11
+ };
12
+ type PaginationMeta = {
13
+ page: number;
14
+ limit: number;
15
+ total: number;
16
+ totalPages: number;
17
+ };
18
+ type PaginatedList<T> = {
19
+ data: T[];
20
+ pagination: PaginationMeta;
21
+ };
22
+
23
+ declare enum UserRole {
24
+ admin = "admin",
25
+ sales = "sales",
26
+ candidate = "candidate",
27
+ campaignManager = "campaignManager",
28
+ demo = "demo"
29
+ }
30
+ declare enum WhyBrowsing {
31
+ considering = "considering",
32
+ learning = "learning",
33
+ test = "test",
34
+ else = "else"
35
+ }
36
+ type UserMetaData = {
37
+ customerId?: string;
38
+ checkoutSessionId?: string | null;
39
+ accountType?: string | null;
40
+ lastVisited?: number;
41
+ sessionCount?: number;
42
+ isDeleted?: boolean;
43
+ fsUserId?: string;
44
+ whyBrowsing?: WhyBrowsing | null;
45
+ hubspotId?: string;
46
+ profile_updated_count?: number;
47
+ textNotifications?: boolean;
48
+ } | null;
49
+ type User = {
50
+ id: number;
51
+ firstName: string;
52
+ lastName: string;
53
+ name?: string | null;
54
+ email: string;
55
+ phone?: string | null;
56
+ zip?: string | null;
57
+ avatar?: string | null;
58
+ hasPassword: boolean;
59
+ roles?: UserRole[];
60
+ metaData?: UserMetaData;
61
+ };
62
+ type UpdatePasswordInput = {
63
+ oldPassword?: string;
64
+ newPassword: string;
65
+ };
66
+
67
+ type OfetchRequestBody = FetchOptions<'json'>['body'];
68
+ declare class HttpClient {
69
+ private baseUrl;
70
+ private m2mToken;
71
+ constructor(gpApiRootUrl: string, m2mToken: string);
72
+ request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
73
+ }
74
+
75
+ declare abstract class BaseResource {
76
+ protected httpClient: HttpClient;
77
+ constructor(httpClient: HttpClient);
78
+ protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
79
+ protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
80
+ protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
81
+ protected deleteRequest: <T>(path: string) => Promise<T>;
82
+ }
83
+
84
+ declare class UsersResource extends BaseResource {
85
+ list: (options?: PaginationOptions) => Promise<PaginatedList<User>>;
86
+ get: (id: number) => Promise<User>;
87
+ delete: (id: number) => Promise<void>;
88
+ updatePassword: (id: number, input: UpdatePasswordInput) => Promise<void>;
89
+ }
90
+
91
+ type GoodPartyClientConfig = {
92
+ m2mSecret: string;
93
+ gpApiRootUrl: string;
94
+ };
2
95
  declare class GoodPartyClient {
3
- constructor(_config?: GoodPartyClientConfig);
96
+ readonly users: UsersResource;
97
+ private constructor();
98
+ static create: (config: GoodPartyClientConfig) => Promise<GoodPartyClient>;
4
99
  }
5
100
 
6
- export { GoodPartyClient, type GoodPartyClientConfig };
101
+ export { GoodPartyClient, type GoodPartyClientConfig, type PaginatedList, type PaginationMeta, type PaginationOptions, SdkError, type UpdatePasswordInput, type User, type UserMetaData, UserRole, WhyBrowsing };
package/dist/index.js CHANGED
@@ -20,18 +20,139 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- GoodPartyClient: () => GoodPartyClient
23
+ GoodPartyClient: () => GoodPartyClient,
24
+ SdkError: () => SdkError,
25
+ UserRole: () => UserRole,
26
+ WhyBrowsing: () => WhyBrowsing
24
27
  });
25
28
  module.exports = __toCommonJS(index_exports);
26
29
 
27
30
  // src/GoodPartyClient.ts
28
- var GoodPartyClient = class {
29
- constructor(_config) {
30
- console.log("hello world!");
31
+ var import_backend = require("@clerk/backend");
32
+
33
+ // src/http/HttpClient.ts
34
+ var import_ofetch = require("ofetch");
35
+
36
+ // src/types/result.ts
37
+ var SdkError = class extends Error {
38
+ status;
39
+ response;
40
+ constructor(status, message, response) {
41
+ super(message);
42
+ this.name = "SdkError";
43
+ this.status = status;
44
+ this.response = response;
45
+ }
46
+ };
47
+
48
+ // src/http/HttpClient.ts
49
+ var HttpClient = class {
50
+ baseUrl;
51
+ m2mToken;
52
+ constructor(gpApiRootUrl, m2mToken) {
53
+ this.baseUrl = gpApiRootUrl;
54
+ this.m2mToken = m2mToken;
55
+ }
56
+ request = async (path, init) => {
57
+ try {
58
+ return await (0, import_ofetch.ofetch)(path, {
59
+ baseURL: this.baseUrl,
60
+ headers: {
61
+ Authorization: `Bearer ${this.m2mToken}`,
62
+ ...init?.headers ?? {}
63
+ },
64
+ ...init
65
+ });
66
+ } catch (error) {
67
+ if (error instanceof import_ofetch.FetchError) {
68
+ throw new SdkError(error.statusCode ?? 0, error.message, error.response);
69
+ }
70
+ const message = error instanceof Error ? error.message : "Unknown error";
71
+ throw new SdkError(0, message);
72
+ }
73
+ };
74
+ };
75
+
76
+ // src/resources/BaseResource.ts
77
+ var BaseResource = class {
78
+ httpClient;
79
+ constructor(httpClient) {
80
+ this.httpClient = httpClient;
31
81
  }
82
+ getRequest = (path, query) => this.httpClient.request(path, { method: "GET", query });
83
+ postRequest = (path, body) => this.httpClient.request(path, { method: "POST", body });
84
+ putRequest = (path, body) => this.httpClient.request(path, { method: "PUT", body });
85
+ deleteRequest = (path) => this.httpClient.request(path, { method: "DELETE" });
32
86
  };
87
+
88
+ // src/resources/UsersResource.ts
89
+ var UsersResource = class extends BaseResource {
90
+ list = async (options) => {
91
+ const { data, meta: pagination } = await this.getRequest("/users", options);
92
+ return {
93
+ data,
94
+ pagination
95
+ };
96
+ };
97
+ get = (id) => this.getRequest(`/users/${id}`);
98
+ delete = (id) => this.deleteRequest(`/users/${id}`);
99
+ updatePassword = (id, input) => this.putRequest(`/users/${id}/password`, input);
100
+ };
101
+
102
+ // src/GoodPartyClient.ts
103
+ var GoodPartyClient = class _GoodPartyClient {
104
+ users;
105
+ constructor(gpApiRootUrl, m2mToken) {
106
+ const httpClient = new HttpClient(gpApiRootUrl, m2mToken);
107
+ this.users = new UsersResource(httpClient);
108
+ }
109
+ static create = async (config) => {
110
+ const { m2mSecret, gpApiRootUrl } = config;
111
+ const clerkClient = (0, import_backend.createClerkClient)({});
112
+ let token;
113
+ try {
114
+ const m2mToken = await clerkClient.m2m.createToken({
115
+ machineSecretKey: m2mSecret
116
+ });
117
+ if (!m2mToken.token) {
118
+ throw new SdkError(
119
+ 0,
120
+ "Clerk M2M token creation succeeded but returned no token string"
121
+ );
122
+ }
123
+ token = m2mToken.token;
124
+ } catch (error) {
125
+ if (error instanceof SdkError) {
126
+ throw error;
127
+ }
128
+ const message = error instanceof Error ? error.message : "Unknown error";
129
+ throw new SdkError(0, `Failed to create Clerk M2M token: ${message}`);
130
+ }
131
+ return new _GoodPartyClient(gpApiRootUrl, token);
132
+ };
133
+ };
134
+
135
+ // src/types/user.ts
136
+ var UserRole = /* @__PURE__ */ ((UserRole2) => {
137
+ UserRole2["admin"] = "admin";
138
+ UserRole2["sales"] = "sales";
139
+ UserRole2["candidate"] = "candidate";
140
+ UserRole2["campaignManager"] = "campaignManager";
141
+ UserRole2["demo"] = "demo";
142
+ return UserRole2;
143
+ })(UserRole || {});
144
+ var WhyBrowsing = /* @__PURE__ */ ((WhyBrowsing2) => {
145
+ WhyBrowsing2["considering"] = "considering";
146
+ WhyBrowsing2["learning"] = "learning";
147
+ WhyBrowsing2["test"] = "test";
148
+ WhyBrowsing2["else"] = "else";
149
+ return WhyBrowsing2;
150
+ })(WhyBrowsing || {});
33
151
  // Annotate the CommonJS export names for ESM import in node:
34
152
  0 && (module.exports = {
35
- GoodPartyClient
153
+ GoodPartyClient,
154
+ SdkError,
155
+ UserRole,
156
+ WhyBrowsing
36
157
  });
37
158
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/GoodPartyClient.ts"],"sourcesContent":["export { GoodPartyClient } from './GoodPartyClient'\nexport type { GoodPartyClientConfig } from './GoodPartyClient'\n","export type GoodPartyClientConfig = Record<string, never>\n\nexport class GoodPartyClient {\n constructor(_config?: GoodPartyClientConfig) {\n console.log('hello world!')\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAY,SAAiC;AAC3C,YAAQ,IAAI,cAAc;AAAA,EAC5B;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/GoodPartyClient.ts","../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/UsersResource.ts","../src/types/user.ts"],"sourcesContent":["export { GoodPartyClient } from './GoodPartyClient'\nexport type { GoodPartyClientConfig } from './GoodPartyClient'\n\nexport { SdkError } from './types/result'\nexport type {\n PaginationOptions,\n PaginationMeta,\n PaginatedList,\n} from './types/result'\n\nexport type { User, UserMetaData, UpdatePasswordInput } from './types/user'\n\nexport { UserRole, WhyBrowsing } from './types/user'\n","import { createClerkClient } from '@clerk/backend'\nimport { HttpClient } from './http/HttpClient'\nimport { UsersResource } from './resources/UsersResource'\nimport { SdkError } from './types/result'\n\nexport type GoodPartyClientConfig = {\n m2mSecret: string\n gpApiRootUrl: string\n}\n\nexport class GoodPartyClient {\n readonly users: UsersResource\n\n private constructor(gpApiRootUrl: string, m2mToken: string) {\n const httpClient = new HttpClient(gpApiRootUrl, m2mToken)\n this.users = new UsersResource(httpClient)\n }\n\n static create = async (\n config: GoodPartyClientConfig,\n ): Promise<GoodPartyClient> => {\n const { m2mSecret, gpApiRootUrl } = config\n const clerkClient = createClerkClient({})\n\n let token: string\n try {\n const m2mToken = await clerkClient.m2m.createToken({\n machineSecretKey: m2mSecret,\n })\n if (!m2mToken.token) {\n throw new SdkError(\n 0,\n 'Clerk M2M token creation succeeded but returned no token string',\n )\n }\n token = m2mToken.token\n } catch (error: unknown) {\n if (error instanceof SdkError) {\n throw error\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, `Failed to create Clerk M2M token: ${message}`)\n }\n\n return new GoodPartyClient(gpApiRootUrl, token)\n }\n}\n","import { ofetch, FetchError, FetchOptions } from 'ofetch'\nimport { SdkError } from '../types/result'\n\nexport type OfetchRequestBody = FetchOptions<'json'>['body']\n\nexport class HttpClient {\n private baseUrl: string\n private m2mToken: string\n\n constructor(gpApiRootUrl: string, m2mToken: string) {\n this.baseUrl = gpApiRootUrl\n this.m2mToken = m2mToken\n }\n\n request = async <T>(\n path: string,\n init?: FetchOptions<'json'>,\n ): Promise<T> => {\n try {\n return await ofetch<T>(path, {\n baseURL: this.baseUrl,\n headers: {\n Authorization: `Bearer ${this.m2mToken}`,\n ...(init?.headers ?? {}),\n },\n ...init,\n })\n } catch (error: unknown) {\n if (error instanceof FetchError) {\n throw new SdkError(error.statusCode ?? 0, error.message, error.response)\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, message)\n }\n }\n}\n","export class SdkError extends Error {\n readonly status: number\n readonly response?: Response\n\n constructor(status: number, message: string, response?: Response) {\n super(message)\n this.name = 'SdkError'\n this.status = status\n this.response = response\n }\n}\n\nexport type PaginationOptions = {\n page?: number\n limit?: number\n}\n\nexport type PaginationMeta = {\n page: number\n limit: number\n total: number\n totalPages: number\n}\n\nexport type PaginatedList<T> = {\n data: T[]\n pagination: PaginationMeta\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\n\n constructor(httpClient: HttpClient) {\n this.httpClient = httpClient\n }\n\n protected getRequest = <T>(\n path: string,\n query?: FetchOptions<'json'>['query'],\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'GET', query })\n\n protected postRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'POST', body })\n\n protected putRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PUT', body })\n\n protected deleteRequest = <T>(path: string): Promise<T> =>\n this.httpClient.request<T>(path, { method: 'DELETE' })\n}\n","import type { PaginatedList, PaginationOptions } from '../types/result'\nimport type { UpdatePasswordInput, User } from '../types/user'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n list = async (options?: PaginationOptions): Promise<PaginatedList<User>> => {\n const { data, meta: pagination } = await this.getRequest<{\n data: User[]\n meta: { page: number; limit: number; total: number; totalPages: number }\n }>('/users', options)\n\n return {\n data,\n pagination,\n }\n }\n\n get = (id: number): Promise<User> => this.getRequest<User>(`/users/${id}`)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`/users/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`/users/${id}/password`, input)\n}\n","export enum UserRole {\n admin = 'admin',\n sales = 'sales',\n candidate = 'candidate',\n campaignManager = 'campaignManager',\n demo = 'demo',\n}\n\nexport enum WhyBrowsing {\n considering = 'considering',\n learning = 'learning',\n test = 'test',\n else = 'else',\n}\n\nexport type UserMetaData = {\n customerId?: string\n checkoutSessionId?: string | null\n accountType?: string | null\n lastVisited?: number\n sessionCount?: number\n isDeleted?: boolean\n fsUserId?: string\n whyBrowsing?: WhyBrowsing | null\n hubspotId?: string\n profile_updated_count?: number\n textNotifications?: boolean\n} | null\n\nexport type User = {\n id: number\n firstName: string\n lastName: string\n name?: string | null\n email: string\n phone?: string | null\n zip?: string | null\n avatar?: string | null\n hasPassword: boolean\n roles?: UserRole[]\n metaData?: UserMetaData\n}\n\nexport type UpdatePasswordInput = {\n oldPassword?: string\n newPassword: string\n}\n"],"mappings":"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","names":["UserRole","WhyBrowsing"]}
package/dist/index.mjs CHANGED
@@ -1,10 +1,128 @@
1
1
  // src/GoodPartyClient.ts
2
- var GoodPartyClient = class {
3
- constructor(_config) {
4
- console.log("hello world!");
2
+ import { createClerkClient } from "@clerk/backend";
3
+
4
+ // src/http/HttpClient.ts
5
+ import { ofetch, FetchError } from "ofetch";
6
+
7
+ // src/types/result.ts
8
+ var SdkError = class extends Error {
9
+ status;
10
+ response;
11
+ constructor(status, message, response) {
12
+ super(message);
13
+ this.name = "SdkError";
14
+ this.status = status;
15
+ this.response = response;
5
16
  }
6
17
  };
18
+
19
+ // src/http/HttpClient.ts
20
+ var HttpClient = class {
21
+ baseUrl;
22
+ m2mToken;
23
+ constructor(gpApiRootUrl, m2mToken) {
24
+ this.baseUrl = gpApiRootUrl;
25
+ this.m2mToken = m2mToken;
26
+ }
27
+ request = async (path, init) => {
28
+ try {
29
+ return await ofetch(path, {
30
+ baseURL: this.baseUrl,
31
+ headers: {
32
+ Authorization: `Bearer ${this.m2mToken}`,
33
+ ...init?.headers ?? {}
34
+ },
35
+ ...init
36
+ });
37
+ } catch (error) {
38
+ if (error instanceof FetchError) {
39
+ throw new SdkError(error.statusCode ?? 0, error.message, error.response);
40
+ }
41
+ const message = error instanceof Error ? error.message : "Unknown error";
42
+ throw new SdkError(0, message);
43
+ }
44
+ };
45
+ };
46
+
47
+ // src/resources/BaseResource.ts
48
+ var BaseResource = class {
49
+ httpClient;
50
+ constructor(httpClient) {
51
+ this.httpClient = httpClient;
52
+ }
53
+ getRequest = (path, query) => this.httpClient.request(path, { method: "GET", query });
54
+ postRequest = (path, body) => this.httpClient.request(path, { method: "POST", body });
55
+ putRequest = (path, body) => this.httpClient.request(path, { method: "PUT", body });
56
+ deleteRequest = (path) => this.httpClient.request(path, { method: "DELETE" });
57
+ };
58
+
59
+ // src/resources/UsersResource.ts
60
+ var UsersResource = class extends BaseResource {
61
+ list = async (options) => {
62
+ const { data, meta: pagination } = await this.getRequest("/users", options);
63
+ return {
64
+ data,
65
+ pagination
66
+ };
67
+ };
68
+ get = (id) => this.getRequest(`/users/${id}`);
69
+ delete = (id) => this.deleteRequest(`/users/${id}`);
70
+ updatePassword = (id, input) => this.putRequest(`/users/${id}/password`, input);
71
+ };
72
+
73
+ // src/GoodPartyClient.ts
74
+ var GoodPartyClient = class _GoodPartyClient {
75
+ users;
76
+ constructor(gpApiRootUrl, m2mToken) {
77
+ const httpClient = new HttpClient(gpApiRootUrl, m2mToken);
78
+ this.users = new UsersResource(httpClient);
79
+ }
80
+ static create = async (config) => {
81
+ const { m2mSecret, gpApiRootUrl } = config;
82
+ const clerkClient = createClerkClient({});
83
+ let token;
84
+ try {
85
+ const m2mToken = await clerkClient.m2m.createToken({
86
+ machineSecretKey: m2mSecret
87
+ });
88
+ if (!m2mToken.token) {
89
+ throw new SdkError(
90
+ 0,
91
+ "Clerk M2M token creation succeeded but returned no token string"
92
+ );
93
+ }
94
+ token = m2mToken.token;
95
+ } catch (error) {
96
+ if (error instanceof SdkError) {
97
+ throw error;
98
+ }
99
+ const message = error instanceof Error ? error.message : "Unknown error";
100
+ throw new SdkError(0, `Failed to create Clerk M2M token: ${message}`);
101
+ }
102
+ return new _GoodPartyClient(gpApiRootUrl, token);
103
+ };
104
+ };
105
+
106
+ // src/types/user.ts
107
+ var UserRole = /* @__PURE__ */ ((UserRole2) => {
108
+ UserRole2["admin"] = "admin";
109
+ UserRole2["sales"] = "sales";
110
+ UserRole2["candidate"] = "candidate";
111
+ UserRole2["campaignManager"] = "campaignManager";
112
+ UserRole2["demo"] = "demo";
113
+ return UserRole2;
114
+ })(UserRole || {});
115
+ var WhyBrowsing = /* @__PURE__ */ ((WhyBrowsing2) => {
116
+ WhyBrowsing2["considering"] = "considering";
117
+ WhyBrowsing2["learning"] = "learning";
118
+ WhyBrowsing2["test"] = "test";
119
+ WhyBrowsing2["else"] = "else";
120
+ return WhyBrowsing2;
121
+ })(WhyBrowsing || {});
7
122
  export {
8
- GoodPartyClient
123
+ GoodPartyClient,
124
+ SdkError,
125
+ UserRole,
126
+ WhyBrowsing
9
127
  };
10
128
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/GoodPartyClient.ts"],"sourcesContent":["export type GoodPartyClientConfig = Record<string, never>\n\nexport class GoodPartyClient {\n constructor(_config?: GoodPartyClientConfig) {\n console.log('hello world!')\n }\n}\n"],"mappings":";AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAY,SAAiC;AAC3C,YAAQ,IAAI,cAAc;AAAA,EAC5B;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/GoodPartyClient.ts","../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/UsersResource.ts","../src/types/user.ts"],"sourcesContent":["import { createClerkClient } from '@clerk/backend'\nimport { HttpClient } from './http/HttpClient'\nimport { UsersResource } from './resources/UsersResource'\nimport { SdkError } from './types/result'\n\nexport type GoodPartyClientConfig = {\n m2mSecret: string\n gpApiRootUrl: string\n}\n\nexport class GoodPartyClient {\n readonly users: UsersResource\n\n private constructor(gpApiRootUrl: string, m2mToken: string) {\n const httpClient = new HttpClient(gpApiRootUrl, m2mToken)\n this.users = new UsersResource(httpClient)\n }\n\n static create = async (\n config: GoodPartyClientConfig,\n ): Promise<GoodPartyClient> => {\n const { m2mSecret, gpApiRootUrl } = config\n const clerkClient = createClerkClient({})\n\n let token: string\n try {\n const m2mToken = await clerkClient.m2m.createToken({\n machineSecretKey: m2mSecret,\n })\n if (!m2mToken.token) {\n throw new SdkError(\n 0,\n 'Clerk M2M token creation succeeded but returned no token string',\n )\n }\n token = m2mToken.token\n } catch (error: unknown) {\n if (error instanceof SdkError) {\n throw error\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, `Failed to create Clerk M2M token: ${message}`)\n }\n\n return new GoodPartyClient(gpApiRootUrl, token)\n }\n}\n","import { ofetch, FetchError, FetchOptions } from 'ofetch'\nimport { SdkError } from '../types/result'\n\nexport type OfetchRequestBody = FetchOptions<'json'>['body']\n\nexport class HttpClient {\n private baseUrl: string\n private m2mToken: string\n\n constructor(gpApiRootUrl: string, m2mToken: string) {\n this.baseUrl = gpApiRootUrl\n this.m2mToken = m2mToken\n }\n\n request = async <T>(\n path: string,\n init?: FetchOptions<'json'>,\n ): Promise<T> => {\n try {\n return await ofetch<T>(path, {\n baseURL: this.baseUrl,\n headers: {\n Authorization: `Bearer ${this.m2mToken}`,\n ...(init?.headers ?? {}),\n },\n ...init,\n })\n } catch (error: unknown) {\n if (error instanceof FetchError) {\n throw new SdkError(error.statusCode ?? 0, error.message, error.response)\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, message)\n }\n }\n}\n","export class SdkError extends Error {\n readonly status: number\n readonly response?: Response\n\n constructor(status: number, message: string, response?: Response) {\n super(message)\n this.name = 'SdkError'\n this.status = status\n this.response = response\n }\n}\n\nexport type PaginationOptions = {\n page?: number\n limit?: number\n}\n\nexport type PaginationMeta = {\n page: number\n limit: number\n total: number\n totalPages: number\n}\n\nexport type PaginatedList<T> = {\n data: T[]\n pagination: PaginationMeta\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\n\n constructor(httpClient: HttpClient) {\n this.httpClient = httpClient\n }\n\n protected getRequest = <T>(\n path: string,\n query?: FetchOptions<'json'>['query'],\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'GET', query })\n\n protected postRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'POST', body })\n\n protected putRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PUT', body })\n\n protected deleteRequest = <T>(path: string): Promise<T> =>\n this.httpClient.request<T>(path, { method: 'DELETE' })\n}\n","import type { PaginatedList, PaginationOptions } from '../types/result'\nimport type { UpdatePasswordInput, User } from '../types/user'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n list = async (options?: PaginationOptions): Promise<PaginatedList<User>> => {\n const { data, meta: pagination } = await this.getRequest<{\n data: User[]\n meta: { page: number; limit: number; total: number; totalPages: number }\n }>('/users', options)\n\n return {\n data,\n pagination,\n }\n }\n\n get = (id: number): Promise<User> => this.getRequest<User>(`/users/${id}`)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`/users/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`/users/${id}/password`, input)\n}\n","export enum UserRole {\n admin = 'admin',\n sales = 'sales',\n candidate = 'candidate',\n campaignManager = 'campaignManager',\n demo = 'demo',\n}\n\nexport enum WhyBrowsing {\n considering = 'considering',\n learning = 'learning',\n test = 'test',\n else = 'else',\n}\n\nexport type UserMetaData = {\n customerId?: string\n checkoutSessionId?: string | null\n accountType?: string | null\n lastVisited?: number\n sessionCount?: number\n isDeleted?: boolean\n fsUserId?: string\n whyBrowsing?: WhyBrowsing | null\n hubspotId?: string\n profile_updated_count?: number\n textNotifications?: boolean\n} | null\n\nexport type User = {\n id: number\n firstName: string\n lastName: string\n name?: string | null\n email: string\n phone?: string | null\n zip?: string | null\n avatar?: string | null\n hasPassword: boolean\n roles?: UserRole[]\n metaData?: UserMetaData\n}\n\nexport type UpdatePasswordInput = {\n oldPassword?: string\n newPassword: string\n}\n"],"mappings":"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","names":["UserRole","WhyBrowsing"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodparty_org/sdk",
3
- "version": "0.0.7",
3
+ "version": "0.1.0",
4
4
  "description": "TypeScript SDK for interacting with the GoodParty API",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -16,10 +16,12 @@
16
16
  "dist"
17
17
  ],
18
18
  "scripts": {
19
+ "dev": "tsup --watch",
19
20
  "build": "tsup",
20
21
  "lint": "eslint \"src/**/*.ts\" --quiet",
21
22
  "lint:fix": "eslint \"src/**/*.ts\" --fix",
22
23
  "format": "prettier --write \"src/**/*.ts\"",
24
+ "lint-format": "npm run lint:fix && npm run format",
23
25
  "format:check": "prettier --check \"src/**/*.ts\"",
24
26
  "typecheck": "tsc --noEmit",
25
27
  "prepublishOnly": "npm run build"
@@ -44,5 +46,9 @@
44
46
  "prettier": "^3.0.0",
45
47
  "tsup": "^8.5.1",
46
48
  "typescript": "^5.0.0"
49
+ },
50
+ "dependencies": {
51
+ "@clerk/backend": "^2.30.1",
52
+ "ofetch": "^1.5.1"
47
53
  }
48
54
  }