@starpak/error 0.0.0-stage → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/lib/codes.d.ts +90 -0
- package/lib/codes.d.ts.map +1 -0
- package/lib/codes.js +108 -0
- package/lib/codes.js.map +1 -0
- package/lib/definitions.d.ts +31 -0
- package/lib/definitions.d.ts.map +1 -0
- package/lib/definitions.js +114 -0
- package/lib/definitions.js.map +1 -0
- package/lib/error.d.ts +61 -0
- package/lib/error.d.ts.map +1 -0
- package/lib/error.js +89 -0
- package/lib/error.js.map +1 -0
- package/lib/format.d.ts +18 -0
- package/lib/format.d.ts.map +1 -0
- package/lib/format.js +164 -0
- package/lib/format.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +29 -0
- package/lib/index.js.map +1 -0
- package/lib/native.d.ts +20 -0
- package/lib/native.d.ts.map +1 -0
- package/lib/native.js +97 -0
- package/lib/native.js.map +1 -0
- package/package.json +11 -3
- package/src/codes.ts +115 -0
- package/src/definitions.ts +232 -0
- package/src/error.ts +123 -0
- package/src/format.ts +183 -0
- package/src/index.ts +20 -0
- package/src/native.ts +108 -0
- package/README.md +0 -3
package/lib/format.js
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Spak Error - renderers
|
|
4
|
+
*
|
|
5
|
+
* One `ErrorInfo` → four surfaces: terminal text, JSON (CI/logs), HTML
|
|
6
|
+
* (Spak OS panel) and Markdown (docs/issues).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.format = format;
|
|
10
|
+
exports.exitCodeFor = exitCodeFor;
|
|
11
|
+
const ANSI = {
|
|
12
|
+
reset: '\u001b[0m',
|
|
13
|
+
bold: '\u001b[1m',
|
|
14
|
+
dim: '\u001b[2m',
|
|
15
|
+
red: '\u001b[31m',
|
|
16
|
+
yellow: '\u001b[33m',
|
|
17
|
+
cyan: '\u001b[36m',
|
|
18
|
+
magenta: '\u001b[35m',
|
|
19
|
+
};
|
|
20
|
+
const SEVERITY_COLOR = {
|
|
21
|
+
info: ANSI.cyan,
|
|
22
|
+
warning: ANSI.yellow,
|
|
23
|
+
error: ANSI.red,
|
|
24
|
+
fatal: ANSI.magenta,
|
|
25
|
+
};
|
|
26
|
+
const SEVERITY_CSS = {
|
|
27
|
+
info: '#2f81f7',
|
|
28
|
+
warning: '#d29922',
|
|
29
|
+
error: '#f85149',
|
|
30
|
+
fatal: '#a371f7',
|
|
31
|
+
};
|
|
32
|
+
function paint(text, color, enabled) {
|
|
33
|
+
return enabled ? `${color}${text}${ANSI.reset}` : text;
|
|
34
|
+
}
|
|
35
|
+
function escapeHtml(text) {
|
|
36
|
+
return text
|
|
37
|
+
.replace(/&/g, '&')
|
|
38
|
+
.replace(/</g, '<')
|
|
39
|
+
.replace(/>/g, '>')
|
|
40
|
+
.replace(/"/g, '"');
|
|
41
|
+
}
|
|
42
|
+
function location(info, file) {
|
|
43
|
+
if (info.where)
|
|
44
|
+
return file ? `${file}:${info.where}` : info.where;
|
|
45
|
+
if (file)
|
|
46
|
+
return file;
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
function format(info, kind = 'text', options = {}) {
|
|
50
|
+
switch (kind) {
|
|
51
|
+
case 'json':
|
|
52
|
+
return formatJson(info);
|
|
53
|
+
case 'html':
|
|
54
|
+
return formatHtml(info);
|
|
55
|
+
case 'markdown':
|
|
56
|
+
return formatMarkdown(info);
|
|
57
|
+
default:
|
|
58
|
+
return formatText(info, options);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function formatText(info, options) {
|
|
62
|
+
const color = options.color ?? Boolean(process.stdout.isTTY);
|
|
63
|
+
const tone = SEVERITY_COLOR[info.severity] ?? ANSI.red;
|
|
64
|
+
const label = paint(info.severity, tone, color);
|
|
65
|
+
const lines = [];
|
|
66
|
+
lines.push(`${label}${paint(`[${info.code}]`, ANSI.dim, color)} ${paint(info.title, ANSI.bold, color)}`);
|
|
67
|
+
if (info.message && info.message !== info.title) {
|
|
68
|
+
lines.push(` ${info.message}`);
|
|
69
|
+
}
|
|
70
|
+
const where = location(info, options.file);
|
|
71
|
+
if (where)
|
|
72
|
+
lines.push(` ${paint('-->', ANSI.cyan, color)} ${where}`);
|
|
73
|
+
lines.push(` ${paint('为什么', ANSI.dim, color)}:${info.why}`);
|
|
74
|
+
if (info.fix.length) {
|
|
75
|
+
lines.push(` ${paint('怎么改', ANSI.dim, color)}:`);
|
|
76
|
+
info.fix.forEach((step, index) => lines.push(` ${index + 1}. ${step}`));
|
|
77
|
+
}
|
|
78
|
+
if (info.docs)
|
|
79
|
+
lines.push(` ${paint('文档', ANSI.dim, color)}:${info.docs}`);
|
|
80
|
+
if (info.cause?.stack) {
|
|
81
|
+
const first = info.cause.stack.split('\n').slice(0, 3).join('\n ');
|
|
82
|
+
lines.push(` ${paint('原始错误', ANSI.dim, color)}:\n ${first}`);
|
|
83
|
+
}
|
|
84
|
+
return lines.join('\n');
|
|
85
|
+
}
|
|
86
|
+
function formatJson(info) {
|
|
87
|
+
return JSON.stringify({
|
|
88
|
+
code: info.code,
|
|
89
|
+
title: info.title,
|
|
90
|
+
severity: info.severity,
|
|
91
|
+
category: info.category,
|
|
92
|
+
message: info.message,
|
|
93
|
+
where: info.where,
|
|
94
|
+
why: info.why,
|
|
95
|
+
fix: info.fix,
|
|
96
|
+
docs: info.docs,
|
|
97
|
+
ui: info.ui,
|
|
98
|
+
context: info.context,
|
|
99
|
+
cause: info.cause
|
|
100
|
+
? { name: info.cause.name, message: info.cause.message, stack: info.cause.stack }
|
|
101
|
+
: undefined,
|
|
102
|
+
}, null, 2);
|
|
103
|
+
}
|
|
104
|
+
function formatHtml(info) {
|
|
105
|
+
const color = info.ui?.color ?? SEVERITY_CSS[info.severity] ?? SEVERITY_CSS.error;
|
|
106
|
+
const actions = (info.ui?.actions ?? []).map(action => ` <button type="button" class="spak-error-action">${escapeHtml(action)}</button>`).join('\n');
|
|
107
|
+
const steps = info.fix.map(step => ` <li>${escapeHtml(step)}</li>`).join('\n');
|
|
108
|
+
return `<section class="spak-error" data-code="${escapeHtml(info.code)}" data-severity="${escapeHtml(info.severity)}" style="--spak-error-color:${color}">
|
|
109
|
+
<header>
|
|
110
|
+
<span class="spak-error-icon">${escapeHtml(info.ui?.icon ?? '!')}</span>
|
|
111
|
+
<h2>${escapeHtml(info.title)}</h2>
|
|
112
|
+
<code>${escapeHtml(info.code)}</code>
|
|
113
|
+
</header>
|
|
114
|
+
<p class="spak-error-message">${escapeHtml(info.message)}</p>
|
|
115
|
+
${info.where ? `<p class="spak-error-where">${escapeHtml(info.where)}</p>` : ''}
|
|
116
|
+
<p class="spak-error-why"><strong>为什么:</strong>${escapeHtml(info.why)}</p>
|
|
117
|
+
<div class="spak-error-fix">
|
|
118
|
+
<strong>怎么改:</strong>
|
|
119
|
+
<ol>
|
|
120
|
+
${steps}
|
|
121
|
+
</ol>
|
|
122
|
+
</div>
|
|
123
|
+
${actions ? ` <footer>\n${actions}\n </footer>` : ''}
|
|
124
|
+
</section>`;
|
|
125
|
+
}
|
|
126
|
+
function formatMarkdown(info) {
|
|
127
|
+
const lines = [];
|
|
128
|
+
lines.push(`### ${info.code} · ${info.title}`);
|
|
129
|
+
lines.push('');
|
|
130
|
+
lines.push(`**严重程度**:${info.severity} **分类**:${info.category}`);
|
|
131
|
+
if (info.where)
|
|
132
|
+
lines.push(`**位置**:\`${info.where}\``);
|
|
133
|
+
lines.push('');
|
|
134
|
+
if (info.message && info.message !== info.title) {
|
|
135
|
+
lines.push(info.message);
|
|
136
|
+
lines.push('');
|
|
137
|
+
}
|
|
138
|
+
lines.push(`**为什么**:${info.why}`);
|
|
139
|
+
lines.push('');
|
|
140
|
+
lines.push('**怎么改**:');
|
|
141
|
+
info.fix.forEach((step, index) => lines.push(`${index + 1}. ${step}`));
|
|
142
|
+
if (info.docs) {
|
|
143
|
+
lines.push('');
|
|
144
|
+
lines.push(`**文档**:${info.docs}`);
|
|
145
|
+
}
|
|
146
|
+
if (info.cause) {
|
|
147
|
+
lines.push('');
|
|
148
|
+
lines.push('<details><summary>原始错误</summary>');
|
|
149
|
+
lines.push('');
|
|
150
|
+
lines.push('```');
|
|
151
|
+
lines.push(`${info.cause.name}: ${info.cause.message}`);
|
|
152
|
+
if (info.cause.stack)
|
|
153
|
+
lines.push(info.cause.stack);
|
|
154
|
+
lines.push('```');
|
|
155
|
+
lines.push('');
|
|
156
|
+
lines.push('</details>');
|
|
157
|
+
}
|
|
158
|
+
return lines.join('\n');
|
|
159
|
+
}
|
|
160
|
+
/** Exit code convention: fatal/error → 1, warning/info → 0. */
|
|
161
|
+
function exitCodeFor(info) {
|
|
162
|
+
return info.severity === 'fatal' || info.severity === 'error' ? 1 : 0;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAuDH,wBAWC;AA6GD,kCAEC;AApKD,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,YAAY;CACtB,CAAA;AAED,MAAM,cAAc,GAA2B;IAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;IACf,OAAO,EAAE,IAAI,CAAC,MAAM;IACpB,KAAK,EAAE,IAAI,CAAC,GAAG;IACf,KAAK,EAAE,IAAI,CAAC,OAAO;CACpB,CAAA;AAED,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;CACjB,CAAA;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,KAAa,EAAE,OAAgB;IAC1D,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACxD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAe,EAAE,IAAa;IAC9C,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;IAClE,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACrB,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAgB,MAAM,CAAC,IAAe,EAAE,OAAmB,MAAM,EAAE,UAAyB,EAAE;IAC5F,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;QACzB,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;QACzB,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,IAAI,CAAC,CAAA;QAC7B;YACE,OAAO,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACpC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAe,EAAE,OAAsB;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5D,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,CAAA;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IACxG,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IAErE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QACjD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;IAC3E,CAAC;IACD,IAAI,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAE3E,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,SAAS,UAAU,CAAC,IAAe;IACjC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACf,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YACjF,CAAC,CAAC,SAAS;KACd,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACb,CAAC;AAED,SAAS,UAAU,CAAC,IAAe;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,KAAK,CAAA;IACjF,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CACpD,yDAAyD,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEnF,OAAO,0CAA0C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B,KAAK;;oCAErH,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,GAAG,CAAC;UAC1D,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;;kCAEC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;IACtD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,+BAA+B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;mDAC9B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;;;;EAIrE,KAAK;;;EAGL,OAAO,CAAC,CAAC,CAAC,eAAe,OAAO,eAAe,CAAC,CAAC,CAAC,EAAE;WAC3C,CAAA;AACX,CAAC;AAED,SAAS,cAAc,CAAC,IAAe;IACrC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC/D,IAAI,IAAI,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;IACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;IACtE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACvD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAClD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,+DAA+D;AAC/D,SAAgB,WAAW,CAAC,IAAe;IACzC,OAAO,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACvE,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spak Error - Public API
|
|
3
|
+
*
|
|
4
|
+
* Every error has a stable code, an actionable explanation and four renderers.
|
|
5
|
+
*/
|
|
6
|
+
export { CODES, codeNumber, isKnownCode } from './codes';
|
|
7
|
+
export type { ErrorCode } from './codes';
|
|
8
|
+
export { DEFINITIONS, allDefinitions, getDefinition, isFatal } from './definitions';
|
|
9
|
+
export type { Category, ErrorDefinition, ErrorUI, Severity } from './definitions';
|
|
10
|
+
export { SpakError, describe, fromDiagnostic, isSpakError } from './error';
|
|
11
|
+
export type { ErrorContext, ErrorInfo, SpakErrorOptions } from './error';
|
|
12
|
+
export { ERRNO_MAP, fromNative } from './native';
|
|
13
|
+
export type { NativeOptions } from './native';
|
|
14
|
+
export { exitCodeFor, format } from './format';
|
|
15
|
+
export type { FormatKind, FormatOptions } from './format';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACnF,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1E,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAExE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC9C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Spak Error - Public API
|
|
4
|
+
*
|
|
5
|
+
* Every error has a stable code, an actionable explanation and four renderers.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.format = exports.exitCodeFor = exports.fromNative = exports.ERRNO_MAP = exports.isSpakError = exports.fromDiagnostic = exports.describe = exports.SpakError = exports.isFatal = exports.getDefinition = exports.allDefinitions = exports.DEFINITIONS = exports.isKnownCode = exports.codeNumber = exports.CODES = void 0;
|
|
9
|
+
var codes_1 = require("./codes");
|
|
10
|
+
Object.defineProperty(exports, "CODES", { enumerable: true, get: function () { return codes_1.CODES; } });
|
|
11
|
+
Object.defineProperty(exports, "codeNumber", { enumerable: true, get: function () { return codes_1.codeNumber; } });
|
|
12
|
+
Object.defineProperty(exports, "isKnownCode", { enumerable: true, get: function () { return codes_1.isKnownCode; } });
|
|
13
|
+
var definitions_1 = require("./definitions");
|
|
14
|
+
Object.defineProperty(exports, "DEFINITIONS", { enumerable: true, get: function () { return definitions_1.DEFINITIONS; } });
|
|
15
|
+
Object.defineProperty(exports, "allDefinitions", { enumerable: true, get: function () { return definitions_1.allDefinitions; } });
|
|
16
|
+
Object.defineProperty(exports, "getDefinition", { enumerable: true, get: function () { return definitions_1.getDefinition; } });
|
|
17
|
+
Object.defineProperty(exports, "isFatal", { enumerable: true, get: function () { return definitions_1.isFatal; } });
|
|
18
|
+
var error_1 = require("./error");
|
|
19
|
+
Object.defineProperty(exports, "SpakError", { enumerable: true, get: function () { return error_1.SpakError; } });
|
|
20
|
+
Object.defineProperty(exports, "describe", { enumerable: true, get: function () { return error_1.describe; } });
|
|
21
|
+
Object.defineProperty(exports, "fromDiagnostic", { enumerable: true, get: function () { return error_1.fromDiagnostic; } });
|
|
22
|
+
Object.defineProperty(exports, "isSpakError", { enumerable: true, get: function () { return error_1.isSpakError; } });
|
|
23
|
+
var native_1 = require("./native");
|
|
24
|
+
Object.defineProperty(exports, "ERRNO_MAP", { enumerable: true, get: function () { return native_1.ERRNO_MAP; } });
|
|
25
|
+
Object.defineProperty(exports, "fromNative", { enumerable: true, get: function () { return native_1.fromNative; } });
|
|
26
|
+
var format_1 = require("./format");
|
|
27
|
+
Object.defineProperty(exports, "exitCodeFor", { enumerable: true, get: function () { return format_1.exitCodeFor; } });
|
|
28
|
+
Object.defineProperty(exports, "format", { enumerable: true, get: function () { return format_1.format; } });
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,iCAAwD;AAA/C,8FAAA,KAAK,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAGvC,6CAAmF;AAA1E,0GAAA,WAAW,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,4GAAA,aAAa,OAAA;AAAE,sGAAA,OAAO,OAAA;AAG5D,iCAA0E;AAAjE,kGAAA,SAAS,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,oGAAA,WAAW,OAAA;AAGzD,mCAAgD;AAAvC,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAG9B,mCAA8C;AAArC,qGAAA,WAAW,OAAA;AAAE,gGAAA,MAAM,OAAA"}
|
package/lib/native.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spak Error - native error mapping
|
|
3
|
+
*
|
|
4
|
+
* Turns `errno` codes and well-known crash messages into Spak errors while
|
|
5
|
+
* keeping the original error as `cause`.
|
|
6
|
+
*/
|
|
7
|
+
import { SpakError } from './error';
|
|
8
|
+
/** POSIX/Node errno → Spak code. */
|
|
9
|
+
export declare const ERRNO_MAP: Record<string, string>;
|
|
10
|
+
export interface NativeOptions {
|
|
11
|
+
where?: string;
|
|
12
|
+
context?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Normalise any thrown value into a `SpakError`.
|
|
16
|
+
* Unknown shapes still produce an error (SPAK-9999) with the original cause.
|
|
17
|
+
*/
|
|
18
|
+
export declare function fromNative(error: unknown, options?: NativeOptions): SpakError;
|
|
19
|
+
export { ERRNO_MAP as ERRNO_TO_SPAK };
|
|
20
|
+
//# sourceMappingURL=native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAe,MAAM,SAAS,CAAA;AAEhD,oCAAoC;AACpC,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoC5C,CAAA;AAgBD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,SAAS,CAiCjF;AAED,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,CAAA"}
|
package/lib/native.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Spak Error - native error mapping
|
|
4
|
+
*
|
|
5
|
+
* Turns `errno` codes and well-known crash messages into Spak errors while
|
|
6
|
+
* keeping the original error as `cause`.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ERRNO_TO_SPAK = exports.ERRNO_MAP = void 0;
|
|
10
|
+
exports.fromNative = fromNative;
|
|
11
|
+
const codes_1 = require("./codes");
|
|
12
|
+
const error_1 = require("./error");
|
|
13
|
+
/** POSIX/Node errno → Spak code. */
|
|
14
|
+
exports.ERRNO_MAP = {
|
|
15
|
+
ENOENT: codes_1.CODES.FS_NOT_FOUND,
|
|
16
|
+
ENOTDIR: codes_1.CODES.FS_NOT_FOUND,
|
|
17
|
+
EACCES: codes_1.CODES.FS_DENIED_BY_OS,
|
|
18
|
+
EPERM: codes_1.CODES.FS_OPERATION_NOT_PERMITTED,
|
|
19
|
+
ENOSPC: codes_1.CODES.FS_NO_SPACE,
|
|
20
|
+
EMFILE: codes_1.CODES.FS_TOO_MANY_OPEN_FILES,
|
|
21
|
+
ENFILE: codes_1.CODES.FS_TOO_MANY_OPEN_FILES,
|
|
22
|
+
EISDIR: codes_1.CODES.FS_IS_DIRECTORY,
|
|
23
|
+
EROFS: codes_1.CODES.FS_DENIED_BY_OS,
|
|
24
|
+
EBADF: codes_1.CODES.HANDLE_REVOKED,
|
|
25
|
+
EADDRINUSE: codes_1.CODES.PORT_IN_USE,
|
|
26
|
+
EADDRNOTAVAIL: codes_1.CODES.LISTEN_FAILED,
|
|
27
|
+
EACCES_LISTEN: codes_1.CODES.LISTEN_FAILED,
|
|
28
|
+
ECONNREFUSED: codes_1.CODES.NET_CONNECTION_REFUSED,
|
|
29
|
+
ECONNRESET: codes_1.CODES.NET_CONNECTION_RESET,
|
|
30
|
+
ECONNABORTED: codes_1.CODES.NET_CONNECTION_RESET,
|
|
31
|
+
EPIPE: codes_1.CODES.NET_CONNECTION_RESET,
|
|
32
|
+
ETIMEDOUT: codes_1.CODES.NET_TIMEOUT,
|
|
33
|
+
ESOCKETTIMEDOUT: codes_1.CODES.NET_TIMEOUT,
|
|
34
|
+
ENOTFOUND: codes_1.CODES.NET_DNS,
|
|
35
|
+
EAI_AGAIN: codes_1.CODES.NET_DNS,
|
|
36
|
+
ERR_TLS_CERT_ALTNAME_INVALID: codes_1.CODES.NET_TLS,
|
|
37
|
+
ERR_SSL_WRONG_VERSION_NUMBER: codes_1.CODES.NET_TLS,
|
|
38
|
+
DEPTH_ZERO_SELF_SIGNED_CERT: codes_1.CODES.NET_TLS,
|
|
39
|
+
UNABLE_TO_VERIFY_LEAF_SIGNATURE: codes_1.CODES.NET_TLS,
|
|
40
|
+
SELF_SIGNED_CERT_IN_CHAIN: codes_1.CODES.NET_TLS,
|
|
41
|
+
MODULE_NOT_FOUND: codes_1.CODES.MODULE_NOT_FOUND,
|
|
42
|
+
ERR_MODULE_NOT_FOUND: codes_1.CODES.MODULE_NOT_FOUND,
|
|
43
|
+
ERR_REQUIRE_ESM: codes_1.CODES.MODULE_NOT_FOUND,
|
|
44
|
+
ERR_PACKAGE_PATH_NOT_EXPORTED: codes_1.CODES.MODULE_NOT_FOUND,
|
|
45
|
+
ERR_INVALID_ARG_TYPE: codes_1.CODES.BUILD_FAILED,
|
|
46
|
+
};
|
|
47
|
+
exports.ERRNO_TO_SPAK = exports.ERRNO_MAP;
|
|
48
|
+
/** Message patterns for failures that have no errno (crashes, engine errors). */
|
|
49
|
+
const MESSAGE_MAP = [
|
|
50
|
+
{ pattern: /JavaScript heap out of memory/i, code: codes_1.CODES.OUT_OF_MEMORY },
|
|
51
|
+
{ pattern: /Maximum call stack size exceeded/i, code: codes_1.CODES.STACK_OVERFLOW },
|
|
52
|
+
{ pattern: /Segmentation fault|core dumped|double free|invalid pointer|bus error/i, code: codes_1.CODES.NATIVE_CRASH },
|
|
53
|
+
{ pattern: /Unexpected token .* in JSON|is not valid JSON|JSON at position/i, code: codes_1.CODES.PAK_MANIFEST_INVALID },
|
|
54
|
+
{ pattern: /\.l2s\.|FUSE|rename .*ENOENT/i, code: codes_1.CODES.FS_RENAME_UNSUPPORTED },
|
|
55
|
+
{ pattern: /socket hang up/i, code: codes_1.CODES.NET_CONNECTION_RESET },
|
|
56
|
+
{ pattern: /self-signed certificate|certificate has expired|unable to verify/i, code: codes_1.CODES.NET_TLS },
|
|
57
|
+
{ pattern: /basic auth|proxy authentication/i, code: codes_1.CODES.NET_PROXY_AUTH },
|
|
58
|
+
{ pattern: /Cannot find module/i, code: codes_1.CODES.MODULE_NOT_FOUND },
|
|
59
|
+
{ pattern: /EACCES.*listen|permission denied.*:?\d{2,5}/i, code: codes_1.CODES.LISTEN_FAILED },
|
|
60
|
+
];
|
|
61
|
+
/**
|
|
62
|
+
* Normalise any thrown value into a `SpakError`.
|
|
63
|
+
* Unknown shapes still produce an error (SPAK-9999) with the original cause.
|
|
64
|
+
*/
|
|
65
|
+
function fromNative(error, options = {}) {
|
|
66
|
+
if ((0, error_1.isSpakError)(error))
|
|
67
|
+
return error;
|
|
68
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
69
|
+
const errno = typeof error?.code === 'string'
|
|
70
|
+
? String(error.code)
|
|
71
|
+
: undefined;
|
|
72
|
+
const message = cause.message ?? '';
|
|
73
|
+
const context = { ...options.context };
|
|
74
|
+
if (errno)
|
|
75
|
+
context.errno = errno;
|
|
76
|
+
if (errno) {
|
|
77
|
+
const direct = exports.ERRNO_MAP[errno];
|
|
78
|
+
if (direct) {
|
|
79
|
+
// Listen failures share EACCES with file access; the syscall tells them apart.
|
|
80
|
+
const syscall = String(error?.syscall ?? '');
|
|
81
|
+
if (errno === 'EACCES' && syscall === 'listen') {
|
|
82
|
+
return new error_1.SpakError(codes_1.CODES.LISTEN_FAILED, { cause, message, where: options.where, context });
|
|
83
|
+
}
|
|
84
|
+
if (errno === 'ENOENT' && /\.l2s\.|tmp_obj_|\.git\/objects/.test(message)) {
|
|
85
|
+
return new error_1.SpakError(codes_1.CODES.FS_RENAME_UNSUPPORTED, { cause, message, where: options.where, context });
|
|
86
|
+
}
|
|
87
|
+
return new error_1.SpakError(direct, { cause, message, where: options.where, context });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const entry of MESSAGE_MAP) {
|
|
91
|
+
if (entry.pattern.test(message)) {
|
|
92
|
+
return new error_1.SpakError(entry.code, { cause, message, where: options.where, context });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return new error_1.SpakError(codes_1.CODES.UNKNOWN, { cause, message, where: options.where, context });
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starpak/error",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"description": "Spak Error - error codes, guidance and terminal/JSON/HTML/Markdown renderers",
|
|
4
|
+
"version": "0.1.4",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"typings": "lib/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib",
|
|
9
|
+
"src"
|
|
10
|
+
],
|
|
11
|
+
"author": "Spak Team",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"dependencies": {}
|
|
6
14
|
}
|
package/src/codes.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spak Error - stable error codes
|
|
3
|
+
*
|
|
4
|
+
* Naming: `SPAK-<domain><serial>` — 1xxx language, 2xxx build, 3xxx mod/app,
|
|
5
|
+
* 4xxx runtime, 5xxx permission, 6xxx filesystem, 7xxx network, 8xxx env,
|
|
6
|
+
* 9xxx fatal. Codes never get reused; retired codes stay reserved.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const CODES = {
|
|
10
|
+
// ---- 1xxx language ------------------------------------------------------
|
|
11
|
+
SYNTAX: 'SPAK-1001',
|
|
12
|
+
UNEXPECTED_TOKEN: 'SPAK-1002',
|
|
13
|
+
UNTERMINATED_STRING: 'SPAK-1003',
|
|
14
|
+
TYPE_MISMATCH: 'SPAK-1004',
|
|
15
|
+
POSSIBLY_NIL: 'SPAK-1005',
|
|
16
|
+
UNKNOWN_TYPE: 'SPAK-1006',
|
|
17
|
+
ARGUMENT_MISMATCH: 'SPAK-1007',
|
|
18
|
+
RETURN_MISMATCH: 'SPAK-1008',
|
|
19
|
+
DUPLICATE_DECLARATION: 'SPAK-1009',
|
|
20
|
+
TYPE_ALIAS_CYCLE: 'SPAK-1010',
|
|
21
|
+
MISSING_FIELD: 'SPAK-1011',
|
|
22
|
+
ZERO_BASED_INDEX: 'SPAK-1012',
|
|
23
|
+
|
|
24
|
+
// ---- 2xxx build ---------------------------------------------------------
|
|
25
|
+
BUILD_FAILED: 'SPAK-2001',
|
|
26
|
+
ENTRY_NOT_FOUND: 'SPAK-2002',
|
|
27
|
+
UNKNOWN_TARGET: 'SPAK-2003',
|
|
28
|
+
PAK_MAGIC_INVALID: 'SPAK-2004',
|
|
29
|
+
PAK_VERSION_UNSUPPORTED: 'SPAK-2005',
|
|
30
|
+
PAK_MANIFEST_INVALID: 'SPAK-2006',
|
|
31
|
+
PAK_TRUNCATED: 'SPAK-2007',
|
|
32
|
+
INTEGRITY_MISMATCH: 'SPAK-2010',
|
|
33
|
+
OUTPUT_NOT_WRITABLE: 'SPAK-2008',
|
|
34
|
+
DISK_FULL: 'SPAK-2009',
|
|
35
|
+
|
|
36
|
+
// ---- 3xxx mods / apps ---------------------------------------------------
|
|
37
|
+
MANIFEST_INVALID: 'SPAK-3001',
|
|
38
|
+
DEPENDENCY_MISSING: 'SPAK-3002',
|
|
39
|
+
DEPENDENCY_CYCLE: 'SPAK-3003',
|
|
40
|
+
DUPLICATE_MOD_ID: 'SPAK-3004',
|
|
41
|
+
ENTRY_UNSUPPORTED: 'SPAK-3005',
|
|
42
|
+
SPK_COMPILE_FAILED: 'SPAK-3006',
|
|
43
|
+
VERSION_MISMATCH: 'SPAK-3007',
|
|
44
|
+
CONFIG_INVALID: 'SPAK-3008',
|
|
45
|
+
INSTALL_FAILED: 'SPAK-3009',
|
|
46
|
+
SIGNATURE_INVALID: 'SPAK-3010',
|
|
47
|
+
|
|
48
|
+
// ---- 4xxx runtime -------------------------------------------------------
|
|
49
|
+
UNCAUGHT_EXCEPTION: 'SPAK-4001',
|
|
50
|
+
UNHANDLED_REJECTION: 'SPAK-4002',
|
|
51
|
+
PORT_IN_USE: 'SPAK-4003',
|
|
52
|
+
LISTEN_FAILED: 'SPAK-4004',
|
|
53
|
+
ROUTE_DUPLICATE: 'SPAK-4005',
|
|
54
|
+
HANDLER_THREW: 'SPAK-4006',
|
|
55
|
+
BODY_TOO_LARGE: 'SPAK-4007',
|
|
56
|
+
UNKNOWN_COMMAND: 'SPAK-4008',
|
|
57
|
+
MISSING_ARGUMENT: 'SPAK-4009',
|
|
58
|
+
INVALID_OPTION: 'SPAK-4010',
|
|
59
|
+
SERVICE_STOP_FAILED: 'SPAK-4011',
|
|
60
|
+
INVALID_PATH: 'SPAK-4012',
|
|
61
|
+
AUTH_FAILED: 'SPAK-4013',
|
|
62
|
+
|
|
63
|
+
// ---- 5xxx permission ----------------------------------------------------
|
|
64
|
+
PERMISSION_UNDECLARED: 'SPAK-5001',
|
|
65
|
+
FS_DENIED: 'SPAK-5002',
|
|
66
|
+
NETWORK_DENIED: 'SPAK-5003',
|
|
67
|
+
CHILD_PROCESS_DENIED: 'SPAK-5004',
|
|
68
|
+
DANGEROUS_API: 'SPAK-5005',
|
|
69
|
+
|
|
70
|
+
// ---- 6xxx filesystem ----------------------------------------------------
|
|
71
|
+
FS_NOT_FOUND: 'SPAK-6001',
|
|
72
|
+
FS_DENIED_BY_OS: 'SPAK-6002',
|
|
73
|
+
FS_OPERATION_NOT_PERMITTED: 'SPAK-6003',
|
|
74
|
+
FS_NO_SPACE: 'SPAK-6004',
|
|
75
|
+
FS_TOO_MANY_OPEN_FILES: 'SPAK-6005',
|
|
76
|
+
FS_IS_DIRECTORY: 'SPAK-6006',
|
|
77
|
+
FS_RENAME_UNSUPPORTED: 'SPAK-6007',
|
|
78
|
+
|
|
79
|
+
// ---- 7xxx network -------------------------------------------------------
|
|
80
|
+
NET_CONNECTION_REFUSED: 'SPAK-7001',
|
|
81
|
+
NET_CONNECTION_RESET: 'SPAK-7002',
|
|
82
|
+
NET_TIMEOUT: 'SPAK-7003',
|
|
83
|
+
NET_DNS: 'SPAK-7004',
|
|
84
|
+
NET_TLS: 'SPAK-7005',
|
|
85
|
+
NET_PROXY_AUTH: 'SPAK-7006',
|
|
86
|
+
NET_HTTP_STATUS: 'SPAK-7007',
|
|
87
|
+
|
|
88
|
+
// ---- 8xxx environment ---------------------------------------------------
|
|
89
|
+
NODE_VERSION: 'SPAK-8001',
|
|
90
|
+
NATIVE_MODULE: 'SPAK-8002',
|
|
91
|
+
PLATFORM_UNSUPPORTED: 'SPAK-8003',
|
|
92
|
+
ENCODING: 'SPAK-8004',
|
|
93
|
+
CLOCK_SKEW: 'SPAK-8005',
|
|
94
|
+
MODULE_NOT_FOUND: 'SPAK-8006',
|
|
95
|
+
|
|
96
|
+
// ---- 9xxx fatal ---------------------------------------------------------
|
|
97
|
+
OUT_OF_MEMORY: 'SPAK-9001',
|
|
98
|
+
STACK_OVERFLOW: 'SPAK-9002',
|
|
99
|
+
NATIVE_CRASH: 'SPAK-9003',
|
|
100
|
+
CORRUPT_PACKAGE: 'SPAK-9004',
|
|
101
|
+
HANDLE_REVOKED: 'SPAK-9005',
|
|
102
|
+
UNKNOWN: 'SPAK-9999',
|
|
103
|
+
} as const
|
|
104
|
+
|
|
105
|
+
export type ErrorCode = typeof CODES[keyof typeof CODES]
|
|
106
|
+
|
|
107
|
+
/** Numeric part of a code, e.g. `SPAK-4101` → 4101. */
|
|
108
|
+
export function codeNumber(code: string): number {
|
|
109
|
+
const match = /^SPAK-(\d{4})$/.exec(code)
|
|
110
|
+
return match ? Number(match[1]) : 0
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function isKnownCode(code: string): boolean {
|
|
114
|
+
return Object.values(CODES).includes(code as ErrorCode)
|
|
115
|
+
}
|