@adriangalilea/utils 0.4.0 → 0.5.0
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 +74 -29
- package/dist/offensive.d.ts +89 -17
- package/dist/offensive.d.ts.map +1 -1
- package/dist/offensive.js +103 -17
- package/dist/offensive.js.map +1 -1
- package/dist/platform/unseen.d.ts +15 -15
- package/dist/platform/unseen.js +15 -15
- package/dist/universal/log.d.ts +18 -0
- package/dist/universal/log.d.ts.map +1 -1
- package/dist/universal/log.js +22 -7
- package/dist/universal/log.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -107,12 +107,14 @@ format.percentage(123.456) // "123%"
|
|
|
107
107
|
|
|
108
108
|
### Offensive Programming
|
|
109
109
|
|
|
110
|
-
Fail loud, fail fast.
|
|
110
|
+
Fail loud, fail fast. Zero dependencies, works in Node, Deno, Bun, and browsers.
|
|
111
|
+
|
|
112
|
+
Two kinds of errors, kept separate: **`Panic`** (bugs in us — crash the process) and **`SourcedError`** (boundary failures — handle per-source).
|
|
111
113
|
|
|
112
114
|
```typescript
|
|
113
|
-
import { assert, panic, must, unwrap, Panic } from '@adriangalilea/utils'
|
|
115
|
+
import { assert, panic, assertNever, must, unwrap, Panic, SourcedError, isSourcedError } from '@adriangalilea/utils'
|
|
114
116
|
|
|
115
|
-
// Assert invariants — narrows types
|
|
117
|
+
// Assert invariants — narrows types via `asserts condition`
|
|
116
118
|
assert(port > 0 && port < 65536, 'invalid port:', port)
|
|
117
119
|
|
|
118
120
|
// Impossible state
|
|
@@ -121,33 +123,66 @@ switch (state) {
|
|
|
121
123
|
default: panic('impossible state:', state)
|
|
122
124
|
}
|
|
123
125
|
|
|
126
|
+
// Exhaustiveness check — TS compile error if you miss a case
|
|
127
|
+
type Event = { kind: 'click' } | { kind: 'hover' } | { kind: 'scroll' }
|
|
128
|
+
function handle(e: Event) {
|
|
129
|
+
switch (e.kind) {
|
|
130
|
+
case 'click': return handleClick()
|
|
131
|
+
case 'hover': return handleHover()
|
|
132
|
+
// forgot 'scroll' → TS error: Argument of type '{ kind: "scroll" }' not assignable to 'never'
|
|
133
|
+
default: return assertNever(e)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Add a new variant to Event → every assertNever site lights up at compile time.
|
|
137
|
+
|
|
124
138
|
// Unwrap operations that shouldn't fail (sync + async)
|
|
125
139
|
const data = must(() => JSON.parse(staticJsonString))
|
|
126
140
|
const file = must(() => readFileSync(path))
|
|
127
141
|
const resp = await must(() => fetch(url))
|
|
128
142
|
|
|
129
|
-
// Unwrap nullable values —
|
|
130
|
-
// (assert needs two statements, unwrap does it inline)
|
|
143
|
+
// Unwrap nullable values — T | null | undefined → T in one expression
|
|
131
144
|
const user = unwrap(db.findUser(id), 'user not found:', id)
|
|
132
145
|
const el = unwrap(document.getElementById('app'))
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
#### Typed boundary errors — `SourcedError`
|
|
133
149
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
150
|
+
Every external system call should wear its source. When it fails, carry forensics:
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import { SourcedError, isSourcedError, Panic } from '@adriangalilea/utils'
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
return await stripe.charges.create({ customer, amount })
|
|
157
|
+
} catch (e) {
|
|
158
|
+
throw new SourcedError({
|
|
159
|
+
source: 'stripe',
|
|
160
|
+
operation: 'charge_customer',
|
|
161
|
+
message: e instanceof Error ? e.message : String(e),
|
|
162
|
+
status: (e as any)?.statusCode,
|
|
163
|
+
cause: e,
|
|
164
|
+
context: { customer, amount },
|
|
165
|
+
})
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// At catch boundaries — keep Panics and SourcedErrors separate:
|
|
169
|
+
try { await doWork() }
|
|
170
|
+
catch (e) {
|
|
171
|
+
if (e instanceof Panic) throw e // bug in us — crash
|
|
172
|
+
if (isSourcedError(e, 'stripe') && e.status === 402) {
|
|
173
|
+
// TS knows e.source === 'stripe' here (generic narrows)
|
|
174
|
+
return { error: 'card declined' }
|
|
175
|
+
}
|
|
176
|
+
if (isSourcedError(e)) {
|
|
177
|
+
logger.error(`[${e.source}:${e.operation}]`, e.toJSON()) // structured forensics
|
|
178
|
+
throw e
|
|
179
|
+
}
|
|
180
|
+
throw e // unknown — re-throw
|
|
181
|
+
}
|
|
149
182
|
```
|
|
150
183
|
|
|
184
|
+
Every `SourcedError` carries `source`, `operation`, `status`, `context`, and the original exception via `cause`. Call `.toJSON()` for serialization across process boundaries.
|
|
185
|
+
|
|
151
186
|
## Features
|
|
152
187
|
|
|
153
188
|
- **Logger**: Next.js-style colored console output with symbols
|
|
@@ -158,7 +193,7 @@ expect(() => assert(false, 'boom')).toThrow(Panic)
|
|
|
158
193
|
- Percentage and basis point utilities
|
|
159
194
|
- Fiat and stablecoin detection
|
|
160
195
|
- **Format**: Number and currency formatting with compact notation
|
|
161
|
-
- **Offensive Programming**: assert, panic, must, unwrap
|
|
196
|
+
- **Offensive Programming**: assert, panic, assertNever, must, unwrap (throw `Panic`) + SourcedError for typed boundary failures
|
|
162
197
|
- **File Operations**: Read, write with automatic path resolution
|
|
163
198
|
- **Directory Operations**: Create, list, walk directories
|
|
164
199
|
- **KEV**: Redis-style environment variable management with monorepo support
|
|
@@ -186,23 +221,33 @@ dir.create(xdg.state('notify'))
|
|
|
186
221
|
|
|
187
222
|
### Unseen
|
|
188
223
|
|
|
189
|
-
|
|
224
|
+
"What's new since last time?" — filters an array of objects to only the ones you haven't seen before. Remembers across runs.
|
|
190
225
|
|
|
191
226
|
```typescript
|
|
192
227
|
import { unseen } from '@adriangalilea/utils'
|
|
193
228
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
const messages: Message[] = await fetchMessages()
|
|
229
|
+
const messages = await fetchMessages()
|
|
197
230
|
const newMessages = await unseen('messages', messages, 'id')
|
|
198
|
-
|
|
231
|
+
```
|
|
199
232
|
|
|
200
|
-
|
|
233
|
+
1st run:
|
|
234
|
+
```
|
|
235
|
+
messages = [{ id: '1', from: 'alice', text: 'hi' }]
|
|
236
|
+
newMessages = [{ id: '1', from: 'alice', text: 'hi' }]
|
|
201
237
|
```
|
|
202
238
|
|
|
203
|
-
|
|
239
|
+
2nd run, no new message:
|
|
240
|
+
```
|
|
241
|
+
newMessages = []
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
3rd run, bob replied:
|
|
245
|
+
```
|
|
246
|
+
messages = [{ id: '1', ... }, { id: '2', from: 'bob', text: 'hey' }]
|
|
247
|
+
newMessages = [{ id: '2', from: 'bob', text: 'hey' }]
|
|
248
|
+
```
|
|
204
249
|
|
|
205
|
-
|
|
250
|
+
Saves state to: `$XDG_STATE_HOME/unseen/{name}.json`
|
|
206
251
|
|
|
207
252
|
## Release
|
|
208
253
|
|
package/dist/offensive.d.ts
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Offensive programming primitives + typed boundary errors.
|
|
3
3
|
*
|
|
4
|
-
* "A confused program SHOULD scream"
|
|
4
|
+
* "A confused program SHOULD scream." — John Carmack
|
|
5
5
|
*
|
|
6
6
|
* Throw, always. An uncaught Panic crashes the process with a full stack trace.
|
|
7
7
|
* Zero dependencies. Works identically in Node, Deno, Bun, and browsers.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* assert(cond, ...msg)
|
|
11
|
-
* panic(...msg)
|
|
12
|
-
*
|
|
13
|
-
*
|
|
9
|
+
* Fail-fast primitives (throw Panic — bugs in us):
|
|
10
|
+
* assert(cond, ...msg) invariant checking, narrows types via `asserts`
|
|
11
|
+
* panic(...msg) impossible state reached
|
|
12
|
+
* assertNever(value, ...msg) exhaustiveness check — compile error on missed cases
|
|
13
|
+
* must(() => expr) unwrap-or-die for operations (sync + async)
|
|
14
|
+
* unwrap(value, ...msg) unwrap nullable T | null | undefined → T
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
+
* Typed boundary errors (throw SourcedError — the external system failed):
|
|
17
|
+
* SourcedError typed error with source/operation/status/context
|
|
18
|
+
* isSourcedError(e, source?) type guard for catch-site narrowing
|
|
16
19
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* const data = readFileSync(path, 'utf-8')
|
|
20
|
-
* return data
|
|
21
|
-
* } catch (err) {
|
|
22
|
-
* check(err)
|
|
23
|
-
* }
|
|
20
|
+
* Panics are bugs. SourcedErrors are boundary failures. Keep them separate at
|
|
21
|
+
* catch boundaries:
|
|
24
22
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* try { await doWork() }
|
|
24
|
+
* catch (e) {
|
|
25
|
+
* if (e instanceof Panic) throw e // bug in us — crash
|
|
26
|
+
* if (isSourcedError(e, 'stripe')) { ... } // stripe failed — handle
|
|
27
|
+
* throw e // unknown — re-throw
|
|
28
|
+
* }
|
|
27
29
|
*/
|
|
28
30
|
/**
|
|
29
31
|
* Distinct error class for offensive programming failures.
|
|
@@ -61,6 +63,23 @@ export declare function assert(condition: boolean, ...msg: any[]): asserts condi
|
|
|
61
63
|
* }
|
|
62
64
|
*/
|
|
63
65
|
export declare function panic(...msg: any[]): never;
|
|
66
|
+
/**
|
|
67
|
+
* Exhaustiveness check — compile error if a switch/if misses a case.
|
|
68
|
+
* The `never` type means TS won't let you call this if all cases are handled.
|
|
69
|
+
* Add a new variant to a union → every assertNever site lights up at compile time.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* type Event = { kind: 'click' } | { kind: 'hover' } | { kind: 'scroll' }
|
|
73
|
+
* function handle(e: Event) {
|
|
74
|
+
* switch (e.kind) {
|
|
75
|
+
* case 'click': return handleClick()
|
|
76
|
+
* case 'hover': return handleHover()
|
|
77
|
+
* // forgot 'scroll' → TS error: Argument of type '{ kind: "scroll" }' not assignable to 'never'
|
|
78
|
+
* default: assertNever(e)
|
|
79
|
+
* }
|
|
80
|
+
* }
|
|
81
|
+
*/
|
|
82
|
+
export declare function assertNever(value: never, ...msg: any[]): never;
|
|
64
83
|
/**
|
|
65
84
|
* Must unwraps an operation that should never fail. Handles sync and async.
|
|
66
85
|
*
|
|
@@ -85,11 +104,64 @@ export declare function must<T>(fn: () => T): T;
|
|
|
85
104
|
* const el = unwrap(document.getElementById('app'))
|
|
86
105
|
*/
|
|
87
106
|
export declare function unwrap<T>(value: T | null | undefined, ...msg: any[]): T;
|
|
107
|
+
/**
|
|
108
|
+
* Typed error from a named external source with structured context.
|
|
109
|
+
*
|
|
110
|
+
* Raise at boundaries with the messy world (HTTP APIs, databases, external
|
|
111
|
+
* processes). Every SourcedError carries enough context to reconstruct the
|
|
112
|
+
* failure without a debugger.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* try {
|
|
116
|
+
* return await stripe.charges.create({ customer, amount })
|
|
117
|
+
* } catch (e) {
|
|
118
|
+
* throw new SourcedError({
|
|
119
|
+
* source: 'stripe',
|
|
120
|
+
* operation: 'charge_customer',
|
|
121
|
+
* message: e instanceof Error ? e.message : String(e),
|
|
122
|
+
* status: (e as any)?.statusCode,
|
|
123
|
+
* cause: e,
|
|
124
|
+
* context: { customer, amount },
|
|
125
|
+
* })
|
|
126
|
+
* }
|
|
127
|
+
*/
|
|
128
|
+
export declare class SourcedError<S extends string = string> extends Error {
|
|
129
|
+
readonly source: S;
|
|
130
|
+
readonly operation: string;
|
|
131
|
+
readonly status?: number;
|
|
132
|
+
readonly context: Record<string, unknown>;
|
|
133
|
+
constructor(args: {
|
|
134
|
+
source: S;
|
|
135
|
+
operation: string;
|
|
136
|
+
message: string;
|
|
137
|
+
status?: number;
|
|
138
|
+
cause?: unknown;
|
|
139
|
+
context?: Record<string, unknown>;
|
|
140
|
+
});
|
|
141
|
+
toJSON(): Record<string, unknown>;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Type guard for SourcedError. Optionally narrows to a specific source.
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* try { await charge(customer, amount) }
|
|
148
|
+
* catch (e) {
|
|
149
|
+
* if (isSourcedError(e, 'stripe') && e.status === 402) {
|
|
150
|
+
* // TS knows e.source === 'stripe' here
|
|
151
|
+
* return 'card declined'
|
|
152
|
+
* }
|
|
153
|
+
* throw e
|
|
154
|
+
* }
|
|
155
|
+
*/
|
|
156
|
+
export declare function isSourcedError<S extends string>(e: unknown, source?: S): e is SourcedError<S>;
|
|
88
157
|
export declare const offensive: {
|
|
89
158
|
Panic: typeof Panic;
|
|
90
159
|
assert: typeof assert;
|
|
91
160
|
panic: typeof panic;
|
|
161
|
+
assertNever: typeof assertNever;
|
|
92
162
|
must: typeof must;
|
|
93
163
|
unwrap: typeof unwrap;
|
|
164
|
+
SourcedError: typeof SourcedError;
|
|
165
|
+
isSourcedError: typeof isSourcedError;
|
|
94
166
|
};
|
|
95
167
|
//# sourceMappingURL=offensive.d.ts.map
|
package/dist/offensive.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offensive.d.ts","sourceRoot":"","sources":["../src/offensive.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"offensive.d.ts","sourceRoot":"","sources":["../src/offensive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;;;;;;;;GAaG;AACH,qBAAa,KAAM,SAAQ,KAAK;gBAClB,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAE3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAE1C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAE9D;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACzD,wBAAgB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;AAevC;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAGvE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK;IAChE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAE7B,IAAI,EAAE;QAChB,MAAM,EAAE,CAAC,CAAA;QACT,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAClC;IAUD,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAUlC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAE7F;AAED,eAAO,MAAM,SAAS;;;;;;;;;CASrB,CAAA"}
|
package/dist/offensive.js
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Offensive programming primitives + typed boundary errors.
|
|
3
3
|
*
|
|
4
|
-
* "A confused program SHOULD scream"
|
|
4
|
+
* "A confused program SHOULD scream." — John Carmack
|
|
5
5
|
*
|
|
6
6
|
* Throw, always. An uncaught Panic crashes the process with a full stack trace.
|
|
7
7
|
* Zero dependencies. Works identically in Node, Deno, Bun, and browsers.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* assert(cond, ...msg)
|
|
11
|
-
* panic(...msg)
|
|
12
|
-
*
|
|
13
|
-
*
|
|
9
|
+
* Fail-fast primitives (throw Panic — bugs in us):
|
|
10
|
+
* assert(cond, ...msg) invariant checking, narrows types via `asserts`
|
|
11
|
+
* panic(...msg) impossible state reached
|
|
12
|
+
* assertNever(value, ...msg) exhaustiveness check — compile error on missed cases
|
|
13
|
+
* must(() => expr) unwrap-or-die for operations (sync + async)
|
|
14
|
+
* unwrap(value, ...msg) unwrap nullable T | null | undefined → T
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
+
* Typed boundary errors (throw SourcedError — the external system failed):
|
|
17
|
+
* SourcedError typed error with source/operation/status/context
|
|
18
|
+
* isSourcedError(e, source?) type guard for catch-site narrowing
|
|
16
19
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* const data = readFileSync(path, 'utf-8')
|
|
20
|
-
* return data
|
|
21
|
-
* } catch (err) {
|
|
22
|
-
* check(err)
|
|
23
|
-
* }
|
|
20
|
+
* Panics are bugs. SourcedErrors are boundary failures. Keep them separate at
|
|
21
|
+
* catch boundaries:
|
|
24
22
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* try { await doWork() }
|
|
24
|
+
* catch (e) {
|
|
25
|
+
* if (e instanceof Panic) throw e // bug in us — crash
|
|
26
|
+
* if (isSourcedError(e, 'stripe')) { ... } // stripe failed — handle
|
|
27
|
+
* throw e // unknown — re-throw
|
|
28
|
+
* }
|
|
27
29
|
*/
|
|
28
30
|
/**
|
|
29
31
|
* Distinct error class for offensive programming failures.
|
|
@@ -69,6 +71,25 @@ export function assert(condition, ...msg) {
|
|
|
69
71
|
export function panic(...msg) {
|
|
70
72
|
throw new Panic(msg.join(' ') || 'panic');
|
|
71
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Exhaustiveness check — compile error if a switch/if misses a case.
|
|
76
|
+
* The `never` type means TS won't let you call this if all cases are handled.
|
|
77
|
+
* Add a new variant to a union → every assertNever site lights up at compile time.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* type Event = { kind: 'click' } | { kind: 'hover' } | { kind: 'scroll' }
|
|
81
|
+
* function handle(e: Event) {
|
|
82
|
+
* switch (e.kind) {
|
|
83
|
+
* case 'click': return handleClick()
|
|
84
|
+
* case 'hover': return handleHover()
|
|
85
|
+
* // forgot 'scroll' → TS error: Argument of type '{ kind: "scroll" }' not assignable to 'never'
|
|
86
|
+
* default: assertNever(e)
|
|
87
|
+
* }
|
|
88
|
+
* }
|
|
89
|
+
*/
|
|
90
|
+
export function assertNever(value, ...msg) {
|
|
91
|
+
throw new Panic(msg.join(' ') || `assertNever: unexpected value: ${JSON.stringify(value)}`);
|
|
92
|
+
}
|
|
72
93
|
export function must(fn) {
|
|
73
94
|
try {
|
|
74
95
|
const result = fn();
|
|
@@ -101,11 +122,76 @@ export function unwrap(value, ...msg) {
|
|
|
101
122
|
throw new Panic(msg.join(' ') || `unwrap: got ${value}`);
|
|
102
123
|
return value;
|
|
103
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Typed error from a named external source with structured context.
|
|
127
|
+
*
|
|
128
|
+
* Raise at boundaries with the messy world (HTTP APIs, databases, external
|
|
129
|
+
* processes). Every SourcedError carries enough context to reconstruct the
|
|
130
|
+
* failure without a debugger.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* try {
|
|
134
|
+
* return await stripe.charges.create({ customer, amount })
|
|
135
|
+
* } catch (e) {
|
|
136
|
+
* throw new SourcedError({
|
|
137
|
+
* source: 'stripe',
|
|
138
|
+
* operation: 'charge_customer',
|
|
139
|
+
* message: e instanceof Error ? e.message : String(e),
|
|
140
|
+
* status: (e as any)?.statusCode,
|
|
141
|
+
* cause: e,
|
|
142
|
+
* context: { customer, amount },
|
|
143
|
+
* })
|
|
144
|
+
* }
|
|
145
|
+
*/
|
|
146
|
+
export class SourcedError extends Error {
|
|
147
|
+
source;
|
|
148
|
+
operation;
|
|
149
|
+
status;
|
|
150
|
+
context;
|
|
151
|
+
constructor(args) {
|
|
152
|
+
const status = args.status != null ? ` status=${args.status}` : '';
|
|
153
|
+
super(`[${args.source}:${args.operation}${status}] ${args.message}`, { cause: args.cause });
|
|
154
|
+
this.name = 'SourcedError';
|
|
155
|
+
this.source = args.source;
|
|
156
|
+
this.operation = args.operation;
|
|
157
|
+
this.status = args.status;
|
|
158
|
+
this.context = args.context ?? {};
|
|
159
|
+
}
|
|
160
|
+
toJSON() {
|
|
161
|
+
return {
|
|
162
|
+
source: this.source,
|
|
163
|
+
operation: this.operation,
|
|
164
|
+
status: this.status,
|
|
165
|
+
message: this.message,
|
|
166
|
+
context: this.context,
|
|
167
|
+
cause: this.cause instanceof Error ? this.cause.message : this.cause != null ? String(this.cause) : null,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Type guard for SourcedError. Optionally narrows to a specific source.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* try { await charge(customer, amount) }
|
|
176
|
+
* catch (e) {
|
|
177
|
+
* if (isSourcedError(e, 'stripe') && e.status === 402) {
|
|
178
|
+
* // TS knows e.source === 'stripe' here
|
|
179
|
+
* return 'card declined'
|
|
180
|
+
* }
|
|
181
|
+
* throw e
|
|
182
|
+
* }
|
|
183
|
+
*/
|
|
184
|
+
export function isSourcedError(e, source) {
|
|
185
|
+
return e instanceof SourcedError && (source === undefined || e.source === source);
|
|
186
|
+
}
|
|
104
187
|
export const offensive = {
|
|
105
188
|
Panic,
|
|
106
189
|
assert,
|
|
107
190
|
panic,
|
|
191
|
+
assertNever,
|
|
108
192
|
must,
|
|
109
193
|
unwrap,
|
|
194
|
+
SourcedError,
|
|
195
|
+
isSourcedError,
|
|
110
196
|
};
|
|
111
197
|
//# sourceMappingURL=offensive.js.map
|
package/dist/offensive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offensive.js","sourceRoot":"","sources":["../src/offensive.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"offensive.js","sourceRoot":"","sources":["../src/offensive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* You have objects with IDs. `unseen` remembers which IDs it has
|
|
5
|
-
* seen across runs and returns only the new ones.
|
|
2
|
+
* "What's new since last time?" — filters an array of objects to only
|
|
3
|
+
* the ones you haven't seen before. Remembers across runs.
|
|
6
4
|
*
|
|
7
5
|
* ```ts
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* const messages: Message[] = await fetchMessages()
|
|
6
|
+
* const messages = await fetchMessages()
|
|
11
7
|
* const newMessages = await unseen('messages', messages, 'id')
|
|
12
|
-
*
|
|
13
|
-
* // 1st run: 3 messages exist → returns all 3
|
|
14
|
-
* // 2nd run: same 3 messages → returns []
|
|
15
|
-
* // 3rd run: 5 messages exist → returns the 2 new ones
|
|
16
8
|
* ```
|
|
17
9
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
10
|
+
* 1st run:
|
|
11
|
+
* messages = [{ id: '1', from: 'alice', text: 'hi' }]
|
|
12
|
+
* newMessages = [{ id: '1', from: 'alice', text: 'hi' }]
|
|
13
|
+
*
|
|
14
|
+
* 2nd run, no new message:
|
|
15
|
+
* newMessages = []
|
|
16
|
+
*
|
|
17
|
+
* 3rd run, bob replied:
|
|
18
|
+
* messages = [{ id: '1', ... }, { id: '2', from: 'bob', text: 'hey' }]
|
|
19
|
+
* newMessages = [{ id: '2', from: 'bob', text: 'hey' }]
|
|
20
20
|
*
|
|
21
|
-
*
|
|
21
|
+
* Saves state to: `$XDG_STATE_HOME/unseen/{namespace}.json`
|
|
22
22
|
*
|
|
23
23
|
* @param namespace - Name for this seen-set (e.g. 'messages', 'orders')
|
|
24
24
|
* @param items - Array of objects to filter
|
|
25
|
-
* @param key - Which field is the unique ID (e.g. 'id', 'messageId'
|
|
25
|
+
* @param key - Which field is the unique ID (e.g. 'id', 'messageId')
|
|
26
26
|
* @returns Only items not seen in previous runs
|
|
27
27
|
*/
|
|
28
28
|
export declare function unseen<T>(namespace: string, items: T[], key: keyof T & string): Promise<T[]>;
|
package/dist/platform/unseen.js
CHANGED
|
@@ -4,30 +4,30 @@ import { file } from './file.js';
|
|
|
4
4
|
import { join, dirname } from 'node:path';
|
|
5
5
|
const STORE_DIR = xdg.state('unseen');
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* You have objects with IDs. `unseen` remembers which IDs it has
|
|
10
|
-
* seen across runs and returns only the new ones.
|
|
7
|
+
* "What's new since last time?" — filters an array of objects to only
|
|
8
|
+
* the ones you haven't seen before. Remembers across runs.
|
|
11
9
|
*
|
|
12
10
|
* ```ts
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* const messages: Message[] = await fetchMessages()
|
|
11
|
+
* const messages = await fetchMessages()
|
|
16
12
|
* const newMessages = await unseen('messages', messages, 'id')
|
|
17
|
-
*
|
|
18
|
-
* // 1st run: 3 messages exist → returns all 3
|
|
19
|
-
* // 2nd run: same 3 messages → returns []
|
|
20
|
-
* // 3rd run: 5 messages exist → returns the 2 new ones
|
|
21
13
|
* ```
|
|
22
14
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
15
|
+
* 1st run:
|
|
16
|
+
* messages = [{ id: '1', from: 'alice', text: 'hi' }]
|
|
17
|
+
* newMessages = [{ id: '1', from: 'alice', text: 'hi' }]
|
|
18
|
+
*
|
|
19
|
+
* 2nd run, no new message:
|
|
20
|
+
* newMessages = []
|
|
21
|
+
*
|
|
22
|
+
* 3rd run, bob replied:
|
|
23
|
+
* messages = [{ id: '1', ... }, { id: '2', from: 'bob', text: 'hey' }]
|
|
24
|
+
* newMessages = [{ id: '2', from: 'bob', text: 'hey' }]
|
|
25
25
|
*
|
|
26
|
-
*
|
|
26
|
+
* Saves state to: `$XDG_STATE_HOME/unseen/{namespace}.json`
|
|
27
27
|
*
|
|
28
28
|
* @param namespace - Name for this seen-set (e.g. 'messages', 'orders')
|
|
29
29
|
* @param items - Array of objects to filter
|
|
30
|
-
* @param key - Which field is the unique ID (e.g. 'id', 'messageId'
|
|
30
|
+
* @param key - Which field is the unique ID (e.g. 'id', 'messageId')
|
|
31
31
|
* @returns Only items not seen in previous runs
|
|
32
32
|
*/
|
|
33
33
|
export async function unseen(namespace, items, key) {
|
package/dist/universal/log.d.ts
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A Next.js-style logger for TypeScript applications
|
|
3
3
|
* Provides colored output with Unicode symbols for different log levels
|
|
4
|
+
*
|
|
5
|
+
* Known limitations:
|
|
6
|
+
* - Global level is frozen at import time (const). No runtime setLevel().
|
|
7
|
+
* - createLogger() is just a prefix wrapper, not a real scoped instance.
|
|
8
|
+
* No per-scope level control (can't silence 'bor' but keep 'bdns' verbose).
|
|
9
|
+
* - No withTag/child pattern — consumer can't control library log levels.
|
|
10
|
+
*
|
|
11
|
+
* Candidate replacement: consola (unjs). Same DX goals, solves all the above:
|
|
12
|
+
* - consola.level = N at runtime
|
|
13
|
+
* - consola.withTag('bdns') for scoped loggers that inherit global level
|
|
14
|
+
* - Pretty dev output, JSON in prod, browser support, 0 deps
|
|
15
|
+
* - https://github.com/unjs/consola
|
|
16
|
+
*
|
|
17
|
+
* TODO: test consola in dokploy instance before migrating.
|
|
4
18
|
*/
|
|
5
19
|
export declare const bold: (str: string) => string;
|
|
6
20
|
export declare const dim: (str: string) => string;
|
|
@@ -20,6 +34,9 @@ export declare const bgBlue: (str: string) => string;
|
|
|
20
34
|
export declare const bgMagenta: (str: string) => string;
|
|
21
35
|
export declare const bgCyan: (str: string) => string;
|
|
22
36
|
export declare const bgWhite: (str: string) => string;
|
|
37
|
+
type LogLevelName = 'error' | 'warn' | 'info' | 'trace';
|
|
38
|
+
/** Set the global log level at runtime. Overrides LOG_LEVEL env var. */
|
|
39
|
+
export declare function setLogLevel(level: LogLevelName): void;
|
|
23
40
|
export declare function bootstrap(...messages: string[]): void;
|
|
24
41
|
export declare function wait(...messages: any[]): void;
|
|
25
42
|
export declare function error(...messages: any[]): void;
|
|
@@ -59,6 +76,7 @@ declare const log: {
|
|
|
59
76
|
timeEnd: typeof timeEnd;
|
|
60
77
|
bootstrap: typeof bootstrap;
|
|
61
78
|
createLogger: typeof createLogger;
|
|
79
|
+
setLogLevel: typeof setLogLevel;
|
|
62
80
|
colors: {
|
|
63
81
|
bold: (str: string) => string;
|
|
64
82
|
dim: (str: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"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"}
|
package/dist/universal/log.js
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A Next.js-style logger for TypeScript applications
|
|
3
3
|
* Provides colored output with Unicode symbols for different log levels
|
|
4
|
+
*
|
|
5
|
+
* Known limitations:
|
|
6
|
+
* - Global level is frozen at import time (const). No runtime setLevel().
|
|
7
|
+
* - createLogger() is just a prefix wrapper, not a real scoped instance.
|
|
8
|
+
* No per-scope level control (can't silence 'bor' but keep 'bdns' verbose).
|
|
9
|
+
* - No withTag/child pattern — consumer can't control library log levels.
|
|
10
|
+
*
|
|
11
|
+
* Candidate replacement: consola (unjs). Same DX goals, solves all the above:
|
|
12
|
+
* - consola.level = N at runtime
|
|
13
|
+
* - consola.withTag('bdns') for scoped loggers that inherit global level
|
|
14
|
+
* - Pretty dev output, JSON in prod, browser support, 0 deps
|
|
15
|
+
* - https://github.com/unjs/consola
|
|
16
|
+
*
|
|
17
|
+
* TODO: test consola in dokploy instance before migrating.
|
|
4
18
|
*/
|
|
5
19
|
import { runtime } from '../runtime.js';
|
|
6
20
|
// ANSI escape codes for colors
|
|
@@ -88,12 +102,8 @@ const LOG_LEVELS = {
|
|
|
88
102
|
wait: 3,
|
|
89
103
|
trace: 4,
|
|
90
104
|
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const level = runtime.env('LOG_LEVEL')?.toLowerCase();
|
|
94
|
-
if (!level)
|
|
95
|
-
return LOG_LEVELS.info; // Default to info
|
|
96
|
-
switch (level) {
|
|
105
|
+
function parseLogLevel(level) {
|
|
106
|
+
switch (level?.toLowerCase()) {
|
|
97
107
|
case 'error': return LOG_LEVELS.error;
|
|
98
108
|
case 'warn': return LOG_LEVELS.warn;
|
|
99
109
|
case 'info': return LOG_LEVELS.info;
|
|
@@ -102,7 +112,11 @@ function getCurrentLogLevel() {
|
|
|
102
112
|
default: return LOG_LEVELS.info;
|
|
103
113
|
}
|
|
104
114
|
}
|
|
105
|
-
|
|
115
|
+
let currentLogLevel = parseLogLevel(runtime.env('LOG_LEVEL'));
|
|
116
|
+
/** Set the global log level at runtime. Overrides LOG_LEVEL env var. */
|
|
117
|
+
export function setLogLevel(level) {
|
|
118
|
+
currentLogLevel = parseLogLevel(level);
|
|
119
|
+
}
|
|
106
120
|
// LRU Cache for warn-once functionality
|
|
107
121
|
class LRUCache {
|
|
108
122
|
cache = new Map();
|
|
@@ -250,6 +264,7 @@ const log = {
|
|
|
250
264
|
timeEnd,
|
|
251
265
|
bootstrap,
|
|
252
266
|
createLogger,
|
|
267
|
+
setLogLevel,
|
|
253
268
|
// Color utilities
|
|
254
269
|
colors: {
|
|
255
270
|
bold,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"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"}
|