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.
- package/LICENSE +21 -201
- package/README.md +228 -273
- package/dist/index.d.mts +78 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +126 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +27 -130
- package/CHANGELOG.md +0 -11
- package/api-promise.d.mts +0 -2
- package/api-promise.d.mts.map +0 -1
- package/api-promise.d.ts +0 -2
- package/api-promise.d.ts.map +0 -1
- package/api-promise.js +0 -6
- package/api-promise.js.map +0 -1
- package/api-promise.mjs +0 -2
- package/api-promise.mjs.map +0 -1
- package/client.d.mts +0 -183
- package/client.d.mts.map +0 -1
- package/client.d.ts +0 -183
- package/client.d.ts.map +0 -1
- package/client.js +0 -464
- package/client.js.map +0 -1
- package/client.mjs +0 -460
- package/client.mjs.map +0 -1
- package/core/api-promise.d.mts +0 -46
- package/core/api-promise.d.mts.map +0 -1
- package/core/api-promise.d.ts +0 -46
- package/core/api-promise.d.ts.map +0 -1
- package/core/api-promise.js +0 -74
- package/core/api-promise.js.map +0 -1
- package/core/api-promise.mjs +0 -70
- package/core/api-promise.mjs.map +0 -1
- package/core/error.d.mts +0 -46
- package/core/error.d.mts.map +0 -1
- package/core/error.d.ts +0 -46
- package/core/error.d.ts.map +0 -1
- package/core/error.js +0 -113
- package/core/error.js.map +0 -1
- package/core/error.mjs +0 -97
- package/core/error.mjs.map +0 -1
- package/core/resource.d.mts +0 -6
- package/core/resource.d.mts.map +0 -1
- package/core/resource.d.ts +0 -6
- package/core/resource.d.ts.map +0 -1
- package/core/resource.js +0 -11
- package/core/resource.js.map +0 -1
- package/core/resource.mjs +0 -7
- package/core/resource.mjs.map +0 -1
- package/core/uploads.d.mts +0 -3
- package/core/uploads.d.mts.map +0 -1
- package/core/uploads.d.ts +0 -3
- package/core/uploads.d.ts.map +0 -1
- package/core/uploads.js +0 -6
- package/core/uploads.js.map +0 -1
- package/core/uploads.mjs +0 -2
- package/core/uploads.mjs.map +0 -1
- package/error.d.mts +0 -2
- package/error.d.mts.map +0 -1
- package/error.d.ts +0 -2
- package/error.d.ts.map +0 -1
- package/error.js +0 -6
- package/error.js.map +0 -1
- package/error.mjs +0 -2
- package/error.mjs.map +0 -1
- package/index.d.mts +0 -6
- package/index.d.mts.map +0 -1
- package/index.d.ts +0 -6
- package/index.d.ts.map +0 -1
- package/index.js +0 -30
- package/index.js.map +0 -1
- package/index.mjs +0 -7
- package/index.mjs.map +0 -1
- package/internal/builtin-types.d.mts +0 -73
- package/internal/builtin-types.d.mts.map +0 -1
- package/internal/builtin-types.d.ts +0 -73
- package/internal/builtin-types.d.ts.map +0 -1
- package/internal/builtin-types.js +0 -4
- package/internal/builtin-types.js.map +0 -1
- package/internal/builtin-types.mjs +0 -3
- package/internal/builtin-types.mjs.map +0 -1
- package/internal/detect-platform.d.mts +0 -15
- package/internal/detect-platform.d.mts.map +0 -1
- package/internal/detect-platform.d.ts +0 -15
- package/internal/detect-platform.d.ts.map +0 -1
- package/internal/detect-platform.js +0 -162
- package/internal/detect-platform.js.map +0 -1
- package/internal/detect-platform.mjs +0 -157
- package/internal/detect-platform.mjs.map +0 -1
- package/internal/errors.d.mts +0 -3
- package/internal/errors.d.mts.map +0 -1
- package/internal/errors.d.ts +0 -3
- package/internal/errors.d.ts.map +0 -1
- package/internal/errors.js +0 -41
- package/internal/errors.js.map +0 -1
- package/internal/errors.mjs +0 -36
- package/internal/errors.mjs.map +0 -1
- package/internal/headers.d.mts +0 -20
- package/internal/headers.d.mts.map +0 -1
- package/internal/headers.d.ts +0 -20
- package/internal/headers.d.ts.map +0 -1
- package/internal/headers.js +0 -79
- package/internal/headers.js.map +0 -1
- package/internal/headers.mjs +0 -74
- package/internal/headers.mjs.map +0 -1
- package/internal/parse.d.mts +0 -12
- package/internal/parse.d.mts.map +0 -1
- package/internal/parse.d.ts +0 -12
- package/internal/parse.d.ts.map +0 -1
- package/internal/parse.js +0 -35
- package/internal/parse.js.map +0 -1
- package/internal/parse.mjs +0 -32
- package/internal/parse.mjs.map +0 -1
- package/internal/request-options.d.mts +0 -75
- package/internal/request-options.d.mts.map +0 -1
- package/internal/request-options.d.ts +0 -75
- package/internal/request-options.d.ts.map +0 -1
- package/internal/request-options.js +0 -14
- package/internal/request-options.js.map +0 -1
- package/internal/request-options.mjs +0 -10
- package/internal/request-options.mjs.map +0 -1
- package/internal/shim-types.d.mts +0 -17
- package/internal/shim-types.d.mts.map +0 -1
- package/internal/shim-types.d.ts +0 -17
- package/internal/shim-types.d.ts.map +0 -1
- package/internal/shim-types.js +0 -4
- package/internal/shim-types.js.map +0 -1
- package/internal/shim-types.mjs +0 -3
- package/internal/shim-types.mjs.map +0 -1
- package/internal/shims.d.mts +0 -20
- package/internal/shims.d.mts.map +0 -1
- package/internal/shims.d.ts +0 -20
- package/internal/shims.d.ts.map +0 -1
- package/internal/shims.js +0 -92
- package/internal/shims.js.map +0 -1
- package/internal/shims.mjs +0 -85
- package/internal/shims.mjs.map +0 -1
- package/internal/to-file.d.mts +0 -45
- package/internal/to-file.d.mts.map +0 -1
- package/internal/to-file.d.ts +0 -45
- package/internal/to-file.d.ts.map +0 -1
- package/internal/to-file.js +0 -91
- package/internal/to-file.js.map +0 -1
- package/internal/to-file.mjs +0 -88
- package/internal/to-file.mjs.map +0 -1
- package/internal/tslib.js +0 -81
- package/internal/tslib.mjs +0 -17
- package/internal/types.d.mts +0 -69
- package/internal/types.d.mts.map +0 -1
- package/internal/types.d.ts +0 -69
- package/internal/types.d.ts.map +0 -1
- package/internal/types.js +0 -4
- package/internal/types.js.map +0 -1
- package/internal/types.mjs +0 -3
- package/internal/types.mjs.map +0 -1
- package/internal/uploads.d.mts +0 -42
- package/internal/uploads.d.mts.map +0 -1
- package/internal/uploads.d.ts +0 -42
- package/internal/uploads.d.ts.map +0 -1
- package/internal/uploads.js +0 -141
- package/internal/uploads.js.map +0 -1
- package/internal/uploads.mjs +0 -131
- package/internal/uploads.mjs.map +0 -1
- package/internal/utils/base64.d.mts +0 -3
- package/internal/utils/base64.d.mts.map +0 -1
- package/internal/utils/base64.d.ts +0 -3
- package/internal/utils/base64.d.ts.map +0 -1
- package/internal/utils/base64.js +0 -38
- package/internal/utils/base64.js.map +0 -1
- package/internal/utils/base64.mjs +0 -33
- package/internal/utils/base64.mjs.map +0 -1
- package/internal/utils/bytes.d.mts +0 -4
- package/internal/utils/bytes.d.mts.map +0 -1
- package/internal/utils/bytes.d.ts +0 -4
- package/internal/utils/bytes.d.ts.map +0 -1
- package/internal/utils/bytes.js +0 -31
- package/internal/utils/bytes.js.map +0 -1
- package/internal/utils/bytes.mjs +0 -26
- package/internal/utils/bytes.mjs.map +0 -1
- package/internal/utils/env.d.mts +0 -9
- package/internal/utils/env.d.mts.map +0 -1
- package/internal/utils/env.d.ts +0 -9
- package/internal/utils/env.d.ts.map +0 -1
- package/internal/utils/env.js +0 -22
- package/internal/utils/env.js.map +0 -1
- package/internal/utils/env.mjs +0 -18
- package/internal/utils/env.mjs.map +0 -1
- package/internal/utils/log.d.mts +0 -37
- package/internal/utils/log.d.mts.map +0 -1
- package/internal/utils/log.d.ts +0 -37
- package/internal/utils/log.d.ts.map +0 -1
- package/internal/utils/log.js +0 -85
- package/internal/utils/log.js.map +0 -1
- package/internal/utils/log.mjs +0 -79
- package/internal/utils/log.mjs.map +0 -1
- package/internal/utils/path.d.mts +0 -15
- package/internal/utils/path.d.mts.map +0 -1
- package/internal/utils/path.d.ts +0 -15
- package/internal/utils/path.d.ts.map +0 -1
- package/internal/utils/path.js +0 -79
- package/internal/utils/path.js.map +0 -1
- package/internal/utils/path.mjs +0 -74
- package/internal/utils/path.mjs.map +0 -1
- package/internal/utils/sleep.d.mts +0 -2
- package/internal/utils/sleep.d.mts.map +0 -1
- package/internal/utils/sleep.d.ts +0 -2
- package/internal/utils/sleep.d.ts.map +0 -1
- package/internal/utils/sleep.js +0 -7
- package/internal/utils/sleep.js.map +0 -1
- package/internal/utils/sleep.mjs +0 -3
- package/internal/utils/sleep.mjs.map +0 -1
- package/internal/utils/uuid.d.mts +0 -5
- package/internal/utils/uuid.d.mts.map +0 -1
- package/internal/utils/uuid.d.ts +0 -5
- package/internal/utils/uuid.d.ts.map +0 -1
- package/internal/utils/uuid.js +0 -19
- package/internal/utils/uuid.js.map +0 -1
- package/internal/utils/uuid.mjs +0 -15
- package/internal/utils/uuid.mjs.map +0 -1
- package/internal/utils/values.d.mts +0 -18
- package/internal/utils/values.d.mts.map +0 -1
- package/internal/utils/values.d.ts +0 -18
- package/internal/utils/values.d.ts.map +0 -1
- package/internal/utils/values.js +0 -112
- package/internal/utils/values.js.map +0 -1
- package/internal/utils/values.mjs +0 -94
- package/internal/utils/values.mjs.map +0 -1
- package/internal/utils.d.mts +0 -7
- package/internal/utils.d.mts.map +0 -1
- package/internal/utils.d.ts +0 -7
- package/internal/utils.d.ts.map +0 -1
- package/internal/utils.js +0 -11
- package/internal/utils.js.map +0 -1
- package/internal/utils.mjs +0 -8
- package/internal/utils.mjs.map +0 -1
- package/resource.d.mts +0 -2
- package/resource.d.mts.map +0 -1
- package/resource.d.ts +0 -2
- package/resource.d.ts.map +0 -1
- package/resource.js +0 -6
- package/resource.js.map +0 -1
- package/resource.mjs +0 -2
- package/resource.mjs.map +0 -1
- package/resources/events.d.mts +0 -48
- package/resources/events.d.mts.map +0 -1
- package/resources/events.d.ts +0 -48
- package/resources/events.d.ts.map +0 -1
- package/resources/events.js +0 -16
- package/resources/events.js.map +0 -1
- package/resources/events.mjs +0 -12
- package/resources/events.mjs.map +0 -1
- package/resources/index.d.mts +0 -3
- package/resources/index.d.mts.map +0 -1
- package/resources/index.d.ts +0 -3
- package/resources/index.d.ts.map +0 -1
- package/resources/index.js +0 -9
- package/resources/index.js.map +0 -1
- package/resources/index.mjs +0 -4
- package/resources/index.mjs.map +0 -1
- package/resources/users.d.mts +0 -44
- package/resources/users.d.mts.map +0 -1
- package/resources/users.d.ts +0 -44
- package/resources/users.d.ts.map +0 -1
- package/resources/users.js +0 -16
- package/resources/users.js.map +0 -1
- package/resources/users.mjs +0 -12
- package/resources/users.mjs.map +0 -1
- package/resources.d.mts +0 -2
- package/resources.d.mts.map +0 -1
- package/resources.d.ts +0 -2
- package/resources.d.ts.map +0 -1
- package/resources.js +0 -5
- package/resources.js.map +0 -1
- package/resources.mjs +0 -2
- package/resources.mjs.map +0 -1
- package/src/api-promise.ts +0 -2
- package/src/client.ts +0 -739
- package/src/core/README.md +0 -3
- package/src/core/api-promise.ts +0 -92
- package/src/core/error.ts +0 -130
- package/src/core/resource.ts +0 -11
- package/src/core/uploads.ts +0 -2
- package/src/error.ts +0 -2
- package/src/index.ts +0 -22
- package/src/internal/README.md +0 -3
- package/src/internal/builtin-types.ts +0 -93
- package/src/internal/detect-platform.ts +0 -196
- package/src/internal/errors.ts +0 -33
- package/src/internal/headers.ts +0 -97
- package/src/internal/parse.ts +0 -50
- package/src/internal/request-options.ts +0 -91
- package/src/internal/shim-types.ts +0 -26
- package/src/internal/shims.ts +0 -107
- package/src/internal/to-file.ts +0 -154
- package/src/internal/types.ts +0 -95
- package/src/internal/uploads.ts +0 -187
- package/src/internal/utils/base64.ts +0 -40
- package/src/internal/utils/bytes.ts +0 -32
- package/src/internal/utils/env.ts +0 -18
- package/src/internal/utils/log.ts +0 -126
- package/src/internal/utils/path.ts +0 -88
- package/src/internal/utils/sleep.ts +0 -3
- package/src/internal/utils/uuid.ts +0 -17
- package/src/internal/utils/values.ts +0 -105
- package/src/internal/utils.ts +0 -8
- package/src/lib/.keep +0 -4
- package/src/resource.ts +0 -2
- package/src/resources/events.ts +0 -58
- package/src/resources/index.ts +0 -4
- package/src/resources/users.ts +0 -53
- package/src/resources.ts +0 -1
- package/src/tsconfig.json +0 -11
- package/src/uploads.ts +0 -2
- package/src/version.ts +0 -1
- package/uploads.d.mts +0 -2
- package/uploads.d.mts.map +0 -1
- package/uploads.d.ts +0 -2
- package/uploads.d.ts.map +0 -1
- package/uploads.js +0 -6
- package/uploads.js.map +0 -1
- package/uploads.mjs +0 -2
- package/uploads.mjs.map +0 -1
- package/version.d.mts +0 -2
- package/version.d.mts.map +0 -1
- package/version.d.ts +0 -2
- package/version.d.ts.map +0 -1
- package/version.js +0 -5
- package/version.js.map +0 -1
- package/version.mjs +0 -2
- package/version.mjs.map +0 -1
package/dist/index.d.mts
ADDED
|
@@ -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.d.ts
ADDED
|
@@ -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":"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","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
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
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
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
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
|
-
"
|
|
28
|
-
|
|
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
package/api-promise.d.mts.map
DELETED
|
@@ -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
package/api-promise.d.ts.map
DELETED
|
@@ -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
|
package/api-promise.js.map
DELETED
|
@@ -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
package/api-promise.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-promise.mjs","sourceRoot":"","sources":["src/api-promise.ts"],"names":[],"mappings":""}
|