@vuu-ui/vuu-utils 0.5.0 → 0.5.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/cjs/index.js ADDED
@@ -0,0 +1,561 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ ASC: () => ASC,
24
+ DOWN1: () => DOWN1,
25
+ DOWN2: () => DOWN2,
26
+ DSC: () => DSC,
27
+ DataTypes: () => DataTypes,
28
+ DataWindow: () => DataWindow,
29
+ EventEmitter: () => EventEmitter,
30
+ UP1: () => UP1,
31
+ UP2: () => UP2,
32
+ WindowRange: () => WindowRange,
33
+ addRowsToIndex: () => addRowsToIndex,
34
+ arrayOfIndices: () => arrayOfIndices,
35
+ buildColumnMap: () => buildColumnMap,
36
+ formatDate: () => formatDate,
37
+ getFullRange: () => getFullRange,
38
+ getMovingValueDirection: () => getMovingValueDirection,
39
+ getUniqueId: () => getUniqueId,
40
+ indexRows: () => indexRows,
41
+ invariant: () => invariant,
42
+ isCharacterKey: () => isCharacterKey,
43
+ isEmptyRow: () => isEmptyRow,
44
+ isKeyedColumn: () => isKeyedColumn,
45
+ isQuoteKey: () => isQuoteKey,
46
+ isValidNumber: () => isValidNumber,
47
+ lastWord: () => lastWord,
48
+ mapSortCriteria: () => mapSortCriteria,
49
+ metadataKeys: () => metadataKeys,
50
+ partition: () => partition,
51
+ projectColumns: () => projectColumns,
52
+ projectUpdates: () => projectUpdates,
53
+ resetRange: () => resetRange,
54
+ toColumnDescriptor: () => toColumnDescriptor,
55
+ toKeyedColumn: () => toKeyedColumn,
56
+ update: () => update,
57
+ uuid: () => uuid
58
+ });
59
+ module.exports = __toCommonJS(src_exports);
60
+
61
+ // src/event-emitter.ts
62
+ function isArrayOfListeners(listeners) {
63
+ return Array.isArray(listeners);
64
+ }
65
+ function isOnlyListener(listeners) {
66
+ return !Array.isArray(listeners);
67
+ }
68
+ var EventEmitter = class {
69
+ _events;
70
+ constructor() {
71
+ this._events = {};
72
+ }
73
+ addListener(type, listener) {
74
+ if (!this._events) {
75
+ this._events = {};
76
+ }
77
+ const listeners = this._events[type];
78
+ if (!listeners) {
79
+ this._events[type] = listener;
80
+ } else if (isArrayOfListeners(listeners)) {
81
+ listeners.push(listener);
82
+ } else if (isOnlyListener(listeners)) {
83
+ this._events[type] = [listeners, listener];
84
+ }
85
+ }
86
+ removeListener(type, listener) {
87
+ if (!this._events || !this._events[type]) {
88
+ return;
89
+ }
90
+ const listenerOrListeners = this._events[type];
91
+ let position = -1;
92
+ if (listenerOrListeners === listener) {
93
+ delete this._events[type];
94
+ } else if (Array.isArray(listenerOrListeners)) {
95
+ for (let i = length; i-- > 0; ) {
96
+ if (listenerOrListeners[i] === listener) {
97
+ position = i;
98
+ break;
99
+ }
100
+ }
101
+ if (position < 0) {
102
+ return;
103
+ }
104
+ if (listenerOrListeners.length === 1) {
105
+ listenerOrListeners.length = 0;
106
+ delete this._events[type];
107
+ } else {
108
+ listenerOrListeners.splice(position, 1);
109
+ }
110
+ }
111
+ }
112
+ removeAllListeners(type) {
113
+ if (!this._events) {
114
+ return;
115
+ } else if (type === void 0) {
116
+ delete this._events;
117
+ } else {
118
+ delete this._events[type];
119
+ }
120
+ }
121
+ emit(type, ...args) {
122
+ if (this._events) {
123
+ const handler = this._events[type];
124
+ if (handler) {
125
+ invokeHandler(handler, type, args);
126
+ }
127
+ const wildcardHandler = this._events["*"];
128
+ if (wildcardHandler) {
129
+ invokeHandler(wildcardHandler, type, args);
130
+ }
131
+ }
132
+ }
133
+ once(type, listener) {
134
+ const handler = (evtName, message) => {
135
+ this.removeListener(evtName, handler);
136
+ listener(evtName, message);
137
+ };
138
+ this.on(type, handler);
139
+ }
140
+ on(type, listener) {
141
+ return this.addListener(type, listener);
142
+ }
143
+ };
144
+ function invokeHandler(handler, type, args) {
145
+ if (isArrayOfListeners(handler)) {
146
+ handler.slice().forEach((listener) => invokeHandler(listener, type, args));
147
+ } else {
148
+ switch (args.length) {
149
+ case 0:
150
+ handler(type);
151
+ break;
152
+ case 1:
153
+ handler(type, args[0]);
154
+ break;
155
+ case 2:
156
+ handler(type, args[0], args[1]);
157
+ break;
158
+ default:
159
+ handler.call(null, type, ...args);
160
+ }
161
+ }
162
+ }
163
+
164
+ // src/array-utils.ts
165
+ function arrayOfIndices(length2) {
166
+ const result = Array(length2);
167
+ for (let i = 0; i < length2; i++) {
168
+ result[i] = i;
169
+ }
170
+ return result;
171
+ }
172
+ function partition(array, test, pass = [], fail = []) {
173
+ for (let i = 0, len = array.length; i < len; i++) {
174
+ (test(array[i], i) ? pass : fail).push(array[i]);
175
+ }
176
+ return [pass, fail];
177
+ }
178
+
179
+ // src/column-utils.ts
180
+ var SORT_ASC = "asc";
181
+ function mapSortCriteria(sortCriteria, columnMap, metadataOffset = 0) {
182
+ return sortCriteria.map((s) => {
183
+ if (typeof s === "string") {
184
+ return [columnMap[s] + metadataOffset, "asc"];
185
+ } else if (Array.isArray(s)) {
186
+ const [columnName, sortDir] = s;
187
+ return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];
188
+ } else {
189
+ throw Error("columnUtils.mapSortCriteria invalid input");
190
+ }
191
+ });
192
+ }
193
+ function isKeyedColumn(column) {
194
+ return typeof column.key === "number";
195
+ }
196
+ var toColumnDescriptor = (name) => ({
197
+ name
198
+ });
199
+ var toKeyedColumn = (column, key) => {
200
+ if (typeof column === "string") {
201
+ return { key, name: column };
202
+ }
203
+ if (isKeyedColumn(column)) {
204
+ return column;
205
+ }
206
+ return { ...column, key };
207
+ };
208
+ var EMPTY_COLUMN_MAP = {};
209
+ function buildColumnMap(columns) {
210
+ const start = metadataKeys.count;
211
+ if (columns) {
212
+ return columns.reduce((map, column, i) => {
213
+ if (typeof column === "string") {
214
+ map[column] = start + i;
215
+ } else if (typeof column.key === "number") {
216
+ map[column.name] = column.key;
217
+ } else {
218
+ map[column.name] = start + i;
219
+ }
220
+ return map;
221
+ }, {});
222
+ } else {
223
+ return EMPTY_COLUMN_MAP;
224
+ }
225
+ }
226
+ function projectUpdates(updates) {
227
+ const results = [];
228
+ const metadataOffset = metadataKeys.count - 2;
229
+ for (let i = 0; i < updates.length; i += 3) {
230
+ results[i] = updates[i] + metadataOffset;
231
+ results[i + 1] = updates[i + 1];
232
+ results[i + 2] = updates[i + 2];
233
+ }
234
+ return results;
235
+ }
236
+ function projectColumns(tableRowColumnMap, columns) {
237
+ const columnCount = columns.length;
238
+ const { IDX, RENDER_IDX, DEPTH, COUNT, KEY: KEY2, SELECTED, count } = metadataKeys;
239
+ return (startIdx, offset, selectedRows = []) => (row, i) => {
240
+ const baseRowIdx = row[IDX];
241
+ const out = [];
242
+ for (let i2 = 0; i2 < columnCount; i2++) {
243
+ const colIdx = tableRowColumnMap[columns[i2].name];
244
+ out[count + i2] = row[colIdx];
245
+ }
246
+ out[IDX] = startIdx + i + offset;
247
+ out[RENDER_IDX] = 0;
248
+ out[DEPTH] = 0;
249
+ out[COUNT] = 0;
250
+ out[KEY2] = row[tableRowColumnMap.KEY];
251
+ out[SELECTED] = selectedRows.includes(baseRowIdx) ? 1 : 0;
252
+ return out;
253
+ };
254
+ }
255
+ var metadataKeys = {
256
+ IDX: 0,
257
+ RENDER_IDX: 1,
258
+ IS_LEAF: 2,
259
+ IS_EXPANDED: 3,
260
+ DEPTH: 4,
261
+ COUNT: 5,
262
+ KEY: 6,
263
+ SELECTED: 7,
264
+ count: 8,
265
+ PARENT_IDX: "parent_idx",
266
+ IDX_POINTER: "idx_pointer",
267
+ FILTER_COUNT: "filter_count",
268
+ NEXT_FILTER_IDX: "next_filter_idx"
269
+ };
270
+
271
+ // src/range-utils.ts
272
+ function getFullRange({ from, to }, bufferSize = 0, rowCount = Number.MAX_SAFE_INTEGER) {
273
+ if (bufferSize === 0) {
274
+ return { from, to: Math.min(to, rowCount) };
275
+ } else if (from === 0) {
276
+ return { from, to: Math.min(to + bufferSize, rowCount) };
277
+ } else {
278
+ const rangeSize = to - from;
279
+ const buff = Math.round(bufferSize / 2);
280
+ const shortfallBefore = from - buff < 0;
281
+ const shortFallAfter = rowCount - (to + buff) < 0;
282
+ if (shortfallBefore && shortFallAfter) {
283
+ return { from: 0, to: rowCount };
284
+ } else if (shortfallBefore) {
285
+ return { from: 0, to: rangeSize + bufferSize };
286
+ } else if (shortFallAfter) {
287
+ return { from: Math.max(0, rowCount - (rangeSize + bufferSize)), to: rowCount };
288
+ } else {
289
+ return { from: from - buff, to: to + buff };
290
+ }
291
+ }
292
+ }
293
+ function resetRange({ from, to, bufferSize = 0 }) {
294
+ return {
295
+ from: 0,
296
+ to: to - from,
297
+ bufferSize,
298
+ reset: true
299
+ };
300
+ }
301
+ var WindowRange = class {
302
+ from;
303
+ to;
304
+ constructor(from, to) {
305
+ this.from = from;
306
+ this.to = to;
307
+ }
308
+ isWithin(index) {
309
+ return index >= this.from && index < this.to;
310
+ }
311
+ overlap(from, to) {
312
+ return from >= this.to || to < this.from ? [0, 0] : [Math.max(from, this.from), Math.min(to, this.to)];
313
+ }
314
+ copy() {
315
+ return new WindowRange(this.from, this.to);
316
+ }
317
+ };
318
+
319
+ // src/DataWindow.ts
320
+ var { KEY } = metadataKeys;
321
+ var log = (message) => console.log(`%c[DataWindow] ${message}`, "color: purple;font-weight: bold;");
322
+ var DataWindow = class {
323
+ range;
324
+ data;
325
+ rowCount = 0;
326
+ constructor({ from, to }) {
327
+ log(`constructor ${from} - ${to}`);
328
+ this.range = new WindowRange(from, to);
329
+ this.data = new Array(to - from);
330
+ }
331
+ setRowCount = (rowCount) => {
332
+ if (rowCount < this.data.length) {
333
+ this.data.length = rowCount;
334
+ }
335
+ this.rowCount = rowCount;
336
+ };
337
+ add(data) {
338
+ const [index] = data;
339
+ if (this.isWithinRange(index)) {
340
+ const internalIndex = index - this.range.from;
341
+ const isUpdate = this.data[internalIndex] !== void 0;
342
+ this.data[internalIndex] = data;
343
+ return isUpdate;
344
+ } else {
345
+ return false;
346
+ }
347
+ }
348
+ getAtIndex(index) {
349
+ return this.range.isWithin(index) && this.data[index - this.range.from] != null ? this.data[index - this.range.from] : void 0;
350
+ }
351
+ getByKey(key) {
352
+ return this.data.find((row) => row[KEY] === key);
353
+ }
354
+ isWithinRange(index) {
355
+ return this.range.isWithin(index) && index <= this.rowCount;
356
+ }
357
+ setRange(from, to) {
358
+ log(`setRange ${from} ${to}`);
359
+ if (from !== this.range.from || to !== this.range.to) {
360
+ const [overlapFrom, overlapTo] = this.range.overlap(from, to);
361
+ const newData = new Array(to - from);
362
+ for (let i = overlapFrom; i < overlapTo; i++) {
363
+ const data = this.getAtIndex(i);
364
+ if (data) {
365
+ const index = i - from;
366
+ newData[index] = data;
367
+ }
368
+ }
369
+ this.data = newData;
370
+ this.range.from = from;
371
+ this.range.to = to;
372
+ }
373
+ }
374
+ hasData(from, to) {
375
+ const offset = this.range.from;
376
+ const start = from - offset;
377
+ const end = Math.min(to - offset - 1, this.rowCount - 1);
378
+ return this.data[start] !== void 0 && this.data[end] !== void 0;
379
+ }
380
+ getData(from, to) {
381
+ const { from: clientFrom, to: clientTo } = this.range;
382
+ const startOffset = Math.max(0, from - clientFrom);
383
+ const endOffset = Math.min(to - clientFrom, this.rowCount ?? to);
384
+ return this.data.slice(startOffset, endOffset);
385
+ }
386
+ };
387
+
388
+ // src/data-utils.ts
389
+ var UP1 = "up1";
390
+ var UP2 = "up2";
391
+ var DOWN1 = "down1";
392
+ var DOWN2 = "down2";
393
+ var isValidNumber = (n) => typeof n === "number" && isFinite(n);
394
+ function getMovingValueDirection(newValue, direction, prevValue, decimalPlaces) {
395
+ if (!isFinite(newValue) || prevValue === void 0 || direction === void 0) {
396
+ return "";
397
+ } else {
398
+ let diff = newValue - prevValue;
399
+ if (diff) {
400
+ if (typeof decimalPlaces === "number") {
401
+ diff = +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);
402
+ }
403
+ }
404
+ if (diff) {
405
+ if (direction === "") {
406
+ if (diff < 0) {
407
+ return DOWN1;
408
+ } else {
409
+ return UP1;
410
+ }
411
+ } else if (diff > 0) {
412
+ if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {
413
+ return UP1;
414
+ } else {
415
+ return UP2;
416
+ }
417
+ } else if (direction === UP1 || direction === UP2 || direction === DOWN2) {
418
+ return DOWN1;
419
+ } else {
420
+ return DOWN2;
421
+ }
422
+ } else {
423
+ return "";
424
+ }
425
+ }
426
+ }
427
+
428
+ // src/date-utils.ts
429
+ var formatDate = (date, format) => {
430
+ return date.toUTCString();
431
+ };
432
+
433
+ // src/getUniqueId.ts
434
+ var getUniqueId = () => `hw-${Math.round(Math.random() * 1e5)}`;
435
+
436
+ // src/input-utils.ts
437
+ var actionKeys = {
438
+ Enter: "Enter",
439
+ Delete: "Delete"
440
+ };
441
+ var navigationKeys = {
442
+ Home: "Home",
443
+ End: "End",
444
+ ArrowRight: "ArrowRight",
445
+ ArrowLeft: "ArrowLeft",
446
+ ArrowDown: "ArrowDown",
447
+ ArrowUp: "ArrowUp",
448
+ Tab: "Tab"
449
+ };
450
+ var functionKeys = {
451
+ F1: "F1",
452
+ F2: "F2",
453
+ F3: "F3",
454
+ F4: "F4",
455
+ F5: "F5",
456
+ F6: "F6",
457
+ F7: "F7",
458
+ F8: "F8",
459
+ F9: "F9",
460
+ F10: "F10",
461
+ F11: "F11",
462
+ F12: "F12"
463
+ };
464
+ var specialKeys = {
465
+ ...actionKeys,
466
+ ...navigationKeys,
467
+ ...functionKeys
468
+ };
469
+ var isSpecialKey = (key) => key in specialKeys;
470
+ var isCharacterKey = (evt) => {
471
+ if (isSpecialKey(evt.key)) {
472
+ return false;
473
+ }
474
+ if (typeof evt.which === "number" && evt.which > 0) {
475
+ return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;
476
+ }
477
+ };
478
+ var isQuoteKey = (evt) => {
479
+ return evt.key === '"' || evt.key === "'";
480
+ };
481
+
482
+ // src/invariant.ts
483
+ function invariant(condition, message) {
484
+ if (!condition) {
485
+ const error = new Error(message);
486
+ error.name = "Invariant Violation";
487
+ error.framesToPop = 1;
488
+ throw error;
489
+ }
490
+ }
491
+
492
+ // src/nanoid/index.ts
493
+ var uuid = (size = 21) => {
494
+ let id = "";
495
+ let bytes = crypto.getRandomValues(new Uint8Array(size));
496
+ while (size--) {
497
+ let byte = bytes[size] & 63;
498
+ if (byte < 36) {
499
+ id += byte.toString(36);
500
+ } else if (byte < 62) {
501
+ id += (byte - 26).toString(36).toUpperCase();
502
+ } else if (byte < 63) {
503
+ id += "_";
504
+ } else {
505
+ id += "-";
506
+ }
507
+ }
508
+ return id;
509
+ };
510
+
511
+ // src/constants.ts
512
+ var DataTypes = {
513
+ ROW_DATA: "rowData",
514
+ FILTER_DATA: "filterData",
515
+ FILTER_BINS: "filterBins"
516
+ };
517
+ var ASC = "asc";
518
+ var DSC = "dsc";
519
+
520
+ // src/row-utils.ts
521
+ function addRowsToIndex(rows, index, indexField) {
522
+ for (let idx = 0, len = rows.length; idx < len; idx++) {
523
+ index[rows[idx][indexField]] = idx;
524
+ }
525
+ return index;
526
+ }
527
+ function indexRows(rows, indexField) {
528
+ return addRowsToIndex(rows, {}, indexField);
529
+ }
530
+ function isEmptyRow(row) {
531
+ return row[0] === void 0;
532
+ }
533
+ function update(rows, updates) {
534
+ const results = rows.slice();
535
+ const [[offsetIdx]] = rows;
536
+ for (let i = 0; i < updates.length; i++) {
537
+ const idx = updates[i][0] - offsetIdx;
538
+ if (rows[idx]) {
539
+ const row = rows[idx].slice();
540
+ for (let j = 1; j < updates[i].length; j += 3) {
541
+ row[updates[i][j]] = updates[i][j + 2];
542
+ }
543
+ results[idx] = row;
544
+ } else {
545
+ console.log(`row not found in rows`);
546
+ }
547
+ }
548
+ return results;
549
+ }
550
+
551
+ // src/text-utils.ts
552
+ var lastWord = (text) => {
553
+ const trimmedText = text.trim();
554
+ const pos = trimmedText.lastIndexOf(" ");
555
+ if (pos === -1) {
556
+ return trimmedText;
557
+ } else {
558
+ return trimmedText.slice(pos + 1);
559
+ }
560
+ };
561
+ //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vuu-ui/vuu-utils",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
6
6
  "scripts": {
@@ -18,5 +18,6 @@
18
18
  "index.js.map",
19
19
  "/src"
20
20
  ],
