@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
package/dist/logger.js
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Next.js-style logger for TypeScript applications
|
|
3
|
+
* Provides colored output with Unicode symbols for different log levels
|
|
4
|
+
*/
|
|
5
|
+
// ANSI escape codes for colors
|
|
6
|
+
const ANSI = {
|
|
7
|
+
reset: '\x1b[0m',
|
|
8
|
+
bold: '\x1b[1m',
|
|
9
|
+
dim: '\x1b[2m',
|
|
10
|
+
// Foreground colors
|
|
11
|
+
black: '\x1b[30m',
|
|
12
|
+
red: '\x1b[31m',
|
|
13
|
+
green: '\x1b[32m',
|
|
14
|
+
yellow: '\x1b[33m',
|
|
15
|
+
blue: '\x1b[34m',
|
|
16
|
+
magenta: '\x1b[35m',
|
|
17
|
+
cyan: '\x1b[36m',
|
|
18
|
+
white: '\x1b[37m',
|
|
19
|
+
gray: '\x1b[90m',
|
|
20
|
+
// Custom purple (Next.js style)
|
|
21
|
+
purple: '\x1b[38;2;173;127;168m',
|
|
22
|
+
// Background colors
|
|
23
|
+
bgRed: '\x1b[41m',
|
|
24
|
+
bgGreen: '\x1b[42m',
|
|
25
|
+
bgYellow: '\x1b[43m',
|
|
26
|
+
bgBlue: '\x1b[44m',
|
|
27
|
+
bgMagenta: '\x1b[45m',
|
|
28
|
+
bgCyan: '\x1b[46m',
|
|
29
|
+
bgWhite: '\x1b[47m',
|
|
30
|
+
};
|
|
31
|
+
// Detect if colors should be enabled
|
|
32
|
+
const isColorEnabled = () => {
|
|
33
|
+
const env = process.env;
|
|
34
|
+
if (env.NO_COLOR)
|
|
35
|
+
return false;
|
|
36
|
+
if (env.FORCE_COLOR)
|
|
37
|
+
return true;
|
|
38
|
+
return process.stdout?.isTTY && !env.CI && env.TERM !== 'dumb';
|
|
39
|
+
};
|
|
40
|
+
const colorEnabled = isColorEnabled();
|
|
41
|
+
// Color formatter function
|
|
42
|
+
const formatter = (open, close = ANSI.reset) => {
|
|
43
|
+
if (!colorEnabled)
|
|
44
|
+
return (str) => str;
|
|
45
|
+
return (str) => `${open}${str}${close}`;
|
|
46
|
+
};
|
|
47
|
+
// Text styling functions
|
|
48
|
+
export const bold = formatter(ANSI.bold);
|
|
49
|
+
export const dim = formatter(ANSI.dim);
|
|
50
|
+
export const red = formatter(ANSI.red);
|
|
51
|
+
export const green = formatter(ANSI.green);
|
|
52
|
+
export const yellow = formatter(ANSI.yellow);
|
|
53
|
+
export const blue = formatter(ANSI.blue);
|
|
54
|
+
export const magenta = formatter(ANSI.magenta);
|
|
55
|
+
export const cyan = formatter(ANSI.cyan);
|
|
56
|
+
export const white = formatter(ANSI.white);
|
|
57
|
+
export const gray = formatter(ANSI.gray);
|
|
58
|
+
export const purple = formatter(ANSI.purple);
|
|
59
|
+
// Background colors
|
|
60
|
+
export const bgRed = formatter(ANSI.bgRed);
|
|
61
|
+
export const bgGreen = formatter(ANSI.bgGreen);
|
|
62
|
+
export const bgYellow = formatter(ANSI.bgYellow);
|
|
63
|
+
export const bgBlue = formatter(ANSI.bgBlue);
|
|
64
|
+
export const bgMagenta = formatter(ANSI.bgMagenta);
|
|
65
|
+
export const bgCyan = formatter(ANSI.bgCyan);
|
|
66
|
+
export const bgWhite = formatter(ANSI.bgWhite);
|
|
67
|
+
// Prefix symbols matching Next.js style
|
|
68
|
+
const prefixes = {
|
|
69
|
+
wait: white(bold('○')),
|
|
70
|
+
error: red(bold('⨯')),
|
|
71
|
+
warn: yellow(bold('⚠')),
|
|
72
|
+
ready: '▶',
|
|
73
|
+
info: white(bold(' ')),
|
|
74
|
+
success: green(bold('✓')),
|
|
75
|
+
event: green(bold('✓')),
|
|
76
|
+
trace: magenta(bold('»')),
|
|
77
|
+
};
|
|
78
|
+
// LRU Cache for warn-once functionality
|
|
79
|
+
class LRUCache {
|
|
80
|
+
cache = new Map();
|
|
81
|
+
maxSize;
|
|
82
|
+
constructor(maxSize) {
|
|
83
|
+
this.maxSize = maxSize;
|
|
84
|
+
}
|
|
85
|
+
get(key) {
|
|
86
|
+
const item = this.cache.get(key);
|
|
87
|
+
if (item !== undefined) {
|
|
88
|
+
// Move to end (most recently used)
|
|
89
|
+
this.cache.delete(key);
|
|
90
|
+
this.cache.set(key, item);
|
|
91
|
+
}
|
|
92
|
+
return item;
|
|
93
|
+
}
|
|
94
|
+
set(key, value) {
|
|
95
|
+
if (this.cache.has(key)) {
|
|
96
|
+
this.cache.delete(key);
|
|
97
|
+
}
|
|
98
|
+
this.cache.set(key, value);
|
|
99
|
+
if (this.cache.size > this.maxSize) {
|
|
100
|
+
// Remove least recently used (first item)
|
|
101
|
+
const firstKey = this.cache.keys().next().value;
|
|
102
|
+
if (firstKey !== undefined) {
|
|
103
|
+
this.cache.delete(firstKey);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
has(key) {
|
|
108
|
+
return this.cache.has(key);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const warnOnceCache = new LRUCache(10_000);
|
|
112
|
+
// Core logging function
|
|
113
|
+
function prefixedLog(level, ...messages) {
|
|
114
|
+
// Remove empty first message
|
|
115
|
+
if ((messages[0] === '' || messages[0] === undefined) && messages.length === 1) {
|
|
116
|
+
messages.shift();
|
|
117
|
+
}
|
|
118
|
+
// Determine console method based on level
|
|
119
|
+
const consoleMethod = level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log';
|
|
120
|
+
const prefix = prefixes[level];
|
|
121
|
+
// Handle empty messages
|
|
122
|
+
if (messages.length === 0) {
|
|
123
|
+
console[consoleMethod]('');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Format and log the message
|
|
127
|
+
if (messages.length === 1 && typeof messages[0] === 'string') {
|
|
128
|
+
console[consoleMethod](` ${prefix} ${messages[0]}`);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console[consoleMethod](` ${prefix}`, ...messages);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Bootstrap function for startup messages (no prefix, just indentation)
|
|
135
|
+
export function bootstrap(...messages) {
|
|
136
|
+
console.log(' ' + messages.join(' '));
|
|
137
|
+
}
|
|
138
|
+
// Main logging functions
|
|
139
|
+
export function wait(...messages) {
|
|
140
|
+
prefixedLog('wait', ...messages);
|
|
141
|
+
}
|
|
142
|
+
export function error(...messages) {
|
|
143
|
+
prefixedLog('error', ...messages);
|
|
144
|
+
}
|
|
145
|
+
export function warn(...messages) {
|
|
146
|
+
prefixedLog('warn', ...messages);
|
|
147
|
+
}
|
|
148
|
+
export function ready(...messages) {
|
|
149
|
+
prefixedLog('ready', ...messages);
|
|
150
|
+
}
|
|
151
|
+
export function info(...messages) {
|
|
152
|
+
prefixedLog('info', ...messages);
|
|
153
|
+
}
|
|
154
|
+
export function success(...messages) {
|
|
155
|
+
prefixedLog('success', ...messages);
|
|
156
|
+
}
|
|
157
|
+
export function event(...messages) {
|
|
158
|
+
prefixedLog('event', ...messages);
|
|
159
|
+
}
|
|
160
|
+
export function trace(...messages) {
|
|
161
|
+
prefixedLog('trace', ...messages);
|
|
162
|
+
}
|
|
163
|
+
// Special warn-once function
|
|
164
|
+
export function warnOnce(...messages) {
|
|
165
|
+
const key = messages.join(' ');
|
|
166
|
+
if (!warnOnceCache.has(key)) {
|
|
167
|
+
warnOnceCache.set(key, true);
|
|
168
|
+
warn(...messages);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Timer functionality for measuring durations
|
|
172
|
+
const timers = new Map();
|
|
173
|
+
export function time(label) {
|
|
174
|
+
timers.set(label, Date.now());
|
|
175
|
+
}
|
|
176
|
+
export function timeEnd(label) {
|
|
177
|
+
const start = timers.get(label);
|
|
178
|
+
if (start === undefined) {
|
|
179
|
+
warn(`Timer '${label}' does not exist`);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const duration = Date.now() - start;
|
|
183
|
+
timers.delete(label);
|
|
184
|
+
const formatted = duration > 10000
|
|
185
|
+
? `${Math.round(duration / 100) / 10}s`
|
|
186
|
+
: `${Math.round(duration)}ms`;
|
|
187
|
+
trace(`${label}: ${formatted}`);
|
|
188
|
+
}
|
|
189
|
+
// Utility function to create a prefixed logger instance
|
|
190
|
+
export function createLogger(prefix) {
|
|
191
|
+
return {
|
|
192
|
+
wait: (...messages) => wait(`[${prefix}]`, ...messages),
|
|
193
|
+
error: (...messages) => error(`[${prefix}]`, ...messages),
|
|
194
|
+
warn: (...messages) => warn(`[${prefix}]`, ...messages),
|
|
195
|
+
ready: (...messages) => ready(`[${prefix}]`, ...messages),
|
|
196
|
+
info: (...messages) => info(`[${prefix}]`, ...messages),
|
|
197
|
+
success: (...messages) => success(`[${prefix}]`, ...messages),
|
|
198
|
+
event: (...messages) => event(`[${prefix}]`, ...messages),
|
|
199
|
+
trace: (...messages) => trace(`[${prefix}]`, ...messages),
|
|
200
|
+
warnOnce: (...messages) => warnOnce(`[${prefix}]`, ...messages),
|
|
201
|
+
time: (label) => time(`${prefix}:${label}`),
|
|
202
|
+
timeEnd: (label) => timeEnd(`${prefix}:${label}`),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// Export a default logger instance
|
|
206
|
+
const logger = {
|
|
207
|
+
wait,
|
|
208
|
+
error,
|
|
209
|
+
warn,
|
|
210
|
+
ready,
|
|
211
|
+
info,
|
|
212
|
+
success,
|
|
213
|
+
event,
|
|
214
|
+
trace,
|
|
215
|
+
warnOnce,
|
|
216
|
+
time,
|
|
217
|
+
timeEnd,
|
|
218
|
+
bootstrap,
|
|
219
|
+
createLogger,
|
|
220
|
+
// Color utilities
|
|
221
|
+
colors: {
|
|
222
|
+
bold,
|
|
223
|
+
dim,
|
|
224
|
+
red,
|
|
225
|
+
green,
|
|
226
|
+
yellow,
|
|
227
|
+
blue,
|
|
228
|
+
magenta,
|
|
229
|
+
cyan,
|
|
230
|
+
white,
|
|
231
|
+
gray,
|
|
232
|
+
purple,
|
|
233
|
+
bgRed,
|
|
234
|
+
bgGreen,
|
|
235
|
+
bgYellow,
|
|
236
|
+
bgBlue,
|
|
237
|
+
bgMagenta,
|
|
238
|
+
bgCyan,
|
|
239
|
+
bgWhite,
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
export default logger;
|
|
243
|
+
// Example usage helper
|
|
244
|
+
export function logAppStartup(options) {
|
|
245
|
+
const { name, version, port, host = 'localhost', environment } = options;
|
|
246
|
+
bootstrap(bold(purple(`▶ ${name} ${version}`)));
|
|
247
|
+
bootstrap(`- Local: http://${host}:${port}`);
|
|
248
|
+
if (host !== 'localhost') {
|
|
249
|
+
bootstrap(`- Network: http://${getNetworkAddress()}:${port}`);
|
|
250
|
+
}
|
|
251
|
+
if (environment) {
|
|
252
|
+
bootstrap(`- Environment: ${environment}`);
|
|
253
|
+
}
|
|
254
|
+
info('');
|
|
255
|
+
}
|
|
256
|
+
// Helper to get network address
|
|
257
|
+
function getNetworkAddress() {
|
|
258
|
+
const os = require('os');
|
|
259
|
+
const interfaces = os.networkInterfaces();
|
|
260
|
+
for (const name of Object.keys(interfaces)) {
|
|
261
|
+
for (const iface of interfaces[name]) {
|
|
262
|
+
if (iface.family === 'IPv4' && !iface.internal) {
|
|
263
|
+
return iface.address;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return 'localhost';
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OFFENSIVE PROGRAMMING PRIMITIVES
|
|
3
|
+
*
|
|
4
|
+
* "A confused program SHOULD scream" - John Carmack
|
|
5
|
+
*
|
|
6
|
+
* These utilities are the ANTITHESIS of defensive programming.
|
|
7
|
+
*
|
|
8
|
+
* Defensive programming: try/catch, error recovery, graceful degradation, silent failures
|
|
9
|
+
* Offensive programming: FAIL LOUD, FAIL FAST, NO RECOVERY, CRASH EARLY
|
|
10
|
+
*
|
|
11
|
+
* We don't handle errors - we make them catastrophic.
|
|
12
|
+
* We don't recover - we crash.
|
|
13
|
+
* We don't validate and continue - we assert and panic.
|
|
14
|
+
*
|
|
15
|
+
* This approach makes bugs IMPOSSIBLE to ignore:
|
|
16
|
+
* - Wrong assumptions? CRASH
|
|
17
|
+
* - Invalid state? CRASH
|
|
18
|
+
* - "Impossible" error? CRASH
|
|
19
|
+
*
|
|
20
|
+
* The only acceptable response to confusion is to scream and die.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Assert exits with error if condition is false.
|
|
24
|
+
* Use for validating preconditions and invariants.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* function sendPacket(data: Buffer, port: number) {
|
|
28
|
+
* assert(data.length > 0, 'empty packet')
|
|
29
|
+
* assert(port > 0 && port < 65536, 'invalid port:', port)
|
|
30
|
+
* // Now safe to proceed
|
|
31
|
+
* }
|
|
32
|
+
*/
|
|
33
|
+
export declare function assert(condition: boolean, ...msg: any[]): asserts condition;
|
|
34
|
+
/**
|
|
35
|
+
* Must unwraps a value that may throw and exits if error occurs.
|
|
36
|
+
* Use for operations that should never fail in correct code.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* const data = must(() => JSON.parse(staticJsonString))
|
|
40
|
+
* const regex = must(() => new RegExp('^\\d+$'))
|
|
41
|
+
*/
|
|
42
|
+
export declare function must<T>(fn: () => T): T;
|
|
43
|
+
/**
|
|
44
|
+
* Check exits cleanly with formatted error message if error is not null/undefined.
|
|
45
|
+
* Use for expected errors: file not found, network issues, permissions, etc.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* try {
|
|
49
|
+
* const data = await fs.readFile(userFile)
|
|
50
|
+
* } catch (err) {
|
|
51
|
+
* check(err) // exits with error message
|
|
52
|
+
* }
|
|
53
|
+
*/
|
|
54
|
+
export declare function check(err: any, ...messages: string[]): void;
|
|
55
|
+
/**
|
|
56
|
+
* Panic immediately exits with error message.
|
|
57
|
+
* Use when the program reaches an impossible state.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* switch (state) {
|
|
61
|
+
* case 'ready': handleReady(); break
|
|
62
|
+
* case 'loading': handleLoading(); break
|
|
63
|
+
* default: panic('impossible state:', state)
|
|
64
|
+
* }
|
|
65
|
+
*/
|
|
66
|
+
export declare function panic(...msg: any[]): never;
|
|
67
|
+
export declare const offensive: {
|
|
68
|
+
assert: typeof assert;
|
|
69
|
+
must: typeof must;
|
|
70
|
+
check: typeof check;
|
|
71
|
+
panic: typeof panic;
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=offensive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offensive.d.ts","sourceRoot":"","sources":["../src/offensive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAM3E;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAOtC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAS3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAI1C;AAED,eAAO,MAAM,SAAS;;;;;CAKrB,CAAA"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OFFENSIVE PROGRAMMING PRIMITIVES
|
|
3
|
+
*
|
|
4
|
+
* "A confused program SHOULD scream" - John Carmack
|
|
5
|
+
*
|
|
6
|
+
* These utilities are the ANTITHESIS of defensive programming.
|
|
7
|
+
*
|
|
8
|
+
* Defensive programming: try/catch, error recovery, graceful degradation, silent failures
|
|
9
|
+
* Offensive programming: FAIL LOUD, FAIL FAST, NO RECOVERY, CRASH EARLY
|
|
10
|
+
*
|
|
11
|
+
* We don't handle errors - we make them catastrophic.
|
|
12
|
+
* We don't recover - we crash.
|
|
13
|
+
* We don't validate and continue - we assert and panic.
|
|
14
|
+
*
|
|
15
|
+
* This approach makes bugs IMPOSSIBLE to ignore:
|
|
16
|
+
* - Wrong assumptions? CRASH
|
|
17
|
+
* - Invalid state? CRASH
|
|
18
|
+
* - "Impossible" error? CRASH
|
|
19
|
+
*
|
|
20
|
+
* The only acceptable response to confusion is to scream and die.
|
|
21
|
+
*/
|
|
22
|
+
import { log } from './universal/log.js';
|
|
23
|
+
import { runtime } from './runtime.js';
|
|
24
|
+
/**
|
|
25
|
+
* Assert exits with error if condition is false.
|
|
26
|
+
* Use for validating preconditions and invariants.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* function sendPacket(data: Buffer, port: number) {
|
|
30
|
+
* assert(data.length > 0, 'empty packet')
|
|
31
|
+
* assert(port > 0 && port < 65536, 'invalid port:', port)
|
|
32
|
+
* // Now safe to proceed
|
|
33
|
+
* }
|
|
34
|
+
*/
|
|
35
|
+
export function assert(condition, ...msg) {
|
|
36
|
+
if (!condition) {
|
|
37
|
+
const message = msg.length > 0 ? msg.join(' ') : 'assertion failed';
|
|
38
|
+
log.error(message);
|
|
39
|
+
runtime.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Must unwraps a value that may throw and exits if error occurs.
|
|
44
|
+
* Use for operations that should never fail in correct code.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* const data = must(() => JSON.parse(staticJsonString))
|
|
48
|
+
* const regex = must(() => new RegExp('^\\d+$'))
|
|
49
|
+
*/
|
|
50
|
+
export function must(fn) {
|
|
51
|
+
try {
|
|
52
|
+
return fn();
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
log.error(error);
|
|
56
|
+
return runtime.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check exits cleanly with formatted error message if error is not null/undefined.
|
|
61
|
+
* Use for expected errors: file not found, network issues, permissions, etc.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* try {
|
|
65
|
+
* const data = await fs.readFile(userFile)
|
|
66
|
+
* } catch (err) {
|
|
67
|
+
* check(err) // exits with error message
|
|
68
|
+
* }
|
|
69
|
+
*/
|
|
70
|
+
export function check(err, ...messages) {
|
|
71
|
+
if (err) {
|
|
72
|
+
if (messages.length > 0) {
|
|
73
|
+
log.error(messages.join(' '));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
log.error(err);
|
|
77
|
+
}
|
|
78
|
+
runtime.exit(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Panic immediately exits with error message.
|
|
83
|
+
* Use when the program reaches an impossible state.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* switch (state) {
|
|
87
|
+
* case 'ready': handleReady(); break
|
|
88
|
+
* case 'loading': handleLoading(); break
|
|
89
|
+
* default: panic('impossible state:', state)
|
|
90
|
+
* }
|
|
91
|
+
*/
|
|
92
|
+
export function panic(...msg) {
|
|
93
|
+
const message = msg.length > 0 ? msg.join(' ') : 'panic';
|
|
94
|
+
log.error(message);
|
|
95
|
+
return runtime.exit(1);
|
|
96
|
+
}
|
|
97
|
+
export const offensive = {
|
|
98
|
+
assert,
|
|
99
|
+
must,
|
|
100
|
+
check,
|
|
101
|
+
panic,
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=offensive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offensive.js","sourceRoot":"","sources":["../src/offensive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,MAAM,CAAC,SAAkB,EAAE,GAAG,GAAU;IACtD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAA;QACnE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,IAAI,CAAI,EAAW;IACjC,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAChB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAU,CAAA;IACjC,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,KAAK,CAAC,GAAQ,EAAE,GAAG,QAAkB;IACnD,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,KAAK,CAAC,GAAG,GAAU;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACxD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM;IACN,IAAI;IACJ,KAAK;IACL,KAAK;CACN,CAAA"}
|
package/dist/path.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path utilities for consistent path handling across the library
|
|
3
|
+
*/
|
|
4
|
+
declare class PathOps {
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a path relative to the calling module
|
|
7
|
+
* Pass import.meta.url as the second parameter to resolve relative to your module
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // In some module, resolve a file relative to that module:
|
|
11
|
+
* const configPath = path.resolve('./config.json', import.meta.url)
|
|
12
|
+
*/
|
|
13
|
+
resolve(targetPath: string, baseUrl?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Join path segments
|
|
16
|
+
*/
|
|
17
|
+
join(...segments: string[]): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get the directory name of a path
|
|
20
|
+
*/
|
|
21
|
+
dirname(p: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Get the base name of a path
|
|
24
|
+
*/
|
|
25
|
+
basename(p: string, ext?: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Get the extension of a path
|
|
28
|
+
*/
|
|
29
|
+
extname(p: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Parse a path into its components
|
|
32
|
+
*/
|
|
33
|
+
parse(p: string): {
|
|
34
|
+
root: string;
|
|
35
|
+
dir: string;
|
|
36
|
+
base: string;
|
|
37
|
+
ext: string;
|
|
38
|
+
name: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Check if a path is absolute
|
|
42
|
+
*/
|
|
43
|
+
isAbsolute(p: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Get the relative path from one path to another
|
|
46
|
+
*/
|
|
47
|
+
relative(from: string, to: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Convert a file:// URL to a path
|
|
50
|
+
*/
|
|
51
|
+
fromFileUrl(url: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Get the directory from a file:// URL
|
|
54
|
+
*/
|
|
55
|
+
dirnameFromUrl(url: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve to absolute path
|
|
58
|
+
*/
|
|
59
|
+
absolute(...segments: string[]): string;
|
|
60
|
+
/**
|
|
61
|
+
* Get current working directory
|
|
62
|
+
*/
|
|
63
|
+
cwd(): string;
|
|
64
|
+
}
|
|
65
|
+
export declare const path: PathOps;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,cAAM,OAAO;IACX;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAwBrD;;OAEG;IACH,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM;IAInC;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAI1B;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM;IAIzC;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAI1B;;OAEG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;KACb;IAID;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAI1C;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOhC;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAInC;;OAEG;IACH,QAAQ,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM;IAIvC;;OAEG;IACH,GAAG,IAAI,MAAM;CAGd;AAED,eAAO,MAAM,IAAI,SAAgB,CAAA"}
|
package/dist/path.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { fileURLToPath } from 'url';
|
|
2
|
+
import { dirname, join, resolve, isAbsolute, relative, basename, extname, parse } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Path utilities for consistent path handling across the library
|
|
5
|
+
*/
|
|
6
|
+
class PathOps {
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a path relative to the calling module
|
|
9
|
+
* Pass import.meta.url as the second parameter to resolve relative to your module
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* // In some module, resolve a file relative to that module:
|
|
13
|
+
* const configPath = path.resolve('./config.json', import.meta.url)
|
|
14
|
+
*/
|
|
15
|
+
resolve(targetPath, baseUrl) {
|
|
16
|
+
// If absolute path, return as-is
|
|
17
|
+
if (isAbsolute(targetPath)) {
|
|
18
|
+
return targetPath;
|
|
19
|
+
}
|
|
20
|
+
// If we have a base URL (import.meta.url), resolve relative to it
|
|
21
|
+
if (baseUrl) {
|
|
22
|
+
if (baseUrl.startsWith('file://')) {
|
|
23
|
+
const basePath = fileURLToPath(baseUrl);
|
|
24
|
+
const baseDir = dirname(basePath);
|
|
25
|
+
return join(baseDir, targetPath);
|
|
26
|
+
}
|
|
27
|
+
// If baseUrl is a regular path, use it as base directory
|
|
28
|
+
if (isAbsolute(baseUrl)) {
|
|
29
|
+
const baseDir = dirname(baseUrl);
|
|
30
|
+
return join(baseDir, targetPath);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Default to resolving from current working directory
|
|
34
|
+
return resolve(process.cwd(), targetPath);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Join path segments
|
|
38
|
+
*/
|
|
39
|
+
join(...segments) {
|
|
40
|
+
return join(...segments);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the directory name of a path
|
|
44
|
+
*/
|
|
45
|
+
dirname(p) {
|
|
46
|
+
return dirname(p);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the base name of a path
|
|
50
|
+
*/
|
|
51
|
+
basename(p, ext) {
|
|
52
|
+
return basename(p, ext);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the extension of a path
|
|
56
|
+
*/
|
|
57
|
+
extname(p) {
|
|
58
|
+
return extname(p);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parse a path into its components
|
|
62
|
+
*/
|
|
63
|
+
parse(p) {
|
|
64
|
+
return parse(p);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if a path is absolute
|
|
68
|
+
*/
|
|
69
|
+
isAbsolute(p) {
|
|
70
|
+
return isAbsolute(p);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the relative path from one path to another
|
|
74
|
+
*/
|
|
75
|
+
relative(from, to) {
|
|
76
|
+
return relative(from, to);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Convert a file:// URL to a path
|
|
80
|
+
*/
|
|
81
|
+
fromFileUrl(url) {
|
|
82
|
+
if (url.startsWith('file://')) {
|
|
83
|
+
return fileURLToPath(url);
|
|
84
|
+
}
|
|
85
|
+
return url;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the directory from a file:// URL
|
|
89
|
+
*/
|
|
90
|
+
dirnameFromUrl(url) {
|
|
91
|
+
return dirname(this.fromFileUrl(url));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resolve to absolute path
|
|
95
|
+
*/
|
|
96
|
+
absolute(...segments) {
|
|
97
|
+
return resolve(...segments);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get current working directory
|
|
101
|
+
*/
|
|
102
|
+
cwd() {
|
|
103
|
+
return process.cwd();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export const path = new PathOps();
|
|
107
|
+
//# sourceMappingURL=path.js.map
|
package/dist/path.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AAE7F;;GAEG;AACH,MAAM,OAAO;IACX;;;;;;;OAOG;IACH,OAAO,CAAC,UAAkB,EAAE,OAAgB;QAC1C,iCAAiC;QACjC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAA;QACnB,CAAC;QAED,kEAAkE;QAClE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;gBACvC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;gBACjC,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YAClC,CAAC;YACD,yDAAyD;YACzD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;gBAChC,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAA;IAC3C,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAG,QAAkB;QACxB,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;IAC1B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,CAAS;QACf,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,CAAS,EAAE,GAAY;QAC9B,OAAO,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACzB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,CAAS;QACf,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAS;QAOb,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,CAAS;QAClB,OAAO,UAAU,CAAC,CAAC,CAAC,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,EAAU;QAC/B,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAAW;QACrB,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,GAAW;QACxB,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;IACvC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAG,QAAkB;QAC5B,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,GAAG;QACD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAA;IACtB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAA"}
|