@sudobility/di_web 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +52 -0
  2. package/dist/firebase/firebase.interface.d.ts +81 -0
  3. package/dist/firebase/firebase.interface.d.ts.map +1 -0
  4. package/dist/firebase/firebase.interface.js +2 -0
  5. package/dist/firebase/firebase.interface.js.map +1 -0
  6. package/dist/firebase/firebase.web.d.ts +19 -0
  7. package/dist/firebase/firebase.web.d.ts.map +1 -0
  8. package/dist/firebase/firebase.web.js +322 -0
  9. package/dist/firebase/firebase.web.js.map +1 -0
  10. package/dist/index.d.ts +11 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +11 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/navigation/navigation.web.d.ts +34 -0
  15. package/dist/navigation/navigation.web.d.ts.map +1 -0
  16. package/dist/navigation/navigation.web.js +176 -0
  17. package/dist/navigation/navigation.web.js.map +1 -0
  18. package/dist/network/network.web.d.ts +12 -0
  19. package/dist/network/network.web.d.ts.map +1 -0
  20. package/dist/network/network.web.js +124 -0
  21. package/dist/network/network.web.js.map +1 -0
  22. package/dist/network-singleton.d.ts +5 -0
  23. package/dist/network-singleton.d.ts.map +1 -0
  24. package/dist/network-singleton.js +21 -0
  25. package/dist/network-singleton.js.map +1 -0
  26. package/dist/storage/storage-singleton.d.ts +5 -0
  27. package/dist/storage/storage-singleton.d.ts.map +1 -0
  28. package/dist/storage/storage-singleton.js +19 -0
  29. package/dist/storage/storage-singleton.js.map +1 -0
  30. package/dist/storage/storage.web.d.ts +22 -0
  31. package/dist/storage/storage.web.d.ts.map +1 -0
  32. package/dist/storage/storage.web.js +107 -0
  33. package/dist/storage/storage.web.js.map +1 -0
  34. package/dist/storage/web-storage.service.d.ts +23 -0
  35. package/dist/storage/web-storage.service.d.ts.map +1 -0
  36. package/dist/storage/web-storage.service.js +137 -0
  37. package/dist/storage/web-storage.service.js.map +1 -0
  38. package/dist/types/ui-navigation.d.ts +51 -0
  39. package/dist/types/ui-navigation.d.ts.map +1 -0
  40. package/dist/types/ui-navigation.js +2 -0
  41. package/dist/types/ui-navigation.js.map +1 -0
  42. package/dist/web-network.service.d.ts +24 -0
  43. package/dist/web-network.service.d.ts.map +1 -0
  44. package/dist/web-network.service.js +150 -0
  45. package/dist/web-network.service.js.map +1 -0
  46. package/package.json +72 -0
