@seedkey/sdk-client 0.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/CHANGELOG.md +3 -0
- package/LICENSE +21 -0
- package/README.md +262 -0
- package/dist/api.d.ts +34 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +115 -0
- package/dist/api.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +111 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +130 -0
- package/dist/logger.js.map +1 -0
- package/dist/seedkey.d.ts +186 -0
- package/dist/seedkey.d.ts.map +1 -0
- package/dist/seedkey.js +567 -0
- package/dist/seedkey.js.map +1 -0
- package/dist/storage.d.ts +42 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +104 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +166 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +70 -0
- package/dist/types.js.map +1 -0
- package/package.json +96 -0
package/dist/storage.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local token storage
|
|
3
|
+
*/
|
|
4
|
+
import { storageLogger as log } from './logger';
|
|
5
|
+
const STORAGE_KEYS = {
|
|
6
|
+
ACCESS_TOKEN: 'seedkey_access_token',
|
|
7
|
+
REFRESH_TOKEN: 'seedkey_refresh_token',
|
|
8
|
+
EXPIRES_AT: 'seedkey_expires_at',
|
|
9
|
+
USER_ID: 'seedkey_user_id',
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Save tokens to localStorage
|
|
13
|
+
*/
|
|
14
|
+
export function saveTokens(tokens, userId) {
|
|
15
|
+
log.debug('Saving tokens...', {
|
|
16
|
+
hasAccessToken: !!tokens.accessToken,
|
|
17
|
+
hasRefreshToken: !!tokens.refreshToken,
|
|
18
|
+
expiresIn: tokens.expiresIn,
|
|
19
|
+
userId
|
|
20
|
+
});
|
|
21
|
+
localStorage.setItem(STORAGE_KEYS.ACCESS_TOKEN, tokens.accessToken);
|
|
22
|
+
localStorage.setItem(STORAGE_KEYS.REFRESH_TOKEN, tokens.refreshToken);
|
|
23
|
+
const expiresAt = Date.now() + tokens.expiresIn * 1000;
|
|
24
|
+
localStorage.setItem(STORAGE_KEYS.EXPIRES_AT, expiresAt.toString());
|
|
25
|
+
if (userId) {
|
|
26
|
+
localStorage.setItem(STORAGE_KEYS.USER_ID, userId);
|
|
27
|
+
}
|
|
28
|
+
log.info('Tokens saved', { expiresAt: new Date(expiresAt).toLocaleString() });
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get access token
|
|
32
|
+
*/
|
|
33
|
+
export function getAccessToken() {
|
|
34
|
+
const token = localStorage.getItem(STORAGE_KEYS.ACCESS_TOKEN);
|
|
35
|
+
log.debug('getAccessToken', { hasToken: !!token });
|
|
36
|
+
return token;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get refresh token
|
|
40
|
+
*/
|
|
41
|
+
export function getRefreshToken() {
|
|
42
|
+
return localStorage.getItem(STORAGE_KEYS.REFRESH_TOKEN);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get user ID
|
|
46
|
+
*/
|
|
47
|
+
export function getUserId() {
|
|
48
|
+
return localStorage.getItem(STORAGE_KEYS.USER_ID);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check whether token is expired
|
|
52
|
+
*/
|
|
53
|
+
export function isTokenExpired() {
|
|
54
|
+
const expiresAt = localStorage.getItem(STORAGE_KEYS.EXPIRES_AT);
|
|
55
|
+
if (!expiresAt) {
|
|
56
|
+
log.debug('isTokenExpired: no expiration time');
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
// Consider expired 5 minutes before actual expiration
|
|
60
|
+
const bufferMs = 5 * 60 * 1000;
|
|
61
|
+
const expired = Date.now() > parseInt(expiresAt, 10) - bufferMs;
|
|
62
|
+
const expiresDate = new Date(parseInt(expiresAt, 10));
|
|
63
|
+
log.debug('isTokenExpired', {
|
|
64
|
+
expired,
|
|
65
|
+
expiresAt: expiresDate.toLocaleString(),
|
|
66
|
+
remainingMs: parseInt(expiresAt, 10) - Date.now() - bufferMs
|
|
67
|
+
});
|
|
68
|
+
return expired;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check whether token exists
|
|
72
|
+
*/
|
|
73
|
+
export function hasToken() {
|
|
74
|
+
return !!getAccessToken();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Clear all tokens
|
|
78
|
+
*/
|
|
79
|
+
export function clearTokens() {
|
|
80
|
+
log.info('Clearing tokens from localStorage');
|
|
81
|
+
localStorage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);
|
|
82
|
+
localStorage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);
|
|
83
|
+
localStorage.removeItem(STORAGE_KEYS.EXPIRES_AT);
|
|
84
|
+
localStorage.removeItem(STORAGE_KEYS.USER_ID);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get full session data
|
|
88
|
+
*/
|
|
89
|
+
export function getSession() {
|
|
90
|
+
const session = {
|
|
91
|
+
accessToken: getAccessToken(),
|
|
92
|
+
refreshToken: getRefreshToken(),
|
|
93
|
+
userId: getUserId(),
|
|
94
|
+
isExpired: isTokenExpired(),
|
|
95
|
+
};
|
|
96
|
+
log.debug('getSession', {
|
|
97
|
+
hasAccessToken: !!session.accessToken,
|
|
98
|
+
hasRefreshToken: !!session.refreshToken,
|
|
99
|
+
userId: session.userId,
|
|
100
|
+
isExpired: session.isExpired
|
|
101
|
+
});
|
|
102
|
+
return session;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
export declare const SDK_VERSION = "0.0.1";
|
|
2
|
+
/** Extension download URL */
|
|
3
|
+
export declare const EXTENSION_DOWNLOAD_URL = "";
|
|
4
|
+
export declare const REQUEST_EVENT = "seedkey:v1:request";
|
|
5
|
+
export declare const RESPONSE_EVENT = "seedkey:v1:response";
|
|
6
|
+
export interface ExtensionStatus {
|
|
7
|
+
/** Extension is installed */
|
|
8
|
+
installed: boolean;
|
|
9
|
+
/** Extension is configured (has an identity) */
|
|
10
|
+
initialized: boolean;
|
|
11
|
+
/** Download URL if not installed */
|
|
12
|
+
downloadUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface Challenge {
|
|
15
|
+
nonce: string;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
domain: string;
|
|
18
|
+
action: 'register' | 'authenticate';
|
|
19
|
+
expiresAt: number;
|
|
20
|
+
}
|
|
21
|
+
export interface TokenInfo {
|
|
22
|
+
accessToken: string;
|
|
23
|
+
refreshToken: string;
|
|
24
|
+
expiresIn: number;
|
|
25
|
+
}
|
|
26
|
+
export interface UserInfo {
|
|
27
|
+
id: string;
|
|
28
|
+
publicKey: string;
|
|
29
|
+
createdAt: string;
|
|
30
|
+
lastLogin?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface AuthResult {
|
|
33
|
+
success: boolean;
|
|
34
|
+
action: 'login' | 'register';
|
|
35
|
+
user: UserInfo;
|
|
36
|
+
token: TokenInfo;
|
|
37
|
+
}
|
|
38
|
+
export interface PublicKeyInfo {
|
|
39
|
+
id: string;
|
|
40
|
+
publicKey: string;
|
|
41
|
+
deviceName?: string;
|
|
42
|
+
addedAt: number;
|
|
43
|
+
lastUsed: number;
|
|
44
|
+
}
|
|
45
|
+
export interface UserProfile {
|
|
46
|
+
id: string;
|
|
47
|
+
publicKey: PublicKeyInfo;
|
|
48
|
+
createdAt: number;
|
|
49
|
+
}
|
|
50
|
+
export interface SeedKeyOptions {
|
|
51
|
+
/** Backend URL for authentication */
|
|
52
|
+
backendUrl: string;
|
|
53
|
+
/** Operation timeout (ms), default: 60000 */
|
|
54
|
+
timeout?: number;
|
|
55
|
+
/** Callback when authorization is required */
|
|
56
|
+
onAuthRequired?: () => void;
|
|
57
|
+
/** Enable debug logging */
|
|
58
|
+
debug?: boolean;
|
|
59
|
+
}
|
|
60
|
+
export interface AuthOptions {
|
|
61
|
+
/** Device metadata */
|
|
62
|
+
metadata?: {
|
|
63
|
+
deviceName?: string;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Extension API actions
|
|
68
|
+
*/
|
|
69
|
+
export type SeedKeyAction = 'check_available' | 'is_initialized' | 'get_public_key' | 'sign_challenge' | 'sign_message';
|
|
70
|
+
export interface SeedKeyRequest {
|
|
71
|
+
type: 'SEEDKEY_REQUEST';
|
|
72
|
+
version: string;
|
|
73
|
+
action: SeedKeyAction;
|
|
74
|
+
requestId: string;
|
|
75
|
+
origin: string;
|
|
76
|
+
payload?: {
|
|
77
|
+
domain?: string;
|
|
78
|
+
challenge?: Challenge;
|
|
79
|
+
message?: string;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export interface SeedKeyResponse {
|
|
83
|
+
type: 'SEEDKEY_RESPONSE';
|
|
84
|
+
version: string;
|
|
85
|
+
requestId: string;
|
|
86
|
+
success: boolean;
|
|
87
|
+
result?: unknown;
|
|
88
|
+
error?: {
|
|
89
|
+
code: string;
|
|
90
|
+
message: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export interface PublicKeyResult {
|
|
94
|
+
publicKey: string;
|
|
95
|
+
domain: string;
|
|
96
|
+
}
|
|
97
|
+
export interface SignChallengeResult {
|
|
98
|
+
signature: string;
|
|
99
|
+
publicKey: string;
|
|
100
|
+
}
|
|
101
|
+
export interface SignMessageResult {
|
|
102
|
+
signature: string;
|
|
103
|
+
publicKey: string;
|
|
104
|
+
message: string;
|
|
105
|
+
}
|
|
106
|
+
export interface ChallengeResponse {
|
|
107
|
+
challenge: Challenge;
|
|
108
|
+
challengeId: string;
|
|
109
|
+
}
|
|
110
|
+
export interface RegisterRequest {
|
|
111
|
+
publicKey: string;
|
|
112
|
+
challenge: Challenge;
|
|
113
|
+
signature: string;
|
|
114
|
+
metadata?: {
|
|
115
|
+
deviceName?: string;
|
|
116
|
+
extensionVersion?: string;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export interface VerifyRequest {
|
|
120
|
+
challengeId: string;
|
|
121
|
+
challenge: Challenge;
|
|
122
|
+
signature: string;
|
|
123
|
+
publicKey: string;
|
|
124
|
+
}
|
|
125
|
+
export declare const ERROR_CODES: {
|
|
126
|
+
readonly EXTENSION_NOT_FOUND: "EXTENSION_NOT_FOUND";
|
|
127
|
+
readonly EXTENSION_NOT_CONFIGURED: "EXTENSION_NOT_CONFIGURED";
|
|
128
|
+
readonly NOT_INITIALIZED: "NOT_INITIALIZED";
|
|
129
|
+
readonly EXTENSION_LOCKED: "LOCKED";
|
|
130
|
+
readonly TIMEOUT: "TIMEOUT";
|
|
131
|
+
readonly USER_REJECTED: "USER_REJECTED";
|
|
132
|
+
readonly BIOMETRIC_FAILED: "BIOMETRIC_FAILED";
|
|
133
|
+
readonly DOMAIN_MISMATCH: "DOMAIN_MISMATCH";
|
|
134
|
+
readonly INVALID_CHALLENGE: "INVALID_CHALLENGE";
|
|
135
|
+
readonly NETWORK_ERROR: "NETWORK_ERROR";
|
|
136
|
+
readonly SERVER_ERROR: "SERVER_ERROR";
|
|
137
|
+
readonly CHALLENGE_EXPIRED: "CHALLENGE_EXPIRED";
|
|
138
|
+
readonly NONCE_REUSED: "NONCE_REUSED";
|
|
139
|
+
readonly USER_NOT_FOUND: "USER_NOT_FOUND";
|
|
140
|
+
readonly USER_EXISTS: "USER_EXISTS";
|
|
141
|
+
readonly INVALID_SIGNATURE: "INVALID_SIGNATURE";
|
|
142
|
+
readonly INVALID_TOKEN: "INVALID_TOKEN";
|
|
143
|
+
};
|
|
144
|
+
export type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];
|
|
145
|
+
export declare class SeedKeyError extends Error {
|
|
146
|
+
code: string;
|
|
147
|
+
hint?: string | undefined;
|
|
148
|
+
/** Extension download URL (for EXTENSION_NOT_FOUND) */
|
|
149
|
+
downloadUrl?: string | undefined;
|
|
150
|
+
constructor(code: string, message: string, hint?: string | undefined,
|
|
151
|
+
/** Extension download URL (for EXTENSION_NOT_FOUND) */
|
|
152
|
+
downloadUrl?: string | undefined);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Extension missing error
|
|
156
|
+
*/
|
|
157
|
+
export declare class ExtensionNotFoundError extends SeedKeyError {
|
|
158
|
+
constructor(message?: string);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Extension not configured error
|
|
162
|
+
*/
|
|
163
|
+
export declare class ExtensionNotConfiguredError extends SeedKeyError {
|
|
164
|
+
constructor(message?: string);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// SDK Version & Constants
|
|
3
|
+
// ============================================================================
|
|
4
|
+
export const SDK_VERSION = '0.0.1';
|
|
5
|
+
/** Extension download URL */
|
|
6
|
+
export const EXTENSION_DOWNLOAD_URL = '';
|
|
7
|
+
// Event names for communication with content script (versioned)
|
|
8
|
+
export const REQUEST_EVENT = `seedkey:v1:request`;
|
|
9
|
+
export const RESPONSE_EVENT = `seedkey:v1:response`;
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Error Codes
|
|
12
|
+
// ============================================================================
|
|
13
|
+
export const ERROR_CODES = {
|
|
14
|
+
// Extension errors
|
|
15
|
+
EXTENSION_NOT_FOUND: 'EXTENSION_NOT_FOUND',
|
|
16
|
+
EXTENSION_NOT_CONFIGURED: 'EXTENSION_NOT_CONFIGURED',
|
|
17
|
+
NOT_INITIALIZED: 'NOT_INITIALIZED',
|
|
18
|
+
EXTENSION_LOCKED: 'LOCKED',
|
|
19
|
+
TIMEOUT: 'TIMEOUT',
|
|
20
|
+
// User actions
|
|
21
|
+
USER_REJECTED: 'USER_REJECTED',
|
|
22
|
+
BIOMETRIC_FAILED: 'BIOMETRIC_FAILED',
|
|
23
|
+
// Validation errors (in Extension)
|
|
24
|
+
DOMAIN_MISMATCH: 'DOMAIN_MISMATCH',
|
|
25
|
+
INVALID_CHALLENGE: 'INVALID_CHALLENGE',
|
|
26
|
+
// Server/Network errors
|
|
27
|
+
NETWORK_ERROR: 'NETWORK_ERROR',
|
|
28
|
+
SERVER_ERROR: 'SERVER_ERROR',
|
|
29
|
+
// Challenge errors
|
|
30
|
+
CHALLENGE_EXPIRED: 'CHALLENGE_EXPIRED',
|
|
31
|
+
NONCE_REUSED: 'NONCE_REUSED',
|
|
32
|
+
// Auth errors
|
|
33
|
+
USER_NOT_FOUND: 'USER_NOT_FOUND',
|
|
34
|
+
USER_EXISTS: 'USER_EXISTS',
|
|
35
|
+
INVALID_SIGNATURE: 'INVALID_SIGNATURE',
|
|
36
|
+
INVALID_TOKEN: 'INVALID_TOKEN',
|
|
37
|
+
};
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Errors
|
|
40
|
+
// ============================================================================
|
|
41
|
+
export class SeedKeyError extends Error {
|
|
42
|
+
constructor(code, message, hint,
|
|
43
|
+
/** Extension download URL (for EXTENSION_NOT_FOUND) */
|
|
44
|
+
downloadUrl) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.code = code;
|
|
47
|
+
this.hint = hint;
|
|
48
|
+
this.downloadUrl = downloadUrl;
|
|
49
|
+
this.name = 'SeedKeyError';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Extension missing error
|
|
54
|
+
*/
|
|
55
|
+
export class ExtensionNotFoundError extends SeedKeyError {
|
|
56
|
+
constructor(message = 'SeedKey extension not found. Please install it.') {
|
|
57
|
+
super(ERROR_CODES.EXTENSION_NOT_FOUND, message, 'Install SeedKey browser extension', EXTENSION_DOWNLOAD_URL);
|
|
58
|
+
this.name = 'ExtensionNotFoundError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Extension not configured error
|
|
63
|
+
*/
|
|
64
|
+
export class ExtensionNotConfiguredError extends SeedKeyError {
|
|
65
|
+
constructor(message = 'SeedKey extension is not configured. Please set up your identity.') {
|
|
66
|
+
super(ERROR_CODES.EXTENSION_NOT_CONFIGURED, message, 'Open SeedKey extension and create your identity');
|
|
67
|
+
this.name = 'ExtensionNotConfiguredError';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,6BAA6B;AAC7B,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,gEAAgE;AAChE,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAC;AA4KpD,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,mBAAmB;IACnB,mBAAmB,EAAE,qBAAqB;IAC1C,wBAAwB,EAAE,0BAA0B;IACpD,eAAe,EAAE,iBAAiB;IAClC,gBAAgB,EAAE,QAAQ;IAC1B,OAAO,EAAE,SAAS;IAElB,eAAe;IACf,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;IAEpC,mCAAmC;IACnC,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IAEtC,wBAAwB;IACxB,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,cAAc;IAE5B,mBAAmB;IACnB,iBAAiB,EAAE,mBAAmB;IACtC,YAAY,EAAE,cAAc;IAE5B,cAAc;IACd,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,eAAe;CACtB,CAAC;AAIX,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YACS,IAAY,EACnB,OAAe,EACR,IAAa;IACpB,uDAAuD;IAChD,WAAoB;QAE3B,KAAK,CAAC,OAAO,CAAC,CAAC;QANR,SAAI,GAAJ,IAAI,CAAQ;QAEZ,SAAI,GAAJ,IAAI,CAAS;QAEb,gBAAW,GAAX,WAAW,CAAS;QAG3B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IACtD,YAAY,OAAO,GAAG,iDAAiD;QACrE,KAAK,CACH,WAAW,CAAC,mBAAmB,EAC/B,OAAO,EACP,mCAAmC,EACnC,sBAAsB,CACvB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,YAAY;IAC3D,YAAY,OAAO,GAAG,mEAAmE;QACvF,KAAK,CACH,WAAW,CAAC,wBAAwB,EACpC,OAAO,EACP,iDAAiD,CAClD,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@seedkey/sdk-client",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "SeedKey Auth SDK - client library for passwordless authentication via the SeedKey browser extension",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./storage": {
|
|
15
|
+
"import": "./dist/storage.js",
|
|
16
|
+
"types": "./dist/storage.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./logger": {
|
|
19
|
+
"import": "./dist/logger.js",
|
|
20
|
+
"types": "./dist/logger.d.ts"
|
|
21
|
+
},
|
|
22
|
+
"./types": {
|
|
23
|
+
"import": "./dist/types.js",
|
|
24
|
+
"types": "./dist/types.d.ts"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
"README.md",
|
|
30
|
+
"LICENSE",
|
|
31
|
+
"CHANGELOG.md"
|
|
32
|
+
],
|
|
33
|
+
"sideEffects": false,
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "npm run clean && tsc",
|
|
36
|
+
"dev": "tsc --watch",
|
|
37
|
+
"clean": "rimraf dist",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"lint": "eslint src --ext .ts",
|
|
40
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"test:watch": "vitest",
|
|
43
|
+
"test:coverage": "vitest run --coverage",
|
|
44
|
+
"test:ui": "vitest --ui",
|
|
45
|
+
"prepublishOnly": "npm run typecheck && npm run test && npm run build",
|
|
46
|
+
"release": "npm run prepublishOnly && npm publish --access public",
|
|
47
|
+
"release:dry": "npm run prepublishOnly && npm publish --access public --dry-run",
|
|
48
|
+
"version:patch": "npm version patch --no-git-tag-version",
|
|
49
|
+
"version:minor": "npm version minor --no-git-tag-version",
|
|
50
|
+
"version:major": "npm version major --no-git-tag-version",
|
|
51
|
+
"version:prerelease": "npm version prerelease --preid=beta --no-git-tag-version"
|
|
52
|
+
},
|
|
53
|
+
"keywords": [
|
|
54
|
+
"seedkey",
|
|
55
|
+
"auth",
|
|
56
|
+
"authentication",
|
|
57
|
+
"passwordless",
|
|
58
|
+
"crypto",
|
|
59
|
+
"ed25519",
|
|
60
|
+
"browser-extension",
|
|
61
|
+
"webauthn",
|
|
62
|
+
"cryptographic-authentication",
|
|
63
|
+
"challenge-response",
|
|
64
|
+
"jwt",
|
|
65
|
+
"typescript"
|
|
66
|
+
],
|
|
67
|
+
"author": "mbessarab",
|
|
68
|
+
"license": "MIT",
|
|
69
|
+
"repository": {
|
|
70
|
+
"type": "git",
|
|
71
|
+
"url": "https://github.com/mbessarab/seedkey-client-sdk.git"
|
|
72
|
+
},
|
|
73
|
+
"homepage": "https://github.com/mbessarab/seedkey-client-sdk#readme",
|
|
74
|
+
"bugs": {
|
|
75
|
+
"url": "https://github.com/mbessarab/seedkey-client-sdk/issues"
|
|
76
|
+
},
|
|
77
|
+
"publishConfig": {
|
|
78
|
+
"access": "public",
|
|
79
|
+
"registry": "https://registry.npmjs.org/"
|
|
80
|
+
},
|
|
81
|
+
"devDependencies": {
|
|
82
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
83
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
84
|
+
"@vitest/coverage-v8": "^2.1.8",
|
|
85
|
+
"@vitest/ui": "^2.1.8",
|
|
86
|
+
"eslint": "^9.0.0",
|
|
87
|
+
"happy-dom": "^15.11.7",
|
|
88
|
+
"rimraf": "^5.0.5",
|
|
89
|
+
"typescript": "~5.6.3",
|
|
90
|
+
"vitest": "^2.1.8"
|
|
91
|
+
},
|
|
92
|
+
"peerDependencies": {},
|
|
93
|
+
"engines": {
|
|
94
|
+
"node": ">=18"
|
|
95
|
+
}
|
|
96
|
+
}
|