@blastlabs/utils 1.22.0 β 2.1.0
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/README.md +102 -8
- package/dist/components/dev/DevPanel.d.ts +16 -11
- package/dist/components/dev/DevPanel.d.ts.map +1 -1
- package/dist/components/dev/DevPanel.js +71 -77
- package/dist/components/dev/DevPanel.test.d.ts +2 -0
- package/dist/components/dev/DevPanel.test.d.ts.map +1 -0
- package/dist/components/dev/DevPanel.test.js +194 -0
- package/dist/components/dev/DevToolsProvider/DevToolsProvider.d.ts +97 -0
- package/dist/components/dev/DevToolsProvider/DevToolsProvider.d.ts.map +1 -0
- package/dist/components/dev/DevToolsProvider/DevToolsProvider.js +122 -0
- package/dist/components/dev/DevToolsProvider/DevToolsProvider.test.d.ts +2 -0
- package/dist/components/dev/DevToolsProvider/DevToolsProvider.test.d.ts.map +1 -0
- package/dist/components/dev/DevToolsProvider/DevToolsProvider.test.js +104 -0
- package/dist/components/dev/DevToolsProvider/index.d.ts +3 -0
- package/dist/components/dev/DevToolsProvider/index.d.ts.map +1 -0
- package/dist/components/dev/DevToolsProvider/index.js +1 -0
- package/dist/components/dev/FormDevTools/FormDevTools.d.ts +5 -70
- package/dist/components/dev/FormDevTools/FormDevTools.d.ts.map +1 -1
- package/dist/components/dev/FormDevTools/FormDevTools.js +163 -236
- package/dist/components/dev/FormDevTools/FormDevToolsContent.d.ts +27 -0
- package/dist/components/dev/FormDevTools/FormDevToolsContent.d.ts.map +1 -0
- package/dist/components/dev/FormDevTools/FormDevToolsContent.js +298 -0
- package/dist/components/dev/TimezoneDevTools/TimezoneDevTools.d.ts +29 -0
- package/dist/components/dev/TimezoneDevTools/TimezoneDevTools.d.ts.map +1 -0
- package/dist/components/dev/TimezoneDevTools/TimezoneDevTools.js +122 -0
- package/dist/components/dev/TimezoneDevTools/TimezoneDevToolsContent.d.ts +4 -0
- package/dist/components/dev/TimezoneDevTools/TimezoneDevToolsContent.d.ts.map +1 -0
- package/dist/components/dev/TimezoneDevTools/TimezoneDevToolsContent.js +121 -0
- package/dist/components/dev/TimezoneDevTools/index.d.ts +3 -0
- package/dist/components/dev/TimezoneDevTools/index.d.ts.map +1 -0
- package/dist/components/dev/TimezoneDevTools/index.js +1 -0
- package/dist/components/dev/TimezoneDevTools/styles.d.ts +12 -0
- package/dist/components/dev/TimezoneDevTools/styles.d.ts.map +1 -0
- package/dist/components/dev/TimezoneDevTools/styles.js +65 -0
- package/dist/components/dev/ZIndexDebugger.js +1 -1
- package/dist/components/dev/index.d.ts +4 -2
- package/dist/components/dev/index.d.ts.map +1 -1
- package/dist/components/dev/index.js +6 -1
- package/dist/date/index.d.ts +11 -0
- package/dist/date/index.d.ts.map +1 -1
- package/dist/date/index.js +43 -0
- package/package.json +2 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export const containerStyle = {
|
|
2
|
+
position: 'fixed',
|
|
3
|
+
bottom: 16,
|
|
4
|
+
right: 16,
|
|
5
|
+
zIndex: 99999,
|
|
6
|
+
fontFamily: 'system-ui, -apple-system, sans-serif',
|
|
7
|
+
};
|
|
8
|
+
export const headerStyle = {
|
|
9
|
+
padding: '12px 16px',
|
|
10
|
+
borderBottom: '1px solid #e5e7eb',
|
|
11
|
+
fontWeight: 'bold',
|
|
12
|
+
fontSize: '14px',
|
|
13
|
+
color: '#111827',
|
|
14
|
+
backgroundColor: '#f9fafb',
|
|
15
|
+
};
|
|
16
|
+
export const contentStyle = {
|
|
17
|
+
padding: '16px',
|
|
18
|
+
display: 'flex',
|
|
19
|
+
flexDirection: 'column',
|
|
20
|
+
gap: '4px',
|
|
21
|
+
overflowY: 'auto',
|
|
22
|
+
};
|
|
23
|
+
export const sectionTitleStyle = {
|
|
24
|
+
fontSize: '12px',
|
|
25
|
+
fontWeight: 'bold',
|
|
26
|
+
color: '#6b7280',
|
|
27
|
+
marginBottom: '8px',
|
|
28
|
+
textTransform: 'uppercase',
|
|
29
|
+
letterSpacing: '0.5px',
|
|
30
|
+
};
|
|
31
|
+
export const cardStyle = {
|
|
32
|
+
backgroundColor: '#f9fafb',
|
|
33
|
+
borderRadius: '8px',
|
|
34
|
+
padding: '12px',
|
|
35
|
+
marginBottom: '8px',
|
|
36
|
+
display: 'flex',
|
|
37
|
+
alignItems: 'center',
|
|
38
|
+
justifyContent: 'space-between',
|
|
39
|
+
};
|
|
40
|
+
export const cityNameStyle = {
|
|
41
|
+
fontWeight: 600,
|
|
42
|
+
color: '#111827',
|
|
43
|
+
};
|
|
44
|
+
export const timezoneStyle = {
|
|
45
|
+
fontSize: '11px',
|
|
46
|
+
color: '#6b7280',
|
|
47
|
+
fontFamily: 'monospace',
|
|
48
|
+
};
|
|
49
|
+
export const timeStyle = {
|
|
50
|
+
fontSize: '16px',
|
|
51
|
+
fontWeight: 'bold',
|
|
52
|
+
color: '#111827',
|
|
53
|
+
fontFamily: 'monospace',
|
|
54
|
+
};
|
|
55
|
+
export const offsetStyle = {
|
|
56
|
+
fontSize: '11px',
|
|
57
|
+
padding: '2px 6px',
|
|
58
|
+
borderRadius: '4px',
|
|
59
|
+
backgroundColor: '#e5e7eb',
|
|
60
|
+
color: '#6b7280',
|
|
61
|
+
};
|
|
62
|
+
export const highlightStyle = {
|
|
63
|
+
backgroundColor: '#fef3c7',
|
|
64
|
+
border: '1px solid #fbbf24',
|
|
65
|
+
};
|
|
@@ -170,7 +170,7 @@ export default function ZIndexDebugger({ position = 'bottom-left' }) {
|
|
|
170
170
|
const handleElementClick = (element) => {
|
|
171
171
|
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
172
172
|
};
|
|
173
|
-
return (React.createElement("div", { style: containerStyle },
|
|
173
|
+
return (React.createElement("div", { style: containerStyle, "data-testid": "zindex-debugger" },
|
|
174
174
|
React.createElement("button", { onClick: () => setIsActive(!isActive), style: buttonStyle, onMouseEnter: (e) => (e.currentTarget.style.backgroundColor = isActive ? '#dc2626' : '#2563eb'), onMouseLeave: (e) => (e.currentTarget.style.backgroundColor = isActive ? '#ef4444' : '#3b82f6') }, isActive ? 'π΄ Z-Index λλ²κ±° μ’
λ£' : 'π Z-Index λλ²κ±°'),
|
|
175
175
|
isActive && (React.createElement("div", { style: panelStyle },
|
|
176
176
|
React.createElement("div", { style: headerStyle },
|
|
@@ -10,7 +10,9 @@ export { default as WindowSizeDisplay } from './WindowSizeDisplay';
|
|
|
10
10
|
export { default as DevPanel } from './DevPanel';
|
|
11
11
|
export { default as ZIndexDebugger } from './ZIndexDebugger';
|
|
12
12
|
export { default as ApiLogger, addApiLog, clearApiLogs } from './ApiLogger';
|
|
13
|
-
export { default as FormDevTools } from './FormDevTools';
|
|
14
|
-
export type { FormDevToolsProps } from './FormDevTools';
|
|
15
13
|
export type { ApiLogEntry } from './ApiLogger';
|
|
14
|
+
export { DevToolsProvider, useRegisterForm, useDevTools } from './DevToolsProvider';
|
|
15
|
+
export type { DevToolForm } from './DevToolsProvider';
|
|
16
|
+
export { default as FormDevTools } from './FormDevTools/FormDevToolsContent';
|
|
17
|
+
export { default as TimezoneDevTools } from './TimezoneDevTools/TimezoneDevToolsContent';
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/dev/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/dev/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAG7E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4CAA4C,CAAC"}
|
|
@@ -9,4 +9,9 @@ export { default as WindowSizeDisplay } from './WindowSizeDisplay';
|
|
|
9
9
|
export { default as DevPanel } from './DevPanel';
|
|
10
10
|
export { default as ZIndexDebugger } from './ZIndexDebugger';
|
|
11
11
|
export { default as ApiLogger, addApiLog, clearApiLogs } from './ApiLogger';
|
|
12
|
-
|
|
12
|
+
// DevTools Provider
|
|
13
|
+
export { DevToolsProvider, useRegisterForm, useDevTools } from './DevToolsProvider';
|
|
14
|
+
// Form DevTools
|
|
15
|
+
export { default as FormDevTools } from './FormDevTools/FormDevToolsContent';
|
|
16
|
+
// Timezone DevTools
|
|
17
|
+
export { default as TimezoneDevTools } from './TimezoneDevTools/TimezoneDevToolsContent';
|
package/dist/date/index.d.ts
CHANGED
|
@@ -61,4 +61,15 @@ export declare function isValidDate(date: any): boolean;
|
|
|
61
61
|
* @param tz - νμμ‘΄ (μ: 'Asia/Seoul')
|
|
62
62
|
*/
|
|
63
63
|
export declare function toTimezone(date: Date | string | number, tz: string): Date;
|
|
64
|
+
/**
|
|
65
|
+
* μ¬μ©μμ λΈλΌμ°μ νμμ‘΄ λ°ν
|
|
66
|
+
* @returns νμμ‘΄ λ¬Έμμ΄ (μ: 'Asia/Seoul')
|
|
67
|
+
*/
|
|
68
|
+
export declare function getUserTimezone(): string;
|
|
69
|
+
/**
|
|
70
|
+
* νμμ‘΄μ UTC μ€νμ
λ°ν (dayjs μμ΄ Intl API μ¬μ©)
|
|
71
|
+
* @param tz - νμμ‘΄ (μ: 'Asia/Seoul')
|
|
72
|
+
* @returns UTC μ€νμ
λ¬Έμμ΄ (μ: '+09:00', '-05:00')
|
|
73
|
+
*/
|
|
74
|
+
export declare function getTimezoneOffset(tz: string): string;
|
|
64
75
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/date/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/date/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,iBAAiB,CAAC;AAMzB;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,GAAE,IAAI,GAAG,MAAM,GAAG,MAAmB,EACzC,MAAM,GAAE,MAA8B,GACrC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAEnF;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,IAAI,GAAE,KAAK,CAAC,UAAkB,GAC7B,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC5B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,KAAK,CAAC,cAAsB,GACjC,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC5B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,KAAK,CAAC,cAAsB,GACjC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAE9F;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAE7F;AAED;;;GAGG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,IAAI,GAAE,KAAK,CAAC,UAA0B,GACrC,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAEzE"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/date/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,iBAAiB,CAAC;AAMzB;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,GAAE,IAAI,GAAG,MAAM,GAAG,MAAmB,EACzC,MAAM,GAAE,MAA8B,GACrC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAEnF;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,IAAI,GAAE,KAAK,CAAC,UAAkB,GAC7B,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC5B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,KAAK,CAAC,cAAsB,GACjC,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC5B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,KAAK,CAAC,cAAsB,GACjC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAE9F;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAE7F;AAED;;;GAGG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,IAAI,GAAE,KAAK,CAAC,UAA0B,GACrC,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAiCpD"}
|
package/dist/date/index.js
CHANGED
|
@@ -90,3 +90,46 @@ export function isValidDate(date) {
|
|
|
90
90
|
export function toTimezone(date, tz) {
|
|
91
91
|
return dayjs(date).tz(tz).toDate();
|
|
92
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* μ¬μ©μμ λΈλΌμ°μ νμμ‘΄ λ°ν
|
|
95
|
+
* @returns νμμ‘΄ λ¬Έμμ΄ (μ: 'Asia/Seoul')
|
|
96
|
+
*/
|
|
97
|
+
export function getUserTimezone() {
|
|
98
|
+
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* νμμ‘΄μ UTC μ€νμ
λ°ν (dayjs μμ΄ Intl API μ¬μ©)
|
|
102
|
+
* @param tz - νμμ‘΄ (μ: 'Asia/Seoul')
|
|
103
|
+
* @returns UTC μ€νμ
λ¬Έμμ΄ (μ: '+09:00', '-05:00')
|
|
104
|
+
*/
|
|
105
|
+
export function getTimezoneOffset(tz) {
|
|
106
|
+
if (!tz)
|
|
107
|
+
return '+00:00';
|
|
108
|
+
try {
|
|
109
|
+
// Intl APIλ₯Ό μ¬μ©νμ¬ νμμ‘΄ μ€νμ
κ³μ°
|
|
110
|
+
const now = new Date();
|
|
111
|
+
const formatter = new Intl.DateTimeFormat('en-US', {
|
|
112
|
+
timeZone: tz,
|
|
113
|
+
timeZoneName: 'longOffset',
|
|
114
|
+
});
|
|
115
|
+
const parts = formatter.formatToParts(now);
|
|
116
|
+
const offsetPart = parts.find(part => part.type === 'timeZoneName');
|
|
117
|
+
if (offsetPart && offsetPart.value) {
|
|
118
|
+
// "GMT+09:00" νμμμ "GMT" μ κ±°νκ³ "+09:00"λ§ λ°ν
|
|
119
|
+
return offsetPart.value.replace('GMT', '');
|
|
120
|
+
}
|
|
121
|
+
// fallback: ISO λ¬Έμμ΄μμ λ‘컬 μ€νμ
μΆμΆ
|
|
122
|
+
const isoString = now.toLocaleString('en-US', { timeZone: tz });
|
|
123
|
+
const localIsoString = now.toLocaleString('en-US', { timeZone: 'UTC' });
|
|
124
|
+
const dateInTz = new Date(isoString);
|
|
125
|
+
const dateInUtc = new Date(localIsoString);
|
|
126
|
+
const offsetInMinutes = (dateInTz.getTime() - dateInUtc.getTime()) / (1000 * 60);
|
|
127
|
+
const hours = Math.floor(Math.abs(offsetInMinutes) / 60);
|
|
128
|
+
const minutes = Math.abs(offsetInMinutes) % 60;
|
|
129
|
+
const sign = offsetInMinutes >= 0 ? '+' : '-';
|
|
130
|
+
return `${sign}${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return '+00:00';
|
|
134
|
+
}
|
|
135
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blastlabs/utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
"dayjs": "^1.11.19"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
72
73
|
"@testing-library/react": "^16.3.1",
|
|
73
74
|
"@testing-library/user-event": "^14.6.1",
|
|
74
75
|
"@types/node": "^25.0.6",
|