@simplysm/core-browser 13.0.0-beta.5 → 13.0.0-beta.50

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 (107) hide show
  1. package/dist/extensions/element-ext.d.ts.map +1 -0
  2. package/dist/extensions/element-ext.js.map +0 -1
  3. package/dist/extensions/html-element-ext.d.ts.map +1 -0
  4. package/dist/extensions/html-element-ext.js.map +0 -1
  5. package/dist/{core-browser/src/index.d.ts → index.d.ts} +2 -1
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +7 -6
  8. package/dist/index.js.map +1 -2
  9. package/dist/utils/download.d.ts +8 -0
  10. package/dist/utils/download.d.ts.map +1 -0
  11. package/dist/utils/download.js +8 -40
  12. package/dist/utils/download.js.map +2 -3
  13. package/dist/{core-browser/src/utils/download.d.ts → utils/fetch.d.ts} +2 -2
  14. package/dist/utils/fetch.d.ts.map +1 -0
  15. package/dist/utils/fetch.js +47 -0
  16. package/dist/utils/fetch.js.map +6 -0
  17. package/dist/utils/file-dialog.d.ts +8 -0
  18. package/dist/utils/file-dialog.d.ts.map +1 -0
  19. package/dist/utils/file-dialog.js +18 -0
  20. package/dist/utils/file-dialog.js.map +6 -0
  21. package/package.json +9 -5
  22. package/src/index.ts +2 -1
  23. package/src/utils/download.ts +11 -60
  24. package/src/utils/fetch.ts +66 -0
  25. package/src/utils/file-dialog.ts +17 -0
  26. package/.cache/typecheck-browser.tsbuildinfo +0 -1
  27. package/.cache/typecheck-tests-browser.tsbuildinfo +0 -1
  28. package/dist/core-browser/src/extensions/element-ext.d.ts.map +0 -1
  29. package/dist/core-browser/src/extensions/html-element-ext.d.ts.map +0 -1
  30. package/dist/core-browser/src/index.d.ts.map +0 -1
  31. package/dist/core-browser/src/utils/blob.d.ts +0 -10
  32. package/dist/core-browser/src/utils/blob.d.ts.map +0 -1
  33. package/dist/core-browser/src/utils/download.d.ts.map +0 -1
  34. package/dist/core-common/src/common.types.d.ts +0 -74
  35. package/dist/core-common/src/common.types.d.ts.map +0 -1
  36. package/dist/core-common/src/env.d.ts +0 -6
  37. package/dist/core-common/src/env.d.ts.map +0 -1
  38. package/dist/core-common/src/errors/argument-error.d.ts +0 -25
  39. package/dist/core-common/src/errors/argument-error.d.ts.map +0 -1
  40. package/dist/core-common/src/errors/not-implemented-error.d.ts +0 -29
  41. package/dist/core-common/src/errors/not-implemented-error.d.ts.map +0 -1
  42. package/dist/core-common/src/errors/sd-error.d.ts +0 -27
  43. package/dist/core-common/src/errors/sd-error.d.ts.map +0 -1
  44. package/dist/core-common/src/errors/timeout-error.d.ts +0 -31
  45. package/dist/core-common/src/errors/timeout-error.d.ts.map +0 -1
  46. package/dist/core-common/src/extensions/arr-ext.d.ts +0 -15
  47. package/dist/core-common/src/extensions/arr-ext.d.ts.map +0 -1
  48. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +0 -19
  49. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +0 -1
  50. package/dist/core-common/src/extensions/arr-ext.types.d.ts +0 -215
  51. package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +0 -1
  52. package/dist/core-common/src/extensions/map-ext.d.ts +0 -57
  53. package/dist/core-common/src/extensions/map-ext.d.ts.map +0 -1
  54. package/dist/core-common/src/extensions/set-ext.d.ts +0 -36
  55. package/dist/core-common/src/extensions/set-ext.d.ts.map +0 -1
  56. package/dist/core-common/src/features/debounce-queue.d.ts +0 -53
  57. package/dist/core-common/src/features/debounce-queue.d.ts.map +0 -1
  58. package/dist/core-common/src/features/event-emitter.d.ts +0 -66
  59. package/dist/core-common/src/features/event-emitter.d.ts.map +0 -1
  60. package/dist/core-common/src/features/serial-queue.d.ts +0 -47
  61. package/dist/core-common/src/features/serial-queue.d.ts.map +0 -1
  62. package/dist/core-common/src/index.d.ts +0 -32
  63. package/dist/core-common/src/index.d.ts.map +0 -1
  64. package/dist/core-common/src/types/date-only.d.ts +0 -152
  65. package/dist/core-common/src/types/date-only.d.ts.map +0 -1
  66. package/dist/core-common/src/types/date-time.d.ts +0 -96
  67. package/dist/core-common/src/types/date-time.d.ts.map +0 -1
  68. package/dist/core-common/src/types/lazy-gc-map.d.ts +0 -80
  69. package/dist/core-common/src/types/lazy-gc-map.d.ts.map +0 -1
  70. package/dist/core-common/src/types/time.d.ts +0 -68
  71. package/dist/core-common/src/types/time.d.ts.map +0 -1
  72. package/dist/core-common/src/types/uuid.d.ts +0 -35
  73. package/dist/core-common/src/types/uuid.d.ts.map +0 -1
  74. package/dist/core-common/src/utils/bytes.d.ts +0 -51
  75. package/dist/core-common/src/utils/bytes.d.ts.map +0 -1
  76. package/dist/core-common/src/utils/date-format.d.ts +0 -90
  77. package/dist/core-common/src/utils/date-format.d.ts.map +0 -1
  78. package/dist/core-common/src/utils/json.d.ts +0 -34
  79. package/dist/core-common/src/utils/json.d.ts.map +0 -1
  80. package/dist/core-common/src/utils/num.d.ts +0 -60
  81. package/dist/core-common/src/utils/num.d.ts.map +0 -1
  82. package/dist/core-common/src/utils/obj.d.ts +0 -258
  83. package/dist/core-common/src/utils/obj.d.ts.map +0 -1
  84. package/dist/core-common/src/utils/path.d.ts +0 -23
  85. package/dist/core-common/src/utils/path.d.ts.map +0 -1
  86. package/dist/core-common/src/utils/primitive.d.ts +0 -18
  87. package/dist/core-common/src/utils/primitive.d.ts.map +0 -1
  88. package/dist/core-common/src/utils/str.d.ts +0 -103
  89. package/dist/core-common/src/utils/str.d.ts.map +0 -1
  90. package/dist/core-common/src/utils/template-strings.d.ts +0 -84
  91. package/dist/core-common/src/utils/template-strings.d.ts.map +0 -1
  92. package/dist/core-common/src/utils/transferable.d.ts +0 -47
  93. package/dist/core-common/src/utils/transferable.d.ts.map +0 -1
  94. package/dist/core-common/src/utils/wait.d.ts +0 -19
  95. package/dist/core-common/src/utils/wait.d.ts.map +0 -1
  96. package/dist/core-common/src/utils/xml.d.ts +0 -36
  97. package/dist/core-common/src/utils/xml.d.ts.map +0 -1
  98. package/dist/core-common/src/zip/sd-zip.d.ts +0 -80
  99. package/dist/core-common/src/zip/sd-zip.d.ts.map +0 -1
  100. package/dist/utils/blob.js +0 -19
  101. package/dist/utils/blob.js.map +0 -7
  102. package/src/utils/blob.ts +0 -19
  103. package/tests/extensions/element-ext.spec.ts +0 -729
  104. package/tests/extensions/html-element-ext.spec.ts +0 -190
  105. package/tests/utils/blob.spec.ts +0 -68
  106. /package/dist/{core-browser/src/extensions → extensions}/element-ext.d.ts +0 -0
  107. /package/dist/{core-browser/src/extensions → extensions}/html-element-ext.d.ts +0 -0
