pg-admin-mcp 0.0.0-stage → 0.1.1
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 +608 -2
- package/dist/config/env.js +67 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/profiles.js +257 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/core/audit-context.js +21 -0
- package/dist/core/audit-context.js.map +1 -0
- package/dist/core/audit.js +91 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/brands.js +24 -0
- package/dist/core/brands.js.map +1 -0
- package/dist/core/classifier.js +279 -0
- package/dist/core/classifier.js.map +1 -0
- package/dist/core/errors.js +197 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/format.js +258 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/guards.js +513 -0
- package/dist/core/guards.js.map +1 -0
- package/dist/core/identifiers.js +431 -0
- package/dist/core/identifiers.js.map +1 -0
- package/dist/core/limits.js +79 -0
- package/dist/core/limits.js.map +1 -0
- package/dist/core/logger.js +34 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/paginate.js +195 -0
- package/dist/core/paginate.js.map +1 -0
- package/dist/core/paths.js +392 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/policy.js +98 -0
- package/dist/core/policy.js.map +1 -0
- package/dist/core/shutdown.js +10 -0
- package/dist/core/shutdown.js.map +1 -0
- package/dist/core/stdout-guard.js +25 -0
- package/dist/core/stdout-guard.js.map +1 -0
- package/dist/db/catalog.js +1006 -0
- package/dist/db/catalog.js.map +1 -0
- package/dist/db/pool.js +158 -0
- package/dist/db/pool.js.map +1 -0
- package/dist/db/session.js +258 -0
- package/dist/db/session.js.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.js +88 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/runtime/binaries.js +356 -0
- package/dist/runtime/binaries.js.map +1 -0
- package/dist/runtime/env-file.js +62 -0
- package/dist/runtime/env-file.js.map +1 -0
- package/dist/runtime/environment.js +34 -0
- package/dist/runtime/environment.js.map +1 -0
- package/dist/server.js +106 -0
- package/dist/server.js.map +1 -0
- package/dist/snapshot/capture.js +189 -0
- package/dist/snapshot/capture.js.map +1 -0
- package/dist/snapshot/diff.js +254 -0
- package/dist/snapshot/diff.js.map +1 -0
- package/dist/snapshot/migrate.js +1596 -0
- package/dist/snapshot/migrate.js.map +1 -0
- package/dist/snapshot/model.js +80 -0
- package/dist/snapshot/model.js.map +1 -0
- package/dist/tools/_archive_meta.js +138 -0
- package/dist/tools/_archive_meta.js.map +1 -0
- package/dist/tools/_batch_shared.js +73 -0
- package/dist/tools/_batch_shared.js.map +1 -0
- package/dist/tools/_export_format.js +107 -0
- package/dist/tools/_export_format.js.map +1 -0
- package/dist/tools/_object_kinds.js +97 -0
- package/dist/tools/_object_kinds.js.map +1 -0
- package/dist/tools/_relation_detail.js +55 -0
- package/dist/tools/_relation_detail.js.map +1 -0
- package/dist/tools/_shared.js +17 -0
- package/dist/tools/_shared.js.map +1 -0
- package/dist/tools/_snapshot_io.js +238 -0
- package/dist/tools/_snapshot_io.js.map +1 -0
- package/dist/tools/admin/_shared.js +18 -0
- package/dist/tools/admin/_shared.js.map +1 -0
- package/dist/tools/admin/extensions.js +80 -0
- package/dist/tools/admin/extensions.js.map +1 -0
- package/dist/tools/admin/grants.js +207 -0
- package/dist/tools/admin/grants.js.map +1 -0
- package/dist/tools/admin/index.js +138 -0
- package/dist/tools/admin/index.js.map +1 -0
- package/dist/tools/admin/maintenance.js +106 -0
- package/dist/tools/admin/maintenance.js.map +1 -0
- package/dist/tools/admin/roles.js +144 -0
- package/dist/tools/admin/roles.js.map +1 -0
- package/dist/tools/admin/sessions.js +104 -0
- package/dist/tools/admin/sessions.js.map +1 -0
- package/dist/tools/admin/stats.js +63 -0
- package/dist/tools/admin/stats.js.map +1 -0
- package/dist/tools/backup.js +288 -0
- package/dist/tools/backup.js.map +1 -0
- package/dist/tools/connection_status.js +138 -0
- package/dist/tools/connection_status.js.map +1 -0
- package/dist/tools/copy.js +355 -0
- package/dist/tools/copy.js.map +1 -0
- package/dist/tools/delete_batch.js +73 -0
- package/dist/tools/delete_batch.js.map +1 -0
- package/dist/tools/describe_object.js +87 -0
- package/dist/tools/describe_object.js.map +1 -0
- package/dist/tools/execute_sql.js +409 -0
- package/dist/tools/execute_sql.js.map +1 -0
- package/dist/tools/explain.js +134 -0
- package/dist/tools/explain.js.map +1 -0
- package/dist/tools/export.js +215 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/get_schema.js +148 -0
- package/dist/tools/get_schema.js.map +1 -0
- package/dist/tools/index.js +40 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/insert_batch.js +212 -0
- package/dist/tools/insert_batch.js.map +1 -0
- package/dist/tools/list_objects.js +160 -0
- package/dist/tools/list_objects.js.map +1 -0
- package/dist/tools/prepare_migration.js +112 -0
- package/dist/tools/prepare_migration.js.map +1 -0
- package/dist/tools/restore.js +301 -0
- package/dist/tools/restore.js.map +1 -0
- package/dist/tools/schema_diff.js +79 -0
- package/dist/tools/schema_diff.js.map +1 -0
- package/dist/tools/schema_snapshot.js +57 -0
- package/dist/tools/schema_snapshot.js.map +1 -0
- package/dist/tools/select.js +162 -0
- package/dist/tools/select.js.map +1 -0
- package/dist/tools/update_batch.js +154 -0
- package/dist/tools/update_batch.js.map +1 -0
- package/package.json +48 -6
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { assertNever } from '../tools/_shared.js';
|
|
2
|
+
import { DEFAULT_LIMITS, truncateRows } from './limits.js';
|
|
3
|
+
/** The two pg type OIDs whose JS runtime shape (`string`) is not self-describing — see the module doc. */
|
|
4
|
+
const OID = {
|
|
5
|
+
NUMERIC: 1700,
|
|
6
|
+
INT8: 20,
|
|
7
|
+
};
|
|
8
|
+
const CELL_MAX_CHARS = 300;
|
|
9
|
+
const NULL_TEXT = 'NULL';
|
|
10
|
+
/**
|
|
11
|
+
* Placeholder for a cell that could not be rendered at all — a raw value
|
|
12
|
+
* `JSON.stringify` cannot handle (a circular object reached through a
|
|
13
|
+
* jsonb-typed column, or similar) rather than an ordinary NULL/empty value.
|
|
14
|
+
* One bad cell degrades to this instead of failing the whole tool call.
|
|
15
|
+
*/
|
|
16
|
+
const UNRENDERABLE = '[unrenderable value]';
|
|
17
|
+
/** `JSON.stringify` replacer: BigInt has no native JSON representation, so render it as its decimal text instead of throwing. */
|
|
18
|
+
function jsonReplacer(_key, value) {
|
|
19
|
+
return typeof value === 'bigint' ? value.toString() : value;
|
|
20
|
+
}
|
|
21
|
+
/** True for the `postgres-interval` object `pg` parses an `interval` column into. */
|
|
22
|
+
function isPgInterval(value) {
|
|
23
|
+
return typeof value.toPostgres === 'function';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Renders one cell to plain text, unclipped. `null`/`undefined` -> bare
|
|
27
|
+
* `NULL` — the one unquoted case, which is what makes it distinguishable
|
|
28
|
+
* from the *string* `'NULL'` (quoted, like every other string) and from `''`
|
|
29
|
+
* (renders as `''`).
|
|
30
|
+
*/
|
|
31
|
+
function renderScalar(value, dataTypeId) {
|
|
32
|
+
if (value === null || value === undefined)
|
|
33
|
+
return NULL_TEXT;
|
|
34
|
+
if (typeof value === 'bigint')
|
|
35
|
+
return value.toString();
|
|
36
|
+
if (typeof value === 'string') {
|
|
37
|
+
// numeric/int8 arrive as strings to preserve precision / 64-bit range —
|
|
38
|
+
// rendered bare (no quotes) since they are numbers, never coerced.
|
|
39
|
+
if (dataTypeId === OID.NUMERIC || dataTypeId === OID.INT8)
|
|
40
|
+
return value;
|
|
41
|
+
return `'${value}'`;
|
|
42
|
+
}
|
|
43
|
+
if (Buffer.isBuffer(value))
|
|
44
|
+
return `\\x${value.toString('hex')}`; // bytea, psql-style
|
|
45
|
+
if (value instanceof Date)
|
|
46
|
+
return value.toISOString(); // date/timestamp/timestamptz
|
|
47
|
+
if (Array.isArray(value))
|
|
48
|
+
return `{${value.map((el) => renderScalar(el, undefined)).join(',')}}`; // psql array syntax
|
|
49
|
+
if (typeof value === 'object' && isPgInterval(value))
|
|
50
|
+
return value.toPostgres(); // interval
|
|
51
|
+
if (typeof value === 'object')
|
|
52
|
+
return JSON.stringify(value, jsonReplacer); // json/jsonb — throws on a circular ref, caught by callers
|
|
53
|
+
return String(value); // number, boolean
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* `formatCell` and `jsonRow` are the two call sites that actually reach a raw
|
|
57
|
+
* cell value from row data (as opposed to a value this module already knows
|
|
58
|
+
* to be well-formed). Both wrap `render` in the same try/catch so a single
|
|
59
|
+
* malformed cell — most likely a circular object nested in a jsonb column —
|
|
60
|
+
* degrades to {@link UNRENDERABLE} instead of throwing out of the whole
|
|
61
|
+
* `formatOutcome` call.
|
|
62
|
+
*/
|
|
63
|
+
function renderCellSafely(render, onError) {
|
|
64
|
+
try {
|
|
65
|
+
return render();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return onError;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function formatCell(value, dataTypeId) {
|
|
72
|
+
const text = renderCellSafely(() => renderScalar(value, dataTypeId), UNRENDERABLE);
|
|
73
|
+
if (text.length <= CELL_MAX_CHARS)
|
|
74
|
+
return text;
|
|
75
|
+
const clippedChars = text.length - CELL_MAX_CHARS;
|
|
76
|
+
return `${text.slice(0, CELL_MAX_CHARS)} …[clipped, ${clippedChars} more chars]`;
|
|
77
|
+
}
|
|
78
|
+
/** JSON-safe mirror of {@link renderScalar} for `structuredContent` — same type rules, real JSON values instead of the quoted-text table form. */
|
|
79
|
+
function toJsonSafe(value, dataTypeId) {
|
|
80
|
+
void dataTypeId; // numeric/int8 already stay strings with no special case needed here
|
|
81
|
+
if (value === null || value === undefined)
|
|
82
|
+
return null;
|
|
83
|
+
if (typeof value === 'bigint')
|
|
84
|
+
return value.toString();
|
|
85
|
+
if (typeof value === 'string')
|
|
86
|
+
return value;
|
|
87
|
+
if (Buffer.isBuffer(value))
|
|
88
|
+
return `\\x${value.toString('hex')}`;
|
|
89
|
+
if (value instanceof Date)
|
|
90
|
+
return value.toISOString();
|
|
91
|
+
if (Array.isArray(value))
|
|
92
|
+
return value.map((el) => toJsonSafe(el, undefined));
|
|
93
|
+
if (typeof value === 'object' && isPgInterval(value))
|
|
94
|
+
return value.toPostgres();
|
|
95
|
+
if (typeof value === 'object') {
|
|
96
|
+
// Unlike renderScalar, this branch does not stringify — it hands the
|
|
97
|
+
// object straight through for the SDK to JSON-encode later. That means a
|
|
98
|
+
// circular object slips past unnoticed here; probe it the same way the
|
|
99
|
+
// eventual encoder will, in jsonRow below, rather than duplicating the
|
|
100
|
+
// check for every object-typed cell whether or not it is ever used.
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
function pad(text, width) {
|
|
106
|
+
return text.length >= width ? text : text + ' '.repeat(width - text.length);
|
|
107
|
+
}
|
|
108
|
+
/** Compact, aligned, ASCII-only text table — no ANSI, no box-drawing that breaks on narrow widths. */
|
|
109
|
+
function renderTable(columns, rows) {
|
|
110
|
+
const headers = columns.map((c) => c.name);
|
|
111
|
+
const cellRows = rows.map((row) => columns.map((c) => formatCell(row[c.name], c.dataTypeId)));
|
|
112
|
+
const widths = headers.map((h, i) => {
|
|
113
|
+
let width = h.length;
|
|
114
|
+
for (const r of cellRows)
|
|
115
|
+
width = Math.max(width, r[i]?.length ?? 0);
|
|
116
|
+
return width;
|
|
117
|
+
});
|
|
118
|
+
const headerLine = headers.map((h, i) => pad(h, widths[i] ?? 0)).join(' | ');
|
|
119
|
+
const sepLine = widths.map((w) => '-'.repeat(w)).join('-+-');
|
|
120
|
+
const bodyLines = cellRows.map((r) => r.map((cell, i) => pad(cell, widths[i] ?? 0)).join(' | '));
|
|
121
|
+
return [headerLine, sepLine, ...bodyLines].join('\n');
|
|
122
|
+
}
|
|
123
|
+
function truncationMarker(t, caps, opts = {}) {
|
|
124
|
+
if (t.reason === null)
|
|
125
|
+
return null;
|
|
126
|
+
const singular = opts.nounSingular ?? 'row';
|
|
127
|
+
const noun = t.truncatedRows === 1 ? singular : `${singular}s`;
|
|
128
|
+
// `capLabel` only overrides the row-cap description — a byte-cap cut is
|
|
129
|
+
// still accurately described as a byte cap regardless of what caused any
|
|
130
|
+
// *row*-level truncation upstream (e.g. `list_objects`'s pageSize).
|
|
131
|
+
const capDesc = t.reason === 'rows' ? (opts.capLabel ?? `row cap ${caps.maxRows}`) : `byte cap ${caps.maxBytes}`;
|
|
132
|
+
const cursorSuffix = opts.cursor === undefined ? '' : ` — pass cursor: "${opts.cursor}" to continue`;
|
|
133
|
+
return `… truncated: ${t.truncatedRows} more ${noun} (${capDesc})${cursorSuffix}`;
|
|
134
|
+
}
|
|
135
|
+
function jsonRow(row, columns) {
|
|
136
|
+
return Object.fromEntries(columns.map((c) => {
|
|
137
|
+
const safe = renderCellSafely(() => toJsonSafe(row[c.name], c.dataTypeId), UNRENDERABLE);
|
|
138
|
+
// toJsonSafe's plain-object branch only passes objects through — it
|
|
139
|
+
// never proves they are actually JSON-serializable (a circular jsonb
|
|
140
|
+
// value would sail through undetected). Probe it the same way the
|
|
141
|
+
// eventual JSON-RPC encoder will.
|
|
142
|
+
const probed = renderCellSafely(() => {
|
|
143
|
+
JSON.stringify(safe, jsonReplacer);
|
|
144
|
+
return safe;
|
|
145
|
+
}, UNRENDERABLE);
|
|
146
|
+
return [c.name, probed];
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
function textResult(text, structuredContent) {
|
|
150
|
+
return { content: [{ type: 'text', text }], structuredContent };
|
|
151
|
+
}
|
|
152
|
+
function formatRows(outcome, opts) {
|
|
153
|
+
const limits = opts.limits ?? DEFAULT_LIMITS;
|
|
154
|
+
// Byte-cap enforcement lives here: a SQL `LIMIT` bounds row *count*, never
|
|
155
|
+
// serialized *size*, so this is where an oversized result actually gets
|
|
156
|
+
// cut — measuring real bytes and never serializing past the cap (see
|
|
157
|
+
// `core/limits.ts#truncateRows`). Measured against the *rendered* form
|
|
158
|
+
// (`jsonRow`, the same transform `structuredContent.rows` below is built
|
|
159
|
+
// from), not the raw row: a raw `bytea` cell is a `Buffer`, and
|
|
160
|
+
// `JSON.stringify`-ing a `Buffer` directly produces its `{"type":"Buffer",
|
|
161
|
+
// "data":[...]}` array form — about 1.8x the size of the hex-encoded text
|
|
162
|
+
// actually shipped — which overestimated the byte cost of binary-heavy
|
|
163
|
+
// rows and misreported `truncatedBytes`/the marker's cap figure. Wrapping
|
|
164
|
+
// `jsonRow` here (rather than calling it once up front) keeps the early-stop
|
|
165
|
+
// property: `truncateRows` only serializes rows up to the one that trips
|
|
166
|
+
// the cap, so the discarded tail is still never rendered or serialized.
|
|
167
|
+
const byBytes = truncateRows(outcome.rows, limits, (row) => JSON.stringify(jsonRow(row, outcome.columns), jsonReplacer));
|
|
168
|
+
// `outcome.truncated`/`rowCount` carry whatever the caller already knew was
|
|
169
|
+
// cut upstream (e.g. a `LIMIT maxRows + 1` probe); combined with whatever
|
|
170
|
+
// this pass additionally cut for byte size.
|
|
171
|
+
const upstreamTruncatedRows = Math.max(outcome.rowCount - outcome.rows.length, 0);
|
|
172
|
+
const truncatedRows = upstreamTruncatedRows + byBytes.truncation.truncatedRows;
|
|
173
|
+
const reason = byBytes.truncation.reason ?? (outcome.truncated || upstreamTruncatedRows > 0 ? 'rows' : null);
|
|
174
|
+
const truncation = { truncatedRows, truncatedBytes: byBytes.truncation.truncatedBytes, reason };
|
|
175
|
+
const kept = byBytes.rows;
|
|
176
|
+
const table = kept.length === 0 ? '(no rows)' : renderTable(outcome.columns, kept);
|
|
177
|
+
const marker = truncationMarker(truncation, limits, {
|
|
178
|
+
...(outcome.rowCapLabel === undefined ? {} : { capLabel: outcome.rowCapLabel }),
|
|
179
|
+
...(outcome.truncationNoun === undefined ? {} : { nounSingular: outcome.truncationNoun }),
|
|
180
|
+
...(outcome.nextCursor === undefined ? {} : { cursor: outcome.nextCursor }),
|
|
181
|
+
});
|
|
182
|
+
const summary = `${kept.length} row(s) returned${outcome.rowCount !== kept.length ? ` (of ${outcome.rowCount})` : ''}`;
|
|
183
|
+
const text = [summary, '', table, ...(marker === null ? [] : ['', marker])].join('\n');
|
|
184
|
+
return textResult(text, {
|
|
185
|
+
kind: 'rows',
|
|
186
|
+
columns: outcome.columns.map((c) => c.name),
|
|
187
|
+
rows: kept.map((row) => jsonRow(row, outcome.columns)),
|
|
188
|
+
rowCount: outcome.rowCount,
|
|
189
|
+
truncation,
|
|
190
|
+
...(outcome.nextCursor === undefined ? {} : { nextCursor: outcome.nextCursor }),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function formatMutation(outcome) {
|
|
194
|
+
const text = `${outcome.rowCount} row(s) affected — ${outcome.committed ? 'committed' : 'rolled back'}`;
|
|
195
|
+
return textResult(text, { kind: 'mutation', rowCount: outcome.rowCount, committed: outcome.committed });
|
|
196
|
+
}
|
|
197
|
+
function formatDryRun(outcome) {
|
|
198
|
+
// No `ColumnMeta` travels with a dry-run preview, so the numeric/int8
|
|
199
|
+
// string-vs-text disambiguation above is unavailable here — every string
|
|
200
|
+
// preview value renders quoted, the safe (text-like) default. Documented
|
|
201
|
+
// limitation, not a bug: see the phase report for why.
|
|
202
|
+
const previewColumns = Object.keys(outcome.preview[0] ?? {}).map((name) => ({ name }));
|
|
203
|
+
const previewTable = outcome.preview.length === 0 ? '(no preview rows)' : renderTable(previewColumns, outcome.preview);
|
|
204
|
+
const text = [
|
|
205
|
+
`DRY RUN — ${outcome.rowCount} row(s) would be affected (not committed)`,
|
|
206
|
+
// Immediately under the count, not at the end: this is where a tool says
|
|
207
|
+
// the count does not mean what it looks like (DDL reports none at all).
|
|
208
|
+
...(outcome.note === undefined ? [] : ['', outcome.note]),
|
|
209
|
+
'',
|
|
210
|
+
'Preview:',
|
|
211
|
+
previewTable,
|
|
212
|
+
'',
|
|
213
|
+
'expect (pass back verbatim with confirm:true to apply):',
|
|
214
|
+
JSON.stringify(outcome.expect),
|
|
215
|
+
].join('\n');
|
|
216
|
+
return textResult(text, {
|
|
217
|
+
kind: 'dryRun',
|
|
218
|
+
rowCount: outcome.rowCount,
|
|
219
|
+
preview: outcome.preview.map((row) => jsonRow(row, previewColumns)),
|
|
220
|
+
expect: outcome.expect,
|
|
221
|
+
...(outcome.note === undefined ? {} : { note: outcome.note }),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function formatFile(outcome) {
|
|
225
|
+
const lines = [`File written: ${outcome.path} (${outcome.bytes} bytes)`];
|
|
226
|
+
if (outcome.hostPath !== undefined)
|
|
227
|
+
lines.push(`Host path: ${outcome.hostPath}`);
|
|
228
|
+
for (const [key, value] of Object.entries(outcome.meta ?? {})) {
|
|
229
|
+
lines.push(`${key}: ${renderCellSafely(() => renderScalar(value, undefined), UNRENDERABLE)}`);
|
|
230
|
+
}
|
|
231
|
+
return textResult(lines.join('\n'), {
|
|
232
|
+
kind: 'file',
|
|
233
|
+
path: outcome.path,
|
|
234
|
+
bytes: outcome.bytes,
|
|
235
|
+
...(outcome.hostPath === undefined ? {} : { hostPath: outcome.hostPath }),
|
|
236
|
+
...(outcome.meta === undefined ? {} : { meta: outcome.meta }),
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
function formatReport(outcome) {
|
|
240
|
+
return textResult(JSON.stringify(outcome.data, null, 2), { kind: 'report', data: outcome.data });
|
|
241
|
+
}
|
|
242
|
+
export function formatOutcome(outcome, opts = {}) {
|
|
243
|
+
switch (outcome.kind) {
|
|
244
|
+
case 'rows':
|
|
245
|
+
return formatRows(outcome, opts);
|
|
246
|
+
case 'mutation':
|
|
247
|
+
return formatMutation(outcome);
|
|
248
|
+
case 'dryRun':
|
|
249
|
+
return formatDryRun(outcome);
|
|
250
|
+
case 'file':
|
|
251
|
+
return formatFile(outcome);
|
|
252
|
+
case 'report':
|
|
253
|
+
return formatReport(outcome);
|
|
254
|
+
default:
|
|
255
|
+
return assertNever(outcome);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/core/format.ts"],"names":[],"mappings":"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"}
|