react-sip-kit 0.5.20 → 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,62 +1,115 @@
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.
9
+ *
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
7
24
  */
8
25
  add(config: SipManagerConfig): Promise<void>;
9
26
  /**
10
- * Get an existing SIP methods by username
27
+ * Get session methods (dial, answer, hold, etc.) for a live session.
28
+ *
29
+ * Resolves the session by `username`, `lineKey`, or `remoteNumber`.
30
+ *
31
+ * @param key - Identifier for session resolution
32
+ * @throws Error if no session could be resolved
11
33
  */
12
- methods(username: string): {
34
+ getSessionMethodsBy(key: GetMethodsKey): {
13
35
  receiveSession: (invitation: import("./store/types").SipInvitationType) => void;
14
- answerAudioSession: (lineNumber: LineType["lineNumber"]) => void;
15
- answerVideoSession: (lineNumber: LineType["lineNumber"], enableVideo?: boolean) => void;
36
+ answerAudioSession: (lineKey: LineType["lineKey"]) => void;
37
+ answerVideoSession: (lineKey: LineType["lineKey"], enableVideo?: boolean) => void;
16
38
  makeAudioSession: (lineObj: LineType, dialledNumber: string, extraHeaders?: Array<string>) => void;
17
39
  makeVideoSession: (lineObj: LineType, dialledNumber: string, extraHeaders?: Array<string>) => void;
18
- toggleLocalVideoTrack: (lineNumber: LineType["lineNumber"]) => Promise<void>;
19
- toggleShareScreen: (lineNumber: LineType["lineNumber"]) => Promise<void>;
20
- 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;
21
43
  dialByNumber: (type: Extract<import("./types").CallType, "audio" | "video">, dialNumber: string, extraHeaders?: Array<string>) => void;
22
- makeConferenceSession: (lineObj: LineType, extraHeaders?: Array<string>) => void;
23
- endSession: (lineNumber: LineType["lineNumber"]) => void;
24
- recordSession: (lineNumber: LineType["lineNumber"]) => {
44
+ endSession: (lineKey: LineType["lineKey"]) => void;
45
+ recordSession: (lineKey: LineType["lineKey"]) => {
25
46
  start: () => Promise<void>;
26
47
  stop: () => void;
27
48
  };
28
- toggleMuteSession: (lineNumber: LineType["lineNumber"]) => void;
29
- toggleHoldSession: (lineNumber: LineType["lineNumber"], forcedValue?: boolean) => Promise<void>;
30
- cancelSession: (lineNumber: LineType["lineNumber"]) => void;
31
- startTransferSession: (lineNumber: LineType["lineNumber"]) => void;
32
- cancelTransferSession: (lineNumber: LineType["lineNumber"]) => void;
33
- attendedTransferSession: (baseLine: LineType, transferLineNumber: LineType["lineNumber"]) => void;
34
- cancelAttendedTransferSession: (baseLine: LineType, transferLineNumber: 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;
35
54
  teardownSession: typeof import("./methods/session").teardownSession;
36
55
  };
37
56
  /**
38
- * Get an existing SIP by username
57
+ * Get SIP account state.
58
+ *
59
+ * Resolves the account by `username`, `lineKey`, or `remoteNumber`.
60
+ *
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
39
67
  */
40
- get(username: string): {
68
+ getAccountBy(key: GetAccountKey): {
41
69
  status: SipUserAgentStatus;
42
70
  lines: LineType[];
43
71
  watch: () => {
44
- status: SipUserAgentStatus | undefined;
72
+ status: SipUserAgentStatus;
45
73
  lines: LineType[];
46
74
  };
47
75
  };
48
76
  /**
49
- * Check the existance of SIP instance by username
77
+ * Check if an instance exists for the given username.
50
78
  */
51
79
  has(username: string): boolean;
52
80
  /**
53
- * Stop and remove a SIP session
81
+ * Reconnect transport for an existing SIP instance.
82
+ */
83
+ reconnect(username: string): void;
84
+ /**
85
+ * Stop and remove a SIP instance by username.
86
+ * Also removes related data from the global store.
54
87
  */
55
88
  stop(username: string): Promise<void>;
56
89
  /**
57
- * Stop and clear all SIP sessions
90
+ * Stop and clear all SIP instances.
91
+ * Useful for logout or application shutdown.
58
92
  */
59
93
  stopAll(): Promise<void>;
60
- getUsernameByNumber(lineNumber: LineType['lineNumber']): string | null;
61
- getSessionByNumber(lineNumber: LineType['lineNumber']): import("./store/types").SipInvitationType | import("./store/types").SipInviterType | null;
94
+ /**
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`.
103
+ *
104
+ * @param key - Lookup key (mutually exclusive)
105
+ * @returns SIP session if found, otherwise null
106
+ */
107
+ getSessionBy(key: LineLookup): import("./store/types").SipInvitationType | import("./store/types").SipInviterType | null;
108
+ /**
109
+ * Get a username by either `lineKey` or `remoteNumber`.
110
+ *
111
+ * @param key - Lookup key (mutually exclusive)
112
+ * @returns Username if found, otherwise null
113
+ */
114
+ getUsernameBy(key: LineLookup): string | null;
62
115
  }
@@ -6,27 +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
- makeConferenceSession: (lineObj: LineType, extraHeaders?: Array<string>) => void;
18
- endSession: (lineNumber: LineType["lineNumber"]) => void;
19
- recordSession: (lineNumber: LineType["lineNumber"]) => {
17
+ endSession: (lineKey: LineType["lineKey"]) => void;
18
+ recordSession: (lineKey: LineType["lineKey"]) => {
20
19
  start: () => Promise<void>;
21
20
  stop: () => void;
22
21
  };
23
- toggleMuteSession: (lineNumber: LineType["lineNumber"]) => void;
24
- toggleHoldSession: (lineNumber: LineType["lineNumber"], forcedValue?: boolean) => Promise<void>;
25
- cancelSession: (lineNumber: LineType["lineNumber"]) => void;
26
- startTransferSession: (lineNumber: LineType["lineNumber"]) => void;
27
- cancelTransferSession: (lineNumber: LineType["lineNumber"]) => void;
28
- attendedTransferSession: (baseLine: LineType, transferLineNumber: LineType["lineNumber"]) => void;
29
- cancelAttendedTransferSession: (baseLine: LineType, transferLineNumber: 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;
30
27
  teardownSession: typeof teardownSession;
31
28
  };
32
29
  /**
@@ -43,5 +40,3 @@ export declare function sendVideoActivationWithAckRetry(session: LineType['sipSe
43
40
  maxRetries?: number;
44
41
  delayMs?: number;
45
42
  }): Promise<void>;
46
- export declare const getUsernameByNumber: (lineNumber: LineType["lineNumber"]) => SipAccountConfig["username"] | null;
47
- 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.20",
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
+ }