@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.
Files changed (110) hide show
  1. package/README.md +99 -0
  2. package/dist/browser.d.ts +14 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +18 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/currency/crypto-symbols-data.d.ts +10 -0
  7. package/dist/currency/crypto-symbols-data.d.ts.map +1 -0
  8. package/dist/currency/crypto-symbols-data.js +13765 -0
  9. package/dist/currency/crypto-symbols-data.js.map +1 -0
  10. package/dist/currency/crypto-symbols.d.ts +20 -0
  11. package/dist/currency/crypto-symbols.d.ts.map +1 -0
  12. package/dist/currency/crypto-symbols.js +23 -0
  13. package/dist/currency/crypto-symbols.js.map +1 -0
  14. package/dist/currency/download-crypto-list.d.ts +10 -0
  15. package/dist/currency/download-crypto-list.d.ts.map +1 -0
  16. package/dist/currency/download-crypto-list.js +69 -0
  17. package/dist/currency/download-crypto-list.js.map +1 -0
  18. package/dist/currency/index.d.ts +84 -0
  19. package/dist/currency/index.d.ts.map +1 -0
  20. package/dist/currency/index.js +230 -0
  21. package/dist/currency/index.js.map +1 -0
  22. package/dist/dir.d.ts +40 -0
  23. package/dist/dir.d.ts.map +1 -0
  24. package/dist/dir.js +108 -0
  25. package/dist/dir.js.map +1 -0
  26. package/dist/file.d.ts +53 -0
  27. package/dist/file.d.ts.map +1 -0
  28. package/dist/file.js +211 -0
  29. package/dist/file.js.map +1 -0
  30. package/dist/format.d.ts +40 -0
  31. package/dist/format.d.ts.map +1 -0
  32. package/dist/format.js +83 -0
  33. package/dist/format.js.map +1 -0
  34. package/dist/index.d.ts +16 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +20 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/kev.d.ts +149 -0
  39. package/dist/kev.d.ts.map +1 -0
  40. package/dist/kev.js +761 -0
  41. package/dist/kev.js.map +1 -0
  42. package/dist/log.d.ts +91 -0
  43. package/dist/log.d.ts.map +1 -0
  44. package/dist/log.js +300 -0
  45. package/dist/log.js.map +1 -0
  46. package/dist/logger.d.ts +91 -0
  47. package/dist/logger.d.ts.map +1 -0
  48. package/dist/logger.js +269 -0
  49. package/dist/logger.js.map +1 -0
  50. package/dist/offensive.d.ts +73 -0
  51. package/dist/offensive.d.ts.map +1 -0
  52. package/dist/offensive.js +103 -0
  53. package/dist/offensive.js.map +1 -0
  54. package/dist/path.d.ts +67 -0
  55. package/dist/path.d.ts.map +1 -0
  56. package/dist/path.js +107 -0
  57. package/dist/path.js.map +1 -0
  58. package/dist/platform/dir.d.ts +40 -0
  59. package/dist/platform/dir.d.ts.map +1 -0
  60. package/dist/platform/dir.js +108 -0
  61. package/dist/platform/dir.js.map +1 -0
  62. package/dist/platform/file.d.ts +53 -0
  63. package/dist/platform/file.d.ts.map +1 -0
  64. package/dist/platform/file.js +211 -0
  65. package/dist/platform/file.js.map +1 -0
  66. package/dist/platform/kev.d.ts +149 -0
  67. package/dist/platform/kev.d.ts.map +1 -0
  68. package/dist/platform/kev.js +762 -0
  69. package/dist/platform/kev.js.map +1 -0
  70. package/dist/platform/path.d.ts +67 -0
  71. package/dist/platform/path.d.ts.map +1 -0
  72. package/dist/platform/path.js +108 -0
  73. package/dist/platform/path.js.map +1 -0
  74. package/dist/platform/project.d.ts +35 -0
  75. package/dist/platform/project.d.ts.map +1 -0
  76. package/dist/platform/project.js +155 -0
  77. package/dist/platform/project.js.map +1 -0
  78. package/dist/project.d.ts +35 -0
  79. package/dist/project.d.ts.map +1 -0
  80. package/dist/project.js +154 -0
  81. package/dist/project.js.map +1 -0
  82. package/dist/runtime.d.ts +65 -0
  83. package/dist/runtime.d.ts.map +1 -0
  84. package/dist/runtime.js +193 -0
  85. package/dist/runtime.js.map +1 -0
  86. package/dist/universal/currency/crypto-symbols-data.d.ts +10 -0
  87. package/dist/universal/currency/crypto-symbols-data.d.ts.map +1 -0
  88. package/dist/universal/currency/crypto-symbols-data.js +13765 -0
  89. package/dist/universal/currency/crypto-symbols-data.js.map +1 -0
  90. package/dist/universal/currency/crypto-symbols.d.ts +20 -0
  91. package/dist/universal/currency/crypto-symbols.d.ts.map +1 -0
  92. package/dist/universal/currency/crypto-symbols.js +23 -0
  93. package/dist/universal/currency/crypto-symbols.js.map +1 -0
  94. package/dist/universal/currency/download-crypto-list.d.ts +10 -0
  95. package/dist/universal/currency/download-crypto-list.d.ts.map +1 -0
  96. package/dist/universal/currency/download-crypto-list.js +69 -0
  97. package/dist/universal/currency/download-crypto-list.js.map +1 -0
  98. package/dist/universal/currency/index.d.ts +90 -0
  99. package/dist/universal/currency/index.d.ts.map +1 -0
  100. package/dist/universal/currency/index.js +276 -0
  101. package/dist/universal/currency/index.js.map +1 -0
  102. package/dist/universal/format.d.ts +40 -0
  103. package/dist/universal/format.d.ts.map +1 -0
  104. package/dist/universal/format.js +83 -0
  105. package/dist/universal/format.js.map +1 -0
  106. package/dist/universal/log.d.ts +91 -0
  107. package/dist/universal/log.d.ts.map +1 -0
  108. package/dist/universal/log.js +309 -0
  109. package/dist/universal/log.js.map +1 -0
  110. 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
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"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"}