@elaraai/e3-cloud-files 1.0.97 → 1.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 +208 -64
- package/dist/src/authoring.d.ts +42 -11
- package/dist/src/authoring.d.ts.map +1 -1
- package/dist/src/authoring.js +41 -9
- package/dist/src/authoring.js.map +1 -1
- package/dist/src/compat.d.ts +629 -13
- package/dist/src/compat.d.ts.map +1 -1
- package/dist/src/compat.js +115 -16
- package/dist/src/compat.js.map +1 -1
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/s3/index.d.ts +3 -1
- package/dist/src/s3/index.d.ts.map +1 -1
- package/dist/src/s3/index.js +31 -1
- package/dist/src/s3/index.js.map +1 -1
- package/dist/src/storage/index.d.ts +13 -1
- package/dist/src/storage/index.d.ts.map +1 -1
- package/dist/src/storage/index.js +140 -5
- package/dist/src/storage/index.js.map +1 -1
- package/dist/src/sync/engine.d.ts +33 -3
- package/dist/src/sync/engine.d.ts.map +1 -1
- package/dist/src/sync/engine.js +68 -7
- package/dist/src/sync/engine.js.map +1 -1
- package/dist/src/sync/index.d.ts +1 -1
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +1 -1
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/memory.d.ts +11 -3
- package/dist/src/sync/memory.d.ts.map +1 -1
- package/dist/src/sync/memory.js +20 -4
- package/dist/src/sync/memory.js.map +1 -1
- package/dist/src/sync/push.d.ts +9 -1
- package/dist/src/sync/push.d.ts.map +1 -1
- package/dist/src/sync/push.js +48 -15
- package/dist/src/sync/push.js.map +1 -1
- package/dist/test/decode.examples.d.ts +9 -4
- package/dist/test/decode.examples.d.ts.map +1 -1
- package/dist/test/decode.examples.js +15 -3
- package/dist/test/decode.examples.js.map +1 -1
- package/dist/test/typed.examples.d.ts +97 -4
- package/dist/test/typed.examples.d.ts.map +1 -1
- package/dist/test/typed.examples.js +80 -13
- package/dist/test/typed.examples.js.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -13,27 +13,33 @@ changed, the same way on a local repository and on a deployed workspace.
|
|
|
13
13
|
East's JSON, as CSV, or as text. Or, named with a **type**, a beast2 file
|
|
14
14
|
arrives as the value it holds, an input of that type with no task in
|
|
15
15
|
between, a collection of any size.
|
|
16
|
-
- **Records are seeded and fed from files.** A record
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
- **Records are seeded and fed from files.** A record may be seeded from a
|
|
17
|
+
file (`upload.record`): pending until its file arrives, which is its
|
|
18
|
+
first state, and in its history the seed names the file. A record's
|
|
19
|
+
mutation may be fed by files: each new file is the mutation's one
|
|
20
|
+
argument, applied once.
|
|
21
|
+
- **Push from disk, or from a workspace.** `e3-cloud files push` puts files
|
|
22
|
+
from your machine into a source and takes them in, with your e3 login
|
|
23
|
+
alone where the source is the deployment's own bucket. A value an e3
|
|
24
|
+
workspace computes (`dataset:dev.customer_book`) pushes as the file of its
|
|
25
|
+
value would, with no file kept by hand, and the history names the dataset.
|
|
23
26
|
- **Nothing polls.** A sync runs when someone asks for it, and reads only the
|
|
24
27
|
files that changed since the last one.
|
|
25
28
|
|
|
26
|
-
Its version is
|
|
27
|
-
|
|
29
|
+
Its version is e3 cloud's own, shared by every `@elaraai/e3-cloud-*` package.
|
|
30
|
+
Each release is built with one release of east and e3, which its peers name
|
|
31
|
+
exactly.
|
|
28
32
|
|
|
29
33
|
## Install
|
|
30
34
|
|
|
31
35
|
```bash
|
|
32
|
-
npm install @elaraai/e3-cloud-files@<
|
|
36
|
+
npm install @elaraai/e3-cloud-files@<release>
|
|
33
37
|
```
|
|
34
38
|
|
|
35
|
-
|
|
36
|
-
`
|
|
39
|
+
Install the release built with the e3 your deployment runs, beside its peers
|
|
40
|
+
at the versions it names (`npm view @elaraai/e3-cloud-files@<release>
|
|
41
|
+
peerDependencies`): `@elaraai/east` and `@elaraai/e3`. The `e3-cloud` CLI
|
|
42
|
+
(`@elaraai/e3-cloud-cli`) of the same release deploys and syncs.
|
|
37
43
|
|
|
38
44
|
## Declaring the files
|
|
39
45
|
|
|
@@ -68,6 +74,7 @@ export default Files.manifest([upload]);
|
|
|
68
74
|
| `latest(input, { prefix, include?, type })` | The greatest key, a beast2 file of `type` | `type` | as a typed `file` |
|
|
69
75
|
| `folder(input, { prefix, include? })` | Every key under the prefix that matches, by its path under the prefix | `Dict<String, Blob>` | 64 MiB less 64 KiB each |
|
|
70
76
|
| `listing(input, { prefix, include? })` | The same keys' size, time and ETag, without their bytes | `Dict<String, Struct{size, modified, etag}>` | none |
|
|
77
|
+
| `record(name, type, { key } \| { prefix, include? }, parts?)` | One key, or the greatest under a prefix: a beast2 file of `type`, the record's first state and, while unmutated, its state again | the record's (`e3.record(name, type, parts)`: its indexes, mutations and migrations, no initial value) | as a typed `file` |
|
|
71
78
|
| `mutation(def, { key } \| { prefix, include? })` | One key, or every file under a prefix its glob matches, each new one in key order: a beast2 file of the mutation's one argument's type | (the mutation's, as declared) | 1 GiB |
|
|
72
79
|
|
|
73
80
|
- **Each shape returns an ordinary `e3.input`.** It has no default, so it
|
|
@@ -88,27 +95,17 @@ export default Files.manifest([upload]);
|
|
|
88
95
|
in `Files.manifest` two sources of one name or two shapes filling one
|
|
89
96
|
target.
|
|
90
97
|
|
|
91
|
-
##
|
|
98
|
+
## A typed file
|
|
92
99
|
|
|
93
|
-
A
|
|
94
|
-
|
|
95
|
-
all write it. A `file` or `latest` that names a `type` is an input of that
|
|
96
|
-
type, and the sync takes the file in as the value it holds, with no task in
|
|
97
|
-
between:
|
|
100
|
+
A `file` or `latest` that names a `type` is an input of that type, and the
|
|
101
|
+
sync takes the file in as the value it holds, with no task in between:
|
|
98
102
|
|
|
99
103
|
```ts
|
|
100
104
|
// src/package.ts
|
|
101
105
|
export const Price = StructType({ sku: StringType, price: FloatType });
|
|
102
106
|
export const prices = upload.file('prices', { key: 'prices.beast2', type: ArrayType(Price) }); // an input of Array<Price>
|
|
103
107
|
export const stock = upload.latest('stock', { prefix: 'stock/', type: ArrayType(Stock) }); // the greatest key, typed
|
|
104
|
-
|
|
105
|
-
export const priceBook = e3.record('price_book', DictType(StringType, FloatType), new Map());
|
|
106
|
-
export const loadPrices = e3.mutation.reduce('load_prices', priceBook, East.function([PriceBook, ArrayType(Price)], PriceBook, …));
|
|
107
|
-
export const summary = e3.task('price_summary', [prices, priceBook], …); // used as any dataset
|
|
108
|
-
|
|
109
|
-
// src/files.ts
|
|
110
|
-
upload.mutation(loadPrices, { prefix: 'deltas/', include: '*.beast2' }); // each new delta file calls load_prices with its value
|
|
111
|
-
export default Files.manifest([upload]);
|
|
108
|
+
export const summary = e3.task('price_summary', [prices], …); // used as any dataset
|
|
112
109
|
```
|
|
113
110
|
|
|
114
111
|
- **The header first.** The sync reads a typed file's beast2 header before
|
|
@@ -123,21 +120,174 @@ export default Files.manifest([upload]);
|
|
|
123
120
|
the fix (write it again with a current writer).
|
|
124
121
|
- **The same bytes again change nothing.** A file re-uploaded unchanged (a
|
|
125
122
|
new ETag, the same SHA-256) gives the same value: nothing downstream runs.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
123
|
+
The report counts it `changed`, not `updated`.
|
|
124
|
+
|
|
125
|
+
## A record seeded from a file
|
|
126
|
+
|
|
127
|
+
`upload.record(name, type, { key }, parts)` (or `{ prefix, include }`, the
|
|
128
|
+
greatest key) declares `e3.record(name, type, parts)` with no initial value,
|
|
129
|
+
and returns the record, used in tasks as any record. A record is declared
|
|
130
|
+
whole, so its indexes, mutations and migrations are its `parts`, as
|
|
131
|
+
`e3.record` takes them; an initial value is refused, since its file is its
|
|
132
|
+
first state:
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
// src/package.ts
|
|
136
|
+
export const Customer = StructType({ name: StringType, tier: IntegerType });
|
|
137
|
+
export const CustomerBook = DictType(StringType, Customer);
|
|
138
|
+
export const customers = upload.record('customers', CustomerBook, { key: 'customers.beast2' }, {
|
|
139
|
+
mutations: (mutation) => ({
|
|
140
|
+
set_tier: mutation.reduce(East.function([CustomerBook, StringType, IntegerType], CustomerBook, …)),
|
|
141
|
+
}),
|
|
142
|
+
});
|
|
143
|
+
export const customerCount = e3.task('customer_count', [customers], …);
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
- **Pending until its file.** The record has no state until its file
|
|
147
|
+
arrives, which is its first state (`$init`): nothing runs on an empty
|
|
148
|
+
state first, and the tasks over it wait as they wait on an unset input,
|
|
149
|
+
the run completing without them. The workspace page shows it **Pending**,
|
|
150
|
+
its own page says what seeds it, and `files status` prints `pending`.
|
|
151
|
+
- **Seeded again while unmutated.** A changed file while nothing has mutated
|
|
152
|
+
the record since its seed is its state again (`$seed`). Once mutated the
|
|
153
|
+
record is kept (the report says how many mutations since the seed), until
|
|
154
|
+
`files sync --reset <record>` (or `files push --reset <record>`) takes the
|
|
155
|
+
file as its state over whatever was done.
|
|
156
|
+
- **In its history** the seed reads as any commit, through the `files`
|
|
157
|
+
channel: "Initialised from customers.beast2 (12,004 rows)", "Seeded again
|
|
158
|
+
from customers.beast2 (12,100 rows)", on the record's page and in
|
|
159
|
+
`e3-cloud records history`; a file pushed from a dataset names it too,
|
|
160
|
+
with its value's hash ("…, from dev.customer_book at 3f9a2b1c4d5e"). A
|
|
161
|
+
rollback to an earlier seed brings its state back, as to any commit.
|
|
162
|
+
- **A deploy that cannot keep the record** (its type changed) under
|
|
163
|
+
`--schema reset` unassigns it: pending again, seeded by the next version's
|
|
164
|
+
file once the new declarations are deployed.
|
|
165
|
+
- The file is taken in as a typed input is (by pieces, resumable), then
|
|
166
|
+
committed as a system commit with the file's key, ETag and SHA-256 as its
|
|
167
|
+
arguments (and, for a file pushed from a dataset, the dataset's path and
|
|
168
|
+
its value's hash after them), under one hold of the repository's running
|
|
169
|
+
work. The report numbers each seed among the record's: `$init #1`, then
|
|
170
|
+
`$seed #2`, and so on.
|
|
171
|
+
|
|
172
|
+
## A record fed through a mutation
|
|
173
|
+
|
|
174
|
+
`upload.mutation(def, { key })` or `{ prefix, include }` feeds a record's
|
|
175
|
+
mutation: `def` is one the record declares, `record.mutations.<name>`, a
|
|
176
|
+
`reduce` or an `edit` taking exactly one argument (a `patch` cannot be fed),
|
|
177
|
+
and each file is that argument:
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
// src/package.ts
|
|
181
|
+
export const PriceBook = DictType(StringType, FloatType);
|
|
182
|
+
export const priceBook = e3.record('price_book', PriceBook, {
|
|
183
|
+
initial: new Map(),
|
|
184
|
+
mutations: (mutation) => ({
|
|
185
|
+
load_prices: mutation.reduce(East.function([PriceBook, ArrayType(Price)], PriceBook, …)),
|
|
186
|
+
}),
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// src/files.ts
|
|
190
|
+
upload.mutation(priceBook.mutations.load_prices, { prefix: 'deltas/', include: '*.beast2' }); // each new delta file calls load_prices with its value
|
|
191
|
+
export default Files.manifest([upload]);
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
- **Once per file.** Every new file the mapping selects is applied, in key
|
|
195
|
+
order, once by its bytes' hash: a sync run again applies nothing twice,
|
|
196
|
+
and the same bytes under another name are applied no more.
|
|
197
|
+
- **The record's rules decide.** A file the mutation refuses (`invalid`,
|
|
198
|
+
`failed`, `timed_out`) is reported with what it said and tried again only
|
|
199
|
+
once the file changes, and the files after it wait; a feed of a record
|
|
200
|
+
with no state yet, or one busy, waits for the next sync. Its commit reads
|
|
201
|
+
in the record's history as any mutation's, through the `files` channel,
|
|
202
|
+
naming the file it was fed.
|
|
203
|
+
|
|
204
|
+
## Pushing files from disk
|
|
205
|
+
|
|
206
|
+
`e3-cloud files push` puts files from your machine into a source and takes
|
|
207
|
+
them in: put, then one sync of what was put, idempotent and safe to repeat.
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
$ e3-cloud files push https://e3.example.com/repos/acme dev ./data/prices.beast2 ./data/deltas/2026-10-19.beast2
|
|
211
|
+
upload s3://acme-files/acme/dev/
|
|
212
|
+
prices.beast2 → prices Array<Struct{sku, price}> 38 MiB put taken in 412,310 rows
|
|
213
|
+
2026-10-19.beast2 → mutation:price_book.load_prices load_prices 1 MiB put committed 9f2c1a0b7e3d
|
|
214
|
+
Next: e3 dataflow run https://e3.example.com/repos/acme dev
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
- **Each file is matched to the mapping that takes it**: a `file` by its
|
|
218
|
+
name, a `latest` under its prefix (a greater key there would shadow it:
|
|
219
|
+
refused `not_latest`), a directory to the `folder`; or `--as <target>`
|
|
220
|
+
names one for every file (`orders`, `record:customers`,
|
|
221
|
+
`mutation:price_book.load_prices`). A file no mapping takes, or several
|
|
222
|
+
would, is refused naming them.
|
|
223
|
+
- **Checked before it is put**: against the mapping's type (the file's
|
|
224
|
+
header is read) and its limit.
|
|
225
|
+
- **The deployment's own bucket needs no credentials of yours**: the
|
|
226
|
+
platform signs the upload, bound to the file's SHA-256, one PUT up to
|
|
227
|
+
5 GiB or a multipart upload in 64 MiB parts. A bucket the deployment lists
|
|
228
|
+
as a source is written with your own credentials (`--profile`); a local
|
|
229
|
+
repository's sources, with the binding's profile.
|
|
230
|
+
- **Unchanged once it is there**: a file the source holds already, by its
|
|
231
|
+
hash and ETag, is `unchanged`, and running the command again puts only
|
|
232
|
+
what is not there. `--dry-run` plans and puts nothing.
|
|
233
|
+
- The output is a row per file: the file, its target and kind, its size,
|
|
234
|
+
`put`, `unchanged` or `refused`, and what the sync did (`taken in` with
|
|
235
|
+
the rows, `$init #1` or `$seed #n` with the rows, the mutation with its
|
|
236
|
+
commit, `kept`, or the refusal). The command exits 1 when any file was
|
|
237
|
+
refused or failed.
|
|
238
|
+
|
|
239
|
+
### A workspace's dataset
|
|
240
|
+
|
|
241
|
+
A value an e3 workspace computes (a task's output, an input or a record)
|
|
242
|
+
pushes as the file of its value would, with no file kept by hand: name it
|
|
243
|
+
`dataset:<workspace>.<name>` among the paths, in the repository `--from`
|
|
244
|
+
names. That is a local repository's path or a repository's URL, and
|
|
245
|
+
defaults as e3's own `[repo]` does (`$E3_REPO`, then `.`). Files,
|
|
246
|
+
directories and datasets mix in one push.
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
$ e3-cloud files push https://e3.example.com/repos/acme dev dataset:dev.customers --from ./archive
|
|
250
|
+
upload s3://acme-files/acme/dev/
|
|
251
|
+
dataset:dev.customers (task output) → record:customers seed 3 MiB put $init #1 12,004 rows
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
- **Matched by its name**: a dataset goes to the `file` or `latest`
|
|
255
|
+
mapping that fills the input or the record of its name
|
|
256
|
+
(`dataset:dev.customers` → `record:customers`), else `--as` names its
|
|
257
|
+
target, any `file` or `latest` mapping's (a mutation's too). It is put at
|
|
258
|
+
a `file` mapping's key, or under a `latest` mapping's prefix as
|
|
259
|
+
`<name>.beast2` (refused `not_latest` as a file is). A `folder` or a
|
|
260
|
+
`listing` takes no dataset: a dataset is one value.
|
|
261
|
+
- **Its bytes are its value's**, as `e3 dataset get -f beast2` writes it,
|
|
262
|
+
its header its declared type: read from the repository a segment at a
|
|
263
|
+
time, never held whole, and checked against the mapping's type before
|
|
264
|
+
anything is put (`type_mismatch`, naming both). They are read once to
|
|
265
|
+
measure them and again as they upload, and a dataset a run writes again in
|
|
266
|
+
between fails in its row, never put as something else: push it again.
|
|
267
|
+
- **The same stored value is `unchanged`**: nothing put, nothing downstream
|
|
268
|
+
runs. A dataset changed since (a run, a value set) is put and taken in by
|
|
269
|
+
the target's rules: a record seeded again while nothing has mutated it,
|
|
270
|
+
kept once something has, seeded over it on `--reset`.
|
|
271
|
+
- **Refused in its row**, the rest going on: a dataset that is unassigned (a
|
|
272
|
+
task output not produced since its workspace's last deploy, an input never
|
|
273
|
+
set, a record with no state yet), or one the workspace doesn't hold.
|
|
274
|
+
- **Named where it lands**: the object is put with metadata naming the
|
|
275
|
+
dataset and its value's hash (`e3-dataset`, `e3-dataset-hash`), and a
|
|
276
|
+
seed's or a feed's commit records them, so its history reads "Initialised
|
|
277
|
+
from customers.beast2 (12,004 rows), from dev.customers at 3f9a2b1c4d5e".
|
|
278
|
+
- A local repository works at either end: the push reads a local
|
|
279
|
+
repository's datasets through e3 on your machine, and a deployed one's
|
|
280
|
+
through its API with your e3 login.
|
|
281
|
+
|
|
282
|
+
## Making a beast2 file
|
|
283
|
+
|
|
284
|
+
A beast2 file already is an East value. The East SDK writes one from a value
|
|
285
|
+
(`encodeBeast2For(T)(value)`), or a collection of any size by elements
|
|
286
|
+
(`Beast2ElementWriter`, which the platform's own tests use for files of a
|
|
287
|
+
gibibyte); east-py writes one from Python; `e3 convert` converts a file of
|
|
288
|
+
another format; `e3 dataset get -f beast2` writes any dataset of a workspace
|
|
289
|
+
as one, though a push takes the dataset itself (A workspace's dataset,
|
|
290
|
+
above). A typed mapping takes it as it stands, its header saying its type.
|
|
141
291
|
|
|
142
292
|
## Decoding in a task
|
|
143
293
|
|
|
@@ -213,28 +363,12 @@ e3 dataflow run ./repo dev
|
|
|
213
363
|
what a sync would take and takes nothing. A sync doesn't run the dataflow:
|
|
214
364
|
`e3 dataflow run` does, and the sync prints the command when anything
|
|
215
365
|
changed.
|
|
216
|
-
- **`files push`** puts files from disk
|
|
217
|
-
|
|
218
|
-
`latest` under its prefix, a directory to the `folder`; or `--as <target>`
|
|
219
|
-
names one for every file), checked against the mapping's type and limit,
|
|
220
|
-
put where the source is bound (with your e3 login alone where that is the
|
|
221
|
-
deployment's own bucket: the platform signs the upload, bound to the
|
|
222
|
-
file's SHA-256; with your own credentials, `--profile`, elsewhere), then
|
|
223
|
-
one sync of what was put. A file the source holds already is `unchanged`;
|
|
224
|
-
`--dry-run` plans and puts nothing. Running it again puts only what is
|
|
225
|
-
not there.
|
|
366
|
+
- **`files push`** puts files from disk, and workspaces' datasets, into a
|
|
367
|
+
source and takes them in (Pushing files from disk, above).
|
|
226
368
|
- **`files status`** shows each mapping with its shape, its type, the file
|
|
227
369
|
it holds and the commit it made (or `pending` for a record not yet
|
|
228
370
|
seeded), where each source is bound, and the last sync.
|
|
229
371
|
|
|
230
|
-
```
|
|
231
|
-
$ e3-cloud files push https://e3.example.com/repos/acme dev ./data/prices.beast2 ./data/deltas/2026-10-19.beast2
|
|
232
|
-
upload s3://acme-files/acme/dev/
|
|
233
|
-
prices.beast2 → prices Array<Struct{sku, price}> 38 MiB put taken in 412,310 rows
|
|
234
|
-
2026-10-19.beast2 → mutation:price_book.load_prices load_prices 1 MiB put committed 9f2c1a0b7e3d
|
|
235
|
-
Next: e3 dataflow run https://e3.example.com/repos/acme dev
|
|
236
|
-
```
|
|
237
|
-
|
|
238
372
|
A sync is safe to repeat and to stop. Each input is remembered only once it
|
|
239
373
|
is written, so a sync that stops part way takes the rest next time.
|
|
240
374
|
|
|
@@ -368,10 +502,20 @@ In `@elaraai/e3-cloud-types`, re-exported here:
|
|
|
368
502
|
typed value taken (`FilesTakenType`: its rows), the commit a seed or feed
|
|
369
503
|
made, and why a seed was kept or a feed waits.
|
|
370
504
|
- `FilesStatusType` (each mapping with what it holds and whether its record
|
|
371
|
-
is pending), `FilesProblemType`, the push's `FilesPushRequestType`
|
|
372
|
-
`
|
|
373
|
-
|
|
374
|
-
|
|
505
|
+
is pending), `FilesProblemType`, the push's `FilesPushRequestType` (each
|
|
506
|
+
file's `FilesPushFileType`, with the dataset it is the value of, if one)
|
|
507
|
+
and `FilesPushPlanType`.
|
|
508
|
+
- `FilesSeedCommitType`: a seed's commit, `$init` or `$seed`, and its number
|
|
509
|
+
among the record's seeds, in a mapping's report.
|
|
510
|
+
- `FilesDatasetOriginType`: where a pushed file came from, a dataset's path
|
|
511
|
+
and its value's hash, as the object's metadata carries it
|
|
512
|
+
(`filesDatasetMetadata`, read back by `filesDatasetOriginOf`).
|
|
513
|
+
- Values stored by earlier versions (the first: mappings by input, a refusal
|
|
514
|
+
as one text; the second: a record's seeds not counted) are read by their
|
|
515
|
+
header's type and lifted (`@elaraai/e3-cloud-files/compat`):
|
|
516
|
+
declarations, ledgers and reports a workspace stored before this version
|
|
517
|
+
read as they were, and are written again in the current form on their next
|
|
518
|
+
write. A local repository's state file says its version (`version: 3`).
|
|
375
519
|
- The inputs' types: `FilesFileType` (`Blob`), `FilesFolderType`
|
|
376
520
|
(`Dict<String, Blob>`), `FilesListingType`.
|
|
377
521
|
|
|
@@ -384,7 +528,7 @@ In `@elaraai/e3-cloud-types`, re-exported here:
|
|
|
384
528
|
| `@elaraai/e3-cloud-files/sync` | The sync (`syncFiles`) over what reads, writes and remembers, the push's plan (`planPush`), and the ports in memory for tests |
|
|
385
529
|
| `@elaraai/e3-cloud-files/storage` | The sync's writer over an e3 store, and the cloud's over a staging (needs `@elaraai/e3-core`) |
|
|
386
530
|
| `@elaraai/e3-cloud-files/s3` | The sync's reader of a bucket (needs `@aws-sdk/client-s3`) |
|
|
387
|
-
| `@elaraai/e3-cloud-files/compat` | The
|
|
531
|
+
| `@elaraai/e3-cloud-files/compat` | The earlier versions' stored types, and their lift into the current ones |
|
|
388
532
|
| `@elaraai/e3-cloud-files/examples/*` | The worked examples (`orders`, `typed`) and the decoding examples (`decode`) |
|
|
389
533
|
|
|
390
534
|
## License
|
package/dist/src/authoring.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* export const orders = upload.file('orders', { key: 'orders.beast2', type: ArrayType(Order) }); // an Array<Order>
|
|
13
13
|
* export const stock = upload.latest('stock', { prefix: 'stock/', type: ArrayType(Stock) });
|
|
14
14
|
* export const files = upload.folder('invoices', { prefix: 'invoices/', include: '*.pdf' });
|
|
15
|
-
* upload.mutation(
|
|
15
|
+
* upload.mutation(priceBook.mutations.load_prices, { key: 'prices.beast2' }); // each new file calls it
|
|
16
16
|
* export default Files.manifest([upload]);
|
|
17
17
|
* ```
|
|
18
18
|
*
|
|
@@ -21,20 +21,33 @@
|
|
|
21
21
|
* them; until the first, they are unassigned. A `file` or `latest` that
|
|
22
22
|
* names a `type` is an input of that type, filled with the beast2 value the
|
|
23
23
|
* file holds; one that names none is a `Blob`, filled with the file's
|
|
24
|
-
* bytes. A
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* bytes. A record seeded here is an `e3.record` with no initial value,
|
|
25
|
+
* declared whole with its indexes, mutations and migrations. A mutation fed
|
|
26
|
+
* here is one a record of the package declares, a `reduce` or an `edit`
|
|
27
|
+
* taking one argument (`record.mutations.<name>`): a sync calls it once with
|
|
28
|
+
* each new file's value. What each source's files fill is the
|
|
29
|
+
* {@link Files.manifest}, which `e3-cloud files deploy` deploys beside the
|
|
30
|
+
* package.
|
|
28
31
|
*
|
|
29
32
|
* @packageDocumentation
|
|
30
33
|
*/
|
|
31
|
-
import e3, { type MutationDef } from '@elaraai/e3';
|
|
34
|
+
import e3, { type IndexDraft, type MutationDef, type MutationDraft, type RecordConfig } from '@elaraai/e3';
|
|
32
35
|
import { type EastType } from '@elaraai/east';
|
|
33
36
|
import { FilesFileType, FilesFolderType, FilesListingType, type FilesManifest, type FilesMapping, type FilesProblem } from '@elaraai/e3-cloud-types';
|
|
34
37
|
/** The input a declaration makes: an `e3.input` of its type, with no default. */
|
|
35
38
|
export type FilesInput<Name extends string, T extends EastType> = ReturnType<typeof e3.input<Name, T>>;
|
|
36
|
-
/** The mutation a feed declaration hands back:
|
|
39
|
+
/** The mutation a feed declaration hands back: its record's definition, as it was given. */
|
|
37
40
|
export type FilesMutation<M extends MutationDef> = M;
|
|
41
|
+
/**
|
|
42
|
+
* What a record seeded from a file is declared with beside its file: its
|
|
43
|
+
* indexes, mutations and migrations, as `e3.record` takes them, and never an
|
|
44
|
+
* initial value, since its file is its first state.
|
|
45
|
+
*
|
|
46
|
+
* @typeParam T - The record's state type
|
|
47
|
+
* @typeParam I - Its indexes, as `indexes` returns them
|
|
48
|
+
* @typeParam M - Its mutations, as `mutations` returns them
|
|
49
|
+
*/
|
|
50
|
+
export type FilesRecordParts<T extends EastType, I extends object, M extends object> = Omit<RecordConfig<T, I, M>, 'initial'>;
|
|
38
51
|
/** One file, by its key relative to where the workspace binds the source. */
|
|
39
52
|
export interface FilesKeySpec {
|
|
40
53
|
readonly key: string;
|
|
@@ -113,14 +126,32 @@ export declare class FilesSource {
|
|
|
113
126
|
* @returns The input, for tasks to take
|
|
114
127
|
*/
|
|
115
128
|
listing<Name extends string>(input: Name, spec: FilesSelection): FilesInput<Name, typeof FilesListingType>;
|
|
129
|
+
/**
|
|
130
|
+
* A record seeded from a file: declared with no initial value, so it is
|
|
131
|
+
* pending until its file arrives, which is its first state (`$init`;
|
|
132
|
+
* nothing runs on an empty state first, and its dependents wait as they
|
|
133
|
+
* wait on an unset input); seeded again (`$seed`) while nothing has
|
|
134
|
+
* mutated it since, or when a sync is asked to reset it; kept otherwise.
|
|
135
|
+
* It is declared whole, as any record is: its indexes, mutations and
|
|
136
|
+
* migrations are given here, as `e3.record` takes them.
|
|
137
|
+
*
|
|
138
|
+
* @param name - The record's name
|
|
139
|
+
* @param type - Its state's type, which the file must hold
|
|
140
|
+
* @param spec - One file (`key`), or the newest under a prefix (`prefix`, `include`)
|
|
141
|
+
* @param parts - Its indexes, mutations and migrations, as `e3.record` takes them; none when omitted
|
|
142
|
+
* @returns The record, for tasks to take and its mutations to be fed: `e3.record(name, type, parts)`
|
|
143
|
+
* @throws {FilesDeclarationError} When the name is one e3 refuses, or the spec is
|
|
144
|
+
* @throws {Error} When `parts` holds an initial value, or holds what `e3.record` refuses, naming it
|
|
145
|
+
*/
|
|
146
|
+
record<Name extends string, T extends EastType, I extends Readonly<Record<string, IndexDraft>> = Record<never, never>, M extends Readonly<Record<string, MutationDraft>> = Record<never, never>>(name: Name, type: T, spec: FilesKeySpec | FilesSelection, parts?: FilesRecordParts<T, I, M>): ReturnType<typeof e3.record<Name, T, I, M>>;
|
|
116
147
|
/**
|
|
117
148
|
* A record's mutation, fed: a sync calls it once with each new file's
|
|
118
149
|
* value, which must be of the mutation's one argument's type. The
|
|
119
|
-
* mutation is the package
|
|
120
|
-
* one argument; a `patch` mutation takes a patch,
|
|
121
|
-
* cannot be fed.
|
|
150
|
+
* mutation is one a record of the package declares, a `reduce` or an
|
|
151
|
+
* `edit` taking exactly one argument; a `patch` mutation takes a patch,
|
|
152
|
+
* not a value, so it cannot be fed.
|
|
122
153
|
*
|
|
123
|
-
* @param def - The mutation: `
|
|
154
|
+
* @param def - The mutation, as its record holds it: `record.mutations.<name>`, a `mutation.reduce(...)` or `mutation.edit(...)` of its declaration
|
|
124
155
|
* @param spec - One file (`key`), or the newest under a prefix (`prefix`, `include`)
|
|
125
156
|
* @returns The mutation, as given
|
|
126
157
|
* @throws {FilesDeclarationError} When the mutation takes other than one argument, or is a `patch`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoring.d.ts","sourceRoot":"","sources":["../../src/authoring.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"authoring.d.ts","sourceRoot":"","sources":["../../src/authoring.ts"],"names":[],"mappings":"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"}
|
package/dist/src/authoring.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* export const orders = upload.file('orders', { key: 'orders.beast2', type: ArrayType(Order) }); // an Array<Order>
|
|
13
13
|
* export const stock = upload.latest('stock', { prefix: 'stock/', type: ArrayType(Stock) });
|
|
14
14
|
* export const files = upload.folder('invoices', { prefix: 'invoices/', include: '*.pdf' });
|
|
15
|
-
* upload.mutation(
|
|
15
|
+
* upload.mutation(priceBook.mutations.load_prices, { key: 'prices.beast2' }); // each new file calls it
|
|
16
16
|
* export default Files.manifest([upload]);
|
|
17
17
|
* ```
|
|
18
18
|
*
|
|
@@ -21,10 +21,13 @@
|
|
|
21
21
|
* them; until the first, they are unassigned. A `file` or `latest` that
|
|
22
22
|
* names a `type` is an input of that type, filled with the beast2 value the
|
|
23
23
|
* file holds; one that names none is a `Blob`, filled with the file's
|
|
24
|
-
* bytes. A
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* bytes. A record seeded here is an `e3.record` with no initial value,
|
|
25
|
+
* declared whole with its indexes, mutations and migrations. A mutation fed
|
|
26
|
+
* here is one a record of the package declares, a `reduce` or an `edit`
|
|
27
|
+
* taking one argument (`record.mutations.<name>`): a sync calls it once with
|
|
28
|
+
* each new file's value. What each source's files fill is the
|
|
29
|
+
* {@link Files.manifest}, which `e3-cloud files deploy` deploys beside the
|
|
30
|
+
* package.
|
|
28
31
|
*
|
|
29
32
|
* @packageDocumentation
|
|
30
33
|
*/
|
|
@@ -151,14 +154,43 @@ export class FilesSource {
|
|
|
151
154
|
listing(input, spec) {
|
|
152
155
|
return this.#input(input, FilesListingType, variant('listing', selected(spec)), selectionProblems(variant('input', input), spec));
|
|
153
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* A record seeded from a file: declared with no initial value, so it is
|
|
159
|
+
* pending until its file arrives, which is its first state (`$init`;
|
|
160
|
+
* nothing runs on an empty state first, and its dependents wait as they
|
|
161
|
+
* wait on an unset input); seeded again (`$seed`) while nothing has
|
|
162
|
+
* mutated it since, or when a sync is asked to reset it; kept otherwise.
|
|
163
|
+
* It is declared whole, as any record is: its indexes, mutations and
|
|
164
|
+
* migrations are given here, as `e3.record` takes them.
|
|
165
|
+
*
|
|
166
|
+
* @param name - The record's name
|
|
167
|
+
* @param type - Its state's type, which the file must hold
|
|
168
|
+
* @param spec - One file (`key`), or the newest under a prefix (`prefix`, `include`)
|
|
169
|
+
* @param parts - Its indexes, mutations and migrations, as `e3.record` takes them; none when omitted
|
|
170
|
+
* @returns The record, for tasks to take and its mutations to be fed: `e3.record(name, type, parts)`
|
|
171
|
+
* @throws {FilesDeclarationError} When the name is one e3 refuses, or the spec is
|
|
172
|
+
* @throws {Error} When `parts` holds an initial value, or holds what `e3.record` refuses, naming it
|
|
173
|
+
*/
|
|
174
|
+
record(name, type, spec, parts) {
|
|
175
|
+
const target = variant('record', name);
|
|
176
|
+
refuse(nameProblems('record', name));
|
|
177
|
+
// Built before its mapping is recorded, so a part e3 refuses leaves the source as it was
|
|
178
|
+
const record = e3.record(name, type, parts);
|
|
179
|
+
// `default` is where a record keeps its initial value, there whether a value or a function that makes one (never called here)
|
|
180
|
+
if ('default' in record)
|
|
181
|
+
throw new Error(`record ${name}: a record seeded from a file declares no initial value, since its file is its first state`);
|
|
182
|
+
const { shape, problems } = oneFileShape(target, spec, type);
|
|
183
|
+
this.#declare(target, shape, problems);
|
|
184
|
+
return record;
|
|
185
|
+
}
|
|
154
186
|
/**
|
|
155
187
|
* A record's mutation, fed: a sync calls it once with each new file's
|
|
156
188
|
* value, which must be of the mutation's one argument's type. The
|
|
157
|
-
* mutation is the package
|
|
158
|
-
* one argument; a `patch` mutation takes a patch,
|
|
159
|
-
* cannot be fed.
|
|
189
|
+
* mutation is one a record of the package declares, a `reduce` or an
|
|
190
|
+
* `edit` taking exactly one argument; a `patch` mutation takes a patch,
|
|
191
|
+
* not a value, so it cannot be fed.
|
|
160
192
|
*
|
|
161
|
-
* @param def - The mutation: `
|
|
193
|
+
* @param def - The mutation, as its record holds it: `record.mutations.<name>`, a `mutation.reduce(...)` or `mutation.edit(...)` of its declaration
|
|
162
194
|
* @param spec - One file (`key`), or the newest under a prefix (`prefix`, `include`)
|
|
163
195
|
* @returns The mutation, as given
|
|
164
196
|
* @throws {FilesDeclarationError} When the mutation takes other than one argument, or is a `patch`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoring.js","sourceRoot":"","sources":["../../src/authoring.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"authoring.js","sourceRoot":"","sources":["../../src/authoring.ts"],"names":[],"mappings":"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"}
|