userplex 0.1.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +228 -273
  3. package/dist/index.d.mts +78 -0
  4. package/dist/index.d.ts +78 -0
  5. package/dist/index.js +132 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +126 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +27 -130
  10. package/CHANGELOG.md +0 -11
  11. package/api-promise.d.mts +0 -2
  12. package/api-promise.d.mts.map +0 -1
  13. package/api-promise.d.ts +0 -2
  14. package/api-promise.d.ts.map +0 -1
  15. package/api-promise.js +0 -6
  16. package/api-promise.js.map +0 -1
  17. package/api-promise.mjs +0 -2
  18. package/api-promise.mjs.map +0 -1
  19. package/client.d.mts +0 -183
  20. package/client.d.mts.map +0 -1
  21. package/client.d.ts +0 -183
  22. package/client.d.ts.map +0 -1
  23. package/client.js +0 -464
  24. package/client.js.map +0 -1
  25. package/client.mjs +0 -460
  26. package/client.mjs.map +0 -1
  27. package/core/api-promise.d.mts +0 -46
  28. package/core/api-promise.d.mts.map +0 -1
  29. package/core/api-promise.d.ts +0 -46
  30. package/core/api-promise.d.ts.map +0 -1
  31. package/core/api-promise.js +0 -74
  32. package/core/api-promise.js.map +0 -1
  33. package/core/api-promise.mjs +0 -70
  34. package/core/api-promise.mjs.map +0 -1
  35. package/core/error.d.mts +0 -46
  36. package/core/error.d.mts.map +0 -1
  37. package/core/error.d.ts +0 -46
  38. package/core/error.d.ts.map +0 -1
  39. package/core/error.js +0 -113
  40. package/core/error.js.map +0 -1
  41. package/core/error.mjs +0 -97
  42. package/core/error.mjs.map +0 -1
  43. package/core/resource.d.mts +0 -6
  44. package/core/resource.d.mts.map +0 -1
  45. package/core/resource.d.ts +0 -6
  46. package/core/resource.d.ts.map +0 -1
  47. package/core/resource.js +0 -11
  48. package/core/resource.js.map +0 -1
  49. package/core/resource.mjs +0 -7
  50. package/core/resource.mjs.map +0 -1
  51. package/core/uploads.d.mts +0 -3
  52. package/core/uploads.d.mts.map +0 -1
  53. package/core/uploads.d.ts +0 -3
  54. package/core/uploads.d.ts.map +0 -1
  55. package/core/uploads.js +0 -6
  56. package/core/uploads.js.map +0 -1
  57. package/core/uploads.mjs +0 -2
  58. package/core/uploads.mjs.map +0 -1
  59. package/error.d.mts +0 -2
  60. package/error.d.mts.map +0 -1
  61. package/error.d.ts +0 -2
  62. package/error.d.ts.map +0 -1
  63. package/error.js +0 -6
  64. package/error.js.map +0 -1
  65. package/error.mjs +0 -2
  66. package/error.mjs.map +0 -1
  67. package/index.d.mts +0 -6
  68. package/index.d.mts.map +0 -1
  69. package/index.d.ts +0 -6
  70. package/index.d.ts.map +0 -1
  71. package/index.js +0 -30
  72. package/index.js.map +0 -1
  73. package/index.mjs +0 -7
  74. package/index.mjs.map +0 -1
  75. package/internal/builtin-types.d.mts +0 -73
  76. package/internal/builtin-types.d.mts.map +0 -1
  77. package/internal/builtin-types.d.ts +0 -73
  78. package/internal/builtin-types.d.ts.map +0 -1
  79. package/internal/builtin-types.js +0 -4
  80. package/internal/builtin-types.js.map +0 -1
  81. package/internal/builtin-types.mjs +0 -3
  82. package/internal/builtin-types.mjs.map +0 -1
  83. package/internal/detect-platform.d.mts +0 -15
  84. package/internal/detect-platform.d.mts.map +0 -1
  85. package/internal/detect-platform.d.ts +0 -15
  86. package/internal/detect-platform.d.ts.map +0 -1
  87. package/internal/detect-platform.js +0 -162
  88. package/internal/detect-platform.js.map +0 -1
  89. package/internal/detect-platform.mjs +0 -157
  90. package/internal/detect-platform.mjs.map +0 -1
  91. package/internal/errors.d.mts +0 -3
  92. package/internal/errors.d.mts.map +0 -1
  93. package/internal/errors.d.ts +0 -3
  94. package/internal/errors.d.ts.map +0 -1
  95. package/internal/errors.js +0 -41
  96. package/internal/errors.js.map +0 -1
  97. package/internal/errors.mjs +0 -36
  98. package/internal/errors.mjs.map +0 -1
  99. package/internal/headers.d.mts +0 -20
  100. package/internal/headers.d.mts.map +0 -1
  101. package/internal/headers.d.ts +0 -20
  102. package/internal/headers.d.ts.map +0 -1
  103. package/internal/headers.js +0 -79
  104. package/internal/headers.js.map +0 -1
  105. package/internal/headers.mjs +0 -74
  106. package/internal/headers.mjs.map +0 -1
  107. package/internal/parse.d.mts +0 -12
  108. package/internal/parse.d.mts.map +0 -1
  109. package/internal/parse.d.ts +0 -12
  110. package/internal/parse.d.ts.map +0 -1
  111. package/internal/parse.js +0 -35
  112. package/internal/parse.js.map +0 -1
  113. package/internal/parse.mjs +0 -32
  114. package/internal/parse.mjs.map +0 -1
  115. package/internal/request-options.d.mts +0 -75
  116. package/internal/request-options.d.mts.map +0 -1
  117. package/internal/request-options.d.ts +0 -75
  118. package/internal/request-options.d.ts.map +0 -1
  119. package/internal/request-options.js +0 -14
  120. package/internal/request-options.js.map +0 -1
  121. package/internal/request-options.mjs +0 -10
  122. package/internal/request-options.mjs.map +0 -1
  123. package/internal/shim-types.d.mts +0 -17
  124. package/internal/shim-types.d.mts.map +0 -1
  125. package/internal/shim-types.d.ts +0 -17
  126. package/internal/shim-types.d.ts.map +0 -1
  127. package/internal/shim-types.js +0 -4
  128. package/internal/shim-types.js.map +0 -1
  129. package/internal/shim-types.mjs +0 -3
  130. package/internal/shim-types.mjs.map +0 -1
  131. package/internal/shims.d.mts +0 -20
  132. package/internal/shims.d.mts.map +0 -1
  133. package/internal/shims.d.ts +0 -20
  134. package/internal/shims.d.ts.map +0 -1
  135. package/internal/shims.js +0 -92
  136. package/internal/shims.js.map +0 -1
  137. package/internal/shims.mjs +0 -85
  138. package/internal/shims.mjs.map +0 -1
  139. package/internal/to-file.d.mts +0 -45
  140. package/internal/to-file.d.mts.map +0 -1
  141. package/internal/to-file.d.ts +0 -45
  142. package/internal/to-file.d.ts.map +0 -1
  143. package/internal/to-file.js +0 -91
  144. package/internal/to-file.js.map +0 -1
  145. package/internal/to-file.mjs +0 -88
  146. package/internal/to-file.mjs.map +0 -1
  147. package/internal/tslib.js +0 -81
  148. package/internal/tslib.mjs +0 -17
  149. package/internal/types.d.mts +0 -69
  150. package/internal/types.d.mts.map +0 -1
  151. package/internal/types.d.ts +0 -69
  152. package/internal/types.d.ts.map +0 -1
  153. package/internal/types.js +0 -4
  154. package/internal/types.js.map +0 -1
  155. package/internal/types.mjs +0 -3
  156. package/internal/types.mjs.map +0 -1
  157. package/internal/uploads.d.mts +0 -42
  158. package/internal/uploads.d.mts.map +0 -1
  159. package/internal/uploads.d.ts +0 -42
  160. package/internal/uploads.d.ts.map +0 -1
  161. package/internal/uploads.js +0 -141
  162. package/internal/uploads.js.map +0 -1
  163. package/internal/uploads.mjs +0 -131
  164. package/internal/uploads.mjs.map +0 -1
  165. package/internal/utils/base64.d.mts +0 -3
  166. package/internal/utils/base64.d.mts.map +0 -1
  167. package/internal/utils/base64.d.ts +0 -3
  168. package/internal/utils/base64.d.ts.map +0 -1
  169. package/internal/utils/base64.js +0 -38
  170. package/internal/utils/base64.js.map +0 -1
  171. package/internal/utils/base64.mjs +0 -33
  172. package/internal/utils/base64.mjs.map +0 -1
  173. package/internal/utils/bytes.d.mts +0 -4
  174. package/internal/utils/bytes.d.mts.map +0 -1
  175. package/internal/utils/bytes.d.ts +0 -4
  176. package/internal/utils/bytes.d.ts.map +0 -1
  177. package/internal/utils/bytes.js +0 -31
  178. package/internal/utils/bytes.js.map +0 -1
  179. package/internal/utils/bytes.mjs +0 -26
  180. package/internal/utils/bytes.mjs.map +0 -1
  181. package/internal/utils/env.d.mts +0 -9
  182. package/internal/utils/env.d.mts.map +0 -1
  183. package/internal/utils/env.d.ts +0 -9
  184. package/internal/utils/env.d.ts.map +0 -1
  185. package/internal/utils/env.js +0 -22
  186. package/internal/utils/env.js.map +0 -1
  187. package/internal/utils/env.mjs +0 -18
  188. package/internal/utils/env.mjs.map +0 -1
  189. package/internal/utils/log.d.mts +0 -37
  190. package/internal/utils/log.d.mts.map +0 -1
  191. package/internal/utils/log.d.ts +0 -37
  192. package/internal/utils/log.d.ts.map +0 -1
  193. package/internal/utils/log.js +0 -85
  194. package/internal/utils/log.js.map +0 -1
  195. package/internal/utils/log.mjs +0 -79
  196. package/internal/utils/log.mjs.map +0 -1
  197. package/internal/utils/path.d.mts +0 -15
  198. package/internal/utils/path.d.mts.map +0 -1
  199. package/internal/utils/path.d.ts +0 -15
  200. package/internal/utils/path.d.ts.map +0 -1
  201. package/internal/utils/path.js +0 -79
  202. package/internal/utils/path.js.map +0 -1
  203. package/internal/utils/path.mjs +0 -74
  204. package/internal/utils/path.mjs.map +0 -1
  205. package/internal/utils/sleep.d.mts +0 -2
  206. package/internal/utils/sleep.d.mts.map +0 -1
  207. package/internal/utils/sleep.d.ts +0 -2
  208. package/internal/utils/sleep.d.ts.map +0 -1
  209. package/internal/utils/sleep.js +0 -7
  210. package/internal/utils/sleep.js.map +0 -1
  211. package/internal/utils/sleep.mjs +0 -3
  212. package/internal/utils/sleep.mjs.map +0 -1
  213. package/internal/utils/uuid.d.mts +0 -5
  214. package/internal/utils/uuid.d.mts.map +0 -1
  215. package/internal/utils/uuid.d.ts +0 -5
  216. package/internal/utils/uuid.d.ts.map +0 -1
  217. package/internal/utils/uuid.js +0 -19
  218. package/internal/utils/uuid.js.map +0 -1
  219. package/internal/utils/uuid.mjs +0 -15
  220. package/internal/utils/uuid.mjs.map +0 -1
  221. package/internal/utils/values.d.mts +0 -18
  222. package/internal/utils/values.d.mts.map +0 -1
  223. package/internal/utils/values.d.ts +0 -18
  224. package/internal/utils/values.d.ts.map +0 -1
  225. package/internal/utils/values.js +0 -112
  226. package/internal/utils/values.js.map +0 -1
  227. package/internal/utils/values.mjs +0 -94
  228. package/internal/utils/values.mjs.map +0 -1
  229. package/internal/utils.d.mts +0 -7
  230. package/internal/utils.d.mts.map +0 -1
  231. package/internal/utils.d.ts +0 -7
  232. package/internal/utils.d.ts.map +0 -1
  233. package/internal/utils.js +0 -11
  234. package/internal/utils.js.map +0 -1
  235. package/internal/utils.mjs +0 -8
  236. package/internal/utils.mjs.map +0 -1
  237. package/resource.d.mts +0 -2
  238. package/resource.d.mts.map +0 -1
  239. package/resource.d.ts +0 -2
  240. package/resource.d.ts.map +0 -1
  241. package/resource.js +0 -6
  242. package/resource.js.map +0 -1
  243. package/resource.mjs +0 -2
  244. package/resource.mjs.map +0 -1
  245. package/resources/events.d.mts +0 -48
  246. package/resources/events.d.mts.map +0 -1
  247. package/resources/events.d.ts +0 -48
  248. package/resources/events.d.ts.map +0 -1
  249. package/resources/events.js +0 -16
  250. package/resources/events.js.map +0 -1
  251. package/resources/events.mjs +0 -12
  252. package/resources/events.mjs.map +0 -1
  253. package/resources/index.d.mts +0 -3
  254. package/resources/index.d.mts.map +0 -1
  255. package/resources/index.d.ts +0 -3
  256. package/resources/index.d.ts.map +0 -1
  257. package/resources/index.js +0 -9
  258. package/resources/index.js.map +0 -1
  259. package/resources/index.mjs +0 -4
  260. package/resources/index.mjs.map +0 -1
  261. package/resources/users.d.mts +0 -44
  262. package/resources/users.d.mts.map +0 -1
  263. package/resources/users.d.ts +0 -44
  264. package/resources/users.d.ts.map +0 -1
  265. package/resources/users.js +0 -16
  266. package/resources/users.js.map +0 -1
  267. package/resources/users.mjs +0 -12
  268. package/resources/users.mjs.map +0 -1
  269. package/resources.d.mts +0 -2
  270. package/resources.d.mts.map +0 -1
  271. package/resources.d.ts +0 -2
  272. package/resources.d.ts.map +0 -1
  273. package/resources.js +0 -5
  274. package/resources.js.map +0 -1
  275. package/resources.mjs +0 -2
  276. package/resources.mjs.map +0 -1
  277. package/src/api-promise.ts +0 -2
  278. package/src/client.ts +0 -739
  279. package/src/core/README.md +0 -3
  280. package/src/core/api-promise.ts +0 -92
  281. package/src/core/error.ts +0 -130
  282. package/src/core/resource.ts +0 -11
  283. package/src/core/uploads.ts +0 -2
  284. package/src/error.ts +0 -2
  285. package/src/index.ts +0 -22
  286. package/src/internal/README.md +0 -3
  287. package/src/internal/builtin-types.ts +0 -93
  288. package/src/internal/detect-platform.ts +0 -196
  289. package/src/internal/errors.ts +0 -33
  290. package/src/internal/headers.ts +0 -97
  291. package/src/internal/parse.ts +0 -50
  292. package/src/internal/request-options.ts +0 -91
  293. package/src/internal/shim-types.ts +0 -26
  294. package/src/internal/shims.ts +0 -107
  295. package/src/internal/to-file.ts +0 -154
  296. package/src/internal/types.ts +0 -95
  297. package/src/internal/uploads.ts +0 -187
  298. package/src/internal/utils/base64.ts +0 -40
  299. package/src/internal/utils/bytes.ts +0 -32
  300. package/src/internal/utils/env.ts +0 -18
  301. package/src/internal/utils/log.ts +0 -126
  302. package/src/internal/utils/path.ts +0 -88
  303. package/src/internal/utils/sleep.ts +0 -3
  304. package/src/internal/utils/uuid.ts +0 -17
  305. package/src/internal/utils/values.ts +0 -105
  306. package/src/internal/utils.ts +0 -8
  307. package/src/lib/.keep +0 -4
  308. package/src/resource.ts +0 -2
  309. package/src/resources/events.ts +0 -58
  310. package/src/resources/index.ts +0 -4
  311. package/src/resources/users.ts +0 -53
  312. package/src/resources.ts +0 -1
  313. package/src/tsconfig.json +0 -11
  314. package/src/uploads.ts +0 -2
  315. package/src/version.ts +0 -1
  316. package/uploads.d.mts +0 -2
  317. package/uploads.d.mts.map +0 -1
  318. package/uploads.d.ts +0 -2
  319. package/uploads.d.ts.map +0 -1
  320. package/uploads.js +0 -6
  321. package/uploads.js.map +0 -1
  322. package/uploads.mjs +0 -2
  323. package/uploads.mjs.map +0 -1
  324. package/version.d.mts +0 -2
  325. package/version.d.mts.map +0 -1
  326. package/version.d.ts +0 -2
  327. package/version.d.ts.map +0 -1
  328. package/version.js +0 -5
  329. package/version.js.map +0 -1
  330. package/version.mjs +0 -2
  331. package/version.mjs.map +0 -1
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Userplex - Simple Analytics SDK
3
+ *
4
+ * Just install and use. No complex setup required.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import Userplex from 'userplex';
9
+ *
10
+ * const userplex = new Userplex('upx_your_api_key');
11
+ *
12
+ * // Track events
13
+ * await userplex.track('user123', 'button_clicked', { button: 'signup' });
14
+ *
15
+ * // Identify users
16
+ * await userplex.identify('user123', { email: 'user@example.com' });
17
+ *
18
+ * // Log conversations
19
+ * await userplex.logConversation({
20
+ * messages: [
21
+ * { role: 'user', content: 'Hello' },
22
+ * { role: 'assistant', content: 'Hi there!' }
23
+ * ]
24
+ * });
25
+ * ```
26
+ */
27
+ interface ConversationMessage {
28
+ role: 'user' | 'assistant' | 'system';
29
+ content: string;
30
+ }
31
+ interface UserplexOptions {
32
+ /** Your Userplex instance URL (default: https://userplex.vercel.app) */
33
+ baseUrl?: string;
34
+ /** Request timeout in ms (default: 10000) */
35
+ timeout?: number;
36
+ /** Enable debug logging (default: false) */
37
+ debug?: boolean;
38
+ }
39
+ declare class UserplexError extends Error {
40
+ statusCode?: number | undefined;
41
+ response?: any | undefined;
42
+ constructor(message: string, statusCode?: number | undefined, response?: any | undefined);
43
+ }
44
+ declare class Userplex {
45
+ private apiKey;
46
+ private baseUrl;
47
+ private timeout;
48
+ private debug;
49
+ constructor(apiKey: string, options?: UserplexOptions);
50
+ /**
51
+ * Track an event
52
+ */
53
+ track(userId: string, event: string, properties?: Record<string, any>): Promise<any>;
54
+ /**
55
+ * Identify a user
56
+ */
57
+ identify(externalId: string, properties?: Record<string, any>): Promise<any>;
58
+ /**
59
+ * Log a conversation
60
+ */
61
+ logConversation(options: {
62
+ messages: ConversationMessage[];
63
+ userId?: string;
64
+ conversationId?: string;
65
+ conversationName?: string;
66
+ }): Promise<any>;
67
+ /**
68
+ * Batch track multiple events
69
+ */
70
+ trackBatch(events: Array<{
71
+ userId: string;
72
+ event: string;
73
+ properties?: Record<string, any>;
74
+ }>): Promise<any[]>;
75
+ private request;
76
+ }
77
+
78
+ export { type ConversationMessage, Userplex, UserplexError, type UserplexOptions, Userplex as default };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Userplex - Simple Analytics SDK
3
+ *
4
+ * Just install and use. No complex setup required.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import Userplex from 'userplex';
9
+ *
10
+ * const userplex = new Userplex('upx_your_api_key');
11
+ *
12
+ * // Track events
13
+ * await userplex.track('user123', 'button_clicked', { button: 'signup' });
14
+ *
15
+ * // Identify users
16
+ * await userplex.identify('user123', { email: 'user@example.com' });
17
+ *
18
+ * // Log conversations
19
+ * await userplex.logConversation({
20
+ * messages: [
21
+ * { role: 'user', content: 'Hello' },
22
+ * { role: 'assistant', content: 'Hi there!' }
23
+ * ]
24
+ * });
25
+ * ```
26
+ */
27
+ interface ConversationMessage {
28
+ role: 'user' | 'assistant' | 'system';
29
+ content: string;
30
+ }
31
+ interface UserplexOptions {
32
+ /** Your Userplex instance URL (default: https://userplex.vercel.app) */
33
+ baseUrl?: string;
34
+ /** Request timeout in ms (default: 10000) */
35
+ timeout?: number;
36
+ /** Enable debug logging (default: false) */
37
+ debug?: boolean;
38
+ }
39
+ declare class UserplexError extends Error {
40
+ statusCode?: number | undefined;
41
+ response?: any | undefined;
42
+ constructor(message: string, statusCode?: number | undefined, response?: any | undefined);
43
+ }
44
+ declare class Userplex {
45
+ private apiKey;
46
+ private baseUrl;
47
+ private timeout;
48
+ private debug;
49
+ constructor(apiKey: string, options?: UserplexOptions);
50
+ /**
51
+ * Track an event
52
+ */
53
+ track(userId: string, event: string, properties?: Record<string, any>): Promise<any>;
54
+ /**
55
+ * Identify a user
56
+ */
57
+ identify(externalId: string, properties?: Record<string, any>): Promise<any>;
58
+ /**
59
+ * Log a conversation
60
+ */
61
+ logConversation(options: {
62
+ messages: ConversationMessage[];
63
+ userId?: string;
64
+ conversationId?: string;
65
+ conversationName?: string;
66
+ }): Promise<any>;
67
+ /**
68
+ * Batch track multiple events
69
+ */
70
+ trackBatch(events: Array<{
71
+ userId: string;
72
+ event: string;
73
+ properties?: Record<string, any>;
74
+ }>): Promise<any[]>;
75
+ private request;
76
+ }
77
+
78
+ export { type ConversationMessage, Userplex, UserplexError, type UserplexOptions, Userplex as default };
package/dist/index.js ADDED
@@ -0,0 +1,132 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ // index.ts
6
+ var UserplexError = class extends Error {
7
+ constructor(message, statusCode, response) {
8
+ super(message);
9
+ this.statusCode = statusCode;
10
+ this.response = response;
11
+ this.name = "UserplexError";
12
+ }
13
+ };
14
+ var Userplex = class {
15
+ constructor(apiKey, options = {}) {
16
+ if (!apiKey) {
17
+ throw new Error("Userplex: API key is required");
18
+ }
19
+ if (!apiKey.startsWith("upx_")) {
20
+ throw new Error('Userplex: API key must start with "upx_"');
21
+ }
22
+ this.apiKey = apiKey;
23
+ this.baseUrl = (options.baseUrl || "https://userplex.vercel.app").replace(/\/$/, "");
24
+ this.timeout = options.timeout || 1e4;
25
+ this.debug = options.debug || false;
26
+ }
27
+ /**
28
+ * Track an event
29
+ */
30
+ async track(userId, event, properties) {
31
+ if (!userId || !event) {
32
+ throw new Error("userId and event are required");
33
+ }
34
+ return this.request("/api/events", {
35
+ userId,
36
+ event,
37
+ properties: properties || {}
38
+ });
39
+ }
40
+ /**
41
+ * Identify a user
42
+ */
43
+ async identify(externalId, properties) {
44
+ if (!externalId) {
45
+ throw new Error("externalId is required");
46
+ }
47
+ return this.request("/api/identify", {
48
+ externalId,
49
+ ...properties
50
+ }, {
51
+ "x-api-key": this.apiKey
52
+ // identify endpoint uses this header too
53
+ });
54
+ }
55
+ /**
56
+ * Log a conversation
57
+ */
58
+ async logConversation(options) {
59
+ if (!options.messages || options.messages.length === 0) {
60
+ throw new Error("messages array is required and cannot be empty");
61
+ }
62
+ return this.request("/api/conversations", {
63
+ externalUserId: options.userId,
64
+ conversationId: options.conversationId,
65
+ conversationName: options.conversationName,
66
+ messages: options.messages
67
+ });
68
+ }
69
+ /**
70
+ * Batch track multiple events
71
+ */
72
+ async trackBatch(events) {
73
+ if (!events || events.length === 0) {
74
+ throw new Error("events array is required and cannot be empty");
75
+ }
76
+ const promises = events.map((e) => this.track(e.userId, e.event, e.properties));
77
+ return Promise.all(promises);
78
+ }
79
+ async request(endpoint, data, additionalHeaders) {
80
+ const url = `${this.baseUrl}${endpoint}`;
81
+ const controller = new AbortController();
82
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
83
+ if (this.debug) {
84
+ console.log(`[Userplex] POST ${url}`, JSON.stringify(data, null, 2));
85
+ }
86
+ try {
87
+ const response = await fetch(url, {
88
+ method: "POST",
89
+ headers: {
90
+ "Content-Type": "application/json",
91
+ "Authorization": `Bearer ${this.apiKey}`,
92
+ ...additionalHeaders
93
+ },
94
+ body: JSON.stringify(data),
95
+ signal: controller.signal
96
+ });
97
+ clearTimeout(timeoutId);
98
+ const responseData = await response.json();
99
+ if (this.debug) {
100
+ console.log(`[Userplex] Response:`, JSON.stringify(responseData, null, 2));
101
+ }
102
+ if (!response.ok) {
103
+ throw new UserplexError(
104
+ responseData.error || `Request failed with status ${response.status}`,
105
+ response.status,
106
+ responseData
107
+ );
108
+ }
109
+ return responseData;
110
+ } catch (error) {
111
+ clearTimeout(timeoutId);
112
+ if (error.name === "AbortError") {
113
+ throw new UserplexError("Request timeout", 408);
114
+ }
115
+ if (error instanceof UserplexError) {
116
+ throw error;
117
+ }
118
+ throw new UserplexError(
119
+ error.message || "An unexpected error occurred",
120
+ void 0,
121
+ error
122
+ );
123
+ }
124
+ }
125
+ };
126
+ var index_default = Userplex;
127
+
128
+ exports.Userplex = Userplex;
129
+ exports.UserplexError = UserplexError;
130
+ exports.default = index_default;
131
+ //# sourceMappingURL=index.js.map
132
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Userplex - Simple Analytics SDK\n * \n * Just install and use. No complex setup required.\n * \n * @example\n * ```ts\n * import Userplex from 'userplex';\n * \n * const userplex = new Userplex('upx_your_api_key');\n * \n * // Track events\n * await userplex.track('user123', 'button_clicked', { button: 'signup' });\n * \n * // Identify users\n * await userplex.identify('user123', { email: 'user@example.com' });\n * \n * // Log conversations\n * await userplex.logConversation({\n * messages: [\n * { role: 'user', content: 'Hello' },\n * { role: 'assistant', content: 'Hi there!' }\n * ]\n * });\n * ```\n */\n\nexport interface ConversationMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface UserplexOptions {\n /** Your Userplex instance URL (default: https://userplex.vercel.app) */\n baseUrl?: string;\n /** Request timeout in ms (default: 10000) */\n timeout?: number;\n /** Enable debug logging (default: false) */\n debug?: boolean;\n}\n\nexport class UserplexError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public response?: any\n ) {\n super(message);\n this.name = 'UserplexError';\n }\n}\n\nclass Userplex {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n private debug: boolean;\n\n constructor(apiKey: string, options: UserplexOptions = {}) {\n if (!apiKey) {\n throw new Error('Userplex: API key is required');\n }\n if (!apiKey.startsWith('upx_')) {\n throw new Error('Userplex: API key must start with \"upx_\"');\n }\n\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl || 'https://userplex.vercel.app').replace(/\\/$/, '');\n this.timeout = options.timeout || 10000;\n this.debug = options.debug || false;\n }\n\n /**\n * Track an event\n */\n async track(userId: string, event: string, properties?: Record<string, any>) {\n if (!userId || !event) {\n throw new Error('userId and event are required');\n }\n\n return this.request('/api/events', {\n userId,\n event,\n properties: properties || {}\n });\n }\n\n /**\n * Identify a user\n */\n async identify(externalId: string, properties?: Record<string, any>) {\n if (!externalId) {\n throw new Error('externalId is required');\n }\n\n return this.request('/api/identify', {\n externalId,\n ...properties\n }, {\n 'x-api-key': this.apiKey // identify endpoint uses this header too\n });\n }\n\n /**\n * Log a conversation\n */\n async logConversation(options: {\n messages: ConversationMessage[];\n userId?: string;\n conversationId?: string;\n conversationName?: string;\n }) {\n if (!options.messages || options.messages.length === 0) {\n throw new Error('messages array is required and cannot be empty');\n }\n\n return this.request('/api/conversations', {\n externalUserId: options.userId,\n conversationId: options.conversationId,\n conversationName: options.conversationName,\n messages: options.messages\n });\n }\n\n /**\n * Batch track multiple events\n */\n async trackBatch(events: Array<{\n userId: string;\n event: string;\n properties?: Record<string, any>;\n }>) {\n if (!events || events.length === 0) {\n throw new Error('events array is required and cannot be empty');\n }\n\n const promises = events.map(e => this.track(e.userId, e.event, e.properties));\n return Promise.all(promises);\n }\n\n private async request(endpoint: string, data: any, additionalHeaders?: Record<string, string>) {\n const url = `${this.baseUrl}${endpoint}`;\n \n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n if (this.debug) {\n console.log(`[Userplex] POST ${url}`, JSON.stringify(data, null, 2));\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n ...additionalHeaders\n },\n body: JSON.stringify(data),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n const responseData = await response.json() as any;\n\n if (this.debug) {\n console.log(`[Userplex] Response:`, JSON.stringify(responseData, null, 2));\n }\n\n if (!response.ok) {\n throw new UserplexError(\n responseData.error || `Request failed with status ${response.status}`,\n response.status,\n responseData\n );\n }\n\n return responseData;\n } catch (error: any) {\n clearTimeout(timeoutId);\n\n if (error.name === 'AbortError') {\n throw new UserplexError('Request timeout', 408);\n }\n\n if (error instanceof UserplexError) {\n throw error;\n }\n\n throw new UserplexError(\n error.message || 'An unexpected error occurred',\n undefined,\n error\n );\n }\n }\n}\n\nexport default Userplex;\n\n// For environments that need it separate\nexport { Userplex };\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,126 @@
1
+ // index.ts
2
+ var UserplexError = class extends Error {
3
+ constructor(message, statusCode, response) {
4
+ super(message);
5
+ this.statusCode = statusCode;
6
+ this.response = response;
7
+ this.name = "UserplexError";
8
+ }
9
+ };
10
+ var Userplex = class {
11
+ constructor(apiKey, options = {}) {
12
+ if (!apiKey) {
13
+ throw new Error("Userplex: API key is required");
14
+ }
15
+ if (!apiKey.startsWith("upx_")) {
16
+ throw new Error('Userplex: API key must start with "upx_"');
17
+ }
18
+ this.apiKey = apiKey;
19
+ this.baseUrl = (options.baseUrl || "https://userplex.vercel.app").replace(/\/$/, "");
20
+ this.timeout = options.timeout || 1e4;
21
+ this.debug = options.debug || false;
22
+ }
23
+ /**
24
+ * Track an event
25
+ */
26
+ async track(userId, event, properties) {
27
+ if (!userId || !event) {
28
+ throw new Error("userId and event are required");
29
+ }
30
+ return this.request("/api/events", {
31
+ userId,
32
+ event,
33
+ properties: properties || {}
34
+ });
35
+ }
36
+ /**
37
+ * Identify a user
38
+ */
39
+ async identify(externalId, properties) {
40
+ if (!externalId) {
41
+ throw new Error("externalId is required");
42
+ }
43
+ return this.request("/api/identify", {
44
+ externalId,
45
+ ...properties
46
+ }, {
47
+ "x-api-key": this.apiKey
48
+ // identify endpoint uses this header too
49
+ });
50
+ }
51
+ /**
52
+ * Log a conversation
53
+ */
54
+ async logConversation(options) {
55
+ if (!options.messages || options.messages.length === 0) {
56
+ throw new Error("messages array is required and cannot be empty");
57
+ }
58
+ return this.request("/api/conversations", {
59
+ externalUserId: options.userId,
60
+ conversationId: options.conversationId,
61
+ conversationName: options.conversationName,
62
+ messages: options.messages
63
+ });
64
+ }
65
+ /**
66
+ * Batch track multiple events
67
+ */
68
+ async trackBatch(events) {
69
+ if (!events || events.length === 0) {
70
+ throw new Error("events array is required and cannot be empty");
71
+ }
72
+ const promises = events.map((e) => this.track(e.userId, e.event, e.properties));
73
+ return Promise.all(promises);
74
+ }
75
+ async request(endpoint, data, additionalHeaders) {
76
+ const url = `${this.baseUrl}${endpoint}`;
77
+ const controller = new AbortController();
78
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
79
+ if (this.debug) {
80
+ console.log(`[Userplex] POST ${url}`, JSON.stringify(data, null, 2));
81
+ }
82
+ try {
83
+ const response = await fetch(url, {
84
+ method: "POST",
85
+ headers: {
86
+ "Content-Type": "application/json",
87
+ "Authorization": `Bearer ${this.apiKey}`,
88
+ ...additionalHeaders
89
+ },
90
+ body: JSON.stringify(data),
91
+ signal: controller.signal
92
+ });
93
+ clearTimeout(timeoutId);
94
+ const responseData = await response.json();
95
+ if (this.debug) {
96
+ console.log(`[Userplex] Response:`, JSON.stringify(responseData, null, 2));
97
+ }
98
+ if (!response.ok) {
99
+ throw new UserplexError(
100
+ responseData.error || `Request failed with status ${response.status}`,
101
+ response.status,
102
+ responseData
103
+ );
104
+ }
105
+ return responseData;
106
+ } catch (error) {
107
+ clearTimeout(timeoutId);
108
+ if (error.name === "AbortError") {
109
+ throw new UserplexError("Request timeout", 408);
110
+ }
111
+ if (error instanceof UserplexError) {
112
+ throw error;
113
+ }
114
+ throw new UserplexError(
115
+ error.message || "An unexpected error occurred",
116
+ void 0,
117
+ error
118
+ );
119
+ }
120
+ }
121
+ };
122
+ var index_default = Userplex;
123
+
124
+ export { Userplex, UserplexError, index_default as default };
125
+ //# sourceMappingURL=index.mjs.map
126
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../index.ts"],"names":[],"mappings":";AAyCO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,WAAA,CACE,OAAA,EACO,UAAA,EACA,QAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAEA,IAAM,WAAN,MAAe;AAAA,EAMb,WAAA,CAAY,MAAA,EAAgB,OAAA,GAA2B,EAAC,EAAG;AACzD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA,IAAW,6BAAA,EAA+B,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnF,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,MAAA,EAAgB,KAAA,EAAe,UAAA,EAAkC;AAC3E,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,KAAA,EAAO;AACrB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,IAAA,CAAK,QAAQ,aAAA,EAAe;AAAA,MACjC,MAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA,EAAY,cAAc;AAAC,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,UAAA,EAAoB,UAAA,EAAkC;AACnE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAAA,MACnC,UAAA;AAAA,MACA,GAAG;AAAA,KACL,EAAG;AAAA,MACD,aAAa,IAAA,CAAK;AAAA;AAAA,KACnB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAKnB;AACD,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,IAAA,CAAK,QAAQ,oBAAA,EAAsB;AAAA,MACxC,gBAAgB,OAAA,CAAQ,MAAA;AAAA,MACxB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,MAC1B,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAA,EAIb;AACF,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,UAAU,CAAC,CAAA;AAC5E,IAAA,OAAO,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAc,OAAA,CAAQ,QAAA,EAAkB,IAAA,EAAW,iBAAA,EAA4C;AAC7F,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,QAAQ,CAAA,CAAA;AAEtC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,mBAAmB,GAAG,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,UACtC,GAAG;AAAA,SACL;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAI,CAAA,oBAAA,CAAA,EAAwB,IAAA,CAAK,UAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,MAC3E;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,YAAA,CAAa,KAAA,IAAS,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UACnE,QAAA,CAAS,MAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,KAAA,EAAY;AACnB,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,QAAA,MAAM,IAAI,aAAA,CAAc,iBAAA,EAAmB,GAAG,CAAA;AAAA,MAChD;AAEA,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,MAAM,OAAA,IAAW,8BAAA;AAAA,QACjB,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,aAAA,GAAQ","file":"index.mjs","sourcesContent":["/**\n * Userplex - Simple Analytics SDK\n * \n * Just install and use. No complex setup required.\n * \n * @example\n * ```ts\n * import Userplex from 'userplex';\n * \n * const userplex = new Userplex('upx_your_api_key');\n * \n * // Track events\n * await userplex.track('user123', 'button_clicked', { button: 'signup' });\n * \n * // Identify users\n * await userplex.identify('user123', { email: 'user@example.com' });\n * \n * // Log conversations\n * await userplex.logConversation({\n * messages: [\n * { role: 'user', content: 'Hello' },\n * { role: 'assistant', content: 'Hi there!' }\n * ]\n * });\n * ```\n */\n\nexport interface ConversationMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface UserplexOptions {\n /** Your Userplex instance URL (default: https://userplex.vercel.app) */\n baseUrl?: string;\n /** Request timeout in ms (default: 10000) */\n timeout?: number;\n /** Enable debug logging (default: false) */\n debug?: boolean;\n}\n\nexport class UserplexError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public response?: any\n ) {\n super(message);\n this.name = 'UserplexError';\n }\n}\n\nclass Userplex {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n private debug: boolean;\n\n constructor(apiKey: string, options: UserplexOptions = {}) {\n if (!apiKey) {\n throw new Error('Userplex: API key is required');\n }\n if (!apiKey.startsWith('upx_')) {\n throw new Error('Userplex: API key must start with \"upx_\"');\n }\n\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl || 'https://userplex.vercel.app').replace(/\\/$/, '');\n this.timeout = options.timeout || 10000;\n this.debug = options.debug || false;\n }\n\n /**\n * Track an event\n */\n async track(userId: string, event: string, properties?: Record<string, any>) {\n if (!userId || !event) {\n throw new Error('userId and event are required');\n }\n\n return this.request('/api/events', {\n userId,\n event,\n properties: properties || {}\n });\n }\n\n /**\n * Identify a user\n */\n async identify(externalId: string, properties?: Record<string, any>) {\n if (!externalId) {\n throw new Error('externalId is required');\n }\n\n return this.request('/api/identify', {\n externalId,\n ...properties\n }, {\n 'x-api-key': this.apiKey // identify endpoint uses this header too\n });\n }\n\n /**\n * Log a conversation\n */\n async logConversation(options: {\n messages: ConversationMessage[];\n userId?: string;\n conversationId?: string;\n conversationName?: string;\n }) {\n if (!options.messages || options.messages.length === 0) {\n throw new Error('messages array is required and cannot be empty');\n }\n\n return this.request('/api/conversations', {\n externalUserId: options.userId,\n conversationId: options.conversationId,\n conversationName: options.conversationName,\n messages: options.messages\n });\n }\n\n /**\n * Batch track multiple events\n */\n async trackBatch(events: Array<{\n userId: string;\n event: string;\n properties?: Record<string, any>;\n }>) {\n if (!events || events.length === 0) {\n throw new Error('events array is required and cannot be empty');\n }\n\n const promises = events.map(e => this.track(e.userId, e.event, e.properties));\n return Promise.all(promises);\n }\n\n private async request(endpoint: string, data: any, additionalHeaders?: Record<string, string>) {\n const url = `${this.baseUrl}${endpoint}`;\n \n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n if (this.debug) {\n console.log(`[Userplex] POST ${url}`, JSON.stringify(data, null, 2));\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n ...additionalHeaders\n },\n body: JSON.stringify(data),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n const responseData = await response.json() as any;\n\n if (this.debug) {\n console.log(`[Userplex] Response:`, JSON.stringify(responseData, null, 2));\n }\n\n if (!response.ok) {\n throw new UserplexError(\n responseData.error || `Request failed with status ${response.status}`,\n response.status,\n responseData\n );\n }\n\n return responseData;\n } catch (error: any) {\n clearTimeout(timeoutId);\n\n if (error.name === 'AbortError') {\n throw new UserplexError('Request timeout', 408);\n }\n\n if (error instanceof UserplexError) {\n throw error;\n }\n\n throw new UserplexError(\n error.message || 'An unexpected error occurred',\n undefined,\n error\n );\n }\n }\n}\n\nexport default Userplex;\n\n// For environments that need it separate\nexport { Userplex };\n"]}
package/package.json CHANGED
@@ -1,138 +1,35 @@
1
1
  {
2
2
  "name": "userplex",
3
- "version": "0.1.0",
4
- "description": "The official TypeScript library for the Userplex API",
5
- "author": "Userplex <>",
6
- "types": "./index.d.ts",
7
- "main": "./index.js",
8
- "type": "commonjs",
9
- "repository": "github:dqnamo/userplex-typescript",
10
- "license": "Apache-2.0",
11
- "packageManager": "yarn@1.22.22",
3
+ "version": "1.0.1",
4
+ "description": "Simple analytics SDK for Userplex - Track events, identify users, and log conversations",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
12
8
  "files": [
13
- "**/*"
9
+ "dist",
10
+ "README.md"
14
11
  ],
15
- "private": false,
16
- "publishConfig": {
17
- "access": "public"
18
- },
19
12
  "scripts": {
20
- "test": "./scripts/test",
21
- "build": "./scripts/build",
22
- "format": "./scripts/format",
23
- "tsn": "ts-node -r tsconfig-paths/register",
24
- "lint": "./scripts/lint",
25
- "fix": "./scripts/format"
13
+ "build": "tsup index.ts --format cjs,esm --dts --clean",
14
+ "dev": "tsup index.ts --format cjs,esm --dts --watch",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "analytics",
19
+ "tracking",
20
+ "events",
21
+ "userplex",
22
+ "observability",
23
+ "llm",
24
+ "simple"
25
+ ],
26
+ "author": "Userplex",
27
+ "license": "MIT",
28
+ "devDependencies": {
29
+ "tsup": "^8.0.1",
30
+ "typescript": "^5.3.0"
26
31
  },
27
- "dependencies": {},
28
- "exports": {
29
- ".": {
30
- "require": {
31
- "types": "./index.d.ts",
32
- "default": "./index.js"
33
- },
34
- "types": "./index.d.mts",
35
- "default": "./index.mjs"
36
- },
37
- "./api-promise": {
38
- "import": "./api-promise.mjs",
39
- "require": "./api-promise.js"
40
- },
41
- "./api-promise.js": {
42
- "default": "./api-promise.js"
43
- },
44
- "./api-promise.mjs": {
45
- "default": "./api-promise.mjs"
46
- },
47
- "./client": {
48
- "import": "./client.mjs",
49
- "require": "./client.js"
50
- },
51
- "./client.js": {
52
- "default": "./client.js"
53
- },
54
- "./client.mjs": {
55
- "default": "./client.mjs"
56
- },
57
- "./core/*.mjs": {
58
- "default": "./core/*.mjs"
59
- },
60
- "./core/*.js": {
61
- "default": "./core/*.js"
62
- },
63
- "./core/*": {
64
- "import": "./core/*.mjs",
65
- "require": "./core/*.js"
66
- },
67
- "./error": {
68
- "import": "./error.mjs",
69
- "require": "./error.js"
70
- },
71
- "./error.js": {
72
- "default": "./error.js"
73
- },
74
- "./error.mjs": {
75
- "default": "./error.mjs"
76
- },
77
- "./index": {
78
- "import": "./index.mjs",
79
- "require": "./index.js"
80
- },
81
- "./index.js": {
82
- "default": "./index.js"
83
- },
84
- "./index.mjs": {
85
- "default": "./index.mjs"
86
- },
87
- "./resource": {
88
- "import": "./resource.mjs",
89
- "require": "./resource.js"
90
- },
91
- "./resource.js": {
92
- "default": "./resource.js"
93
- },
94
- "./resource.mjs": {
95
- "default": "./resource.mjs"
96
- },
97
- "./resources/*.mjs": {
98
- "default": "./resources/*.mjs"
99
- },
100
- "./resources/*.js": {
101
- "default": "./resources/*.js"
102
- },
103
- "./resources/*": {
104
- "import": "./resources/*.mjs",
105
- "require": "./resources/*.js"
106
- },
107
- "./resources": {
108
- "import": "./resources.mjs",
109
- "require": "./resources.js"
110
- },
111
- "./resources.js": {
112
- "default": "./resources.js"
113
- },
114
- "./resources.mjs": {
115
- "default": "./resources.mjs"
116
- },
117
- "./uploads": {
118
- "import": "./uploads.mjs",
119
- "require": "./uploads.js"
120
- },
121
- "./uploads.js": {
122
- "default": "./uploads.js"
123
- },
124
- "./uploads.mjs": {
125
- "default": "./uploads.mjs"
126
- },
127
- "./version": {
128
- "import": "./version.mjs",
129
- "require": "./version.js"
130
- },
131
- "./version.js": {
132
- "default": "./version.js"
133
- },
134
- "./version.mjs": {
135
- "default": "./version.mjs"
136
- }
32
+ "engines": {
33
+ "node": ">=14.0.0"
137
34
  }
138
35
  }
package/CHANGELOG.md DELETED
@@ -1,11 +0,0 @@
1
- # Changelog
2
-
3
- ## 0.1.0 (2025-10-02)
4
-
5
- Full Changelog: [v0.0.1...v0.1.0](https://github.com/dqnamo/userplex-typescript/compare/v0.0.1...v0.1.0)
6
-
7
- ### Chores
8
-
9
- * configure new SDK language ([f3c807a](https://github.com/dqnamo/userplex-typescript/commit/f3c807a917db5485335200b72abbee05ff7959bb))
10
- * update SDK settings ([8e2dc80](https://github.com/dqnamo/userplex-typescript/commit/8e2dc80741576245befe8234860080e85429ce48))
11
- * update SDK settings ([4487b12](https://github.com/dqnamo/userplex-typescript/commit/4487b122622e1dce5caa4a364aa5c88097816bbf))
package/api-promise.d.mts DELETED
@@ -1,2 +0,0 @@
1
- export * from "./core/api-promise.mjs";
2
- //# sourceMappingURL=api-promise.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-promise.d.mts","sourceRoot":"","sources":["src/api-promise.ts"],"names":[],"mappings":""}
package/api-promise.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from "./core/api-promise.js";
2
- //# sourceMappingURL=api-promise.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-promise.d.ts","sourceRoot":"","sources":["src/api-promise.ts"],"names":[],"mappings":""}
package/api-promise.js DELETED
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("./internal/tslib.js");
4
- /** @deprecated Import from ./core/api-promise instead */
5
- tslib_1.__exportStar(require("./core/api-promise.js"), exports);
6
- //# sourceMappingURL=api-promise.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-promise.js","sourceRoot":"","sources":["src/api-promise.ts"],"names":[],"mappings":";;;AAAA,yDAAyD;AACzD,gEAAmC"}
package/api-promise.mjs DELETED
@@ -1,2 +0,0 @@
1
- export * from "./core/api-promise.mjs";
2
- //# sourceMappingURL=api-promise.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-promise.mjs","sourceRoot":"","sources":["src/api-promise.ts"],"names":[],"mappings":""}