@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.
Files changed (326) hide show
  1. package/.eslintrc.js +4 -0
  2. package/LICENSE +21 -0
  3. package/dist/tasenor-common-node/src/cli.d.ts +81 -0
  4. package/dist/tasenor-common-node/src/cli.js +242 -0
  5. package/dist/tasenor-common-node/src/cli.js.map +1 -0
  6. package/dist/tasenor-common-node/src/commands/account.d.ts +12 -0
  7. package/dist/tasenor-common-node/src/commands/account.js +58 -0
  8. package/dist/tasenor-common-node/src/commands/account.js.map +1 -0
  9. package/dist/tasenor-common-node/src/commands/balance.d.ts +11 -0
  10. package/dist/tasenor-common-node/src/commands/balance.js +117 -0
  11. package/dist/tasenor-common-node/src/commands/balance.js.map +1 -0
  12. package/dist/tasenor-common-node/src/commands/db.d.ts +14 -0
  13. package/dist/tasenor-common-node/src/commands/db.js +69 -0
  14. package/dist/tasenor-common-node/src/commands/db.js.map +1 -0
  15. package/dist/tasenor-common-node/src/commands/entry.d.ts +13 -0
  16. package/dist/tasenor-common-node/src/commands/entry.js +106 -0
  17. package/dist/tasenor-common-node/src/commands/entry.js.map +1 -0
  18. package/dist/tasenor-common-node/src/commands/import.d.ts +17 -0
  19. package/dist/tasenor-common-node/src/commands/import.js +140 -0
  20. package/dist/tasenor-common-node/src/commands/import.js.map +1 -0
  21. package/dist/tasenor-common-node/src/commands/importer.d.ts +13 -0
  22. package/dist/tasenor-common-node/src/commands/importer.js +71 -0
  23. package/dist/tasenor-common-node/src/commands/importer.js.map +1 -0
  24. package/dist/tasenor-common-node/src/commands/index.d.ts +191 -0
  25. package/dist/tasenor-common-node/src/commands/index.js +482 -0
  26. package/dist/tasenor-common-node/src/commands/index.js.map +1 -0
  27. package/dist/tasenor-common-node/src/commands/period.d.ts +12 -0
  28. package/dist/tasenor-common-node/src/commands/period.js +48 -0
  29. package/dist/tasenor-common-node/src/commands/period.js.map +1 -0
  30. package/dist/tasenor-common-node/src/commands/plugin.d.ts +15 -0
  31. package/dist/tasenor-common-node/src/commands/plugin.js +78 -0
  32. package/dist/tasenor-common-node/src/commands/plugin.js.map +1 -0
  33. package/dist/tasenor-common-node/src/commands/report.d.ts +11 -0
  34. package/dist/tasenor-common-node/src/commands/report.js +96 -0
  35. package/dist/tasenor-common-node/src/commands/report.js.map +1 -0
  36. package/dist/tasenor-common-node/src/commands/settings.d.ts +10 -0
  37. package/dist/tasenor-common-node/src/commands/settings.js +64 -0
  38. package/dist/tasenor-common-node/src/commands/settings.js.map +1 -0
  39. package/dist/tasenor-common-node/src/commands/stock.d.ts +8 -0
  40. package/dist/tasenor-common-node/src/commands/stock.js +73 -0
  41. package/dist/tasenor-common-node/src/commands/stock.js.map +1 -0
  42. package/dist/tasenor-common-node/src/commands/tag.d.ts +13 -0
  43. package/dist/tasenor-common-node/src/commands/tag.js +89 -0
  44. package/dist/tasenor-common-node/src/commands/tag.js.map +1 -0
  45. package/dist/tasenor-common-node/src/commands/tx.d.ts +12 -0
  46. package/dist/tasenor-common-node/src/commands/tx.js +81 -0
  47. package/dist/tasenor-common-node/src/commands/tx.js.map +1 -0
  48. package/dist/tasenor-common-node/src/commands/user.d.ts +12 -0
  49. package/dist/tasenor-common-node/src/commands/user.js +52 -0
  50. package/dist/tasenor-common-node/src/commands/user.js.map +1 -0
  51. package/dist/tasenor-common-node/src/database/BookkeeperImporter.d.ts +77 -0
  52. package/dist/tasenor-common-node/src/database/BookkeeperImporter.js +343 -0
  53. package/dist/tasenor-common-node/src/database/BookkeeperImporter.js.map +1 -0
  54. package/dist/tasenor-common-node/src/database/DB.d.ts +51 -0
  55. package/dist/tasenor-common-node/src/database/DB.js +354 -0
  56. package/dist/tasenor-common-node/src/database/DB.js.map +1 -0
  57. package/dist/tasenor-common-node/src/database/index.d.ts +7 -0
  58. package/dist/tasenor-common-node/src/database/index.js +8 -0
  59. package/dist/tasenor-common-node/src/database/index.js.map +1 -0
  60. package/dist/tasenor-common-node/src/doccer.d.ts +29 -0
  61. package/dist/tasenor-common-node/src/doccer.js +30 -0
  62. package/dist/tasenor-common-node/src/doccer.js.map +1 -0
  63. package/dist/tasenor-common-node/src/error.d.ts +30 -0
  64. package/dist/tasenor-common-node/src/error.js +35 -0
  65. package/dist/tasenor-common-node/src/error.js.map +1 -0
  66. package/dist/tasenor-common-node/src/export/Exporter.d.ts +69 -0
  67. package/dist/tasenor-common-node/src/export/Exporter.js +123 -0
  68. package/dist/tasenor-common-node/src/export/Exporter.js.map +1 -0
  69. package/dist/tasenor-common-node/src/export/TasenorExporter.d.ts +55 -0
  70. package/dist/tasenor-common-node/src/export/TasenorExporter.js +135 -0
  71. package/dist/tasenor-common-node/src/export/TasenorExporter.js.map +1 -0
  72. package/dist/tasenor-common-node/src/export/TilitinExporter.d.ts +71 -0
  73. package/dist/tasenor-common-node/src/export/TilitinExporter.js +290 -0
  74. package/dist/tasenor-common-node/src/export/TilitinExporter.js.map +1 -0
  75. package/dist/tasenor-common-node/src/export/index.d.ts +8 -0
  76. package/dist/tasenor-common-node/src/export/index.js +9 -0
  77. package/dist/tasenor-common-node/src/export/index.js.map +1 -0
  78. package/dist/tasenor-common-node/src/import/TextFileProcessHandler.d.ts +104 -0
  79. package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js +354 -0
  80. package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js.map +1 -0
  81. package/dist/tasenor-common-node/src/import/TransactionImportConnector.d.ts +38 -0
  82. package/dist/tasenor-common-node/src/import/TransactionImportConnector.js +27 -0
  83. package/dist/tasenor-common-node/src/import/TransactionImportConnector.js.map +1 -0
  84. package/dist/tasenor-common-node/src/import/TransactionImportHandler.d.ts +173 -0
  85. package/dist/tasenor-common-node/src/import/TransactionImportHandler.js +733 -0
  86. package/dist/tasenor-common-node/src/import/TransactionImportHandler.js.map +1 -0
  87. package/dist/tasenor-common-node/src/import/TransactionRules.d.ts +238 -0
  88. package/dist/tasenor-common-node/src/import/TransactionRules.js +522 -0
  89. package/dist/tasenor-common-node/src/import/TransactionRules.js.map +1 -0
  90. package/dist/tasenor-common-node/src/import/TransactionUI.d.ts +181 -0
  91. package/dist/tasenor-common-node/src/import/TransactionUI.js +482 -0
  92. package/dist/tasenor-common-node/src/import/TransactionUI.js.map +1 -0
  93. package/dist/tasenor-common-node/src/import/TransferAnalyzer.d.ts +324 -0
  94. package/dist/tasenor-common-node/src/import/TransferAnalyzer.js +1379 -0
  95. package/dist/tasenor-common-node/src/import/TransferAnalyzer.js.map +1 -0
  96. package/dist/tasenor-common-node/src/import/index.d.ts +11 -0
  97. package/dist/tasenor-common-node/src/import/index.js +12 -0
  98. package/dist/tasenor-common-node/src/import/index.js.map +1 -0
  99. package/dist/tasenor-common-node/src/index.d.ts +12 -0
  100. package/dist/tasenor-common-node/src/index.js +13 -0
  101. package/dist/tasenor-common-node/src/index.js.map +1 -0
  102. package/dist/tasenor-common-node/src/net/crypto.d.ts +33 -0
  103. package/dist/tasenor-common-node/src/net/crypto.js +63 -0
  104. package/dist/tasenor-common-node/src/net/crypto.js.map +1 -0
  105. package/dist/tasenor-common-node/src/net/git.d.ts +49 -0
  106. package/dist/tasenor-common-node/src/net/git.js +137 -0
  107. package/dist/tasenor-common-node/src/net/git.js.map +1 -0
  108. package/dist/tasenor-common-node/src/net/index.d.ts +10 -0
  109. package/dist/tasenor-common-node/src/net/index.js +11 -0
  110. package/dist/tasenor-common-node/src/net/index.js.map +1 -0
  111. package/dist/tasenor-common-node/src/net/middleware.d.ts +61 -0
  112. package/dist/tasenor-common-node/src/net/middleware.js +220 -0
  113. package/dist/tasenor-common-node/src/net/middleware.js.map +1 -0
  114. package/dist/tasenor-common-node/src/net/tokens.d.ts +50 -0
  115. package/dist/tasenor-common-node/src/net/tokens.js +141 -0
  116. package/dist/tasenor-common-node/src/net/tokens.js.map +1 -0
  117. package/dist/tasenor-common-node/src/net/vault.d.ts +67 -0
  118. package/dist/tasenor-common-node/src/net/vault.js +145 -0
  119. package/dist/tasenor-common-node/src/net/vault.js.map +1 -0
  120. package/dist/tasenor-common-node/src/plugins/BackendPlugin.d.ts +91 -0
  121. package/dist/tasenor-common-node/src/plugins/BackendPlugin.js +165 -0
  122. package/dist/tasenor-common-node/src/plugins/BackendPlugin.js.map +1 -0
  123. package/dist/tasenor-common-node/src/plugins/DataPlugin.d.ts +13 -0
  124. package/dist/tasenor-common-node/src/plugins/DataPlugin.js +26 -0
  125. package/dist/tasenor-common-node/src/plugins/DataPlugin.js.map +1 -0
  126. package/dist/tasenor-common-node/src/plugins/ImportPlugin.d.ts +188 -0
  127. package/dist/tasenor-common-node/src/plugins/ImportPlugin.js +204 -0
  128. package/dist/tasenor-common-node/src/plugins/ImportPlugin.js.map +1 -0
  129. package/dist/tasenor-common-node/src/plugins/ReportPlugin.d.ts +132 -0
  130. package/dist/tasenor-common-node/src/plugins/ReportPlugin.js +393 -0
  131. package/dist/tasenor-common-node/src/plugins/ReportPlugin.js.map +1 -0
  132. package/dist/tasenor-common-node/src/plugins/SchemePlugin.d.ts +34 -0
  133. package/dist/tasenor-common-node/src/plugins/SchemePlugin.js +47 -0
  134. package/dist/tasenor-common-node/src/plugins/SchemePlugin.js.map +1 -0
  135. package/dist/tasenor-common-node/src/plugins/ServicePlugin.d.ts +80 -0
  136. package/dist/tasenor-common-node/src/plugins/ServicePlugin.js +168 -0
  137. package/dist/tasenor-common-node/src/plugins/ServicePlugin.js.map +1 -0
  138. package/dist/tasenor-common-node/src/plugins/ToolPlugin.d.ts +27 -0
  139. package/dist/tasenor-common-node/src/plugins/ToolPlugin.js +37 -0
  140. package/dist/tasenor-common-node/src/plugins/ToolPlugin.js.map +1 -0
  141. package/dist/tasenor-common-node/src/plugins/index.d.ts +13 -0
  142. package/dist/tasenor-common-node/src/plugins/index.js +14 -0
  143. package/dist/tasenor-common-node/src/plugins/index.js.map +1 -0
  144. package/dist/tasenor-common-node/src/plugins/plugins.d.ts +101 -0
  145. package/dist/tasenor-common-node/src/plugins/plugins.js +292 -0
  146. package/dist/tasenor-common-node/src/plugins/plugins.js.map +1 -0
  147. package/dist/tasenor-common-node/src/process/Process.d.ts +108 -0
  148. package/dist/tasenor-common-node/src/process/Process.js +335 -0
  149. package/dist/tasenor-common-node/src/process/Process.js.map +1 -0
  150. package/dist/tasenor-common-node/src/process/ProcessConnector.d.ts +24 -0
  151. package/dist/tasenor-common-node/src/process/ProcessConnector.js +28 -0
  152. package/dist/tasenor-common-node/src/process/ProcessConnector.js.map +1 -0
  153. package/dist/tasenor-common-node/src/process/ProcessFile.d.ts +69 -0
  154. package/dist/tasenor-common-node/src/process/ProcessFile.js +145 -0
  155. package/dist/tasenor-common-node/src/process/ProcessFile.js.map +1 -0
  156. package/dist/tasenor-common-node/src/process/ProcessHandler.d.ts +60 -0
  157. package/dist/tasenor-common-node/src/process/ProcessHandler.js +73 -0
  158. package/dist/tasenor-common-node/src/process/ProcessHandler.js.map +1 -0
  159. package/dist/tasenor-common-node/src/process/ProcessStep.d.ts +52 -0
  160. package/dist/tasenor-common-node/src/process/ProcessStep.js +78 -0
  161. package/dist/tasenor-common-node/src/process/ProcessStep.js.map +1 -0
  162. package/dist/tasenor-common-node/src/process/ProcessingSystem.d.ts +60 -0
  163. package/dist/tasenor-common-node/src/process/ProcessingSystem.js +182 -0
  164. package/dist/tasenor-common-node/src/process/ProcessingSystem.js.map +1 -0
  165. package/dist/tasenor-common-node/src/process/index.d.ts +11 -0
  166. package/dist/tasenor-common-node/src/process/index.js +12 -0
  167. package/dist/tasenor-common-node/src/process/index.js.map +1 -0
  168. package/dist/tasenor-common-node/src/reports/conversions.d.ts +8 -0
  169. package/dist/tasenor-common-node/src/reports/conversions.js +47 -0
  170. package/dist/tasenor-common-node/src/reports/conversions.js.map +1 -0
  171. package/dist/tasenor-common-node/src/reports/index.d.ts +6 -0
  172. package/dist/tasenor-common-node/src/reports/index.js +7 -0
  173. package/dist/tasenor-common-node/src/reports/index.js.map +1 -0
  174. package/dist/tasenor-common-node/src/server/ISPDemoServer.d.ts +43 -0
  175. package/dist/tasenor-common-node/src/server/ISPDemoServer.js +112 -0
  176. package/dist/tasenor-common-node/src/server/ISPDemoServer.js.map +1 -0
  177. package/dist/tasenor-common-node/src/server/api.d.ts +15 -0
  178. package/dist/tasenor-common-node/src/server/api.js +27 -0
  179. package/dist/tasenor-common-node/src/server/api.js.map +1 -0
  180. package/dist/tasenor-common-node/src/server/index.d.ts +7 -0
  181. package/dist/tasenor-common-node/src/server/index.js +8 -0
  182. package/dist/tasenor-common-node/src/server/index.js.map +1 -0
  183. package/dist/tasenor-common-node/src/server/router.d.ts +5 -0
  184. package/dist/tasenor-common-node/src/server/router.js +37 -0
  185. package/dist/tasenor-common-node/src/server/router.js.map +1 -0
  186. package/dist/tasenor-common-node/src/system.d.ts +27 -0
  187. package/dist/tasenor-common-node/src/system.js +95 -0
  188. package/dist/tasenor-common-node/src/system.js.map +1 -0
  189. package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.d.ts +21 -0
  190. package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js +33 -0
  191. package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js.map +1 -0
  192. package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.d.ts +24 -0
  193. package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js +68 -0
  194. package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js.map +1 -0
  195. package/dist/tasenor-common-node/src/testing/UnitTester.d.ts +64 -0
  196. package/dist/tasenor-common-node/src/testing/UnitTester.js +199 -0
  197. package/dist/tasenor-common-node/src/testing/UnitTester.js.map +1 -0
  198. package/dist/tasenor-common-node/src/testing/index.d.ts +4 -0
  199. package/dist/tasenor-common-node/src/testing/index.js +5 -0
  200. package/dist/tasenor-common-node/src/testing/index.js.map +1 -0
  201. package/dist/tasenor-common-node/src/testing/test-handlers.d.ts +13 -0
  202. package/dist/tasenor-common-node/src/testing/test-handlers.js +52 -0
  203. package/dist/tasenor-common-node/src/testing/test-handlers.js.map +1 -0
  204. package/dist/tasenor-common-node/tests/TransactionRules.spec.d.ts +1 -0
  205. package/dist/tasenor-common-node/tests/TransactionRules.spec.js +64 -0
  206. package/dist/tasenor-common-node/tests/TransactionRules.spec.js.map +1 -0
  207. package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.d.ts +1 -0
  208. package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js +80 -0
  209. package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js.map +1 -0
  210. package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.d.ts +1 -0
  211. package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js +342 -0
  212. package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js.map +1 -0
  213. package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.d.ts +1 -0
  214. package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js +174 -0
  215. package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js.map +1 -0
  216. package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.d.ts +1 -0
  217. package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js +175 -0
  218. package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js.map +1 -0
  219. package/dist/tasenor-common-node/tests/password.spec.d.ts +1 -0
  220. package/dist/tasenor-common-node/tests/password.spec.js +8 -0
  221. package/dist/tasenor-common-node/tests/password.spec.js.map +1 -0
  222. package/dist/tasenor-common-node/tests/tokens.spec.d.ts +1 -0
  223. package/dist/tasenor-common-node/tests/tokens.spec.js +49 -0
  224. package/dist/tasenor-common-node/tests/tokens.spec.js.map +1 -0
  225. package/dist/tasenor-common-node/tests/vault.spec.d.ts +1 -0
  226. package/dist/tasenor-common-node/tests/vault.spec.js +19 -0
  227. package/dist/tasenor-common-node/tests/vault.spec.js.map +1 -0
  228. package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.d.ts +11 -0
  229. package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js +30 -0
  230. package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js.map +1 -0
  231. package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.d.ts +5 -0
  232. package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js +350 -0
  233. package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js.map +1 -0
  234. package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.d.ts +23 -0
  235. package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js +83 -0
  236. package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js.map +1 -0
  237. package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.d.ts +28 -0
  238. package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js +340 -0
  239. package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js.map +1 -0
  240. package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.d.ts +11 -0
  241. package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js +39 -0
  242. package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js.map +1 -0
  243. package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.d.ts +17 -0
  244. package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js +66 -0
  245. package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js.map +1 -0
  246. package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.d.ts +13 -0
  247. package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js +241 -0
  248. package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js.map +1 -0
  249. package/jest.config.js +1 -0
  250. package/package.json +62 -0
  251. package/src/cli.ts +267 -0
  252. package/src/commands/account.ts +69 -0
  253. package/src/commands/balance.ts +131 -0
  254. package/src/commands/db.ts +84 -0
  255. package/src/commands/entry.ts +117 -0
  256. package/src/commands/import.ts +160 -0
  257. package/src/commands/importer.ts +84 -0
  258. package/src/commands/index.ts +534 -0
  259. package/src/commands/period.ts +59 -0
  260. package/src/commands/plugin.ts +95 -0
  261. package/src/commands/report.ts +113 -0
  262. package/src/commands/settings.ts +75 -0
  263. package/src/commands/stock.ts +80 -0
  264. package/src/commands/tag.ts +102 -0
  265. package/src/commands/tx.ts +93 -0
  266. package/src/commands/user.ts +65 -0
  267. package/src/database/BookkeeperImporter.ts +358 -0
  268. package/src/database/DB.ts +396 -0
  269. package/src/database/index.ts +7 -0
  270. package/src/doccer.ts +29 -0
  271. package/src/error.ts +32 -0
  272. package/src/export/Exporter.ts +136 -0
  273. package/src/export/TasenorExporter.ts +144 -0
  274. package/src/export/TilitinExporter.ts +302 -0
  275. package/src/export/index.ts +8 -0
  276. package/src/import/TextFileProcessHandler.ts +384 -0
  277. package/src/import/TransactionImportConnector.ts +65 -0
  278. package/src/import/TransactionImportHandler.ts +819 -0
  279. package/src/import/TransactionRules.ts +570 -0
  280. package/src/import/TransactionUI.ts +520 -0
  281. package/src/import/TransferAnalyzer.ts +1450 -0
  282. package/src/import/index.ts +11 -0
  283. package/src/index.ts +12 -0
  284. package/src/net/crypto.ts +69 -0
  285. package/src/net/git.ts +151 -0
  286. package/src/net/index.ts +10 -0
  287. package/src/net/middleware.ts +261 -0
  288. package/src/net/tokens.ts +140 -0
  289. package/src/net/vault.ts +161 -0
  290. package/src/plugins/BackendPlugin.ts +188 -0
  291. package/src/plugins/DataPlugin.ts +29 -0
  292. package/src/plugins/ImportPlugin.ts +211 -0
  293. package/src/plugins/ReportPlugin.ts +443 -0
  294. package/src/plugins/SchemePlugin.ts +56 -0
  295. package/src/plugins/ServicePlugin.ts +188 -0
  296. package/src/plugins/ToolPlugin.ts +44 -0
  297. package/src/plugins/index.ts +13 -0
  298. package/src/plugins/plugins.ts +345 -0
  299. package/src/process/Process.ts +368 -0
  300. package/src/process/ProcessConnector.ts +45 -0
  301. package/src/process/ProcessFile.ts +169 -0
  302. package/src/process/ProcessHandler.ts +94 -0
  303. package/src/process/ProcessStep.ts +100 -0
  304. package/src/process/ProcessingSystem.ts +202 -0
  305. package/src/process/index.ts +11 -0
  306. package/src/reports/conversions.ts +52 -0
  307. package/src/reports/index.ts +6 -0
  308. package/src/server/ISPDemoServer.ts +122 -0
  309. package/src/server/api.ts +37 -0
  310. package/src/server/index.ts +7 -0
  311. package/src/server/router.ts +60 -0
  312. package/src/system.ts +96 -0
  313. package/src/testing/ProcessingSystemMock.ts +45 -0
  314. package/src/testing/UnitTestImportConnector.ts +86 -0
  315. package/src/testing/UnitTester.ts +231 -0
  316. package/src/testing/index.ts +4 -0
  317. package/src/testing/test-handlers.ts +55 -0
  318. package/tests/TransactionRules.spec.ts +73 -0
  319. package/tests/TransferAnalyzer-account-address.spec.ts +87 -0
  320. package/tests/TransferAnalyzer-buying-and-selling.spec.ts +354 -0
  321. package/tests/TransferAnalyzer-loans.spec.ts +197 -0
  322. package/tests/TransferAnalyzer-multiple-null-amounts.spec.ts +181 -0
  323. package/tests/password.spec.ts +8 -0
  324. package/tests/tokens.spec.ts +52 -0
  325. package/tests/vault.spec.ts +20 -0
  326. 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
+ }