@substrat-run/elements 0.0.0-stage → 0.3.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 (47) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +58 -2
  3. package/dist/avatar.d.ts +56 -0
  4. package/dist/avatar.d.ts.map +1 -0
  5. package/dist/avatar.js +107 -0
  6. package/dist/avatar.js.map +1 -0
  7. package/dist/controls.d.ts +21 -0
  8. package/dist/controls.d.ts.map +1 -0
  9. package/dist/controls.js +21 -0
  10. package/dist/controls.js.map +1 -0
  11. package/dist/entity-table-model.d.ts +269 -0
  12. package/dist/entity-table-model.d.ts.map +1 -0
  13. package/dist/entity-table-model.js +490 -0
  14. package/dist/entity-table-model.js.map +1 -0
  15. package/dist/entity-table.d.ts +187 -0
  16. package/dist/entity-table.d.ts.map +1 -0
  17. package/dist/entity-table.js +1004 -0
  18. package/dist/entity-table.js.map +1 -0
  19. package/dist/index.d.ts +6 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +6 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/internal/session-controller.d.ts +29 -0
  24. package/dist/internal/session-controller.d.ts.map +1 -0
  25. package/dist/internal/session-controller.js +48 -0
  26. package/dist/internal/session-controller.js.map +1 -0
  27. package/dist/internal/substrat-element.d.ts +36 -0
  28. package/dist/internal/substrat-element.d.ts.map +1 -0
  29. package/dist/internal/substrat-element.js +195 -0
  30. package/dist/internal/substrat-element.js.map +1 -0
  31. package/dist/jsx.d.ts +8 -0
  32. package/dist/jsx.d.ts.map +1 -0
  33. package/dist/jsx.js +2 -0
  34. package/dist/jsx.js.map +1 -0
  35. package/dist/session.d.ts +84 -0
  36. package/dist/session.d.ts.map +1 -0
  37. package/dist/session.js +158 -0
  38. package/dist/session.js.map +1 -0
  39. package/dist/themes/atelier.css +59 -0
  40. package/dist/themes/base.css +7 -0
  41. package/dist/themes/ledger.css +59 -0
  42. package/dist/themes/native.css +11 -0
  43. package/dist/user-menu.d.ts +95 -0
  44. package/dist/user-menu.d.ts.map +1 -0
  45. package/dist/user-menu.js +212 -0
  46. package/dist/user-menu.js.map +1 -0
  47. package/package.json +47 -3
