@adriangalilea/utils 0.0.10
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/README.md +99 -0
- package/dist/browser.d.ts +14 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +18 -0
- package/dist/browser.js.map +1 -0
- package/dist/currency/crypto-symbols-data.d.ts +10 -0
- package/dist/currency/crypto-symbols-data.d.ts.map +1 -0
- package/dist/currency/crypto-symbols-data.js +13765 -0
- package/dist/currency/crypto-symbols-data.js.map +1 -0
- package/dist/currency/crypto-symbols.d.ts +20 -0
- package/dist/currency/crypto-symbols.d.ts.map +1 -0
- package/dist/currency/crypto-symbols.js +23 -0
- package/dist/currency/crypto-symbols.js.map +1 -0
- package/dist/currency/download-crypto-list.d.ts +10 -0
- package/dist/currency/download-crypto-list.d.ts.map +1 -0
- package/dist/currency/download-crypto-list.js +69 -0
- package/dist/currency/download-crypto-list.js.map +1 -0
- package/dist/currency/index.d.ts +84 -0
- package/dist/currency/index.d.ts.map +1 -0
- package/dist/currency/index.js +230 -0
- package/dist/currency/index.js.map +1 -0
- package/dist/dir.d.ts +40 -0
- package/dist/dir.d.ts.map +1 -0
- package/dist/dir.js +108 -0
- package/dist/dir.js.map +1 -0
- package/dist/file.d.ts +53 -0
- package/dist/file.d.ts.map +1 -0
- package/dist/file.js +211 -0
- package/dist/file.js.map +1 -0
- package/dist/format.d.ts +40 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +83 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/kev.d.ts +149 -0
- package/dist/kev.d.ts.map +1 -0
- package/dist/kev.js +761 -0
- package/dist/kev.js.map +1 -0
- package/dist/log.d.ts +91 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +300 -0
- package/dist/log.js.map +1 -0
- package/dist/logger.d.ts +91 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +269 -0
- package/dist/logger.js.map +1 -0
- package/dist/offensive.d.ts +73 -0
- package/dist/offensive.d.ts.map +1 -0
- package/dist/offensive.js +103 -0
- package/dist/offensive.js.map +1 -0
- package/dist/path.d.ts +67 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +107 -0
- package/dist/path.js.map +1 -0
- package/dist/platform/dir.d.ts +40 -0
- package/dist/platform/dir.d.ts.map +1 -0
- package/dist/platform/dir.js +108 -0
- package/dist/platform/dir.js.map +1 -0
- package/dist/platform/file.d.ts +53 -0
- package/dist/platform/file.d.ts.map +1 -0
- package/dist/platform/file.js +211 -0
- package/dist/platform/file.js.map +1 -0
- package/dist/platform/kev.d.ts +149 -0
- package/dist/platform/kev.d.ts.map +1 -0
- package/dist/platform/kev.js +762 -0
- package/dist/platform/kev.js.map +1 -0
- package/dist/platform/path.d.ts +67 -0
- package/dist/platform/path.d.ts.map +1 -0
- package/dist/platform/path.js +108 -0
- package/dist/platform/path.js.map +1 -0
- package/dist/platform/project.d.ts +35 -0
- package/dist/platform/project.d.ts.map +1 -0
- package/dist/platform/project.js +155 -0
- package/dist/platform/project.js.map +1 -0
- package/dist/project.d.ts +35 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +154 -0
- package/dist/project.js.map +1 -0
- package/dist/runtime.d.ts +65 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +193 -0
- package/dist/runtime.js.map +1 -0
- package/dist/universal/currency/crypto-symbols-data.d.ts +10 -0
- package/dist/universal/currency/crypto-symbols-data.d.ts.map +1 -0
- package/dist/universal/currency/crypto-symbols-data.js +13765 -0
- package/dist/universal/currency/crypto-symbols-data.js.map +1 -0
- package/dist/universal/currency/crypto-symbols.d.ts +20 -0
- package/dist/universal/currency/crypto-symbols.d.ts.map +1 -0
- package/dist/universal/currency/crypto-symbols.js +23 -0
- package/dist/universal/currency/crypto-symbols.js.map +1 -0
- package/dist/universal/currency/download-crypto-list.d.ts +10 -0
- package/dist/universal/currency/download-crypto-list.d.ts.map +1 -0
- package/dist/universal/currency/download-crypto-list.js +69 -0
- package/dist/universal/currency/download-crypto-list.js.map +1 -0
- package/dist/universal/currency/index.d.ts +90 -0
- package/dist/universal/currency/index.d.ts.map +1 -0
- package/dist/universal/currency/index.js +276 -0
- package/dist/universal/currency/index.js.map +1 -0
- package/dist/universal/format.d.ts +40 -0
- package/dist/universal/format.d.ts.map +1 -0
- package/dist/universal/format.js +83 -0
- package/dist/universal/format.js.map +1 -0
- package/dist/universal/log.d.ts +91 -0
- package/dist/universal/log.d.ts.map +1 -0
- package/dist/universal/log.js +309 -0
- package/dist/universal/log.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
export const CurrencySymbols = {
|
|
2
|
+
BTC: '₿',
|
|
3
|
+
XBT: '₿',
|
|
4
|
+
ETH: 'Ξ',
|
|
5
|
+
USD: '$',
|
|
6
|
+
EUR: '€',
|
|
7
|
+
GBP: '£',
|
|
8
|
+
JPY: '¥',
|
|
9
|
+
CNY: '¥',
|
|
10
|
+
KRW: '₩',
|
|
11
|
+
INR: '₹',
|
|
12
|
+
RUB: '₽',
|
|
13
|
+
TRY: '₺',
|
|
14
|
+
AUD: 'A$',
|
|
15
|
+
CAD: 'C$',
|
|
16
|
+
CHF: 'Fr',
|
|
17
|
+
HKD: 'HK$',
|
|
18
|
+
SGD: 'S$',
|
|
19
|
+
NZD: 'NZ$',
|
|
20
|
+
SEK: 'kr',
|
|
21
|
+
NOK: 'kr',
|
|
22
|
+
DKK: 'kr',
|
|
23
|
+
PLN: 'zł',
|
|
24
|
+
THB: '฿',
|
|
25
|
+
USDT: '₮',
|
|
26
|
+
USDC: '$',
|
|
27
|
+
DAI: '$',
|
|
28
|
+
BUSD: '$',
|
|
29
|
+
};
|
|
30
|
+
export function getSymbol(code) {
|
|
31
|
+
return CurrencySymbols[code] || code;
|
|
32
|
+
}
|
|
33
|
+
export function getOptimalDecimals(value, currencyCode) {
|
|
34
|
+
if (value === 0) {
|
|
35
|
+
return isCrypto(currencyCode) ? 8 : 2;
|
|
36
|
+
}
|
|
37
|
+
const absValue = Math.abs(value);
|
|
38
|
+
switch (currencyCode) {
|
|
39
|
+
case 'BTC':
|
|
40
|
+
case 'XBT':
|
|
41
|
+
if (absValue < 0.00001)
|
|
42
|
+
return 10;
|
|
43
|
+
else if (absValue < 0.0001)
|
|
44
|
+
return 9;
|
|
45
|
+
else if (absValue < 0.001)
|
|
46
|
+
return 8;
|
|
47
|
+
else if (absValue < 0.01)
|
|
48
|
+
return 7;
|
|
49
|
+
else if (absValue < 0.1)
|
|
50
|
+
return 6;
|
|
51
|
+
else if (absValue < 1)
|
|
52
|
+
return 5;
|
|
53
|
+
else
|
|
54
|
+
return 4;
|
|
55
|
+
case 'ETH':
|
|
56
|
+
if (absValue < 0.001)
|
|
57
|
+
return 8;
|
|
58
|
+
else if (absValue < 0.01)
|
|
59
|
+
return 7;
|
|
60
|
+
else if (absValue < 0.1)
|
|
61
|
+
return 6;
|
|
62
|
+
else if (absValue < 1)
|
|
63
|
+
return 5;
|
|
64
|
+
else
|
|
65
|
+
return 4;
|
|
66
|
+
case 'USD':
|
|
67
|
+
case 'USDT':
|
|
68
|
+
case 'USDC':
|
|
69
|
+
case 'DAI':
|
|
70
|
+
case 'BUSD':
|
|
71
|
+
if (absValue < 0.01)
|
|
72
|
+
return 6;
|
|
73
|
+
else if (absValue < 0.1)
|
|
74
|
+
return 4;
|
|
75
|
+
else if (absValue < 1)
|
|
76
|
+
return 3;
|
|
77
|
+
else
|
|
78
|
+
return 2;
|
|
79
|
+
case 'EUR':
|
|
80
|
+
case 'GBP':
|
|
81
|
+
case 'CAD':
|
|
82
|
+
case 'AUD':
|
|
83
|
+
case 'CHF':
|
|
84
|
+
if (absValue < 0.01)
|
|
85
|
+
return 4;
|
|
86
|
+
else if (absValue < 1000)
|
|
87
|
+
return 2;
|
|
88
|
+
else
|
|
89
|
+
return 0;
|
|
90
|
+
case 'JPY':
|
|
91
|
+
case 'KRW':
|
|
92
|
+
if (absValue < 1)
|
|
93
|
+
return 2;
|
|
94
|
+
else
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
if (isCrypto(currencyCode)) {
|
|
98
|
+
if (absValue < 0.00001)
|
|
99
|
+
return 8;
|
|
100
|
+
else if (absValue < 0.0001)
|
|
101
|
+
return 6;
|
|
102
|
+
else if (absValue < 0.001)
|
|
103
|
+
return 5;
|
|
104
|
+
else if (absValue < 0.01)
|
|
105
|
+
return 4;
|
|
106
|
+
else if (absValue < 0.1)
|
|
107
|
+
return 3;
|
|
108
|
+
else if (absValue < 1)
|
|
109
|
+
return 3;
|
|
110
|
+
else if (absValue < 100)
|
|
111
|
+
return 2;
|
|
112
|
+
else
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
if (absValue < 0.01)
|
|
117
|
+
return 4;
|
|
118
|
+
else if (absValue < 0.1)
|
|
119
|
+
return 3;
|
|
120
|
+
else if (absValue < 1000)
|
|
121
|
+
return 2;
|
|
122
|
+
else
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
import { isCryptoSymbol } from './crypto-symbols.js';
|
|
127
|
+
// Alternative ticker mappings (some exchanges use different symbols)
|
|
128
|
+
const cryptoAlternatives = {
|
|
129
|
+
'XBT': 'BTC', // BitMEX and some others use XBT for Bitcoin
|
|
130
|
+
'IOTA': 'MIOTA', // IOTA vs MIOTA
|
|
131
|
+
'STR': 'XLM', // Stellar old ticker
|
|
132
|
+
'BCHABC': 'BCH', // Bitcoin Cash ABC
|
|
133
|
+
'BCHSV': 'BSV', // Bitcoin SV
|
|
134
|
+
'DRK': 'DASH', // Darkcoin old name
|
|
135
|
+
'XRB': 'NANO', // RaiBlocks old name
|
|
136
|
+
'ANT': 'ANT', // Could be Aragon
|
|
137
|
+
'BCC': 'BCH', // Bittrex used BCC for Bitcoin Cash
|
|
138
|
+
'MIOTA': 'IOTA', // Some use MIOTA
|
|
139
|
+
'YOYOW': 'YOYOW', // Various formats
|
|
140
|
+
'IOTX': 'IOTX', // IoTeX
|
|
141
|
+
'QSH': 'QASH', // QASH variations
|
|
142
|
+
'YOYO': 'YOYOW', // YOYOW variations
|
|
143
|
+
'ETHOS': 'BQX', // Ethos old ticker
|
|
144
|
+
'REP': 'REP', // Augur variations
|
|
145
|
+
'REPV2': 'REP', // Augur v2
|
|
146
|
+
'USDt': 'USDT', // Case variations
|
|
147
|
+
'USDT.e': 'USDT', // Avalanche USDT
|
|
148
|
+
'USDC.e': 'USDC', // Avalanche USDC
|
|
149
|
+
'WBTC.e': 'WBTC', // Avalanche WBTC
|
|
150
|
+
'DAI.e': 'DAI', // Avalanche DAI
|
|
151
|
+
'BTC.b': 'BTC', // Avalanche BTC
|
|
152
|
+
'BETH': 'WBETH', // Binance ETH
|
|
153
|
+
'STETH': 'STETH', // Lido staked ETH
|
|
154
|
+
'WSTETH': 'WSTETH', // Wrapped stETH
|
|
155
|
+
};
|
|
156
|
+
export function isCrypto(code) {
|
|
157
|
+
const upperCode = code.toUpperCase();
|
|
158
|
+
// Check if it's a known alternative
|
|
159
|
+
if (cryptoAlternatives[upperCode]) {
|
|
160
|
+
return isCryptoSymbol(cryptoAlternatives[upperCode]);
|
|
161
|
+
}
|
|
162
|
+
// Check if it's a wrapped or bridged token (common patterns)
|
|
163
|
+
const unwrappedCode = upperCode
|
|
164
|
+
.replace(/^W/, '') // Remove W prefix (WBTC -> BTC)
|
|
165
|
+
.replace(/\.E$/, '') // Remove .e suffix (USDT.e -> USDT)
|
|
166
|
+
.replace(/\.B$/, ''); // Remove .b suffix (BTC.b -> BTC)
|
|
167
|
+
if (unwrappedCode !== upperCode) {
|
|
168
|
+
return isCryptoSymbol(unwrappedCode);
|
|
169
|
+
}
|
|
170
|
+
return isCryptoSymbol(upperCode);
|
|
171
|
+
}
|
|
172
|
+
export function isStablecoin(code) {
|
|
173
|
+
const stablecoins = new Set([
|
|
174
|
+
'USDT', 'USDC', 'DAI', 'BUSD', 'UST', 'TUSD', 'USDP', 'GUSD', 'FRAX', 'LUSD'
|
|
175
|
+
]);
|
|
176
|
+
return stablecoins.has(code);
|
|
177
|
+
}
|
|
178
|
+
export function isFiat(code) {
|
|
179
|
+
const fiats = new Set([
|
|
180
|
+
'USD', 'EUR', 'GBP', 'JPY', 'CNY', 'CAD', 'AUD', 'CHF', 'HKD', 'SGD',
|
|
181
|
+
'NZD', 'KRW', 'SEK', 'NOK', 'DKK', 'PLN', 'THB', 'INR', 'RUB', 'TRY',
|
|
182
|
+
'BRL', 'MXN', 'ARS', 'CLP', 'COP', 'PEN', 'UYU', 'ZAR', 'NGN', 'KES'
|
|
183
|
+
]);
|
|
184
|
+
return fiats.has(code);
|
|
185
|
+
}
|
|
186
|
+
export function percentageOf(value, total) {
|
|
187
|
+
if (total === 0)
|
|
188
|
+
return 0;
|
|
189
|
+
return (value / total) * 100;
|
|
190
|
+
}
|
|
191
|
+
export function percentageChange(oldValue, newValue) {
|
|
192
|
+
if (oldValue === 0) {
|
|
193
|
+
if (newValue === 0)
|
|
194
|
+
return 0;
|
|
195
|
+
return newValue > 0 ? 100 : -100;
|
|
196
|
+
}
|
|
197
|
+
return ((newValue - oldValue) / Math.abs(oldValue)) * 100;
|
|
198
|
+
}
|
|
199
|
+
export function percentageDiff(a, b) {
|
|
200
|
+
if (a === 0 && b === 0)
|
|
201
|
+
return 0;
|
|
202
|
+
const avg = (Math.abs(a) + Math.abs(b)) / 2;
|
|
203
|
+
if (avg === 0)
|
|
204
|
+
return 0;
|
|
205
|
+
return (Math.abs(a - b) / avg) * 100;
|
|
206
|
+
}
|
|
207
|
+
export function basisPointsToPercent(bps) {
|
|
208
|
+
return bps / 100.0;
|
|
209
|
+
}
|
|
210
|
+
export function percentToBasisPoints(percent) {
|
|
211
|
+
return Math.round(percent * 100);
|
|
212
|
+
}
|
|
213
|
+
export function formatBasisPoints(bps) {
|
|
214
|
+
return `${bps} bps`;
|
|
215
|
+
}
|
|
216
|
+
export const currency = {
|
|
217
|
+
getSymbol,
|
|
218
|
+
getOptimalDecimals,
|
|
219
|
+
isCrypto,
|
|
220
|
+
isStablecoin,
|
|
221
|
+
isFiat,
|
|
222
|
+
percentageOf,
|
|
223
|
+
percentageChange,
|
|
224
|
+
percentageDiff,
|
|
225
|
+
basisPointsToPercent,
|
|
226
|
+
percentToBasisPoints,
|
|
227
|
+
formatBasisPoints,
|
|
228
|
+
symbols: CurrencySymbols,
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/currency/index.ts"],"names":[],"mappings":"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"}
|
package/dist/dir.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directory operations that exit on error (offensive programming style)
|
|
3
|
+
*/
|
|
4
|
+
declare class DirOps {
|
|
5
|
+
/**
|
|
6
|
+
* Create a directory (including parents) and exit on error
|
|
7
|
+
*/
|
|
8
|
+
create(path: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Check if directory exists
|
|
11
|
+
*/
|
|
12
|
+
exists(path: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Remove a directory and all its contents, exit on error
|
|
15
|
+
*/
|
|
16
|
+
remove(path: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* List all entries in a directory, exit on error
|
|
19
|
+
*/
|
|
20
|
+
list(path: string): string[];
|
|
21
|
+
/**
|
|
22
|
+
* List full paths of all entries in a directory
|
|
23
|
+
*/
|
|
24
|
+
listFull(dirPath: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* List only subdirectories
|
|
27
|
+
*/
|
|
28
|
+
listDirs(path: string): string[];
|
|
29
|
+
/**
|
|
30
|
+
* List only files (not directories)
|
|
31
|
+
*/
|
|
32
|
+
listFiles(path: string): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Check if directory is empty
|
|
35
|
+
*/
|
|
36
|
+
isEmpty(path: string): boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare const dir: DirOps;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dir.d.ts","sourceRoot":"","sources":["../src/dir.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,cAAM,MAAM;IACV;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAU7B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1B;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAS5B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAKnC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAYhC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAYjC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAS/B;AAED,eAAO,MAAM,GAAG,QAAe,CAAA"}
|
package/dist/dir.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { mkdirSync, existsSync, statSync, rmSync, readdirSync } from 'fs';
|
|
2
|
+
import { check } from './offensive.js';
|
|
3
|
+
import { path } from './path.js';
|
|
4
|
+
/**
|
|
5
|
+
* Directory operations that exit on error (offensive programming style)
|
|
6
|
+
*/
|
|
7
|
+
class DirOps {
|
|
8
|
+
/**
|
|
9
|
+
* Create a directory (including parents) and exit on error
|
|
10
|
+
*/
|
|
11
|
+
create(path) {
|
|
12
|
+
try {
|
|
13
|
+
mkdirSync(path, { recursive: true, mode: 0o755 });
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
check(err);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if directory exists
|
|
21
|
+
*/
|
|
22
|
+
exists(path) {
|
|
23
|
+
try {
|
|
24
|
+
if (!existsSync(path))
|
|
25
|
+
return false;
|
|
26
|
+
const stats = statSync(path);
|
|
27
|
+
return stats.isDirectory();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Remove a directory and all its contents, exit on error
|
|
35
|
+
*/
|
|
36
|
+
remove(path) {
|
|
37
|
+
try {
|
|
38
|
+
rmSync(path, { recursive: true, force: true });
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
check(err);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* List all entries in a directory, exit on error
|
|
46
|
+
*/
|
|
47
|
+
list(path) {
|
|
48
|
+
try {
|
|
49
|
+
return readdirSync(path);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
check(err);
|
|
53
|
+
throw err;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* List full paths of all entries in a directory
|
|
58
|
+
*/
|
|
59
|
+
listFull(dirPath) {
|
|
60
|
+
const names = this.list(dirPath);
|
|
61
|
+
return names.map(name => path.join(dirPath, name));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* List only subdirectories
|
|
65
|
+
*/
|
|
66
|
+
listDirs(path) {
|
|
67
|
+
try {
|
|
68
|
+
const entries = readdirSync(path, { withFileTypes: true });
|
|
69
|
+
return entries
|
|
70
|
+
.filter(entry => entry.isDirectory())
|
|
71
|
+
.map(entry => entry.name);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
check(err);
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* List only files (not directories)
|
|
80
|
+
*/
|
|
81
|
+
listFiles(path) {
|
|
82
|
+
try {
|
|
83
|
+
const entries = readdirSync(path, { withFileTypes: true });
|
|
84
|
+
return entries
|
|
85
|
+
.filter(entry => entry.isFile())
|
|
86
|
+
.map(entry => entry.name);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
check(err);
|
|
90
|
+
throw err;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if directory is empty
|
|
95
|
+
*/
|
|
96
|
+
isEmpty(path) {
|
|
97
|
+
try {
|
|
98
|
+
const entries = readdirSync(path);
|
|
99
|
+
return entries.length === 0;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
check(err);
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export const dir = new DirOps();
|
|
108
|
+
//# sourceMappingURL=dir.js.map
|
package/dist/dir.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dir.js","sourceRoot":"","sources":["../src/dir.ts"],"names":[],"mappings":"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"}
|
package/dist/file.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File operations that exit on error (offensive programming style)
|
|
3
|
+
*/
|
|
4
|
+
declare class FileOps {
|
|
5
|
+
/**
|
|
6
|
+
* Get the caller's file URL from the stack trace
|
|
7
|
+
* This allows us to resolve relative paths from the calling module
|
|
8
|
+
*/
|
|
9
|
+
getCallerUrl(): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Read a file and exit on error
|
|
12
|
+
* Relative paths (./file.txt) are resolved from the calling module
|
|
13
|
+
* Absolute paths are used as-is
|
|
14
|
+
*/
|
|
15
|
+
read(filePath: string): Buffer;
|
|
16
|
+
/**
|
|
17
|
+
* Read a file as string and exit on error
|
|
18
|
+
* Relative paths (./file.txt) are resolved from the calling module
|
|
19
|
+
* Absolute paths are used as-is
|
|
20
|
+
*
|
|
21
|
+
* @param filePath - Path to the file
|
|
22
|
+
* @param encodingOrUrl - Optional: encoding (e.g. 'utf-8') or import.meta.url for explicit resolution
|
|
23
|
+
* @param encoding - Optional: encoding when second param is import.meta.url
|
|
24
|
+
*/
|
|
25
|
+
readText(filePath: string, encodingOrUrl?: BufferEncoding | string, encoding?: BufferEncoding): string;
|
|
26
|
+
/**
|
|
27
|
+
* Write data to a file and exit on error
|
|
28
|
+
* Relative paths (./file.txt) are resolved from the calling module
|
|
29
|
+
* Absolute paths are used as-is
|
|
30
|
+
*/
|
|
31
|
+
write(filePath: string, data: string | Buffer): void;
|
|
32
|
+
/**
|
|
33
|
+
* Check if file exists (not a directory)
|
|
34
|
+
* Relative paths (./file.txt) are resolved from the calling module
|
|
35
|
+
* Absolute paths are used as-is
|
|
36
|
+
*/
|
|
37
|
+
exists(filePath: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Remove a file and exit on error
|
|
40
|
+
*/
|
|
41
|
+
remove(path: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Get file size in bytes
|
|
44
|
+
*/
|
|
45
|
+
size(path: string): number;
|
|
46
|
+
/**
|
|
47
|
+
* Get file modification time
|
|
48
|
+
*/
|
|
49
|
+
mtime(path: string): Date;
|
|
50
|
+
}
|
|
51
|
+
export declare const file: FileOps;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,cAAM,OAAO;IACX;;;OAGG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IA2DlC;;;;OAIG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAkB9B;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,cAAc,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM;IAkCtG;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBpD;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAmBjC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1B;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAU1B;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAS1B;AAED,eAAO,MAAM,IAAI,SAAgB,CAAA"}
|
package/dist/file.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, unlinkSync, statSync } from 'fs';
|
|
2
|
+
import { check } from './offensive.js';
|
|
3
|
+
import { path } from './path.js';
|
|
4
|
+
/**
|
|
5
|
+
* File operations that exit on error (offensive programming style)
|
|
6
|
+
*/
|
|
7
|
+
class FileOps {
|
|
8
|
+
/**
|
|
9
|
+
* Get the caller's file URL from the stack trace
|
|
10
|
+
* This allows us to resolve relative paths from the calling module
|
|
11
|
+
*/
|
|
12
|
+
getCallerUrl() {
|
|
13
|
+
const err = new Error();
|
|
14
|
+
const stack = err.stack;
|
|
15
|
+
if (!stack)
|
|
16
|
+
return undefined;
|
|
17
|
+
// Parse stack to find file URLs
|
|
18
|
+
// Stack looks like:
|
|
19
|
+
// Error
|
|
20
|
+
// at FileOps.getCallerUrl (file:///path/to/file.ts:line:col)
|
|
21
|
+
// at FileOps.readText (file:///path/to/file.ts:line:col)
|
|
22
|
+
// at caller (file:///path/to/caller.ts:line:col) <- we want this
|
|
23
|
+
const lines = stack.split('\n');
|
|
24
|
+
// Try multiple regex patterns for different environments
|
|
25
|
+
const patterns = [
|
|
26
|
+
/\(file:\/\/([^:)]+)(?::\d+:\d+)?\)/, // Node ESM: (file:///path/file.js:1:2)
|
|
27
|
+
/at file:\/\/([^:)]+)(?::\d+:\d+)?/, // Node ESM alternate: at file:///path/file.js:1:2
|
|
28
|
+
/\(([^:)]+\.m?js)(?::\d+:\d+)?\)/, // Node CJS: (/path/file.js:1:2)
|
|
29
|
+
/at ([^:)]+\.m?js)(?::\d+:\d+)?/, // Node CJS alternate: at /path/file.js:1:2
|
|
30
|
+
];
|
|
31
|
+
// Start at line 3 to skip: Error, getCallerUrl, and the calling method (read/readText/etc)
|
|
32
|
+
for (let i = 3; i < lines.length && i < 10; i++) { // Limit search depth
|
|
33
|
+
const line = lines[i];
|
|
34
|
+
// Skip internal file.ts/file.js lines
|
|
35
|
+
if (line.includes('/file.js') || line.includes('/file.ts') ||
|
|
36
|
+
line.includes('\\file.js') || line.includes('\\file.ts')) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
for (const pattern of patterns) {
|
|
40
|
+
const match = line.match(pattern);
|
|
41
|
+
if (match) {
|
|
42
|
+
// Found a match - build file URL
|
|
43
|
+
let filePath = match[1] || match[0];
|
|
44
|
+
// Handle Windows paths
|
|
45
|
+
if (process.platform === 'win32' && !filePath.startsWith('file://')) {
|
|
46
|
+
filePath = filePath.replace(/\\/g, '/');
|
|
47
|
+
}
|
|
48
|
+
// Ensure we have a file:// URL
|
|
49
|
+
if (!filePath.startsWith('file://')) {
|
|
50
|
+
filePath = 'file://' + (filePath.startsWith('/') ? '' : '/') + filePath;
|
|
51
|
+
}
|
|
52
|
+
// Remove line and column numbers if present
|
|
53
|
+
filePath = filePath.replace(/:\d+:\d+$/, '');
|
|
54
|
+
return filePath;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Read a file and exit on error
|
|
62
|
+
* Relative paths (./file.txt) are resolved from the calling module
|
|
63
|
+
* Absolute paths are used as-is
|
|
64
|
+
*/
|
|
65
|
+
read(filePath) {
|
|
66
|
+
try {
|
|
67
|
+
// Auto-detect caller for relative paths
|
|
68
|
+
let resolvedPath = filePath;
|
|
69
|
+
if (filePath.startsWith('./') || filePath.startsWith('../')) {
|
|
70
|
+
const callerUrl = this.getCallerUrl();
|
|
71
|
+
resolvedPath = path.resolve(filePath, callerUrl);
|
|
72
|
+
}
|
|
73
|
+
else if (!path.isAbsolute(filePath)) {
|
|
74
|
+
resolvedPath = path.resolve(filePath);
|
|
75
|
+
}
|
|
76
|
+
return readFileSync(resolvedPath);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
check(err);
|
|
80
|
+
throw err; // TypeScript needs this even though check exits
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read a file as string and exit on error
|
|
85
|
+
* Relative paths (./file.txt) are resolved from the calling module
|
|
86
|
+
* Absolute paths are used as-is
|
|
87
|
+
*
|
|
88
|
+
* @param filePath - Path to the file
|
|
89
|
+
* @param encodingOrUrl - Optional: encoding (e.g. 'utf-8') or import.meta.url for explicit resolution
|
|
90
|
+
* @param encoding - Optional: encoding when second param is import.meta.url
|
|
91
|
+
*/
|
|
92
|
+
readText(filePath, encodingOrUrl, encoding) {
|
|
93
|
+
try {
|
|
94
|
+
// Determine if second param is encoding or URL
|
|
95
|
+
let callerUrl;
|
|
96
|
+
let actualEncoding = 'utf-8';
|
|
97
|
+
if (encodingOrUrl) {
|
|
98
|
+
if (encodingOrUrl.startsWith('file://') || encodingOrUrl.includes('/')) {
|
|
99
|
+
// It's a URL/path
|
|
100
|
+
callerUrl = encodingOrUrl;
|
|
101
|
+
actualEncoding = encoding || 'utf-8';
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// It's an encoding
|
|
105
|
+
actualEncoding = encodingOrUrl;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Auto-detect caller for relative paths
|
|
109
|
+
let resolvedPath = filePath;
|
|
110
|
+
if (filePath.startsWith('./') || filePath.startsWith('../')) {
|
|
111
|
+
// Use explicit URL if provided, otherwise detect from stack
|
|
112
|
+
const url = callerUrl || this.getCallerUrl();
|
|
113
|
+
resolvedPath = path.resolve(filePath, url);
|
|
114
|
+
}
|
|
115
|
+
else if (!path.isAbsolute(filePath)) {
|
|
116
|
+
resolvedPath = path.resolve(filePath);
|
|
117
|
+
}
|
|
118
|
+
return readFileSync(resolvedPath, actualEncoding);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
check(err);
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Write data to a file and exit on error
|
|
127
|
+
* Relative paths (./file.txt) are resolved from the calling module
|
|
128
|
+
* Absolute paths are used as-is
|
|
129
|
+
*/
|
|
130
|
+
write(filePath, data) {
|
|
131
|
+
try {
|
|
132
|
+
// Auto-detect caller for relative paths
|
|
133
|
+
let resolvedPath = filePath;
|
|
134
|
+
if (filePath.startsWith('./') || filePath.startsWith('../')) {
|
|
135
|
+
const callerUrl = this.getCallerUrl();
|
|
136
|
+
resolvedPath = path.resolve(filePath, callerUrl);
|
|
137
|
+
}
|
|
138
|
+
else if (!path.isAbsolute(filePath)) {
|
|
139
|
+
resolvedPath = path.resolve(filePath);
|
|
140
|
+
}
|
|
141
|
+
writeFileSync(resolvedPath, data, { mode: 0o644 });
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
check(err);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if file exists (not a directory)
|
|
149
|
+
* Relative paths (./file.txt) are resolved from the calling module
|
|
150
|
+
* Absolute paths are used as-is
|
|
151
|
+
*/
|
|
152
|
+
exists(filePath) {
|
|
153
|
+
try {
|
|
154
|
+
// Auto-detect caller for relative paths
|
|
155
|
+
let resolvedPath = filePath;
|
|
156
|
+
if (filePath.startsWith('./') || filePath.startsWith('../')) {
|
|
157
|
+
const callerUrl = this.getCallerUrl();
|
|
158
|
+
resolvedPath = path.resolve(filePath, callerUrl);
|
|
159
|
+
}
|
|
160
|
+
else if (!path.isAbsolute(filePath)) {
|
|
161
|
+
resolvedPath = path.resolve(filePath);
|
|
162
|
+
}
|
|
163
|
+
if (!existsSync(resolvedPath))
|
|
164
|
+
return false;
|
|
165
|
+
const stats = statSync(resolvedPath);
|
|
166
|
+
return stats.isFile();
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Remove a file and exit on error
|
|
174
|
+
*/
|
|
175
|
+
remove(path) {
|
|
176
|
+
try {
|
|
177
|
+
unlinkSync(path);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
check(err);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get file size in bytes
|
|
185
|
+
*/
|
|
186
|
+
size(path) {
|
|
187
|
+
try {
|
|
188
|
+
const stats = statSync(path);
|
|
189
|
+
return stats.size;
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
check(err);
|
|
193
|
+
throw err;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get file modification time
|
|
198
|
+
*/
|
|
199
|
+
mtime(path) {
|
|
200
|
+
try {
|
|
201
|
+
const stats = statSync(path);
|
|
202
|
+
return stats.mtime;
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
check(err);
|
|
206
|
+
throw err;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
export const file = new FileOps();
|
|
211
|
+
//# sourceMappingURL=file.js.map
|
package/dist/file.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"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"}
|