react-sip-kit 0.5.21 → 0.6.2

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/dist/manager.d.ts CHANGED
@@ -1,53 +1,71 @@
1
1
  import { LineType, SipUserAgentStatus } from './store/types';
2
- import { SipManagerConfig } from './types';
2
+ import { GetAccountKey, GetMethodsKey, LineLookup, SipManagerConfig } from './types';
3
3
  export declare class SipManager {
4
4
  private instances;
5
5
  /**
6
- * Create and initialize a SIP session for an account.
6
+ * Update the configuration for an existing SIP instance.
7
+ * - Updates both local instance map and global store.
8
+ * - Does NOT restart or reconnect automatically.
7
9
  *
8
- * @param {SipManagerConfig} config - SIP account configuration (account, transport, registration, etc.)
9
- * @returns {Promise<void>} Resolves when initialization is complete.
10
+ * Use `initilizeMediaStreams` or `reconnect()` if runtime behavior must change.
11
+ *
12
+ * @param username - SIP account username
13
+ * @param config - Updated SIP configuration
14
+ */
15
+ private updateConfig;
16
+ /**
17
+ * Add a new SIP account, or update an existing one if the config has changed.
18
+ *
19
+ * - If identical config already exists → ignored.
20
+ * - If username exists with a different config → re-initializes media streams.
21
+ * - Otherwise → creates and initializes a new SIP instance.
22
+ *
23
+ * @param config - SIP account configuration
10
24
  */
11
25
  add(config: SipManagerConfig): Promise<void>;
12
26
  /**
13
- * Get session methods (dial, answer, hold, etc.) for a given username.
27
+ * Get session methods (dial, answer, hold, etc.) for a live session.
28
+ *
29
+ * Resolves the session by `username`, `lineKey`, or `remoteNumber`.
14
30
  *
15
- * @param {string} username - The SIP account username.
16
- * @returns {ReturnType<typeof sessionMethods>} Object containing call/session methods.
31
+ * @param key - Identifier for session resolution
32
+ * @throws Error if no session could be resolved
17
33
  */
18
- methods(username: string): {
34
+ getSessionMethodsBy(key: GetMethodsKey): {
19
35
  receiveSession: (invitation: import("./store/types").SipInvitationType) => void;
20
- answerAudioSession: (lineNumber: LineType["lineNumber"]) => void;
21
- answerVideoSession: (lineNumber: LineType["lineNumber"], enableVideo?: boolean) => void;
36
+ answerAudioSession: (lineKey: LineType["lineKey"]) => void;
37
+ answerVideoSession: (lineKey: LineType["lineKey"], enableVideo?: boolean) => void;
22
38
  makeAudioSession: (lineObj: LineType, dialledNumber: string, extraHeaders?: Array<string>) => void;
23
39
  makeVideoSession: (lineObj: LineType, dialledNumber: string, extraHeaders?: Array<string>) => void;
24
- toggleLocalVideoTrack: (lineNumber: LineType["lineNumber"]) => Promise<void>;
25
- toggleShareScreen: (lineNumber: LineType["lineNumber"]) => Promise<void>;
26
- rejectSession: (lineNumber: LineType["lineNumber"]) => void;
40
+ toggleLocalVideoTrack: (lineKey: LineType["lineKey"]) => Promise<void>;
41
+ toggleShareScreen: (lineKey: LineType["lineKey"]) => Promise<void>;
42
+ rejectSession: (lineKey: LineType["lineKey"]) => void;
27
43
  dialByNumber: (type: Extract<import("./types").CallType, "audio" | "video">, dialNumber: string, extraHeaders?: Array<string>) => void;
28
- endSession: (lineNumber: LineType["lineNumber"]) => void;
29
- recordSession: (lineNumber: LineType["lineNumber"]) => {
44
+ endSession: (lineKey: LineType["lineKey"]) => void;
45
+ recordSession: (lineKey: LineType["lineKey"]) => {
30
46
  start: () => Promise<void>;
31
47
  stop: () => void;
32
48
  };
33
- toggleMuteSession: (lineNumber: LineType["lineNumber"]) => void;
34
- toggleHoldSession: (lineNumber: LineType["lineNumber"], forcedValue?: boolean) => void;
35
- makeTransferSession: (lineNumber: LineType["lineNumber"], transferLineNumber: LineType["lineNumber"]) => void;
36
- cancelTransferSession: (lineNumber: LineType["lineNumber"], transferLineNumber: LineType["lineNumber"]) => void;
37
- cancelSession: (lineNumber: LineType["lineNumber"]) => void;
49
+ toggleMuteSession: (lineKey: LineType["lineKey"]) => void;
50
+ toggleHoldSession: (lineKey: LineType["lineKey"], forcedValue?: boolean) => void;
51
+ makeTransferSession: (lineKey: LineType["lineKey"], transferLineKey: LineType["lineKey"]) => void;
52
+ cancelTransferSession: (lineKey: LineType["lineKey"], transferLineKey: LineType["lineKey"]) => void;
53
+ cancelSession: (lineKey: LineType["lineKey"]) => void;
38
54
  teardownSession: typeof import("./methods/session").teardownSession;
39
55
  };
40
56
  /**
41
- * Get SIP account state by username.
57
+ * Get SIP account state.
58
+ *
59
+ * Resolves the account by `username`, `lineKey`, or `remoteNumber`.
42
60
  *
43
- * @param {string} username - The SIP account username.
44
- * @returns {{
45
- * status: SipUserAgentStatus;
46
- * lines: LineType[];
47
- * watch: ReturnType<typeof useSipManager>;
48
- * }} An object with account status, active lines, and a reactive watcher hook.
61
+ * @param key - Identifier for account resolution
62
+ * @returns Object containing:
63
+ * - `status` → UA status
64
+ * - `lines` → all active lines
65
+ * - `watch` reactive watcher hook
66
+ * @throws Error if no username could be resolved
49
67
  */
50
- get(username: string): {
68
+ getAccountBy(key: GetAccountKey): {
51
69
  status: SipUserAgentStatus;
52
70
  lines: LineType[];
53
71
  watch: () => {
@@ -56,46 +74,42 @@ export declare class SipManager {
56
74
  };
57
75
  };
58
76
  /**
59
- * Check if a SIP instance already exists for the username.
60
- *
61
- * @param {string} username - The SIP account username.
62
- * @returns {boolean} True if the instance exists, false otherwise.
77
+ * Check if an instance exists for the given username.
63
78
  */
64
79
  has(username: string): boolean;
65
80
  /**
66
- * Attempt to reconnect the SIP transport for a given username.
67
- *
68
- * @param {string} username - The SIP account username.
69
- * @returns {void}
81
+ * Reconnect transport for an existing SIP instance.
70
82
  */
71
83
  reconnect(username: string): void;
72
84
  /**
73
- * Stop and remove a SIP session for a username.
74
- * Also cleans up from the global store.
75
- *
76
- * @param {string} username - The SIP account username.
77
- * @returns {Promise<void>} Resolves when the session is stopped and removed.
85
+ * Stop and remove a SIP instance by username.
86
+ * Also removes related data from the global store.
78
87
  */
79
88
  stop(username: string): Promise<void>;
80
89
  /**
81
- * Stop and clear ALL SIP sessions.
82
- * Useful on logout or app shutdown.
83
- *
84
- * @returns {Promise<void>} Resolves when all sessions are stopped and cleared.
90
+ * Stop and clear all SIP instances.
91
+ * Useful for logout or application shutdown.
85
92
  */
86
93
  stopAll(): Promise<void>;
87
94
  /**
88
- * Find the username associated with a specific line number.
95
+ * Get a Line by either `lineKey` or `remoteNumber`.
96
+ *
97
+ * @param key - Lookup key (mutually exclusive)
98
+ * @returns Line if found, otherwise null
99
+ */
100
+ getLineBy(key: LineLookup): LineType | null;
101
+ /**
102
+ * Get a SIP session by either `lineKey` or `remoteNumber`.
89
103
  *
90
- * @param {LineType['lineNumber']} lineNumber - The line number to look up.
91
- * @returns {string | undefined} The username if found, otherwise undefined.
104
+ * @param key - Lookup key (mutually exclusive)
105
+ * @returns SIP session if found, otherwise null
92
106
  */
93
- getUsernameByNumber(lineNumber: LineType['lineNumber']): string | null;
107
+ getSessionBy(key: LineLookup): import("./store/types").SipInvitationType | import("./store/types").SipInviterType | null;
94
108
  /**
95
- * Find the SIP session associated with a specific line number.
109
+ * Get a username by either `lineKey` or `remoteNumber`.
96
110
  *
97
- * @param {LineType['lineNumber']} lineNumber - The line number to look up.
98
- * @returns {any} The SIP session object if found, otherwise undefined.
111
+ * @param key - Lookup key (mutually exclusive)
112
+ * @returns Username if found, otherwise null
99
113
  */
100
- getSessionByNumber(lineNumber: LineType['lineNumber']): import("./store/types").SipInvitationType | import("./store/types").SipInviterType | null;
114
+ getUsernameBy(key: LineLookup): string | null;
101
115
  }
@@ -6,24 +6,24 @@ export declare const sessionMethods: ({ username }: {
6
6
  username: SipAccountConfig["username"];
7
7
  }) => {
8
8
  receiveSession: (invitation: SipInvitationType) => void;
9
- answerAudioSession: (lineNumber: LineType["lineNumber"]) => void;
10
- answerVideoSession: (lineNumber: LineType["lineNumber"], enableVideo?: boolean) => void;
9
+ answerAudioSession: (lineKey: LineType["lineKey"]) => void;
10
+ answerVideoSession: (lineKey: LineType["lineKey"], enableVideo?: boolean) => void;
11
11
  makeAudioSession: (lineObj: LineType, dialledNumber: string, extraHeaders?: Array<string>) => void;
12
12
  makeVideoSession: (lineObj: LineType, dialledNumber: string, extraHeaders?: Array<string>) => void;
13
- toggleLocalVideoTrack: (lineNumber: LineType["lineNumber"]) => Promise<void>;
14
- toggleShareScreen: (lineNumber: LineType["lineNumber"]) => Promise<void>;
15
- rejectSession: (lineNumber: LineType["lineNumber"]) => void;
13
+ toggleLocalVideoTrack: (lineKey: LineType["lineKey"]) => Promise<void>;
14
+ toggleShareScreen: (lineKey: LineType["lineKey"]) => Promise<void>;
15
+ rejectSession: (lineKey: LineType["lineKey"]) => void;
16
16
  dialByNumber: (type: Extract<CallType, "audio" | "video">, dialNumber: string, extraHeaders?: Array<string>) => void;
17
- endSession: (lineNumber: LineType["lineNumber"]) => void;
18
- recordSession: (lineNumber: LineType["lineNumber"]) => {
17
+ endSession: (lineKey: LineType["lineKey"]) => void;
18
+ recordSession: (lineKey: LineType["lineKey"]) => {
19
19
  start: () => Promise<void>;
20
20
  stop: () => void;
21
21
  };
22
- toggleMuteSession: (lineNumber: LineType["lineNumber"]) => void;
23
- toggleHoldSession: (lineNumber: LineType["lineNumber"], forcedValue?: boolean) => void;
24
- makeTransferSession: (lineNumber: LineType["lineNumber"], transferLineNumber: LineType["lineNumber"]) => void;
25
- cancelTransferSession: (lineNumber: LineType["lineNumber"], transferLineNumber: LineType["lineNumber"]) => void;
26
- cancelSession: (lineNumber: LineType["lineNumber"]) => void;
22
+ toggleMuteSession: (lineKey: LineType["lineKey"]) => void;
23
+ toggleHoldSession: (lineKey: LineType["lineKey"], forcedValue?: boolean) => void;
24
+ makeTransferSession: (lineKey: LineType["lineKey"], transferLineKey: LineType["lineKey"]) => void;
25
+ cancelTransferSession: (lineKey: LineType["lineKey"], transferLineKey: LineType["lineKey"]) => void;
26
+ cancelSession: (lineKey: LineType["lineKey"]) => void;
27
27
  teardownSession: typeof teardownSession;
28
28
  };
29
29
  /**
@@ -40,5 +40,3 @@ export declare function sendVideoActivationWithAckRetry(session: LineType['sipSe
40
40
  maxRetries?: number;
41
41
  delayMs?: number;
42
42
  }): Promise<void>;
43
- export declare const getUsernameByNumber: (lineNumber: LineType["lineNumber"]) => SipAccountConfig["username"] | null;
44
- export declare const getSessionByNumber: (lineNumber: LineType["lineNumber"]) => LineType["sipSession"] | null;
@@ -6,28 +6,31 @@ export interface SipStoreStateType {
6
6
  configs: Record<SipAccountConfig['username'], SipConfigs> | null;
7
7
  statuses: Record<SipAccountConfig['username'], SipUserAgentStatus> | null;
8
8
  userAgents?: Record<SipAccountConfig['username'], SipUserAgent>;
9
- lines: Record<SipAccountConfig['username'], Record<LineType['lineNumber'], LineType>>;
10
- usernamesByLineNumber: Record<LineType['lineNumber'], SipAccountConfig['username']>;
9
+ lines: Record<SipAccountConfig['username'], Record<LineType['lineKey'], LineType>>;
10
+ usernamesByLineKey: Record<LineType['lineKey'], SipAccountConfig['username']>;
11
+ lineKeyByRemoteNumber: Record<SipSessionDataType['remoteNumber'], LineType['lineKey']>;
11
12
  devicesInfo: DevicesInfoType;
12
13
  setSipStore: (state: Partial<SipStoreStateType>) => void;
13
14
  setConfig: (username: SipAccountConfig['username'], userAgent: SipConfigs) => void;
14
15
  setUserAgent: (username: SipAccountConfig['username'], userAgent: SipUserAgent) => void;
15
- addLine: (username: SipAccountConfig['username'], line: LineType) => void;
16
+ addLine: (line: LineType) => void;
16
17
  updateLine: (line: LineType, callback?: CallbackFunction) => void;
17
- removeLine: (lineNumber: LineType['lineNumber']) => void;
18
+ removeLine: (lineKey: LineType['lineKey']) => void;
18
19
  remove: (username: SipAccountConfig['username']) => void;
19
20
  removeAll: () => void;
20
- findLineByNumber: (lineNumber: LineType['lineNumber']) => LineType | null;
21
- getSessionByNumber: (lineNumber: LineType['lineNumber']) => LineType['sipSession'] | null;
22
- getUsernameByNumber: (lineNumber: LineType['lineNumber']) => SipAccountConfig['username'] | null;
23
- getNewLineNumber: () => number;
21
+ findLineByLineKey: (lineKey: LineType['lineKey']) => LineType | null;
22
+ getSessionByLineKey: (lineKey: LineType['lineKey']) => LineType['sipSession'] | null;
23
+ getUsernameByLineKey: (lineKey: LineType['lineKey']) => SipAccountConfig['username'] | null;
24
+ getUsernameByRemoteNumber: (remoteNumber: SipSessionDataType['remoteNumber']) => SipAccountConfig['username'] | null;
25
+ getLineKeyByRemoteNumber: (remoteNumber: SipSessionDataType['remoteNumber']) => LineType['lineKey'] | null;
26
+ getLineByRemoteNumber: (remoteNumber: SipSessionDataType['remoteNumber']) => LineType | null;
27
+ getNewLineKey: () => number;
24
28
  }
25
29
  export interface SipInvitationType extends Omit<Invitation, 'incomingInviteRequest' | 'sessionDescriptionHandler'> {
26
30
  data: Partial<SipSessionDataType>;
27
31
  incomingInviteRequest: IncomingInviteRequest;
28
32
  sessionDescriptionHandler: SipSessionDescriptionHandler;
29
33
  sessionDescriptionHandlerOptionsReInvite: SipSessionDescriptionHandlerOptions;
30
- isOnHold: boolean;
31
34
  initiateLocalMediaStreams: (params: InitiateMediaStreamsParams) => void;
32
35
  initiateRemoteMediaStreams: (params: InitiateMediaStreamsParams) => void;
33
36
  }
@@ -43,7 +46,6 @@ export interface SipInviterType extends Inviter {
43
46
  data: Partial<SipSessionDataType>;
44
47
  sessionDescriptionHandler: SipSessionDescriptionHandler;
45
48
  sessionDescriptionHandlerOptionsReInvite: SipSessionDescriptionHandlerOptions;
46
- isOnHold: boolean;
47
49
  initiateLocalMediaStreams: (params: InitiateMediaStreamsParams) => void;
48
50
  initiateRemoteMediaStreams: (params: InitiateMediaStreamsParams) => void;
49
51
  }
@@ -52,8 +54,9 @@ export interface SipSessionDescriptionHandler extends SessionDescriptionHandler
52
54
  peerConnectionDelegate: any;
53
55
  }
54
56
  export interface LineType {
55
- lineNumber: number;
56
- displayNumber: string;
57
+ lineKey: number;
58
+ remoteNumber: string;
59
+ username: SipAccountConfig['username'];
57
60
  sipSession: SipInvitationType | SipInviterType | null;
58
61
  localSoundMeter: any;
59
62
  remoteSoundMeter: any;
@@ -62,11 +65,12 @@ export interface SipSessionType extends Session {
62
65
  data: SipSessionDataType;
63
66
  }
64
67
  export interface SipSessionDataType {
65
- line: number;
68
+ lineKey: number;
66
69
  callDirection: 'inbound' | 'outbound';
67
70
  callType: CallType;
68
71
  terminateBy: string;
69
72
  remoteNumber: string;
73
+ username: SipAccountConfig['username'];
70
74
  earlyReject: boolean;
71
75
  reasonCode: number;
72
76
  reasonText: string;
package/dist/types.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { SipConfigs } from './configs/types';
2
2
  import { reconnectTransport } from './events/transport';
3
- import { SipSessionType } from './store/types';
3
+ import { SipInitializer } from './initializer';
4
+ import { LineType, SipSessionDataType, SipSessionType } from './store/types';
4
5
  import { Registerer, Subscriber, UserAgent } from 'sip.js';
5
6
  export interface SipUserAgent extends UserAgent {
6
7
  isReRegister: boolean;
@@ -36,3 +37,40 @@ export interface SipContextTransportType {
36
37
  }
37
38
  export type CallbackFunction<T = any> = (value?: T) => void;
38
39
  export type CallType = 'audio' | 'video' | 'conferenceAudio' | 'conferenceVideo' | 'transferAudio' | 'transferVideo';
40
+ export interface SipManagerInstance {
41
+ config: SipManagerConfig;
42
+ instance: SipInitializer;
43
+ }
44
+ export type GetAccountKey = {
45
+ username: string;
46
+ lineKey?: never;
47
+ remoteNumber?: never;
48
+ } | {
49
+ lineKey: LineType['lineKey'];
50
+ username?: never;
51
+ remoteNumber?: never;
52
+ } | {
53
+ remoteNumber: SipSessionDataType['remoteNumber'];
54
+ username?: never;
55
+ lineKey?: never;
56
+ };
57
+ export type GetMethodsKey = {
58
+ username: string;
59
+ lineKey?: never;
60
+ remoteNumber?: never;
61
+ } | {
62
+ lineKey: LineType['lineKey'];
63
+ username?: never;
64
+ remoteNumber?: never;
65
+ } | {
66
+ remoteNumber: SipSessionDataType['remoteNumber'];
67
+ username?: never;
68
+ lineKey?: never;
69
+ };
70
+ export type LineLookup = {
71
+ lineKey: LineType['lineKey'];
72
+ remoteNumber?: never;
73
+ } | {
74
+ remoteNumber: SipSessionDataType['remoteNumber'];
75
+ lineKey?: never;
76
+ };
package/package.json CHANGED
@@ -1,99 +1,99 @@
1
- {
2
- "name": "react-sip-kit",
3
- "private": false,
4
- "version": "0.5.21",
5
- "type": "module",
6
- "author": {
7
- "name": "Shervin Ghajar",
8
- "email": "ssghajar.work@gmail.com"
9
- },
10
- "homepage": "https://github.com/shervin-ghajar/react-sip-kit#readme",
11
- "keywords": [
12
- "react",
13
- "sip",
14
- "sipjs",
15
- "jssip",
16
- "voip",
17
- "communication",
18
- "webRTC",
19
- "telephony",
20
- "react-hooks",
21
- "sip.js",
22
- "react-sip",
23
- "react-sip-provider",
24
- "real-time",
25
- "session-initiation-protocol",
26
- "frontend",
27
- "javascript",
28
- "typescript",
29
- "npm",
30
- "library",
31
- "utility",
32
- "responsive",
33
- "design",
34
- "state-management",
35
- "zustand"
36
- ],
37
- "repository": {
38
- "type": "git",
39
- "url": "https://github.com/shervin-ghajar/react-sip-kit.git"
40
- },
41
- "license": "MIT",
42
- "main": "dist/index.cjs",
43
- "module": "dist/index.mjs",
44
- "types": "dist/index.d.ts",
45
- "exports": {
46
- ".": {
47
- "import": "./dist/index.mjs",
48
- "require": "./dist/index.cjs",
49
- "types": "./dist/index.d.ts"
50
- }
51
- },
52
- "scripts": {
53
- "build": "rollup -c",
54
- "lint": "eslint .",
55
- "format": "prettier --write --cache . --plugin=prettier-plugin-organize-imports"
56
- },
57
- "dependencies": {
58
- "dayjs": "^1.11.13",
59
- "sip.js": "0.21.2",
60
- "zustand": "^5.0.1",
61
- "lodash.isequal": "^4.5.0"
62
- },
63
- "devDependencies": {
64
- "@eslint/js": "9.13.0",
65
- "@rollup/plugin-commonjs": "^28.0.3",
66
- "@rollup/plugin-node-resolve": "^16.0.1",
67
- "@rollup/plugin-terser": "^0.4.4",
68
- "@rollup/plugin-typescript": "^12.1.2",
69
- "@trivago/prettier-plugin-sort-imports": "^4.3.0",
70
- "@types/lodash.isequal": "^4.5.8",
71
- "@types/react": "18.3.12",
72
- "@types/react-dom": "18.3.1",
73
- "@typescript-eslint/eslint-plugin": "^8.15.0",
74
- "@typescript-eslint/parser": "^8.15.0",
75
- "eslint": "^9.15.0",
76
- "eslint-config-prettier": "^9.1.0",
77
- "eslint-plugin-prettier": "^5.2.1",
78
- "eslint-plugin-react-hooks": "5.0.0",
79
- "eslint-plugin-react-refresh": "0.4.14",
80
- "globals": "15.11.0",
81
- "prettier": "^3.3.3",
82
- "prettier-plugin-organize-imports": "^4.1.0",
83
- "rollup": "^4.41.1",
84
- "rollup-plugin-delete": "^3.0.1",
85
- "rollup-plugin-strip": "^1.2.2",
86
- "tslib": "^2.8.1",
87
- "typescript": "~5.6.2",
88
- "typescript-eslint": "8.11.0"
89
- },
90
- "peerDependencies": {
91
- "react": ">=17.0.0",
92
- "react-dom": ">=17.0.0"
93
- },
94
- "files": [
95
- "dist",
96
- "README.md",
97
- "LICENSE"
98
- ]
99
- }
1
+ {
2
+ "name": "react-sip-kit",
3
+ "private": false,
4
+ "version": "0.6.02",
5
+ "type": "module",
6
+ "author": {
7
+ "name": "Shervin Ghajar",
8
+ "email": "ssghajar.work@gmail.com"
9
+ },
10
+ "homepage": "https://github.com/shervin-ghajar/react-sip-kit#readme",
11
+ "keywords": [
12
+ "react",
13
+ "sip",
14
+ "sipjs",
15
+ "jssip",
16
+ "voip",
17
+ "communication",
18
+ "webRTC",
19
+ "telephony",
20
+ "react-hooks",
21
+ "sip.js",
22
+ "react-sip",
23
+ "react-sip-provider",
24
+ "real-time",
25
+ "session-initiation-protocol",
26
+ "frontend",
27
+ "javascript",
28
+ "typescript",
29
+ "npm",
30
+ "library",
31
+ "utility",
32
+ "responsive",
33
+ "design",
34
+ "state-management",
35
+ "zustand"
36
+ ],
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/shervin-ghajar/react-sip-kit.git"
40
+ },
41
+ "license": "MIT",
42
+ "main": "dist/index.cjs",
43
+ "module": "dist/index.mjs",
44
+ "types": "dist/index.d.ts",
45
+ "exports": {
46
+ ".": {
47
+ "import": "./dist/index.mjs",
48
+ "require": "./dist/index.cjs",
49
+ "types": "./dist/index.d.ts"
50
+ }
51
+ },
52
+ "scripts": {
53
+ "build": "rollup -c",
54
+ "lint": "eslint .",
55
+ "format": "prettier --write --cache . --plugin=prettier-plugin-organize-imports"
56
+ },
57
+ "dependencies": {
58
+ "dayjs": "^1.11.13",
59
+ "sip.js": "0.21.2",
60
+ "zustand": "^5.0.1",
61
+ "lodash.isequal": "^4.5.0"
62
+ },
63
+ "devDependencies": {
64
+ "@eslint/js": "9.13.0",
65
+ "@rollup/plugin-commonjs": "^28.0.3",
66
+ "@rollup/plugin-node-resolve": "^16.0.1",
67
+ "@rollup/plugin-terser": "^0.4.4",
68
+ "@rollup/plugin-typescript": "^12.1.2",
69
+ "@trivago/prettier-plugin-sort-imports": "^4.3.0",
70
+ "@types/lodash.isequal": "^4.5.8",
71
+ "@types/react": "18.3.12",
72
+ "@types/react-dom": "18.3.1",
73
+ "@typescript-eslint/eslint-plugin": "^8.15.0",
74
+ "@typescript-eslint/parser": "^8.15.0",
75
+ "eslint": "^9.15.0",
76
+ "eslint-config-prettier": "^9.1.0",
77
+ "eslint-plugin-prettier": "^5.2.1",
78
+ "eslint-plugin-react-hooks": "5.0.0",
79
+ "eslint-plugin-react-refresh": "0.4.14",
80
+ "globals": "15.11.0",
81
+ "prettier": "^3.3.3",
82
+ "prettier-plugin-organize-imports": "^4.1.0",
83
+ "rollup": "^4.41.1",
84
+ "rollup-plugin-delete": "^3.0.1",
85
+ "rollup-plugin-strip": "^1.2.2",
86
+ "tslib": "^2.8.1",
87
+ "typescript": "~5.6.2",
88
+ "typescript-eslint": "8.11.0"
89
+ },
90
+ "peerDependencies": {
91
+ "react": ">=17.0.0",
92
+ "react-dom": ">=17.0.0"
93
+ },
94
+ "files": [
95
+ "dist",
96
+ "README.md",
97
+ "LICENSE"
98
+ ]
99
+ }