@@ -0,0 +1,490 @@
1
+ /**
2
+ * What an entity table knows, with no DOM in it.
3
+ *
4
+ * The element renders this and forwards clicks; everything that decides what the screen
5
+ * says lives here, so a second renderer (React Native, later) gets the same answers from
6
+ * the same code. The contract is the one a vertical's generated client already speaks:
7
+ * a read returns a `Page` (`entries`, `next`, `total`), `next` is followed rather than
8
+ * reassembled, and a refusal is a 403 on the error's `status`.
9
+ *
10
+ * The table owns a QUERY — the view, the sort, the equality filters, the search term —
11
+ * and hands it to `source.read`. What the query may say is what the read declares: `sort`
12
+ * is one of its `sortable` columns, a filter one of its `filterable` ones, and the
13
+ * generated client types both, so a sort with no index behind it does not compile. Paging
14
+ * is the keyset walk the platform has: forward through `next`, never a jump to "page 7 of
15
+ * 40". Previous works anyway — the table keeps the `next` link that led to each page it has
16
+ * shown, so going back re-reads exactly the page it came from.
17
+ * Search is a different read — ranked and capped, not sorted and paged — so a term
18
+ * switches the table into search mode rather than into a filtered page.
19
+ *
20
+ * Answers a hand-written list screen keeps getting wrong, held here once:
21
+ *
22
+ * - a 403 on the read is a WALL ("you may not see this"), never an empty list;
23
+ * - a 403 on a row action is about that row: the rows stay, the refusal is shown;
24
+ * - a 409 or 404 on a row action means the view went stale (another tab moved it),
25
+ * so the view is read again before the problem is shown;
26
+ * - an empty answer to a search or a filter is "no matches", not "nothing here";
27
+ * - a capped search says so, rather than passing its first N off as all of them;
28
+ * - a re-sort keeps the rows it is replacing on screen until the new ones land.
29
+ */
30
+ /** `busy` while an action runs over a selection rather than one row. */
31
+ export const BULK = '\u0000bulk';
32
+ const statusOf = (error) => {
33
+ const status = error?.status;
34
+ return typeof status === 'number' ? status : undefined;
35
+ };
36
+ const messageOf = (error) => (error instanceof Error ? error.message : String(error));
37
+ const NONE = new Set();
38
+ export class EntityTableModel {
39
+ source;
40
+ onChange;
41
+ state;
42
+ keyOf;
43
+ minSearch;
44
+ /** Bumped by every read, so an answer that lands after a newer one is dropped, not shown. */
45
+ #generation = 0;
46
+ /**
47
+ * How to read each page shown so far: the first is the query itself (null), every later one
48
+ * the `next` link the page before it handed out. A cursor is a position, so re-following one
49
+ * re-reads that page as it is now — which is what a reload after an action wants.
50
+ */
51
+ #trail = [null];
52
+ /** Where each page shown so far starts, beside `#trail`. */
53
+ #offsets = [0];
54
+ constructor(source, onChange, options = {}) {
55
+ this.source = source;
56
+ this.onChange = onChange;
57
+ this.keyOf = options.keyOf ?? ((row) => String(row.id));
58
+ this.minSearch = options.minSearch ?? 2;
59
+ this.state = {
60
+ phase: 'loading',
61
+ query: { view: null, sort: null, order: 'asc', filters: {}, q: '', limit: null, ...options.query },
62
+ mode: 'page',
63
+ rows: [],
64
+ next: null,
65
+ total: null,
66
+ page: 0,
67
+ offset: 0,
68
+ capped: false,
69
+ loadingMore: false,
70
+ refreshing: false,
71
+ busy: null,
72
+ selected: NONE,
73
+ problem: null,
74
+ };
75
+ }
76
+ #set(patch) {
77
+ this.state = { ...this.state, ...patch };
78
+ this.onChange(this.state);
79
+ }
80
+ /** The current view is one the source can search. */
81
+ get searchable() {
82
+ const { search, searchViews } = this.source;
83
+ const { view } = this.state.query;
84
+ return Boolean(search) && (!searchViews || view === null || searchViews.includes(view));
85
+ }
86
+ /** The term is long enough to search, and there is a search to ask in this view. */
87
+ get searching() {
88
+ return this.searchable && this.state.query.q.trim().length >= this.minSearch;
89
+ }
90
+ /**
91
+ * Read the page on screen again, with the current query. Keeps a `problem` it is told to,
92
+ * so a reload can carry one.
93
+ */
94
+ async load(keep = null) {
95
+ const generation = ++this.#generation;
96
+ const { query, page } = this.state;
97
+ const link = this.#trail[page] ?? null;
98
+ const shown = this.state.phase === 'ready';
99
+ this.#set(shown ? { refreshing: true } : { phase: 'loading' });
100
+ try {
101
+ const patch = this.searching
102
+ ? await this.source.search(query.q.trim(), query).then((r) => ({
103
+ mode: 'search',
104
+ rows: r.results,
105
+ next: null,
106
+ total: null,
107
+ capped: r.capped,
108
+ }))
109
+ : await (link === null ? this.source.read(query) : this.source.follow(link)).then((p) => ({
110
+ mode: 'page',
111
+ rows: p.entries,
112
+ next: p.next,
113
+ total: p.total,
114
+ capped: false,
115
+ }));
116
+ if (generation !== this.#generation)
117
+ return;
118
+ // The last row of a later page went (deleted here, or elsewhere): show the page before.
119
+ if (patch.rows.length === 0 && page > 0 && link !== null)
120
+ return this.#goTo(page - 1, keep);
121
+ // A selection names rows; one the new read no longer has is not selected any more.
122
+ const keys = new Set(patch.rows.map(this.keyOf));
123
+ const selected = new Set([...this.state.selected].filter((k) => keys.has(k)));
124
+ this.#set({ ...patch, phase: 'ready', loadingMore: false, refreshing: false, selected, problem: keep });
125
+ }
126
+ catch (error) {
127
+ if (generation !== this.#generation)
128
+ return;
129
+ if (statusOf(error) === 403) {
130
+ this.#set({
131
+ phase: 'forbidden',
132
+ rows: [],
133
+ next: null,
134
+ total: null,
135
+ loadingMore: false,
136
+ refreshing: false,
137
+ selected: NONE,
138
+ problem: null,
139
+ });
140
+ }
141
+ else if (shown) {
142
+ // A failed re-read is a blip over rows we still have, not a reason to drop them.
143
+ this.#set({ refreshing: false, problem: { kind: 'failed', message: messageOf(error) } });
144
+ }
145
+ else {
146
+ this.#set({ phase: 'error', problem: { kind: 'failed', message: messageOf(error) } });
147
+ }
148
+ }
149
+ }
150
+ /** Change the query and read again, from the first page. A new view starts with nothing selected. */
151
+ setQuery(patch) {
152
+ const query = { ...this.state.query, ...patch };
153
+ const selected = patch.view !== undefined && patch.view !== this.state.query.view ? NONE : this.state.selected;
154
+ this.#trail = [null];
155
+ this.#offsets = [0];
156
+ this.#set({ query, selected, page: 0, offset: 0 });
157
+ return this.load();
158
+ }
159
+ /** The page after this one, through the `next` link it handed out. */
160
+ nextPage() {
161
+ const { next, page, offset, rows, mode } = this.state;
162
+ if (!next || mode === 'search' || this.state.loadingMore)
163
+ return Promise.resolve();
164
+ this.#trail = [...this.#trail.slice(0, page + 1), next];
165
+ this.#offsets = [...this.#offsets.slice(0, page + 1), offset + rows.length];
166
+ return this.#goTo(page + 1);
167
+ }
168
+ /** The page before this one, re-read through the link that led to it. */
169
+ prevPage() {
170
+ return this.state.page > 0 ? this.#goTo(this.state.page - 1) : Promise.resolve();
171
+ }
172
+ /** Rows per page. A new size starts again from the first page. */
173
+ setPageSize(limit) {
174
+ return this.setQuery({ limit });
175
+ }
176
+ #goTo(page, keep = null) {
177
+ this.#set({ page, offset: this.#offsets[page] ?? 0 });
178
+ return this.load(keep);
179
+ }
180
+ /** A header press: ascending, then descending, then back to the read's own order. */
181
+ sortBy(column) {
182
+ const { sort, order } = this.state.query;
183
+ if (sort !== column)
184
+ return this.setQuery({ sort: column, order: 'asc' });
185
+ if (order === 'asc')
186
+ return this.setQuery({ order: 'desc' });
187
+ return this.setQuery({ sort: null, order: 'asc' });
188
+ }
189
+ filter(key, value) {
190
+ const rest = { ...this.state.query.filters };
191
+ delete rest[key];
192
+ return this.setQuery({ filters: value === null || value === '' ? rest : { ...rest, [key]: value } });
193
+ }
194
+ /**
195
+ * A new search term. Typing the first letter, or deleting down to one, changes nothing
196
+ * the server is asked, so it reads nothing: only crossing the minimum, or a new term
197
+ * past it, does.
198
+ */
199
+ search(q) {
200
+ const before = this.searching;
201
+ this.#set({ query: { ...this.state.query, q } });
202
+ if (!before && !this.searching)
203
+ return Promise.resolve();
204
+ // Into a search, or back out of one: either way the answer starts at its first page.
205
+ this.#trail = [null];
206
+ this.#offsets = [0];
207
+ this.#set({ page: 0, offset: 0 });
208
+ return this.load();
209
+ }
210
+ /** Drop the search term and every filter — what "No matches" offers. */
211
+ clear() {
212
+ return this.setQuery({ q: '', filters: {} });
213
+ }
214
+ async more() {
215
+ const { next, loadingMore } = this.state;
216
+ if (!next || loadingMore)
217
+ return;
218
+ const generation = this.#generation;
219
+ this.#set({ loadingMore: true });
220
+ try {
221
+ const page = await this.source.follow(next);
222
+ if (generation !== this.#generation)
223
+ return;
224
+ this.#set({ rows: [...this.state.rows, ...page.entries], next: page.next, loadingMore: false });
225
+ }
226
+ catch (error) {
227
+ if (generation !== this.#generation)
228
+ return;
229
+ this.#set({ loadingMore: false, problem: { kind: 'failed', message: messageOf(error) } });
230
+ }
231
+ }
232
+ toggle(key) {
233
+ const selected = new Set(this.state.selected);
234
+ if (!selected.delete(key))
235
+ selected.add(key);
236
+ this.#set({ selected });
237
+ }
238
+ /** Select every row on screen, or none if they all are. Rows not yet loaded are not "all". */
239
+ toggleAll() {
240
+ const keys = this.state.rows.map(this.keyOf);
241
+ const all = keys.length > 0 && keys.every((k) => this.state.selected.has(k));
242
+ this.#set({ selected: all ? NONE : new Set(keys) });
243
+ }
244
+ clearSelection() {
245
+ this.#set({ selected: NONE });
246
+ }
247
+ get selectedRows() {
248
+ return this.state.rows.filter((row) => this.state.selected.has(this.keyOf(row)));
249
+ }
250
+ async run(action, row) {
251
+ if (this.state.busy)
252
+ return;
253
+ this.#set({ busy: this.keyOf(row), problem: null });
254
+ try {
255
+ await action.run(row);
256
+ this.#set({ busy: null });
257
+ await this.load();
258
+ }
259
+ catch (error) {
260
+ const status = statusOf(error);
261
+ this.#set({ busy: null });
262
+ if (status === 409 || status === 404) {
263
+ await this.load({ kind: 'stale', message: 'This changed somewhere else. The view was refreshed.' });
264
+ }
265
+ else {
266
+ this.#set({ problem: { kind: status === 403 ? 'refused' : 'failed', message: messageOf(error) } });
267
+ }
268
+ }
269
+ }
270
+ /**
271
+ * Run an action once per selected row, then read once. One row's refusal does not stop
272
+ * the rest — each is its own operation on the server, so each answers for itself — and
273
+ * the summary counts them, because "3 of 5 done" is what a person needs to know.
274
+ * Returns the rows it succeeded on.
275
+ */
276
+ async runBulk(action) {
277
+ const rows = this.selectedRows;
278
+ if (this.state.busy || rows.length === 0)
279
+ return [];
280
+ this.#set({ busy: BULK, problem: null });
281
+ const done = [];
282
+ let refused = 0;
283
+ let stale = 0;
284
+ let failed = 0;
285
+ let last = '';
286
+ for (const row of rows) {
287
+ try {
288
+ await action.run(row);
289
+ done.push(row);
290
+ }
291
+ catch (error) {
292
+ const status = statusOf(error);
293
+ if (status === 403)
294
+ refused++;
295
+ else if (status === 409 || status === 404)
296
+ stale++;
297
+ else {
298
+ failed++;
299
+ last = messageOf(error);
300
+ }
301
+ }
302
+ }
303
+ this.#set({ busy: null, selected: NONE });
304
+ const parts = [
305
+ refused ? `${refused} not allowed` : '',
306
+ stale ? `${stale} changed somewhere else` : '',
307
+ failed ? `${failed} failed${last ? ` (${last})` : ''}` : '',
308
+ ].filter(Boolean);
309
+ const problem = parts.length
310
+ ? {
311
+ kind: refused ? 'refused' : stale ? 'stale' : 'failed',
312
+ message: `${action.label}: ${done.length} of ${rows.length} done; ${parts.join(', ')}.`,
313
+ }
314
+ : null;
315
+ await this.load(problem);
316
+ return done;
317
+ }
318
+ }
319
+ /** The actions a view offers on a row, or for a selection. */
320
+ export const actionsIn = (actions, view, bulk = false) => actions.filter((a) => (!a.views || view === null || a.views.includes(view)) && (!bulk || a.bulk));
321
+ /** The declared order with nothing hidden: what "Reset" goes back to. */
322
+ export const defaultLayout = (columns) => ({
323
+ order: columns.map((c) => c.key),
324
+ hidden: [],
325
+ });
326
+ /**
327
+ * The columns a layout shows, in its order. A key the layout does not know — a column added
328
+ * since it was saved — keeps its declared place among the rest, at the end; a key it names
329
+ * that no longer exists is ignored.
330
+ */
331
+ export function arrange(columns, layout) {
332
+ if (!layout || columns.length === 0)
333
+ return [...columns];
334
+ const [first, ...rest] = columns;
335
+ const rank = (key) => {
336
+ const i = layout.order.indexOf(key);
337
+ return i < 0 ? layout.order.length : i;
338
+ };
339
+ const ordered = rest
340
+ .map((c, declared) => ({ c, declared }))
341
+ .sort((a, b) => rank(a.c.key) - rank(b.c.key) || a.declared - b.declared)
342
+ .map(({ c }) => c);
343
+ return [first, ...ordered.filter((c) => !layout.hidden.includes(c.key))];
344
+ }
345
+ /** Every column after the first, in the layout's order, with whether it is shown. */
346
+ export function layoutEntries(columns, layout) {
347
+ const all = arrange(columns, layout && { order: layout.order, hidden: [] }).slice(1);
348
+ return all.map((column) => ({ column, shown: !layout?.hidden.includes(column.key) }));
349
+ }
350
+ /** Show or hide one column. The first column cannot be hidden, and asking does nothing. */
351
+ export function toggleColumn(columns, layout, key) {
352
+ const base = normalised(columns, layout);
353
+ if (key === columns[0]?.key)
354
+ return base;
355
+ const hidden = base.hidden.includes(key) ? base.hidden.filter((k) => k !== key) : [...base.hidden, key];
356
+ return { order: base.order, hidden };
357
+ }
358
+ /** Move a column `by` places among the others (−1 is up), or to the place of `to`. */
359
+ export function moveColumn(columns, layout, key, by) {
360
+ const base = normalised(columns, layout);
361
+ const [first, ...rest] = base.order;
362
+ const from = rest.indexOf(key);
363
+ if (from < 0)
364
+ return base;
365
+ const target = 'by' in by ? from + by.by : rest.indexOf(by.to);
366
+ if (target < 0 || target >= rest.length || target === from)
367
+ return base;
368
+ const moved = rest.filter((k) => k !== key);
369
+ moved.splice(target, 0, key);
370
+ return { order: [first, ...moved], hidden: base.hidden };
371
+ }
372
+ /** A layout naming every current column exactly once, in the order `arrange` shows them. */
373
+ function normalised(columns, layout) {
374
+ const known = new Set(columns.map((c) => c.key));
375
+ const order = arrange(columns, layout && { order: layout.order, hidden: [] }).map((c) => c.key);
376
+ return { order, hidden: (layout?.hidden ?? []).filter((k) => known.has(k) && k !== columns[0]?.key) };
377
+ }
378
+ /** Why a ready table has no rows: nothing exists, or nothing matches what was asked. */
379
+ export const emptyReason = (state) => state.mode === 'search' || Object.keys(state.query.filters).length > 0 ? 'no-matches' : 'empty';
380
+ /** The parameter names the query itself uses, which a filter key may not take. */
381
+ const QUERY_PARAMS = ['view', 'sort', 'order', 'q', 'limit'];
382
+ function filterKeys(spec) {
383
+ const keys = Object.keys(spec.filters ?? {});
384
+ const taken = keys.find((k) => QUERY_PARAMS.includes(k));
385
+ if (taken)
386
+ throw new Error(`A filter cannot be called "${taken}": the query's own parameter has that name.`);
387
+ return keys;
388
+ }
389
+ /**
390
+ * The query as URL parameters — not the page: a page is a cursor that answers one query at one
391
+ * moment, so a link or a reload starts at the first page of the same view, sort and filters.
392
+ */
393
+ export function queryToParams(query, spec = {}) {
394
+ const p = spec.prefix ?? '';
395
+ const params = new URLSearchParams();
396
+ if (query.view !== null && query.view !== spec.defaults?.view)
397
+ params.set(`${p}view`, query.view);
398
+ if (query.sort !== null)
399
+ params.set(`${p}sort`, query.sort);
400
+ if (query.order === 'desc')
401
+ params.set(`${p}order`, 'desc');
402
+ for (const key of filterKeys(spec)) {
403
+ const value = query.filters[key];
404
+ if (value !== undefined)
405
+ params.set(`${p}${key}`, value);
406
+ }
407
+ if (query.q.trim() !== '')
408
+ params.set(`${p}q`, query.q);
409
+ if (query.limit !== null && query.limit !== spec.defaults?.limit)
410
+ params.set(`${p}limit`, String(query.limit));
411
+ return params;
412
+ }
413
+ /** The query a URL's parameters name, as the table's starting `query`. */
414
+ export function queryFromParams(params, spec = {}) {
415
+ const read = typeof params === 'string' ? new URLSearchParams(params) : params;
416
+ const p = spec.prefix ?? '';
417
+ const get = (name) => read.get(`${p}${name}`);
418
+ const query = {};
419
+ const view = get('view');
420
+ if (view !== null && spec.views?.includes(view))
421
+ query.view = view;
422
+ const sort = spec.sorts?.find((s) => s === get('sort'));
423
+ if (sort !== undefined)
424
+ query.sort = sort;
425
+ if (get('order') === 'desc')
426
+ query.order = 'desc';
427
+ const filters = {};
428
+ for (const key of filterKeys(spec)) {
429
+ const value = get(key);
430
+ if (value !== null && spec.filters[key].includes(value))
431
+ filters[key] = value;
432
+ }
433
+ if (Object.keys(filters).length > 0)
434
+ query.filters = filters;
435
+ const q = get('q');
436
+ if (q !== null && q.trim() !== '')
437
+ query.q = q;
438
+ const limit = Number(get('limit'));
439
+ if (spec.limits?.includes(limit))
440
+ query.limit = limit;
441
+ return query;
442
+ }
443
+ const RELATIVE = [
444
+ ['year', 365 * 24 * 3600],
445
+ ['month', 30 * 24 * 3600],
446
+ ['week', 7 * 24 * 3600],
447
+ ['day', 24 * 3600],
448
+ ['hour', 3600],
449
+ ['minute', 60],
450
+ ];
451
+ /** `now` is passed in, not read, so the same row reads the same in a test and on a screen. */
452
+ export function cellText(column, row, now, locale) {
453
+ const raw = column.value ? column.value(row) : row[column.key];
454
+ if (raw === null || raw === undefined || raw === '')
455
+ return { text: '—', blank: true };
456
+ switch (column.kind ?? 'text') {
457
+ case 'number':
458
+ return { text: new Intl.NumberFormat(locale).format(Number(raw)) };
459
+ case 'money': {
460
+ // Decimal strings, never floats: `format` takes the string whole (Intl.NumberFormat v3),
461
+ // so 0.1 + 0.2 never reaches a screen.
462
+ const format = new Intl.NumberFormat(locale, column.currency ? { style: 'currency', currency: column.currency } : {});
463
+ return { text: format.format(String(raw)) };
464
+ }
465
+ case 'date':
466
+ case 'datetime':
467
+ case 'relative': {
468
+ const at = new Date(String(raw));
469
+ if (Number.isNaN(at.getTime()))
470
+ return { text: String(raw) };
471
+ const exact = new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' }).format(at);
472
+ if (column.kind === 'datetime')
473
+ return { text: exact };
474
+ if (column.kind === 'date')
475
+ return { text: new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(at), title: exact };
476
+ const seconds = (at.getTime() - now.getTime()) / 1000;
477
+ const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });
478
+ const unit = RELATIVE.find(([, size]) => Math.abs(seconds) >= size);
479
+ return { text: unit ? rtf.format(Math.round(seconds / unit[1]), unit[0]) : rtf.format(0, 'minute'), title: exact };
480
+ }
481
+ case 'boolean':
482
+ // SQLite has no boolean, so 1/0 arrive as numbers; both spellings read the same.
483
+ return raw === true || raw === 1 || raw === '1' ? { text: 'Yes' } : { text: 'No', blank: true };
484
+ case 'badge':
485
+ return { text: String(raw), tone: column.tones?.[String(raw)] ?? 'neutral' };
486
+ default:
487
+ return { text: String(raw) };
488
+ }
489
+ }
490
+ //# sourceMappingURL=entity-table-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-table-model.js","sourceRoot":"","sources":["../src/entity-table-model.ts"],"names":[],"mappings":"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"}