persian-data-grid 0.5.0 → 0.6.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.
- package/OFL.txt +93 -0
- package/README.md +179 -22
- package/dist/ERPTableGroupRow-J5Z2LRC5.cjs +131 -0
- package/dist/ERPTableGroupRow-J5Z2LRC5.cjs.map +1 -0
- package/dist/ERPTableGroupRow-PSAPAHGL.js +125 -0
- package/dist/ERPTableGroupRow-PSAPAHGL.js.map +1 -0
- package/dist/GridPlugin-CJCaYnlw.d.ts +57 -0
- package/dist/GridPlugin-oxhq8AsM.d.cts +57 -0
- package/dist/GridPresenceService-GEH6535Q.js +3 -0
- package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
- package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
- package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
- package/dist/GridSession-B-9lLcoB.d.cts +2492 -0
- package/dist/GridSession-Bc7UIawO.d.ts +2492 -0
- package/dist/GridSyncService-KTLB4KP3.js +3 -0
- package/dist/GridSyncService-KTLB4KP3.js.map +1 -0
- package/dist/GridSyncService-TAPAHABV.cjs +12 -0
- package/dist/GridSyncService-TAPAHABV.cjs.map +1 -0
- package/dist/PdfRenderer-1HFh6UeR.d.ts +22 -0
- package/dist/PdfRenderer-CBg7hWNS.d.cts +22 -0
- package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
- package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
- package/dist/SelectImpl-NM4O4IGW.js +447 -0
- package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
- package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
- package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
- package/dist/UITableController-Cuwq481K.d.cts +632 -0
- package/dist/UITableController-DU8RopUM.d.ts +632 -0
- package/dist/VazirmatnPdfRenderer-BCMpC1zy.d.cts +96 -0
- package/dist/VazirmatnPdfRenderer-Dz_G-m3c.d.ts +96 -0
- package/dist/adapters/arian-erp.cjs +77 -0
- package/dist/adapters/arian-erp.cjs.map +1 -0
- package/dist/adapters/arian-erp.d.cts +60 -0
- package/dist/adapters/arian-erp.d.ts +60 -0
- package/dist/adapters/arian-erp.js +71 -0
- package/dist/adapters/arian-erp.js.map +1 -0
- package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
- package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
- package/dist/appendAtEnd-TJEABLGD.js +33 -0
- package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
- package/dist/applyImportedRows-BO6yxoAN.d.cts +135 -0
- package/dist/applyImportedRows-D4zVY8uD.d.ts +135 -0
- package/dist/applyRowVisibilityHandler-KS6TMCBN.js +83 -0
- package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +1 -0
- package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs +85 -0
- package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +1 -0
- package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
- package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
- package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
- package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
- package/dist/callbackRemoteApi-BlXO5NJz.d.ts +30 -0
- package/dist/callbackRemoteApi-DgnXH-i0.d.cts +30 -0
- package/dist/cellRenderContext-DB7V_mlu.d.ts +42 -0
- package/dist/cellRenderContext-DG5BOlxK.d.cts +42 -0
- package/dist/chunk-2BJCRYOS.cjs +936 -0
- package/dist/chunk-2BJCRYOS.cjs.map +1 -0
- package/dist/chunk-3Y3KKGEC.js +3 -0
- package/dist/chunk-3Y3KKGEC.js.map +1 -0
- package/dist/chunk-5ALMNLUR.cjs +1408 -0
- package/dist/chunk-5ALMNLUR.cjs.map +1 -0
- package/dist/chunk-5HKVMPBD.js +937 -0
- package/dist/chunk-5HKVMPBD.js.map +1 -0
- package/dist/chunk-633KP74Z.js +189 -0
- package/dist/chunk-633KP74Z.js.map +1 -0
- package/dist/chunk-6XBXZPBW.js +298 -0
- package/dist/chunk-6XBXZPBW.js.map +1 -0
- package/dist/chunk-77UXAJII.js +112 -0
- package/dist/chunk-77UXAJII.js.map +1 -0
- package/dist/chunk-ASPTRYRD.cjs +21 -0
- package/dist/chunk-ASPTRYRD.cjs.map +1 -0
- package/dist/chunk-AU3RDJYQ.js +243 -0
- package/dist/chunk-AU3RDJYQ.js.map +1 -0
- package/dist/chunk-BHDRUZH5.cjs +33 -0
- package/dist/chunk-BHDRUZH5.cjs.map +1 -0
- package/dist/chunk-BLYVOV3G.cjs +191 -0
- package/dist/chunk-BLYVOV3G.cjs.map +1 -0
- package/dist/chunk-CILNIWYW.cjs +100 -0
- package/dist/chunk-CILNIWYW.cjs.map +1 -0
- package/dist/chunk-DFFP7SJ6.cjs +257 -0
- package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
- package/dist/chunk-DXRCYW42.cjs +568 -0
- package/dist/chunk-DXRCYW42.cjs.map +1 -0
- package/dist/chunk-EBV6HGZB.cjs +33 -0
- package/dist/chunk-EBV6HGZB.cjs.map +1 -0
- package/dist/chunk-EHHHC5JV.js +832 -0
- package/dist/chunk-EHHHC5JV.js.map +1 -0
- package/dist/chunk-F4PYOYHR.js +112 -0
- package/dist/chunk-F4PYOYHR.js.map +1 -0
- package/dist/chunk-GQEDLUMB.js +168 -0
- package/dist/chunk-GQEDLUMB.js.map +1 -0
- package/dist/chunk-H2LESGMX.cjs +319 -0
- package/dist/chunk-H2LESGMX.cjs.map +1 -0
- package/dist/chunk-HTNJT2QU.js +11674 -0
- package/dist/chunk-HTNJT2QU.js.map +1 -0
- package/dist/chunk-IIISFUW4.cjs +11786 -0
- package/dist/chunk-IIISFUW4.cjs.map +1 -0
- package/dist/chunk-IMPCRWYP.cjs +251 -0
- package/dist/chunk-IMPCRWYP.cjs.map +1 -0
- package/dist/chunk-IPPIXOVQ.js +317 -0
- package/dist/chunk-IPPIXOVQ.js.map +1 -0
- package/dist/chunk-J4XJ4UBC.js +1404 -0
- package/dist/chunk-J4XJ4UBC.js.map +1 -0
- package/dist/chunk-J7CPPFXT.cjs +89 -0
- package/dist/chunk-J7CPPFXT.cjs.map +1 -0
- package/dist/chunk-JOICD47Q.cjs +41 -0
- package/dist/chunk-JOICD47Q.cjs.map +1 -0
- package/dist/chunk-KHMG6EI2.js +13 -0
- package/dist/chunk-KHMG6EI2.js.map +1 -0
- package/dist/chunk-KMRURD5J.cjs +15 -0
- package/dist/chunk-KMRURD5J.cjs.map +1 -0
- package/dist/chunk-KRJG3KMP.cjs +174 -0
- package/dist/chunk-KRJG3KMP.cjs.map +1 -0
- package/dist/chunk-KUBVDIF7.cjs +653 -0
- package/dist/chunk-KUBVDIF7.cjs.map +1 -0
- package/dist/chunk-KYAOSBQN.js +31 -0
- package/dist/chunk-KYAOSBQN.js.map +1 -0
- package/dist/chunk-LJ7LMEXO.js +36 -0
- package/dist/chunk-LJ7LMEXO.js.map +1 -0
- package/dist/chunk-MT3KLB2Q.cjs +944 -0
- package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
- package/dist/chunk-MU3RY46O.js +932 -0
- package/dist/chunk-MU3RY46O.js.map +1 -0
- package/dist/chunk-MUQQKPWR.js +84 -0
- package/dist/chunk-MUQQKPWR.js.map +1 -0
- package/dist/chunk-N7SJTINL.cjs +4 -0
- package/dist/chunk-N7SJTINL.cjs.map +1 -0
- package/dist/chunk-NTV2UUAJ.cjs +149 -0
- package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
- package/dist/chunk-PJQWHF6T.js +31 -0
- package/dist/chunk-PJQWHF6T.js.map +1 -0
- package/dist/chunk-PQY54EL5.js +248 -0
- package/dist/chunk-PQY54EL5.js.map +1 -0
- package/dist/chunk-PXCHPZTP.cjs +839 -0
- package/dist/chunk-PXCHPZTP.cjs.map +1 -0
- package/dist/chunk-Q7TBBUTX.cjs +110 -0
- package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
- package/dist/chunk-QQMU44KJ.js +612 -0
- package/dist/chunk-QQMU44KJ.js.map +1 -0
- package/dist/chunk-QZN7R2WP.cjs +114 -0
- package/dist/chunk-QZN7R2WP.cjs.map +1 -0
- package/dist/chunk-RKVSJU46.js +35 -0
- package/dist/chunk-RKVSJU46.js.map +1 -0
- package/dist/chunk-RM6ZWNT3.js +561 -0
- package/dist/chunk-RM6ZWNT3.js.map +1 -0
- package/dist/chunk-SX4VQXAA.cjs +114 -0
- package/dist/chunk-SX4VQXAA.cjs.map +1 -0
- package/dist/chunk-SZ7BLAY3.js +92 -0
- package/dist/chunk-SZ7BLAY3.js.map +1 -0
- package/dist/chunk-TN4MG6FY.js +112 -0
- package/dist/chunk-TN4MG6FY.js.map +1 -0
- package/dist/chunk-UC7PHDM6.cjs +331 -0
- package/dist/chunk-UC7PHDM6.cjs.map +1 -0
- package/dist/chunk-UXVLYUUW.js +108 -0
- package/dist/chunk-UXVLYUUW.js.map +1 -0
- package/dist/chunk-VVGYRZ7S.cjs +38 -0
- package/dist/chunk-VVGYRZ7S.cjs.map +1 -0
- package/dist/chunk-W5256BJ4.js +56 -0
- package/dist/chunk-W5256BJ4.js.map +1 -0
- package/dist/chunk-WUMOSOEK.cjs +62 -0
- package/dist/chunk-WUMOSOEK.cjs.map +1 -0
- package/dist/chunk-XLRE2J25.js +140 -0
- package/dist/chunk-XLRE2J25.js.map +1 -0
- package/dist/chunk-Y6W5V2CI.js +19 -0
- package/dist/chunk-Y6W5V2CI.js.map +1 -0
- package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
- package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
- package/dist/createEngineGridQuery-Dmq3i5v3.d.cts +884 -0
- package/dist/createEngineGridQuery-Mt1hc33m.d.ts +884 -0
- package/dist/date-picker-jalali.cjs +263 -0
- package/dist/date-picker-jalali.cjs.map +1 -0
- package/dist/date-picker-jalali.d.cts +62 -0
- package/dist/date-picker-jalali.d.ts +62 -0
- package/dist/date-picker-jalali.js +256 -0
- package/dist/date-picker-jalali.js.map +1 -0
- package/dist/finance.cjs +205 -0
- package/dist/finance.cjs.map +1 -0
- package/dist/finance.d.cts +90 -0
- package/dist/finance.d.ts +90 -0
- package/dist/finance.js +157 -0
- package/dist/finance.js.map +1 -0
- package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
- package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
- package/dist/foldedColumn-TFURUKFG.js +64 -0
- package/dist/foldedColumn-TFURUKFG.js.map +1 -0
- package/dist/headless.cjs +729 -0
- package/dist/headless.cjs.map +1 -0
- package/dist/headless.d.cts +504 -0
- package/dist/headless.d.ts +504 -0
- package/dist/headless.js +226 -0
- package/dist/headless.js.map +1 -0
- package/dist/index-DN8M8Jkq.d.cts +14 -0
- package/dist/index-DmzL-F_o.d.ts +14 -0
- package/dist/index.cjs +8002 -11409
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +437 -2305
- package/dist/index.d.ts +437 -2305
- package/dist/index.js +7244 -11083
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.cjs +12 -0
- package/dist/locales/ar.cjs.map +1 -0
- package/dist/locales/ar.d.cts +6 -0
- package/dist/locales/ar.d.ts +6 -0
- package/dist/locales/ar.js +3 -0
- package/dist/locales/ar.js.map +1 -0
- package/dist/locales/en.cjs +12 -0
- package/dist/locales/en.cjs.map +1 -0
- package/dist/locales/en.d.cts +6 -0
- package/dist/locales/en.d.ts +6 -0
- package/dist/locales/en.js +3 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/fa.cjs +12 -0
- package/dist/locales/fa.cjs.map +1 -0
- package/dist/locales/fa.d.cts +6 -0
- package/dist/locales/fa.d.ts +6 -0
- package/dist/locales/fa.js +3 -0
- package/dist/locales/fa.js.map +1 -0
- package/dist/locales/index.cjs +51 -0
- package/dist/locales/index.cjs.map +1 -0
- package/dist/locales/index.d.cts +5 -0
- package/dist/locales/index.d.ts +5 -0
- package/dist/locales/index.js +6 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
- package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
- package/dist/memoryRecords-OJTGXLRH.js +47 -0
- package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
- package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
- package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
- package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
- package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
- package/dist/pagedKit-MFGAJFSK.cjs +134 -0
- package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
- package/dist/pagedKit-WYWY4LRV.js +127 -0
- package/dist/pagedKit-WYWY4LRV.js.map +1 -0
- package/dist/pagedSearch-HCPJW7VM.js +38 -0
- package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
- package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
- package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
- package/dist/plugins/csv.cjs +124 -0
- package/dist/plugins/csv.cjs.map +1 -0
- package/dist/plugins/csv.d.cts +44 -0
- package/dist/plugins/csv.d.ts +44 -0
- package/dist/plugins/csv.js +120 -0
- package/dist/plugins/csv.js.map +1 -0
- package/dist/plugins/excel.cjs +52 -0
- package/dist/plugins/excel.cjs.map +1 -0
- package/dist/plugins/excel.d.cts +14 -0
- package/dist/plugins/excel.d.ts +14 -0
- package/dist/plugins/excel.js +7 -0
- package/dist/plugins/excel.js.map +1 -0
- package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
- package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
- package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
- package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
- package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
- package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
- package/dist/plugins/pdf.cjs +24 -0
- package/dist/plugins/pdf.cjs.map +1 -0
- package/dist/plugins/pdf.d.cts +21 -0
- package/dist/plugins/pdf.d.ts +21 -0
- package/dist/plugins/pdf.js +7 -0
- package/dist/plugins/pdf.js.map +1 -0
- package/dist/presence.cjs +56 -0
- package/dist/presence.cjs.map +1 -0
- package/dist/presence.d.cts +17 -0
- package/dist/presence.d.ts +17 -0
- package/dist/presence.js +54 -0
- package/dist/presence.js.map +1 -0
- package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
- package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
- package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
- package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
- package/dist/styles.css +1440 -0
- package/dist/sync.cjs +148 -0
- package/dist/sync.cjs.map +1 -0
- package/dist/sync.d.cts +17 -0
- package/dist/sync.d.ts +17 -0
- package/dist/sync.js +146 -0
- package/dist/sync.js.map +1 -0
- package/dist/types-D__47BKv.d.cts +23 -0
- package/dist/types-D__47BKv.d.ts +23 -0
- package/package.json +184 -28
package/dist/headless.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
export { PagedCachedTableRepository, PagedIndexedDbTableRepository, PagedLocalTableRepository } from './chunk-J4XJ4UBC.js';
|
|
2
|
+
export { GridSyncService } from './chunk-633KP74Z.js';
|
|
3
|
+
export { createBroadcastChannelPresenceTransport } from './chunk-PJQWHF6T.js';
|
|
4
|
+
export { GridPresenceService } from './chunk-UXVLYUUW.js';
|
|
5
|
+
export { CallbackRemoteApi } from './chunk-Y6W5V2CI.js';
|
|
6
|
+
export { ColumnAggIndex, DEFAULT_EVENT_STORE_PREFIX, DEFAULT_GRID_ACTOR, DEFAULT_MEMORY_STORE, EVENT_CATALOG, InMemoryEventStore, InMemorySnapshotStore, IndexedDbEventStore, LEGACY_EVENT_STORE_PREFIX, MemoryKvDatabase, NoopRemoteApi, PluginHost, QuickFilterIndex, SnapshotStrategy, SparseRowIndex, TableEngine, UITableController, accumulateAdd, accumulateRemove, addJalaliMonths, applyAgg, applyFillHandleDrag, applyFilter, applyHostRowDataToTable, applyQuickFilter, buildClipboardPayload, buildFillUpdates, buildPastePlan, buildQuickFilterBlob, cellRangeClassName, cellRangeEdgeAttr, clampColIndex, clampRowIndex, clickCell, coercePastedCellValue, colIndex, collectUniqueFilterValues, columnDefFieldName, copyGridSelectionToClipboard, createAccumulator, createERPTable, createEmptyCellRangeSelection, createEngineGridQuery, createGrid, createGridApi, createGridTableKey, ctrlClickCell, cutGridSelectionToClipboard, defaultGetRowId, detectFillSeries, ensureIndexColumnDef, eventStoreDbName, extendSeriesValue, getEventCatalogEntry, isAggFuncName, isCellInRange, isColumnFilterActive, isCustomAggFunc, isServerRowModel, isWindowedRepository, listUndoableEventTypes, mapColumnDefs, mapColumnSchemas, mapColumnSchemasToDefs, mapRowDataToRowInputs, mergeCellRanges, moveCellAddress, normalizeCellRange, normalizeFilterText, normalizePersianNumberText, normalizeQuickFilterText, openIndexedDbDatabase, pageWindow, parseClipboardDate, parseClipboardNumber, parseDelimitedClipboardText, pasteGridFromClipboard, rangeFromAnchorFocus, rangesOverlap, readAccumulator, readSystemClipboardText, resolveBuiltinFilterKind, resolveCellRangePresentation, resolveColumnAggSpecs, resolveCopyRanges, resolveCreateGridDefaults, resolveFillCorner, selectAllCellRanges, shiftArrowCell, shiftClickCell, toColumnDef, toColumnDefinition, toColumnSchema, toColumnViewBinding, toMinorUnits, writeSystemClipboard } from './chunk-HTNJT2QU.js';
|
|
7
|
+
import './chunk-5HKVMPBD.js';
|
|
8
|
+
export { ViewportCalculator, buildCumulativeWidths, calculateColumnViewport } from './chunk-IPPIXOVQ.js';
|
|
9
|
+
import './chunk-RM6ZWNT3.js';
|
|
10
|
+
import './chunk-KHMG6EI2.js';
|
|
11
|
+
import './chunk-RKVSJU46.js';
|
|
12
|
+
export { CATALOG_TO_HOST_CALLBACKS, ROW_DATA_UPDATED_CATALOG_TYPES, dispatchCatalogHostEvent, subscribeCatalogHostEvents } from './chunk-MUQQKPWR.js';
|
|
13
|
+
export { HEADER_SORT_CLICK_MAX_MOVE_PX, INDEX_COL_ID, applySort, ariaSortForColumn, compareSortValues, compareTypedValues, cycleSortModel, isBlankSortValue, isHeaderColumnSortable, normalizeDigits, shouldCommitHeaderSortClick, sortPriorityForColumn } from './chunk-AU3RDJYQ.js';
|
|
14
|
+
export { RowStateEnum, Viewport } from './chunk-XLRE2J25.js';
|
|
15
|
+
|
|
16
|
+
// infrastructure/sync/InMemorySyncHub.ts
|
|
17
|
+
var InMemorySyncHub = class {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.log = [];
|
|
20
|
+
this.clients = /* @__PURE__ */ new Map();
|
|
21
|
+
}
|
|
22
|
+
transportFor(clientId) {
|
|
23
|
+
if (!this.clients.has(clientId)) {
|
|
24
|
+
this.clients.set(clientId, { events: [], delivered: /* @__PURE__ */ new Set() });
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
push: async (events) => this.push(clientId, events),
|
|
28
|
+
pull: async (afterCursor) => this.pull(clientId, afterCursor)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async push(clientId, events) {
|
|
32
|
+
const acceptedIds = [];
|
|
33
|
+
for (const event of events) {
|
|
34
|
+
if (this.log.some((e) => e.eventId === event.eventId)) {
|
|
35
|
+
acceptedIds.push(event.eventId);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
this.log.push(event);
|
|
39
|
+
acceptedIds.push(event.eventId);
|
|
40
|
+
for (const [id, inbox] of this.clients) {
|
|
41
|
+
if (id === clientId) continue;
|
|
42
|
+
inbox.events.push(event);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { acceptedIds };
|
|
46
|
+
}
|
|
47
|
+
async pull(clientId, afterCursor) {
|
|
48
|
+
const inbox = this.clients.get(clientId);
|
|
49
|
+
if (!inbox) {
|
|
50
|
+
return { events: [], cursor: this.log.length };
|
|
51
|
+
}
|
|
52
|
+
const fresh = inbox.events.filter((e) => !inbox.delivered.has(e.eventId));
|
|
53
|
+
for (const e of fresh) inbox.delivered.add(e.eventId);
|
|
54
|
+
return { events: fresh, cursor: this.log.length };
|
|
55
|
+
}
|
|
56
|
+
/** Test helper: all events currently on the hub. */
|
|
57
|
+
getLog() {
|
|
58
|
+
return this.log;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// infrastructure/presence/InMemoryPresenceHub.ts
|
|
63
|
+
var InMemoryPresenceHub = class {
|
|
64
|
+
constructor() {
|
|
65
|
+
this.clients = /* @__PURE__ */ new Map();
|
|
66
|
+
}
|
|
67
|
+
transportFor(clientId) {
|
|
68
|
+
if (!this.clients.has(clientId)) {
|
|
69
|
+
this.clients.set(clientId, { listener: null });
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
publish: (message) => {
|
|
73
|
+
for (const [id, client] of this.clients) {
|
|
74
|
+
if (id === clientId) continue;
|
|
75
|
+
client.listener?.(message);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
subscribe: (listener) => {
|
|
79
|
+
const client = this.clients.get(clientId);
|
|
80
|
+
client.listener = listener;
|
|
81
|
+
return () => {
|
|
82
|
+
if (client.listener === listener) client.listener = null;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// infrastructure/document/documentGridMapping.ts
|
|
90
|
+
var GRID_INTERNAL_COLUMNS = /* @__PURE__ */ new Set(["collection", "rowType", "ChangeFields"]);
|
|
91
|
+
function mapSnapshotToDetails(snapshot, options) {
|
|
92
|
+
var _a;
|
|
93
|
+
const {
|
|
94
|
+
detailFieldKey,
|
|
95
|
+
isUpdate,
|
|
96
|
+
defaultKey = "Details",
|
|
97
|
+
defaultCollection = "default",
|
|
98
|
+
rowNumberField = "RowNum"
|
|
99
|
+
} = options;
|
|
100
|
+
const changed = (snapshot?.rows ?? []).filter(
|
|
101
|
+
(row) => row.rowState !== "None" /* Unchanged */
|
|
102
|
+
);
|
|
103
|
+
const mapped = changed.map((row) => {
|
|
104
|
+
const detail = {
|
|
105
|
+
RowState: row.rowState,
|
|
106
|
+
ChangeFields: row.changeFields
|
|
107
|
+
};
|
|
108
|
+
if (isUpdate && row.rowState !== "Add" /* Added */) {
|
|
109
|
+
detail[detailFieldKey] = row.id;
|
|
110
|
+
}
|
|
111
|
+
if (row.isSaveDescription) {
|
|
112
|
+
detail.isSaveDescription = row.isSaveDescription;
|
|
113
|
+
}
|
|
114
|
+
for (const [col, cell] of Object.entries(row.cells ?? {})) {
|
|
115
|
+
if (cell == null) continue;
|
|
116
|
+
if (GRID_INTERNAL_COLUMNS.has(col)) continue;
|
|
117
|
+
if (col === "index") {
|
|
118
|
+
detail[rowNumberField] = cell;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
detail[col] = typeof cell === "object" && "value" in cell ? cell.value : cell;
|
|
122
|
+
}
|
|
123
|
+
return { detail, collection: row.collection || defaultCollection };
|
|
124
|
+
});
|
|
125
|
+
const hasCustomCollection = mapped.some(
|
|
126
|
+
(r) => r.collection && r.collection !== defaultCollection
|
|
127
|
+
);
|
|
128
|
+
if (!hasCustomCollection) {
|
|
129
|
+
return { [defaultKey]: mapped.map((r) => r.detail) };
|
|
130
|
+
}
|
|
131
|
+
const byCollection = {};
|
|
132
|
+
for (const r of mapped) {
|
|
133
|
+
(byCollection[_a = r.collection] ?? (byCollection[_a] = [])).push(r.detail);
|
|
134
|
+
}
|
|
135
|
+
return byCollection;
|
|
136
|
+
}
|
|
137
|
+
function mapDetailsToRowInputs(items, options) {
|
|
138
|
+
const {
|
|
139
|
+
detailFieldKey,
|
|
140
|
+
collection,
|
|
141
|
+
isCopy = false,
|
|
142
|
+
newRowId = () => Math.floor(Math.random() * 1e5)
|
|
143
|
+
} = options;
|
|
144
|
+
return items.map((item) => {
|
|
145
|
+
if (isCopy) {
|
|
146
|
+
const rest = { ...item };
|
|
147
|
+
delete rest[detailFieldKey];
|
|
148
|
+
return {
|
|
149
|
+
id: newRowId(),
|
|
150
|
+
values: {
|
|
151
|
+
...rest,
|
|
152
|
+
[detailFieldKey]: void 0,
|
|
153
|
+
RowState: "Add" /* Added */,
|
|
154
|
+
collection
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
id: item[detailFieldKey],
|
|
160
|
+
values: { ...item, collection }
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function buildDocumentPayload(options) {
|
|
165
|
+
const {
|
|
166
|
+
headerFields,
|
|
167
|
+
headerFieldKey,
|
|
168
|
+
recordId = 0,
|
|
169
|
+
details,
|
|
170
|
+
numericFieldNames = []
|
|
171
|
+
} = options;
|
|
172
|
+
const numeric = /* @__PURE__ */ new Set([headerFieldKey, ...numericFieldNames]);
|
|
173
|
+
const formValues = Object.fromEntries(
|
|
174
|
+
headerFields.map((field) => {
|
|
175
|
+
let value = field.value;
|
|
176
|
+
if (value === "") value = null;
|
|
177
|
+
if (value != null && (field.type === "number" || numeric.has(field.name))) {
|
|
178
|
+
const n = Number(value);
|
|
179
|
+
value = Number.isNaN(n) ? null : n;
|
|
180
|
+
}
|
|
181
|
+
return [field.name, value];
|
|
182
|
+
})
|
|
183
|
+
);
|
|
184
|
+
const isUpdate = recordId !== 0 && recordId != null;
|
|
185
|
+
const changeFields = headerFields.filter((field) => field.value !== field.originalValue).map((field) => field.name);
|
|
186
|
+
return {
|
|
187
|
+
...formValues,
|
|
188
|
+
ChangeFields: isUpdate ? changeFields : void 0,
|
|
189
|
+
...details,
|
|
190
|
+
[headerFieldKey]: isUpdate ? recordId : void 0
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function mapServerHeaderToFields(fields, serverRecord, options) {
|
|
194
|
+
const {
|
|
195
|
+
headerFieldKey,
|
|
196
|
+
recordId,
|
|
197
|
+
isCopy = false,
|
|
198
|
+
copyResetFields = [],
|
|
199
|
+
storedFields,
|
|
200
|
+
mainIdCaption = "MainIdField"
|
|
201
|
+
} = options;
|
|
202
|
+
const reset = /* @__PURE__ */ new Set([headerFieldKey, ...copyResetFields]);
|
|
203
|
+
const mapped = fields.map((field) => {
|
|
204
|
+
const isIdentity = isCopy && (reset.has(field.name) || field.caption === mainIdCaption);
|
|
205
|
+
const stored = storedFields?.find((f) => f.name === field.name)?.value;
|
|
206
|
+
const fromServer = serverRecord ? serverRecord[field.name] ?? void 0 : void 0;
|
|
207
|
+
const current = stored !== void 0 ? stored : fromServer;
|
|
208
|
+
return {
|
|
209
|
+
...field,
|
|
210
|
+
value: isIdentity ? null : current,
|
|
211
|
+
originalValue: isIdentity ? null : fromServer,
|
|
212
|
+
isTitleField: field.name === headerFieldKey
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
mapped.push({
|
|
216
|
+
name: headerFieldKey,
|
|
217
|
+
value: isCopy ? null : recordId,
|
|
218
|
+
originalValue: isCopy ? null : recordId,
|
|
219
|
+
type: "hidden"
|
|
220
|
+
});
|
|
221
|
+
return mapped;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export { InMemoryPresenceHub, InMemorySyncHub, buildDocumentPayload, mapDetailsToRowInputs, mapServerHeaderToFields, mapSnapshotToDetails };
|
|
225
|
+
//# sourceMappingURL=headless.js.map
|
|
226
|
+
//# sourceMappingURL=headless.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../infrastructure/sync/InMemorySyncHub.ts","../infrastructure/presence/InMemoryPresenceHub.ts","../infrastructure/document/documentGridMapping.ts"],"names":[],"mappings":"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","file":"headless.js","sourcesContent":["import type { GridEvent } from '../../domain/types/GridEvent';\r\nimport type { SyncTransport } from '../../application/ports/SyncPort';\r\n\r\ntype ClientInbox = {\r\n events: GridEvent[];\r\n delivered: Set<string>;\r\n};\r\n\r\n/**\r\n * Shared in-memory sync hub for tests / demos (PR-138).\r\n * Each client gets a transport bound to a clientId.\r\n */\r\nexport class InMemorySyncHub {\r\n private log: GridEvent[] = [];\r\n private readonly clients = new Map<string, ClientInbox>();\r\n\r\n transportFor(clientId: string): SyncTransport {\r\n if (!this.clients.has(clientId)) {\r\n this.clients.set(clientId, { events: [], delivered: new Set() });\r\n }\r\n return {\r\n push: async (events) => this.push(clientId, events),\r\n pull: async (afterCursor) => this.pull(clientId, afterCursor),\r\n };\r\n }\r\n\r\n private async push(\r\n clientId: string,\r\n events: readonly GridEvent[],\r\n ): Promise<{ acceptedIds: readonly string[] }> {\r\n const acceptedIds: string[] = [];\r\n for (const event of events) {\r\n if (this.log.some((e) => e.eventId === event.eventId)) {\r\n acceptedIds.push(event.eventId);\r\n continue;\r\n }\r\n this.log.push(event);\r\n acceptedIds.push(event.eventId);\r\n for (const [id, inbox] of this.clients) {\r\n if (id === clientId) continue;\r\n inbox.events.push(event);\r\n }\r\n }\r\n return { acceptedIds };\r\n }\r\n\r\n private async pull(\r\n clientId: string,\r\n afterCursor: number,\r\n ): Promise<{ events: readonly GridEvent[]; cursor: number }> {\r\n void afterCursor;\r\n const inbox = this.clients.get(clientId);\r\n if (!inbox) {\r\n return { events: [], cursor: this.log.length };\r\n }\r\n const fresh = inbox.events.filter((e) => !inbox.delivered.has(e.eventId));\r\n for (const e of fresh) inbox.delivered.add(e.eventId);\r\n return { events: fresh, cursor: this.log.length };\r\n }\r\n\r\n /** Test helper: all events currently on the hub. */\r\n getLog(): readonly GridEvent[] {\r\n return this.log;\r\n }\r\n}\r\n","import type {\r\n PresenceMessage,\r\n PresenceTransport,\r\n} from '../../application/ports/PresencePort';\r\n\r\ntype Client = {\r\n listener: ((message: PresenceMessage) => void) | null;\r\n};\r\n\r\n/**\r\n * Shared in-memory presence hub for tests / Node (PR-139).\r\n * Mirrors BroadcastChannel semantics without DOM.\r\n */\r\nexport class InMemoryPresenceHub {\r\n private readonly clients = new Map<string, Client>();\r\n\r\n transportFor(clientId: string): PresenceTransport {\r\n if (!this.clients.has(clientId)) {\r\n this.clients.set(clientId, { listener: null });\r\n }\r\n return {\r\n publish: (message) => {\r\n for (const [id, client] of this.clients) {\r\n if (id === clientId) continue;\r\n client.listener?.(message);\r\n }\r\n },\r\n subscribe: (listener) => {\r\n const client = this.clients.get(clientId)!;\r\n client.listener = listener;\r\n return () => {\r\n if (client.listener === listener) client.listener = null;\r\n };\r\n },\r\n };\r\n }\r\n}\r\n","/**\r\n * Document-grid mapping (header + detail lines) — pure, framework-free.\r\n *\r\n * Extracted from the arianERP form host hook so the project keeps ZERO table\r\n * logic: the host only injects I/O (fetch, save, page state) and calls these\r\n * functions. Nothing here knows Redux, Next.js, or any backend URL.\r\n */\r\nimport type { RowInput } from '../../bootstrap/type';\r\nimport type { TableSnapShot } from '../../engine/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\n\r\n/** Columns the grid owns — never sent back as detail data. */\r\nconst GRID_INTERNAL_COLUMNS = new Set(['collection', 'rowType', 'ChangeFields']);\r\n\r\nexport type SnapshotToDetailsOptions = {\r\n /** Server primary-key field of a detail line (sent for non-new rows when updating). */\r\n detailFieldKey: string;\r\n /** True when the document already exists (edit); false for add / copy. */\r\n isUpdate: boolean;\r\n /** Body key used when every row belongs to the default collection. Default `Details`. */\r\n defaultKey?: string;\r\n /** Name of the default collection. Default `default`. */\r\n defaultCollection?: string;\r\n /** Detail field that receives the grid row number (`index` column). Default `RowNum`. */\r\n rowNumberField?: string;\r\n};\r\n\r\nexport type DetailLine = Record<string, unknown>;\r\n\r\n/**\r\n * Maps a grid snapshot to the server body fragment.\r\n * - Rows with `RowState === 'None'` (unchanged) are skipped.\r\n * - Single default collection → `{ [defaultKey]: DetailLine[] }`.\r\n * - Any custom collection → `{ [collection]: DetailLine[] }` per collection.\r\n */\r\nexport function mapSnapshotToDetails(\r\n snapshot: TableSnapShot | null | undefined,\r\n options: SnapshotToDetailsOptions,\r\n): Record<string, DetailLine[]> {\r\n const {\r\n detailFieldKey,\r\n isUpdate,\r\n defaultKey = 'Details',\r\n defaultCollection = 'default',\r\n rowNumberField = 'RowNum',\r\n } = options;\r\n\r\n const changed = (snapshot?.rows ?? []).filter(\r\n (row) => row.rowState !== RowStateEnum.Unchanged,\r\n );\r\n\r\n const mapped = changed.map((row) => {\r\n const detail: DetailLine = {\r\n RowState: row.rowState,\r\n ChangeFields: row.changeFields,\r\n };\r\n\r\n if (isUpdate && row.rowState !== RowStateEnum.Added) {\r\n detail[detailFieldKey] = row.id;\r\n }\r\n if (row.isSaveDescription) {\r\n detail.isSaveDescription = row.isSaveDescription;\r\n }\r\n\r\n for (const [col, cell] of Object.entries(row.cells ?? {})) {\r\n if (cell == null) continue;\r\n if (GRID_INTERNAL_COLUMNS.has(col)) continue;\r\n if (col === 'index') {\r\n detail[rowNumberField] = cell;\r\n continue;\r\n }\r\n detail[col] =\r\n typeof cell === 'object' && 'value' in (cell as object)\r\n ? (cell as { value: unknown }).value\r\n : cell;\r\n }\r\n\r\n return { detail, collection: row.collection || defaultCollection };\r\n });\r\n\r\n const hasCustomCollection = mapped.some(\r\n (r) => r.collection && r.collection !== defaultCollection,\r\n );\r\n if (!hasCustomCollection) {\r\n return { [defaultKey]: mapped.map((r) => r.detail) };\r\n }\r\n\r\n const byCollection: Record<string, DetailLine[]> = {};\r\n for (const r of mapped) {\r\n (byCollection[r.collection] ??= []).push(r.detail);\r\n }\r\n return byCollection;\r\n}\r\n\r\nexport type DetailsToRowInputsOptions = {\r\n /** Server primary-key field of a detail line. */\r\n detailFieldKey: string;\r\n /** Grid collection the rows belong to. */\r\n collection: string;\r\n /** Copy-from-document: clear the PK and mark every row as new. */\r\n isCopy?: boolean;\r\n /** Generates a client row id for copied rows. Default: random integer. */\r\n newRowId?: () => number;\r\n};\r\n\r\n/**\r\n * Maps server detail lines to grid `RowInput`s (initial seed).\r\n * Copy mode strips the primary key and marks lines `Added`.\r\n */\r\nexport function mapDetailsToRowInputs(\r\n items: readonly DetailLine[],\r\n options: DetailsToRowInputsOptions,\r\n): RowInput[] {\r\n const {\r\n detailFieldKey,\r\n collection,\r\n isCopy = false,\r\n newRowId = () => Math.floor(Math.random() * 100000),\r\n } = options;\r\n\r\n return items.map((item) => {\r\n if (isCopy) {\r\n const rest = { ...item };\r\n delete rest[detailFieldKey];\r\n return {\r\n id: newRowId(),\r\n values: {\r\n ...rest,\r\n [detailFieldKey]: undefined,\r\n RowState: RowStateEnum.Added,\r\n collection,\r\n },\r\n };\r\n }\r\n return {\r\n id: item[detailFieldKey] as number,\r\n values: { ...item, collection },\r\n };\r\n });\r\n}\r\n\r\n/** One header (form) field as the host keeps it. */\r\nexport type DocumentHeaderField = {\r\n name: string;\r\n value?: unknown;\r\n originalValue?: unknown;\r\n type?: string;\r\n caption?: string;\r\n [key: string]: unknown;\r\n};\r\n\r\nexport type BuildDocumentPayloadOptions = {\r\n headerFields: readonly DocumentHeaderField[];\r\n /** Server primary-key field of the header. */\r\n headerFieldKey: string;\r\n /** Existing document id (0 / undefined for a new document). */\r\n recordId?: number;\r\n /** Result of {@link mapSnapshotToDetails}. */\r\n details: Record<string, DetailLine[]>;\r\n /** Header fields that must be sent as numbers even when typed as text. */\r\n numericFieldNames?: readonly string[];\r\n};\r\n\r\n/**\r\n * Builds the save body: header values (empty string → null, numeric coercion),\r\n * `ChangeFields` of the header on update, and the detail lines.\r\n */\r\nexport function buildDocumentPayload(\r\n options: BuildDocumentPayloadOptions,\r\n): Record<string, unknown> {\r\n const {\r\n headerFields,\r\n headerFieldKey,\r\n recordId = 0,\r\n details,\r\n numericFieldNames = [],\r\n } = options;\r\n const numeric = new Set<string>([headerFieldKey, ...numericFieldNames]);\r\n\r\n const formValues = Object.fromEntries(\r\n headerFields.map((field) => {\r\n let value = field.value;\r\n if (value === '') value = null;\r\n if (value != null && (field.type === 'number' || numeric.has(field.name))) {\r\n const n = Number(value);\r\n value = Number.isNaN(n) ? null : n;\r\n }\r\n return [field.name, value];\r\n }),\r\n );\r\n\r\n const isUpdate = recordId !== 0 && recordId != null;\r\n const changeFields = headerFields\r\n .filter((field) => field.value !== field.originalValue)\r\n .map((field) => field.name);\r\n\r\n return {\r\n ...formValues,\r\n ChangeFields: isUpdate ? changeFields : undefined,\r\n ...details,\r\n [headerFieldKey]: isUpdate ? recordId : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Re-seeds header fields from the server record.\r\n * Copy mode clears identity fields (PK + auto-generated numbers).\r\n */\r\nexport function mapServerHeaderToFields(\r\n fields: readonly DocumentHeaderField[],\r\n serverRecord: Record<string, unknown> | null | undefined,\r\n options: {\r\n headerFieldKey: string;\r\n recordId: number;\r\n isCopy?: boolean;\r\n /** Header fields cleared on copy besides the PK. Default none. */\r\n copyResetFields?: readonly string[];\r\n /** Values already edited locally (take precedence over the server). */\r\n storedFields?: readonly DocumentHeaderField[];\r\n /** Field caption that marks the primary-key field (`MainIdField`). */\r\n mainIdCaption?: string;\r\n },\r\n): DocumentHeaderField[] {\r\n const {\r\n headerFieldKey,\r\n recordId,\r\n isCopy = false,\r\n copyResetFields = [],\r\n storedFields,\r\n mainIdCaption = 'MainIdField',\r\n } = options;\r\n const reset = new Set<string>([headerFieldKey, ...copyResetFields]);\r\n\r\n const mapped: DocumentHeaderField[] = fields.map((field) => {\r\n const isIdentity =\r\n isCopy && (reset.has(field.name) || field.caption === mainIdCaption);\r\n const stored = storedFields?.find((f) => f.name === field.name)?.value;\r\n const fromServer = serverRecord\r\n ? (serverRecord[field.name] ?? undefined)\r\n : undefined;\r\n const current = stored !== undefined ? stored : fromServer;\r\n return {\r\n ...field,\r\n value: isIdentity ? null : current,\r\n originalValue: isIdentity ? null : fromServer,\r\n isTitleField: field.name === headerFieldKey,\r\n };\r\n });\r\n\r\n mapped.push({\r\n name: headerFieldKey,\r\n value: isCopy ? null : recordId,\r\n originalValue: isCopy ? null : recordId,\r\n type: 'hidden',\r\n });\r\n return mapped;\r\n}\r\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { E as ERPTableLocale, N as NumberingSystem, a as ERPTableMessages } from './types-D__47BKv.cjs';
|
|
2
|
+
|
|
3
|
+
declare const LOCALE_PACKS: Record<ERPTableLocale, ERPTableMessages>;
|
|
4
|
+
declare function getLocalePack(locale: ERPTableLocale): ERPTableMessages;
|
|
5
|
+
type FormatOptions = {
|
|
6
|
+
locale?: ERPTableLocale;
|
|
7
|
+
numberingSystem?: NumberingSystem;
|
|
8
|
+
};
|
|
9
|
+
/** Intl number formatting with configurable numberingSystem (PR-127). */
|
|
10
|
+
declare function formatLocaleNumber(value: unknown, options?: FormatOptions & Intl.NumberFormatOptions): string;
|
|
11
|
+
/** Intl date formatting; calendar follows locale meta until DateAdapter (PR-128). */
|
|
12
|
+
declare function formatLocaleDate(value: unknown, options?: FormatOptions & Intl.DateTimeFormatOptions): string | null;
|
|
13
|
+
|
|
14
|
+
export { LOCALE_PACKS as L, formatLocaleNumber as a, formatLocaleDate as f, getLocalePack as g };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { E as ERPTableLocale, N as NumberingSystem, a as ERPTableMessages } from './types-D__47BKv.js';
|
|
2
|
+
|
|
3
|
+
declare const LOCALE_PACKS: Record<ERPTableLocale, ERPTableMessages>;
|
|
4
|
+
declare function getLocalePack(locale: ERPTableLocale): ERPTableMessages;
|
|
5
|
+
type FormatOptions = {
|
|
6
|
+
locale?: ERPTableLocale;
|
|
7
|
+
numberingSystem?: NumberingSystem;
|
|
8
|
+
};
|
|
9
|
+
/** Intl number formatting with configurable numberingSystem (PR-127). */
|
|
10
|
+
declare function formatLocaleNumber(value: unknown, options?: FormatOptions & Intl.NumberFormatOptions): string;
|
|
11
|
+
/** Intl date formatting; calendar follows locale meta until DateAdapter (PR-128). */
|
|
12
|
+
declare function formatLocaleDate(value: unknown, options?: FormatOptions & Intl.DateTimeFormatOptions): string | null;
|
|
13
|
+
|
|
14
|
+
export { LOCALE_PACKS as L, formatLocaleNumber as a, formatLocaleDate as f, getLocalePack as g };
|