@@ -1,190 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
- import { ArgumentError } from "@simplysm/core-common";
3
- import "../../src/extensions/html-element-ext";
4
-
5
- describe("HTMLElement prototype extensions", () => {
6
- let container: HTMLDivElement;
7
-
8
- beforeEach(() => {
9
- container = document.createElement("div");
10
- document.body.appendChild(container);
11
- });
12
-
13
- afterEach(() => {
14
- container.remove();
15
- });
16
-
17
- describe("repaint", () => {
18
- it("offsetHeight 접근으로 리플로우 트리거", () => {
19
- const el = document.createElement("div");
20
- const offsetHeightSpy = vi.spyOn(el, "offsetHeight", "get").mockReturnValue(100);
21
-
22
- el.repaint();
23
-
24
- expect(offsetHeightSpy).toHaveBeenCalled();
25
- });
26
- });
27
-
28
- describe("getRelativeOffset", () => {
29
- it("부모 요소 기준 상대 위치 계산", () => {
30
- container.style.position = "relative";
31
- container.innerHTML = `<div id="child" style="position: absolute; top: 50px; left: 30px;"></div>`;
32
-
33
- const child = container.querySelector<HTMLElement>("#child")!;
34
-
35
- const result = child.getRelativeOffset(container);
36
- expect(result).toHaveProperty("top");
37
- expect(result).toHaveProperty("left");
38
- expect(typeof result.top).toBe("number");
39
- expect(typeof result.left).toBe("number");
40
- });
41
-
42
- it("셀렉터로 부모 찾기", () => {
43
- container.id = "parent";
44
- container.innerHTML = `<div><span id="deep-child"></span></div>`;
45
-
46
- const deepChild = container.querySelector<HTMLElement>("#deep-child")!;
47
-
48
- const result = deepChild.getRelativeOffset("#parent");
49
- expect(result).toHaveProperty("top");
50
- expect(result).toHaveProperty("left");
51
- expect(typeof result.top).toBe("number");
52
- expect(typeof result.left).toBe("number");
53
- });
54
-
55
- it("부모를 찾지 못하면 에러", () => {
56
- const child = document.createElement("div");
57
- container.appendChild(child);
58
-
59
- expect(() => child.getRelativeOffset(".not-exist")).toThrow(ArgumentError);
60
- });
61
-
62
- it("transform이 적용된 요소도 처리", () => {
63
- container.style.position = "relative";
64
- container.style.transform = "scale(2)";
65
- container.innerHTML = `<div id="child" style="transform: rotate(45deg);"></div>`;
66
-
67
- const child = container.querySelector<HTMLElement>("#child")!;
68
-
69
- // transform이 있어도 에러 없이 결과 반환해야 함
70
- const result = child.getRelativeOffset(container);
71
- expect(result).toHaveProperty("top");
72
- expect(result).toHaveProperty("left");
73
- expect(typeof result.top).toBe("number");
74
- expect(typeof result.left).toBe("number");
75
- });
76
-
77
- it("중간 요소의 border 두께가 누적됨", () => {
78
- container.style.position = "relative";
79
- container.innerHTML = `
80
- <div id="middle" style="border: 10px solid black;">
81
- <div id="child"></div>
82
- </div>
83
- `;
84
-
85
- const child = container.querySelector<HTMLElement>("#child")!;
86
- const result = child.getRelativeOffset(container);
87
-
88
- // 중간 요소의 borderTopWidth(10px)와 borderLeftWidth(10px)가 결과에 반영되어야 함
89
- expect(result.top).toBeGreaterThanOrEqual(10);
90
- expect(result.left).toBeGreaterThanOrEqual(10);
91
- });
92
-
93
- it("부모 요소가 스크롤된 상태에서 올바른 위치 계산", () => {
94
- container.style.position = "relative";
95
- container.style.overflow = "auto";
96
- container.style.height = "100px";
97
- container.style.width = "100px";
98
-
99
- const inner = document.createElement("div");
100
- inner.style.height = "500px";
101
- inner.style.width = "500px";
102
- inner.innerHTML = `<div id="child" style="position: absolute; top: 200px; left: 150px;"></div>`;
103
- container.appendChild(inner);
104
-
105
- // 부모 요소 스크롤
106
- container.scrollTop = 50;
107
- container.scrollLeft = 30;
108
-
109
- const child = container.querySelector<HTMLElement>("#child")!;
110
- const result = child.getRelativeOffset(container);
111
-
112
- // scrollTop/scrollLeft가 결과에 반영됨 (parentEl.scrollTop + parentEl.scrollLeft 추가됨)
113
- // 테스트 환경에서는 getBoundingClientRect가 스크롤을 반영하지 않으므로
114
- // 최소한 scrollTop/scrollLeft 값이 추가되었는지 검증
115
- expect(result.top).toBeGreaterThanOrEqual(200);
116
- expect(result.left).toBeGreaterThanOrEqual(150);
117
- });
118
- });
119
-
120
- describe("scrollIntoViewIfNeeded", () => {
121
- it("대상이 offset보다 위에 있으면 스크롤", () => {
122
- container.style.overflow = "auto";
123
- container.style.height = "100px";
124
- // 스크롤 가능한 콘텐츠 추가
125
- const inner = document.createElement("div");
126
- inner.style.height = "500px";
127
- container.appendChild(inner);
128
- container.scrollTop = 100;
129
-
130
- container.scrollIntoViewIfNeeded({ top: 50, left: 0 }, { top: 10, left: 0 });
131
-
132
- expect(container.scrollTop).toBe(40);
133
- });
134
-
135
- it("대상이 충분히 보이면 스크롤 안함", () => {
136
- container.style.overflow = "auto";
137
- container.style.height = "100px";
138
- const inner = document.createElement("div");
139
- inner.style.height = "500px";
140
- container.appendChild(inner);
141
- container.scrollTop = 0;
142
-
143
- container.scrollIntoViewIfNeeded({ top: 50, left: 0 }, { top: 10, left: 0 });
144
-
145
- expect(container.scrollTop).toBe(0);
146
- });
147
-
148
- it("기본 offset은 0", () => {
149
- container.style.overflow = "auto";
150
- container.style.height = "100px";
151
- const inner = document.createElement("div");
152
- inner.style.height = "500px";
153
- container.appendChild(inner);
154
- container.scrollTop = 100;
155
-
156
- container.scrollIntoViewIfNeeded({ top: 50, left: 0 });
157
-
158
- expect(container.scrollTop).toBe(50);
159
- });
160
-
161
- it("대상이 offset보다 왼쪽에 있으면 가로 스크롤", () => {
162
- container.style.overflow = "auto";
163
- container.style.width = "100px";
164
- // 스크롤 가능한 콘텐츠 추가
165
- const inner = document.createElement("div");
166
- inner.style.width = "500px";
167
- inner.style.height = "10px";
168
- container.appendChild(inner);
169
- container.scrollLeft = 100;
170
-
171
- container.scrollIntoViewIfNeeded({ top: 0, left: 50 }, { top: 0, left: 10 });
172
-
173
- expect(container.scrollLeft).toBe(40);
174
- });
175
-
176
- it("대상이 충분히 보이면 가로 스크롤 안함", () => {
177
- container.style.overflow = "auto";
178
- container.style.width = "100px";
179
- const inner = document.createElement("div");
180
- inner.style.width = "500px";
181
- inner.style.height = "10px";
182
- container.appendChild(inner);
183
- container.scrollLeft = 0;
184
-
185
- container.scrollIntoViewIfNeeded({ top: 0, left: 50 }, { top: 0, left: 10 });
186
-
187
- expect(container.scrollLeft).toBe(0);
188
- });
189
- });
190
- });
@@ -1,68 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
- import { BlobUtils } from "../../src/utils/blob";
3
-
4
- describe("BlobUtils", () => {
5
- let originalCreateObjectURL: typeof URL.createObjectURL;
6
- let originalRevokeObjectURL: typeof URL.revokeObjectURL;
7
- let mockLink: HTMLAnchorElement;
8
- let clickSpy: ReturnType<typeof vi.fn>;
9
-
10
- beforeEach(() => {
11
- vi.useFakeTimers();
12
-
13
- originalCreateObjectURL = URL.createObjectURL;
14
- originalRevokeObjectURL = URL.revokeObjectURL;
15
- URL.createObjectURL = vi.fn().mockReturnValue("blob:mock-url");
16
- URL.revokeObjectURL = vi.fn();
17
-
18
- clickSpy = vi.fn();
19
- mockLink = {
20
- href: "",
21
- download: "",
22
- click: clickSpy,
23
- } as unknown as HTMLAnchorElement;
24
-
25
- vi.spyOn(document, "createElement").mockReturnValue(mockLink);
26
- });
27
-
28
- afterEach(() => {
29
- vi.useRealTimers();
30
- URL.createObjectURL = originalCreateObjectURL;
31
- URL.revokeObjectURL = originalRevokeObjectURL;
32
- vi.restoreAllMocks();
33
- });
34
-
35
- describe("download", () => {
36
- it("Blob을 다운로드 링크로 변환하여 클릭", () => {
37
- const blob = new Blob(["test content"], { type: "text/plain" });
38
- const fileName = "test.txt";
39
-
40
- BlobUtils.download(blob, fileName);
41
-
42
- expect(URL.createObjectURL).toHaveBeenCalledWith(blob);
43
- expect(mockLink.href).toBe("blob:mock-url");
44
- expect(mockLink.download).toBe(fileName);
45
- expect(clickSpy).toHaveBeenCalled();
46
- });
47
-
48
- it("다운로드 후 URL.revokeObjectURL 호출 (메모리 누수 방지)", () => {
49
- const blob = new Blob(["test"], { type: "text/plain" });
50
-
51
- BlobUtils.download(blob, "test.txt");
52
- vi.runAllTimers();
53
-
54
- expect(URL.revokeObjectURL).toHaveBeenCalledWith("blob:mock-url");
55
- });
56
-
57
- it("에러 발생 시에도 revokeObjectURL 호출", () => {
58
- const blob = new Blob(["test"], { type: "text/plain" });
59
- clickSpy.mockImplementation(() => {
60
- throw new Error("Click failed");
61
- });
62
-
63
- expect(() => BlobUtils.download(blob, "test.txt")).toThrow("Click failed");
64
- vi.runAllTimers();
65
- expect(URL.revokeObjectURL).toHaveBeenCalledWith("blob:mock-url");
66
- });
67
- });
68
- });