@vuu-ui/vuu-utils 0.8.32 → 0.8.34
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/DataWindow.js +71 -0
- package/cjs/DataWindow.js.map +1 -0
- package/cjs/ThemeProvider.js +85 -0
- package/cjs/ThemeProvider.js.map +1 -0
- package/cjs/array-utils.js +87 -0
- package/cjs/array-utils.js.map +1 -0
- package/cjs/box-utils.js +10 -0
- package/cjs/box-utils.js.map +1 -0
- package/cjs/column-utils.js +810 -0
- package/cjs/column-utils.js.map +1 -0
- package/cjs/common-types.js +15 -0
- package/cjs/common-types.js.map +1 -0
- package/cjs/component-registry.js +111 -0
- package/cjs/component-registry.js.map +1 -0
- package/cjs/cookie-utils.js +10 -0
- package/cjs/cookie-utils.js.map +1 -0
- package/cjs/data-utils.js +58 -0
- package/cjs/data-utils.js.map +1 -0
- package/cjs/datasource-action-utils.js +14 -0
- package/cjs/datasource-action-utils.js.map +1 -0
- package/cjs/datasource-utils.js +178 -0
- package/cjs/datasource-utils.js.map +1 -0
- package/cjs/date/dateTimePattern.js +25 -0
- package/cjs/date/dateTimePattern.js.map +1 -0
- package/cjs/date/formatter.js +66 -0
- package/cjs/date/formatter.js.map +1 -0
- package/cjs/date/types.js +23 -0
- package/cjs/date/types.js.map +1 -0
- package/cjs/date/utils.js +10 -0
- package/cjs/date/utils.js.map +1 -0
- package/cjs/debug-utils.js +31 -0
- package/cjs/debug-utils.js.map +1 -0
- package/cjs/event-emitter.js +119 -0
- package/cjs/event-emitter.js.map +1 -0
- package/cjs/filters/filterAsQuery.js +76 -0
- package/cjs/filters/filterAsQuery.js.map +1 -0
- package/cjs/filters/utils.js +89 -0
- package/cjs/filters/utils.js.map +1 -0
- package/cjs/formatting-utils.js +66 -0
- package/cjs/formatting-utils.js.map +1 -0
- package/cjs/getUniqueId.js +6 -0
- package/cjs/getUniqueId.js.map +1 -0
- package/cjs/group-utils.js +12 -0
- package/cjs/group-utils.js.map +1 -0
- package/cjs/html-utils.js +124 -0
- package/cjs/html-utils.js.map +1 -0
- package/cjs/index.js +282 -8
- package/cjs/index.js.map +1 -7
- package/cjs/input-utils.js +10 -0
- package/cjs/input-utils.js.map +1 -0
- package/cjs/invariant.js +13 -0
- package/cjs/invariant.js.map +1 -0
- package/cjs/itemToString.js +23 -0
- package/cjs/itemToString.js.map +1 -0
- package/cjs/json-utils.js +92 -0
- package/cjs/json-utils.js.map +1 -0
- package/cjs/keyboard-utils.js +28 -0
- package/cjs/keyboard-utils.js.map +1 -0
- package/cjs/keyset.js +68 -0
- package/cjs/keyset.js.map +1 -0
- package/cjs/logging-utils.js +61 -0
- package/cjs/logging-utils.js.map +1 -0
- package/cjs/menu-utils.js +6 -0
- package/cjs/menu-utils.js.map +1 -0
- package/cjs/module-utils.js +12 -0
- package/cjs/module-utils.js.map +1 -0
- package/cjs/nanoid/index.js +22 -0
- package/cjs/nanoid/index.js.map +1 -0
- package/cjs/perf-utils.js +35 -0
- package/cjs/perf-utils.js.map +1 -0
- package/cjs/range-utils.js +74 -0
- package/cjs/range-utils.js.map +1 -0
- package/cjs/react-utils.js +21 -0
- package/cjs/react-utils.js.map +1 -0
- package/cjs/round-decimal.js +86 -0
- package/cjs/round-decimal.js.map +1 -0
- package/cjs/row-utils.js +84 -0
- package/cjs/row-utils.js.map +1 -0
- package/cjs/selection-utils.js +236 -0
- package/cjs/selection-utils.js.map +1 -0
- package/cjs/sort-utils.js +61 -0
- package/cjs/sort-utils.js.map +1 -0
- package/cjs/text-utils.js +21 -0
- package/cjs/text-utils.js.map +1 -0
- package/cjs/ts-utils.js +8 -0
- package/cjs/ts-utils.js.map +1 -0
- package/cjs/url-utils.js +21 -0
- package/cjs/url-utils.js.map +1 -0
- package/cjs/useId.js +9 -0
- package/cjs/useId.js.map +1 -0
- package/cjs/useLayoutEffectSkipFirst.js +17 -0
- package/cjs/useLayoutEffectSkipFirst.js.map +1 -0
- package/esm/DataWindow.js +69 -0
- package/esm/DataWindow.js.map +1 -0
- package/esm/ThemeProvider.js +78 -0
- package/esm/ThemeProvider.js.map +1 -0
- package/esm/array-utils.js +79 -0
- package/esm/array-utils.js.map +1 -0
- package/esm/box-utils.js +8 -0
- package/esm/box-utils.js.map +1 -0
- package/esm/column-utils.js +738 -0
- package/esm/column-utils.js.map +1 -0
- package/esm/common-types.js +13 -0
- package/esm/common-types.js.map +1 -0
- package/esm/component-registry.js +99 -0
- package/esm/component-registry.js.map +1 -0
- package/esm/cookie-utils.js +8 -0
- package/esm/cookie-utils.js.map +1 -0
- package/esm/data-utils.js +50 -0
- package/esm/data-utils.js.map +1 -0
- package/esm/datasource-action-utils.js +8 -0
- package/esm/datasource-action-utils.js.map +1 -0
- package/esm/datasource-utils.js +158 -0
- package/esm/datasource-utils.js.map +1 -0
- package/esm/date/dateTimePattern.js +21 -0
- package/esm/date/dateTimePattern.js.map +1 -0
- package/esm/date/formatter.js +63 -0
- package/esm/date/formatter.js.map +1 -0
- package/esm/date/types.js +20 -0
- package/esm/date/types.js.map +1 -0
- package/esm/date/utils.js +8 -0
- package/esm/date/utils.js.map +1 -0
- package/esm/debug-utils.js +29 -0
- package/esm/debug-utils.js.map +1 -0
- package/esm/event-emitter.js +117 -0
- package/esm/event-emitter.js.map +1 -0
- package/esm/filters/filterAsQuery.js +72 -0
- package/esm/filters/filterAsQuery.js.map +1 -0
- package/esm/filters/utils.js +74 -0
- package/esm/filters/utils.js.map +1 -0
- package/esm/formatting-utils.js +62 -0
- package/esm/formatting-utils.js.map +1 -0
- package/esm/getUniqueId.js +4 -0
- package/esm/getUniqueId.js.map +1 -0
- package/esm/group-utils.js +10 -0
- package/esm/group-utils.js.map +1 -0
- package/esm/html-utils.js +111 -0
- package/esm/html-utils.js.map +1 -0
- package/esm/index.js +45 -8
- package/esm/index.js.map +1 -7
- package/esm/input-utils.js +7 -0
- package/esm/input-utils.js.map +1 -0
- package/esm/invariant.js +11 -0
- package/esm/invariant.js.map +1 -0
- package/esm/itemToString.js +21 -0
- package/esm/itemToString.js.map +1 -0
- package/esm/json-utils.js +90 -0
- package/esm/json-utils.js.map +1 -0
- package/esm/keyboard-utils.js +15 -0
- package/esm/keyboard-utils.js.map +1 -0
- package/esm/keyset.js +66 -0
- package/esm/keyset.js.map +1 -0
- package/esm/logging-utils.js +58 -0
- package/esm/logging-utils.js.map +1 -0
- package/esm/menu-utils.js +4 -0
- package/esm/menu-utils.js.map +1 -0
- package/esm/module-utils.js +9 -0
- package/esm/module-utils.js.map +1 -0
- package/esm/nanoid/index.js +20 -0
- package/esm/nanoid/index.js.map +1 -0
- package/esm/perf-utils.js +32 -0
- package/esm/perf-utils.js.map +1 -0
- package/esm/range-utils.js +66 -0
- package/esm/range-utils.js.map +1 -0
- package/esm/react-utils.js +19 -0
- package/esm/react-utils.js.map +1 -0
- package/esm/round-decimal.js +84 -0
- package/esm/round-decimal.js.map +1 -0
- package/esm/row-utils.js +78 -0
- package/esm/row-utils.js.map +1 -0
- package/esm/selection-utils.js +227 -0
- package/esm/selection-utils.js.map +1 -0
- package/esm/sort-utils.js +57 -0
- package/esm/sort-utils.js.map +1 -0
- package/esm/text-utils.js +18 -0
- package/esm/text-utils.js.map +1 -0
- package/esm/ts-utils.js +6 -0
- package/esm/ts-utils.js.map +1 -0
- package/esm/url-utils.js +18 -0
- package/esm/url-utils.js.map +1 -0
- package/esm/useId.js +7 -0
- package/esm/useId.js.map +1 -0
- package/esm/useLayoutEffectSkipFirst.js +15 -0
- package/esm/useLayoutEffectSkipFirst.js.map +1 -0
- package/package.json +12 -9
- package/types/column-utils.d.ts +1 -43
- package/types/filters/filterAsQuery.d.ts +2 -0
- package/types/filters/index.d.ts +1 -1
- package/types/filters/utils.d.ts +44 -2
- package/types/index.d.ts +0 -1
- package/LICENSE +0 -201
- package/types/local-config.d.ts +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-utils.js","sources":["../src/input-utils.ts"],"sourcesContent":["export const isCharacterKey = (key: string) => key.length === 1;\n\nexport const isQuoteKey = (evt: KeyboardEvent) => {\n return evt.key === '\"' || evt.key === \"'\";\n};\n"],"names":[],"mappings":"AAAO,MAAM,cAAiB,GAAA,CAAC,GAAgB,KAAA,GAAA,CAAI,MAAW,KAAA,EAAA;AAEjD,MAAA,UAAA,GAAa,CAAC,GAAuB,KAAA;AAChD,EAAA,OAAO,GAAI,CAAA,GAAA,KAAQ,GAAO,IAAA,GAAA,CAAI,GAAQ,KAAA,GAAA,CAAA;AACxC;;;;"}
|
package/esm/invariant.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariant.js","sources":["../src/invariant.ts"],"sourcesContent":["export function invariant(condition: boolean, message: string) {\n if (!condition) {\n const error = new Error(message);\n error.name = \"Invariant Violation\";\n // TODO what is framesToPop?\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n"],"names":[],"mappings":"AAAgB,SAAA,SAAA,CAAU,WAAoB,OAAiB,EAAA;AAC7D,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAM,MAAA,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA,CAAA;AAC/B,IAAA,KAAA,CAAM,IAAO,GAAA,qBAAA,CAAA;AAIb,IAAA,KAAA,CAAM,WAAc,GAAA,CAAA,CAAA;AACpB,IAAM,MAAA,KAAA,CAAA;AAAA,GACR;AACF;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const isPlainObject = (obj) => Object.prototype.toString.call(obj) === "[object Object]";
|
|
2
|
+
function itemToString(item) {
|
|
3
|
+
if (typeof item === "string") {
|
|
4
|
+
return item;
|
|
5
|
+
} else if (!isPlainObject(item)) {
|
|
6
|
+
return String(item);
|
|
7
|
+
}
|
|
8
|
+
if (Object.prototype.hasOwnProperty.call(item, "label")) {
|
|
9
|
+
return String(item.label);
|
|
10
|
+
}
|
|
11
|
+
console.warn(
|
|
12
|
+
[
|
|
13
|
+
"itemToString: you've likely forgotten to set the label prop on the item object.",
|
|
14
|
+
"You can also provide your own `itemToString` implementation."
|
|
15
|
+
].join("\n")
|
|
16
|
+
);
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { itemToString };
|
|
21
|
+
//# sourceMappingURL=itemToString.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"itemToString.js","sources":["../src/itemToString.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ItemToStringFunction = (item: any) => string;\n\nconst isPlainObject = (obj: unknown) =>\n Object.prototype.toString.call(obj) === \"[object Object]\";\n\nexport function itemToString(item: unknown): string {\n if (typeof item === \"string\") {\n return item;\n } else if (!isPlainObject(item)) {\n return String(item);\n }\n\n if (Object.prototype.hasOwnProperty.call(item, \"label\")) {\n return String((item as { label?: string }).label);\n }\n\n console.warn(\n [\n \"itemToString: you've likely forgotten to set the label prop on the item object.\",\n \"You can also provide your own `itemToString` implementation.\",\n ].join(\"\\n\")\n );\n\n return \"\";\n}\n"],"names":[],"mappings":"AAGA,MAAM,aAAA,GAAgB,CAAC,GACrB,KAAA,MAAA,CAAO,UAAU,QAAS,CAAA,IAAA,CAAK,GAAG,CAAM,KAAA,iBAAA,CAAA;AAEnC,SAAS,aAAa,IAAuB,EAAA;AAClD,EAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC5B,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,CAAC,aAAc,CAAA,IAAI,CAAG,EAAA;AAC/B,IAAA,OAAO,OAAO,IAAI,CAAA,CAAA;AAAA,GACpB;AAEA,EAAA,IAAI,OAAO,SAAU,CAAA,cAAA,CAAe,IAAK,CAAA,IAAA,EAAM,OAAO,CAAG,EAAA;AACvD,IAAO,OAAA,MAAA,CAAQ,KAA4B,KAAK,CAAA,CAAA;AAAA,GAClD;AAEA,EAAQ,OAAA,CAAA,IAAA;AAAA,IACN;AAAA,MACE,iFAAA;AAAA,MACA,8DAAA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AAAA,GACb,CAAA;AAEA,EAAO,OAAA,EAAA,CAAA;AACT;;;;"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { metadataKeys } from './column-utils.js';
|
|
2
|
+
|
|
3
|
+
const { COUNT } = metadataKeys;
|
|
4
|
+
const isJsonData = (value) => typeof value === "object" && value !== null;
|
|
5
|
+
const vuuRowDataItemTypes = ["boolean", "number", "string"];
|
|
6
|
+
const isVuuRowDataItem = (value) => vuuRowDataItemTypes.includes(typeof value);
|
|
7
|
+
const typeofVuuDataItem = (value) => typeof value === "boolean" ? "boolean" : typeof value === "number" ? "number" : "string";
|
|
8
|
+
const getCellValue = (attribute, attributeValue) => {
|
|
9
|
+
if (isJsonData(attributeValue)) {
|
|
10
|
+
return { attribute: `${attribute}+`, attributeValue: "", type: "json" };
|
|
11
|
+
} else if (attributeValue === void 0) {
|
|
12
|
+
return {
|
|
13
|
+
attribute,
|
|
14
|
+
attributeValue: "undefined",
|
|
15
|
+
type: "string"
|
|
16
|
+
};
|
|
17
|
+
} else if (isVuuRowDataItem(attributeValue)) {
|
|
18
|
+
return {
|
|
19
|
+
attribute,
|
|
20
|
+
attributeValue,
|
|
21
|
+
type: typeofVuuDataItem(attributeValue)
|
|
22
|
+
};
|
|
23
|
+
} else {
|
|
24
|
+
throw Error(`unsupported type ${typeof attributeValue} in JSON`);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const jsonColumnType = {
|
|
28
|
+
name: "json",
|
|
29
|
+
renderer: {
|
|
30
|
+
name: "json"
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const jsonToDataSourceRows = (json) => {
|
|
34
|
+
const cols = [];
|
|
35
|
+
cols.push(
|
|
36
|
+
{
|
|
37
|
+
name: "col 1",
|
|
38
|
+
type: jsonColumnType
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "col 2",
|
|
42
|
+
type: jsonColumnType
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
const rows = [];
|
|
46
|
+
addChildValues(rows, json, cols);
|
|
47
|
+
return [cols, rows];
|
|
48
|
+
};
|
|
49
|
+
const addChildValues = (rows, json, cols, index = { value: 0 }, keyBase = "$root", depth = 0) => {
|
|
50
|
+
let leafCount = 0;
|
|
51
|
+
let rowCount = 0;
|
|
52
|
+
if (depth === cols.length - 1) {
|
|
53
|
+
cols.push({
|
|
54
|
+
name: `col ${cols.length + 1}`,
|
|
55
|
+
hidden: true,
|
|
56
|
+
type: jsonColumnType
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const columnEntries = Object.entries(json);
|
|
60
|
+
for (let i = 0; i < columnEntries.length; i++, index.value += 1) {
|
|
61
|
+
const [key, value] = columnEntries[i];
|
|
62
|
+
const { attribute, attributeValue, type } = getCellValue(key, value);
|
|
63
|
+
const isLeaf = type !== "json";
|
|
64
|
+
const blanks = Array(depth).fill("");
|
|
65
|
+
const fullKey = `${keyBase}|${key}`;
|
|
66
|
+
const row = [index.value, index.value, isLeaf, false, depth, 0, fullKey, 0, ...blanks, attribute, attributeValue];
|
|
67
|
+
rows.push(row);
|
|
68
|
+
rowCount += 1;
|
|
69
|
+
if (isJsonData(value)) {
|
|
70
|
+
const [nestedLeafCount, nestedRowCount] = addChildValues(
|
|
71
|
+
rows,
|
|
72
|
+
value,
|
|
73
|
+
cols,
|
|
74
|
+
{ value: index.value + 1 },
|
|
75
|
+
fullKey,
|
|
76
|
+
depth + 1
|
|
77
|
+
);
|
|
78
|
+
row[COUNT] = nestedLeafCount;
|
|
79
|
+
leafCount += nestedLeafCount;
|
|
80
|
+
rowCount += nestedRowCount;
|
|
81
|
+
index.value += nestedRowCount;
|
|
82
|
+
} else {
|
|
83
|
+
leafCount += 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return [leafCount, rowCount];
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export { jsonToDataSourceRows };
|
|
90
|
+
//# sourceMappingURL=json-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-utils.js","sources":["../src/json-utils.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnDescriptor,\n ColumnTypeDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { metadataKeys } from \"./column-utils\";\n\nconst { COUNT } = metadataKeys;\n\nexport type JsonData =\n | {\n [key: string]: unknown;\n }\n | JsonData[];\n\ntype Index = { value: number };\n\ntype CellValue = {\n attribute: string;\n attributeValue: JsonData | VuuRowDataItemType | null;\n type: \"json\" | \"number\" | \"string\" | \"boolean\";\n};\n\nconst isJsonData = (value: unknown): value is JsonData =>\n typeof value === \"object\" && value !== null;\n\nconst vuuRowDataItemTypes = [\"boolean\", \"number\", \"string\"];\nconst isVuuRowDataItem = (value: unknown): value is VuuRowDataItemType =>\n vuuRowDataItemTypes.includes(typeof value);\nconst typeofVuuDataItem = (value: VuuRowDataItemType) =>\n typeof value === \"boolean\"\n ? \"boolean\"\n : typeof value === \"number\"\n ? \"number\"\n : \"string\";\n\nconst getCellValue = (\n attribute: string,\n attributeValue: unknown\n): CellValue => {\n if (isJsonData(attributeValue)) {\n return { attribute: `${attribute}+`, attributeValue: \"\", type: \"json\" };\n } else if (attributeValue === undefined) {\n return {\n attribute,\n attributeValue: \"undefined\",\n type: \"string\",\n };\n } else if (isVuuRowDataItem(attributeValue)) {\n return {\n attribute,\n attributeValue,\n type: typeofVuuDataItem(attributeValue),\n };\n } else {\n throw Error(`unsupported type ${typeof attributeValue} in JSON`);\n }\n};\n\nconst jsonColumnType: ColumnTypeDescriptor = {\n name: \"json\",\n renderer: {\n name: \"json\",\n },\n};\n\nexport const jsonToDataSourceRows = (\n json: JsonData\n): [ColumnDescriptor[], DataSourceRow[]] => {\n const cols: ColumnDescriptor[] = [];\n\n cols.push(\n {\n name: \"col 1\",\n type: jsonColumnType,\n },\n {\n name: \"col 2\",\n type: jsonColumnType,\n }\n );\n\n const rows: DataSourceRow[] = [];\n\n addChildValues(rows, json, cols);\n return [cols, rows];\n};\n\nconst addChildValues = (\n rows: DataSourceRow[],\n json: JsonData,\n cols: ColumnDescriptor[],\n index: Index = { value: 0 },\n keyBase = \"$root\",\n depth = 0\n): [number, number] => {\n let leafCount = 0;\n let rowCount = 0;\n if (depth === cols.length - 1) {\n cols.push({\n name: `col ${cols.length + 1}`,\n hidden: true,\n type: jsonColumnType,\n });\n }\n const columnEntries = Object.entries(json);\n for (let i = 0; i < columnEntries.length; i++, index.value += 1) {\n const [key, value] = columnEntries[i];\n const { attribute, attributeValue, type } = getCellValue(key, value);\n const isLeaf = type !== \"json\";\n const blanks = Array(depth).fill(\"\");\n const fullKey = `${keyBase}|${key}`;\n // prettier-ignore\n const row = [index.value, index.value, isLeaf,false,depth,0,fullKey,0, ...blanks, attribute, attributeValue ] as DataSourceRow\n rows.push(row);\n rowCount += 1;\n\n if (isJsonData(value)) {\n const [nestedLeafCount, nestedRowCount] = addChildValues(\n rows,\n value,\n cols,\n { value: index.value + 1 },\n fullKey,\n depth + 1\n );\n row[COUNT] = nestedLeafCount;\n leafCount += nestedLeafCount;\n rowCount += nestedRowCount;\n index.value += nestedRowCount;\n } else {\n leafCount += 1;\n }\n }\n\n return [leafCount, rowCount];\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const ArrowUp = "ArrowUp";
|
|
2
|
+
const ArrowDown = "ArrowDown";
|
|
3
|
+
const ArrowLeft = "ArrowLeft";
|
|
4
|
+
const ArrowRight = "ArrowRight";
|
|
5
|
+
const Enter = "Enter";
|
|
6
|
+
const Escape = "Escape";
|
|
7
|
+
const Home = "Home";
|
|
8
|
+
const End = "End";
|
|
9
|
+
const PageUp = "PageUp";
|
|
10
|
+
const PageDown = "PageDown";
|
|
11
|
+
const Space = " ";
|
|
12
|
+
const Tab = "Tab";
|
|
13
|
+
|
|
14
|
+
export { ArrowDown, ArrowLeft, ArrowRight, ArrowUp, End, Enter, Escape, Home, PageDown, PageUp, Space, Tab };
|
|
15
|
+
//# sourceMappingURL=keyboard-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard-utils.js","sources":["../src/keyboard-utils.ts"],"sourcesContent":["export const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Home = \"Home\";\nexport const End = \"End\";\nexport const PageUp = \"PageUp\";\nexport const PageDown = \"PageDown\";\nexport const Space = \" \";\nexport const Tab = \"Tab\";\n"],"names":[],"mappings":"AAAO,MAAM,OAAU,GAAA,UAAA;AAChB,MAAM,SAAY,GAAA,YAAA;AAClB,MAAM,SAAY,GAAA,YAAA;AAClB,MAAM,UAAa,GAAA,aAAA;AACnB,MAAM,KAAQ,GAAA,QAAA;AACd,MAAM,MAAS,GAAA,SAAA;AACf,MAAM,IAAO,GAAA,OAAA;AACb,MAAM,GAAM,GAAA,MAAA;AACZ,MAAM,MAAS,GAAA,SAAA;AACf,MAAM,QAAW,GAAA,WAAA;AACjB,MAAM,KAAQ,GAAA,IAAA;AACd,MAAM,GAAM,GAAA;;;;"}
|
package/esm/keyset.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const EMPTY = [];
|
|
2
|
+
class KeySet {
|
|
3
|
+
constructor(range) {
|
|
4
|
+
this.keys = /* @__PURE__ */ new Map();
|
|
5
|
+
this.nextKeyValue = 0;
|
|
6
|
+
this.range = range;
|
|
7
|
+
this.init(range);
|
|
8
|
+
}
|
|
9
|
+
next(free = EMPTY) {
|
|
10
|
+
if (free.length > 0) {
|
|
11
|
+
return free.shift();
|
|
12
|
+
} else {
|
|
13
|
+
return this.nextKeyValue++;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
init({ from, to }) {
|
|
17
|
+
this.keys.clear();
|
|
18
|
+
this.nextKeyValue = 0;
|
|
19
|
+
for (let rowIndex = from; rowIndex < to; rowIndex++) {
|
|
20
|
+
const nextKeyValue = this.next();
|
|
21
|
+
this.keys.set(rowIndex, nextKeyValue);
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
reset(range) {
|
|
26
|
+
const { from, to } = range;
|
|
27
|
+
const newSize = to - from;
|
|
28
|
+
const currentSize = this.range.to - this.range.from;
|
|
29
|
+
this.range = range;
|
|
30
|
+
if (currentSize > newSize) {
|
|
31
|
+
return this.init(range);
|
|
32
|
+
}
|
|
33
|
+
const freeKeys = [];
|
|
34
|
+
this.keys.forEach((keyValue, rowIndex) => {
|
|
35
|
+
if (rowIndex < from || rowIndex >= to) {
|
|
36
|
+
freeKeys.push(keyValue);
|
|
37
|
+
this.keys.delete(rowIndex);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
for (let rowIndex = from; rowIndex < to; rowIndex++) {
|
|
41
|
+
if (!this.keys.has(rowIndex)) {
|
|
42
|
+
const nextKeyValue = this.next(freeKeys);
|
|
43
|
+
this.keys.set(rowIndex, nextKeyValue);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
keyFor(rowIndex) {
|
|
49
|
+
const key = this.keys.get(rowIndex);
|
|
50
|
+
if (key === void 0) {
|
|
51
|
+
console.log(`key not found
|
|
52
|
+
keys: ${this.toDebugString()}
|
|
53
|
+
`);
|
|
54
|
+
throw Error(`KeySet, no key found for rowIndex ${rowIndex}`);
|
|
55
|
+
}
|
|
56
|
+
return key;
|
|
57
|
+
}
|
|
58
|
+
toDebugString() {
|
|
59
|
+
return `${this.keys.size} keys
|
|
60
|
+
${Array.from(this.keys.entries()).sort(([key1], [key2]) => key1 - key2).map(([k, v]) => `${k}=>${v}`).join(",")}]
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { KeySet };
|
|
66
|
+
//# sourceMappingURL=keyset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyset.js","sources":["../src/keyset.ts"],"sourcesContent":["import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\n\nconst EMPTY: number[] = [];\nexport class KeySet {\n private keys = new Map<number, number>();\n private nextKeyValue = 0;\n private range: VuuRange;\n\n constructor(range: VuuRange) {\n this.range = range;\n this.init(range);\n }\n\n public next(free: number[] = EMPTY): number {\n if (free.length > 0) {\n return free.shift() as number;\n } else {\n return this.nextKeyValue++;\n }\n }\n\n private init({ from, to }: VuuRange) {\n this.keys.clear();\n this.nextKeyValue = 0;\n\n for (let rowIndex = from; rowIndex < to; rowIndex++) {\n const nextKeyValue = this.next();\n this.keys.set(rowIndex, nextKeyValue);\n }\n\n return true;\n }\n\n public reset(range: VuuRange) {\n const { from, to } = range;\n\n const newSize = to - from;\n const currentSize = this.range.to - this.range.from;\n this.range = range;\n\n if (currentSize > newSize) {\n // We re-initialize the range when the range size reduces, even though this will\n // potentially re-render all items.\n return this.init(range);\n }\n\n const freeKeys: number[] = [];\n\n this.keys.forEach((keyValue, rowIndex) => {\n if (rowIndex < from || rowIndex >= to) {\n freeKeys.push(keyValue);\n this.keys.delete(rowIndex);\n }\n });\n\n for (let rowIndex = from; rowIndex < to; rowIndex++) {\n if (!this.keys.has(rowIndex)) {\n const nextKeyValue = this.next(freeKeys);\n this.keys.set(rowIndex, nextKeyValue);\n }\n }\n\n return false;\n }\n\n public keyFor(rowIndex: number): number {\n const key = this.keys.get(rowIndex);\n if (key === undefined) {\n console.log(`key not found\n keys: ${this.toDebugString()}\n `);\n throw Error(`KeySet, no key found for rowIndex ${rowIndex}`);\n }\n return key;\n }\n\n public toDebugString() {\n return `${this.keys.size} keys\n${Array.from(this.keys.entries())\n .sort(([key1], [key2]) => key1 - key2)\n .map<string>(([k, v]) => `${k}=>${v}`)\n .join(\",\")}]\\n`;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getCookieValue } from './cookie-utils.js';
|
|
2
|
+
|
|
3
|
+
const logLevels = ["error", "warn", "info", "debug"];
|
|
4
|
+
const isValidLogLevel = (value) => typeof value === "string" && logLevels.includes(value);
|
|
5
|
+
const DEFAULT_LOG_LEVEL = "error";
|
|
6
|
+
const NO_OP = () => void 0;
|
|
7
|
+
const DEFAULT_DEBUG_LEVEL = process.env.NODE_ENV === "production" ? "error" : "info";
|
|
8
|
+
const { loggingLevel = DEFAULT_DEBUG_LEVEL } = getLoggingSettings();
|
|
9
|
+
const logger = (category) => {
|
|
10
|
+
const debugEnabled = loggingLevel === "debug";
|
|
11
|
+
const infoEnabled = debugEnabled || loggingLevel === "info";
|
|
12
|
+
const warnEnabled = infoEnabled || loggingLevel === "warn";
|
|
13
|
+
const errorEnabled = warnEnabled || loggingLevel === "error";
|
|
14
|
+
const info = infoEnabled ? (message) => console.info(`[${category}] ${message}`) : NO_OP;
|
|
15
|
+
const warn = warnEnabled ? (message) => console.warn(`[${category}] ${message}`) : NO_OP;
|
|
16
|
+
const debug = debugEnabled ? (message) => console.debug(`[${category}] ${message}`) : NO_OP;
|
|
17
|
+
const error = errorEnabled ? (message) => console.error(`[${category}] ${message}`) : NO_OP;
|
|
18
|
+
if (process.env.NODE_ENV === "production") {
|
|
19
|
+
return {
|
|
20
|
+
errorEnabled,
|
|
21
|
+
error
|
|
22
|
+
};
|
|
23
|
+
} else {
|
|
24
|
+
return {
|
|
25
|
+
debugEnabled,
|
|
26
|
+
infoEnabled,
|
|
27
|
+
warnEnabled,
|
|
28
|
+
errorEnabled,
|
|
29
|
+
info,
|
|
30
|
+
warn,
|
|
31
|
+
debug,
|
|
32
|
+
error
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
function getLoggingSettings() {
|
|
37
|
+
if (typeof loggingSettings !== "undefined") {
|
|
38
|
+
return loggingSettings;
|
|
39
|
+
} else {
|
|
40
|
+
return {
|
|
41
|
+
loggingLevel: getLoggingLevelFromCookie()
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function getLoggingLevelFromCookie() {
|
|
46
|
+
const value = getCookieValue("vuu-logging-level");
|
|
47
|
+
if (isValidLogLevel(value)) {
|
|
48
|
+
return value;
|
|
49
|
+
} else {
|
|
50
|
+
return DEFAULT_LOG_LEVEL;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const getLoggingConfigForWorker = () => {
|
|
54
|
+
return `const loggingSettings = { loggingLevel: "${getLoggingLevelFromCookie()}"};`;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export { getLoggingConfigForWorker, logger };
|
|
58
|
+
//# sourceMappingURL=logging-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging-utils.js","sources":["../src/logging-utils.ts"],"sourcesContent":["import { getCookieValue } from \"./cookie-utils\";\n\ndeclare global {\n const loggingSettings: loggingSettings;\n}\n\nexport interface LogFn {\n (message?: unknown, ...optionalParams: unknown[]): void;\n}\nexport interface AssertLogFn {\n (condition: boolean, message?: unknown, errorMessaage?: unknown): void;\n}\n\nexport interface TableLogFn {\n (properties?: object): void;\n}\n\ntype loggingSettings = {\n loggingLevel: LogLevel;\n};\n\nexport interface Logger {\n warn: LogFn;\n error: LogFn;\n debug: LogFn;\n info: LogFn;\n}\n\nexport type LogLevel = keyof Logger;\n\nconst logLevels = [\"error\", \"warn\", \"info\", \"debug\"];\nconst isValidLogLevel = (value: unknown): value is LogLevel =>\n typeof value === \"string\" && logLevels.includes(value);\n\nconst DEFAULT_LOG_LEVEL: LogLevel = \"error\";\n\nexport type BuildEnv = \"production\" | \"development\";\n\nconst NO_OP = () => undefined;\n\nconst DEFAULT_DEBUG_LEVEL: LogLevel =\n process.env.NODE_ENV === \"production\" ? \"error\" : \"info\";\n\nconst { loggingLevel = DEFAULT_DEBUG_LEVEL } = getLoggingSettings();\n// typeof loggingSettings !== \"undefined\" ? loggingSettings : {};\n// const { loggingLevel = DEFAULT_DEBUG_LEVEL } =\n// typeof loggingSettings !== \"undefined\" ? loggingSettings : {};\n\nexport const logger = (category: string) => {\n const debugEnabled = loggingLevel === \"debug\";\n const infoEnabled = debugEnabled || loggingLevel === \"info\";\n const warnEnabled = infoEnabled || loggingLevel === \"warn\";\n const errorEnabled = warnEnabled || loggingLevel === \"error\";\n\n const info = infoEnabled\n ? (message: string) => console.info(`[${category}] ${message}`)\n : NO_OP;\n const warn = warnEnabled\n ? (message: string) => console.warn(`[${category}] ${message}`)\n : NO_OP;\n const debug = debugEnabled\n ? (message: string) => console.debug(`[${category}] ${message}`)\n : NO_OP;\n const error = errorEnabled\n ? (message: string) => console.error(`[${category}] ${message}`)\n : NO_OP;\n\n if (process.env.NODE_ENV === \"production\") {\n return {\n errorEnabled,\n error,\n };\n } else {\n return {\n debugEnabled,\n infoEnabled,\n warnEnabled,\n errorEnabled,\n info,\n warn,\n debug,\n error,\n };\n }\n};\n\nfunction getLoggingSettings() {\n if (typeof loggingSettings !== \"undefined\") {\n return loggingSettings;\n } else {\n return {\n loggingLevel: getLoggingLevelFromCookie(),\n };\n }\n}\n\nfunction getLoggingLevelFromCookie(): LogLevel {\n const value = getCookieValue(\"vuu-logging-level\");\n if (isValidLogLevel(value)) {\n return value;\n } else {\n return DEFAULT_LOG_LEVEL;\n }\n}\n\nexport const getLoggingConfigForWorker = () => {\n return `const loggingSettings = { loggingLevel: \"${getLoggingLevelFromCookie()}\"};`;\n};\n"],"names":[],"mappings":";;AA8BA,MAAM,SAAY,GAAA,CAAC,OAAS,EAAA,MAAA,EAAQ,QAAQ,OAAO,CAAA,CAAA;AACnD,MAAM,eAAA,GAAkB,CAAC,KACvB,KAAA,OAAO,UAAU,QAAY,IAAA,SAAA,CAAU,SAAS,KAAK,CAAA,CAAA;AAEvD,MAAM,iBAA8B,GAAA,OAAA,CAAA;AAIpC,MAAM,QAAQ,MAAM,KAAA,CAAA,CAAA;AAEpB,MAAM,mBACJ,GAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,eAAe,OAAU,GAAA,MAAA,CAAA;AAEpD,MAAM,EAAE,YAAA,GAAe,mBAAoB,EAAA,GAAI,kBAAmB,EAAA,CAAA;AAKrD,MAAA,MAAA,GAAS,CAAC,QAAqB,KAAA;AAC1C,EAAA,MAAM,eAAe,YAAiB,KAAA,OAAA,CAAA;AACtC,EAAM,MAAA,WAAA,GAAc,gBAAgB,YAAiB,KAAA,MAAA,CAAA;AACrD,EAAM,MAAA,WAAA,GAAc,eAAe,YAAiB,KAAA,MAAA,CAAA;AACpD,EAAM,MAAA,YAAA,GAAe,eAAe,YAAiB,KAAA,OAAA,CAAA;AAErD,EAAM,MAAA,IAAA,GAAO,WACT,GAAA,CAAC,OAAoB,KAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAC5D,GAAA,KAAA,CAAA;AACJ,EAAM,MAAA,IAAA,GAAO,WACT,GAAA,CAAC,OAAoB,KAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAC5D,GAAA,KAAA,CAAA;AACJ,EAAM,MAAA,KAAA,GAAQ,YACV,GAAA,CAAC,OAAoB,KAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAC7D,GAAA,KAAA,CAAA;AACJ,EAAM,MAAA,KAAA,GAAQ,YACV,GAAA,CAAC,OAAoB,KAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAC7D,GAAA,KAAA,CAAA;AAEJ,EAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,IAAO,OAAA;AAAA,MACL,YAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACK,MAAA;AACL,IAAO,OAAA;AAAA,MACL,YAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF;AACF,EAAA;AAEA,SAAS,kBAAqB,GAAA;AAC5B,EAAI,IAAA,OAAO,oBAAoB,WAAa,EAAA;AAC1C,IAAO,OAAA,eAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA;AAAA,MACL,cAAc,yBAA0B,EAAA;AAAA,KAC1C,CAAA;AAAA,GACF;AACF,CAAA;AAEA,SAAS,yBAAsC,GAAA;AAC7C,EAAM,MAAA,KAAA,GAAQ,eAAe,mBAAmB,CAAA,CAAA;AAChD,EAAI,IAAA,eAAA,CAAgB,KAAK,CAAG,EAAA;AAC1B,IAAO,OAAA,KAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,iBAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEO,MAAM,4BAA4B,MAAM;AAC7C,EAAO,OAAA,CAAA,yCAAA,EAA4C,2BAA2B,CAAA,GAAA,CAAA,CAAA;AAChF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu-utils.js","sources":["../src/menu-utils.ts"],"sourcesContent":["import {\n ContextMenuGroupItemDescriptor,\n ContextMenuItemDescriptor,\n} from \"@vuu-ui/vuu-data-types\";\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n"],"names":[],"mappings":"AAKO,MAAM,yBAA4B,GAAA,CACvC,QAEA,KAAA,QAAA,KAAa,UAAa,UAAc,IAAA;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const isModule = (entity) => entity !== void 0 && typeof entity !== "function";
|
|
2
|
+
const assertModuleExportsAtLeastOneComponent = (module) => {
|
|
3
|
+
if (module && Object.values(module).every((item) => isModule(item))) {
|
|
4
|
+
throw Error("module file, no components");
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export { assertModuleExportsAtLeastOneComponent, isModule };
|
|
9
|
+
//# sourceMappingURL=module-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-utils.js","sources":["../src/module-utils.ts"],"sourcesContent":["export type ReactComponent = {\n (props?: any): JSX.Element;\n};\n\nexport const isModule = (entity: Module | ReactComponent): entity is Module =>\n entity !== undefined && typeof entity !== \"function\";\n\nexport interface Module<T = ReactComponent> {\n [key: string]: Module<T> | T;\n}\n\nexport const assertModuleExportsAtLeastOneComponent = (module: Module) => {\n if (module && Object.values(module).every((item) => isModule(item))) {\n throw Error(\"module file, no components\");\n }\n};\n"],"names":[],"mappings":"AAIO,MAAM,WAAW,CAAC,MAAA,KACvB,MAAW,KAAA,KAAA,CAAA,IAAa,OAAO,MAAW,KAAA,WAAA;AAM/B,MAAA,sCAAA,GAAyC,CAAC,MAAmB,KAAA;AACxE,EAAI,IAAA,MAAA,IAAU,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAE,KAAM,CAAA,CAAC,IAAS,KAAA,QAAA,CAAS,IAAI,CAAC,CAAG,EAAA;AACnE,IAAA,MAAM,MAAM,4BAA4B,CAAA,CAAA;AAAA,GAC1C;AACF;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const uuid = (size = 21) => {
|
|
2
|
+
let id = "";
|
|
3
|
+
const bytes = crypto.getRandomValues(new Uint8Array(size));
|
|
4
|
+
while (size--) {
|
|
5
|
+
const byte = bytes[size] & 63;
|
|
6
|
+
if (byte < 36) {
|
|
7
|
+
id += byte.toString(36);
|
|
8
|
+
} else if (byte < 62) {
|
|
9
|
+
id += (byte - 26).toString(36).toUpperCase();
|
|
10
|
+
} else if (byte < 63) {
|
|
11
|
+
id += "_";
|
|
12
|
+
} else {
|
|
13
|
+
id += "-";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return id;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { uuid };
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/nanoid/index.ts"],"sourcesContent":["// This is the index.browser.js file from nanoid\n// couldn't get original code to work as npm import without crypro warnings -\n// seemed to be picking up node version, not browser version\n\nexport const uuid = (size = 21): string => {\n let id = '';\n const bytes = crypto.getRandomValues(new Uint8Array(size));\n\n // A compact alternative for `for (var i = 0; i < step; i++)`.\n while (size--) {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n const byte = bytes[size] & 63;\n if (byte < 36) {\n // `0-9a-z`\n id += byte.toString(36);\n } else if (byte < 62) {\n // `A-Z`\n id += (byte - 26).toString(36).toUpperCase();\n } else if (byte < 63) {\n id += '_';\n } else {\n id += '-';\n }\n }\n return id;\n};\n"],"names":[],"mappings":"AAIa,MAAA,IAAA,GAAO,CAAC,IAAA,GAAO,EAAe,KAAA;AACzC,EAAA,IAAI,EAAK,GAAA,EAAA,CAAA;AACT,EAAA,MAAM,QAAQ,MAAO,CAAA,eAAA,CAAgB,IAAI,UAAA,CAAW,IAAI,CAAC,CAAA,CAAA;AAGzD,EAAA,OAAO,IAAQ,EAAA,EAAA;AAMb,IAAM,MAAA,IAAA,GAAO,KAAM,CAAA,IAAI,CAAI,GAAA,EAAA,CAAA;AAC3B,IAAA,IAAI,OAAO,EAAI,EAAA;AAEb,MAAM,EAAA,IAAA,IAAA,CAAK,SAAS,EAAE,CAAA,CAAA;AAAA,KACxB,MAAA,IAAW,OAAO,EAAI,EAAA;AAEpB,MAAA,EAAA,IAAA,CAAO,IAAO,GAAA,EAAA,EAAI,QAAS,CAAA,EAAE,EAAE,WAAY,EAAA,CAAA;AAAA,KAC7C,MAAA,IAAW,OAAO,EAAI,EAAA;AACpB,MAAM,EAAA,IAAA,GAAA,CAAA;AAAA,KACD,MAAA;AACL,MAAM,EAAA,IAAA,GAAA,CAAA;AAAA,KACR;AAAA,GACF;AACA,EAAO,OAAA,EAAA,CAAA;AACT;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function debounce(callback, timeInterval) {
|
|
2
|
+
let timeout;
|
|
3
|
+
return (...args) => {
|
|
4
|
+
clearTimeout(timeout);
|
|
5
|
+
timeout = window.setTimeout(() => callback(...args), timeInterval);
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function throttle(callback, limit) {
|
|
9
|
+
let wait = false;
|
|
10
|
+
let lastArgs = void 0;
|
|
11
|
+
function checkLastArgs() {
|
|
12
|
+
if (lastArgs == void 0) {
|
|
13
|
+
wait = false;
|
|
14
|
+
} else {
|
|
15
|
+
callback(...lastArgs);
|
|
16
|
+
lastArgs = void 0;
|
|
17
|
+
setTimeout(checkLastArgs, limit);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return (...args) => {
|
|
21
|
+
if (wait) {
|
|
22
|
+
lastArgs = args;
|
|
23
|
+
} else {
|
|
24
|
+
callback(...args);
|
|
25
|
+
wait = true;
|
|
26
|
+
setTimeout(checkLastArgs, limit);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { debounce, throttle };
|
|
32
|
+
//# sourceMappingURL=perf-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-utils.js","sources":["../src/perf-utils.ts"],"sourcesContent":["type VoidFunction = (...args: any) => void;\nexport type PerfFunction<T extends VoidFunction> = (\n ...args: Parameters<T>\n) => void;\n\nexport function debounce<T extends VoidFunction>(\n callback: T,\n timeInterval: number\n): PerfFunction<T> {\n let timeout: number | undefined;\n return (...args: unknown[]) => {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => callback(...args), timeInterval);\n };\n}\n\nexport function throttle<T extends VoidFunction>(\n callback: T,\n limit: number\n): PerfFunction<T> {\n let wait = false;\n let lastArgs: unknown[] | undefined = undefined;\n\n function checkLastArgs() {\n if (lastArgs == undefined) {\n wait = false;\n } else {\n callback(...lastArgs);\n lastArgs = undefined;\n setTimeout(checkLastArgs, limit);\n }\n }\n\n return (...args: unknown[]) => {\n if (wait) {\n lastArgs = args;\n } else {\n callback(...args);\n wait = true;\n setTimeout(checkLastArgs, limit);\n }\n };\n}\n"],"names":[],"mappings":"AAKgB,SAAA,QAAA,CACd,UACA,YACiB,EAAA;AACjB,EAAI,IAAA,OAAA,CAAA;AACJ,EAAA,OAAO,IAAI,IAAoB,KAAA;AAC7B,IAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AACpB,IAAA,OAAA,GAAU,OAAO,UAAW,CAAA,MAAM,SAAS,GAAG,IAAI,GAAG,YAAY,CAAA,CAAA;AAAA,GACnE,CAAA;AACF,CAAA;AAEgB,SAAA,QAAA,CACd,UACA,KACiB,EAAA;AACjB,EAAA,IAAI,IAAO,GAAA,KAAA,CAAA;AACX,EAAA,IAAI,QAAkC,GAAA,KAAA,CAAA,CAAA;AAEtC,EAAA,SAAS,aAAgB,GAAA;AACvB,IAAA,IAAI,YAAY,KAAW,CAAA,EAAA;AACzB,MAAO,IAAA,GAAA,KAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAA,QAAA,CAAS,GAAG,QAAQ,CAAA,CAAA;AACpB,MAAW,QAAA,GAAA,KAAA,CAAA,CAAA;AACX,MAAA,UAAA,CAAW,eAAe,KAAK,CAAA,CAAA;AAAA,KACjC;AAAA,GACF;AAEA,EAAA,OAAO,IAAI,IAAoB,KAAA;AAC7B,IAAA,IAAI,IAAM,EAAA;AACR,MAAW,QAAA,GAAA,IAAA,CAAA;AAAA,KACN,MAAA;AACL,MAAA,QAAA,CAAS,GAAG,IAAI,CAAA,CAAA;AAChB,MAAO,IAAA,GAAA,IAAA,CAAA;AACP,MAAA,UAAA,CAAW,eAAe,KAAK,CAAA,CAAA;AAAA,KACjC;AAAA,GACF,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const NULL_RANGE = { from: 0, to: 0 };
|
|
2
|
+
const rangesAreSame = (r1, r2) => {
|
|
3
|
+
return r1?.from === r2?.from && r1?.to === r2?.to;
|
|
4
|
+
};
|
|
5
|
+
function getFullRange({ from, to }, bufferSize = 0, totalRowCount = Number.MAX_SAFE_INTEGER) {
|
|
6
|
+
if (from === 0 && to === 0) {
|
|
7
|
+
return { from, to };
|
|
8
|
+
} else if (bufferSize === 0) {
|
|
9
|
+
if (totalRowCount < from) {
|
|
10
|
+
return { from: 0, to: 0 };
|
|
11
|
+
} else {
|
|
12
|
+
return { from, to: Math.min(to, totalRowCount) };
|
|
13
|
+
}
|
|
14
|
+
} else if (from === 0) {
|
|
15
|
+
return { from, to: Math.min(to + bufferSize, totalRowCount) };
|
|
16
|
+
} else {
|
|
17
|
+
const shortfallBefore = from - bufferSize < 0;
|
|
18
|
+
const shortfallAfter = totalRowCount - (to + bufferSize) < 0;
|
|
19
|
+
if (shortfallBefore && shortfallAfter) {
|
|
20
|
+
return { from: 0, to: totalRowCount };
|
|
21
|
+
} else if (shortfallBefore) {
|
|
22
|
+
return { from: 0, to: to + bufferSize };
|
|
23
|
+
} else if (shortfallAfter) {
|
|
24
|
+
return {
|
|
25
|
+
from: Math.max(0, from - bufferSize),
|
|
26
|
+
to: totalRowCount
|
|
27
|
+
};
|
|
28
|
+
} else {
|
|
29
|
+
return { from: from - bufferSize, to: to + bufferSize };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function resetRange({ from, to, bufferSize = 0 }) {
|
|
34
|
+
return {
|
|
35
|
+
from: 0,
|
|
36
|
+
to: to - from,
|
|
37
|
+
bufferSize,
|
|
38
|
+
reset: true
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const withinRange = (value, { from, to }) => value >= from && value < to;
|
|
42
|
+
const rangeNewItems = ({ from: from1, to: to1 }, newRange) => {
|
|
43
|
+
const { from: from2, to: to2 } = newRange;
|
|
44
|
+
const noOverlap = from2 >= to1 || to2 <= from1;
|
|
45
|
+
const newFullySubsumesOld = from2 < from1 && to2 > to1;
|
|
46
|
+
return noOverlap || newFullySubsumesOld ? newRange : to2 > to1 ? { from: to1, to: to2 } : { from: from2, to: from1 };
|
|
47
|
+
};
|
|
48
|
+
class WindowRange {
|
|
49
|
+
constructor(from, to) {
|
|
50
|
+
this.from = from;
|
|
51
|
+
this.to = to;
|
|
52
|
+
}
|
|
53
|
+
isWithin(index) {
|
|
54
|
+
return withinRange(index, this);
|
|
55
|
+
}
|
|
56
|
+
//find the overlap of this range and a new one
|
|
57
|
+
overlap(from, to) {
|
|
58
|
+
return from >= this.to || to < this.from ? [0, 0] : [Math.max(from, this.from), Math.min(to, this.to)];
|
|
59
|
+
}
|
|
60
|
+
copy() {
|
|
61
|
+
return new WindowRange(this.from, this.to);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { NULL_RANGE, WindowRange, getFullRange, rangeNewItems, rangesAreSame, resetRange, withinRange };
|
|
66
|
+
//# sourceMappingURL=range-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range-utils.js","sources":["../src/range-utils.ts"],"sourcesContent":["export interface VuuRange {\n from: number;\n to: number;\n bufferSize?: number;\n reset?: boolean;\n}\n\ninterface FromToRange {\n from: number;\n to: number;\n}\n\nexport const NULL_RANGE: VuuRange = { from: 0, to: 0 } as const;\n\nexport const rangesAreSame = (\n r1: VuuRange | undefined,\n r2: VuuRange | undefined\n) => {\n return r1?.from === r2?.from && r1?.to === r2?.to;\n};\n\nexport function getFullRange(\n { from, to }: VuuRange,\n bufferSize = 0,\n totalRowCount: number = Number.MAX_SAFE_INTEGER\n): FromToRange {\n if (from === 0 && to === 0) {\n return { from, to };\n } else if (bufferSize === 0) {\n if (totalRowCount < from) {\n return { from: 0, to: 0 };\n } else {\n return { from, to: Math.min(to, totalRowCount) };\n }\n } else if (from === 0) {\n return { from, to: Math.min(to + bufferSize, totalRowCount) };\n } else {\n const shortfallBefore = from - bufferSize < 0;\n const shortfallAfter = totalRowCount - (to + bufferSize) < 0;\n if (shortfallBefore && shortfallAfter) {\n return { from: 0, to: totalRowCount };\n } else if (shortfallBefore) {\n return { from: 0, to: to + bufferSize };\n } else if (shortfallAfter) {\n return {\n from: Math.max(0, from - bufferSize),\n to: totalRowCount,\n };\n } else {\n return { from: from - bufferSize, to: to + bufferSize };\n }\n }\n}\n\nexport function resetRange({ from, to, bufferSize = 0 }: VuuRange): VuuRange {\n return {\n from: 0,\n to: to - from,\n bufferSize,\n reset: true,\n };\n}\n\nexport const withinRange = (value: number, { from, to }: VuuRange) =>\n value >= from && value < to;\n\n// export const rangeOverlap = (\n// { from: from1, to: to1 }: VuuRange,\n// { from: from2, to: to2 }: VuuRange\n// ): VuuRange => {\n// return from2 >= to1 || to2 < from1\n// ? { from: 0, to: 0 }\n// : { from: Math.max(from2, from1), to: Math.min(to2, to1) };\n// };\n\nexport const rangeNewItems = (\n { from: from1, to: to1 }: VuuRange,\n newRange: VuuRange\n): VuuRange => {\n const { from: from2, to: to2 } = newRange;\n const noOverlap = from2 >= to1 || to2 <= from1;\n const newFullySubsumesOld = from2 < from1 && to2 > to1;\n return noOverlap || newFullySubsumesOld\n ? newRange\n : to2 > to1\n ? { from: to1, to: to2 }\n : { from: from2, to: from1 };\n};\n\nexport class WindowRange {\n public from: number;\n public to: number;\n\n constructor(from: number, to: number) {\n this.from = from;\n this.to = to;\n }\n\n public isWithin(index: number) {\n return withinRange(index, this);\n }\n\n //find the overlap of this range and a new one\n public overlap(from: number, to: number): [number, number] {\n return from >= this.to || to < this.from\n ? [0, 0]\n : [Math.max(from, this.from), Math.min(to, this.to)];\n }\n\n public copy(): WindowRange {\n return new WindowRange(this.from, this.to);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Children, isValidElement } from 'react';
|
|
2
|
+
|
|
3
|
+
const EMPTY_ARRAY = [];
|
|
4
|
+
const asReactElements = (children) => {
|
|
5
|
+
const isArray = Array.isArray(children);
|
|
6
|
+
const count = isArray ? children.length : Children.count(children);
|
|
7
|
+
if (isArray && children.every(isValidElement)) {
|
|
8
|
+
return children;
|
|
9
|
+
} else if (count === 1 && !isArray && isValidElement(children)) {
|
|
10
|
+
return [children];
|
|
11
|
+
} else if (count > 1) {
|
|
12
|
+
return children;
|
|
13
|
+
} else {
|
|
14
|
+
return EMPTY_ARRAY;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { asReactElements };
|
|
19
|
+
//# sourceMappingURL=react-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-utils.js","sources":["../src/react-utils.ts"],"sourcesContent":["import { Children, isValidElement, ReactElement, ReactNode } from \"react\";\n\nconst EMPTY_ARRAY: ReactElement[] = [];\n\nexport const asReactElements = (children: ReactNode): ReactElement[] => {\n const isArray = Array.isArray(children);\n const count = isArray ? children.length : Children.count(children);\n if (isArray && children.every(isValidElement)) {\n return children;\n } else if (count === 1 && !isArray && isValidElement(children)) {\n return [children];\n } else if (count > 1) {\n return children as ReactElement[];\n } else {\n return EMPTY_ARRAY;\n }\n};\n"],"names":[],"mappings":";;AAEA,MAAM,cAA8B,EAAC,CAAA;AAExB,MAAA,eAAA,GAAkB,CAAC,QAAwC,KAAA;AACtE,EAAM,MAAA,OAAA,GAAU,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AACtC,EAAA,MAAM,QAAQ,OAAU,GAAA,QAAA,CAAS,MAAS,GAAA,QAAA,CAAS,MAAM,QAAQ,CAAA,CAAA;AACjE,EAAA,IAAI,OAAW,IAAA,QAAA,CAAS,KAAM,CAAA,cAAc,CAAG,EAAA;AAC7C,IAAO,OAAA,QAAA,CAAA;AAAA,aACE,KAAU,KAAA,CAAA,IAAK,CAAC,OAAW,IAAA,cAAA,CAAe,QAAQ,CAAG,EAAA;AAC9D,IAAA,OAAO,CAAC,QAAQ,CAAA,CAAA;AAAA,GAClB,MAAA,IAAW,QAAQ,CAAG,EAAA;AACpB,IAAO,OAAA,QAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AACF;;;;"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const PUNCTUATION_STR = String.fromCharCode(8200);
|
|
2
|
+
const DIGIT_STR = String.fromCharCode(8199);
|
|
3
|
+
const DECIMALS_AUTO = -1;
|
|
4
|
+
const Space = {
|
|
5
|
+
DIGIT: DIGIT_STR,
|
|
6
|
+
TWO_DIGITS: DIGIT_STR + DIGIT_STR,
|
|
7
|
+
THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,
|
|
8
|
+
FULL_PADDING: [
|
|
9
|
+
null,
|
|
10
|
+
PUNCTUATION_STR + DIGIT_STR,
|
|
11
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,
|
|
12
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,
|
|
13
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR
|
|
14
|
+
]
|
|
15
|
+
};
|
|
16
|
+
const Zero = {
|
|
17
|
+
DIGIT: "0",
|
|
18
|
+
TWO_DIGITS: "00",
|
|
19
|
+
THREE_DIGITS: "000",
|
|
20
|
+
FULL_PADDING: [null, "0", "00", "000", "0000"]
|
|
21
|
+
};
|
|
22
|
+
function padLeft(value, maxLength = 6) {
|
|
23
|
+
return (LEADING_FILL + value).slice(-maxLength);
|
|
24
|
+
}
|
|
25
|
+
const LEADING_FILL = DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR;
|
|
26
|
+
const Align = {
|
|
27
|
+
Right: "right",
|
|
28
|
+
Center: "center",
|
|
29
|
+
Left: "left"
|
|
30
|
+
};
|
|
31
|
+
function pad(n, dp, Pad) {
|
|
32
|
+
let len = n.length;
|
|
33
|
+
const diff = dp - len;
|
|
34
|
+
if (diff > 0) {
|
|
35
|
+
if (diff === 1) {
|
|
36
|
+
n = n + Pad.DIGIT;
|
|
37
|
+
} else if (diff === 2) {
|
|
38
|
+
n = n + Pad.TWO_DIGITS;
|
|
39
|
+
} else if (diff === 3) {
|
|
40
|
+
n = n + Pad.THREE_DIGITS;
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
if (diff < 0) {
|
|
44
|
+
n = n.slice(0, dp);
|
|
45
|
+
len = dp;
|
|
46
|
+
}
|
|
47
|
+
if (Pad === Space && n.charAt(len - 1) === "0") {
|
|
48
|
+
n = n.replace(/0+$/, "");
|
|
49
|
+
return pad(n, dp, Pad);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return n;
|
|
53
|
+
}
|
|
54
|
+
function roundDecimal(value, align = Align.Right, decimals = 4, zeroPad, alignOnDecimals) {
|
|
55
|
+
if (value === void 0 || typeof value !== "number" || isNaN(value)) {
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
let integral, fraction, Pad;
|
|
59
|
+
const [part1, part2 = ""] = value.toString().split(".");
|
|
60
|
+
const actualDecimals = part2.length;
|
|
61
|
+
integral = parseFloat(part1).toLocaleString();
|
|
62
|
+
if (align === Align.Left && alignOnDecimals) {
|
|
63
|
+
integral = padLeft(integral);
|
|
64
|
+
}
|
|
65
|
+
if (decimals === DECIMALS_AUTO || actualDecimals === decimals) {
|
|
66
|
+
fraction = part2;
|
|
67
|
+
} else if (actualDecimals > decimals) {
|
|
68
|
+
fraction = parseFloat("0." + part2).toFixed(decimals).slice(2);
|
|
69
|
+
} else {
|
|
70
|
+
if (Pad = zeroPad ? Zero : alignOnDecimals && align !== Align.Left ? Space : null) {
|
|
71
|
+
if (actualDecimals === 0) {
|
|
72
|
+
fraction = Pad.FULL_PADDING[decimals];
|
|
73
|
+
} else {
|
|
74
|
+
fraction = pad(part2, decimals, Pad);
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
fraction = part2;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return integral + (fraction ? "." + fraction : "");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { roundDecimal };
|
|
84
|
+
//# sourceMappingURL=round-decimal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-decimal.js","sources":["../src/round-decimal.ts"],"sourcesContent":["const PUNCTUATION_STR = String.fromCharCode(8200);\nconst DIGIT_STR = String.fromCharCode(8199);\nconst DECIMALS_AUTO = -1;\n\ntype PadMap = {\n DIGIT: string;\n TWO_DIGITS: string;\n THREE_DIGITS: string;\n FULL_PADDING: [null, string, string, string, string];\n};\n\nconst Space: PadMap = {\n DIGIT: DIGIT_STR,\n TWO_DIGITS: DIGIT_STR + DIGIT_STR,\n THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,\n FULL_PADDING: [\n null,\n PUNCTUATION_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n ],\n};\n\nconst Zero: PadMap = {\n DIGIT: \"0\",\n TWO_DIGITS: \"00\",\n THREE_DIGITS: \"000\",\n FULL_PADDING: [null, \"0\", \"00\", \"000\", \"0000\"],\n};\n\nfunction padLeft(value: string, maxLength = 6) {\n return (LEADING_FILL + value).slice(-maxLength);\n}\n\nconst LEADING_FILL =\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR;\n\nconst Align = {\n Right: \"right\",\n Center: \"center\",\n Left: \"left\",\n};\n\nfunction pad(n: string, dp: number, Pad: PadMap): string {\n let len = n.length;\n const diff = dp - len;\n\n if (diff > 0) {\n if (diff === 1) {\n n = n + Pad.DIGIT;\n } else if (diff === 2) {\n n = n + Pad.TWO_DIGITS;\n } else if (diff === 3) {\n n = n + Pad.THREE_DIGITS;\n }\n } else {\n if (diff < 0) {\n n = n.slice(0, dp);\n len = dp;\n }\n\n if (Pad === Space && n.charAt(len - 1) === \"0\") {\n n = n.replace(/0+$/, \"\");\n return pad(n, dp, Pad);\n }\n }\n return n;\n}\n\nexport function roundDecimal(\n value?: number,\n align = Align.Right,\n decimals = 4,\n zeroPad?: boolean,\n alignOnDecimals?: boolean\n) {\n if (value === undefined || typeof value !== \"number\" || isNaN(value)) {\n return \"\";\n }\n let integral, fraction, Pad;\n\n const [part1, part2 = \"\"] = value.toString().split(\".\");\n const actualDecimals = part2.length;\n\n integral = parseFloat(part1).toLocaleString();\n\n if (align === Align.Left && alignOnDecimals) {\n integral = padLeft(integral);\n }\n\n if (decimals === DECIMALS_AUTO || actualDecimals === decimals) {\n fraction = part2;\n } else if (actualDecimals > decimals) {\n fraction = parseFloat(\"0.\" + part2)\n .toFixed(decimals)\n .slice(2);\n } else {\n /* eslint-disable no-cond-assign */\n if (\n (Pad = zeroPad\n ? Zero\n : alignOnDecimals && align !== Align.Left\n ? Space\n : null)\n ) {\n if (actualDecimals === 0) {\n fraction = Pad.FULL_PADDING[decimals];\n } else {\n fraction = pad(part2, decimals, Pad);\n }\n } else {\n fraction = part2;\n }\n }\n\n return integral + (fraction ? \".\" + fraction : \"\");\n}\n"],"names":[],"mappings":"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"}
|