@tabnas/transduce 0.1.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/dist/capability.d.ts +6 -0
  3. package/dist/capability.js +52 -0
  4. package/dist/capability.js.map +1 -0
  5. package/dist/datum.d.ts +64 -0
  6. package/dist/datum.js +391 -0
  7. package/dist/datum.js.map +1 -0
  8. package/dist/error.d.ts +43 -0
  9. package/dist/error.js +169 -0
  10. package/dist/error.js.map +1 -0
  11. package/dist/event.d.ts +56 -0
  12. package/dist/event.js +101 -0
  13. package/dist/event.js.map +1 -0
  14. package/dist/guard.d.ts +20 -0
  15. package/dist/guard.js +90 -0
  16. package/dist/guard.js.map +1 -0
  17. package/dist/json.d.ts +4 -0
  18. package/dist/json.js +92 -0
  19. package/dist/json.js.map +1 -0
  20. package/dist/limits.d.ts +36 -0
  21. package/dist/limits.js +133 -0
  22. package/dist/limits.js.map +1 -0
  23. package/dist/lines.d.ts +39 -0
  24. package/dist/lines.js +1139 -0
  25. package/dist/lines.js.map +1 -0
  26. package/dist/matcher.d.ts +26 -0
  27. package/dist/matcher.js +245 -0
  28. package/dist/matcher.js.map +1 -0
  29. package/dist/parser-source.d.ts +27 -0
  30. package/dist/parser-source.js +194 -0
  31. package/dist/parser-source.js.map +1 -0
  32. package/dist/route.d.ts +61 -0
  33. package/dist/route.js +197 -0
  34. package/dist/route.js.map +1 -0
  35. package/dist/rule-events.d.ts +58 -0
  36. package/dist/rule-events.js +598 -0
  37. package/dist/rule-events.js.map +1 -0
  38. package/dist/scan.d.ts +19 -0
  39. package/dist/scan.js +70 -0
  40. package/dist/scan.js.map +1 -0
  41. package/dist/selector.d.ts +40 -0
  42. package/dist/selector.js +154 -0
  43. package/dist/selector.js.map +1 -0
  44. package/dist/sink.d.ts +29 -0
  45. package/dist/sink.js +184 -0
  46. package/dist/sink.js.map +1 -0
  47. package/dist/source.d.ts +37 -0
  48. package/dist/source.js +113 -0
  49. package/dist/source.js.map +1 -0
  50. package/dist/table-from-json.d.ts +12 -0
  51. package/dist/table-from-json.js +217 -0
  52. package/dist/table-from-json.js.map +1 -0
  53. package/dist/table.d.ts +81 -0
  54. package/dist/table.js +141 -0
  55. package/dist/table.js.map +1 -0
  56. package/dist/transduce.d.ts +28 -0
  57. package/dist/transduce.js +109 -0
  58. package/dist/transduce.js.map +1 -0
  59. package/dist/tsconfig.tsbuildinfo +1 -0
  60. package/dist/value.d.ts +16 -0
  61. package/dist/value.js +96 -0
  62. package/dist/value.js.map +1 -0
  63. package/package.json +65 -0