@@ -0,0 +1,137 @@
1
+ import { StorageType } from '@sudobility/types';
2
+ export class WebStorageService {
3
+ constructor(storageType = StorageType.LOCAL_STORAGE) {
4
+ this.storageType = storageType;
5
+ }
6
+ getStorage() {
7
+ switch (this.storageType) {
8
+ case StorageType.LOCAL_STORAGE:
9
+ return localStorage;
10
+ case StorageType.SESSION_STORAGE:
11
+ return sessionStorage;
12
+ case StorageType.MEMORY:
13
+ return new MemoryStorage();
14
+ default:
15
+ return localStorage;
16
+ }
17
+ }
18
+ getItem(key) {
19
+ try {
20
+ return this.getStorage().getItem(key);
21
+ }
22
+ catch (error) {
23
+ console.error('Error getting storage item:', error);
24
+ return null;
25
+ }
26
+ }
27
+ setItem(key, value) {
28
+ try {
29
+ this.getStorage().setItem(key, value);
30
+ }
31
+ catch (error) {
32
+ console.error('Error setting storage item:', error);
33
+ }
34
+ }
35
+ removeItem(key) {
36
+ try {
37
+ this.getStorage().removeItem(key);
38
+ }
39
+ catch (error) {
40
+ console.error('Error removing storage item:', error);
41
+ }
42
+ }
43
+ clear() {
44
+ try {
45
+ this.getStorage().clear();
46
+ }
47
+ catch (_error) {
48
+ console.error('Error clearing storage:', _error);
49
+ }
50
+ }
51
+ getAllKeys() {
52
+ try {
53
+ const storage = this.getStorage();
54
+ const keys = [];
55
+ for (let i = 0; i < storage.length; i++) {
56
+ const key = storage.key(i);
57
+ if (key)
58
+ keys.push(key);
59
+ }
60
+ return keys;
61
+ }
62
+ catch {
63
+ return [];
64
+ }
65
+ }
66
+ isAvailable() {
67
+ try {
68
+ const storage = this.getStorage();
69
+ const testKey = '__storage_test__';
70
+ storage.setItem(testKey, 'test');
71
+ storage.removeItem(testKey);
72
+ return true;
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ }
78
+ getType() {
79
+ return this.storageType;
80
+ }
81
+ }
82
+ class MemoryStorage {
83
+ constructor() {
84
+ this.data = new Map();
85
+ }
86
+ get length() {
87
+ return this.data.size;
88
+ }
89
+ getItem(key) {
90
+ return this.data.get(key) || null;
91
+ }
92
+ setItem(key, value) {
93
+ this.data.set(key, value);
94
+ }
95
+ removeItem(key) {
96
+ this.data.delete(key);
97
+ }
98
+ clear() {
99
+ this.data.clear();
100
+ }
101
+ key(index) {
102
+ const keys = Array.from(this.data.keys());
103
+ return keys[index] || null;
104
+ }
105
+ }
106
+ export class WebSerializedStorageService {
107
+ constructor(storage) {
108
+ this.storage = storage;
109
+ }
110
+ getObject(key) {
111
+ const value = this.storage.getItem(key);
112
+ if (!value)
113
+ return null;
114
+ try {
115
+ return JSON.parse(value);
116
+ }
117
+ catch {
118
+ return null;
119
+ }
120
+ }
121
+ setObject(key, value) {
122
+ try {
123
+ const serialized = JSON.stringify(value);
124
+ this.storage.setItem(key, serialized);
125
+ }
126
+ catch (_error) {
127
+ console.error('Error setting object in storage:', _error);
128
+ }
129
+ }
130
+ removeObject(key) {
131
+ this.storage.removeItem(key);
132
+ }
133
+ hasObject(key) {
134
+ return this.storage.getItem(key) !== null;
135
+ }
136
+ }
137
+ //# sourceMappingURL=web-storage.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-storage.service.js","sourceRoot":"","sources":["../../src/storage/web-storage.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export interface UINavigationState {
2
+ currentPath: string;
3
+ previousPath?: string;
4
+ params: Record<string, string>;
5
+ searchParams: Record<string, string>;
6
+ }
7
+ export interface UINavigationOptions {
8
+ replace?: boolean;
9
+ state?: Record<string, unknown>;
10
+ preventScrollReset?: boolean;
11
+ }
12
+ export interface UINavigationService {
13
+ navigate(path: string, options?: UINavigationOptions): void;
14
+ goBack(fallbackPath?: string): void;
15
+ goForward(): void;
16
+ replace(path: string, options?: UINavigationOptions): void;
17
+ getCurrentState(): UINavigationState;
18
+ getCurrentPath(): string;
19
+ getSearchParams(): Record<string, string>;
20
+ getParams(): Record<string, string>;
21
+ canGoBack(): boolean;
22
+ canGoForward(): boolean;
23
+ addListener(listener: (state: UINavigationState) => void): () => void;
24
+ isSupported(): boolean;
25
+ }
26
+ export interface UINavigationHook {
27
+ navigate: (path: string, options?: UINavigationOptions) => void;
28
+ goBack: (fallbackPath?: string) => void;
29
+ replace: (path: string, options?: UINavigationOptions) => void;
30
+ currentPath: string;
31
+ searchParams: Record<string, string>;
32
+ params: Record<string, string>;
33
+ canGoBack: boolean;
34
+ isSupported: boolean;
35
+ }
36
+ export interface UILocationHook {
37
+ pathname: string;
38
+ search: string;
39
+ searchParams: Record<string, string>;
40
+ hash: string;
41
+ state: Record<string, unknown>;
42
+ key: string;
43
+ }
44
+ export interface UINavigationConfig {
45
+ enableBackGesture?: boolean;
46
+ enableSwipeGesture?: boolean;
47
+ animationType?: 'slide' | 'fade' | 'none';
48
+ enableAnalytics?: boolean;
49
+ fallbackPath?: string;
50
+ }
51
+ //# sourceMappingURL=ui-navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-navigation.d.ts","sourceRoot":"","sources":["../../src/types/ui-navigation.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC5D,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,IAAI,IAAI,CAAC;IAClB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC3D,eAAe,IAAI,iBAAiB,CAAC;IACrC,cAAc,IAAI,MAAM,CAAC;IACzB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,IAAI,OAAO,CAAC;IACrB,YAAY,IAAI,OAAO,CAAC;IACxB,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACtE,WAAW,IAAI,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ui-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-navigation.js","sourceRoot":"","sources":["../../src/types/ui-navigation.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { PlatformNetwork } from '@sudobility/di';
2
+ import { ConnectionState, ConnectionType } from '@sudobility/types';
3
+ export declare class WebNetworkService implements PlatformNetwork {
4
+ private status;
5
+ private connectionType;
6
+ private listeners;
7
+ constructor();
8
+ getNetworkStatus(): ConnectionState;
9
+ getConnectionType(): ConnectionType;
10
+ isOnline(): boolean;
11
+ onNetworkStatusChange(callback: (status: ConnectionState) => void): () => void;
12
+ request(url: string, options?: RequestInit): Promise<Response>;
13
+ watchNetworkStatus(callback: (isOnline: boolean) => void): () => void;
14
+ testConnectivity(url?: string): Promise<boolean>;
15
+ private initializeNetworkMonitoring;
16
+ private handleOnlineChange;
17
+ private handleOfflineChange;
18
+ private handleConnectionChange;
19
+ private updateNetworkStatus;
20
+ private detectConnectionType;
21
+ private notifyListeners;
22
+ destroy(): void;
23
+ }
24
+ //# sourceMappingURL=web-network.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-network.service.d.ts","sourceRoot":"","sources":["../src/web-network.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAyBpE,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,SAAS,CAA6C;;IAO9D,gBAAgB,IAAI,eAAe;IAInC,iBAAiB,IAAI,cAAc;IAInC,QAAQ,IAAI,OAAO;IAKnB,qBAAqB,CACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAC1C,MAAM,IAAI;IAaP,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKxE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAS/D,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBtD,OAAO,CAAC,2BAA2B;IAgBnC,OAAO,CAAC,kBAAkB,CAExB;IAEF,OAAO,CAAC,mBAAmB,CAIzB;IAEF,OAAO,CAAC,sBAAsB,CAE5B;IAEF,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,eAAe;IAWvB,OAAO,IAAI,IAAI;CAehB"}
@@ -0,0 +1,150 @@
1
+ import { ConnectionState, ConnectionType } from '@sudobility/types';
2
+ export class WebNetworkService {
3
+ constructor() {
4
+ this.status = ConnectionState.UNKNOWN;
5
+ this.connectionType = ConnectionType.UNKNOWN;
6
+ this.listeners = [];
7
+ this.handleOnlineChange = () => {
8
+ this.updateNetworkStatus();
9
+ };
10
+ this.handleOfflineChange = () => {
11
+ this.status = ConnectionState.DISCONNECTED;
12
+ this.connectionType = ConnectionType.NONE;
13
+ this.notifyListeners();
14
+ };
15
+ this.handleConnectionChange = () => {
16
+ this.updateNetworkStatus();
17
+ };
18
+ this.initializeNetworkMonitoring();
19
+ this.updateNetworkStatus();
20
+ }
21
+ getNetworkStatus() {
22
+ return this.status;
23
+ }
24
+ getConnectionType() {
25
+ return this.connectionType;
26
+ }
27
+ isOnline() {
28
+ const online = this.status === ConnectionState.CONNECTED;
29
+ return online;
30
+ }
31
+ onNetworkStatusChange(callback) {
32
+ this.listeners.push(callback);
33
+ return () => {
34
+ const index = this.listeners.indexOf(callback);
35
+ if (index > -1) {
36
+ this.listeners.splice(index, 1);
37
+ }
38
+ };
39
+ }
40
+ async request(url, options = {}) {
41
+ return fetch(url, options);
42
+ }
43
+ watchNetworkStatus(callback) {
44
+ const networkCallback = (status) => {
45
+ const online = status === ConnectionState.CONNECTED;
46
+ callback(online);
47
+ };
48
+ return this.onNetworkStatusChange(networkCallback);
49
+ }
50
+ async testConnectivity(url) {
51
+ const testUrl = url || 'https://httpbin.org/status/200';
52
+ try {
53
+ const controller = new AbortController();
54
+ const timeoutId = setTimeout(() => controller.abort(), 5000);
55
+ await fetch(testUrl, {
56
+ method: 'HEAD',
57
+ mode: 'no-cors',
58
+ signal: controller.signal,
59
+ });
60
+ clearTimeout(timeoutId);
61
+ return true;
62
+ }
63
+ catch (error) {
64
+ console.error('Error checking connectivity:', error);
65
+ return false;
66
+ }
67
+ }
68
+ initializeNetworkMonitoring() {
69
+ if (typeof window === 'undefined')
70
+ return;
71
+ window.addEventListener('online', this.handleOnlineChange);
72
+ window.addEventListener('offline', this.handleOfflineChange);
73
+ if ('connection' in navigator) {
74
+ const connection = navigator.connection;
75
+ if (connection) {
76
+ connection.addEventListener('change', this.handleConnectionChange);
77
+ }
78
+ }
79
+ }
80
+ updateNetworkStatus() {
81
+ if (typeof window === 'undefined') {
82
+ this.status = ConnectionState.UNKNOWN;
83
+ this.connectionType = ConnectionType.UNKNOWN;
84
+ return;
85
+ }
86
+ if (!navigator.onLine) {
87
+ this.status = ConnectionState.DISCONNECTED;
88
+ this.connectionType = ConnectionType.NONE;
89
+ this.notifyListeners();
90
+ return;
91
+ }
92
+ this.connectionType = this.detectConnectionType();
93
+ if (this.connectionType === ConnectionType.NONE) {
94
+ this.status = ConnectionState.DISCONNECTED;
95
+ }
96
+ else {
97
+ this.status = ConnectionState.CONNECTED;
98
+ }
99
+ this.notifyListeners();
100
+ }
101
+ detectConnectionType() {
102
+ if (typeof window === 'undefined' || !navigator.onLine) {
103
+ return ConnectionType.NONE;
104
+ }
105
+ if ('connection' in navigator) {
106
+ const connection = navigator.connection;
107
+ if (connection && connection.effectiveType) {
108
+ switch (connection.effectiveType) {
109
+ case 'slow-2g':
110
+ case '2g':
111
+ return ConnectionType.CELLULAR_2G;
112
+ case '3g':
113
+ return ConnectionType.CELLULAR_3G;
114
+ case '4g':
115
+ return ConnectionType.CELLULAR_4G;
116
+ default:
117
+ if (connection.type === 'cellular') {
118
+ return ConnectionType.CELLULAR_4G;
119
+ }
120
+ return ConnectionType.WIFI;
121
+ }
122
+ }
123
+ }
124
+ return ConnectionType.WIFI;
125
+ }
126
+ notifyListeners() {
127
+ this.listeners.forEach((callback) => {
128
+ try {
129
+ callback(this.status);
130
+ }
131
+ catch (error) {
132
+ console.error('Error notifying network status listener:', error);
133
+ }
134
+ });
135
+ }
136
+ destroy() {
137
+ if (typeof window !== 'undefined') {
138
+ window.removeEventListener('online', this.handleOnlineChange);
139
+ window.removeEventListener('offline', this.handleOfflineChange);
140
+ if ('connection' in navigator) {
141
+ const connection = navigator.connection;
142
+ if (connection) {
143
+ connection.removeEventListener('change', this.handleConnectionChange);
144
+ }
145
+ }
146
+ }
147
+ this.listeners = [];
148
+ }
149
+ }
150
+ //# sourceMappingURL=web-network.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-network.service.js","sourceRoot":"","sources":["../src/web-network.service.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@sudobility/di_web",
3
+ "version": "0.1.1",
4
+ "description": "Web implementations of dependency injection services for 0xmail.box",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "build:watch": "tsc --watch",
17
+ "clean": "rm -rf dist",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "test:coverage": "vitest run --coverage",
21
+ "test:ci": "vitest run --coverage",
22
+ "prepublishOnly": "npm run clean && npm run test && npm run build",
23
+ "typecheck": "tsc --noEmit",
24
+ "lint": "eslint src --ext .ts,.tsx",
25
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
26
+ "format": "prettier --write src/**/*.{ts,tsx,js,jsx,json,md}"
27
+ },
28
+ "files": [
29
+ "dist/**/*",
30
+ "README.md"
31
+ ],
32
+ "keywords": [
33
+ "dependency-injection",
34
+ "di",
35
+ "web",
36
+ "0xmail",
37
+ "web3"
38
+ ],
39
+ "author": "0xmail.box",
40
+ "license": "MIT",
41
+ "peerDependencies": {
42
+ "@sudobility/di": "^1.4.14",
43
+ "@sudobility/types": "^1.9.5",
44
+ "axios": "^1.13.0",
45
+ "firebase": "^12.4.0"
46
+ },
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "https://github.com/johnqh/di_web.git"
50
+ },
51
+ "devDependencies": {
52
+ "@eslint/js": "^9.38.0",
53
+ "@sudobility/di": "^1.4.14",
54
+ "@sudobility/types": "^1.9.5",
55
+ "@types/node": "^24.10.1",
56
+ "@typescript-eslint/eslint-plugin": "^8.46.2",
57
+ "@typescript-eslint/parser": "^8.46.2",
58
+ "@vitest/coverage-v8": "^3.2.4",
59
+ "axios": "^1.13.0",
60
+ "eslint": "^9.38.0",
61
+ "eslint-config-prettier": "^10.1.8",
62
+ "eslint-plugin-prettier": "^5.5.4",
63
+ "firebase": "^12.4.0",
64
+ "jsdom": "^27.2.0",
65
+ "prettier": "^3.6.2",
66
+ "typescript": "^5.9.3",
67
+ "vitest": "^3.2.4"
68
+ },
69
+ "publishConfig": {
70
+ "access": "restricted"
71
+ }
72
+ }