@simplysm/core-common 13.0.0-beta.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 (202) hide show
  1. package/.cache/typecheck-browser.tsbuildinfo +1 -0
  2. package/.cache/typecheck-node.tsbuildinfo +1 -0
  3. package/.cache/typecheck-tests-browser.tsbuildinfo +1 -0
  4. package/.cache/typecheck-tests-node.tsbuildinfo +1 -0
  5. package/README.md +887 -0
  6. package/dist/common.types.d.ts +74 -0
  7. package/dist/common.types.d.ts.map +1 -0
  8. package/dist/common.types.js +5 -0
  9. package/dist/common.types.js.map +7 -0
  10. package/dist/env.d.ts +6 -0
  11. package/dist/env.d.ts.map +1 -0
  12. package/dist/env.js +9 -0
  13. package/dist/env.js.map +7 -0
  14. package/dist/errors/argument-error.d.ts +25 -0
  15. package/dist/errors/argument-error.d.ts.map +1 -0
  16. package/dist/errors/argument-error.js +18 -0
  17. package/dist/errors/argument-error.js.map +7 -0
  18. package/dist/errors/not-implemented-error.d.ts +29 -0
  19. package/dist/errors/not-implemented-error.d.ts.map +1 -0
  20. package/dist/errors/not-implemented-error.js +14 -0
  21. package/dist/errors/not-implemented-error.js.map +7 -0
  22. package/dist/errors/sd-error.d.ts +27 -0
  23. package/dist/errors/sd-error.d.ts.map +1 -0
  24. package/dist/errors/sd-error.js +23 -0
  25. package/dist/errors/sd-error.js.map +7 -0
  26. package/dist/errors/timeout-error.d.ts +31 -0
  27. package/dist/errors/timeout-error.d.ts.map +1 -0
  28. package/dist/errors/timeout-error.js +17 -0
  29. package/dist/errors/timeout-error.js.map +7 -0
  30. package/dist/extensions/arr-ext.d.ts +15 -0
  31. package/dist/extensions/arr-ext.d.ts.map +1 -0
  32. package/dist/extensions/arr-ext.helpers.d.ts +19 -0
  33. package/dist/extensions/arr-ext.helpers.d.ts.map +1 -0
  34. package/dist/extensions/arr-ext.helpers.js +35 -0
  35. package/dist/extensions/arr-ext.helpers.js.map +7 -0
  36. package/dist/extensions/arr-ext.js +546 -0
  37. package/dist/extensions/arr-ext.js.map +7 -0
  38. package/dist/extensions/arr-ext.types.d.ts +215 -0
  39. package/dist/extensions/arr-ext.types.d.ts.map +1 -0
  40. package/dist/extensions/arr-ext.types.js +1 -0
  41. package/dist/extensions/arr-ext.types.js.map +7 -0
  42. package/dist/extensions/map-ext.d.ts +57 -0
  43. package/dist/extensions/map-ext.d.ts.map +1 -0
  44. package/dist/extensions/map-ext.js +26 -0
  45. package/dist/extensions/map-ext.js.map +7 -0
  46. package/dist/extensions/set-ext.d.ts +36 -0
  47. package/dist/extensions/set-ext.d.ts.map +1 -0
  48. package/dist/extensions/set-ext.js +29 -0
  49. package/dist/extensions/set-ext.js.map +7 -0
  50. package/dist/features/debounce-queue.d.ts +53 -0
  51. package/dist/features/debounce-queue.d.ts.map +1 -0
  52. package/dist/features/debounce-queue.js +80 -0
  53. package/dist/features/debounce-queue.js.map +7 -0
  54. package/dist/features/event-emitter.d.ts +66 -0
  55. package/dist/features/event-emitter.d.ts.map +1 -0
  56. package/dist/features/event-emitter.js +82 -0
  57. package/dist/features/event-emitter.js.map +7 -0
  58. package/dist/features/serial-queue.d.ts +47 -0
  59. package/dist/features/serial-queue.d.ts.map +1 -0
  60. package/dist/features/serial-queue.js +66 -0
  61. package/dist/features/serial-queue.js.map +7 -0
  62. package/dist/globals.d.ts +12 -0
  63. package/dist/globals.d.ts.map +1 -0
  64. package/dist/globals.js +1 -0
  65. package/dist/globals.js.map +7 -0
  66. package/dist/index.d.ts +32 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +31 -0
  69. package/dist/index.js.map +7 -0
  70. package/dist/types/date-only.d.ts +152 -0
  71. package/dist/types/date-only.d.ts.map +1 -0
  72. package/dist/types/date-only.js +251 -0
  73. package/dist/types/date-only.js.map +7 -0
  74. package/dist/types/date-time.d.ts +96 -0
  75. package/dist/types/date-time.d.ts.map +1 -0
  76. package/dist/types/date-time.js +220 -0
  77. package/dist/types/date-time.js.map +7 -0
  78. package/dist/types/lazy-gc-map.d.ts +80 -0
  79. package/dist/types/lazy-gc-map.d.ts.map +1 -0
  80. package/dist/types/lazy-gc-map.js +179 -0
  81. package/dist/types/lazy-gc-map.js.map +7 -0
  82. package/dist/types/time.d.ts +68 -0
  83. package/dist/types/time.d.ts.map +1 -0
  84. package/dist/types/time.js +151 -0
  85. package/dist/types/time.js.map +7 -0
  86. package/dist/types/uuid.d.ts +35 -0
  87. package/dist/types/uuid.d.ts.map +1 -0
  88. package/dist/types/uuid.js +71 -0
  89. package/dist/types/uuid.js.map +7 -0
  90. package/dist/utils/bytes.d.ts +51 -0
  91. package/dist/utils/bytes.d.ts.map +1 -0
  92. package/dist/utils/bytes.js +89 -0
  93. package/dist/utils/bytes.js.map +7 -0
  94. package/dist/utils/date-format.d.ts +90 -0
  95. package/dist/utils/date-format.d.ts.map +1 -0
  96. package/dist/utils/date-format.js +106 -0
  97. package/dist/utils/date-format.js.map +7 -0
  98. package/dist/utils/json.d.ts +34 -0
  99. package/dist/utils/json.d.ts.map +1 -0
  100. package/dist/utils/json.js +152 -0
  101. package/dist/utils/json.js.map +7 -0
  102. package/dist/utils/num.d.ts +60 -0
  103. package/dist/utils/num.d.ts.map +1 -0
  104. package/dist/utils/num.js +39 -0
  105. package/dist/utils/num.js.map +7 -0
  106. package/dist/utils/obj.d.ts +258 -0
  107. package/dist/utils/obj.d.ts.map +1 -0
  108. package/dist/utils/obj.js +538 -0
  109. package/dist/utils/obj.js.map +7 -0
  110. package/dist/utils/path.d.ts +23 -0
  111. package/dist/utils/path.d.ts.map +1 -0
  112. package/dist/utils/path.js +21 -0
  113. package/dist/utils/path.js.map +7 -0
  114. package/dist/utils/primitive.d.ts +18 -0
  115. package/dist/utils/primitive.d.ts.map +1 -0
  116. package/dist/utils/primitive.js +20 -0
  117. package/dist/utils/primitive.js.map +7 -0
  118. package/dist/utils/str.d.ts +103 -0
  119. package/dist/utils/str.d.ts.map +1 -0
  120. package/dist/utils/str.js +128 -0
  121. package/dist/utils/str.js.map +7 -0
  122. package/dist/utils/template-strings.d.ts +84 -0
  123. package/dist/utils/template-strings.d.ts.map +1 -0
  124. package/dist/utils/template-strings.js +49 -0
  125. package/dist/utils/template-strings.js.map +7 -0
  126. package/dist/utils/transferable.d.ts +47 -0
  127. package/dist/utils/transferable.d.ts.map +1 -0
  128. package/dist/utils/transferable.js +153 -0
  129. package/dist/utils/transferable.js.map +7 -0
  130. package/dist/utils/wait.d.ts +19 -0
  131. package/dist/utils/wait.d.ts.map +1 -0
  132. package/dist/utils/wait.js +19 -0
  133. package/dist/utils/wait.js.map +7 -0
  134. package/dist/utils/xml.d.ts +36 -0
  135. package/dist/utils/xml.d.ts.map +1 -0
  136. package/dist/utils/xml.js +51 -0
  137. package/dist/utils/xml.js.map +7 -0
  138. package/dist/zip/sd-zip.d.ts +80 -0
  139. package/dist/zip/sd-zip.d.ts.map +1 -0
  140. package/dist/zip/sd-zip.js +153 -0
  141. package/dist/zip/sd-zip.js.map +7 -0
  142. package/package.json +31 -0
  143. package/src/common.types.ts +91 -0
  144. package/src/env.ts +11 -0
  145. package/src/errors/argument-error.ts +40 -0
  146. package/src/errors/not-implemented-error.ts +32 -0
  147. package/src/errors/sd-error.ts +53 -0
  148. package/src/errors/timeout-error.ts +36 -0
  149. package/src/extensions/arr-ext.helpers.ts +53 -0
  150. package/src/extensions/arr-ext.ts +777 -0
  151. package/src/extensions/arr-ext.types.ts +258 -0
  152. package/src/extensions/map-ext.ts +86 -0
  153. package/src/extensions/set-ext.ts +68 -0
  154. package/src/features/debounce-queue.ts +116 -0
  155. package/src/features/event-emitter.ts +112 -0
  156. package/src/features/serial-queue.ts +94 -0
  157. package/src/globals.ts +12 -0
  158. package/src/index.ts +55 -0
  159. package/src/types/date-only.ts +329 -0
  160. package/src/types/date-time.ts +294 -0
  161. package/src/types/lazy-gc-map.ts +244 -0
  162. package/src/types/time.ts +210 -0
  163. package/src/types/uuid.ts +113 -0
  164. package/src/utils/bytes.ts +160 -0
  165. package/src/utils/date-format.ts +239 -0
  166. package/src/utils/json.ts +230 -0
  167. package/src/utils/num.ts +97 -0
  168. package/src/utils/obj.ts +956 -0
  169. package/src/utils/path.ts +40 -0
  170. package/src/utils/primitive.ts +33 -0
  171. package/src/utils/str.ts +252 -0
  172. package/src/utils/template-strings.ts +132 -0
  173. package/src/utils/transferable.ts +269 -0
  174. package/src/utils/wait.ts +40 -0
  175. package/src/utils/xml.ts +105 -0
  176. package/src/zip/sd-zip.ts +218 -0
  177. package/tests/errors/errors.spec.ts +196 -0
  178. package/tests/extensions/array-extension.spec.ts +790 -0
  179. package/tests/extensions/map-extension.spec.ts +147 -0
  180. package/tests/extensions/set-extension.spec.ts +74 -0
  181. package/tests/types/date-only.spec.ts +636 -0
  182. package/tests/types/date-time.spec.ts +391 -0
  183. package/tests/types/lazy-gc-map.spec.ts +692 -0
  184. package/tests/types/time.spec.ts +559 -0
  185. package/tests/types/types.spec.ts +55 -0
  186. package/tests/types/uuid.spec.ts +91 -0
  187. package/tests/utils/bytes-utils.spec.ts +230 -0
  188. package/tests/utils/date-format.spec.ts +371 -0
  189. package/tests/utils/debounce-queue.spec.ts +272 -0
  190. package/tests/utils/json.spec.ts +475 -0
  191. package/tests/utils/number.spec.ts +184 -0
  192. package/tests/utils/object.spec.ts +827 -0
  193. package/tests/utils/path.spec.ts +78 -0
  194. package/tests/utils/primitive.spec.ts +55 -0
  195. package/tests/utils/sd-event-emitter.spec.ts +216 -0
  196. package/tests/utils/serial-queue.spec.ts +365 -0
  197. package/tests/utils/string.spec.ts +294 -0
  198. package/tests/utils/template-strings.spec.ts +96 -0
  199. package/tests/utils/transferable.spec.ts +698 -0
  200. package/tests/utils/wait.spec.ts +145 -0
  201. package/tests/utils/xml.spec.ts +146 -0
  202. package/tests/zip/sd-zip.spec.ts +234 -0
