@vuu-ui/vuu-data-test 0.8.35 → 0.8.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -0
- package/cjs/ArrayProxy.js +80 -0
- package/cjs/ArrayProxy.js.map +1 -0
- package/cjs/Table.js +186 -0
- package/cjs/Table.js.map +1 -0
- package/cjs/TickingArrayDataSource.js +134 -0
- package/cjs/TickingArrayDataSource.js.map +1 -0
- package/cjs/UpdateGenerator.js +87 -0
- package/cjs/UpdateGenerator.js.map +1 -0
- package/cjs/basket/basket-module.js +236 -0
- package/cjs/basket/basket-module.js.map +1 -0
- package/cjs/basket/basket-schemas.js +121 -0
- package/cjs/basket/basket-schemas.js.map +1 -0
- package/cjs/basket/reference-data/constituents.js +40 -0
- package/cjs/basket/reference-data/constituents.js.map +1 -0
- package/cjs/basket/reference-data/ftse100.js +105 -0
- package/cjs/basket/reference-data/ftse100.js.map +1 -0
- package/cjs/basket/reference-data/hsi.js +87 -0
- package/cjs/basket/reference-data/hsi.js.map +1 -0
- package/cjs/basket/reference-data/nasdaq100.js +108 -0
- package/cjs/basket/reference-data/nasdaq100.js.map +1 -0
- package/cjs/basket/reference-data/prices.js +51 -0
- package/cjs/basket/reference-data/prices.js.map +1 -0
- package/cjs/basket/reference-data/sp500.js +46 -0
- package/cjs/basket/reference-data/sp500.js.map +1 -0
- package/cjs/data-utils.js +58 -0
- package/cjs/data-utils.js.map +1 -0
- package/cjs/index.js.map +1 -0
- package/cjs/makeSuggestions.js +37 -0
- package/cjs/makeSuggestions.js.map +1 -0
- package/cjs/schemas.js +28 -0
- package/cjs/schemas.js.map +1 -0
- package/cjs/simul/reference-data/currencies.js +6 -0
- package/cjs/simul/reference-data/currencies.js.map +1 -0
- package/cjs/simul/reference-data/instruments-extended.js +18 -0
- package/cjs/simul/reference-data/instruments-extended.js.map +1 -0
- package/cjs/simul/reference-data/instruments.js +74 -0
- package/cjs/simul/reference-data/instruments.js.map +1 -0
- package/cjs/simul/reference-data/locations.js +17 -0
- package/cjs/simul/reference-data/locations.js.map +1 -0
- package/cjs/simul/reference-data/lotsizes.js +28 -0
- package/cjs/simul/reference-data/lotsizes.js.map +1 -0
- package/cjs/simul/reference-data/orders.js +43 -0
- package/cjs/simul/reference-data/orders.js.map +1 -0
- package/cjs/simul/reference-data/prices.js +71 -0
- package/cjs/simul/reference-data/prices.js.map +1 -0
- package/cjs/simul/simul-module.js +72 -0
- package/cjs/simul/simul-module.js.map +1 -0
- package/cjs/simul/simul-schemas.js +137 -0
- package/cjs/simul/simul-schemas.js.map +1 -0
- package/cjs/test/test-module.js +58 -0
- package/cjs/test/test-module.js.map +1 -0
- package/cjs/test/test-schemas.js +17 -0
- package/cjs/test/test-schemas.js.map +1 -0
- package/cjs/vuu-modules.js +15 -0
- package/cjs/vuu-modules.js.map +1 -0
- package/cjs/vuu-row-generator.js +74 -0
- package/cjs/vuu-row-generator.js.map +1 -0
- package/esm/ArrayProxy.js +78 -0
- package/esm/ArrayProxy.js.map +1 -0
- package/esm/Table.js +182 -0
- package/esm/Table.js.map +1 -0
- package/esm/TickingArrayDataSource.js +132 -0
- package/esm/TickingArrayDataSource.js.map +1 -0
- package/esm/UpdateGenerator.js +85 -0
- package/esm/UpdateGenerator.js.map +1 -0
- package/esm/basket/basket-module.js +232 -0
- package/esm/basket/basket-module.js.map +1 -0
- package/esm/basket/basket-schemas.js +119 -0
- package/esm/basket/basket-schemas.js.map +1 -0
- package/esm/basket/reference-data/constituents.js +38 -0
- package/esm/basket/reference-data/constituents.js.map +1 -0
- package/esm/basket/reference-data/ftse100.js +103 -0
- package/esm/basket/reference-data/ftse100.js.map +1 -0
- package/esm/basket/reference-data/hsi.js +85 -0
- package/esm/basket/reference-data/hsi.js.map +1 -0
- package/esm/basket/reference-data/nasdaq100.js +106 -0
- package/esm/basket/reference-data/nasdaq100.js.map +1 -0
- package/esm/basket/reference-data/prices.js +49 -0
- package/esm/basket/reference-data/prices.js.map +1 -0
- package/esm/basket/reference-data/sp500.js +44 -0
- package/esm/basket/reference-data/sp500.js.map +1 -0
- package/esm/data-utils.js +53 -0
- package/esm/data-utils.js.map +1 -0
- package/esm/index.js +11 -0
- package/esm/index.js.map +1 -0
- package/esm/makeSuggestions.js +35 -0
- package/esm/makeSuggestions.js.map +1 -0
- package/esm/schemas.js +24 -0
- package/esm/schemas.js.map +1 -0
- package/esm/simul/reference-data/currencies.js +4 -0
- package/esm/simul/reference-data/currencies.js.map +1 -0
- package/esm/simul/reference-data/instruments-extended.js +16 -0
- package/esm/simul/reference-data/instruments-extended.js.map +1 -0
- package/esm/simul/reference-data/instruments.js +69 -0
- package/esm/simul/reference-data/instruments.js.map +1 -0
- package/esm/simul/reference-data/locations.js +14 -0
- package/esm/simul/reference-data/locations.js.map +1 -0
- package/esm/simul/reference-data/lotsizes.js +26 -0
- package/esm/simul/reference-data/lotsizes.js.map +1 -0
- package/esm/simul/reference-data/orders.js +40 -0
- package/esm/simul/reference-data/orders.js.map +1 -0
- package/esm/simul/reference-data/prices.js +68 -0
- package/esm/simul/reference-data/prices.js.map +1 -0
- package/esm/simul/simul-module.js +70 -0
- package/esm/simul/simul-module.js.map +1 -0
- package/esm/simul/simul-schemas.js +135 -0
- package/esm/simul/simul-schemas.js.map +1 -0
- package/esm/test/test-module.js +56 -0
- package/esm/test/test-module.js.map +1 -0
- package/esm/test/test-schemas.js +15 -0
- package/esm/test/test-schemas.js.map +1 -0
- package/esm/vuu-modules.js +13 -0
- package/esm/vuu-modules.js.map +1 -0
- package/esm/vuu-row-generator.js +68 -0
- package/esm/vuu-row-generator.js.map +1 -0
- package/package.json +8 -6
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var makeSuggestions = require('../makeSuggestions.js');
|
|
4
|
+
var Table = require('../Table.js');
|
|
5
|
+
var TickingArrayDataSource = require('../TickingArrayDataSource.js');
|
|
6
|
+
var vuuRowGenerator = require('../vuu-row-generator.js');
|
|
7
|
+
var testSchemas = require('./test-schemas.js');
|
|
8
|
+
|
|
9
|
+
const { RowGenerator } = vuuRowGenerator.defaultGenerators;
|
|
10
|
+
const manyColumnGenerator = RowGenerator(
|
|
11
|
+
testSchemas.schemas.TwoHundredColumns.columns.map((c) => c.name)
|
|
12
|
+
);
|
|
13
|
+
const tables = {
|
|
14
|
+
TwoHundredColumns: new Table.Table(
|
|
15
|
+
testSchemas.schemas.TwoHundredColumns,
|
|
16
|
+
new Array(100).fill(1).map((_, i) => manyColumnGenerator(i)),
|
|
17
|
+
Table.buildDataColumnMap(testSchemas.schemas.TwoHundredColumns)
|
|
18
|
+
)
|
|
19
|
+
};
|
|
20
|
+
const getColumnDescriptors = (tableName) => {
|
|
21
|
+
const schema = testSchemas.schemas[tableName];
|
|
22
|
+
if (schema) {
|
|
23
|
+
return schema.columns;
|
|
24
|
+
} else {
|
|
25
|
+
throw Error(`test-module no schema found for table TEST ${tableName}`);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const createDataSource = (tableName) => {
|
|
29
|
+
const columnDescriptors = getColumnDescriptors(tableName);
|
|
30
|
+
return new TickingArrayDataSource.TickingArrayDataSource({
|
|
31
|
+
columnDescriptors,
|
|
32
|
+
keyColumn: testSchemas.schemas[tableName].key,
|
|
33
|
+
table: tables[tableName]
|
|
34
|
+
// menu: menus[tableName],
|
|
35
|
+
// rpcServices: services[tableName],
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
const suggestionFetcher = ([
|
|
39
|
+
vuuTable,
|
|
40
|
+
column,
|
|
41
|
+
pattern
|
|
42
|
+
]) => {
|
|
43
|
+
const table = tables[vuuTable.table];
|
|
44
|
+
if (table) {
|
|
45
|
+
return makeSuggestions.makeSuggestions(table, column, pattern);
|
|
46
|
+
} else {
|
|
47
|
+
throw Error(
|
|
48
|
+
`SIMUL suggestionFetcher, unknown table ${vuuTable.module} ${vuuTable.table}`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const testModule = {
|
|
53
|
+
createDataSource,
|
|
54
|
+
typeaheadHook: () => suggestionFetcher
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
module.exports = testModule;
|
|
58
|
+
//# sourceMappingURL=test-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-module.js","sources":["../../src/test/test-module.ts"],"sourcesContent":["import type { SuggestionFetcher } from \"@vuu-ui/vuu-data-types\";\nimport { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { makeSuggestions } from \"../makeSuggestions\";\nimport { buildDataColumnMap, Table } from \"../Table\";\nimport { TickingArrayDataSource } from \"../TickingArrayDataSource\";\nimport { VuuModule } from \"../vuu-modules\";\nimport { defaultGenerators } from \"../vuu-row-generator\";\nimport { schemas, TestTableName } from \"./test-schemas\";\n\nconst { RowGenerator } = defaultGenerators;\n\nconst manyColumnGenerator = RowGenerator(\n schemas.TwoHundredColumns.columns.map((c) => c.name)\n);\n\nconst tables: Record<TestTableName, Table> = {\n TwoHundredColumns: new Table(\n schemas.TwoHundredColumns,\n new Array(100).fill(1).map((_, i) => manyColumnGenerator(i)),\n buildDataColumnMap(schemas.TwoHundredColumns)\n ),\n};\n\nconst getColumnDescriptors = (tableName: TestTableName) => {\n const schema = schemas[tableName];\n if (schema) {\n return schema.columns;\n } else {\n throw Error(`test-module no schema found for table TEST ${tableName}`);\n }\n};\n\nconst createDataSource = (tableName: TestTableName) => {\n const columnDescriptors = getColumnDescriptors(tableName);\n return new TickingArrayDataSource({\n columnDescriptors,\n keyColumn: schemas[tableName].key,\n table: tables[tableName],\n // menu: menus[tableName],\n // rpcServices: services[tableName],\n });\n};\n\nconst suggestionFetcher: SuggestionFetcher = ([\n vuuTable,\n column,\n pattern,\n]: TypeaheadParams) => {\n const table = tables[vuuTable.table as TestTableName];\n if (table) {\n return makeSuggestions(table, column, pattern);\n } else {\n throw Error(\n `SIMUL suggestionFetcher, unknown table ${vuuTable.module} ${vuuTable.table}`\n );\n }\n};\n\nconst testModule: VuuModule<TestTableName> = {\n createDataSource,\n typeaheadHook: () => suggestionFetcher,\n};\n\nexport default testModule;\n"],"names":["defaultGenerators","schemas","Table","buildDataColumnMap","TickingArrayDataSource","makeSuggestions"],"mappings":";;;;;;;;AASA,MAAM,EAAE,cAAiB,GAAAA,iCAAA,CAAA;AAEzB,MAAM,mBAAsB,GAAA,YAAA;AAAA,EAC1BC,oBAAQ,iBAAkB,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACrD,CAAA,CAAA;AAEA,MAAM,MAAuC,GAAA;AAAA,EAC3C,mBAAmB,IAAIC,WAAA;AAAA,IACrBD,mBAAQ,CAAA,iBAAA;AAAA,IACR,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAK,CAAA,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAAM,KAAA,mBAAA,CAAoB,CAAC,CAAC,CAAA;AAAA,IAC3DE,wBAAA,CAAmBF,oBAAQ,iBAAiB,CAAA;AAAA,GAC9C;AACF,CAAA,CAAA;AAEA,MAAM,oBAAA,GAAuB,CAAC,SAA6B,KAAA;AACzD,EAAM,MAAA,MAAA,GAASA,oBAAQ,SAAS,CAAA,CAAA;AAChC,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,OAAO,MAAO,CAAA,OAAA,CAAA;AAAA,GACT,MAAA;AACL,IAAM,MAAA,KAAA,CAAM,CAA8C,2CAAA,EAAA,SAAS,CAAE,CAAA,CAAA,CAAA;AAAA,GACvE;AACF,CAAA,CAAA;AAEA,MAAM,gBAAA,GAAmB,CAAC,SAA6B,KAAA;AACrD,EAAM,MAAA,iBAAA,GAAoB,qBAAqB,SAAS,CAAA,CAAA;AACxD,EAAA,OAAO,IAAIG,6CAAuB,CAAA;AAAA,IAChC,iBAAA;AAAA,IACA,SAAA,EAAWH,mBAAQ,CAAA,SAAS,CAAE,CAAA,GAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,SAAS,CAAA;AAAA;AAAA;AAAA,GAGxB,CAAA,CAAA;AACH,CAAA,CAAA;AAEA,MAAM,oBAAuC,CAAC;AAAA,EAC5C,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AACF,CAAuB,KAAA;AACrB,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,QAAA,CAAS,KAAsB,CAAA,CAAA;AACpD,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,OAAAI,+BAAA,CAAgB,KAAO,EAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AAAA,GACxC,MAAA;AACL,IAAM,MAAA,KAAA;AAAA,MACJ,CAA0C,uCAAA,EAAA,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,KAAK,CAAA,CAAA;AAAA,KAC7E,CAAA;AAAA,GACF;AACF,CAAA,CAAA;AAEA,MAAM,UAAuC,GAAA;AAAA,EAC3C,gBAAA;AAAA,EACA,eAAe,MAAM,iBAAA;AACvB;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vuuRowGenerator = require('../vuu-row-generator.js');
|
|
4
|
+
|
|
5
|
+
const schemas = {
|
|
6
|
+
TwoHundredColumns: {
|
|
7
|
+
columns: vuuRowGenerator.DefaultColumnGenerator(200).map((col) => ({
|
|
8
|
+
...col,
|
|
9
|
+
serverDataType: "string"
|
|
10
|
+
})),
|
|
11
|
+
key: "column01",
|
|
12
|
+
table: { module: "TEST", table: "TwoHundredColumns" }
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
exports.schemas = schemas;
|
|
17
|
+
//# sourceMappingURL=test-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-schemas.js","sources":["../../src/test/test-schemas.ts"],"sourcesContent":["import { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { DefaultColumnGenerator } from \"../vuu-row-generator\";\n\nexport type TestTableName = \"TwoHundredColumns\";\n\nexport const schemas: Readonly<Record<TestTableName, Readonly<TableSchema>>> = {\n TwoHundredColumns: {\n columns: DefaultColumnGenerator(200).map((col) => ({\n ...col,\n serverDataType: \"string\",\n })),\n key: \"column01\",\n table: { module: \"TEST\", table: \"TwoHundredColumns\" },\n },\n};\n"],"names":["DefaultColumnGenerator"],"mappings":";;;;AAKO,MAAM,OAAkE,GAAA;AAAA,EAC7E,iBAAmB,EAAA;AAAA,IACjB,SAASA,sCAAuB,CAAA,GAAG,CAAE,CAAA,GAAA,CAAI,CAAC,GAAS,MAAA;AAAA,MACjD,GAAG,GAAA;AAAA,MACH,cAAgB,EAAA,QAAA;AAAA,KAChB,CAAA,CAAA;AAAA,IACF,GAAK,EAAA,UAAA;AAAA,IACL,KAAO,EAAA,EAAE,MAAQ,EAAA,MAAA,EAAQ,OAAO,mBAAoB,EAAA;AAAA,GACtD;AACF;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var basketModule = require('./basket/basket-module.js');
|
|
4
|
+
var simulModule = require('./simul/simul-module.js');
|
|
5
|
+
var testModule = require('./test/test-module.js');
|
|
6
|
+
|
|
7
|
+
const vuuModules = {
|
|
8
|
+
BASKET: basketModule.basketModule,
|
|
9
|
+
SIMUL: simulModule.simulModule,
|
|
10
|
+
TEST: testModule
|
|
11
|
+
};
|
|
12
|
+
const vuuModule = (moduleName) => vuuModules[moduleName];
|
|
13
|
+
|
|
14
|
+
exports.vuuModule = vuuModule;
|
|
15
|
+
//# sourceMappingURL=vuu-modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vuu-modules.js","sources":["../src/vuu-modules.ts"],"sourcesContent":["import type { DataSource, SuggestionFetcher } from \"@vuu-ui/vuu-data-types\";\nimport { basketModule } from \"./basket/basket-module\";\nimport { BasketsTableName } from \"./basket/basket-schemas\";\nimport { simulModule } from \"./simul/simul-module\";\nimport { SimulTableName } from \"./simul/simul-schemas\";\nimport testModule from \"./test/test-module\";\nimport { TestTableName } from \"./test/test-schemas\";\n\nexport type VuuModuleName = \"BASKET\" | \"SIMUL\" | \"TEST\";\n\nexport interface VuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n typeaheadHook: () => SuggestionFetcher;\n}\n\nconst vuuModules: Record<\n VuuModuleName,\n | VuuModule<BasketsTableName>\n | VuuModule<SimulTableName>\n | VuuModule<TestTableName>\n> = {\n BASKET: basketModule,\n SIMUL: simulModule,\n TEST: testModule,\n};\n\n// Note, this is useful but be aware that all modules will be bundled if this is imported.\n// If only a single module is required, better to import it directly.\nexport const vuuModule = <T extends string = string>(\n moduleName: VuuModuleName\n) => vuuModules[moduleName] as VuuModule<T>;\n"],"names":["basketModule","simulModule"],"mappings":";;;;;;AAeA,MAAM,UAKF,GAAA;AAAA,EACF,MAAQ,EAAAA,yBAAA;AAAA,EACR,KAAO,EAAAC,uBAAA;AAAA,EACP,IAAM,EAAA,UAAA;AACR,CAAA,CAAA;AAIO,MAAM,SAAY,GAAA,CACvB,UACG,KAAA,UAAA,CAAW,UAAU;;;;"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const DefaultRowGenerator = (columns) => (index) => {
|
|
4
|
+
return [`row ${index + 1}`].concat(
|
|
5
|
+
Array(columns.length).fill(true).map((v, j) => `value ${j + 2} @ ${index + 1}`)
|
|
6
|
+
);
|
|
7
|
+
};
|
|
8
|
+
const DefaultColumnGenerator = (columns, columnConfig = {}) => {
|
|
9
|
+
if (typeof columns === "number") {
|
|
10
|
+
return [{ label: "Row Number", name: "rownum", width: 150 }].concat(
|
|
11
|
+
Array(columns).fill(true).map((_, i) => {
|
|
12
|
+
const name = `column_${i + 1}`;
|
|
13
|
+
const label = `Column ${i + 1}`;
|
|
14
|
+
return { label, name, width: 100, ...columnConfig[name] };
|
|
15
|
+
})
|
|
16
|
+
);
|
|
17
|
+
} else {
|
|
18
|
+
throw Error("DefaultColumnGenerator must be passed columns (number)");
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const defaultGenerators = {
|
|
22
|
+
ColumnGenerator: DefaultColumnGenerator,
|
|
23
|
+
RowGenerator: DefaultRowGenerator
|
|
24
|
+
};
|
|
25
|
+
const getColumnAndRowGenerator = (table) => {
|
|
26
|
+
const tableName = table?.table ?? "";
|
|
27
|
+
switch (table?.module) {
|
|
28
|
+
case "SIMUL": {
|
|
29
|
+
const { ColumnGenerator, RowGenerator, createUpdateGenerator } = (
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
simulDataGenerators[tableName] ?? defaultGenerators
|
|
33
|
+
);
|
|
34
|
+
return [ColumnGenerator, RowGenerator, createUpdateGenerator];
|
|
35
|
+
}
|
|
36
|
+
case "BASKET": {
|
|
37
|
+
const { ColumnGenerator, RowGenerator, createUpdateGenerator } = (
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
basketDataGenerators[tableName] ?? defaultGenerators
|
|
41
|
+
);
|
|
42
|
+
return [ColumnGenerator, RowGenerator, createUpdateGenerator];
|
|
43
|
+
}
|
|
44
|
+
case void 0: {
|
|
45
|
+
const { ColumnGenerator, RowGenerator } = defaultGenerators;
|
|
46
|
+
return [ColumnGenerator, RowGenerator];
|
|
47
|
+
}
|
|
48
|
+
default:
|
|
49
|
+
throw Error(
|
|
50
|
+
`vuu-row-gererator table ${table?.table} was requested but no generator is registered`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const populateArray = (count, colGen, rowGen, columns) => {
|
|
55
|
+
const columnDescriptors = colGen(columns);
|
|
56
|
+
const generateRow = rowGen(columnDescriptors.map((col) => col.name));
|
|
57
|
+
const data = [];
|
|
58
|
+
for (let i = 0; i < count; i++) {
|
|
59
|
+
const row = generateRow(i);
|
|
60
|
+
if (row) {
|
|
61
|
+
data[i] = row;
|
|
62
|
+
} else {
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return data;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
exports.DefaultColumnGenerator = DefaultColumnGenerator;
|
|
70
|
+
exports.DefaultRowGenerator = DefaultRowGenerator;
|
|
71
|
+
exports.defaultGenerators = defaultGenerators;
|
|
72
|
+
exports.getColumnAndRowGenerator = getColumnAndRowGenerator;
|
|
73
|
+
exports.populateArray = populateArray;
|
|
74
|
+
//# sourceMappingURL=vuu-row-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vuu-row-generator.js","sources":["../src/vuu-row-generator.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport type { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { UpdateGenerator } from \"./rowUpdates\";\n\ntype GenerateRowFunc = (index: number) => VuuRowDataItemType[];\n\nexport type RowGeneratorFactory = (columns: string[]) => GenerateRowFunc;\n\nexport type ColumnGeneratorFn = (\n columns?: number | string[],\n columnConfig?: { [key: string]: Partial<ColumnDescriptor> }\n) => ColumnDescriptor[];\n\nexport const DefaultRowGenerator: RowGeneratorFactory =\n (columns: string[]) => (index) => {\n return [`row ${index + 1}`].concat(\n Array(columns.length)\n .fill(true)\n .map((v, j) => `value ${j + 2} @ ${index + 1}`)\n );\n };\n\nexport const DefaultColumnGenerator: ColumnGeneratorFn = (\n columns,\n columnConfig = {}\n) => {\n if (typeof columns === \"number\") {\n return [{ label: \"Row Number\", name: \"rownum\", width: 150 }].concat(\n Array(columns)\n .fill(true)\n .map((_, i) => {\n const name = `column_${i + 1}`;\n const label = `Column ${i + 1}`;\n return { label, name, width: 100, ...columnConfig[name] };\n })\n );\n } else {\n throw Error(\"DefaultColumnGenerator must be passed columns (number)\");\n }\n};\n\nexport const defaultGenerators = {\n ColumnGenerator: DefaultColumnGenerator,\n RowGenerator: DefaultRowGenerator,\n};\n\nexport const getColumnAndRowGenerator = (\n table?: VuuTable\n):\n | [ColumnGeneratorFn, RowGeneratorFactory]\n | [ColumnGeneratorFn, RowGeneratorFactory, () => UpdateGenerator] => {\n const tableName = table?.table ?? \"\";\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n switch (table?.module) {\n case \"SIMUL\": {\n const { ColumnGenerator, RowGenerator, createUpdateGenerator } =\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n simulDataGenerators[tableName] ?? defaultGenerators;\n return [ColumnGenerator, RowGenerator, createUpdateGenerator];\n }\n\n case \"BASKET\": {\n const { ColumnGenerator, RowGenerator, createUpdateGenerator } =\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n basketDataGenerators[tableName] ?? defaultGenerators;\n return [ColumnGenerator, RowGenerator, createUpdateGenerator];\n }\n case undefined: {\n const { ColumnGenerator, RowGenerator } = defaultGenerators;\n return [ColumnGenerator, RowGenerator];\n }\n default:\n throw Error(\n `vuu-row-gererator table ${table?.table} was requested but no generator is registered`\n );\n }\n};\n\nexport const populateArray = (\n count: number,\n colGen: ColumnGeneratorFn,\n rowGen: RowGeneratorFactory,\n columns?: number | string[]\n) => {\n const columnDescriptors = colGen(columns);\n const generateRow = rowGen(columnDescriptors.map((col) => col.name));\n const data: Array<VuuRowDataItemType[]> = [];\n for (let i = 0; i < count; i++) {\n const row = generateRow(i);\n if (row) {\n data[i] = row;\n } else {\n break;\n }\n }\n return data;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
var __accessCheck = (obj, member, msg) => {
|
|
2
|
+
if (!member.has(obj))
|
|
3
|
+
throw TypeError("Cannot " + msg);
|
|
4
|
+
};
|
|
5
|
+
var __privateGet = (obj, member, getter) => {
|
|
6
|
+
__accessCheck(obj, member, "read from private field");
|
|
7
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
8
|
+
};
|
|
9
|
+
var __privateAdd = (obj, member, value) => {
|
|
10
|
+
if (member.has(obj))
|
|
11
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
12
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
|
+
};
|
|
14
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
15
|
+
__accessCheck(obj, member, "write to private field");
|
|
16
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
17
|
+
return value;
|
|
18
|
+
};
|
|
19
|
+
var _getItem;
|
|
20
|
+
const _ArrayProxy = class _ArrayProxy {
|
|
21
|
+
constructor(size, getRow) {
|
|
22
|
+
__privateAdd(this, _getItem, void 0);
|
|
23
|
+
this.length = 0;
|
|
24
|
+
this.map = (func) => {
|
|
25
|
+
return new _ArrayProxy(this.length, (i) => {
|
|
26
|
+
return func(__privateGet(this, _getItem).call(this, i), i);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
this.slice = (from, to) => {
|
|
30
|
+
const out = [];
|
|
31
|
+
const end = Math.min(this.length, to);
|
|
32
|
+
for (let i = from; i < end; i++) {
|
|
33
|
+
out.push(__privateGet(this, _getItem).call(this, i));
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
};
|
|
37
|
+
__privateSet(this, _getItem, getRow);
|
|
38
|
+
this.length = size;
|
|
39
|
+
const handler = {
|
|
40
|
+
get: (target, prop) => {
|
|
41
|
+
var _a;
|
|
42
|
+
if (prop === "length") {
|
|
43
|
+
return target.length;
|
|
44
|
+
} else if (prop === "slice") {
|
|
45
|
+
return target.slice;
|
|
46
|
+
} else if (prop === "map") {
|
|
47
|
+
return target.map;
|
|
48
|
+
} else if (prop === "toString") {
|
|
49
|
+
return "[ArrayProxy]";
|
|
50
|
+
}
|
|
51
|
+
if (typeof prop === "string") {
|
|
52
|
+
const index = parseInt(prop, 10);
|
|
53
|
+
if (!isNaN(index)) {
|
|
54
|
+
if (index < this.length) {
|
|
55
|
+
return __privateGet(_a = target, _getItem).call(_a, index);
|
|
56
|
+
} else {
|
|
57
|
+
return void 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw Error(`unsupported property ${String(prop)} on ArrayProxy`);
|
|
62
|
+
},
|
|
63
|
+
set: (target, prop, newVal) => {
|
|
64
|
+
if (prop === "length") {
|
|
65
|
+
target.length = newVal;
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
throw Error(`ArrayProxy is immutable except for length`);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
return new Proxy(this, handler);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
_getItem = new WeakMap();
|
|
75
|
+
let ArrayProxy = _ArrayProxy;
|
|
76
|
+
|
|
77
|
+
export { ArrayProxy };
|
|
78
|
+
//# sourceMappingURL=ArrayProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArrayProxy.js","sources":["../src/ArrayProxy.ts"],"sourcesContent":["export type RowAtIndexFunc<T = unknown> = (index: number) => T | undefined;\n\nexport class ArrayProxy<T = string> {\n #getItem: RowAtIndexFunc;\n public length = 0;\n\n constructor(size: number, getRow: RowAtIndexFunc) {\n this.#getItem = getRow;\n this.length = size;\n\n const handler = {\n get: (target: ArrayProxy<T>, prop: string | symbol): any => {\n if (prop === \"length\") {\n return target.length;\n } else if (prop === \"slice\") {\n return target.slice;\n } else if (prop === \"map\") {\n return target.map;\n } else if (prop === \"toString\") {\n return \"[ArrayProxy]\";\n }\n if (typeof prop === \"string\") {\n const index = parseInt(prop, 10);\n if (!isNaN(index)) {\n if (index < this.length) {\n return target.#getItem(index);\n } else {\n return undefined;\n }\n }\n }\n throw Error(`unsupported property ${String(prop)} on ArrayProxy`);\n },\n set: (target: ArrayProxy<T>, prop: string, newVal: unknown) => {\n if (prop === \"length\") {\n target.length = newVal as number;\n return true;\n }\n throw Error(`ArrayProxy is immutable except for length`);\n },\n };\n return new Proxy(this, handler);\n }\n\n map = (func: (item: T, i: number) => unknown) => {\n return new ArrayProxy(this.length, (i: number) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return func(this.#getItem(i), i);\n });\n };\n slice = (from: number, to: number) => {\n const out = [];\n const end = Math.min(this.length, to);\n for (let i = from; i < end; i++) {\n out.push(this.#getItem(i));\n }\n return out;\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAA,QAAA,CAAA;AAEO,MAAM,WAAA,GAAN,MAAM,WAAuB,CAAA;AAAA,EAIlC,WAAA,CAAY,MAAc,MAAwB,EAAA;AAHlD,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACA,IAAA,IAAA,CAAO,MAAS,GAAA,CAAA,CAAA;AAwChB,IAAA,IAAA,CAAA,GAAA,GAAM,CAAC,IAA0C,KAAA;AAC/C,MAAA,OAAO,IAAI,WAAA,CAAW,IAAK,CAAA,MAAA,EAAQ,CAAC,CAAc,KAAA;AAGhD,QAAA,OAAO,IAAK,CAAA,YAAA,CAAA,IAAA,EAAK,QAAL,CAAA,CAAA,IAAA,CAAA,IAAA,EAAc,IAAI,CAAC,CAAA,CAAA;AAAA,OAChC,CAAA,CAAA;AAAA,KACH,CAAA;AACA,IAAQ,IAAA,CAAA,KAAA,GAAA,CAAC,MAAc,EAAe,KAAA;AACpC,MAAA,MAAM,MAAM,EAAC,CAAA;AACb,MAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,QAAQ,EAAE,CAAA,CAAA;AACpC,MAAA,KAAA,IAAS,CAAI,GAAA,IAAA,EAAM,CAAI,GAAA,GAAA,EAAK,CAAK,EAAA,EAAA;AAC/B,QAAA,GAAA,CAAI,IAAK,CAAA,YAAA,CAAA,IAAA,EAAK,QAAL,CAAA,CAAA,IAAA,CAAA,IAAA,EAAc,CAAE,CAAA,CAAA,CAAA;AAAA,OAC3B;AACA,MAAO,OAAA,GAAA,CAAA;AAAA,KACT,CAAA;AAnDE,IAAA,YAAA,CAAA,IAAA,EAAK,QAAW,EAAA,MAAA,CAAA,CAAA;AAChB,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AAEd,IAAA,MAAM,OAAU,GAAA;AAAA,MACd,GAAA,EAAK,CAAC,MAAA,EAAuB,IAA+B,KAAA;AAXlE,QAAA,IAAA,EAAA,CAAA;AAYQ,QAAA,IAAI,SAAS,QAAU,EAAA;AACrB,UAAA,OAAO,MAAO,CAAA,MAAA,CAAA;AAAA,SAChB,MAAA,IAAW,SAAS,OAAS,EAAA;AAC3B,UAAA,OAAO,MAAO,CAAA,KAAA,CAAA;AAAA,SAChB,MAAA,IAAW,SAAS,KAAO,EAAA;AACzB,UAAA,OAAO,MAAO,CAAA,GAAA,CAAA;AAAA,SAChB,MAAA,IAAW,SAAS,UAAY,EAAA;AAC9B,UAAO,OAAA,cAAA,CAAA;AAAA,SACT;AACA,QAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC5B,UAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,IAAA,EAAM,EAAE,CAAA,CAAA;AAC/B,UAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,YAAI,IAAA,KAAA,GAAQ,KAAK,MAAQ,EAAA;AACvB,cAAO,OAAA,YAAA,CAAA,EAAA,GAAA,MAAA,EAAO,UAAP,IAAgB,CAAA,EAAA,EAAA,KAAA,CAAA,CAAA;AAAA,aAClB,MAAA;AACL,cAAO,OAAA,KAAA,CAAA,CAAA;AAAA,aACT;AAAA,WACF;AAAA,SACF;AACA,QAAA,MAAM,KAAM,CAAA,CAAA,qBAAA,EAAwB,MAAO,CAAA,IAAI,CAAC,CAAgB,cAAA,CAAA,CAAA,CAAA;AAAA,OAClE;AAAA,MACA,GAAK,EAAA,CAAC,MAAuB,EAAA,IAAA,EAAc,MAAoB,KAAA;AAC7D,QAAA,IAAI,SAAS,QAAU,EAAA;AACrB,UAAA,MAAA,CAAO,MAAS,GAAA,MAAA,CAAA;AAChB,UAAO,OAAA,IAAA,CAAA;AAAA,SACT;AACA,QAAA,MAAM,MAAM,CAA2C,yCAAA,CAAA,CAAA,CAAA;AAAA,OACzD;AAAA,KACF,CAAA;AACA,IAAO,OAAA,IAAI,KAAM,CAAA,IAAA,EAAM,OAAO,CAAA,CAAA;AAAA,GAChC;AAiBF,CAAA,CAAA;AAxDE,QAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AADK,IAAM,UAAN,GAAA;;;;"}
|
package/esm/Table.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { EventEmitter } from '@vuu-ui/vuu-utils';
|
|
2
|
+
|
|
3
|
+
var __accessCheck = (obj, member, msg) => {
|
|
4
|
+
if (!member.has(obj))
|
|
5
|
+
throw TypeError("Cannot " + msg);
|
|
6
|
+
};
|
|
7
|
+
var __privateGet = (obj, member, getter) => {
|
|
8
|
+
__accessCheck(obj, member, "read from private field");
|
|
9
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
10
|
+
};
|
|
11
|
+
var __privateAdd = (obj, member, value) => {
|
|
12
|
+
if (member.has(obj))
|
|
13
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
14
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
15
|
+
};
|
|
16
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
17
|
+
__accessCheck(obj, member, "write to private field");
|
|
18
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
var _data, _dataMap, _indexOfKey, _index, _schema;
|
|
22
|
+
class Table extends EventEmitter {
|
|
23
|
+
constructor(schema, data, dataMap, updateGenerator) {
|
|
24
|
+
super();
|
|
25
|
+
__privateAdd(this, _data, void 0);
|
|
26
|
+
__privateAdd(this, _dataMap, void 0);
|
|
27
|
+
__privateAdd(this, _indexOfKey, void 0);
|
|
28
|
+
__privateAdd(this, _index, /* @__PURE__ */ new Map());
|
|
29
|
+
__privateAdd(this, _schema, void 0);
|
|
30
|
+
__privateSet(this, _data, data);
|
|
31
|
+
__privateSet(this, _dataMap, dataMap);
|
|
32
|
+
__privateSet(this, _schema, schema);
|
|
33
|
+
__privateSet(this, _indexOfKey, dataMap[schema.key]);
|
|
34
|
+
this.buildIndex();
|
|
35
|
+
updateGenerator?.setTable(this);
|
|
36
|
+
updateGenerator?.setRange({ from: 0, to: 100 });
|
|
37
|
+
}
|
|
38
|
+
buildIndex() {
|
|
39
|
+
for (let i = 0; i < __privateGet(this, _data).length; i++) {
|
|
40
|
+
const key = __privateGet(this, _data)[i][__privateGet(this, _indexOfKey)];
|
|
41
|
+
__privateGet(this, _index).set(key, i);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
get data() {
|
|
45
|
+
return __privateGet(this, _data);
|
|
46
|
+
}
|
|
47
|
+
get map() {
|
|
48
|
+
return __privateGet(this, _dataMap);
|
|
49
|
+
}
|
|
50
|
+
get schema() {
|
|
51
|
+
return __privateGet(this, _schema);
|
|
52
|
+
}
|
|
53
|
+
insert(row) {
|
|
54
|
+
const index = __privateGet(this, _data).length;
|
|
55
|
+
__privateGet(this, _data).push(row);
|
|
56
|
+
const key = row[__privateGet(this, _indexOfKey)];
|
|
57
|
+
__privateGet(this, _index).set(key, index);
|
|
58
|
+
this.emit("insert", row);
|
|
59
|
+
}
|
|
60
|
+
findByKey(key) {
|
|
61
|
+
const index = __privateGet(this, _index).get(key) ?? -1;
|
|
62
|
+
return __privateGet(this, _data)[index];
|
|
63
|
+
}
|
|
64
|
+
update(key, columnName, value) {
|
|
65
|
+
const rowIndex = __privateGet(this, _data).findIndex(
|
|
66
|
+
(row) => row[__privateGet(this, _indexOfKey)] === key
|
|
67
|
+
);
|
|
68
|
+
const colIndex = __privateGet(this, _dataMap)[columnName];
|
|
69
|
+
if (rowIndex !== -1) {
|
|
70
|
+
const row = __privateGet(this, _data)[rowIndex];
|
|
71
|
+
const newRow = row.slice();
|
|
72
|
+
newRow[colIndex] = value;
|
|
73
|
+
__privateGet(this, _data)[rowIndex] = newRow;
|
|
74
|
+
this.emit("update", newRow, columnName);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
updateRow(row) {
|
|
78
|
+
const key = row[__privateGet(this, _indexOfKey)];
|
|
79
|
+
const rowIndex = __privateGet(this, _data).findIndex(
|
|
80
|
+
(row2) => row2[__privateGet(this, _indexOfKey)] === key
|
|
81
|
+
);
|
|
82
|
+
if (rowIndex !== -1) {
|
|
83
|
+
__privateGet(this, _data)[rowIndex] = row;
|
|
84
|
+
this.emit("update", row);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
_data = new WeakMap();
|
|
89
|
+
_dataMap = new WeakMap();
|
|
90
|
+
_indexOfKey = new WeakMap();
|
|
91
|
+
_index = new WeakMap();
|
|
92
|
+
_schema = new WeakMap();
|
|
93
|
+
const buildDataColumnMap = (schema) => Object.values(schema.columns).reduce((map, col, index) => {
|
|
94
|
+
map[col.name] = index;
|
|
95
|
+
return map;
|
|
96
|
+
}, {});
|
|
97
|
+
const getServerDataType = (columnName, { columns: cols1, table: t1 }, { columns: cols2, table: t2 }) => {
|
|
98
|
+
const col1 = cols1.find((col) => col.name === columnName);
|
|
99
|
+
const col2 = cols2.find((col) => col.name === columnName);
|
|
100
|
+
if (col1 && col2) {
|
|
101
|
+
if (col1.serverDataType === col2.serverDataType) {
|
|
102
|
+
return col1.serverDataType;
|
|
103
|
+
} else {
|
|
104
|
+
throw Error(
|
|
105
|
+
`both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
} else if (col1) {
|
|
109
|
+
return col1.serverDataType;
|
|
110
|
+
} else if (col2) {
|
|
111
|
+
return col2.serverDataType;
|
|
112
|
+
} else {
|
|
113
|
+
throw Error(`WTF how is this possible`);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const joinTables = (joinTable, table1, table2, joinColumn) => {
|
|
117
|
+
const { map: m1, schema: schema1 } = table1;
|
|
118
|
+
const { map: m2, schema: schema2 } = table2;
|
|
119
|
+
const k1 = m1[joinColumn];
|
|
120
|
+
const k2 = m2[joinColumn];
|
|
121
|
+
const combinedColumns = new Set(
|
|
122
|
+
[...schema1.columns, ...schema2.columns].map((col) => col.name).sort()
|
|
123
|
+
);
|
|
124
|
+
const combinedSchema = {
|
|
125
|
+
key: joinColumn,
|
|
126
|
+
table: joinTable,
|
|
127
|
+
columns: Array.from(combinedColumns).map((columnName) => ({
|
|
128
|
+
name: columnName,
|
|
129
|
+
serverDataType: getServerDataType(columnName, schema1, schema2)
|
|
130
|
+
}))
|
|
131
|
+
};
|
|
132
|
+
const data = [];
|
|
133
|
+
const combinedColumnMap = buildDataColumnMap(combinedSchema);
|
|
134
|
+
for (const row of table1.data) {
|
|
135
|
+
const row2 = table2.findByKey(String(row[k1]));
|
|
136
|
+
if (row2) {
|
|
137
|
+
const out = [];
|
|
138
|
+
for (const column of table1.schema.columns) {
|
|
139
|
+
const value = row[m1[column.name]];
|
|
140
|
+
out[combinedColumnMap[column.name]] = value;
|
|
141
|
+
}
|
|
142
|
+
for (const column of table2.schema.columns) {
|
|
143
|
+
const value = row2[m2[column.name]];
|
|
144
|
+
out[combinedColumnMap[column.name]] = value;
|
|
145
|
+
}
|
|
146
|
+
data.push(out);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const newTable = new Table(combinedSchema, data, combinedColumnMap);
|
|
150
|
+
table1.on("insert", (row) => {
|
|
151
|
+
const row2 = table2.findByKey(String(row[k1]));
|
|
152
|
+
if (row2) {
|
|
153
|
+
const out = [];
|
|
154
|
+
for (const column of table1.schema.columns) {
|
|
155
|
+
const value = row[m1[column.name]];
|
|
156
|
+
out[combinedColumnMap[column.name]] = value;
|
|
157
|
+
}
|
|
158
|
+
for (const column of table2.schema.columns) {
|
|
159
|
+
const value = row2[m2[column.name]];
|
|
160
|
+
out[combinedColumnMap[column.name]] = value;
|
|
161
|
+
}
|
|
162
|
+
newTable.insert(out);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
table2.on("update", (row) => {
|
|
166
|
+
const keyValue = row[k2];
|
|
167
|
+
const targetRow = newTable.findByKey(keyValue);
|
|
168
|
+
if (targetRow) {
|
|
169
|
+
const updatedRow = targetRow.slice();
|
|
170
|
+
for (const { name } of table2.schema.columns) {
|
|
171
|
+
if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {
|
|
172
|
+
updatedRow[combinedColumnMap[name]] = row[m2[name]];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
newTable.updateRow(updatedRow);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
return newTable;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export { Table, buildDataColumnMap, joinTables };
|
|
182
|
+
//# sourceMappingURL=Table.js.map
|
package/esm/Table.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Table.js","sources":["../src/Table.ts"],"sourcesContent":["import { SchemaColumn, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, EventEmitter } from \"@vuu-ui/vuu-utils\";\nimport { UpdateGenerator } from \"./rowUpdates\";\n\nexport type TableEvents = {\n delete: (row: VuuRowDataItemType[]) => void;\n insert: (row: VuuRowDataItemType[]) => void;\n update: (row: VuuRowDataItemType[], columnName?: string) => void;\n};\n\nexport class Table extends EventEmitter<TableEvents> {\n #data: VuuRowDataItemType[][];\n #dataMap: ColumnMap;\n #indexOfKey: number;\n #index = new Map<string, number>();\n #schema: TableSchema;\n\n constructor(\n schema: TableSchema,\n data: VuuRowDataItemType[][],\n dataMap: ColumnMap,\n updateGenerator?: UpdateGenerator\n ) {\n super();\n this.#data = data;\n this.#dataMap = dataMap;\n this.#schema = schema;\n this.#indexOfKey = dataMap[schema.key];\n this.buildIndex();\n updateGenerator?.setTable(this);\n updateGenerator?.setRange({ from: 0, to: 100 });\n }\n\n private buildIndex() {\n for (let i = 0; i < this.#data.length; i++) {\n const key = this.#data[i][this.#indexOfKey] as string;\n this.#index.set(key, i);\n }\n }\n\n get data() {\n return this.#data;\n }\n\n get map() {\n return this.#dataMap;\n }\n\n get schema() {\n return this.#schema;\n }\n\n insert(row: VuuRowDataItemType[]) {\n const index = this.#data.length;\n this.#data.push(row);\n const key = row[this.#indexOfKey] as string;\n this.#index.set(key, index);\n this.emit(\"insert\", row);\n }\n\n findByKey(key: string) {\n const index = this.#index.get(key) ?? -1;\n return this.#data[index];\n }\n\n update(key: string, columnName: string, value: VuuRowDataItemType) {\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key\n );\n const colIndex = this.#dataMap[columnName];\n if (rowIndex !== -1) {\n const row = this.#data[rowIndex];\n const newRow = row.slice();\n newRow[colIndex] = value;\n this.#data[rowIndex] = newRow;\n this.emit(\"update\", newRow, columnName);\n }\n }\n updateRow(row: VuuRowDataItemType[]) {\n const key = row[this.#indexOfKey];\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key\n );\n if (rowIndex !== -1) {\n this.#data[rowIndex] = row;\n this.emit(\"update\", row);\n }\n }\n}\n\nexport const buildDataColumnMap = (schema: TableSchema) =>\n Object.values(schema.columns).reduce<ColumnMap>((map, col, index) => {\n map[col.name] = index;\n return map;\n }, {});\n\nconst getServerDataType = (\n columnName: string,\n { columns: cols1, table: t1 }: TableSchema,\n { columns: cols2, table: t2 }: TableSchema\n) => {\n const col1 = cols1.find((col) => col.name === columnName);\n const col2 = cols2.find((col) => col.name === columnName);\n if (col1 && col2) {\n if (col1.serverDataType === col2.serverDataType) {\n return col1.serverDataType;\n } else {\n throw Error(\n `both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`\n );\n }\n } else if (col1) {\n return col1.serverDataType;\n } else if (col2) {\n return col2.serverDataType;\n } else {\n throw Error(`WTF how is this possible`);\n }\n};\n\n// Just copies source tables, then registers update listeners.\n// Not terribly efficient, but good enough for showcase\nexport const joinTables = (\n joinTable: VuuTable,\n table1: Table,\n table2: Table,\n joinColumn: string\n) => {\n const { map: m1, schema: schema1 } = table1;\n const { map: m2, schema: schema2 } = table2;\n const k1 = m1[joinColumn];\n const k2 = m2[joinColumn];\n\n const combinedColumns = new Set(\n [...schema1.columns, ...schema2.columns].map((col) => col.name).sort()\n );\n\n const combinedSchema: TableSchema = {\n key: joinColumn,\n table: joinTable,\n columns: Array.from(combinedColumns).map<SchemaColumn>((columnName) => ({\n name: columnName,\n serverDataType: getServerDataType(columnName, schema1, schema2),\n })),\n };\n\n const data: VuuRowDataItemType[][] = [];\n const combinedColumnMap = buildDataColumnMap(combinedSchema);\n // const start = performance.now();\n for (const row of table1.data) {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n\n data.push(out);\n }\n }\n // const end = performance.now();\n // console.log(`took ${end - start} ms to create join table ${joinTable.table}`);\n\n const newTable = new Table(combinedSchema, data, combinedColumnMap);\n\n table1.on(\"insert\", (row) => {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n newTable.insert(out);\n }\n });\n\n table2.on(\"update\", (row) => {\n const keyValue = row[k2] as string;\n const targetRow = newTable.findByKey(keyValue);\n if (targetRow) {\n const updatedRow = targetRow.slice();\n for (const { name } of table2.schema.columns) {\n if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {\n updatedRow[combinedColumnMap[name]] = row[m2[name]];\n }\n }\n newTable.updateRow(updatedRow);\n }\n });\n\n return newTable;\n};\n"],"names":["row"],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ArrayDataSource } from '@vuu-ui/vuu-data-local';
|
|
2
|
+
import { metadataKeys } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import { makeSuggestions } from './makeSuggestions.js';
|
|
4
|
+
|
|
5
|
+
var __accessCheck = (obj, member, msg) => {
|
|
6
|
+
if (!member.has(obj))
|
|
7
|
+
throw TypeError("Cannot " + msg);
|
|
8
|
+
};
|
|
9
|
+
var __privateGet = (obj, member, getter) => {
|
|
10
|
+
__accessCheck(obj, member, "read from private field");
|
|
11
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
12
|
+
};
|
|
13
|
+
var __privateAdd = (obj, member, value) => {
|
|
14
|
+
if (member.has(obj))
|
|
15
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
16
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
17
|
+
};
|
|
18
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
19
|
+
__accessCheck(obj, member, "write to private field");
|
|
20
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var _menuRpcServices, _rpcServices, _table;
|
|
24
|
+
class TickingArrayDataSource extends ArrayDataSource {
|
|
25
|
+
constructor({
|
|
26
|
+
data,
|
|
27
|
+
menuRpcServices,
|
|
28
|
+
rpcServices,
|
|
29
|
+
table,
|
|
30
|
+
menu,
|
|
31
|
+
...arrayDataSourceProps
|
|
32
|
+
}) {
|
|
33
|
+
if (data === void 0 && table === void 0) {
|
|
34
|
+
throw Error("TickingArrayDataSource must be constructed with data");
|
|
35
|
+
}
|
|
36
|
+
super({
|
|
37
|
+
...arrayDataSourceProps,
|
|
38
|
+
data: data ?? table?.data ?? []
|
|
39
|
+
});
|
|
40
|
+
__privateAdd(this, _menuRpcServices, void 0);
|
|
41
|
+
__privateAdd(this, _rpcServices, void 0);
|
|
42
|
+
__privateAdd(this, _table, void 0);
|
|
43
|
+
this._menu = menu;
|
|
44
|
+
__privateSet(this, _menuRpcServices, menuRpcServices);
|
|
45
|
+
__privateSet(this, _rpcServices, rpcServices);
|
|
46
|
+
__privateSet(this, _table, table);
|
|
47
|
+
if (table) {
|
|
48
|
+
table.on("insert", this.insert);
|
|
49
|
+
table.on("update", this.updateRow);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async subscribe(subscribeProps, callback) {
|
|
53
|
+
const subscription = super.subscribe(subscribeProps, callback);
|
|
54
|
+
return subscription;
|
|
55
|
+
}
|
|
56
|
+
set range(range) {
|
|
57
|
+
super.range = range;
|
|
58
|
+
}
|
|
59
|
+
get range() {
|
|
60
|
+
return super.range;
|
|
61
|
+
}
|
|
62
|
+
getSelectedRows() {
|
|
63
|
+
return this.selectedRows.reduce(
|
|
64
|
+
(rows, selected) => {
|
|
65
|
+
if (Array.isArray(selected)) {
|
|
66
|
+
selected.forEach((sel) => {
|
|
67
|
+
const row = this.data[sel];
|
|
68
|
+
if (row) {
|
|
69
|
+
rows.push(row);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
} else {
|
|
73
|
+
const row = this.data[selected];
|
|
74
|
+
if (row) {
|
|
75
|
+
rows.push(row);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return rows;
|
|
79
|
+
},
|
|
80
|
+
[]
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
applyEdit(row, columnName, value) {
|
|
84
|
+
const key = row[metadataKeys.KEY];
|
|
85
|
+
__privateGet(this, _table)?.update(key, columnName, value);
|
|
86
|
+
return Promise.resolve(true);
|
|
87
|
+
}
|
|
88
|
+
async rpcCall(rpcRequest) {
|
|
89
|
+
const rpcService = __privateGet(this, _rpcServices)?.find(
|
|
90
|
+
(service) => service.rpcName === rpcRequest.rpcName
|
|
91
|
+
);
|
|
92
|
+
if (rpcService) {
|
|
93
|
+
return rpcService.service({
|
|
94
|
+
...rpcRequest
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
console.log(`no implementation for PRC service ${rpcRequest.rpcName}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async menuRpcCall(rpcRequest) {
|
|
101
|
+
const rpcService = __privateGet(this, _rpcServices)?.find(
|
|
102
|
+
(service) => service.rpcName === rpcRequest.rpcName
|
|
103
|
+
);
|
|
104
|
+
if (rpcService) {
|
|
105
|
+
switch (rpcRequest.type) {
|
|
106
|
+
case "VIEW_PORT_MENUS_SELECT_RPC": {
|
|
107
|
+
const selectedRows = this.getSelectedRows();
|
|
108
|
+
return rpcService.service({
|
|
109
|
+
...rpcRequest,
|
|
110
|
+
selectedRows
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return super.menuRpcCall(rpcRequest);
|
|
116
|
+
}
|
|
117
|
+
getTypeaheadSuggestions(column, pattern) {
|
|
118
|
+
if (__privateGet(this, _table)) {
|
|
119
|
+
return makeSuggestions(__privateGet(this, _table), column, pattern);
|
|
120
|
+
} else {
|
|
121
|
+
throw Error(
|
|
122
|
+
"cannot call getTypeaheadSuggestions on TickingDataSOurce if table has not been provided"
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
_menuRpcServices = new WeakMap();
|
|
128
|
+
_rpcServices = new WeakMap();
|
|
129
|
+
_table = new WeakMap();
|
|
130
|
+
|
|
131
|
+
export { TickingArrayDataSource };
|
|
132
|
+
//# sourceMappingURL=TickingArrayDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TickingArrayDataSource.js","sources":["../src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceRow,\n MenuRpcResponse,\n RpcResponse,\n SelectionItem,\n SubscribeCallback,\n SubscribeProps,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\n\nexport type RpcService = {\n rpcName: string;\n service: (rpcRequest: any) => Promise<any>;\n};\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n menu?: VuuMenu;\n menuRpcServices?: RpcService[];\n rpcServices?: RpcService[];\n table?: Table;\n}\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #rpcServices: RpcService[] | undefined;\n #table?: Table;\n\n constructor({\n data,\n menuRpcServices,\n rpcServices,\n table,\n menu,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n });\n this._menu = menu;\n this.#menuRpcServices = menuRpcServices;\n this.#rpcServices = rpcServices;\n this.#table = table;\n\n if (table) {\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRow);\n }\n }\n\n async subscribe(subscribeProps: SubscribeProps, callback: SubscribeCallback) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n return subscription;\n }\n\n set range(range: VuuRange) {\n super.range = range;\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n private getSelectedRows() {\n return this.selectedRows.reduce<DataSourceRow[]>(\n (rows: DataSourceRow[], selected: SelectionItem) => {\n if (Array.isArray(selected)) {\n selected.forEach((sel) => {\n const row = this.data[sel];\n if (row) {\n rows.push(row);\n }\n });\n } else {\n const row = this.data[selected];\n if (row) {\n rows.push(row);\n }\n }\n return rows;\n },\n []\n );\n }\n\n applyEdit(\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n ): Promise<true> {\n const key = row[metadataKeys.KEY];\n this.#table?.update(key, columnName, value);\n return Promise.resolve(true);\n }\n\n async rpcCall<T extends RpcResponse = RpcResponse>(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ): Promise<T | undefined> {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName ===\n (rpcRequest as ClientToServerViewportRpcCall).rpcName\n );\n if (rpcService) {\n return rpcService.service({\n ...rpcRequest,\n });\n } else {\n console.log(`no implementation for PRC service ${rpcRequest.rpcName}`);\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName === (rpcRequest as ClientToServerMenuRPC).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.type) {\n case \"VIEW_PORT_MENUS_SELECT_RPC\": {\n const selectedRows = this.getSelectedRows();\n return rpcService.service({\n ...rpcRequest,\n selectedRows,\n });\n }\n\n default:\n }\n }\n return super.menuRpcCall(rpcRequest);\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n return makeSuggestions(this.#table, column, pattern);\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSOurce if table has not been provided\"\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
|