@@ -0,0 +1,12 @@
1
+ import { Duplicates } from './datum';
2
+ import { JsonEvent } from './event';
3
+ import { Limits, Metrics } from './limits';
4
+ import { Flow, Sink } from './sink';
5
+ import { TableBinding, TableSink } from './table';
6
+ export declare class TableFromJson<S extends TableSink> implements Sink {
7
+ private router;
8
+ constructor(binding: TableBinding, limits: Limits, duplicates: Duplicates, metrics: Metrics, sink: S);
9
+ get sink(): S;
10
+ ended(): boolean;
11
+ event(ev: JsonEvent): Flow;
12
+ }
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ /* Copyright (c) 2026 tabnas, MIT License */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TableFromJson = void 0;
5
+ // The metadata-first table transducer: `JsonEvents/1` in, `TableRows/1`
6
+ // out.
7
+ //
8
+ // `TableFromJson` is a `Sink` built on a `Router` with at most two
9
+ // captures: the column metadata, when the schema comes from the document,
10
+ // and the rows. The schema must be known before the first row is emitted,
11
+ // and the transducer holds one row at a time. So metadata that has not
12
+ // completed when a row BEGINS is an `INPUT_ORDER_VIOLATION` raised at the
13
+ // row's start, through the router's `began` hook, before a byte of the row
14
+ // is retained; metadata that arrives twice is the same failure; and a
15
+ // document with no rows is a valid empty table, its schema emitted just
16
+ // before `end`. Rows are projected into schema order by path, so the order
17
+ // of members inside a row never matters, and a number keeps the lexeme the
18
+ // source events carried.
19
+ const datum_1 = require("./datum");
20
+ const error_1 = require("./error");
21
+ const limits_1 = require("./limits");
22
+ const route_1 = require("./route");
23
+ const selector_1 = require("./selector");
24
+ const table_1 = require("./table");
25
+ // The route sink behind the transducer: it owns the schema state and the
26
+ // table sink.
27
+ class Core {
28
+ constructor(sink, rowId, metaId, columns, limits, metrics) {
29
+ this.schemaSent = false;
30
+ this.sink = sink;
31
+ this.rowId = rowId;
32
+ this.metaId = metaId;
33
+ this.columns = columns;
34
+ this.maxColumns = limits.max_columns;
35
+ this.maxMetadataBytes = limits.max_metadata_bytes;
36
+ this.metrics = metrics;
37
+ }
38
+ bind(columns, from) {
39
+ if (columns.length > this.maxColumns) {
40
+ throw error_1.Fail.limit('max_columns', this.maxColumns, `${from} declares ${columns.length} columns, more than ${this.maxColumns}`);
41
+ }
42
+ this.columns.bound = columns;
43
+ }
44
+ publicColumns() {
45
+ return (this.columns.bound ?? []).map((c) => ({ label: c.label }));
46
+ }
47
+ sendSchema() {
48
+ this.schemaSent = true;
49
+ return this.sink.tableEvent({ type: 'schema', columns: this.publicColumns() });
50
+ }
51
+ metadata(selected) {
52
+ const columns = this.columns;
53
+ if ('metadata' !== columns.type) {
54
+ // The router only has a metadata capture when the binding selects one.
55
+ throw error_1.Fail.protocol('metadata was delivered to a static schema');
56
+ }
57
+ const at = selected.path.toString();
58
+ if (null !== columns.bound) {
59
+ throw new error_1.Fail('INPUT_ORDER_VIOLATION', `the column metadata at ${at} was selected twice; a table has one schema`).atPath(at);
60
+ }
61
+ const value = selected.value ?? datum_1.Datum.null;
62
+ if ('array' !== value.type) {
63
+ throw error_1.Fail.input(`the column metadata at ${at} is not an array`).atPath(at);
64
+ }
65
+ const descriptors = value.items;
66
+ if (descriptors.length > this.maxColumns) {
67
+ throw error_1.Fail.limit('max_columns', this.maxColumns, `the metadata at ${at} declares ${descriptors.length} columns, more than ` +
68
+ `${this.maxColumns}`).atPath(at);
69
+ }
70
+ const bound = descriptors.map((d, i) => {
71
+ try {
72
+ return columns.column(d);
73
+ }
74
+ catch (err) {
75
+ if (err instanceof error_1.Fail && null == err.path) {
76
+ const p = selected.path.clone();
77
+ p.push(i);
78
+ err.path = p.toString();
79
+ }
80
+ throw err;
81
+ }
82
+ });
83
+ this.bind(bound, 'the metadata');
84
+ }
85
+ row(selected) {
86
+ const row = selected.value ?? datum_1.Datum.null;
87
+ if (!this.schemaSent) {
88
+ if ('infer' === this.columns.type && null === this.columns.bound) {
89
+ const at = selected.path.toString();
90
+ if ('object' !== row.type) {
91
+ throw error_1.Fail.input(`the first row at ${at} is not an object, so no columns can be inferred from it`).atPath(at);
92
+ }
93
+ // The names are the table's metadata for as long as it lasts, so
94
+ // they are held to the bound a metadata capture is: measured as the
95
+ // array of their strings would be.
96
+ let bytes = limits_1.NODE_BYTES;
97
+ for (const k of row.members.keys())
98
+ bytes += limits_1.NODE_BYTES + (0, limits_1.utf8Bytes)(k);
99
+ if (bytes > this.maxMetadataBytes) {
100
+ throw error_1.Fail.limit('max_metadata_bytes', this.maxMetadataBytes, `the first row's ${row.members.size} member names take ${bytes} bytes as the ` +
101
+ `table's columns, more than ${this.maxMetadataBytes}`).atPath(at);
102
+ }
103
+ this.bind([...row.members.keys()].map((k) => (0, table_1.boundColumn)(k, [k])), 'the first row');
104
+ }
105
+ if ('stop' === this.sendSchema())
106
+ return 'stop';
107
+ }
108
+ const columns = this.columns.bound;
109
+ if (null === columns) {
110
+ throw error_1.Fail.protocol('a row was projected before its schema was bound');
111
+ }
112
+ const cells = [];
113
+ for (const col of columns) {
114
+ const found = (0, datum_1.getPath)(row, col.source);
115
+ if (undefined !== found) {
116
+ cells.push(table_1.Cell.fromDatum(found));
117
+ continue;
118
+ }
119
+ switch (col.missing) {
120
+ case 'missing':
121
+ cells.push(table_1.Cell.missing);
122
+ break;
123
+ case 'null':
124
+ cells.push(table_1.Cell.null);
125
+ break;
126
+ case 'error': {
127
+ const at = new selector_1.Path([...selected.path.segments, ...col.source]).toString();
128
+ throw new error_1.Fail('MISSING_VALUE', `column ${JSON.stringify(col.label)} has no value at ${at}`).atPath(at);
129
+ }
130
+ }
131
+ }
132
+ this.metrics.rows++;
133
+ return this.sink.tableEvent({ type: 'row', cells });
134
+ }
135
+ began(id, _tag) {
136
+ if (id === this.rowId && 'metadata' === this.columns.type && null === this.columns.bound) {
137
+ throw new error_1.Fail('INPUT_ORDER_VIOLATION', `a row began before the column metadata at ${this.columns.selector} had completed; ` +
138
+ `rows must follow their metadata`);
139
+ }
140
+ }
141
+ selected(selected) {
142
+ if (selected.id === this.metaId) {
143
+ this.metadata(selected);
144
+ return 'continue';
145
+ }
146
+ return this.row(selected);
147
+ }
148
+ end() {
149
+ if (!this.schemaSent) {
150
+ if ('metadata' === this.columns.type && null === this.columns.bound) {
151
+ const at = this.columns.selector.toString();
152
+ throw error_1.Fail.input(`the document has no column metadata at ${at}`).atPath(at);
153
+ }
154
+ // No rows: nothing to infer from, so the table is empty.
155
+ if ('infer' === this.columns.type && null === this.columns.bound) {
156
+ this.bind([], 'the binding');
157
+ }
158
+ if ('stop' === this.sendSchema())
159
+ return 'stop';
160
+ }
161
+ return this.sink.tableEvent({ type: 'end' });
162
+ }
163
+ }
164
+ // The table transducer. A `Sink` for one document's events; the table
165
+ // events go to the wrapped `TableSink` as the rows arrive.
166
+ class TableFromJson {
167
+ // Build the transducer. Rows are materialized under `max_record_bytes`,
168
+ // metadata under `max_metadata_bytes`; a rows selector that may overlap
169
+ // the metadata selector is refused as the router refuses any overlapping
170
+ // materializations.
171
+ constructor(binding, limits, duplicates, metrics, sink) {
172
+ const rowSpec = route_1.CaptureSpec.materialize('row', binding.rows).withBudget(limits.max_record_bytes, 'max_record_bytes');
173
+ let columns;
174
+ let specs;
175
+ let metaId = null;
176
+ const schema = binding.schema;
177
+ switch (schema.type) {
178
+ case 'static':
179
+ columns = { type: 'static', bound: schema.columns.slice() };
180
+ specs = [rowSpec];
181
+ break;
182
+ case 'metadata':
183
+ columns = {
184
+ type: 'metadata',
185
+ selector: schema.columns,
186
+ column: schema.column,
187
+ bound: null,
188
+ };
189
+ specs = [
190
+ route_1.CaptureSpec.materialize('metadata', schema.columns).withBudget(limits.max_metadata_bytes, 'max_metadata_bytes'),
191
+ rowSpec,
192
+ ];
193
+ metaId = 0;
194
+ break;
195
+ case 'infer':
196
+ columns = { type: 'infer', bound: null };
197
+ specs = [rowSpec];
198
+ break;
199
+ }
200
+ const core = new Core(sink, specs.length - 1, metaId, columns, limits, metrics);
201
+ if ('static' === columns.type)
202
+ core.bind(columns.bound, 'the binding');
203
+ this.router = new route_1.Router(specs, limits, duplicates, metrics, core);
204
+ }
205
+ get sink() {
206
+ return this.router.downstream.sink;
207
+ }
208
+ // Whether the table's `end` has been emitted.
209
+ ended() {
210
+ return this.router.ended();
211
+ }
212
+ event(ev) {
213
+ return this.router.event(ev);
214
+ }
215
+ }
216
+ exports.TableFromJson = TableFromJson;
217
+ //# sourceMappingURL=table-from-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-from-json.js","sourceRoot":"","sources":["../src/table-from-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { Datum } from './datum';
2
+ import { Segment, Selector } from './selector';
3
+ import { Flow } from './sink';
4
+ export type Cell = {
5
+ readonly type: 'null';
6
+ } | {
7
+ readonly type: 'bool';
8
+ readonly value: boolean;
9
+ } | {
10
+ readonly type: 'number';
11
+ readonly value: number;
12
+ readonly lexeme: string | null;
13
+ } | {
14
+ readonly type: 'string';
15
+ readonly value: string;
16
+ } | {
17
+ readonly type: 'missing';
18
+ };
19
+ export declare const Cell: Readonly<{
20
+ null: {
21
+ readonly type: 'null';
22
+ };
23
+ missing: {
24
+ readonly type: 'missing';
25
+ };
26
+ bool(value: boolean): Cell;
27
+ number(value: number, lexeme?: string | null): Cell;
28
+ string(value: string): Cell;
29
+ fromDatum(d: Datum): Cell;
30
+ byteSize(c: Cell): number;
31
+ toText(c: Cell): string;
32
+ }>;
33
+ export type PublicColumn = {
34
+ label: string;
35
+ };
36
+ export type TableEvent = {
37
+ readonly type: 'schema';
38
+ readonly columns: readonly PublicColumn[];
39
+ } | {
40
+ readonly type: 'row';
41
+ readonly cells: readonly Cell[];
42
+ } | {
43
+ readonly type: 'end';
44
+ };
45
+ export interface TableSink {
46
+ tableEvent(ev: TableEvent): Flow;
47
+ }
48
+ export declare class Table implements TableSink {
49
+ columns: PublicColumn[];
50
+ rows: Cell[][];
51
+ ended: boolean;
52
+ tableEvent(ev: TableEvent): Flow;
53
+ }
54
+ export type MissingPolicy = 'missing' | 'null' | 'error';
55
+ export type BoundColumn = {
56
+ label: string;
57
+ source: Segment[];
58
+ missing: MissingPolicy;
59
+ };
60
+ export declare function boundColumn(label: string, source: Segment[], missing?: MissingPolicy): BoundColumn;
61
+ export type ColumnMapper = (meta: Datum) => BoundColumn;
62
+ export type Schema = {
63
+ type: 'static';
64
+ columns: BoundColumn[];
65
+ } | {
66
+ type: 'metadata';
67
+ columns: Selector;
68
+ column: ColumnMapper;
69
+ } | {
70
+ type: 'infer';
71
+ };
72
+ export declare const Schema: Readonly<{
73
+ static(columns: BoundColumn[]): Schema;
74
+ fromMetadata(columns: Selector, column?: ColumnMapper): Schema;
75
+ infer(): Schema;
76
+ }>;
77
+ export type TableBinding = {
78
+ schema: Schema;
79
+ rows: Selector;
80
+ };
81
+ export declare function columnFromMeta(meta: Datum): BoundColumn;
package/dist/table.js ADDED
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /* Copyright (c) 2026 tabnas, MIT License */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Schema = exports.Table = exports.Cell = void 0;
5
+ exports.boundColumn = boundColumn;
6
+ exports.columnFromMeta = columnFromMeta;
7
+ // `TableRows/1`: one schema, ordered finite rows, completion.
8
+ //
9
+ // The protocol is flat and budgeted: a row is a finite vector of cells,
10
+ // already projected into schema order by the transducer, and a renderer
11
+ // never sees a source path. Public columns carry a label; the source
12
+ // binding (`BoundColumn`) stays on the transducer's side of the boundary.
13
+ const datum_1 = require("./datum");
14
+ const error_1 = require("./error");
15
+ const json_1 = require("./json");
16
+ const limits_1 = require("./limits");
17
+ const NULL = Object.freeze({ type: 'null' });
18
+ const MISSING = Object.freeze({ type: 'missing' });
19
+ exports.Cell = Object.freeze({
20
+ null: NULL,
21
+ missing: MISSING,
22
+ bool(value) {
23
+ return { type: 'bool', value };
24
+ },
25
+ number(value, lexeme) {
26
+ return { type: 'number', value, lexeme: lexeme ?? null };
27
+ },
28
+ string(value) {
29
+ return { type: 'string', value };
30
+ },
31
+ // From a retained value. A container is not a cell; it is serialized as
32
+ // compact JSON text, the lossy but unambiguous choice the standard
33
+ // binding makes and documents.
34
+ fromDatum(d) {
35
+ switch (d.type) {
36
+ case 'null':
37
+ return NULL;
38
+ case 'bool':
39
+ return { type: 'bool', value: d.value };
40
+ case 'number':
41
+ return { type: 'number', value: d.value, lexeme: d.lexeme };
42
+ case 'string':
43
+ return { type: 'string', value: d.value };
44
+ default:
45
+ return { type: 'string', value: (0, datum_1.toText)(d) };
46
+ }
47
+ },
48
+ // The bytes this cell retains, on the same basis as a datum's size.
49
+ byteSize(c) {
50
+ switch (c.type) {
51
+ case 'number':
52
+ return limits_1.NODE_BYTES + (null != c.lexeme ? (0, limits_1.utf8Bytes)(c.lexeme) : 8);
53
+ case 'string':
54
+ return limits_1.NODE_BYTES + (0, limits_1.utf8Bytes)(c.value);
55
+ default:
56
+ return limits_1.NODE_BYTES;
57
+ }
58
+ },
59
+ // The cell as JSON text; `missing` prints as `missing`.
60
+ toText(c) {
61
+ switch (c.type) {
62
+ case 'null':
63
+ return 'null';
64
+ case 'bool':
65
+ return String(c.value);
66
+ case 'number':
67
+ return (0, json_1.jsonNumber)(c.value, c.lexeme);
68
+ case 'string':
69
+ return (0, json_1.jsonString)(c.value);
70
+ case 'missing':
71
+ return 'missing';
72
+ }
73
+ },
74
+ });
75
+ // An owned recording of a table, for tests and small results.
76
+ class Table {
77
+ constructor() {
78
+ this.columns = [];
79
+ this.rows = [];
80
+ this.ended = false;
81
+ }
82
+ tableEvent(ev) {
83
+ switch (ev.type) {
84
+ case 'schema':
85
+ this.columns = ev.columns.slice();
86
+ break;
87
+ case 'row':
88
+ this.rows.push(ev.cells.slice());
89
+ break;
90
+ case 'end':
91
+ this.ended = true;
92
+ break;
93
+ }
94
+ return 'continue';
95
+ }
96
+ }
97
+ exports.Table = Table;
98
+ function boundColumn(label, source, missing = 'missing') {
99
+ return { label, source, missing };
100
+ }
101
+ exports.Schema = Object.freeze({
102
+ static(columns) {
103
+ return { type: 'static', columns };
104
+ },
105
+ fromMetadata(columns, column = columnFromMeta) {
106
+ return { type: 'metadata', columns, column };
107
+ },
108
+ infer() {
109
+ return { type: 'infer' };
110
+ },
111
+ });
112
+ // The standard mapping from a metadata descriptor to a column: the spec's
113
+ // `column-from-meta`, reading `title` and a `path` of segments.
114
+ function columnFromMeta(meta) {
115
+ if ('object' !== meta.type) {
116
+ throw error_1.Fail.input('a column descriptor is not an object');
117
+ }
118
+ const title = meta.members.get('title');
119
+ if (undefined === title || 'string' !== title.type) {
120
+ throw error_1.Fail.input('a column descriptor has no string "title"');
121
+ }
122
+ const label = title.value;
123
+ const path = meta.members.get('path');
124
+ if (undefined === path || 'array' !== path.type) {
125
+ throw error_1.Fail.input(`column ${JSON.stringify(label)} has no "path" array`);
126
+ }
127
+ const source = path.items.map((seg) => {
128
+ if ('string' === seg.type)
129
+ return seg.value;
130
+ if ('number' === seg.type &&
131
+ seg.value >= 0 &&
132
+ Number.isInteger(seg.value) &&
133
+ seg.value <= 0xffffffff) {
134
+ return seg.value;
135
+ }
136
+ throw error_1.Fail.input(`column ${JSON.stringify(label)} has a path segment that is neither a string nor a ` +
137
+ `non-negative integer: ${(0, datum_1.toText)(seg)}`);
138
+ });
139
+ return boundColumn(label, source);
140
+ }
141
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export declare const VERSION = "0.1.0";
2
+ export { Datum, DatumBuilder, byteSize, fromJSON, fromTabnas, getPath, takePath, toJSON, toText, walkDatum, } from './datum';
3
+ export type { Duplicates } from './datum';
4
+ export { Code, Fail, isFail } from './error';
5
+ export type { Limit } from './error';
6
+ export { Ev, eventEquals, eventText, isEnd, isScalar, isStart } from './event';
7
+ export type { JsonEvent, JsonEventType } from './event';
8
+ export { isJsonNumber, jsonNumber, jsonString, numberText } from './json';
9
+ export { AbortFlag, LIMIT_NAMES, Limits, Metrics, NODE_BYTES, utf8Bytes } from './limits';
10
+ export { Matcher } from './matcher';
11
+ export type { CaptureId, Hit, HitKind } from './matcher';
12
+ export { CaptureSpec, FnRoute, Router, SelectedRecorder } from './route';
13
+ export type { Budget, CaptureMode, RouteSink, Selected } from './route';
14
+ export { ScanEmit, Transition } from './scan';
15
+ export { Path, Selector, keyText, pathText } from './selector';
16
+ export type { Segment, Step } from './selector';
17
+ export { CountSink, EventRecorder, FnSink, TreeContract, replay } from './sink';
18
+ export type { Flow, Sink } from './sink';
19
+ export { Prune, SourceMode, ValueSource, engineFailure, walkValue } from './source';
20
+ export type { Source } from './source';
21
+ export { Guarded } from './guard';
22
+ export { ParserSource } from './parser-source';
23
+ export { DEFAULT_CHUNK_BYTES, LineFormat, LinesSource } from './lines';
24
+ export type { LinesChunk, LinesInput, LinesWriter } from './lines';
25
+ export { INCREMENTAL, capability, isIncremental } from './capability';
26
+ export { Cell, Schema, Table, boundColumn, columnFromMeta } from './table';
27
+ export type { BoundColumn, ColumnMapper, MissingPolicy, PublicColumn, TableBinding, TableEvent, TableSink, } from './table';
28
+ export { TableFromJson } from './table-from-json';
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /* Copyright (c) 2026 tabnas, MIT License */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.engineFailure = exports.ValueSource = exports.SourceMode = exports.Prune = exports.replay = exports.TreeContract = exports.FnSink = exports.EventRecorder = exports.CountSink = exports.pathText = exports.keyText = exports.Selector = exports.Path = exports.Transition = exports.ScanEmit = exports.SelectedRecorder = exports.Router = exports.FnRoute = exports.CaptureSpec = exports.Matcher = exports.utf8Bytes = exports.NODE_BYTES = exports.Metrics = exports.Limits = exports.LIMIT_NAMES = exports.AbortFlag = exports.numberText = exports.jsonString = exports.jsonNumber = exports.isJsonNumber = exports.isStart = exports.isScalar = exports.isEnd = exports.eventText = exports.eventEquals = exports.Ev = exports.isFail = exports.Fail = exports.Code = exports.walkDatum = exports.toText = exports.toJSON = exports.takePath = exports.getPath = exports.fromTabnas = exports.fromJSON = exports.byteSize = exports.DatumBuilder = exports.Datum = exports.VERSION = void 0;
5
+ exports.TableFromJson = exports.columnFromMeta = exports.boundColumn = exports.Table = exports.Schema = exports.Cell = exports.isIncremental = exports.capability = exports.INCREMENTAL = exports.LinesSource = exports.LineFormat = exports.DEFAULT_CHUNK_BYTES = exports.ParserSource = exports.Guarded = exports.walkValue = void 0;
6
+ // Streaming transducers over any tabnas parser.
7
+ //
8
+ // A transducer decides what a source contributes to an output model; a
9
+ // renderer decides how that model becomes text. This package is the
10
+ // transducer side:
11
+ //
12
+ // - the source protocol `JsonEvent` (`JsonEvents/1`) and the push boundary
13
+ // `Sink`;
14
+ // - sources that produce it from a parsed value, from a live tabnas parse
15
+ // through the engine's rule events, or from line-delimited input;
16
+ // - `Selector`s and the matcher and router that recognize selected scopes
17
+ // in one pass and materialize them under a byte limit;
18
+ // - the table protocol `TableEvent` (`TableRows/1`) and the standard
19
+ // metadata-first table transducer;
20
+ // - `Limits`, `Metrics`, `AbortFlag` and the stable failure `Code`s every
21
+ // stage reports.
22
+ //
23
+ // Everything is synchronous and push-based: the parser calls the first
24
+ // sink from inside its own callback, and a slow writer at the end of the
25
+ // chain slows the parse at the start. That is the backpressure.
26
+ // This package's version, as package.json declares it.
27
+ exports.VERSION = '0.1.0';
28
+ var datum_1 = require("./datum");
29
+ Object.defineProperty(exports, "Datum", { enumerable: true, get: function () { return datum_1.Datum; } });
30
+ Object.defineProperty(exports, "DatumBuilder", { enumerable: true, get: function () { return datum_1.DatumBuilder; } });
31
+ Object.defineProperty(exports, "byteSize", { enumerable: true, get: function () { return datum_1.byteSize; } });
32
+ Object.defineProperty(exports, "fromJSON", { enumerable: true, get: function () { return datum_1.fromJSON; } });
33
+ Object.defineProperty(exports, "fromTabnas", { enumerable: true, get: function () { return datum_1.fromTabnas; } });
34
+ Object.defineProperty(exports, "getPath", { enumerable: true, get: function () { return datum_1.getPath; } });
35
+ Object.defineProperty(exports, "takePath", { enumerable: true, get: function () { return datum_1.takePath; } });
36
+ Object.defineProperty(exports, "toJSON", { enumerable: true, get: function () { return datum_1.toJSON; } });
37
+ Object.defineProperty(exports, "toText", { enumerable: true, get: function () { return datum_1.toText; } });
38
+ Object.defineProperty(exports, "walkDatum", { enumerable: true, get: function () { return datum_1.walkDatum; } });
39
+ var error_1 = require("./error");
40
+ Object.defineProperty(exports, "Code", { enumerable: true, get: function () { return error_1.Code; } });
41
+ Object.defineProperty(exports, "Fail", { enumerable: true, get: function () { return error_1.Fail; } });
42
+ Object.defineProperty(exports, "isFail", { enumerable: true, get: function () { return error_1.isFail; } });
43
+ var event_1 = require("./event");
44
+ Object.defineProperty(exports, "Ev", { enumerable: true, get: function () { return event_1.Ev; } });
45
+ Object.defineProperty(exports, "eventEquals", { enumerable: true, get: function () { return event_1.eventEquals; } });
46
+ Object.defineProperty(exports, "eventText", { enumerable: true, get: function () { return event_1.eventText; } });
47
+ Object.defineProperty(exports, "isEnd", { enumerable: true, get: function () { return event_1.isEnd; } });
48
+ Object.defineProperty(exports, "isScalar", { enumerable: true, get: function () { return event_1.isScalar; } });
49
+ Object.defineProperty(exports, "isStart", { enumerable: true, get: function () { return event_1.isStart; } });
50
+ var json_1 = require("./json");
51
+ Object.defineProperty(exports, "isJsonNumber", { enumerable: true, get: function () { return json_1.isJsonNumber; } });
52
+ Object.defineProperty(exports, "jsonNumber", { enumerable: true, get: function () { return json_1.jsonNumber; } });
53
+ Object.defineProperty(exports, "jsonString", { enumerable: true, get: function () { return json_1.jsonString; } });
54
+ Object.defineProperty(exports, "numberText", { enumerable: true, get: function () { return json_1.numberText; } });
55
+ var limits_1 = require("./limits");
56
+ Object.defineProperty(exports, "AbortFlag", { enumerable: true, get: function () { return limits_1.AbortFlag; } });
57
+ Object.defineProperty(exports, "LIMIT_NAMES", { enumerable: true, get: function () { return limits_1.LIMIT_NAMES; } });
58
+ Object.defineProperty(exports, "Limits", { enumerable: true, get: function () { return limits_1.Limits; } });
59
+ Object.defineProperty(exports, "Metrics", { enumerable: true, get: function () { return limits_1.Metrics; } });
60
+ Object.defineProperty(exports, "NODE_BYTES", { enumerable: true, get: function () { return limits_1.NODE_BYTES; } });
61
+ Object.defineProperty(exports, "utf8Bytes", { enumerable: true, get: function () { return limits_1.utf8Bytes; } });
62
+ var matcher_1 = require("./matcher");
63
+ Object.defineProperty(exports, "Matcher", { enumerable: true, get: function () { return matcher_1.Matcher; } });
64
+ var route_1 = require("./route");
65
+ Object.defineProperty(exports, "CaptureSpec", { enumerable: true, get: function () { return route_1.CaptureSpec; } });
66
+ Object.defineProperty(exports, "FnRoute", { enumerable: true, get: function () { return route_1.FnRoute; } });
67
+ Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return route_1.Router; } });
68
+ Object.defineProperty(exports, "SelectedRecorder", { enumerable: true, get: function () { return route_1.SelectedRecorder; } });
69
+ var scan_1 = require("./scan");
70
+ Object.defineProperty(exports, "ScanEmit", { enumerable: true, get: function () { return scan_1.ScanEmit; } });
71
+ Object.defineProperty(exports, "Transition", { enumerable: true, get: function () { return scan_1.Transition; } });
72
+ var selector_1 = require("./selector");
73
+ Object.defineProperty(exports, "Path", { enumerable: true, get: function () { return selector_1.Path; } });
74
+ Object.defineProperty(exports, "Selector", { enumerable: true, get: function () { return selector_1.Selector; } });
75
+ Object.defineProperty(exports, "keyText", { enumerable: true, get: function () { return selector_1.keyText; } });
76
+ Object.defineProperty(exports, "pathText", { enumerable: true, get: function () { return selector_1.pathText; } });
77
+ var sink_1 = require("./sink");
78
+ Object.defineProperty(exports, "CountSink", { enumerable: true, get: function () { return sink_1.CountSink; } });
79
+ Object.defineProperty(exports, "EventRecorder", { enumerable: true, get: function () { return sink_1.EventRecorder; } });
80
+ Object.defineProperty(exports, "FnSink", { enumerable: true, get: function () { return sink_1.FnSink; } });
81
+ Object.defineProperty(exports, "TreeContract", { enumerable: true, get: function () { return sink_1.TreeContract; } });
82
+ Object.defineProperty(exports, "replay", { enumerable: true, get: function () { return sink_1.replay; } });
83
+ var source_1 = require("./source");
84
+ Object.defineProperty(exports, "Prune", { enumerable: true, get: function () { return source_1.Prune; } });
85
+ Object.defineProperty(exports, "SourceMode", { enumerable: true, get: function () { return source_1.SourceMode; } });
86
+ Object.defineProperty(exports, "ValueSource", { enumerable: true, get: function () { return source_1.ValueSource; } });
87
+ Object.defineProperty(exports, "engineFailure", { enumerable: true, get: function () { return source_1.engineFailure; } });
88
+ Object.defineProperty(exports, "walkValue", { enumerable: true, get: function () { return source_1.walkValue; } });
89
+ var guard_1 = require("./guard");
90
+ Object.defineProperty(exports, "Guarded", { enumerable: true, get: function () { return guard_1.Guarded; } });
91
+ var parser_source_1 = require("./parser-source");
92
+ Object.defineProperty(exports, "ParserSource", { enumerable: true, get: function () { return parser_source_1.ParserSource; } });
93
+ var lines_1 = require("./lines");
94
+ Object.defineProperty(exports, "DEFAULT_CHUNK_BYTES", { enumerable: true, get: function () { return lines_1.DEFAULT_CHUNK_BYTES; } });
95
+ Object.defineProperty(exports, "LineFormat", { enumerable: true, get: function () { return lines_1.LineFormat; } });
96
+ Object.defineProperty(exports, "LinesSource", { enumerable: true, get: function () { return lines_1.LinesSource; } });
97
+ var capability_1 = require("./capability");
98
+ Object.defineProperty(exports, "INCREMENTAL", { enumerable: true, get: function () { return capability_1.INCREMENTAL; } });
99
+ Object.defineProperty(exports, "capability", { enumerable: true, get: function () { return capability_1.capability; } });
100
+ Object.defineProperty(exports, "isIncremental", { enumerable: true, get: function () { return capability_1.isIncremental; } });
101
+ var table_1 = require("./table");
102
+ Object.defineProperty(exports, "Cell", { enumerable: true, get: function () { return table_1.Cell; } });
103
+ Object.defineProperty(exports, "Schema", { enumerable: true, get: function () { return table_1.Schema; } });
104
+ Object.defineProperty(exports, "Table", { enumerable: true, get: function () { return table_1.Table; } });
105
+ Object.defineProperty(exports, "boundColumn", { enumerable: true, get: function () { return table_1.boundColumn; } });
106
+ Object.defineProperty(exports, "columnFromMeta", { enumerable: true, get: function () { return table_1.columnFromMeta; } });
107
+ var table_from_json_1 = require("./table-from-json");
108
+ Object.defineProperty(exports, "TableFromJson", { enumerable: true, get: function () { return table_from_json_1.TableFromJson; } });
109
+ //# sourceMappingURL=transduce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transduce.js","sourceRoot":"","sources":["../src/transduce.ts"],"names":[],"mappings":";AAAA,4CAA4C;;;;AAE5C,gDAAgD;AAChD,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AACpE,mBAAmB;AACnB,EAAE;AACF,2EAA2E;AAC3E,YAAY;AACZ,0EAA0E;AAC1E,oEAAoE;AACpE,0EAA0E;AAC1E,yDAAyD;AACzD,qEAAqE;AACrE,qCAAqC;AACrC,0EAA0E;AAC1E,mBAAmB;AACnB,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,gEAAgE;AAEhE,uDAAuD;AAC1C,QAAA,OAAO,GAAG,OAAO,CAAA;AAE9B,iCAWgB;AAVd,8FAAA,KAAK,OAAA;AACL,qGAAA,YAAY,OAAA;AACZ,iGAAA,QAAQ,OAAA;AACR,iGAAA,QAAQ,OAAA;AACR,mGAAA,UAAU,OAAA;AACV,gGAAA,OAAO,OAAA;AACP,iGAAA,QAAQ,OAAA;AACR,+FAAA,MAAM,OAAA;AACN,+FAAA,MAAM,OAAA;AACN,kGAAA,SAAS,OAAA;AAGX,iCAA4C;AAAnC,6FAAA,IAAI,OAAA;AAAE,6FAAA,IAAI,OAAA;AAAE,+FAAA,MAAM,OAAA;AAE3B,iCAA8E;AAArE,2FAAA,EAAE,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,kGAAA,SAAS,OAAA;AAAE,8FAAA,KAAK,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAAE,gGAAA,OAAO,OAAA;AAE7D,+BAAyE;AAAhE,oGAAA,YAAY,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,kGAAA,UAAU,OAAA;AACzD,mCAAyF;AAAhF,mGAAA,SAAS,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,iGAAA,OAAO,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AACvE,qCAAmC;AAA1B,kGAAA,OAAO,OAAA;AAEhB,iCAAwE;AAA/D,oGAAA,WAAW,OAAA;AAAE,gGAAA,OAAO,OAAA;AAAE,+FAAA,MAAM,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAEvD,+BAA6C;AAApC,gGAAA,QAAQ,OAAA;AAAE,kGAAA,UAAU,OAAA;AAC7B,uCAA8D;AAArD,gGAAA,IAAI,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAAE,mGAAA,OAAO,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAE1C,+BAA+E;AAAtE,iGAAA,SAAS,OAAA;AAAE,qGAAA,aAAa,OAAA;AAAE,8FAAA,MAAM,OAAA;AAAE,oGAAA,YAAY,OAAA;AAAE,8FAAA,MAAM,OAAA;AAE/D,mCAAmF;AAA1E,+FAAA,KAAK,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,mGAAA,SAAS,OAAA;AAEjE,iCAAiC;AAAxB,gGAAA,OAAO,OAAA;AAChB,iDAA8C;AAArC,6GAAA,YAAY,OAAA;AACrB,iCAAsE;AAA7D,4GAAA,mBAAmB,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAErD,2CAAqE;AAA5D,yGAAA,WAAW,OAAA;AAAE,wGAAA,UAAU,OAAA;AAAE,2GAAA,aAAa,OAAA;AAC/C,iCAA0E;AAAjE,6FAAA,IAAI,OAAA;AAAE,+FAAA,MAAM,OAAA;AAAE,8FAAA,KAAK,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,uGAAA,cAAc,OAAA;AAUzD,qDAAiD;AAAxC,gHAAA,aAAa,OAAA"}