@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,45 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import { ID, ProcessConfig, ProcessName } from '@dataplug/tasenor-common'
3
+ import { UnitTestImportConnector } from './UnitTestImportConnector'
4
+ import { KnexDatabase, Process, ProcessConnector, ProcessFile, ProcessFileData, ProcessHandler, ProcessHandlerMap, ProcessStep } from '..'
5
+
6
+ /**
7
+ * Processing system mock for unit testing.
8
+ */
9
+ export class SystemMock {
10
+ db: KnexDatabase
11
+ handlers: ProcessHandlerMap = {}
12
+ connector: ProcessConnector
13
+ logger: {
14
+ info: (...msg) => void
15
+ error: (...msg) => void
16
+ }
17
+
18
+ constructor() {
19
+ this.connector = new UnitTestImportConnector()
20
+ }
21
+
22
+ async getTranslation(text: string, language: string): Promise<string> {
23
+ return this.connector.getTranslation(text, language)
24
+ }
25
+
26
+ register(handler: ProcessHandler): void {
27
+ //
28
+ }
29
+
30
+ async createProcess(name: ProcessName, filed: ProcessFileData[], config: ProcessConfig): Promise<Process> {
31
+ return new Process(this, name, config)
32
+ }
33
+
34
+ async checkFinishAndFindDirections(handler: ProcessHandler, step: ProcessStep): Promise<void> {
35
+ //
36
+ }
37
+
38
+ getHandler(name: string): ProcessHandler {
39
+ return this.handlers[name]
40
+ }
41
+
42
+ async loadProcess(id: ID): Promise<Process> {
43
+ return this.createProcess('dummy', [new ProcessFile({ name: 'file', encoding: 'utf-8', data: 'Hello' })], {})
44
+ }
45
+ }
@@ -0,0 +1,86 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import { AccountAddress, AccountNumber, Asset, AssetExchange, AssetTransfer, AssetType, BalanceBookkeeping, Currency, Language, StockValueData, TradeableAsset, ImportState, ProcessConfig, Directions, ID } from '@dataplug/tasenor-common'
3
+ import { ImportPlugin, TransactionImportConnector, TransactionImportHandler, ISPDemoServer } from '..'
4
+ import { CoinbaseHandler } from '../../../tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler'
5
+ import IncomeAndExpenses from '../../../tasenor-common-plugins/src/IncomeAndExpenses/backend'
6
+
7
+ /**
8
+ * A connector mock for unit testing.
9
+ */
10
+ export class UnitTestImportConnector implements TransactionImportConnector {
11
+
12
+ private balance: Record<AccountNumber, number> = {}
13
+ private number: Record<AccountAddress, AccountNumber> = {}
14
+
15
+ async initialize(server: ISPDemoServer) {
16
+ //
17
+ }
18
+
19
+ addMoney(address: AccountAddress, number: AccountNumber, amount: number) {
20
+ this.balance[address] = (this.balance[address] || 0) + amount
21
+ this.number[address] = number
22
+ }
23
+
24
+ async initializeBalances(time: Date, balances: BalanceBookkeeping, config: ProcessConfig): Promise<void> {
25
+ balances.configureNames(config)
26
+ Object.keys(this.balance).forEach(address => balances.set(this.number[address], this.balance[address]))
27
+ }
28
+
29
+ async getAccountCanditates(): Promise<AccountNumber[]> {
30
+ return []
31
+ }
32
+
33
+ async getStock(time: Date, account: AccountNumber, symbol: TradeableAsset): Promise<StockValueData> {
34
+ return {
35
+ amount: 0,
36
+ value: 0
37
+ }
38
+ }
39
+
40
+ async getVAT(time: Date, transfer: AssetTransfer, currency: Currency): Promise<null | number> {
41
+ return null
42
+ }
43
+
44
+ async getRate(time: Date, type: AssetType, asset: Asset, currency: Currency, exchange: AssetExchange|null = null): Promise<number> {
45
+ return 1.0
46
+ }
47
+
48
+ async getTranslation(text: string, language: string): Promise<string> {
49
+ // Borrow a plugins to get some translations.
50
+ const plugin = new ImportPlugin(new CoinbaseHandler() as unknown as TransactionImportHandler)
51
+ const ret = plugin.t(text, language as Language)
52
+ if (ret !== text) {
53
+ return ret
54
+ }
55
+ const IEplugin = new IncomeAndExpenses()
56
+ return IEplugin.t(text, language as Language)
57
+ }
58
+
59
+ async applyResult(): Promise<Record<string, unknown>> {
60
+ return {}
61
+ }
62
+
63
+ async resultExists(processId: ID, args: unknown): Promise<boolean> {
64
+ return false
65
+ }
66
+
67
+ async success(res: ImportState) {
68
+ //
69
+ }
70
+
71
+ async fail(res: ImportState) {
72
+ //
73
+ }
74
+
75
+ async waiting(res: ImportState, directions: Directions) {
76
+ //
77
+ }
78
+
79
+ async run(): Promise<void> {
80
+ //
81
+ }
82
+
83
+ async rollback(processId: ID): Promise<boolean> {
84
+ return true
85
+ }
86
+ }
@@ -0,0 +1,231 @@
1
+ import { AccountAddress, AccountNumber, AdditionalTransferInfo, AssetTransfer, StockValueData, Transaction, TransactionDescription, TransactionLine, ImportStateText, ImportConfig } from '@dataplug/tasenor-common'
2
+ import { TransactionImportHandler, AskUI, Process } from '..'
3
+ import { getTestHandler } from './test-handlers'
4
+ import { SystemMock } from './ProcessingSystemMock'
5
+ import { sprintf } from 'sprintf-js'
6
+ import { UnitTestImportConnector } from './UnitTestImportConnector'
7
+
8
+ /**
9
+ * Helper types to reduce type forcing in simple test data.
10
+ */
11
+ export type AssetTransferTestData = Omit<Omit<AssetTransfer, 'asset'>, 'amount'> & { asset: string, amount?: number | undefined | null }
12
+
13
+ export type AdditionalTransferInfoTestData = Omit<AdditionalTransferInfo, 'stock'> & {
14
+ stock?: {
15
+ set?: Partial<Record<string, StockValueData>>
16
+ change?: Partial<Record<string, StockValueData>>
17
+ }
18
+ }
19
+
20
+ export type TransactionLineTestData = Omit<Omit<TransactionLine, 'data'>, 'account'> & {
21
+ account: string
22
+ data?: AdditionalTransferInfoTestData
23
+ }
24
+
25
+ /**
26
+ * A container for setting up testing system.
27
+ */
28
+ export class UnitTester {
29
+
30
+ static accounts: string[] = [
31
+ 'deposit.external.EUR',
32
+ 'deposit.currency.EUR',
33
+ 'expense.statement.TRADE_LOSS_STOCK',
34
+ 'fee.currency.EUR',
35
+ 'fee.currency.USD',
36
+ 'income.statement.TRADE_PROFIT_CRYPTO',
37
+ 'income.statement.TRADE_PROFIT_SHORT',
38
+ 'trade.crypto.ETH',
39
+ 'trade.currency.EUR',
40
+ 'trade.currency.USD',
41
+ 'trade.short.NAKD',
42
+ 'trade.stock.NAKD',
43
+ ]
44
+
45
+ accountNumber: Record<string, string> = {}
46
+ accountName: Record<string, string> = {}
47
+ config: ImportConfig
48
+ handler: TransactionImportHandler
49
+ process: Process
50
+
51
+ constructor(conf: Record<string, unknown> = {}) {
52
+ this.config = {
53
+ currency: 'EUR',
54
+ language: 'en',
55
+ isTradeFeePartOfTotal: false,
56
+ allowShortSelling: false,
57
+ recordDeposits: true,
58
+ rules: []
59
+ }
60
+ Object.assign(this.config, conf)
61
+ let number = 1000
62
+ this.accountName = {}
63
+ this.accountNumber = {}
64
+ for (const name of UnitTester.accounts) {
65
+ this.config[`account.${name}`] = `${number}`
66
+ this.accountName[`${number}`] = name
67
+ this.accountNumber[name] = `${number}`
68
+ number += 10
69
+ }
70
+ this.handler = getTestHandler('Coinbase')
71
+ this.handler.system = new SystemMock()
72
+ this.process = new Process(this.handler.system, 'Unit test', this.config)
73
+ }
74
+
75
+ /**
76
+ * Set the configuration value. Also add mapping if account.
77
+ * @param name
78
+ * @param value
79
+ */
80
+ set(name, value) {
81
+ this.config[name] = value
82
+ if (name.startsWith('account.')) {
83
+ if (this.accountName[value]) {
84
+ throw new Error(`Account number ${value} already exists. Please choose some other for ${name}.`)
85
+ }
86
+ this.accountName[value] = name.substr(8)
87
+ this.accountNumber[name.substr(8)] = value
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Add an answer to the answer collection.
93
+ */
94
+ answer(segment, name, value) {
95
+ this.config.answers = this.config.answers || {}
96
+ if (this.config.answers) {
97
+ this.config.answers[segment] = this.config.answers[segment] || {};
98
+ (this.config.answers[segment] as Record<string, unknown>)[name] = value
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Get the account balance.
104
+ * @param name
105
+ */
106
+ get(addr): number {
107
+ const number = this.accountNumber[addr]
108
+ if (!number) {
109
+ throw new Error(`Invalid account name ${addr}.`)
110
+ }
111
+ return this.handler.getBalance(addr)
112
+ }
113
+
114
+ /**
115
+ * Add to the initial balance.
116
+ * @param accunt
117
+ * @param amount
118
+ */
119
+ addMoney(account: string, amount: number) {
120
+ if (!this.accountNumber[`${account}`]) {
121
+ throw new Error(`Account ${account} not defined in UnitTester class.`)
122
+ }
123
+ (this.handler.system.connector as UnitTestImportConnector).addMoney(account as AccountAddress, this.accountNumber[`${account}`] as AccountNumber, amount)
124
+ }
125
+
126
+ /**
127
+ * Construct a state for transfers.
128
+ * @param transfers
129
+ */
130
+ makeState(transferSets: AssetTransfer[][]): ImportStateText<'classified'> {
131
+ const state: ImportStateText<'classified'> = {
132
+ stage: 'classified',
133
+ files: {
134
+ 'test.csv': {
135
+ lines: []
136
+ }
137
+ }
138
+ }
139
+
140
+ state.segments = {}
141
+ state.result = {}
142
+
143
+ for (let i = 0; i < transferSets.length; i++) {
144
+ const id = `segment${i}`
145
+ state.segments[id] = {
146
+ id,
147
+ time: new Date(`2022-01-01T00:00:${sprintf('%02d', i)}.000Z`),
148
+ lines: []
149
+ }
150
+ state.result[id] = [{
151
+ type: 'transfers',
152
+ transfers: transferSets[i]
153
+ }]
154
+ }
155
+
156
+ return state
157
+ }
158
+
159
+ /**
160
+ * Execute one or more transfer analysis.
161
+ * @param transfers
162
+ * @param entries
163
+ * @returns
164
+ */
165
+ async test(transfers: AssetTransferTestData[], entries: TransactionLineTestData[][],
166
+ transfers2: AssetTransferTestData[] | undefined = undefined, entries2: TransactionLineTestData[][] | undefined = undefined,
167
+ transfers3: AssetTransferTestData[] | undefined = undefined, entries3: TransactionLineTestData[][] | undefined = undefined,
168
+ transfers4: AssetTransferTestData[] | undefined = undefined, entries4: TransactionLineTestData[][] | undefined = undefined,
169
+ transfers5: AssetTransferTestData[] | undefined = undefined, entries5: TransactionLineTestData[][] | undefined = undefined
170
+ ) {
171
+ const transfersSets: AssetTransfer[][] = [transfers as AssetTransfer[]]
172
+ const entriesSet: TransactionLine[][][] = [entries as TransactionLine[][]]
173
+ if (transfers2) transfersSets.push(transfers2 as AssetTransfer[])
174
+ if (transfers3) transfersSets.push(transfers3 as AssetTransfer[])
175
+ if (transfers4) transfersSets.push(transfers4 as AssetTransfer[])
176
+ if (transfers5) transfersSets.push(transfers5 as AssetTransfer[])
177
+ if (entries2) entriesSet.push(entries2 as TransactionLine[][])
178
+ if (entries3) entriesSet.push(entries3 as TransactionLine[][])
179
+ if (entries4) entriesSet.push(entries4 as TransactionLine[][])
180
+ if (entries5) entriesSet.push(entries5 as TransactionLine[][])
181
+
182
+ const state = this.makeState(transfersSets)
183
+ // Check just for compiler.
184
+ if (!state.result || !state.segments) {
185
+ return
186
+ }
187
+
188
+ let out
189
+ try {
190
+ out = await this.handler.analysis(this.process, state, [], this.config)
191
+ } catch (err) {
192
+ if (err instanceof AskUI) {
193
+ console.log('\u001b[31mTest incomplete. Need more configuration.\u001b[0m')
194
+ console.dir(err.element, { depth: null })
195
+ }
196
+ throw err
197
+ }
198
+
199
+ if (!out.result) {
200
+ throw new Error(`Analyse failed to get results from ${JSON.stringify(state)}.`)
201
+ }
202
+
203
+ for (let i = 0; i < entriesSet.length; i++) {
204
+ const id = `segment${i}`
205
+ if (!out.result[id]) {
206
+ throw new Error(`Analyse failed to get results from ${JSON.stringify(state)}.`)
207
+ }
208
+ // Convert accounts to symbolic to make test writing easier.
209
+ for (const data of out.result[id] as TransactionDescription[]) {
210
+ if (data.transactions) {
211
+ for (const tx of data.transactions) {
212
+ for (const entry of tx.entries) {
213
+ if (this.accountName[entry.account]) {
214
+ entry.account = this.accountName[entry.account] as AccountNumber
215
+ }
216
+ }
217
+ }
218
+ }
219
+ }
220
+ // Verify results.
221
+ const result: Transaction[] = entriesSet[i].map(entries => ({
222
+ date: new Date(`2022-01-01T00:00:${sprintf('%02d', i)}.000Z`),
223
+ segmentId: id,
224
+ entries
225
+ }))
226
+
227
+ const { expect } = await import('@jest/globals')
228
+ expect(result).toStrictEqual(out.result[id][0].transactions)
229
+ }
230
+ }
231
+ }
@@ -0,0 +1,4 @@
1
+ export * from './ProcessingSystemMock'
2
+ export * from './test-handlers'
3
+ export * from './UnitTester'
4
+ export * from './UnitTestImportConnector'
@@ -0,0 +1,55 @@
1
+ import path from 'path'
2
+ import { CoinbaseHandler } from '../../../tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler'
3
+ import { KrakenHandler } from '../../../tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler'
4
+ import { LynxHandler } from '../../../tasenor-common-plugins/src/LynxImport/backend/LynxHandler'
5
+ import { NordeaHandler } from '../../../tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler'
6
+ import { NordnetHandler } from '../../../tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler'
7
+ import { TITOHandler } from '../../../tasenor-common-plugins/src/TITOImport/backend/TITOHandler'
8
+ import { TransactionImportHandler } from '..'
9
+
10
+ /**
11
+ * Mapping from handler class names to instances.
12
+ */
13
+ const handlers: Record<string, TransactionImportHandler> = {
14
+ // Typescript commonly screws up, if there are slight version differencies. Force type.
15
+ Coinbase: new CoinbaseHandler() as unknown as TransactionImportHandler,
16
+ Nordea: new NordeaHandler() as unknown as TransactionImportHandler,
17
+ 'Nordnet-Megalo': new NordnetHandler() as unknown as TransactionImportHandler,
18
+ 'Nordnet-Hilunki': new NordnetHandler() as unknown as TransactionImportHandler,
19
+ Lynx: new LynxHandler() as unknown as TransactionImportHandler,
20
+ Kraken: new KrakenHandler() as unknown as TransactionImportHandler,
21
+ TITO: new TITOHandler() as unknown as TransactionImportHandler,
22
+ }
23
+
24
+ /**
25
+ * Get a handler instance for testing.
26
+ * @param name
27
+ * @returns
28
+ */
29
+ export function getTestHandler(className: string): TransactionImportHandler {
30
+ if (!handlers[className]) {
31
+ throw new Error(`No such import handler as '${className}'.`)
32
+ }
33
+ return handlers[className]
34
+ }
35
+
36
+ /**
37
+ * Get handler path.
38
+ * @param className
39
+ * @returns
40
+ */
41
+ export function getTestHandlerPath(className: string): string {
42
+ const handlerDirs: Record<string, string> = {
43
+ Coinbase: 'src/CoinbaseImport/backend',
44
+ Nordea: 'src/NordeaImport/backend',
45
+ 'Nordnet-Megalo': 'src/NordnetImport/backend',
46
+ 'Nordnet-Hilunki': 'src/NordnetImport/backend',
47
+ Lynx: 'src/LynxImport/backend',
48
+ Kraken: 'src/KrakenImport/backend',
49
+ TITO: 'src/TITOImport/backend',
50
+ }
51
+ if (!handlers[className]) {
52
+ throw new Error(`No such import handler path as '${className}'.`)
53
+ }
54
+ return path.join('../../tasenor-common-plugins', handlerDirs[className])
55
+ }
@@ -0,0 +1,73 @@
1
+ import { describe, expect, test } from '@jest/globals'
2
+ import { ImportSegment, ProcessConfig, TextFileLine } from '@dataplug/tasenor-common'
3
+ import { TransactionImportHandler } from '../src/import/TransactionImportHandler'
4
+
5
+ describe('TransactionRules', () => {
6
+
7
+ test('forming tags from object', async () => {
8
+ const now = new Date()
9
+ const handler = new TransactionImportHandler('Test')
10
+
11
+ const lines: TextFileLine[] = [
12
+ {
13
+ line: 0,
14
+ text: 'ABC',
15
+ columns: {
16
+ val: 'A'
17
+ }
18
+ }
19
+ ]
20
+
21
+ const segment: ImportSegment = {
22
+ id: 'ABCDE',
23
+ time: now,
24
+ lines: [
25
+ {
26
+ file: 'test.csv',
27
+ number: 0
28
+ }
29
+ ]
30
+ }
31
+
32
+ const config: ProcessConfig = {
33
+ currency: 'USD',
34
+ rules: [
35
+ {
36
+ name: 'Tag test',
37
+ filter: 'true',
38
+ result: [
39
+ {
40
+ reason: "'transfer'",
41
+ type: "'currency'",
42
+ asset: 'config.currency',
43
+ amount: '12',
44
+ tags: {
45
+ YES: 'true',
46
+ NO: 'false',
47
+ A: 'val=="A"',
48
+ B: 'val=="B"'
49
+ }
50
+ }
51
+ ]
52
+ }
53
+ ]
54
+ }
55
+
56
+ const result = await handler.classifyLines(lines, config, segment)
57
+
58
+ expect(result).toStrictEqual({
59
+ type: 'transfers',
60
+ transfers: [
61
+ {
62
+ reason: 'transfer',
63
+ type: 'currency',
64
+ asset: 'USD',
65
+ amount: 12,
66
+ tags: ['A', 'YES']
67
+ }
68
+ ]
69
+ })
70
+
71
+ })
72
+
73
+ })
@@ -0,0 +1,87 @@
1
+ import { UnitTester } from '../src/testing'
2
+
3
+ test('Direct expense account address', async () => {
4
+
5
+ const tester = new UnitTester()
6
+
7
+ await tester.test(
8
+ // Use direct reference to the account.
9
+ [
10
+ {
11
+ reason: 'expense',
12
+ type: 'account',
13
+ asset: '112233',
14
+ amount: -200,
15
+ data: {
16
+ text: 'My expense paid'
17
+ }
18
+ },
19
+ {
20
+ reason: 'expense',
21
+ type: 'account',
22
+ asset: '445566',
23
+ amount: 200
24
+ }
25
+ ], [[
26
+ {
27
+ account: '112233',
28
+ amount: -20000,
29
+ description: 'My expense paid',
30
+ data: {
31
+ text: 'My expense paid'
32
+ }
33
+ },
34
+ {
35
+ account: '445566',
36
+ amount: 20000,
37
+ description: 'My expense paid',
38
+ }
39
+ ]]
40
+ )
41
+ })
42
+
43
+ test('Direct income account address', async () => {
44
+
45
+ const tester = new UnitTester()
46
+
47
+ await tester.test(
48
+ // Use direct reference to the account.
49
+ [
50
+ {
51
+ reason: 'income',
52
+ type: 'account',
53
+ asset: '112233',
54
+ amount: -200,
55
+ data: {
56
+ text: 'My income paid.'
57
+ }
58
+ },
59
+ {
60
+ reason: 'income',
61
+ type: 'account',
62
+ asset: '445566',
63
+ amount: 200,
64
+ data: {
65
+ text: 'Yes it is.'
66
+ }
67
+ }
68
+ ], [[
69
+ {
70
+ account: '112233',
71
+ amount: -20000,
72
+ description: 'My income paid. Yes it is.',
73
+ data: {
74
+ text: 'My income paid.'
75
+ }
76
+ },
77
+ {
78
+ account: '445566',
79
+ amount: 20000,
80
+ description: 'My income paid. Yes it is.',
81
+ data: {
82
+ text: 'Yes it is.'
83
+ }
84
+ }
85
+ ]]
86
+ )
87
+ })