@tasenor/common-node 1.9.16
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/.eslintrc.js +4 -0
- package/LICENSE +21 -0
- package/dist/tasenor-common-node/src/cli.d.ts +81 -0
- package/dist/tasenor-common-node/src/cli.js +242 -0
- package/dist/tasenor-common-node/src/cli.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/account.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/account.js +58 -0
- package/dist/tasenor-common-node/src/commands/account.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/balance.d.ts +11 -0
- package/dist/tasenor-common-node/src/commands/balance.js +117 -0
- package/dist/tasenor-common-node/src/commands/balance.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/db.d.ts +14 -0
- package/dist/tasenor-common-node/src/commands/db.js +69 -0
- package/dist/tasenor-common-node/src/commands/db.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/entry.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/entry.js +106 -0
- package/dist/tasenor-common-node/src/commands/entry.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/import.d.ts +17 -0
- package/dist/tasenor-common-node/src/commands/import.js +140 -0
- package/dist/tasenor-common-node/src/commands/import.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/importer.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/importer.js +71 -0
- package/dist/tasenor-common-node/src/commands/importer.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/index.d.ts +191 -0
- package/dist/tasenor-common-node/src/commands/index.js +482 -0
- package/dist/tasenor-common-node/src/commands/index.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/period.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/period.js +48 -0
- package/dist/tasenor-common-node/src/commands/period.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/plugin.d.ts +15 -0
- package/dist/tasenor-common-node/src/commands/plugin.js +78 -0
- package/dist/tasenor-common-node/src/commands/plugin.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/report.d.ts +11 -0
- package/dist/tasenor-common-node/src/commands/report.js +96 -0
- package/dist/tasenor-common-node/src/commands/report.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/settings.d.ts +10 -0
- package/dist/tasenor-common-node/src/commands/settings.js +64 -0
- package/dist/tasenor-common-node/src/commands/settings.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/stock.d.ts +8 -0
- package/dist/tasenor-common-node/src/commands/stock.js +73 -0
- package/dist/tasenor-common-node/src/commands/stock.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/tag.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/tag.js +89 -0
- package/dist/tasenor-common-node/src/commands/tag.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/tx.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/tx.js +81 -0
- package/dist/tasenor-common-node/src/commands/tx.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/user.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/user.js +52 -0
- package/dist/tasenor-common-node/src/commands/user.js.map +1 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.d.ts +77 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.js +343 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.js.map +1 -0
- package/dist/tasenor-common-node/src/database/DB.d.ts +51 -0
- package/dist/tasenor-common-node/src/database/DB.js +354 -0
- package/dist/tasenor-common-node/src/database/DB.js.map +1 -0
- package/dist/tasenor-common-node/src/database/index.d.ts +7 -0
- package/dist/tasenor-common-node/src/database/index.js +8 -0
- package/dist/tasenor-common-node/src/database/index.js.map +1 -0
- package/dist/tasenor-common-node/src/doccer.d.ts +29 -0
- package/dist/tasenor-common-node/src/doccer.js +30 -0
- package/dist/tasenor-common-node/src/doccer.js.map +1 -0
- package/dist/tasenor-common-node/src/error.d.ts +30 -0
- package/dist/tasenor-common-node/src/error.js +35 -0
- package/dist/tasenor-common-node/src/error.js.map +1 -0
- package/dist/tasenor-common-node/src/export/Exporter.d.ts +69 -0
- package/dist/tasenor-common-node/src/export/Exporter.js +123 -0
- package/dist/tasenor-common-node/src/export/Exporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.d.ts +55 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.js +135 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.d.ts +71 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.js +290 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/index.d.ts +8 -0
- package/dist/tasenor-common-node/src/export/index.js +9 -0
- package/dist/tasenor-common-node/src/export/index.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.d.ts +104 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js +354 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.d.ts +38 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.js +27 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.d.ts +173 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.js +733 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.d.ts +238 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.js +522 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.d.ts +181 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.js +482 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.d.ts +324 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.js +1379 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.js.map +1 -0
- package/dist/tasenor-common-node/src/import/index.d.ts +11 -0
- package/dist/tasenor-common-node/src/import/index.js +12 -0
- package/dist/tasenor-common-node/src/import/index.js.map +1 -0
- package/dist/tasenor-common-node/src/index.d.ts +12 -0
- package/dist/tasenor-common-node/src/index.js +13 -0
- package/dist/tasenor-common-node/src/index.js.map +1 -0
- package/dist/tasenor-common-node/src/net/crypto.d.ts +33 -0
- package/dist/tasenor-common-node/src/net/crypto.js +63 -0
- package/dist/tasenor-common-node/src/net/crypto.js.map +1 -0
- package/dist/tasenor-common-node/src/net/git.d.ts +49 -0
- package/dist/tasenor-common-node/src/net/git.js +137 -0
- package/dist/tasenor-common-node/src/net/git.js.map +1 -0
- package/dist/tasenor-common-node/src/net/index.d.ts +10 -0
- package/dist/tasenor-common-node/src/net/index.js +11 -0
- package/dist/tasenor-common-node/src/net/index.js.map +1 -0
- package/dist/tasenor-common-node/src/net/middleware.d.ts +61 -0
- package/dist/tasenor-common-node/src/net/middleware.js +220 -0
- package/dist/tasenor-common-node/src/net/middleware.js.map +1 -0
- package/dist/tasenor-common-node/src/net/tokens.d.ts +50 -0
- package/dist/tasenor-common-node/src/net/tokens.js +141 -0
- package/dist/tasenor-common-node/src/net/tokens.js.map +1 -0
- package/dist/tasenor-common-node/src/net/vault.d.ts +67 -0
- package/dist/tasenor-common-node/src/net/vault.js +145 -0
- package/dist/tasenor-common-node/src/net/vault.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.d.ts +91 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.js +165 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.d.ts +13 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.js +26 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.d.ts +188 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.js +204 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.d.ts +132 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.js +393 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.d.ts +34 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.js +47 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.d.ts +80 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.js +168 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.d.ts +27 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.js +37 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/index.d.ts +13 -0
- package/dist/tasenor-common-node/src/plugins/index.js +14 -0
- package/dist/tasenor-common-node/src/plugins/index.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/plugins.d.ts +101 -0
- package/dist/tasenor-common-node/src/plugins/plugins.js +292 -0
- package/dist/tasenor-common-node/src/plugins/plugins.js.map +1 -0
- package/dist/tasenor-common-node/src/process/Process.d.ts +108 -0
- package/dist/tasenor-common-node/src/process/Process.js +335 -0
- package/dist/tasenor-common-node/src/process/Process.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.d.ts +24 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.js +28 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.d.ts +69 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.js +145 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.d.ts +60 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.js +73 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.d.ts +52 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.js +78 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.d.ts +60 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.js +182 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.js.map +1 -0
- package/dist/tasenor-common-node/src/process/index.d.ts +11 -0
- package/dist/tasenor-common-node/src/process/index.js +12 -0
- package/dist/tasenor-common-node/src/process/index.js.map +1 -0
- package/dist/tasenor-common-node/src/reports/conversions.d.ts +8 -0
- package/dist/tasenor-common-node/src/reports/conversions.js +47 -0
- package/dist/tasenor-common-node/src/reports/conversions.js.map +1 -0
- package/dist/tasenor-common-node/src/reports/index.d.ts +6 -0
- package/dist/tasenor-common-node/src/reports/index.js +7 -0
- package/dist/tasenor-common-node/src/reports/index.js.map +1 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.d.ts +43 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.js +112 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.js.map +1 -0
- package/dist/tasenor-common-node/src/server/api.d.ts +15 -0
- package/dist/tasenor-common-node/src/server/api.js +27 -0
- package/dist/tasenor-common-node/src/server/api.js.map +1 -0
- package/dist/tasenor-common-node/src/server/index.d.ts +7 -0
- package/dist/tasenor-common-node/src/server/index.js +8 -0
- package/dist/tasenor-common-node/src/server/index.js.map +1 -0
- package/dist/tasenor-common-node/src/server/router.d.ts +5 -0
- package/dist/tasenor-common-node/src/server/router.js +37 -0
- package/dist/tasenor-common-node/src/server/router.js.map +1 -0
- package/dist/tasenor-common-node/src/system.d.ts +27 -0
- package/dist/tasenor-common-node/src/system.js +95 -0
- package/dist/tasenor-common-node/src/system.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.d.ts +21 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js +33 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.d.ts +24 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js +68 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.d.ts +64 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.js +199 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/index.d.ts +4 -0
- package/dist/tasenor-common-node/src/testing/index.js +5 -0
- package/dist/tasenor-common-node/src/testing/index.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.d.ts +13 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.js +52 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.js +64 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js +80 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js +342 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js +174 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js +175 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/password.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/password.spec.js +8 -0
- package/dist/tasenor-common-node/tests/password.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/tokens.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/tokens.spec.js +49 -0
- package/dist/tasenor-common-node/tests/tokens.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/vault.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/vault.spec.js +19 -0
- package/dist/tasenor-common-node/tests/vault.spec.js.map +1 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.d.ts +11 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js +30 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.d.ts +5 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js +350 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js.map +1 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.d.ts +23 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js +83 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.d.ts +28 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js +340 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.d.ts +11 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js +39 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.d.ts +17 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js +66 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.d.ts +13 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js +241 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js.map +1 -0
- package/jest.config.js +1 -0
- package/package.json +62 -0
- package/src/cli.ts +267 -0
- package/src/commands/account.ts +69 -0
- package/src/commands/balance.ts +131 -0
- package/src/commands/db.ts +84 -0
- package/src/commands/entry.ts +117 -0
- package/src/commands/import.ts +160 -0
- package/src/commands/importer.ts +84 -0
- package/src/commands/index.ts +534 -0
- package/src/commands/period.ts +59 -0
- package/src/commands/plugin.ts +95 -0
- package/src/commands/report.ts +113 -0
- package/src/commands/settings.ts +75 -0
- package/src/commands/stock.ts +80 -0
- package/src/commands/tag.ts +102 -0
- package/src/commands/tx.ts +93 -0
- package/src/commands/user.ts +65 -0
- package/src/database/BookkeeperImporter.ts +358 -0
- package/src/database/DB.ts +396 -0
- package/src/database/index.ts +7 -0
- package/src/doccer.ts +29 -0
- package/src/error.ts +32 -0
- package/src/export/Exporter.ts +136 -0
- package/src/export/TasenorExporter.ts +144 -0
- package/src/export/TilitinExporter.ts +302 -0
- package/src/export/index.ts +8 -0
- package/src/import/TextFileProcessHandler.ts +384 -0
- package/src/import/TransactionImportConnector.ts +65 -0
- package/src/import/TransactionImportHandler.ts +819 -0
- package/src/import/TransactionRules.ts +570 -0
- package/src/import/TransactionUI.ts +520 -0
- package/src/import/TransferAnalyzer.ts +1450 -0
- package/src/import/index.ts +11 -0
- package/src/index.ts +12 -0
- package/src/net/crypto.ts +69 -0
- package/src/net/git.ts +151 -0
- package/src/net/index.ts +10 -0
- package/src/net/middleware.ts +261 -0
- package/src/net/tokens.ts +140 -0
- package/src/net/vault.ts +161 -0
- package/src/plugins/BackendPlugin.ts +188 -0
- package/src/plugins/DataPlugin.ts +29 -0
- package/src/plugins/ImportPlugin.ts +211 -0
- package/src/plugins/ReportPlugin.ts +443 -0
- package/src/plugins/SchemePlugin.ts +56 -0
- package/src/plugins/ServicePlugin.ts +188 -0
- package/src/plugins/ToolPlugin.ts +44 -0
- package/src/plugins/index.ts +13 -0
- package/src/plugins/plugins.ts +345 -0
- package/src/process/Process.ts +368 -0
- package/src/process/ProcessConnector.ts +45 -0
- package/src/process/ProcessFile.ts +169 -0
- package/src/process/ProcessHandler.ts +94 -0
- package/src/process/ProcessStep.ts +100 -0
- package/src/process/ProcessingSystem.ts +202 -0
- package/src/process/index.ts +11 -0
- package/src/reports/conversions.ts +52 -0
- package/src/reports/index.ts +6 -0
- package/src/server/ISPDemoServer.ts +122 -0
- package/src/server/api.ts +37 -0
- package/src/server/index.ts +7 -0
- package/src/server/router.ts +60 -0
- package/src/system.ts +96 -0
- package/src/testing/ProcessingSystemMock.ts +45 -0
- package/src/testing/UnitTestImportConnector.ts +86 -0
- package/src/testing/UnitTester.ts +231 -0
- package/src/testing/index.ts +4 -0
- package/src/testing/test-handlers.ts +55 -0
- package/tests/TransactionRules.spec.ts +73 -0
- package/tests/TransferAnalyzer-account-address.spec.ts +87 -0
- package/tests/TransferAnalyzer-buying-and-selling.spec.ts +354 -0
- package/tests/TransferAnalyzer-loans.spec.ts +197 -0
- package/tests/TransferAnalyzer-multiple-null-amounts.spec.ts +181 -0
- package/tests/password.spec.ts +8 -0
- package/tests/tokens.spec.ts +52 -0
- package/tests/vault.spec.ts +20 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
import * as csvParse from 'csv-parse'
|
|
2
|
+
import { BadState, NotImplemented } from '../error'
|
|
3
|
+
import { ProcessFile } from '../process/ProcessFile'
|
|
4
|
+
import { ProcessHandler } from '../process/ProcessHandler'
|
|
5
|
+
import { ImportAction, isImportAction, isImportAnswerAction, isImportConfigureAction, isImportOpAction, ProcessConfig, SegmentId, Directions, TextFileLine, ImportCSVOptions, ImportState, ImportStateText, isImportRetryAction, ImportCustomOptions, TransactionImportOptions } from '@dataplug/tasenor-common'
|
|
6
|
+
import { Process } from '../process/Process'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Utility class to provide tools for implementing any text file based process handler.
|
|
10
|
+
*/
|
|
11
|
+
export class TextFileProcessHandler extends ProcessHandler {
|
|
12
|
+
|
|
13
|
+
public importOptions: TransactionImportOptions = {
|
|
14
|
+
parser: 'csv',
|
|
15
|
+
numericFields: [],
|
|
16
|
+
requiredFields: [],
|
|
17
|
+
insignificantFields: [],
|
|
18
|
+
sharedFields: [],
|
|
19
|
+
textField: null,
|
|
20
|
+
totalAmountField: null
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Split the file to lines and keep line numbers with the lines. Mark state type as initial state.
|
|
25
|
+
* @param file
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
28
|
+
startingState(processFiles: ProcessFile[]): ImportStateText<'initial'> {
|
|
29
|
+
const files: Record<string, { lines: TextFileLine[] }> = {}
|
|
30
|
+
|
|
31
|
+
for (const processFile of processFiles) {
|
|
32
|
+
const original = processFile.decode()
|
|
33
|
+
|
|
34
|
+
let lines: TextFileLine[]
|
|
35
|
+
|
|
36
|
+
if (this.importOptions.custom) {
|
|
37
|
+
// Use custom splitter if defined.
|
|
38
|
+
lines = this.importOptions.custom.splitToLines(original).map((text, idx) => ({
|
|
39
|
+
text,
|
|
40
|
+
line: idx,
|
|
41
|
+
columns: {}
|
|
42
|
+
}))
|
|
43
|
+
} else {
|
|
44
|
+
// Otherwise just split from new lines.
|
|
45
|
+
lines = original.replace(/\n+$/, '').split('\n').map((text, line) => ({
|
|
46
|
+
text,
|
|
47
|
+
line,
|
|
48
|
+
columns: {}
|
|
49
|
+
}))
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
files[processFile.name] = { lines }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
stage: 'initial',
|
|
57
|
+
files
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Check the state type is matching to 'complete'.
|
|
63
|
+
* @param state
|
|
64
|
+
*/
|
|
65
|
+
checkCompletion(state: ImportState): boolean | undefined {
|
|
66
|
+
if (state.stage === 'executed') {
|
|
67
|
+
return true
|
|
68
|
+
}
|
|
69
|
+
return undefined
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A hook to check alternative directions from initial state.
|
|
74
|
+
* @param state
|
|
75
|
+
* @returns
|
|
76
|
+
*/
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
78
|
+
async needInputForSegmentation(state: ImportState, config: ProcessConfig): Promise<Directions | false> {
|
|
79
|
+
return false
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* A hook to check alternative directions from segmented state.
|
|
84
|
+
* @param state
|
|
85
|
+
* @returns
|
|
86
|
+
*/
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
88
|
+
async needInputForClassification(state: ImportState, config: ProcessConfig): Promise<Directions | false> {
|
|
89
|
+
return false
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* A hook to check alternative directions from classified state.
|
|
94
|
+
* @param state
|
|
95
|
+
* @returns
|
|
96
|
+
*/
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
98
|
+
async needInputForAnalysis(state: ImportState, config: ProcessConfig): Promise<Directions | false> {
|
|
99
|
+
return false
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* A hook to check alternative directions from analyzed state.
|
|
104
|
+
* @param state
|
|
105
|
+
* @returns
|
|
106
|
+
*/
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
108
|
+
async needInputForExecution(state: ImportState, config: ProcessConfig): Promise<Directions | false> {
|
|
109
|
+
return false
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Run steps in order 'segmentation', 'classification', 'analysis', 'execution'.
|
|
114
|
+
* @param state
|
|
115
|
+
* @returns
|
|
116
|
+
*/
|
|
117
|
+
async getDirections(state: ImportState, config: ProcessConfig): Promise<Directions> {
|
|
118
|
+
let input: Directions | false
|
|
119
|
+
let directions: Directions
|
|
120
|
+
switch (state.stage) {
|
|
121
|
+
case 'initial':
|
|
122
|
+
input = await this.needInputForSegmentation(state, config)
|
|
123
|
+
if (input) return input
|
|
124
|
+
directions = new Directions({
|
|
125
|
+
type: 'action',
|
|
126
|
+
action: { op: 'segmentation' }
|
|
127
|
+
})
|
|
128
|
+
break
|
|
129
|
+
case 'segmented':
|
|
130
|
+
input = await this.needInputForClassification(state, config)
|
|
131
|
+
if (input) return input
|
|
132
|
+
directions = new Directions({
|
|
133
|
+
type: 'action',
|
|
134
|
+
action: { op: 'classification' }
|
|
135
|
+
})
|
|
136
|
+
break
|
|
137
|
+
case 'classified':
|
|
138
|
+
input = await this.needInputForAnalysis(state, config)
|
|
139
|
+
if (input) return input
|
|
140
|
+
directions = new Directions({
|
|
141
|
+
type: 'action',
|
|
142
|
+
action: { op: 'analysis' }
|
|
143
|
+
})
|
|
144
|
+
break
|
|
145
|
+
case 'analyzed':
|
|
146
|
+
input = await this.needInputForExecution(state, config)
|
|
147
|
+
if (input) return input
|
|
148
|
+
directions = new Directions({
|
|
149
|
+
type: 'action',
|
|
150
|
+
action: { op: 'execution' }
|
|
151
|
+
})
|
|
152
|
+
break
|
|
153
|
+
default:
|
|
154
|
+
throw new BadState('Cannot find directions from the current state.')
|
|
155
|
+
}
|
|
156
|
+
return directions as unknown as Directions
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Call subclass implementation for each action.
|
|
161
|
+
* @param action
|
|
162
|
+
* @param state
|
|
163
|
+
* @param files
|
|
164
|
+
*/
|
|
165
|
+
async action(process: Process, action: ImportAction, state: ImportState, files: ProcessFile[]): Promise<ImportState> {
|
|
166
|
+
|
|
167
|
+
if (!isImportAction(action)) {
|
|
168
|
+
throw new BadState(`Action is not import action ${JSON.stringify(action)}`)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (isImportRetryAction(action)) {
|
|
172
|
+
this.system.logger.info(`Executing 'retry' action on process #${process.id}.`)
|
|
173
|
+
process.status = 'INCOMPLETE'
|
|
174
|
+
process.error = undefined
|
|
175
|
+
await process.save()
|
|
176
|
+
return state
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (isImportOpAction(action)) {
|
|
180
|
+
this.system.logger.info(`Executing '${action.op}' action on process #${process.id}.`)
|
|
181
|
+
switch (action.op) {
|
|
182
|
+
case 'analysis':
|
|
183
|
+
case 'classification':
|
|
184
|
+
case 'segmentation':
|
|
185
|
+
case 'execution':
|
|
186
|
+
return this[action.op](process, state, files, process.config)
|
|
187
|
+
default:
|
|
188
|
+
throw new BadState(`Cannot parse action ${JSON.stringify(action)}`)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (isImportConfigureAction(action)) {
|
|
193
|
+
this.system.logger.info(`Updating 'configuration' on process #${process.id}.`)
|
|
194
|
+
Object.assign(process.config, action.configure)
|
|
195
|
+
await process.save()
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (isImportAnswerAction(action)) {
|
|
199
|
+
this.system.logger.info(`Updating 'answers' on process #${process.id}.`)
|
|
200
|
+
if (!process.config.answers) {
|
|
201
|
+
process.config.answers = {}
|
|
202
|
+
}
|
|
203
|
+
const answers = process.config.answers as Record<SegmentId, Record<string, unknown>>
|
|
204
|
+
for (const segmentId of Object.keys(action.answer)) {
|
|
205
|
+
answers[segmentId] = answers[segmentId] || {}
|
|
206
|
+
for (const variable of Object.keys(action.answer[segmentId])) {
|
|
207
|
+
answers[segmentId][variable] = action.answer[segmentId][variable]
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
await process.save()
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return state
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* This function must implement gathering of each line together that forms together one import activity.
|
|
218
|
+
* @param state
|
|
219
|
+
* @param files
|
|
220
|
+
*/
|
|
221
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
222
|
+
async segmentation(process: Process, state: ImportState, files: ProcessFile[], config: ProcessConfig): Promise<ImportState> {
|
|
223
|
+
throw new NotImplemented(`A class ${this.constructor.name} does not implement segmentation().`)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* This function must implement gathering of each line together that forms together one import activity.
|
|
228
|
+
* @param state
|
|
229
|
+
* @param files
|
|
230
|
+
*/
|
|
231
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
232
|
+
async classification(process: Process, state: ImportState, files: ProcessFile[], config: ProcessConfig): Promise<ImportState> {
|
|
233
|
+
throw new NotImplemented(`A class ${this.constructor.name} does not implement classification().`)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* This function must implement conversion from classified data to the actual executable operations.
|
|
238
|
+
* @param state
|
|
239
|
+
* @param files
|
|
240
|
+
*/
|
|
241
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
242
|
+
async analysis(process: Process, state: ImportState, files: ProcessFile[], config: ProcessConfig): Promise<ImportState> {
|
|
243
|
+
throw new NotImplemented(`A class ${this.constructor.name} does not implement analysis().`)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* This function must implement applying the result in practice.
|
|
248
|
+
* @param state
|
|
249
|
+
* @param files
|
|
250
|
+
*/
|
|
251
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
252
|
+
async execution(process: Process, state: ImportState, files: ProcessFile[], config: ProcessConfig): Promise<ImportState> {
|
|
253
|
+
throw new NotImplemented(`A class ${this.constructor.name} does not implement execution().`)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Parse a single line of CSV.
|
|
258
|
+
* @param line
|
|
259
|
+
* @param options
|
|
260
|
+
* @returns
|
|
261
|
+
*/
|
|
262
|
+
async parseCsvLine(line: string, options: ImportCSVOptions = {}): Promise<string[]> {
|
|
263
|
+
return new Promise((resolve, reject) => {
|
|
264
|
+
csvParse.parse(line, {
|
|
265
|
+
delimiter: options.columnSeparator || ',',
|
|
266
|
+
skip_records_with_error: !!options.skipErrors
|
|
267
|
+
}, function (err, out) {
|
|
268
|
+
if (err) {
|
|
269
|
+
reject(err)
|
|
270
|
+
} else {
|
|
271
|
+
resolve(out[0])
|
|
272
|
+
}
|
|
273
|
+
})
|
|
274
|
+
})
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Go through each file and each line and add CSV interpretation of the content to each line.
|
|
279
|
+
* @param state
|
|
280
|
+
* @param options
|
|
281
|
+
* @returns The original state that has been modified by adding CSV parsed field `columns`.
|
|
282
|
+
*/
|
|
283
|
+
async parseCSV(state: ImportStateText<'initial'>, options: ImportCSVOptions = {}): Promise<ImportStateText<'segmented'>> {
|
|
284
|
+
|
|
285
|
+
// Heading names per column.
|
|
286
|
+
let headings: string[] = []
|
|
287
|
+
let dropLines = options.cutFromBeginning || 0
|
|
288
|
+
// Run loop over all files.
|
|
289
|
+
let firstLine = true
|
|
290
|
+
for (const fileName of Object.keys(state.files)) {
|
|
291
|
+
|
|
292
|
+
// Process each line from CSV.
|
|
293
|
+
for (let n = 0; n < state.files[fileName].lines.length; n++) {
|
|
294
|
+
if (dropLines) {
|
|
295
|
+
dropLines--
|
|
296
|
+
continue
|
|
297
|
+
}
|
|
298
|
+
const line: TextFileLine = { ...state.files[fileName].lines[n] }
|
|
299
|
+
const text = options.trimLines ? line.text.trim() : line.text
|
|
300
|
+
|
|
301
|
+
// Collect or define headings on the first line.
|
|
302
|
+
if (firstLine) {
|
|
303
|
+
firstLine = false
|
|
304
|
+
if (options.useFirstLineHeadings) {
|
|
305
|
+
headings = await this.parseCsvLine(text, options)
|
|
306
|
+
const headCount = {}
|
|
307
|
+
for (let i = 0; i < headings.length; i++) {
|
|
308
|
+
headCount[headings[i]] = headCount[headings[i]] || 0
|
|
309
|
+
headCount[headings[i]]++
|
|
310
|
+
if (headCount[headings[i]] > 1) {
|
|
311
|
+
headings[i] = `${headings[i]}${headCount[headings[i]]}`
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
continue
|
|
315
|
+
} else {
|
|
316
|
+
const size = (await this.parseCsvLine(text, options)).length
|
|
317
|
+
for (let i = 0; i < size; i++) {
|
|
318
|
+
headings.push(`${i}`)
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Map each column to its heading name.
|
|
323
|
+
const columns: Record<string, string> = {}
|
|
324
|
+
const pieces = text.trim() !== '' ? await this.parseCsvLine(text, options) : null
|
|
325
|
+
if (pieces) {
|
|
326
|
+
pieces.forEach((column, index) => {
|
|
327
|
+
if (index < headings.length) {
|
|
328
|
+
columns[headings[index]] = column
|
|
329
|
+
} else {
|
|
330
|
+
columns['+'] = columns['+'] || ''
|
|
331
|
+
columns['+'] += column + '\n'
|
|
332
|
+
}
|
|
333
|
+
})
|
|
334
|
+
line.columns = columns
|
|
335
|
+
|
|
336
|
+
// Add it back with columns.
|
|
337
|
+
state.files[fileName].lines[n] = line
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const newState: ImportStateText<'segmented'> = {
|
|
343
|
+
...state as ImportStateText<'initial'>, // We just filled in columns.
|
|
344
|
+
stage: 'segmented'
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return newState
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Handler for pure custom handler.
|
|
352
|
+
*/
|
|
353
|
+
async parseCustom(state: ImportStateText<'initial'>, options: ImportCustomOptions): Promise<ImportStateText<'segmented'>> {
|
|
354
|
+
for (const fileName of Object.keys(state.files)) {
|
|
355
|
+
for (const line of state.files[fileName].lines) {
|
|
356
|
+
line.columns = options.splitToColumns(line.text)
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
const newState: ImportStateText<'segmented'> = {
|
|
361
|
+
...state as ImportStateText<'initial'>, // We just filled in columns.
|
|
362
|
+
stage: 'segmented'
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return newState
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Split a string to fixed length fields given as name and length mapping.
|
|
370
|
+
*/
|
|
371
|
+
parseFixedLength(src: string, offsets: Record<string, number>, conversions: Record<string, (string) => string>) {
|
|
372
|
+
const ret = {}
|
|
373
|
+
const keys = Object.keys(offsets)
|
|
374
|
+
for (let n = 0, i = 0; i < keys.length; i++) {
|
|
375
|
+
const column = src.substring(n, n + offsets[keys[i]])
|
|
376
|
+
ret[keys[i]] = column.trim()
|
|
377
|
+
if (conversions[keys[i]]) {
|
|
378
|
+
ret[keys[i]] = conversions[keys[i]](ret[keys[i]])
|
|
379
|
+
}
|
|
380
|
+
n += offsets[keys[i]]
|
|
381
|
+
}
|
|
382
|
+
return ret
|
|
383
|
+
}
|
|
384
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Asset, AssetType, AssetExchange, AccountNumber, TradeableAsset, StockValueData, Currency, AssetTransfer, BalanceBookkeeping, ProcessConfig, AccountAddress } from '@dataplug/tasenor-common'
|
|
2
|
+
import { ProcessConnector } from '../process'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* An interface definition for linking generic import processor to the Bookkeeper.
|
|
6
|
+
*/
|
|
7
|
+
export interface TransactionImportConnector extends ProcessConnector {
|
|
8
|
+
/**
|
|
9
|
+
* Set the balances at the given time stamp.
|
|
10
|
+
* @param time
|
|
11
|
+
* @param balances
|
|
12
|
+
*/
|
|
13
|
+
initializeBalances(time: Date, balances: BalanceBookkeeping, config: ProcessConfig): Promise<void>
|
|
14
|
+
/**
|
|
15
|
+
* Get the list of accounts that are canditates for holding matching transactions of the given account address.
|
|
16
|
+
* @param asset
|
|
17
|
+
*/
|
|
18
|
+
getAccountCanditates(addr: AccountAddress, config: ProcessConfig): Promise<AccountNumber[]>
|
|
19
|
+
/**
|
|
20
|
+
* Get the preferred default account for the given account address.
|
|
21
|
+
* @param addr
|
|
22
|
+
*/
|
|
23
|
+
getRate(time: Date, type: AssetType, asset: Asset, currency: Currency, exchange: AssetExchange): Promise<number>
|
|
24
|
+
/**
|
|
25
|
+
* Find out how many assets we have at the given time.
|
|
26
|
+
* @param time
|
|
27
|
+
* @param account
|
|
28
|
+
* @param symbol
|
|
29
|
+
*/
|
|
30
|
+
getStock(time: Date, account: AccountNumber, symbol: TradeableAsset): Promise<StockValueData>
|
|
31
|
+
/**
|
|
32
|
+
* Find the VAT value for the transfer if any.
|
|
33
|
+
* @param time
|
|
34
|
+
* @param transfer
|
|
35
|
+
* @param currency
|
|
36
|
+
*/
|
|
37
|
+
getVAT(time: Date, transfer: AssetTransfer, currency: Currency): Promise<null | number>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function isTransactionImportConnector(o: unknown): o is TransactionImportConnector {
|
|
41
|
+
if (typeof o !== 'object' || o === null) {
|
|
42
|
+
return false
|
|
43
|
+
}
|
|
44
|
+
let f = (o as Record<string, unknown>).getRate
|
|
45
|
+
if (typeof f !== 'function') {
|
|
46
|
+
return false
|
|
47
|
+
}
|
|
48
|
+
f = (o as Record<string, unknown>).getStock
|
|
49
|
+
if (typeof f !== 'function') {
|
|
50
|
+
return false
|
|
51
|
+
}
|
|
52
|
+
f = (o as Record<string, unknown>).initializeBalances
|
|
53
|
+
if (typeof f !== 'function') {
|
|
54
|
+
return false
|
|
55
|
+
}
|
|
56
|
+
f = (o as Record<string, unknown>).getAccountCanditates
|
|
57
|
+
if (typeof f !== 'function') {
|
|
58
|
+
return false
|
|
59
|
+
}
|
|
60
|
+
f = (o as Record<string, unknown>).getVAT
|
|
61
|
+
if (typeof f !== 'function') {
|
|
62
|
+
return false
|
|
63
|
+
}
|
|
64
|
+
return true
|
|
65
|
+
}
|