@graphty/layout 1.2.2 → 1.2.4

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 (200) hide show
  1. package/README.md +317 -237
  2. package/dist/src/algorithms/index.d.ts +5 -0
  3. package/dist/src/algorithms/index.js +6 -0
  4. package/dist/src/algorithms/index.js.map +1 -0
  5. package/dist/src/algorithms/optimization/index.d.ts +7 -0
  6. package/dist/src/algorithms/optimization/index.js +7 -0
  7. package/dist/src/algorithms/optimization/index.js.map +1 -0
  8. package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts +32 -0
  9. package/dist/src/algorithms/optimization/kamada-kawai-solver.js +176 -0
  10. package/dist/src/algorithms/optimization/kamada-kawai-solver.js.map +1 -0
  11. package/dist/src/algorithms/optimization/lbfgs.d.ts +13 -0
  12. package/dist/src/algorithms/optimization/lbfgs.js +56 -0
  13. package/dist/src/algorithms/optimization/lbfgs.js.map +1 -0
  14. package/dist/src/algorithms/optimization/line-search.d.ts +15 -0
  15. package/dist/src/algorithms/optimization/line-search.js +37 -0
  16. package/dist/src/algorithms/optimization/line-search.js.map +1 -0
  17. package/dist/src/algorithms/optimization/types.d.ts +5 -0
  18. package/dist/src/algorithms/optimization/types.js +5 -0
  19. package/dist/src/algorithms/optimization/types.js.map +1 -0
  20. package/dist/src/algorithms/planarity/check.d.ts +17 -0
  21. package/dist/src/algorithms/planarity/check.js +30 -0
  22. package/dist/src/algorithms/planarity/check.js.map +1 -0
  23. package/dist/src/algorithms/planarity/embedding.d.ts +29 -0
  24. package/dist/src/algorithms/planarity/embedding.js +179 -0
  25. package/dist/src/algorithms/planarity/embedding.js.map +1 -0
  26. package/dist/src/algorithms/planarity/index.d.ts +7 -0
  27. package/dist/src/algorithms/planarity/index.js +8 -0
  28. package/dist/src/algorithms/planarity/index.js.map +1 -0
  29. package/dist/src/algorithms/planarity/lr-test.d.ts +15 -0
  30. package/dist/src/algorithms/planarity/lr-test.js +54 -0
  31. package/dist/src/algorithms/planarity/lr-test.js.map +1 -0
  32. package/dist/src/algorithms/planarity/special-graphs.d.ts +28 -0
  33. package/dist/src/algorithms/planarity/special-graphs.js +108 -0
  34. package/dist/src/algorithms/planarity/special-graphs.js.map +1 -0
  35. package/dist/src/generators/basic.d.ts +28 -0
  36. package/dist/src/generators/basic.js +79 -0
  37. package/dist/src/generators/basic.js.map +1 -0
  38. package/dist/src/generators/bipartite.d.ts +16 -0
  39. package/dist/src/generators/bipartite.js +40 -0
  40. package/dist/src/generators/bipartite.js.map +1 -0
  41. package/dist/src/generators/grid.d.ts +11 -0
  42. package/dist/src/generators/grid.js +37 -0
  43. package/dist/src/generators/grid.js.map +1 -0
  44. package/dist/src/generators/index.d.ts +8 -0
  45. package/dist/src/generators/index.js +9 -0
  46. package/dist/src/generators/index.js.map +1 -0
  47. package/dist/src/generators/random.d.ts +12 -0
  48. package/dist/src/generators/random.js +34 -0
  49. package/dist/src/generators/random.js.map +1 -0
  50. package/dist/src/generators/scale-free.d.ts +12 -0
  51. package/dist/src/generators/scale-free.js +62 -0
  52. package/dist/src/generators/scale-free.js.map +1 -0
  53. package/dist/src/index.d.ts +10 -0
  54. package/dist/src/index.js +15 -0
  55. package/dist/src/index.js.map +1 -0
  56. package/dist/src/layouts/basic/index.d.ts +4 -0
  57. package/dist/src/layouts/basic/index.js +5 -0
  58. package/dist/src/layouts/basic/index.js.map +1 -0
  59. package/dist/src/layouts/basic/random.d.ts +14 -0
  60. package/dist/src/layouts/basic/random.js +27 -0
  61. package/dist/src/layouts/basic/random.js.map +1 -0
  62. package/dist/src/layouts/force-directed/arf.d.ts +13 -0
  63. package/dist/src/layouts/force-directed/arf.js +103 -0
  64. package/dist/src/layouts/force-directed/arf.js.map +1 -0
  65. package/dist/src/layouts/force-directed/forceatlas2.d.ts +22 -0
  66. package/dist/src/layouts/force-directed/forceatlas2.js +322 -0
  67. package/dist/src/layouts/force-directed/forceatlas2.js.map +1 -0
  68. package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts +19 -0
  69. package/dist/src/layouts/force-directed/fruchterman-reingold.js +131 -0
  70. package/dist/src/layouts/force-directed/fruchterman-reingold.js.map +1 -0
  71. package/dist/src/layouts/force-directed/index.d.ts +8 -0
  72. package/dist/src/layouts/force-directed/index.js +9 -0
  73. package/dist/src/layouts/force-directed/index.js.map +1 -0
  74. package/dist/src/layouts/force-directed/kamada-kawai.d.ts +15 -0
  75. package/dist/src/layouts/force-directed/kamada-kawai.js +87 -0
  76. package/dist/src/layouts/force-directed/kamada-kawai.js.map +1 -0
  77. package/dist/src/layouts/force-directed/spring.d.ts +19 -0
  78. package/dist/src/layouts/force-directed/spring.js +23 -0
  79. package/dist/src/layouts/force-directed/spring.js.map +1 -0
  80. package/dist/src/layouts/geometric/circular.d.ts +14 -0
  81. package/dist/src/layouts/geometric/circular.js +67 -0
  82. package/dist/src/layouts/geometric/circular.js.map +1 -0
  83. package/dist/src/layouts/geometric/index.d.ts +6 -0
  84. package/dist/src/layouts/geometric/index.js +7 -0
  85. package/dist/src/layouts/geometric/index.js.map +1 -0
  86. package/dist/src/layouts/geometric/shell.d.ts +15 -0
  87. package/dist/src/layouts/geometric/shell.js +67 -0
  88. package/dist/src/layouts/geometric/shell.js.map +1 -0
  89. package/dist/src/layouts/geometric/spiral.d.ts +16 -0
  90. package/dist/src/layouts/geometric/spiral.js +73 -0
  91. package/dist/src/layouts/geometric/spiral.js.map +1 -0
  92. package/dist/src/layouts/hierarchical/bfs.d.ts +12 -0
  93. package/dist/src/layouts/hierarchical/bfs.js +62 -0
  94. package/dist/src/layouts/hierarchical/bfs.js.map +1 -0
  95. package/dist/src/layouts/hierarchical/bipartite.d.ts +16 -0
  96. package/dist/src/layouts/hierarchical/bipartite.js +72 -0
  97. package/dist/src/layouts/hierarchical/bipartite.js.map +1 -0
  98. package/dist/src/layouts/hierarchical/index.d.ts +6 -0
  99. package/dist/src/layouts/hierarchical/index.js +7 -0
  100. package/dist/src/layouts/hierarchical/index.js.map +1 -0
  101. package/dist/src/layouts/hierarchical/multipartite.d.ts +12 -0
  102. package/dist/src/layouts/hierarchical/multipartite.js +73 -0
  103. package/dist/src/layouts/hierarchical/multipartite.js.map +1 -0
  104. package/dist/src/layouts/index.d.ts +8 -0
  105. package/dist/src/layouts/index.js +9 -0
  106. package/dist/src/layouts/index.js.map +1 -0
  107. package/dist/src/layouts/specialized/index.d.ts +5 -0
  108. package/dist/src/layouts/specialized/index.js +6 -0
  109. package/dist/src/layouts/specialized/index.js.map +1 -0
  110. package/dist/src/layouts/specialized/planar.d.ts +14 -0
  111. package/dist/src/layouts/specialized/planar.js +47 -0
  112. package/dist/src/layouts/specialized/planar.js.map +1 -0
  113. package/dist/src/layouts/specialized/spectral.d.ts +14 -0
  114. package/dist/src/layouts/specialized/spectral.js +106 -0
  115. package/dist/src/layouts/specialized/spectral.js.map +1 -0
  116. package/dist/src/types/embedding.d.ts +9 -0
  117. package/dist/src/types/embedding.js +5 -0
  118. package/dist/src/types/embedding.js.map +1 -0
  119. package/dist/src/types/graph.d.ts +10 -0
  120. package/dist/src/types/graph.js +5 -0
  121. package/dist/src/types/graph.js.map +1 -0
  122. package/dist/src/types/index.d.ts +6 -0
  123. package/dist/src/types/index.js +7 -0
  124. package/dist/src/types/index.js.map +1 -0
  125. package/dist/src/types/layout.d.ts +6 -0
  126. package/dist/src/types/layout.js +5 -0
  127. package/dist/src/types/layout.js.map +1 -0
  128. package/dist/src/utils/graph.d.ts +34 -0
  129. package/dist/src/utils/graph.js +69 -0
  130. package/dist/src/utils/graph.js.map +1 -0
  131. package/dist/src/utils/index.d.ts +8 -0
  132. package/dist/src/utils/index.js +9 -0
  133. package/dist/src/utils/index.js.map +1 -0
  134. package/dist/src/utils/numpy.d.ts +17 -0
  135. package/dist/src/utils/numpy.js +101 -0
  136. package/dist/src/utils/numpy.js.map +1 -0
  137. package/dist/src/utils/params.d.ts +17 -0
  138. package/dist/src/utils/params.js +22 -0
  139. package/dist/src/utils/params.js.map +1 -0
  140. package/dist/src/utils/random.d.ts +14 -0
  141. package/dist/src/utils/random.js +42 -0
  142. package/dist/src/utils/random.js.map +1 -0
  143. package/dist/src/utils/rescale.d.ts +21 -0
  144. package/dist/src/utils/rescale.js +119 -0
  145. package/dist/src/utils/rescale.js.map +1 -0
  146. package/dist/vitest.config.js +1 -1
  147. package/dist/vitest.config.js.map +1 -1
  148. package/package.json +15 -1
  149. package/.env.example +0 -11
  150. package/.github/workflows/ci.yml +0 -101
  151. package/.releaserc.json +0 -22
  152. package/CHANGELOG.md +0 -45
  153. package/CLAUDE.md +0 -104
  154. package/CONTRIBUTING.md +0 -1
  155. package/DEPLOYMENT.md +0 -59
  156. package/commitlint.config.js +0 -37
  157. package/examples/3d-force-directed.html +0 -611
  158. package/examples/3d-kamada-kawai.html +0 -379
  159. package/examples/3d-layout-comparison.html +0 -448
  160. package/examples/3d-spherical-layout.html +0 -319
  161. package/examples/arf-layout.html +0 -524
  162. package/examples/bfs-layout.html +0 -487
  163. package/examples/bipartite-layout.html +0 -382
  164. package/examples/circular-layout.html +0 -292
  165. package/examples/forceatlas2-layout.html +0 -588
  166. package/examples/index.html +0 -241
  167. package/examples/kamada-kawai-layout.html +0 -425
  168. package/examples/layout-helpers.js +0 -486
  169. package/examples/multipartite-layout.html +0 -410
  170. package/examples/planar-layout.html +0 -388
  171. package/examples/random-layout.html +0 -328
  172. package/examples/shell-layout.html +0 -323
  173. package/examples/spectral-layout.html +0 -335
  174. package/examples/spiral-layout.html +0 -447
  175. package/examples/spring-layout.html +0 -313
  176. package/test/arf-layout.test.ts +0 -443
  177. package/test/bfs-layout.test.ts +0 -427
  178. package/test/bipartite-layout.test.ts +0 -344
  179. package/test/circular-layout.test.ts +0 -442
  180. package/test/forceatlas2-layout.test.ts +0 -405
  181. package/test/fruchterman-reingold-layout.test.ts +0 -477
  182. package/test/graph-generators.test.ts +0 -450
  183. package/test/kamada-kawai-layout.test.ts +0 -623
  184. package/test/multipartite-layout.test.ts +0 -404
  185. package/test/planar-layout.test.ts +0 -266
  186. package/test/random-layout.test.ts +0 -254
  187. package/test/rescale-layout.test.ts +0 -373
  188. package/test/shell-layout.test.ts +0 -347
  189. package/test/spectral-layout.test.ts +0 -378
  190. package/test/spiral-layout.test.ts +0 -338
  191. package/test/spring-layout.test.ts +0 -241
  192. package/test/test-utils.ts +0 -34
  193. package/test/utils-graph.test.ts +0 -155
  194. package/test/utils-index.test.ts +0 -77
  195. package/test/utils-numpy.test.ts +0 -272
  196. package/test/utils-params.test.ts +0 -99
  197. package/test/utils-random.test.ts +0 -229
  198. package/tsconfig.json +0 -16
  199. package/vite.config.js +0 -36
  200. package/vitest.config.ts +0 -30
