@blastlabs/utils 1.21.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.
Files changed (44) hide show
  1. package/README.md +102 -8
  2. package/bin/Makefile +23 -0
  3. package/bin/init-routes.cjs +422 -0
  4. package/dist/components/dev/DevPanel.d.ts +16 -11
  5. package/dist/components/dev/DevPanel.d.ts.map +1 -1
  6. package/dist/components/dev/DevPanel.js +71 -77
  7. package/dist/components/dev/DevPanel.test.d.ts +2 -0
  8. package/dist/components/dev/DevPanel.test.d.ts.map +1 -0
  9. package/dist/components/dev/DevPanel.test.js +194 -0
  10. package/dist/components/dev/DevToolsProvider/DevToolsProvider.d.ts +97 -0
  11. package/dist/components/dev/DevToolsProvider/DevToolsProvider.d.ts.map +1 -0
  12. package/dist/components/dev/DevToolsProvider/DevToolsProvider.js +122 -0
  13. package/dist/components/dev/DevToolsProvider/DevToolsProvider.test.d.ts +2 -0
  14. package/dist/components/dev/DevToolsProvider/DevToolsProvider.test.d.ts.map +1 -0
  15. package/dist/components/dev/DevToolsProvider/DevToolsProvider.test.js +104 -0
  16. package/dist/components/dev/DevToolsProvider/index.d.ts +3 -0
  17. package/dist/components/dev/DevToolsProvider/index.d.ts.map +1 -0
  18. package/dist/components/dev/DevToolsProvider/index.js +1 -0
  19. package/dist/components/dev/FormDevTools/FormDevTools.d.ts +5 -70
  20. package/dist/components/dev/FormDevTools/FormDevTools.d.ts.map +1 -1
  21. package/dist/components/dev/FormDevTools/FormDevTools.js +163 -236
  22. package/dist/components/dev/FormDevTools/FormDevToolsContent.d.ts +27 -0
  23. package/dist/components/dev/FormDevTools/FormDevToolsContent.d.ts.map +1 -0
  24. package/dist/components/dev/FormDevTools/FormDevToolsContent.js +298 -0
  25. package/dist/components/dev/TimezoneDevTools/TimezoneDevTools.d.ts +29 -0
  26. package/dist/components/dev/TimezoneDevTools/TimezoneDevTools.d.ts.map +1 -0
  27. package/dist/components/dev/TimezoneDevTools/TimezoneDevTools.js +122 -0
  28. package/dist/components/dev/TimezoneDevTools/TimezoneDevToolsContent.d.ts +4 -0
  29. package/dist/components/dev/TimezoneDevTools/TimezoneDevToolsContent.d.ts.map +1 -0
  30. package/dist/components/dev/TimezoneDevTools/TimezoneDevToolsContent.js +121 -0
  31. package/dist/components/dev/TimezoneDevTools/index.d.ts +3 -0
  32. package/dist/components/dev/TimezoneDevTools/index.d.ts.map +1 -0
  33. package/dist/components/dev/TimezoneDevTools/index.js +1 -0
  34. package/dist/components/dev/TimezoneDevTools/styles.d.ts +12 -0
  35. package/dist/components/dev/TimezoneDevTools/styles.d.ts.map +1 -0
  36. package/dist/components/dev/TimezoneDevTools/styles.js +65 -0
  37. package/dist/components/dev/ZIndexDebugger.js +1 -1
  38. package/dist/components/dev/index.d.ts +4 -2
  39. package/dist/components/dev/index.d.ts.map +1 -1
  40. package/dist/components/dev/index.js +6 -1
  41. package/dist/date/index.d.ts +11 -0
  42. package/dist/date/index.d.ts.map +1 -1
  43. package/dist/date/index.js +43 -0
  44. package/package.json +4 -2
@@ -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,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
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
- export { default as FormDevTools } from './FormDevTools';
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';
@@ -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
@@ -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"}
@@ -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,12 +1,13 @@
1
1
  {
2
2
  "name": "@blastlabs/utils",
3
- "version": "1.21.0",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
8
8
  "blastlabs-generate-entity": "./bin/generate-entity.cjs",
9
- "blastlabs-init-ai-rules": "./bin/init-ai-rules.cjs"
9
+ "blastlabs-init-ai-rules": "./bin/init-ai-rules.cjs",
10
+ "blastlabs-init-routes": "./bin/init-routes.cjs"
10
11
  },
11
12
  "files": [
12
13
  "dist",
@@ -68,6 +69,7 @@
68
69
  "dayjs": "^1.11.19"
69
70
  },
70
71
  "devDependencies": {
72
+ "@testing-library/jest-dom": "^6.9.1",
71
73
  "@testing-library/react": "^16.3.1",
72
74
  "@testing-library/user-event": "^14.6.1",
73
75
  "@types/node": "^25.0.6",