alchemist-collections 0.0.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.
- package/LICENSE +20 -0
- package/README.md +313 -0
- package/dist/src/core/exceptions/IndexOutOfBoundsException.d.ts +4 -0
- package/dist/src/core/exceptions/IndexOutOfBoundsException.d.ts.map +1 -0
- package/dist/src/core/exceptions/IndexOutOfBoundsException.js +11 -0
- package/dist/src/core/exceptions/IndexOutOfBoundsException.js.map +1 -0
- package/dist/src/core/interfaces/List.d.ts +13 -0
- package/dist/src/core/interfaces/List.d.ts.map +1 -0
- package/dist/src/core/interfaces/List.js +2 -0
- package/dist/src/core/interfaces/List.js.map +1 -0
- package/dist/src/core/interfaces/Map.d.ts +14 -0
- package/dist/src/core/interfaces/Map.d.ts.map +1 -0
- package/dist/src/core/interfaces/Map.js +2 -0
- package/dist/src/core/interfaces/Map.js.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/modules/lists/ArrayList.d.ts +24 -0
- package/dist/src/modules/lists/ArrayList.d.ts.map +1 -0
- package/dist/src/modules/lists/ArrayList.js +94 -0
- package/dist/src/modules/lists/ArrayList.js.map +1 -0
- package/dist/src/modules/maps/HashMap.d.ts +26 -0
- package/dist/src/modules/maps/HashMap.d.ts.map +1 -0
- package/dist/src/modules/maps/HashMap.js +170 -0
- package/dist/src/modules/maps/HashMap.js.map +1 -0
- package/package.json +62 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tu Nombre
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
# π§ͺ Alchemist Collections
|
|
2
|
+
|
|
3
|
+
A high-performance collections library for TypeScript, inspired by Java collections. Provides efficient and well-tested data structures for your TypeScript/JavaScript applications.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/alchemist-collections)
|
|
6
|
+
[](https://www.npmjs.com/package/alchemist-collections)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
|
|
9
|
+
## π Features
|
|
10
|
+
|
|
11
|
+
- β
**ArrayList** - Dynamic list with optimized automatic growth
|
|
12
|
+
- β
**HashMap** - Hash table implementation with collision handling
|
|
13
|
+
- β
**Type-safe with full TypeScript generics** - Complete type inference and IDE support
|
|
14
|
+
- β
**High performance** - Optimized native methods (copyWithin, fill)
|
|
15
|
+
- β
**Iterable** - Compatible with `for...of` and spread operator
|
|
16
|
+
- β
**Familiar interface** - Methods similar to Java collections
|
|
17
|
+
- β
**Fully tested** - Complete test coverage
|
|
18
|
+
- β
**Zero dependencies** - Pure library with no external packages required
|
|
19
|
+
|
|
20
|
+
## π¦ Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install alchemist-collections
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
yarn add alchemist-collections
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pnpm add alchemist-collections
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## π― Quick Start
|
|
35
|
+
|
|
36
|
+
### ArrayList
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { ArrayList } from 'alchemist-collections';
|
|
40
|
+
|
|
41
|
+
// Create a list
|
|
42
|
+
const numbers = new ArrayList<number>();
|
|
43
|
+
|
|
44
|
+
// Add elements
|
|
45
|
+
numbers.add(10);
|
|
46
|
+
numbers.add(20);
|
|
47
|
+
numbers.add(30);
|
|
48
|
+
|
|
49
|
+
// Access elements
|
|
50
|
+
console.log(numbers.get(0)); // 10
|
|
51
|
+
console.log(numbers.size()); // 3
|
|
52
|
+
|
|
53
|
+
// Search elements
|
|
54
|
+
console.log(numbers.contains(20)); // true
|
|
55
|
+
console.log(numbers.indexOf(30)); // 2
|
|
56
|
+
|
|
57
|
+
// Modify elements
|
|
58
|
+
numbers.set(1, 25); // change index 1 to 25
|
|
59
|
+
|
|
60
|
+
// Insert at specific position
|
|
61
|
+
numbers.addAt(1, 15); // [10, 15, 20, 25, 30]
|
|
62
|
+
|
|
63
|
+
// Remove elements
|
|
64
|
+
numbers.remove(2); // remove at index 2
|
|
65
|
+
|
|
66
|
+
// Iterate
|
|
67
|
+
for (const num of numbers) {
|
|
68
|
+
console.log(num);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Convert to array
|
|
72
|
+
const arr = numbers.toArray();
|
|
73
|
+
|
|
74
|
+
// Clear list
|
|
75
|
+
numbers.clear();
|
|
76
|
+
console.log(numbers.isEmpty()); // true
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### HashMap
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { HashMap } from 'alchemist-collections';
|
|
83
|
+
|
|
84
|
+
// Create a map
|
|
85
|
+
const map = new HashMap<string, number>();
|
|
86
|
+
|
|
87
|
+
// Add key-value pairs
|
|
88
|
+
map.put('apple', 5);
|
|
89
|
+
map.put('banana', 3);
|
|
90
|
+
map.put('cherry', 8);
|
|
91
|
+
|
|
92
|
+
// Get values
|
|
93
|
+
console.log(map.get('apple')); // 5
|
|
94
|
+
console.log(map.size()); // 3
|
|
95
|
+
|
|
96
|
+
// Check if key exists
|
|
97
|
+
console.log(map.containsKey('banana')); // true
|
|
98
|
+
|
|
99
|
+
// Check if value exists
|
|
100
|
+
console.log(map.containsValue(3)); // true
|
|
101
|
+
|
|
102
|
+
// Get all keys
|
|
103
|
+
const keys = map.keys(); // ['apple', 'banana', 'cherry']
|
|
104
|
+
|
|
105
|
+
// Get all values
|
|
106
|
+
const values = map.values(); // [5, 3, 8]
|
|
107
|
+
|
|
108
|
+
// Get all entries
|
|
109
|
+
const entries = map.entries(); // [['apple', 5], ['banana', 3], ['cherry', 8]]
|
|
110
|
+
|
|
111
|
+
// Update a value
|
|
112
|
+
const oldValue = map.put('apple', 10); // returns 5
|
|
113
|
+
|
|
114
|
+
// Remove a key
|
|
115
|
+
const removed = map.remove('banana'); // returns 3
|
|
116
|
+
|
|
117
|
+
// Iterate
|
|
118
|
+
for (const [key, value] of map) {
|
|
119
|
+
console.log(`${key}: ${value}`);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Clear map
|
|
123
|
+
map.clear();
|
|
124
|
+
console.log(map.isEmpty()); // true
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## π Complete API
|
|
128
|
+
|
|
129
|
+
### ArrayList<E>
|
|
130
|
+
|
|
131
|
+
#### Constructor
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// Default initial capacity (10)
|
|
135
|
+
const list = new ArrayList<string>();
|
|
136
|
+
|
|
137
|
+
// Specify initial capacity
|
|
138
|
+
const list = new ArrayList<string>(20);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### Methods
|
|
142
|
+
|
|
143
|
+
| Method | Description | Example |
|
|
144
|
+
|--------|-------------|---------|
|
|
145
|
+
| `add(element: E): boolean` | Adds element at the end | `list.add('hello')` |
|
|
146
|
+
| `addAt(index: number, element: E): void` | Adds element at specific position | `list.addAt(0, 'first')` |
|
|
147
|
+
| `get(index: number): E` | Gets element at index | `list.get(0)` |
|
|
148
|
+
| `set(index: number, element: E): E` | Sets element and returns previous | `list.set(0, 'new')` |
|
|
149
|
+
| `remove(index: number): E` | Removes and returns element | `list.remove(0)` |
|
|
150
|
+
| `contains(element: E): boolean` | Checks if element exists | `list.contains('hello')` |
|
|
151
|
+
| `indexOf(element: E): number` | Gets index of element | `list.indexOf('hello')` |
|
|
152
|
+
| `size(): number` | Returns number of elements | `list.size()` |
|
|
153
|
+
| `isEmpty(): boolean` | Checks if empty | `list.isEmpty()` |
|
|
154
|
+
| `clear(): void` | Removes all elements | `list.clear()` |
|
|
155
|
+
| `toArray(): E[]` | Converts to native array | `const arr = list.toArray()` |
|
|
156
|
+
|
|
157
|
+
### HashMap<K, V>
|
|
158
|
+
|
|
159
|
+
#### Constructor
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// Default initial capacity (16)
|
|
163
|
+
const map = new HashMap<string, number>();
|
|
164
|
+
|
|
165
|
+
// Specify initial capacity
|
|
166
|
+
const map = new HashMap<string, number>(32);
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
#### Methods
|
|
170
|
+
|
|
171
|
+
| Method | Description | Example |
|
|
172
|
+
|--------|-------------|---------|
|
|
173
|
+
| `put(key: K, value: V): V \| undefined` | Adds/updates entry, returns old value | `map.put('name', 'John')` |
|
|
174
|
+
| `get(key: K): V \| undefined` | Gets value for key | `map.get('name')` |
|
|
175
|
+
| `remove(key: K): V \| undefined` | Removes and returns value | `map.remove('name')` |
|
|
176
|
+
| `containsKey(key: K): boolean` | Checks if key exists | `map.containsKey('name')` |
|
|
177
|
+
| `containsValue(value: V): boolean` | Checks if value exists | `map.containsValue('John')` |
|
|
178
|
+
| `size(): number` | Returns number of entries | `map.size()` |
|
|
179
|
+
| `isEmpty(): boolean` | Checks if empty | `map.isEmpty()` |
|
|
180
|
+
| `keys(): K[]` | Returns all keys | `const keys = map.keys()` |
|
|
181
|
+
| `values(): V[]` | Returns all values | `const vals = map.values()` |
|
|
182
|
+
| `entries(): [K, V][]` | Returns all key-value pairs | `const entries = map.entries()` |
|
|
183
|
+
| `clear(): void` | Removes all entries | `map.clear()` |
|
|
184
|
+
|
|
185
|
+
## π‘ Advanced Examples
|
|
186
|
+
|
|
187
|
+
### Working with objects
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
interface User {
|
|
191
|
+
id: number;
|
|
192
|
+
name: string;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const users = new ArrayList<User>();
|
|
196
|
+
|
|
197
|
+
users.add({ id: 1, name: 'Alice' });
|
|
198
|
+
users.add({ id: 2, name: 'Bob' });
|
|
199
|
+
|
|
200
|
+
const user = users.get(0);
|
|
201
|
+
console.log(user.name); // Alice
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Working with HashMap
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
interface Product {
|
|
208
|
+
id: string;
|
|
209
|
+
name: string;
|
|
210
|
+
price: number;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const products = new HashMap<string, Product>();
|
|
214
|
+
|
|
215
|
+
// Add products
|
|
216
|
+
products.put('PROD001', { id: 'PROD001', name: 'Laptop', price: 999 });
|
|
217
|
+
products.put('PROD002', { id: 'PROD002', name: 'Mouse', price: 29 });
|
|
218
|
+
|
|
219
|
+
// Find a product
|
|
220
|
+
const product = products.get('PROD001');
|
|
221
|
+
if (product) {
|
|
222
|
+
console.log(`${product.name}: $${product.price}`);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Check inventory
|
|
226
|
+
console.log(products.size()); // 2
|
|
227
|
+
|
|
228
|
+
// List all product names
|
|
229
|
+
const names = products.values().map(p => p.name);
|
|
230
|
+
console.log(names); // ['Laptop', 'Mouse']
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### HashMap with number keys
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
const list = new ArrayList<number>();
|
|
238
|
+
list.add(1);
|
|
239
|
+
list.add(2);
|
|
240
|
+
list.add(3);
|
|
241
|
+
|
|
242
|
+
// Spread
|
|
243
|
+
const arr = [...list]; // [1, 2, 3]
|
|
244
|
+
|
|
245
|
+
// Destructuring
|
|
246
|
+
const [first, second] = list; // first = 1, second = 2
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Automatic capacity growth
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
const list = new ArrayList<number>(2);
|
|
253
|
+
console.log(list.size()); // 0 (initial capacity 2)
|
|
254
|
+
|
|
255
|
+
// Add more elements than capacity - grows automatically
|
|
256
|
+
for (let i = 0; i < 100; i++) {
|
|
257
|
+
list.add(i);
|
|
258
|
+
}
|
|
259
|
+
console.log(list.size()); // 100
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## β‘ Performance
|
|
263
|
+
|
|
264
|
+
The library uses native optimizations:
|
|
265
|
+
|
|
266
|
+
- **`copyWithin()`** for efficient element movement in add/remove
|
|
267
|
+
- **`fill()`** for clearing elements in clear()
|
|
268
|
+
- **Dynamic growth** with 1.5x factor to minimize reallocations
|
|
269
|
+
|
|
270
|
+
Compared to native JavaScript arrays, ArrayList is ideal when you need:
|
|
271
|
+
- Frequent insert/remove operations at specific positions
|
|
272
|
+
- Type safety with TypeScript generics
|
|
273
|
+
- Familiar API for Java developers
|
|
274
|
+
|
|
275
|
+
## π§ͺ Testing
|
|
276
|
+
|
|
277
|
+
Run tests:
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
npm run test
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
With coverage:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
npm run test:coverage
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## π License
|
|
290
|
+
|
|
291
|
+
MIT Β© 2026
|
|
292
|
+
|
|
293
|
+
## Legal
|
|
294
|
+
This project provides a TypeScript implementation of data structures inspired by the Java Collections Framework.
|
|
295
|
+
|
|
296
|
+
Java and JDK are trademarks or registered trademarks of Oracle and/or its affiliates.
|
|
297
|
+
|
|
298
|
+
This project is not affiliated with, endorsed by, or sponsored by Oracle.
|
|
299
|
+
|
|
300
|
+
## π€ Contributing
|
|
301
|
+
|
|
302
|
+
Contributions are welcome! Please:
|
|
303
|
+
|
|
304
|
+
1. Fork the project
|
|
305
|
+
2. Create a feature branch (`git checkout -b feature/AmazingFeature`)
|
|
306
|
+
3. Commit your changes (`git commit -m 'Add AmazingFeature'`)
|
|
307
|
+
4. Push to the branch (`git push origin feature/AmazingFeature`)
|
|
308
|
+
5. Open a Pull Request
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
β οΈ Note: This library is currently in Alpha. Interfaces may change, and I am actively working on adding new structures
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexOutOfBoundsException.d.ts","sourceRoot":"","sources":["../../../../src/core/exceptions/IndexOutOfBoundsException.ts"],"names":[],"mappings":"AAAA,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CASxC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class IndexOutOfBoundsException extends Error {
|
|
2
|
+
constructor(index, size) {
|
|
3
|
+
const message = `Index: ${index}, Size ${size}`;
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'IndexOutOfBoundsException';
|
|
6
|
+
if (Error.captureStackTrace) {
|
|
7
|
+
Error.captureStackTrace(this, IndexOutOfBoundsException);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=IndexOutOfBoundsException.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexOutOfBoundsException.js","sourceRoot":"","sources":["../../../../src/core/exceptions/IndexOutOfBoundsException.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,KAAa,EAAE,IAAY;QACrC,MAAM,OAAO,GAAG,UAAU,KAAK,UAAU,IAAI,EAAE,CAAC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QAExC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface List<E> extends Iterable<E> {
|
|
2
|
+
size(): number;
|
|
3
|
+
isEmpty(): boolean;
|
|
4
|
+
add(element: E): boolean;
|
|
5
|
+
contains(element: E): boolean;
|
|
6
|
+
addAt(index: number, element: E): void;
|
|
7
|
+
get(index: number): E;
|
|
8
|
+
set(index: number, element: E): E;
|
|
9
|
+
remove(index: number): E;
|
|
10
|
+
clear(): void;
|
|
11
|
+
toArray(): E[];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=List.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../../../src/core/interfaces/List.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI,CAAC,CAAC,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAC1C,IAAI,IAAI,MAAM,CAAC;IACf,OAAO,IAAI,OAAO,CAAC;IACnB,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IAC9B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IACvC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;IACtB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,CAAC,EAAE,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"List.js","sourceRoot":"","sources":["../../../../src/core/interfaces/List.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface Map<K, V> extends Iterable<[K, V]> {
|
|
2
|
+
size(): number;
|
|
3
|
+
isEmpty(): boolean;
|
|
4
|
+
put(key: K, value: V): V | undefined;
|
|
5
|
+
get(key: K): V | undefined;
|
|
6
|
+
containsKey(key: K): boolean;
|
|
7
|
+
containsValue(value: V): boolean;
|
|
8
|
+
remove(key: K): V | undefined;
|
|
9
|
+
clear(): void;
|
|
10
|
+
keys(): K[];
|
|
11
|
+
values(): V[];
|
|
12
|
+
entries(): [K, V][];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=Map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Map.d.ts","sourceRoot":"","sources":["../../../../src/core/interfaces/Map.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,MAAM,CAAC;IACf,OAAO,IAAI,OAAO,CAAC;IACnB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACrC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;IAC7B,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IACjC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,CAAC,EAAE,CAAC;IACZ,MAAM,IAAI,CAAC,EAAE,CAAC;IACd,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Map.js","sourceRoot":"","sources":["../../../../src/core/interfaces/Map.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { List } from './core/interfaces/List.js';
|
|
2
|
+
export type { Map } from './core/interfaces/Map.js';
|
|
3
|
+
export { ArrayList } from './modules/lists/ArrayList.js';
|
|
4
|
+
export { HashMap } from './modules/maps/HashMap.js';
|
|
5
|
+
export { IndexOutOfBoundsException } from './core/exceptions/IndexOutOfBoundsException.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACrD,YAAY,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { List } from '../../core/interfaces/List.js';
|
|
2
|
+
export declare class ArrayList<E> implements List<E> {
|
|
3
|
+
private elementData;
|
|
4
|
+
private _size;
|
|
5
|
+
private static readonly DEFAULT_CAPACITY;
|
|
6
|
+
constructor(initialCapacity?: number);
|
|
7
|
+
private rangeCheck;
|
|
8
|
+
private rangeCheckForAdd;
|
|
9
|
+
size(): number;
|
|
10
|
+
isEmpty(): boolean;
|
|
11
|
+
get(index: number): E;
|
|
12
|
+
indexOf(element: E): number;
|
|
13
|
+
contains(element: E): boolean;
|
|
14
|
+
add(element: E): boolean;
|
|
15
|
+
addAt(index: number, element: E): void;
|
|
16
|
+
set(index: number, element: E): E;
|
|
17
|
+
remove(index: number): E;
|
|
18
|
+
clear(): void;
|
|
19
|
+
toArray(): E[];
|
|
20
|
+
[Symbol.iterator](): Iterator<E>;
|
|
21
|
+
ensureCapacity(minCapacity: number): void;
|
|
22
|
+
private grow;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ArrayList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArrayList.d.ts","sourceRoot":"","sources":["../../../../src/modules/lists/ArrayList.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGrD,qBAAa,SAAS,CAAC,CAAC,CAAE,YAAW,IAAI,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;gBAElC,eAAe,GAAE,MAAmC;IAKhE,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,gBAAgB;IAMxB,IAAI,IAAI,MAAM;IAId,OAAO,IAAI,OAAO;IAIlB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC;IAKrB,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM;IAO3B,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAI7B,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAMxB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAUtC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC;IAOjC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC;IAaxB,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,CAAC,EAAE;IAIb,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAM1B,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMhD,OAAO,CAAC,IAAI;CAWb"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { IndexOutOfBoundsException } from '../../core/exceptions/IndexOutOfBoundsException.js';
|
|
2
|
+
export class ArrayList {
|
|
3
|
+
elementData;
|
|
4
|
+
_size;
|
|
5
|
+
static DEFAULT_CAPACITY = 10;
|
|
6
|
+
constructor(initialCapacity = ArrayList.DEFAULT_CAPACITY) {
|
|
7
|
+
this.elementData = new Array(initialCapacity);
|
|
8
|
+
this._size = 0;
|
|
9
|
+
}
|
|
10
|
+
rangeCheck(index) {
|
|
11
|
+
if (index >= this._size || index < 0) {
|
|
12
|
+
throw new IndexOutOfBoundsException(index, this._size);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
rangeCheckForAdd(index) {
|
|
16
|
+
if (index > this._size || index < 0) {
|
|
17
|
+
throw new IndexOutOfBoundsException(index, this._size);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
size() {
|
|
21
|
+
return this._size;
|
|
22
|
+
}
|
|
23
|
+
isEmpty() {
|
|
24
|
+
return this._size === 0;
|
|
25
|
+
}
|
|
26
|
+
get(index) {
|
|
27
|
+
this.rangeCheck(index);
|
|
28
|
+
return this.elementData[index];
|
|
29
|
+
}
|
|
30
|
+
indexOf(element) {
|
|
31
|
+
for (let i = 0; i < this._size; i++) {
|
|
32
|
+
if (this.elementData[i] === element)
|
|
33
|
+
return i;
|
|
34
|
+
}
|
|
35
|
+
return -1;
|
|
36
|
+
}
|
|
37
|
+
contains(element) {
|
|
38
|
+
return this.indexOf(element) >= 0;
|
|
39
|
+
}
|
|
40
|
+
add(element) {
|
|
41
|
+
this.ensureCapacity(this._size + 1);
|
|
42
|
+
this.elementData[this._size++] = element;
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
addAt(index, element) {
|
|
46
|
+
this.rangeCheckForAdd(index);
|
|
47
|
+
this.ensureCapacity(this._size + 1);
|
|
48
|
+
this.elementData.copyWithin(index + 1, index, this._size);
|
|
49
|
+
this.elementData[index] = element;
|
|
50
|
+
this._size++;
|
|
51
|
+
}
|
|
52
|
+
set(index, element) {
|
|
53
|
+
this.rangeCheck(index);
|
|
54
|
+
const oldElement = this.elementData[index];
|
|
55
|
+
this.elementData[index] = element;
|
|
56
|
+
return oldElement;
|
|
57
|
+
}
|
|
58
|
+
remove(index) {
|
|
59
|
+
this.rangeCheck(index);
|
|
60
|
+
const oldValue = this.elementData[index];
|
|
61
|
+
const numMoved = this._size - index - 1;
|
|
62
|
+
if (numMoved > 0) {
|
|
63
|
+
this.elementData.copyWithin(index, index + 1, this._size);
|
|
64
|
+
}
|
|
65
|
+
this.elementData[--this._size] = undefined;
|
|
66
|
+
return oldValue;
|
|
67
|
+
}
|
|
68
|
+
clear() {
|
|
69
|
+
this.elementData.fill(undefined, 0, this._size);
|
|
70
|
+
this._size = 0;
|
|
71
|
+
}
|
|
72
|
+
toArray() {
|
|
73
|
+
return this.elementData.slice(0, this._size);
|
|
74
|
+
}
|
|
75
|
+
*[Symbol.iterator]() {
|
|
76
|
+
for (let i = 0; i < this._size; i++) {
|
|
77
|
+
yield this.elementData[i];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
ensureCapacity(minCapacity) {
|
|
81
|
+
if (minCapacity > this.elementData.length) {
|
|
82
|
+
this.grow(minCapacity);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
grow(minCapacity) {
|
|
86
|
+
const oldCapacity = this.elementData.length;
|
|
87
|
+
let newCapacity = oldCapacity === 0 ? 1 : oldCapacity + (oldCapacity >> 1);
|
|
88
|
+
if (newCapacity < minCapacity) {
|
|
89
|
+
newCapacity = minCapacity;
|
|
90
|
+
}
|
|
91
|
+
this.elementData = this.elementData.slice(0, this._size).concat(new Array(newCapacity - this._size));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=ArrayList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArrayList.js","sourceRoot":"","sources":["../../../../src/modules/lists/ArrayList.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Map } from '../../core/interfaces/Map.js';
|
|
2
|
+
export declare class HashMap<K, V> implements Map<K, V> {
|
|
3
|
+
private buckets;
|
|
4
|
+
private _size;
|
|
5
|
+
private static readonly DEFAULT_CAPACITY;
|
|
6
|
+
private static readonly LOAD_FACTOR;
|
|
7
|
+
constructor(initialCapacity?: number);
|
|
8
|
+
private hash;
|
|
9
|
+
private getBucketIndex;
|
|
10
|
+
private findEntry;
|
|
11
|
+
private keysEqual;
|
|
12
|
+
private resize;
|
|
13
|
+
size(): number;
|
|
14
|
+
isEmpty(): boolean;
|
|
15
|
+
put(key: K, value: V): V | undefined;
|
|
16
|
+
get(key: K): V | undefined;
|
|
17
|
+
containsKey(key: K): boolean;
|
|
18
|
+
containsValue(value: V): boolean;
|
|
19
|
+
remove(key: K): V | undefined;
|
|
20
|
+
clear(): void;
|
|
21
|
+
keys(): K[];
|
|
22
|
+
values(): V[];
|
|
23
|
+
entries(): [K, V][];
|
|
24
|
+
[Symbol.iterator](): Iterator<[K, V]>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=HashMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HashMap.d.ts","sourceRoot":"","sources":["../../../../src/modules/maps/HashMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAQnD,qBAAa,OAAO,CAAC,CAAC,EAAE,CAAC,CAAE,YAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAE/B,eAAe,GAAE,MAAiC;IAK9D,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,MAAM;IAcd,IAAI,IAAI,MAAM;IAId,OAAO,IAAI,OAAO;IAIlB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IA4BpC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAK1B,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAI5B,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAiBhC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAqB7B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,CAAC,EAAE;IAYX,MAAM,IAAI,CAAC,EAAE;IAYb,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;IAYlB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CASvC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
export class HashMap {
|
|
2
|
+
buckets;
|
|
3
|
+
_size;
|
|
4
|
+
static DEFAULT_CAPACITY = 16;
|
|
5
|
+
static LOAD_FACTOR = 0.75;
|
|
6
|
+
constructor(initialCapacity = HashMap.DEFAULT_CAPACITY) {
|
|
7
|
+
this.buckets = new Array(initialCapacity);
|
|
8
|
+
this._size = 0;
|
|
9
|
+
}
|
|
10
|
+
hash(key) {
|
|
11
|
+
const stringKey = String(key);
|
|
12
|
+
let hash = 0;
|
|
13
|
+
for (let i = 0; i < stringKey.length; i++) {
|
|
14
|
+
const char = stringKey.charCodeAt(i);
|
|
15
|
+
hash = (hash << 5) - hash + char;
|
|
16
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
17
|
+
}
|
|
18
|
+
return Math.abs(hash);
|
|
19
|
+
}
|
|
20
|
+
getBucketIndex(hash) {
|
|
21
|
+
return hash % this.buckets.length;
|
|
22
|
+
}
|
|
23
|
+
findEntry(key) {
|
|
24
|
+
const hash = this.hash(key);
|
|
25
|
+
const bucketIndex = this.getBucketIndex(hash);
|
|
26
|
+
const bucket = this.buckets[bucketIndex];
|
|
27
|
+
if (!bucket) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
for (const entry of bucket) {
|
|
31
|
+
if (this.keysEqual(entry.key, key)) {
|
|
32
|
+
return entry;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
keysEqual(key1, key2) {
|
|
38
|
+
if (key1 === key2) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
if (typeof key1 === 'object' && typeof key2 === 'object' && key1 !== null && key2 !== null) {
|
|
42
|
+
return JSON.stringify(key1) === JSON.stringify(key2);
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
resize() {
|
|
47
|
+
const oldBuckets = this.buckets;
|
|
48
|
+
this.buckets = new Array(oldBuckets.length * 2);
|
|
49
|
+
this._size = 0;
|
|
50
|
+
for (const bucket of oldBuckets) {
|
|
51
|
+
if (bucket) {
|
|
52
|
+
for (const entry of bucket) {
|
|
53
|
+
this.put(entry.key, entry.value);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
size() {
|
|
59
|
+
return this._size;
|
|
60
|
+
}
|
|
61
|
+
isEmpty() {
|
|
62
|
+
return this._size === 0;
|
|
63
|
+
}
|
|
64
|
+
put(key, value) {
|
|
65
|
+
const hash = this.hash(key);
|
|
66
|
+
const bucketIndex = this.getBucketIndex(hash);
|
|
67
|
+
if (!this.buckets[bucketIndex]) {
|
|
68
|
+
this.buckets[bucketIndex] = [];
|
|
69
|
+
}
|
|
70
|
+
const bucket = this.buckets[bucketIndex];
|
|
71
|
+
for (const entry of bucket) {
|
|
72
|
+
if (this.keysEqual(entry.key, key)) {
|
|
73
|
+
const oldValue = entry.value;
|
|
74
|
+
entry.value = value;
|
|
75
|
+
return oldValue;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
bucket.push({ key, value, hash });
|
|
79
|
+
this._size++;
|
|
80
|
+
if (this._size / this.buckets.length > HashMap.LOAD_FACTOR) {
|
|
81
|
+
this.resize();
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
get(key) {
|
|
86
|
+
const entry = this.findEntry(key);
|
|
87
|
+
return entry?.value;
|
|
88
|
+
}
|
|
89
|
+
containsKey(key) {
|
|
90
|
+
return this.findEntry(key) !== undefined;
|
|
91
|
+
}
|
|
92
|
+
containsValue(value) {
|
|
93
|
+
for (const bucket of this.buckets) {
|
|
94
|
+
if (bucket) {
|
|
95
|
+
for (const entry of bucket) {
|
|
96
|
+
if (entry.value === value ||
|
|
97
|
+
(typeof entry.value === 'object' &&
|
|
98
|
+
JSON.stringify(entry.value) === JSON.stringify(value))) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
remove(key) {
|
|
107
|
+
const hash = this.hash(key);
|
|
108
|
+
const bucketIndex = this.getBucketIndex(hash);
|
|
109
|
+
const bucket = this.buckets[bucketIndex];
|
|
110
|
+
if (!bucket) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
for (let i = 0; i < bucket.length; i++) {
|
|
114
|
+
const entry = bucket[i];
|
|
115
|
+
if (entry && this.keysEqual(entry.key, key)) {
|
|
116
|
+
const removedEntry = bucket.splice(i, 1)[0];
|
|
117
|
+
this._size--;
|
|
118
|
+
return removedEntry?.value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
clear() {
|
|
124
|
+
this.buckets = new Array(HashMap.DEFAULT_CAPACITY);
|
|
125
|
+
this._size = 0;
|
|
126
|
+
}
|
|
127
|
+
keys() {
|
|
128
|
+
const keys = [];
|
|
129
|
+
for (const bucket of this.buckets) {
|
|
130
|
+
if (bucket) {
|
|
131
|
+
for (const entry of bucket) {
|
|
132
|
+
keys.push(entry.key);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return keys;
|
|
137
|
+
}
|
|
138
|
+
values() {
|
|
139
|
+
const values = [];
|
|
140
|
+
for (const bucket of this.buckets) {
|
|
141
|
+
if (bucket) {
|
|
142
|
+
for (const entry of bucket) {
|
|
143
|
+
values.push(entry.value);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return values;
|
|
148
|
+
}
|
|
149
|
+
entries() {
|
|
150
|
+
const entries = [];
|
|
151
|
+
for (const bucket of this.buckets) {
|
|
152
|
+
if (bucket) {
|
|
153
|
+
for (const entry of bucket) {
|
|
154
|
+
entries.push([entry.key, entry.value]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return entries;
|
|
159
|
+
}
|
|
160
|
+
*[Symbol.iterator]() {
|
|
161
|
+
for (const bucket of this.buckets) {
|
|
162
|
+
if (bucket) {
|
|
163
|
+
for (const entry of bucket) {
|
|
164
|
+
yield [entry.key, entry.value];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=HashMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HashMap.js","sourceRoot":"","sources":["../../../../src/modules/maps/HashMap.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "alchemist-collections",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A Java-like collections framework for TypeScript.",
|
|
5
|
+
"main": "dist/src/index.js",
|
|
6
|
+
"module": "./dist/src/index.js",
|
|
7
|
+
"types": "./dist/src/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/src/index.js",
|
|
11
|
+
"import": "./dist/src/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"dev": "npm run test:watch",
|
|
16
|
+
"build": "rm -rf dist && tsc && tsc-alias",
|
|
17
|
+
"prepublishOnly": "npm run build && npm run test",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest",
|
|
20
|
+
"test:ui": "vitest --ui",
|
|
21
|
+
"test:coverage": "vitest run --coverage",
|
|
22
|
+
"lint": "eslint .",
|
|
23
|
+
"lint:fix": "eslint . --fix",
|
|
24
|
+
"format": "prettier --write \"src/**/*.ts\""
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"arraylist",
|
|
28
|
+
"collections",
|
|
29
|
+
"typescript",
|
|
30
|
+
"data-structures",
|
|
31
|
+
"java-like",
|
|
32
|
+
"framework",
|
|
33
|
+
"library",
|
|
34
|
+
"typescript-collections"
|
|
35
|
+
],
|
|
36
|
+
"author": "AndrΓ©s Duarte <andres.duarte.marquez@gmail.com>",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"type": "module",
|
|
39
|
+
"files": [
|
|
40
|
+
"dist/src",
|
|
41
|
+
"dist/index.js",
|
|
42
|
+
"dist/index.d.ts",
|
|
43
|
+
"README.md",
|
|
44
|
+
"LICENSE"
|
|
45
|
+
],
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@eslint/js": "^10.0.1",
|
|
48
|
+
"@types/node": "^25.6.1",
|
|
49
|
+
"@vitest/coverage-v8": "^4.1.5",
|
|
50
|
+
"eslint": "^10.3.0",
|
|
51
|
+
"eslint-config-prettier": "^10.1.8",
|
|
52
|
+
"eslint-plugin-prettier": "^5.5.5",
|
|
53
|
+
"globals": "^17.6.0",
|
|
54
|
+
"pino-pretty": "^13.1.3",
|
|
55
|
+
"prettier": "^3.8.3",
|
|
56
|
+
"tsc-alias": "^1.8.17",
|
|
57
|
+
"tsx": "^4.21.0",
|
|
58
|
+
"typescript": "^6.0.3",
|
|
59
|
+
"typescript-eslint": "^8.59.2",
|
|
60
|
+
"vitest": "^4.1.5"
|
|
61
|
+
}
|
|
62
|
+
}
|