@@ -1,229 +0,0 @@
1
- /**
2
- * Tests for random number generator utilities
3
- */
4
-
5
- import { describe, it, expect } from 'vitest';
6
- import { RandomNumberGenerator } from '../src/utils/random';
7
-
8
- describe('Random Utils', () => {
9
- describe('RandomNumberGenerator', () => {
10
- describe('constructor', () => {
11
- it('should use provided seed', () => {
12
- const rng = new RandomNumberGenerator(12345);
13
- expect(rng['seed']).toBe(12345);
14
- });
15
-
16
- it('should generate random seed when none provided', () => {
17
- const rng1 = new RandomNumberGenerator();
18
- const rng2 = new RandomNumberGenerator();
19
- // Seeds should be different (very high probability)
20
- expect(rng1['seed']).not.toBe(rng2['seed']);
21
- });
22
-
23
- it('should initialize state properly', () => {
24
- const rng = new RandomNumberGenerator(42);
25
- expect(rng['_state']).toBe(42);
26
- });
27
-
28
- it('should handle large seeds', () => {
29
- const largeSeed = 999999999;
30
- const rng = new RandomNumberGenerator(largeSeed);
31
- expect(rng['seed']).toBe(largeSeed);
32
- });
33
- });
34
-
35
- describe('_next', () => {
36
- it('should generate values between 0 and 1', () => {
37
- const rng = new RandomNumberGenerator(123);
38
- for (let i = 0; i < 100; i++) {
39
- const value = rng['_next']();
40
- expect(value).toBeGreaterThanOrEqual(0);
41
- expect(value).toBeLessThan(1);
42
- }
43
- });
44
-
45
- it('should be deterministic for same seed', () => {
46
- const rng1 = new RandomNumberGenerator(456);
47
- const rng2 = new RandomNumberGenerator(456);
48
-
49
- const sequence1 = Array.from({ length: 10 }, () => rng1['_next']());
50
- const sequence2 = Array.from({ length: 10 }, () => rng2['_next']());
51
-
52
- expect(sequence1).toEqual(sequence2);
53
- });
54
-
55
- it('should produce different sequences for different seeds', () => {
56
- const rng1 = new RandomNumberGenerator(111);
57
- const rng2 = new RandomNumberGenerator(222);
58
-
59
- const sequence1 = Array.from({ length: 10 }, () => rng1['_next']());
60
- const sequence2 = Array.from({ length: 10 }, () => rng2['_next']());
61
-
62
- expect(sequence1).not.toEqual(sequence2);
63
- });
64
- });
65
-
66
- describe('rand', () => {
67
- it('should return single number when no shape provided', () => {
68
- const rng = new RandomNumberGenerator(789);
69
- const value = rng.rand() as number;
70
- expect(typeof value).toBe('number');
71
- expect(value).toBeGreaterThanOrEqual(0);
72
- expect(value).toBeLessThan(1);
73
- });
74
-
75
- it('should return single number when null shape provided', () => {
76
- const rng = new RandomNumberGenerator(789);
77
- const value = rng.rand(null) as number;
78
- expect(typeof value).toBe('number');
79
- expect(value).toBeGreaterThanOrEqual(0);
80
- expect(value).toBeLessThan(1);
81
- });
82
-
83
- it('should return 1D array when given number shape', () => {
84
- const rng = new RandomNumberGenerator(101112);
85
- const values = rng.rand(5) as number[];
86
- expect(Array.isArray(values)).toBe(true);
87
- expect(values).toHaveLength(5);
88
- values.forEach(v => {
89
- expect(v).toBeGreaterThanOrEqual(0);
90
- expect(v).toBeLessThan(1);
91
- });
92
- });
93
-
94
- it('should return empty array for zero length', () => {
95
- const rng = new RandomNumberGenerator(123);
96
- expect(rng.rand(0)).toEqual([]);
97
- });
98
-
99
- it('should return 1D array when given single-element array shape', () => {
100
- const rng = new RandomNumberGenerator(131415);
101
- const values = rng.rand([4]) as number[];
102
- expect(Array.isArray(values)).toBe(true);
103
- expect(values).toHaveLength(4);
104
- values.forEach(v => {
105
- expect(v).toBeGreaterThanOrEqual(0);
106
- expect(v).toBeLessThan(1);
107
- });
108
- });
109
-
110
- it('should return 2D array when given 2D shape', () => {
111
- const rng = new RandomNumberGenerator(161718);
112
- const values = rng.rand([2, 3]) as number[][];
113
- expect(Array.isArray(values)).toBe(true);
114
- expect(values).toHaveLength(2);
115
- values.forEach(row => {
116
- expect(Array.isArray(row)).toBe(true);
117
- expect(row).toHaveLength(3);
118
- row.forEach(v => {
119
- expect(v).toBeGreaterThanOrEqual(0);
120
- expect(v).toBeLessThan(1);
121
- });
122
- });
123
- });
124
-
125
- it('should return 3D array when given 3D shape', () => {
126
- const rng = new RandomNumberGenerator(192021);
127
- const values = rng.rand([2, 2, 2]) as number[][][];
128
- expect(Array.isArray(values)).toBe(true);
129
- expect(values).toHaveLength(2);
130
- values.forEach(plane => {
131
- expect(Array.isArray(plane)).toBe(true);
132
- expect(plane).toHaveLength(2);
133
- plane.forEach(row => {
134
- expect(Array.isArray(row)).toBe(true);
135
- expect(row).toHaveLength(2);
136
- row.forEach(v => {
137
- expect(v).toBeGreaterThanOrEqual(0);
138
- expect(v).toBeLessThan(1);
139
- });
140
- });
141
- });
142
- });
143
-
144
- it('should handle edge cases with zeros in shape', () => {
145
- const rng = new RandomNumberGenerator(222324);
146
- expect(rng.rand([0])).toEqual([]);
147
- expect(rng.rand([3, 0])).toEqual([[], [], []]);
148
- expect(rng.rand([0, 3])).toEqual([]);
149
- });
150
-
151
- it('should be deterministic across calls with same seed', () => {
152
- const rng1 = new RandomNumberGenerator(252627);
153
- const rng2 = new RandomNumberGenerator(252627);
154
-
155
- const values1 = rng1.rand([2, 3]) as number[][];
156
- const values2 = rng2.rand([2, 3]) as number[][];
157
-
158
- expect(values1).toEqual(values2);
159
- });
160
-
161
- it('should handle single element arrays', () => {
162
- const rng = new RandomNumberGenerator(282930);
163
- const value1D = rng.rand(1) as number[];
164
- const value2D = rng.rand([1, 1]) as number[][];
165
-
166
- expect(value1D).toHaveLength(1);
167
- expect(value2D).toHaveLength(1);
168
- expect(value2D[0]).toHaveLength(1);
169
- });
170
-
171
- it('should produce different values in sequence', () => {
172
- const rng = new RandomNumberGenerator(313233);
173
- const values = rng.rand(10) as number[];
174
-
175
- // Check that not all values are the same (very high probability)
176
- const uniqueValues = new Set(values);
177
- expect(uniqueValues.size).toBeGreaterThan(1);
178
- });
179
- });
180
-
181
- describe('integration tests', () => {
182
- it('should work correctly for layout algorithm use cases', () => {
183
- const rng = new RandomNumberGenerator(424344);
184
-
185
- // Test typical usage patterns in layout algorithms
186
- const initialPositions = rng.rand([5, 2]) as number[][];
187
- expect(initialPositions).toHaveLength(5);
188
- initialPositions.forEach(pos => {
189
- expect(pos).toHaveLength(2);
190
- expect(pos[0]).toBeGreaterThanOrEqual(0);
191
- expect(pos[0]).toBeLessThan(1);
192
- expect(pos[1]).toBeGreaterThanOrEqual(0);
193
- expect(pos[1]).toBeLessThan(1);
194
- });
195
- });
196
-
197
- it('should maintain quality of randomness over many calls', () => {
198
- const rng = new RandomNumberGenerator(454647);
199
- const values: number[] = [];
200
-
201
- // Generate many values
202
- for (let i = 0; i < 1000; i++) {
203
- values.push(rng.rand() as number);
204
- }
205
-
206
- // Basic statistical tests
207
- const mean = values.reduce((a, b) => a + b) / values.length;
208
- expect(mean).toBeGreaterThan(0.4); // Should be around 0.5
209
- expect(mean).toBeLessThan(0.6);
210
-
211
- // Check distribution across range
212
- const firstQuartile = values.filter(v => v < 0.25).length;
213
- const secondQuartile = values.filter(v => v >= 0.25 && v < 0.5).length;
214
- const thirdQuartile = values.filter(v => v >= 0.5 && v < 0.75).length;
215
- const fourthQuartile = values.filter(v => v >= 0.75).length;
216
-
217
- // Each quartile should have roughly 1/4 of values (allow some variance)
218
- expect(firstQuartile).toBeGreaterThan(200);
219
- expect(firstQuartile).toBeLessThan(300);
220
- expect(secondQuartile).toBeGreaterThan(200);
221
- expect(secondQuartile).toBeLessThan(300);
222
- expect(thirdQuartile).toBeGreaterThan(200);
223
- expect(thirdQuartile).toBeLessThan(300);
224
- expect(fourthQuartile).toBeGreaterThan(200);
225
- expect(fourthQuartile).toBeLessThan(300);
226
- });
227
- });
228
- });
229
- });
package/tsconfig.json DELETED
@@ -1,16 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "module": "ES2020",
5
- "moduleResolution": "node",
6
- "declaration": true,
7
- "outDir": "./dist",
8
- "esModuleInterop": true,
9
- "strict": true,
10
- "sourceMap": true,
11
- "lib": ["ES2020", "DOM"],
12
- "skipLibCheck": true
13
- },
14
- "include": ["*.ts"],
15
- "exclude": ["node_modules"]
16
- }
package/vite.config.js DELETED
@@ -1,36 +0,0 @@
1
- import { defineConfig, loadEnv } from 'vite';
2
-
3
- export default defineConfig(({ mode }) => {
4
- // Load env file based on `mode` in the current working directory.
5
- // Set the third parameter to '' to load all env regardless of the `VITE_` prefix.
6
- const env = loadEnv(mode, process.cwd(), '');
7
-
8
- const config = {
9
- server: {
10
- port: 3000,
11
- open: '/examples/',
12
- host: true,
13
- fs: {
14
- // Allow serving files from the dist directory
15
- allow: ['..']
16
- }
17
- },
18
- build: {
19
- // Ensure the examples can find the built files
20
- outDir: 'dist'
21
- },
22
- publicDir: false // Disable default public directory behavior
23
- };
24
-
25
- // Allow HOST configuration from .env
26
- if (env.HOST) {
27
- config.server.host = env.HOST;
28
- }
29
-
30
- // Allow PORT configuration from .env
31
- if (env.PORT) {
32
- config.server.port = parseInt(env.PORT);
33
- }
34
-
35
- return config;
36
- });
package/vitest.config.ts DELETED
@@ -1,30 +0,0 @@
1
- import { defineConfig } from 'vitest/config';
2
-
3
- export default defineConfig({
4
- test: {
5
- globals: true,
6
- environment: 'happy-dom',
7
- pool: 'forks',
8
- testTimeout: 30000,
9
- coverage: {
10
- provider: 'v8',
11
- reporter: ['text', 'json', 'html', 'lcov'],
12
- include: ['src/**/*.ts'],
13
- exclude: ['**/*.d.ts', '**/*.test.ts'],
14
- all: true,
15
- thresholds: {
16
- lines: 65,
17
- functions: 60,
18
- branches: 85,
19
- statements: 65
20
- }
21
- },
22
- include: ['test/**/*.test.ts'],
23
- reporters: ['verbose']
24
- },
25
- resolve: {
26
- alias: {
27
- '@': '/src'
28
- }
29
- }
30
- });