@@ -0,0 +1,294 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ strGetSuffix,
4
+ strReplaceFullWidth,
5
+ strToPascalCase,
6
+ strToCamelCase,
7
+ strToKebabCase,
8
+ strToSnakeCase,
9
+ strIsNullOrEmpty,
10
+ strInsert,
11
+ } from "@simplysm/core-common";
12
+
13
+ describe("string utils", () => {
14
+ //#region getSuffix - 한글 조사 처리
15
+
16
+ describe("strGetSuffix()", () => {
17
+ describe("받침이 있는 경우", () => {
18
+ it("'을' 타입은 '을'을 반환한다", () => {
19
+ expect(strGetSuffix("책", "을")).toBe("을");
20
+ });
21
+
22
+ it("'은' 타입은 '은'을 반환한다", () => {
23
+ expect(strGetSuffix("책", "은")).toBe("은");
24
+ });
25
+
26
+ it("'이' 타입은 '이'를 반환한다", () => {
27
+ expect(strGetSuffix("책", "이")).toBe("이");
28
+ });
29
+
30
+ it("'와' 타입은 '과'를 반환한다", () => {
31
+ expect(strGetSuffix("책", "와")).toBe("과");
32
+ });
33
+
34
+ it("'랑' 타입은 '이랑'을 반환한다", () => {
35
+ expect(strGetSuffix("책", "랑")).toBe("이랑");
36
+ });
37
+
38
+ it("'로' 타입은 '으로'를 반환한다", () => {
39
+ expect(strGetSuffix("책", "로")).toBe("으로");
40
+ });
41
+
42
+ it("'라' 타입은 '이라'를 반환한다", () => {
43
+ expect(strGetSuffix("책", "라")).toBe("이라");
44
+ });
45
+ });
46
+
47
+ describe("비한글 문자의 경우", () => {
48
+ it("영문자로 끝나면 받침 없음으로 처리한다", () => {
49
+ expect(strGetSuffix("ABC", "을")).toBe("를");
50
+ expect(strGetSuffix("test", "은")).toBe("는");
51
+ });
52
+
53
+ it("숫자로 끝나면 받침 없음으로 처리한다", () => {
54
+ expect(strGetSuffix("123", "을")).toBe("를");
55
+ expect(strGetSuffix("456", "은")).toBe("는");
56
+ });
57
+
58
+ it("빈 문자열은 받침 없음으로 처리한다", () => {
59
+ expect(strGetSuffix("", "을")).toBe("를");
60
+ expect(strGetSuffix("", "은")).toBe("는");
61
+ });
62
+ });
63
+
64
+ describe("받침이 없는 경우", () => {
65
+ it("'을' 타입은 '를'을 반환한다", () => {
66
+ expect(strGetSuffix("나무", "을")).toBe("를");
67
+ });
68
+
69
+ it("'은' 타입은 '는'을 반환한다", () => {
70
+ expect(strGetSuffix("나무", "은")).toBe("는");
71
+ });
72
+
73
+ it("'이' 타입은 '가'를 반환한다", () => {
74
+ expect(strGetSuffix("나무", "이")).toBe("가");
75
+ });
76
+
77
+ it("'와' 타입은 '와'를 반환한다", () => {
78
+ expect(strGetSuffix("나무", "와")).toBe("와");
79
+ });
80
+
81
+ it("'랑' 타입은 '랑'을 반환한다", () => {
82
+ expect(strGetSuffix("나무", "랑")).toBe("랑");
83
+ });
84
+
85
+ it("'로' 타입은 '로'를 반환한다", () => {
86
+ expect(strGetSuffix("나무", "로")).toBe("로");
87
+ });
88
+
89
+ it("'라' 타입은 '라'를 반환한다", () => {
90
+ expect(strGetSuffix("나무", "라")).toBe("라");
91
+ });
92
+ });
93
+
94
+ describe("받침 ㄹ인 경우 (로 조사 특수 처리)", () => {
95
+ it("'로' 타입은 받침 ㄹ일 때 '로'를 반환한다 (서울)", () => {
96
+ expect(strGetSuffix("서울", "로")).toBe("로");
97
+ });
98
+
99
+ it("'로' 타입은 받침 ㄹ일 때 '로'를 반환한다 (길)", () => {
100
+ expect(strGetSuffix("길", "로")).toBe("로");
101
+ });
102
+
103
+ it("'로' 타입은 받침 ㄹ일 때 '로'를 반환한다 (발)", () => {
104
+ expect(strGetSuffix("발", "로")).toBe("로");
105
+ });
106
+
107
+ it("'로' 타입은 받침 ㄹ일 때 '로'를 반환한다 (술)", () => {
108
+ expect(strGetSuffix("술", "로")).toBe("로");
109
+ });
110
+
111
+ it("'을' 타입은 받침 ㄹ일 때 일반 규칙대로 '을'을 반환한다", () => {
112
+ expect(strGetSuffix("서울", "을")).toBe("을");
113
+ });
114
+
115
+ it("'은' 타입은 받침 ㄹ일 때 일반 규칙대로 '은'을 반환한다", () => {
116
+ expect(strGetSuffix("서울", "은")).toBe("은");
117
+ });
118
+ });
119
+ });
120
+
121
+ //#endregion
122
+
123
+ //#region replaceSpecialDefaultChar - 전각→반각 변환
124
+
125
+ describe("strReplaceFullWidth()", () => {
126
+ it("전각 알파벳을 반각으로 변환한다", () => {
127
+ expect(strReplaceFullWidth("ABCDEFG")).toBe("ABCDEFG");
128
+ expect(strReplaceFullWidth("HIJKLMN")).toBe("HIJKLMN");
129
+ expect(strReplaceFullWidth("OPQRSTU")).toBe("OPQRSTU");
130
+ expect(strReplaceFullWidth("VWXYZ")).toBe("VWXYZ");
131
+ });
132
+
133
+ it("전각 숫자를 반각으로 변환한다", () => {
134
+ expect(strReplaceFullWidth("0123456789")).toBe("0123456789");
135
+ });
136
+
137
+ it("전각 괄호를 반각으로 변환한다", () => {
138
+ expect(strReplaceFullWidth("(ABC)")).toBe("(ABC)");
139
+ });
140
+
141
+ it("전각 공백을 반각 공백으로 변환한다", () => {
142
+ expect(strReplaceFullWidth("A B C")).toBe("A B C");
143
+ });
144
+
145
+ it("혼합된 전각/반각 문자열을 변환한다", () => {
146
+ expect(strReplaceFullWidth("ABC123")).toBe("ABC123");
147
+ });
148
+
149
+ it("전각 문자가 없는 경우 원본을 반환한다", () => {
150
+ expect(strReplaceFullWidth("ABC123")).toBe("ABC123");
151
+ });
152
+ });
153
+
154
+ //#endregion
155
+
156
+ //#region 케이스 변환
157
+
158
+ describe("strToPascalCase()", () => {
159
+ it("kebab-case를 PascalCase로 변환한다", () => {
160
+ expect(strToPascalCase("hello-world")).toBe("HelloWorld");
161
+ });
162
+
163
+ it("dot.case를 PascalCase로 변환한다", () => {
164
+ expect(strToPascalCase("hello.world")).toBe("HelloWorld");
165
+ });
166
+
167
+ it("snake_case를 PascalCase로 변환한다", () => {
168
+ expect(strToPascalCase("hello_world")).toBe("HelloWorld");
169
+ });
170
+
171
+ it("소문자로 시작하는 문자열의 첫 글자를 대문자로 변환한다", () => {
172
+ expect(strToPascalCase("hello")).toBe("Hello");
173
+ });
174
+
175
+ it("이미 PascalCase인 경우 그대로 반환한다", () => {
176
+ expect(strToPascalCase("HelloWorld")).toBe("HelloWorld");
177
+ });
178
+
179
+ it("연속된 하이픈을 처리한다", () => {
180
+ expect(strToPascalCase("hello-world-test")).toBe("HelloWorldTest");
181
+ });
182
+ });
183
+
184
+ describe("strToCamelCase()", () => {
185
+ it("kebab-case를 camelCase로 변환한다", () => {
186
+ expect(strToCamelCase("hello-world")).toBe("helloWorld");
187
+ });
188
+
189
+ it("PascalCase를 camelCase로 변환한다", () => {
190
+ expect(strToCamelCase("HelloWorld")).toBe("helloWorld");
191
+ });
192
+
193
+ it("dot.case를 camelCase로 변환한다", () => {
194
+ expect(strToCamelCase("hello.world")).toBe("helloWorld");
195
+ });
196
+
197
+ it("snake_case를 camelCase로 변환한다", () => {
198
+ expect(strToCamelCase("hello_world")).toBe("helloWorld");
199
+ });
200
+
201
+ it("이미 camelCase인 경우 그대로 반환한다", () => {
202
+ expect(strToCamelCase("helloWorld")).toBe("helloWorld");
203
+ });
204
+ });
205
+
206
+ describe("strToKebabCase()", () => {
207
+ it("PascalCase를 kebab-case로 변환한다", () => {
208
+ expect(strToKebabCase("HelloWorld")).toBe("hello-world");
209
+ });
210
+
211
+ it("camelCase를 kebab-case로 변환한다", () => {
212
+ expect(strToKebabCase("helloWorld")).toBe("hello-world");
213
+ });
214
+
215
+ it("언더스코어가 포함된 경우 언더스코어 앞에 하이픈을 추가한다", () => {
216
+ // toKebabCase는 [-_]?[A-Z]를 -소문자로 변환하므로 _W → -_w가 됨
217
+ expect(strToKebabCase("Hello_World")).toBe("hello-_world");
218
+ });
219
+
220
+ it("이미 kebab-case인 경우 그대로 반환한다", () => {
221
+ expect(strToKebabCase("hello-world")).toBe("hello-world");
222
+ });
223
+
224
+ it("연속된 대문자를 처리한다", () => {
225
+ expect(strToKebabCase("HelloWorldTest")).toBe("hello-world-test");
226
+ });
227
+
228
+ it("연속된 대문자 후 소문자가 오는 경우를 처리한다", () => {
229
+ // 각 대문자를 개별 단어로 취급
230
+ expect(strToKebabCase("XMLParser")).toBe("x-m-l-parser");
231
+ expect(strToKebabCase("HTTPSConnection")).toBe("h-t-t-p-s-connection");
232
+ });
233
+ });
234
+
235
+ describe("strToSnakeCase()", () => {
236
+ it("PascalCase를 snake_case로 변환한다", () => {
237
+ expect(strToSnakeCase("HelloWorld")).toBe("hello_world");
238
+ });
239
+
240
+ it("camelCase를 snake_case로 변환한다", () => {
241
+ expect(strToSnakeCase("helloWorld")).toBe("hello_world");
242
+ });
243
+
244
+ it("이미 snake_case인 경우 그대로 반환한다", () => {
245
+ expect(strToSnakeCase("hello_world")).toBe("hello_world");
246
+ });
247
+
248
+ it("연속된 대문자를 처리한다", () => {
249
+ expect(strToSnakeCase("HelloWorldTest")).toBe("hello_world_test");
250
+ });
251
+ });
252
+
253
+ //#endregion
254
+
255
+ //#region 기타
256
+
257
+ describe("strIsNullOrEmpty()", () => {
258
+ it("undefined이면 true를 반환한다", () => {
259
+ expect(strIsNullOrEmpty(undefined)).toBe(true);
260
+ });
261
+
262
+ it("빈 문자열이면 true를 반환한다", () => {
263
+ expect(strIsNullOrEmpty("")).toBe(true);
264
+ });
265
+
266
+ it("일반 문자열이면 false를 반환한다", () => {
267
+ expect(strIsNullOrEmpty("hello")).toBe(false);
268
+ });
269
+
270
+ it("공백만 있는 문자열은 false를 반환한다", () => {
271
+ expect(strIsNullOrEmpty(" ")).toBe(false);
272
+ });
273
+ });
274
+
275
+ describe("strInsert()", () => {
276
+ it("문자열 시작에 삽입한다", () => {
277
+ expect(strInsert("world", 0, "hello ")).toBe("hello world");
278
+ });
279
+
280
+ it("문자열 중간에 삽입한다", () => {
281
+ expect(strInsert("helloworld", 5, " ")).toBe("hello world");
282
+ });
283
+
284
+ it("문자열 끝에 삽입한다", () => {
285
+ expect(strInsert("hello", 5, " world")).toBe("hello world");
286
+ });
287
+
288
+ it("빈 문자열에 삽입한다", () => {
289
+ expect(strInsert("", 0, "hello")).toBe("hello");
290
+ });
291
+ });
292
+
293
+ //#endregion
294
+ });
@@ -0,0 +1,96 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { html, js, mysql, pgsql, ts, tsql } from "../../src/index.js";
3
+
4
+ describe("template-strings", () => {
5
+ describe("기본 동작", () => {
6
+ it("문자열 조합", () => {
7
+ const name = "test";
8
+ expect(js`const x = "${name}"`).toBe('const x = "test"');
9
+ });
10
+
11
+ it("들여쓰기 제거", () => {
12
+ const result = js`
13
+ const x = 1;
14
+ const y = 2;
15
+ `;
16
+ expect(result).toBe("const x = 1;\nconst y = 2;");
17
+ });
18
+
19
+ it("첫/마지막 빈 줄 제거", () => {
20
+ const result = html`
21
+ <div>test</div>
22
+ `;
23
+ expect(result).toBe("<div>test</div>");
24
+ });
25
+
26
+ it("중간 빈 줄 유지", () => {
27
+ const result = js`
28
+ const x = 1;
29
+
30
+ const y = 2;
31
+ `;
32
+ expect(result).toBe("const x = 1;\n\nconst y = 2;");
33
+ });
34
+ });
35
+
36
+ describe("SQL 함수들", () => {
37
+ it("tsql", () => {
38
+ expect(tsql`SELECT * FROM [User]`).toBe("SELECT * FROM [User]");
39
+ });
40
+
41
+ it("mysql", () => {
42
+ expect(mysql`SELECT * FROM \`User\``).toBe("SELECT * FROM `User`");
43
+ });
44
+
45
+ it("pgsql", () => {
46
+ expect(pgsql`SELECT * FROM "User"`).toBe('SELECT * FROM "User"');
47
+ });
48
+
49
+ it("tsql 멀티라인", () => {
50
+ const result = tsql`
51
+ SELECT id, name
52
+ FROM [User]
53
+ WHERE id = 1
54
+ `;
55
+ expect(result).toBe("SELECT id, name\nFROM [User]\nWHERE id = 1");
56
+ });
57
+ });
58
+
59
+ describe("코드 함수들", () => {
60
+ it("js", () => {
61
+ expect(js`console.log("hello")`).toBe('console.log("hello")');
62
+ });
63
+
64
+ it("ts", () => {
65
+ expect(ts`const x: number = 1`).toBe("const x: number = 1");
66
+ });
67
+
68
+ it("html", () => {
69
+ expect(html`
70
+ <div class="test">content</div>
71
+ `).toBe('<div class="test">content</div>');
72
+ });
73
+ });
74
+
75
+ describe("값 보간", () => {
76
+ it("undefined 값 처리", () => {
77
+ const value = undefined;
78
+ expect(js`x = ${value}`).toBe("x = ");
79
+ });
80
+
81
+ it("숫자 값 처리", () => {
82
+ expect(js`x = ${42}`).toBe("x = 42");
83
+ });
84
+
85
+ it("여러 값 보간", () => {
86
+ const a = 1;
87
+ const b = 2;
88
+ expect(js`${a} + ${b} = ${a + b}`).toBe("1 + 2 = 3");
89
+ });
90
+
91
+ it("객체 값 처리", () => {
92
+ const obj = { toString: () => "custom" };
93
+ expect(js`value = ${obj}`).toBe("value = custom");
94
+ });
95
+ });
96
+ });