21
- "module": "esm/index.js"
21
+ "module": "esm/index.js",
22
+ "main": "cjs/index.js"
22
23
  }
package/src/index.ts CHANGED
@@ -11,5 +11,4 @@ export * from "./nanoid";
11
11
  export * from "./constants";
12
12
  export * from "./range-utils";
13
13
  export * from "./row-utils";
14
- export * from "./simple-store";
15
14
  export * from "./text-utils";
@@ -1,33 +0,0 @@
1
- // intended use is singleton storage atom within a hook, see useViewserver for examples
2
- import { EventEmitter } from "./event-emitter";
3
-
4
- type StoreStatus = "" | "ready" | "loaded" | "loading";
5
-
6
- export class SimpleStore<T = unknown> extends EventEmitter {
7
- private _value: T;
8
- private _status: StoreStatus = "";
9
-
10
- constructor(value: T, status: StoreStatus = "") {
11
- super();
12
- this._value = value;
13
- this._status = status;
14
- }
15
-
16
- set value(value: T) {
17
- this._value = value;
18
- this._status = "ready";
19
- this.emit("loaded", value);
20
- }
21
-
22
- get value(): T {
23
- return this._value;
24
- }
25
-
26
- set status(status: StoreStatus) {
27
- this._status = status;
28
- }
29
-
30
- get status() {
31
- return this._status;
32
- }
33
- }