@elaraai/e3 1.0.79 → 1.0.81
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 +11 -2
- package/dist/src/browser.d.ts +5 -4
- package/dist/src/browser.d.ts.map +1 -1
- package/dist/src/browser.js +3 -2
- package/dist/src/browser.js.map +1 -1
- package/dist/src/dataset-file.d.ts +17 -19
- package/dist/src/dataset-file.d.ts.map +1 -1
- package/dist/src/dataset-file.js +26 -45
- package/dist/src/dataset-file.js.map +1 -1
- package/dist/src/export.d.ts +2 -3
- package/dist/src/export.d.ts.map +1 -1
- package/dist/src/export.js +150 -80
- package/dist/src/export.js.map +1 -1
- package/dist/src/export.spec.js +177 -57
- package/dist/src/export.spec.js.map +1 -1
- package/dist/src/function.spec.js +29 -58
- package/dist/src/function.spec.js.map +1 -1
- package/dist/src/functions-link.spec.js +19 -17
- package/dist/src/functions-link.spec.js.map +1 -1
- package/dist/src/index.d.ts +56 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/input.d.ts +8 -5
- package/dist/src/input.d.ts.map +1 -1
- package/dist/src/input.js +8 -5
- package/dist/src/input.js.map +1 -1
- package/dist/src/migration.d.ts +172 -0
- package/dist/src/migration.d.ts.map +1 -0
- package/dist/src/migration.js +108 -0
- package/dist/src/migration.js.map +1 -0
- package/dist/src/migration.spec.d.ts +6 -0
- package/dist/src/migration.spec.d.ts.map +1 -0
- package/dist/src/migration.spec.js +197 -0
- package/dist/src/migration.spec.js.map +1 -0
- package/dist/src/mutation-programs.spec.d.ts +6 -0
- package/dist/src/mutation-programs.spec.d.ts.map +1 -0
- package/dist/src/mutation-programs.spec.js +310 -0
- package/dist/src/mutation-programs.spec.js.map +1 -0
- package/dist/src/mutation.d.ts +117 -9
- package/dist/src/mutation.d.ts.map +1 -1
- package/dist/src/mutation.js +104 -46
- package/dist/src/mutation.js.map +1 -1
- package/dist/src/open-beast-link.spec.js +10 -8
- package/dist/src/open-beast-link.spec.js.map +1 -1
- package/dist/src/output.d.ts +117 -0
- package/dist/src/output.d.ts.map +1 -0
- package/dist/src/output.js +119 -0
- package/dist/src/output.js.map +1 -0
- package/dist/src/package.d.ts +7 -5
- package/dist/src/package.d.ts.map +1 -1
- package/dist/src/package.js +98 -8
- package/dist/src/package.js.map +1 -1
- package/dist/src/package.spec.d.ts +6 -0
- package/dist/src/package.spec.d.ts.map +1 -0
- package/dist/src/package.spec.js +16 -0
- package/dist/src/package.spec.js.map +1 -0
- package/dist/src/record-guards.d.ts +41 -0
- package/dist/src/record-guards.d.ts.map +1 -0
- package/dist/src/record-guards.js +44 -0
- package/dist/src/record-guards.js.map +1 -0
- package/dist/src/record-index.d.ts +129 -0
- package/dist/src/record-index.d.ts.map +1 -0
- package/dist/src/record-index.js +144 -0
- package/dist/src/record-index.js.map +1 -0
- package/dist/src/record-index.spec.d.ts +6 -0
- package/dist/src/record-index.spec.d.ts.map +1 -0
- package/dist/src/record-index.spec.js +160 -0
- package/dist/src/record-index.spec.js.map +1 -0
- package/dist/src/record-programs.d.ts +128 -0
- package/dist/src/record-programs.d.ts.map +1 -0
- package/dist/src/record-programs.js +480 -0
- package/dist/src/record-programs.js.map +1 -0
- package/dist/src/record.d.ts.map +1 -1
- package/dist/src/record.js +2 -0
- package/dist/src/record.js.map +1 -1
- package/dist/src/record.spec.js +71 -13
- package/dist/src/record.spec.js.map +1 -1
- package/dist/src/runner.d.ts +6 -9
- package/dist/src/runner.d.ts.map +1 -1
- package/dist/src/runner.js +9 -25
- package/dist/src/runner.js.map +1 -1
- package/dist/src/runner.spec.js +16 -34
- package/dist/src/runner.spec.js.map +1 -1
- package/dist/src/sha256.d.ts +7 -4
- package/dist/src/sha256.d.ts.map +1 -1
- package/dist/src/sha256.js +26 -18
- package/dist/src/sha256.js.map +1 -1
- package/dist/src/sha256.spec.js +10 -0
- package/dist/src/sha256.spec.js.map +1 -1
- package/dist/src/task.d.ts +116 -251
- package/dist/src/task.d.ts.map +1 -1
- package/dist/src/task.js +169 -435
- package/dist/src/task.js.map +1 -1
- package/dist/src/task.spec.js +174 -489
- package/dist/src/task.spec.js.map +1 -1
- package/dist/src/types.d.ts +215 -23
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/src/record.spec.js
CHANGED
|
@@ -8,10 +8,11 @@ import * as fs from 'node:fs';
|
|
|
8
8
|
import * as os from 'node:os';
|
|
9
9
|
import * as path from 'node:path';
|
|
10
10
|
import yauzl from 'yauzl';
|
|
11
|
-
import { East, IntegerType, StringType, FloatType, ArrayType, decodeBeast2For } from '@elaraai/east';
|
|
12
|
-
import { RecordObjectType, MutationObjectType, decodePackageObject, } from '@elaraai/e3-types';
|
|
11
|
+
import { East, IntegerType, StringType, FloatType, ArrayType, DictType, SortedMap, StructType, compareFor, decodeBeast2For, decodeEastIR, isTypeValueEqual, toEastTypeValue, } from '@elaraai/east';
|
|
12
|
+
import { RecordObjectType, MutationObjectType, decodeMigrationObject, decodePackageObject, decodeRecordObject, } from '@elaraai/e3-types';
|
|
13
13
|
import { record, recordsTree } from './record.js';
|
|
14
14
|
import { mutation } from './mutation.js';
|
|
15
|
+
import { migration } from './migration.js';
|
|
15
16
|
import { package_ } from './package.js';
|
|
16
17
|
import { export_ } from './export.js';
|
|
17
18
|
async function readZip(zipPath) {
|
|
@@ -49,7 +50,7 @@ function objectAt(entries, hash) {
|
|
|
49
50
|
throw new Error(`object ${hash} not in bundle`);
|
|
50
51
|
return buf;
|
|
51
52
|
}
|
|
52
|
-
describe('e3.record / e3.mutation', () => {
|
|
53
|
+
describe('e3.record / e3.mutation.reduce', () => {
|
|
53
54
|
it('record() mounts a non-writable dataset at .records.<name> with the initial value', () => {
|
|
54
55
|
const counter = record('counter', IntegerType, 0n);
|
|
55
56
|
assert.strictEqual(counter.kind, 'dataset');
|
|
@@ -59,9 +60,9 @@ describe('e3.record / e3.mutation', () => {
|
|
|
59
60
|
assert.deepStrictEqual(counter.path.map((s) => (s.type === 'field' ? s.value : s.type)), ['records', 'counter']);
|
|
60
61
|
assert.ok(counter.deps.has(recordsTree));
|
|
61
62
|
});
|
|
62
|
-
it('mutation() derives the extra arg types from the reducer signature', () => {
|
|
63
|
+
it('mutation.reduce() derives the extra arg types from the reducer signature', () => {
|
|
63
64
|
const counter = record('counter', IntegerType, 0n);
|
|
64
|
-
const increment = mutation('increment', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by)));
|
|
65
|
+
const increment = mutation.reduce('increment', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by)));
|
|
65
66
|
assert.strictEqual(increment.kind, 'mutation');
|
|
66
67
|
assert.strictEqual(increment.record, counter);
|
|
67
68
|
// [state, by] -> extra args = [by]
|
|
@@ -69,7 +70,7 @@ describe('e3.record / e3.mutation', () => {
|
|
|
69
70
|
});
|
|
70
71
|
it('package() folds mutations onto their record', () => {
|
|
71
72
|
const counter = record('counter', IntegerType, 0n);
|
|
72
|
-
const increment = mutation('increment', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by)));
|
|
73
|
+
const increment = mutation.reduce('increment', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by)));
|
|
73
74
|
// Pass only the mutation; its record is pulled in transitively.
|
|
74
75
|
const pkg = package_('c', '1.0.0', increment);
|
|
75
76
|
assert.ok(pkg.records.counter, 'record registered');
|
|
@@ -78,7 +79,7 @@ describe('e3.record / e3.mutation', () => {
|
|
|
78
79
|
});
|
|
79
80
|
it('preserves a record’s mutations when its package is imported into another', () => {
|
|
80
81
|
const counter = record('counter', IntegerType, 0n);
|
|
81
|
-
const increment = mutation('increment', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by)));
|
|
82
|
+
const increment = mutation.reduce('increment', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by)));
|
|
82
83
|
const inner = package_('inner', '1.0.0', counter, increment);
|
|
83
84
|
assert.ok(inner.records.counter.mutations.increment, 'inner package folds the mutation');
|
|
84
85
|
// Importing `inner` must NOT clobber the record's assembled mutations: the
|
|
@@ -90,23 +91,49 @@ describe('e3.record / e3.mutation', () => {
|
|
|
90
91
|
assert.ok(outer.records.counter.mutations.increment, 'imported record keeps its mutation (would be dropped before the fix)');
|
|
91
92
|
assert.deepStrictEqual(Object.keys(outer.records.counter.mutations), ['increment'], 'exactly the imported mutation survives');
|
|
92
93
|
});
|
|
94
|
+
it('refuses two mutations of one name on a record, wherever the second comes from', () => {
|
|
95
|
+
const counter = record('counter', IntegerType, 0n);
|
|
96
|
+
const reducer = East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by));
|
|
97
|
+
const increment = mutation.reduce('increment', counter, reducer);
|
|
98
|
+
const another = mutation.reduce('increment', counter, reducer);
|
|
99
|
+
// A record keeps one mutation per name. With two it would keep whichever
|
|
100
|
+
// came last, and a caller of `increment` would run the other one.
|
|
101
|
+
assert.throws(() => package_('c', '1.0.0', increment, another), /record 'counter' declares two mutations named 'increment'/);
|
|
102
|
+
assert.throws(() => package_('c', '1.0.0', package_('inner', '1.0.0', increment), another), /two mutations named 'increment'/);
|
|
103
|
+
// One declaration passed twice is one mutation.
|
|
104
|
+
assert.deepStrictEqual(Object.keys(package_('c', '1.0.0', increment, increment).records.counter.mutations), ['increment']);
|
|
105
|
+
});
|
|
106
|
+
it('refuses a mutation name that is not an identifier, the names e3\'s own commits take among them', () => {
|
|
107
|
+
const counter = record('counter', IntegerType, 0n);
|
|
108
|
+
const tally = record('tally', DictType(StringType, IntegerType), new Map());
|
|
109
|
+
const reducer = East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by));
|
|
110
|
+
// A commit is named after its mutation, so '$reset' would read as a reset
|
|
111
|
+
// in the record's history; 'a.b' could not be addressed as record.mutation.
|
|
112
|
+
for (const name of ['$reset', '$migrate:x', 'set-status', 'a.b', '1st', '']) {
|
|
113
|
+
assert.throws(() => mutation.reduce(name, counter, reducer), /e3\.mutation\.reduce requires a name that is an identifier/, name);
|
|
114
|
+
assert.throws(() => mutation.edit(name, tally, reducer), /e3\.mutation\.edit requires a name that is an identifier/, name);
|
|
115
|
+
assert.throws(() => mutation.patch(tally, name), /e3\.mutation\.patch requires a name that is an identifier/, name);
|
|
116
|
+
}
|
|
117
|
+
assert.strictEqual(mutation.reduce('set_status', counter, reducer).name, 'set_status');
|
|
118
|
+
assert.strictEqual(mutation.patch(tally).name, 'patch');
|
|
119
|
+
});
|
|
93
120
|
it('rejects an async reducer body at definition time', () => {
|
|
94
121
|
const counter = record('counter', IntegerType, 0n);
|
|
95
122
|
// Async bodies break CAS-retry safety; the typed overload rejects them at
|
|
96
123
|
// compile time, and the cast checks the runtime guard for dynamic callers.
|
|
97
|
-
assert.throws(() => mutation('bad', counter, East.asyncFunction([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by))), /pure, synchronous|async/i);
|
|
124
|
+
assert.throws(() => mutation.reduce('bad', counter, East.asyncFunction([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by))), /pure, synchronous|async/i);
|
|
98
125
|
});
|
|
99
126
|
it('rejects a sync platform call in the reducer body at definition time', () => {
|
|
100
127
|
const counter = record('counter', IntegerType, 0n);
|
|
101
128
|
// A sync platform call (time/random/io) is an ordinary FunctionIR, so the
|
|
102
129
|
// async check misses it — the body walk must reject it: the CAS retry loop
|
|
103
130
|
// re-runs the reducer, so a platform result is non-deterministic.
|
|
104
|
-
assert.throws(() => mutation('bad', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(East.platform('time_now', [], IntegerType)()).add(by))), /must not call platform functions/);
|
|
131
|
+
assert.throws(() => mutation.reduce('bad', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(East.platform('time_now', [], IntegerType)()).add(by))), /must not call platform functions/);
|
|
105
132
|
});
|
|
106
133
|
it('rejects a sync platform call buried inside a collection lambda', () => {
|
|
107
134
|
const counter = record('counter', IntegerType, 0n);
|
|
108
135
|
// The walk must descend into closure bodies, not just the top level.
|
|
109
|
-
assert.throws(() => mutation('bad', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => {
|
|
136
|
+
assert.throws(() => mutation.reduce('bad', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => {
|
|
110
137
|
$.let(East.value([1n, 2n], ArrayType(IntegerType))
|
|
111
138
|
.map(($, x) => x.add(East.platform('time_now', [], IntegerType)())));
|
|
112
139
|
return state.add(by);
|
|
@@ -117,7 +144,7 @@ describe('e3.record / e3.mutation', () => {
|
|
|
117
144
|
// The typed overload enforces state/return == record type at compile time;
|
|
118
145
|
// a dynamic / cast caller bypasses that, so the definition-time guard must
|
|
119
146
|
// still reject a mismatched reducer (here Integer record vs String reducer).
|
|
120
|
-
assert.throws(() => mutation('bad', counter, East.function([StringType, FloatType], StringType, ($, state, _by) => state)), /record's state type/);
|
|
147
|
+
assert.throws(() => mutation.reduce('bad', counter, East.function([StringType, FloatType], StringType, ($, state, _by) => state)), /record's state type/);
|
|
121
148
|
});
|
|
122
149
|
describe('export round-trip', () => {
|
|
123
150
|
let tmp;
|
|
@@ -125,12 +152,12 @@ describe('e3.record / e3.mutation', () => {
|
|
|
125
152
|
after(() => { fs.rmSync(tmp, { recursive: true, force: true }); });
|
|
126
153
|
it('writes a RecordObject + MutationObject and a writable:false structure leaf', async () => {
|
|
127
154
|
const counter = record('counter', IntegerType, 0n);
|
|
128
|
-
const increment = mutation('increment', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by)));
|
|
155
|
+
const increment = mutation.reduce('increment', counter, East.function([IntegerType, IntegerType], IntegerType, ($, state, by) => state.add(by)));
|
|
129
156
|
const pkg = package_('counters', '1.0.0', counter, increment);
|
|
130
157
|
const zip = path.join(tmp, 'counters.zip');
|
|
131
158
|
await export_(pkg, zip);
|
|
132
159
|
const entries = await readZip(zip);
|
|
133
|
-
const pkgHash = entries.get('packages/counters/1.0.0')
|
|
160
|
+
const pkgHash = decodeBeast2For(StringType)(entries.get('packages/counters/1.0.0.beast2'));
|
|
134
161
|
const pkgObject = decodePackageObject(objectAt(entries, pkgHash));
|
|
135
162
|
// records map points at a RecordObject
|
|
136
163
|
const recHash = pkgObject.records.get('counter');
|
|
@@ -142,6 +169,7 @@ describe('e3.record / e3.mutation', () => {
|
|
|
142
169
|
assert.ok(mutHash, 'mutation in record object');
|
|
143
170
|
const mutObject = decodeBeast2For(MutationObjectType)(objectAt(entries, mutHash));
|
|
144
171
|
assert.strictEqual(mutObject.argTypes.length, 1);
|
|
172
|
+
assert.strictEqual(mutObject.form.type, 'reduce');
|
|
145
173
|
// structure leaf at .records.counter is non-writable
|
|
146
174
|
const structure = pkgObject.data.structure;
|
|
147
175
|
assert.strictEqual(structure.type, 'struct');
|
|
@@ -152,6 +180,36 @@ describe('e3.record / e3.mutation', () => {
|
|
|
152
180
|
// the record's initial state ref is present
|
|
153
181
|
assert.ok(pkgObject.data.refs.get('records/counter'), 'record initial-state ref present');
|
|
154
182
|
});
|
|
183
|
+
it('writes a record\'s migrations in chain order, a step split over the state with the program it runs', async () => {
|
|
184
|
+
const RowV1Type = StructType({ title: StringType });
|
|
185
|
+
const RowV2Type = StructType({ title: StringType, owner: StringType });
|
|
186
|
+
const plans = record('plans', DictType(StringType, RowV2Type), new Map());
|
|
187
|
+
const normalize = migration.value('normalize', plans, East.function([DictType(StringType, RowV1Type)], DictType(StringType, RowV1Type), ($, old) => old));
|
|
188
|
+
const addOwner = migration.rows('add_owner', plans, East.function([StringType, RowV1Type], RowV2Type, ($, _id, row) => ({ title: row.title, owner: 'unassigned' })), { after: normalize });
|
|
189
|
+
const zip = path.join(tmp, 'plans.zip');
|
|
190
|
+
await export_(package_('planning', '2.0.0', addOwner), zip);
|
|
191
|
+
const entries = await readZip(zip);
|
|
192
|
+
const pkgHash = decodeBeast2For(StringType)(entries.get('packages/planning/2.0.0.beast2'));
|
|
193
|
+
const recObject = decodeRecordObject(objectAt(entries, decodePackageObject(objectAt(entries, pkgHash)).records.get('plans')));
|
|
194
|
+
assert.deepStrictEqual(recObject.migrations.map((step) => step.name), ['normalize', 'add_owner']);
|
|
195
|
+
const [whole, split] = recObject.migrations.map((step) => decodeMigrationObject(objectAt(entries, step.migration)));
|
|
196
|
+
assert.strictEqual(whole.form.type, 'value');
|
|
197
|
+
assert.strictEqual(whole.programIr, '', 'a value step runs its own function, and names no program');
|
|
198
|
+
objectAt(entries, whole.bodyIr);
|
|
199
|
+
assert.strictEqual(split.form.type, 'rows');
|
|
200
|
+
assert.ok(isTypeValueEqual(split.from, toEastTypeValue(DictType(StringType, RowV1Type))));
|
|
201
|
+
assert.ok(isTypeValueEqual(split.to, toEastTypeValue(DictType(StringType, RowV2Type))));
|
|
202
|
+
objectAt(entries, split.bodyIr);
|
|
203
|
+
// The program in the bundle is the one that runs: each row out under
|
|
204
|
+
// its key, as the function rewrites it.
|
|
205
|
+
const run = decodeEastIR(objectAt(entries, split.programIr)).compile([]);
|
|
206
|
+
const out = [];
|
|
207
|
+
run(new SortedMap([['p1', { title: 'One' }]], compareFor(StringType)), (key, row) => {
|
|
208
|
+
out.push([key, row]);
|
|
209
|
+
return null;
|
|
210
|
+
});
|
|
211
|
+
assert.deepStrictEqual(out, [['p1', { title: 'One', owner: 'unassigned' }]]);
|
|
212
|
+
});
|
|
155
213
|
});
|
|
156
214
|
});
|
|
157
215
|
//# sourceMappingURL=record.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.spec.js","sourceRoot":"","sources":["../../src/record.spec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"record.spec.js","sourceRoot":"","sources":["../../src/record.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EACpF,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,GAC7E,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YAC1D,IAAI,GAAG;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC1C,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAAC,OAAO,CAAC,SAAS,EAAE,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBAChE,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;oBAChD,IAAI,GAAG;wBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC5B,IAAI,CAAC,UAAU;wBAAE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;oBAC5D,MAAM,MAAM,GAAa,EAAE,CAAC;oBAC5B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3G,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,OAA4B,EAAE,IAAY;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/E,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,gBAAgB,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,eAAe,CACpB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAChE,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,WAAW,EACX,OAAO,EACP,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CACxF,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,mCAAmC;QACnC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,WAAW,EACX,OAAO,EACP,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CACxF,CAAC;QACF,gEAAgE;QAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;QAClF,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,4BAA4B,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,WAAW,EACX,OAAO,EACP,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CACxF,CAAC;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;QAEzF,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,8BAA8B;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,iDAAiD,CAAC,CAAC;QACpF,MAAM,CAAC,EAAE,CACP,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EACzC,sEAAsE,CACvE,CAAC;QACF,MAAM,CAAC,eAAe,CACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAC5C,CAAC,WAAW,CAAC,EACb,wCAAwC,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/D,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,2DAA2D,CAAC,CAAC;QAC7H,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,iCAAiC,CAAC,CAAC;QAC/H,gDAAgD;QAChD,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7H,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gGAAgG,EAAE,GAAG,EAAE;QACxG,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,0EAA0E;QAC1E,4EAA4E;QAC5E,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5E,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,4DAA4D,EAAE,IAAI,CAAC,CAAC;YACjI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAgB,CAAC,EAAE,0DAA0D,EAAE,IAAI,CAAC,CAAC;YACpI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,2DAA2D,EAAE,IAAI,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACvF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,0EAA0E;QAC1E,2EAA2E;QAC3E,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAU,CAAC,EAC5I,0BAA0B,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,0EAA0E;QAC1E,2EAA2E;QAC3E,kEAAkE;QAClE,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EACzF,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EACrF,kCAAkC,CACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,qEAAqE;QACrE,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EACzF,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACf,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;iBAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC,EACL,kCAAkC,CACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,2EAA2E;QAC3E,2EAA2E;QAC3E,6EAA6E;QAC7E,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CACH,QAAQ,CAAC,MAAM,CACb,KAAK,EACL,OAAO,EACP,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAU,CACtF,EACH,qBAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAI,GAAW,CAAC;QAChB,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnE,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,WAAW,EACX,OAAO,EACP,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CACxF,CAAC;YACF,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAC3C,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAExB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAE,CAAC,CAAC;YAC5F,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAElE,uCAAuC;YACvC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAQ,CAAC,CAAC,CAAC;YACjF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAEtD,qEAAqE;YACrE,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,eAAe,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAQ,CAAC,CAAC,CAAC;YACnF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAElD,qDAAqD;YACrD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7C,MAAM,WAAW,GAAI,SAAS,CAAC,KAA0B,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzE,MAAM,IAAI,GAAI,WAAW,CAAC,KAA0B,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAE/C,4CAA4C;YAC5C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,kCAAkC,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oGAAoG,EAAE,KAAK,IAAI,EAAE;YAClH,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAClD,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACtG,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAChD,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,EAC/G,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACxC,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;YAE5D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAE,CAAC,CAAC;YAC5F,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,CAAC,CAAC;YAC/H,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;YAClG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAEpH,MAAM,CAAC,WAAW,CAAC,KAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,KAAM,CAAC,SAAS,EAAE,EAAE,EAAE,0DAA0D,CAAC,CAAC;YACrG,QAAQ,CAAC,OAAO,EAAE,KAAM,CAAC,MAAM,CAAC,CAAC;YAEjC,MAAM,CAAC,WAAW,CAAC,KAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAM,CAAC,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3F,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAM,CAAC,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,QAAQ,CAAC,OAAO,EAAE,KAAM,CAAC,MAAM,CAAC,CAAC;YACjC,qEAAqE;YACrE,wCAAwC;YACxC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CACC,CAAC;YAC1E,MAAM,GAAG,GAAgB,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAClF,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/src/runner.d.ts
CHANGED
|
@@ -55,21 +55,18 @@ export type Runner = {
|
|
|
55
55
|
/**
|
|
56
56
|
* Functions accept the same runners as tasks (symmetric model). `custom`
|
|
57
57
|
* commands must speak the runner CLI convention (`<command…> -i <arg>…
|
|
58
|
-
* -o <out> <ir>`), since
|
|
59
|
-
* Kept as an alias for source compatibility.
|
|
58
|
+
* -o <out> <ir>`), since e3 appends that suffix when it runs a function or a
|
|
59
|
+
* task on one. Kept as an alias for source compatibility.
|
|
60
60
|
*/
|
|
61
61
|
export type FunctionRunner = Runner;
|
|
62
62
|
/**
|
|
63
63
|
* Convert a {@link Runner} to its wire-format {@link RunnerValue} variant
|
|
64
|
-
* (used by `e3.function` / `e3.export`).
|
|
64
|
+
* (used by `e3.function` / `e3.export`).
|
|
65
|
+
*
|
|
66
|
+
* @param r - The runner
|
|
67
|
+
* @returns Its wire variant
|
|
65
68
|
*/
|
|
66
69
|
export declare function runnerToVariant(r: Runner): RunnerValue;
|
|
67
|
-
/**
|
|
68
|
-
* Resolves a {@link Runner} to the argv prefix. The `-i` / `-o` / IR path
|
|
69
|
-
* suffix is appended by {@link task}'s East command IR at evaluation time;
|
|
70
|
-
* this function only produces what goes ahead of those.
|
|
71
|
-
*/
|
|
72
|
-
export declare function runnerToCommand(r: Runner): string[];
|
|
73
70
|
/**
|
|
74
71
|
* The stock platform packages that implement ONE platform contract per
|
|
75
72
|
* runtime. An imported function (#628) whose platform dependency is
|
package/dist/src/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,gEAAgE;AAChE,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,YAAY,GACZ,qBAAqB,CAAC;AAE1B,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GACxB,wBAAwB,GACxB,uBAAuB,CAAC;AAE5B,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GACrB,YAAY,CAAC;AAEjB;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,CAAC,KAAK,SAAS,MAAM,IAAI,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,yEAAyE;AACzE,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAE/B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,MAAM,GACd;IAAE,OAAO,EAAE,SAAS,CAAC;IAAG,SAAS,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAA;CAAE,GAChE;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAA;CAAE,GAClE;IAAE,OAAO,EAAE,QAAQ,CAAC;IAAI,SAAS,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAA;CAAE,GAC/D;IAAE,OAAO,EAAE,QAAQ,CAAC;IAAI,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAExD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAYtD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAIxE,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMxE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,MAG5B,CAAC"}
|
package/dist/src/runner.js
CHANGED
|
@@ -12,23 +12,22 @@
|
|
|
12
12
|
* the typed path stays typo-safe; the `custom` runtime branch is the full
|
|
13
13
|
* escape hatch (any argv).
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* `e3.function` instead stores the runner as a wire variant (`RunnerType`
|
|
20
|
-
* in e3-types) via {@link runnerToVariant}, which excludes the `custom`
|
|
21
|
-
* runtime (see {@link FunctionRunner}).
|
|
15
|
+
* Tasks and functions both store the runner as a wire variant (`RunnerType`
|
|
16
|
+
* in e3-types) via {@link runnerToVariant}, and e3 builds the runner's argv
|
|
17
|
+
* when it runs one. A stock runtime runs a unit through its `exec` command; a
|
|
18
|
+
* `custom` one is run with `run`'s arguments (see {@link FunctionRunner}).
|
|
22
19
|
*/
|
|
23
20
|
import { variant } from '@elaraai/east';
|
|
24
21
|
/**
|
|
25
22
|
* Convert a {@link Runner} to its wire-format {@link RunnerValue} variant
|
|
26
|
-
* (used by `e3.function` / `e3.export`).
|
|
23
|
+
* (used by `e3.function` / `e3.export`).
|
|
24
|
+
*
|
|
25
|
+
* @param r - The runner
|
|
26
|
+
* @returns Its wire variant
|
|
27
27
|
*/
|
|
28
28
|
export function runnerToVariant(r) {
|
|
29
29
|
// The SDK makes `platforms` optional and allows `{ custom: name }` entries;
|
|
30
|
-
// the wire type requires a plain string array — collapse both here
|
|
31
|
-
// like runnerToCommand.
|
|
30
|
+
// the wire type requires a plain string array — collapse both here.
|
|
32
31
|
if (r.runtime === 'custom') {
|
|
33
32
|
return variant('custom', { command: [...r.command] });
|
|
34
33
|
}
|
|
@@ -39,21 +38,6 @@ export function runnerToVariant(r) {
|
|
|
39
38
|
case 'east-c': return variant('east_c', { platforms });
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
|
-
/**
|
|
43
|
-
* Resolves a {@link Runner} to the argv prefix. The `-i` / `-o` / IR path
|
|
44
|
-
* suffix is appended by {@link task}'s East command IR at evaluation time;
|
|
45
|
-
* this function only produces what goes ahead of those.
|
|
46
|
-
*/
|
|
47
|
-
export function runnerToCommand(r) {
|
|
48
|
-
if (r.runtime === 'custom')
|
|
49
|
-
return [...r.command];
|
|
50
|
-
const platforms = r.platforms ?? [];
|
|
51
|
-
const flags = [];
|
|
52
|
-
for (const p of platforms) {
|
|
53
|
-
flags.push('-p', typeof p === 'string' ? p : p.custom);
|
|
54
|
-
}
|
|
55
|
-
return [r.runtime, 'run', ...flags];
|
|
56
|
-
}
|
|
57
41
|
/**
|
|
58
42
|
* The stock platform packages that implement ONE platform contract per
|
|
59
43
|
* runtime. An imported function (#628) whose platform dependency is
|
package/dist/src/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AA8DxC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,CAAS;IACvC,4EAA4E;IAC5E,oEAAoE;IACpE,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACzF,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,KAAK,SAAS,CAAC,CAAG,OAAO,OAAO,CAAC,SAAS,EAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,KAAK,QAAQ,CAAC,CAAI,OAAO,OAAO,CAAC,QAAQ,EAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAyC;IAC3E,CAAC,aAAa,EAAE,wBAAwB,EAAE,YAAY,CAAC;IACvD,CAAC,YAAY,EAAE,uBAAuB,CAAC;IACvC,CAAC,qBAAqB,CAAC;CACxB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,QAAgB;IAC7D,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzE,OAAO,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,OAAO,EAAE,WAAW;IACpB,SAAS,EAAE,CAAC,wBAAwB,CAAC;CACtC,CAAC"}
|
package/dist/src/runner.spec.js
CHANGED
|
@@ -4,57 +4,39 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { describe, it } from 'node:test';
|
|
6
6
|
import assert from 'node:assert/strict';
|
|
7
|
-
import {
|
|
8
|
-
|
|
7
|
+
import { variant } from '@elaraai/east';
|
|
8
|
+
import { DEFAULT_RUNNER, runnerToVariant } from './runner.js';
|
|
9
|
+
describe('runnerToVariant', () => {
|
|
9
10
|
it('default is east-node + east-node-std (cheap to resolve in any e3 project)', () => {
|
|
10
|
-
assert.deepEqual(
|
|
11
|
+
assert.deepEqual(runnerToVariant(DEFAULT_RUNNER), variant('east_node', { platforms: ['@elaraai/east-node-std'] }));
|
|
11
12
|
});
|
|
12
13
|
it('east-py with multiple stock platforms', () => {
|
|
13
14
|
const r = {
|
|
14
15
|
runtime: 'east-py',
|
|
15
16
|
platforms: ['east-py-std', 'east-py-io', 'east-py-datascience'],
|
|
16
17
|
};
|
|
17
|
-
assert.deepEqual(
|
|
18
|
-
});
|
|
19
|
-
it('east-node uses the @elaraai/* scoped platform names verbatim', () => {
|
|
20
|
-
const r = {
|
|
21
|
-
runtime: 'east-node',
|
|
22
|
-
platforms: ['@elaraai/east-node-std', '@elaraai/east-node-io'],
|
|
23
|
-
};
|
|
24
|
-
assert.deepEqual(runnerToCommand(r), ['east-node', 'run', '-p', '@elaraai/east-node-std', '-p', '@elaraai/east-node-io']);
|
|
18
|
+
assert.deepEqual(runnerToVariant(r), variant('east_py', { platforms: ['east-py-std', 'east-py-io', 'east-py-datascience'] }));
|
|
25
19
|
});
|
|
26
20
|
it('east-c with the std platform', () => {
|
|
27
21
|
const r = { runtime: 'east-c', platforms: ['east-c-std'] };
|
|
28
|
-
assert.deepEqual(
|
|
22
|
+
assert.deepEqual(runnerToVariant(r), variant('east_c', { platforms: ['east-c-std'] }));
|
|
29
23
|
});
|
|
30
|
-
it('
|
|
24
|
+
it('collapses explicit { custom: ... } user-defined platforms to their names', () => {
|
|
31
25
|
const r = {
|
|
32
26
|
runtime: 'east-py',
|
|
33
27
|
platforms: ['east-py-std', { custom: 'my-org-platform' }],
|
|
34
28
|
};
|
|
35
|
-
assert.deepEqual(
|
|
36
|
-
});
|
|
37
|
-
it('omits -p flags entirely when platforms is omitted', () => {
|
|
38
|
-
const r = { runtime: 'east-c' };
|
|
39
|
-
assert.deepEqual(runnerToCommand(r), ['east-c', 'run']);
|
|
29
|
+
assert.deepEqual(runnerToVariant(r), variant('east_py', { platforms: ['east-py-std', 'my-org-platform'] }));
|
|
40
30
|
});
|
|
41
|
-
it('
|
|
42
|
-
|
|
43
|
-
assert.deepEqual(runnerToCommand(r), ['east-py', 'run']);
|
|
44
|
-
});
|
|
45
|
-
it('custom runtime returns the command argv verbatim', () => {
|
|
46
|
-
const r = {
|
|
47
|
-
runtime: 'custom',
|
|
48
|
-
command: ['uv', 'run', 'east-py', 'run', '-p', 'east-py-std'],
|
|
49
|
-
};
|
|
50
|
-
assert.deepEqual(runnerToCommand(r), ['uv', 'run', 'east-py', 'run', '-p', 'east-py-std']);
|
|
31
|
+
it('lists no platforms when platforms is omitted', () => {
|
|
32
|
+
assert.deepEqual(runnerToVariant({ runtime: 'east-c' }), variant('east_c', { platforms: [] }));
|
|
51
33
|
});
|
|
52
|
-
it('
|
|
53
|
-
const cmd = ['
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
assert.deepEqual(cmd, ['
|
|
34
|
+
it('custom runtime carries the command verbatim, in a copy', () => {
|
|
35
|
+
const cmd = ['uv', 'run', 'east-py', 'run', '-p', 'east-py-std'];
|
|
36
|
+
const wire = runnerToVariant({ runtime: 'custom', command: cmd });
|
|
37
|
+
assert.deepEqual(wire, variant('custom', { command: ['uv', 'run', 'east-py', 'run', '-p', 'east-py-std'] }));
|
|
38
|
+
wire.value.command.push('--mutated');
|
|
39
|
+
assert.deepEqual(cmd, ['uv', 'run', 'east-py', 'run', '-p', 'east-py-std'], 'caller-supplied command must not be mutated');
|
|
58
40
|
});
|
|
59
41
|
});
|
|
60
42
|
//# sourceMappingURL=runner.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.spec.js","sourceRoot":"","sources":["../../src/runner.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAe,MAAM,aAAa,CAAC;AAE3E,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"runner.spec.js","sourceRoot":"","sources":["../../src/runner.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/src/sha256.d.ts
CHANGED
|
@@ -5,17 +5,20 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* Computes the SHA256 hash of a file.
|
|
7
7
|
*
|
|
8
|
-
* Reads the file
|
|
9
|
-
*
|
|
8
|
+
* Reads the file through one buffer, reused for every read, so the memory it
|
|
9
|
+
* takes is the buffer's whatever the file's size. A stream would allocate a
|
|
10
|
+
* buffer per chunk, which only a garbage collection frees, and hashing makes
|
|
11
|
+
* too little garbage to prompt one.
|
|
10
12
|
*
|
|
11
13
|
* @param path - Absolute or relative path to the file
|
|
14
|
+
* @param onBytes - Hears, after each read, how many of the file's bytes have been
|
|
15
|
+
* hashed
|
|
12
16
|
* @returns The SHA256 hash as a 64-character lowercase hex string
|
|
13
17
|
*
|
|
14
18
|
* @throws {Error} When the file does not exist or cannot be read
|
|
15
19
|
*
|
|
16
20
|
* @remarks
|
|
17
21
|
* - Uses Node.js crypto module for hashing
|
|
18
|
-
* - Streams file contents to avoid memory pressure on large files
|
|
19
22
|
* - Returns lowercase hex encoding (64 characters for SHA256)
|
|
20
23
|
*
|
|
21
24
|
* @example
|
|
@@ -26,7 +29,7 @@
|
|
|
26
29
|
* // hash: "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
|
|
27
30
|
* ```
|
|
28
31
|
*/
|
|
29
|
-
export declare function sha256File(path: string): Promise<string>;
|
|
32
|
+
export declare function sha256File(path: string, onBytes?: (bytes: number) => void): Promise<string>;
|
|
30
33
|
/**
|
|
31
34
|
* Computes the SHA256 hash of a byte array.
|
|
32
35
|
*
|
package/dist/src/sha256.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../../src/sha256.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../../src/sha256.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BjG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEpD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK/C"}
|
package/dist/src/sha256.js
CHANGED
|
@@ -6,22 +6,26 @@
|
|
|
6
6
|
* SHA256 hashing utilities for e3.
|
|
7
7
|
*/
|
|
8
8
|
import { createHash } from 'node:crypto';
|
|
9
|
-
import {
|
|
10
|
-
|
|
9
|
+
import { open, stat } from 'node:fs/promises';
|
|
10
|
+
/** The size of the one buffer a file is hashed through. */
|
|
11
|
+
const HASH_READ_BYTES = 1024 * 1024;
|
|
11
12
|
/**
|
|
12
13
|
* Computes the SHA256 hash of a file.
|
|
13
14
|
*
|
|
14
|
-
* Reads the file
|
|
15
|
-
*
|
|
15
|
+
* Reads the file through one buffer, reused for every read, so the memory it
|
|
16
|
+
* takes is the buffer's whatever the file's size. A stream would allocate a
|
|
17
|
+
* buffer per chunk, which only a garbage collection frees, and hashing makes
|
|
18
|
+
* too little garbage to prompt one.
|
|
16
19
|
*
|
|
17
20
|
* @param path - Absolute or relative path to the file
|
|
21
|
+
* @param onBytes - Hears, after each read, how many of the file's bytes have been
|
|
22
|
+
* hashed
|
|
18
23
|
* @returns The SHA256 hash as a 64-character lowercase hex string
|
|
19
24
|
*
|
|
20
25
|
* @throws {Error} When the file does not exist or cannot be read
|
|
21
26
|
*
|
|
22
27
|
* @remarks
|
|
23
28
|
* - Uses Node.js crypto module for hashing
|
|
24
|
-
* - Streams file contents to avoid memory pressure on large files
|
|
25
29
|
* - Returns lowercase hex encoding (64 characters for SHA256)
|
|
26
30
|
*
|
|
27
31
|
* @example
|
|
@@ -32,7 +36,7 @@ import { stat } from 'node:fs/promises';
|
|
|
32
36
|
* // hash: "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
|
|
33
37
|
* ```
|
|
34
38
|
*/
|
|
35
|
-
export async function sha256File(path) {
|
|
39
|
+
export async function sha256File(path, onBytes) {
|
|
36
40
|
// Check file exists first for a clearer error message
|
|
37
41
|
try {
|
|
38
42
|
const stats = await stat(path);
|
|
@@ -46,19 +50,23 @@ export async function sha256File(path) {
|
|
|
46
50
|
}
|
|
47
51
|
throw err;
|
|
48
52
|
}
|
|
49
|
-
|
|
53
|
+
const file = await open(path, 'r');
|
|
54
|
+
try {
|
|
50
55
|
const hash = createHash('sha256');
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
}
|
|
56
|
+
const buffer = Buffer.allocUnsafe(HASH_READ_BYTES);
|
|
57
|
+
let hashed = 0;
|
|
58
|
+
for (;;) {
|
|
59
|
+
const { bytesRead } = await file.read(buffer, 0, buffer.length, null);
|
|
60
|
+
if (bytesRead === 0)
|
|
61
|
+
return hash.digest('hex');
|
|
62
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
63
|
+
hashed += bytesRead;
|
|
64
|
+
onBytes?.(hashed);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await file.close();
|
|
69
|
+
}
|
|
62
70
|
}
|
|
63
71
|
/**
|
|
64
72
|
* Computes the SHA256 hash of a byte array.
|
package/dist/src/sha256.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sha256.js","sourceRoot":"","sources":["../../src/sha256.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sha256.js","sourceRoot":"","sources":["../../src/sha256.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE9C,2DAA2D;AAC3D,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,OAAiC;IAC9E,sDAAsD;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QACnD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,SAAS,CAAC;YACR,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACtE,IAAI,SAAS,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;YAC3C,MAAM,IAAI,SAAS,CAAC;YACpB,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mEAAmE,IAAI,GAAG,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC"}
|
package/dist/src/sha256.spec.js
CHANGED
|
@@ -47,6 +47,16 @@ describe('sha256', () => {
|
|
|
47
47
|
const expectedHash = sha256Bytes(binaryData);
|
|
48
48
|
assert.strictEqual(hash, expectedHash);
|
|
49
49
|
});
|
|
50
|
+
it('hashes a file larger than the buffer it is read through', async () => {
|
|
51
|
+
const filePath = join(testDir, 'large.bin');
|
|
52
|
+
// Two and a half megabyte reads and a few bytes more: the last read is
|
|
53
|
+
// partial.
|
|
54
|
+
const data = Buffer.alloc(2.5 * 1024 * 1024 + 7);
|
|
55
|
+
for (let i = 0; i < data.length; i++)
|
|
56
|
+
data[i] = (i * 31 + (i >> 11)) & 0xff;
|
|
57
|
+
writeFileSync(filePath, data);
|
|
58
|
+
assert.strictEqual(await sha256File(filePath), sha256Bytes(data));
|
|
59
|
+
});
|
|
50
60
|
it('throws for non-existent file', async () => {
|
|
51
61
|
const filePath = join(testDir, 'does-not-exist.txt');
|
|
52
62
|
await assert.rejects(() => sha256File(filePath), (err) => {
|