@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,181 @@
1
+ import { AccountElement, AccountAddress, FilterRule, Language, UIQuery, TasenorElement, AccountNumber, TransactionImportOptions, ButtonElement, MessageElement, ProcessConfig, TextFileLine, AssetType, Asset, ImportSegment } from '@dataplug/tasenor-common';
2
+ /**
3
+ * Injected dependecies for UI query generator.
4
+ */
5
+ export interface TransactionUIDependencies {
6
+ getAccountCanditates(addr: AccountAddress, config: ProcessConfig): Promise<AccountNumber[]>;
7
+ getTranslation(text: string, language: Language): Promise<string>;
8
+ }
9
+ /**
10
+ * A RISP generator creating UI definitions for various questions.
11
+ */
12
+ export declare class TransactionUI {
13
+ private deps;
14
+ constructor(deps: TransactionUIDependencies);
15
+ /**
16
+ * Ensure that variable is in the configuration. If not throw AskUI exception to ask it from the user.
17
+ * @param config
18
+ * @param variable
19
+ */
20
+ getConfigOrAsk(config: ProcessConfig, variable: string, element: TasenorElement, allowNull?: boolean): Promise<unknown>;
21
+ /**
22
+ * Throw a query for boolean value if not in the configuration.
23
+ * @param config
24
+ * @param variable
25
+ * @param description
26
+ */
27
+ getBoolean(config: ProcessConfig, variable: string, description: string): Promise<unknown>;
28
+ /**
29
+ * Check if we have an answer for a segment.
30
+ */
31
+ getSegmentAnswer(config: ProcessConfig, segment: ImportSegment, variable: string): Promise<unknown | undefined>;
32
+ /**
33
+ * Get the cash account for quick import selections.
34
+ */
35
+ getCashAccount(config: ProcessConfig): Promise<AccountNumber>;
36
+ /**
37
+ * Check if the question about asset renaming is answered. If not, throw a question.
38
+ */
39
+ askedRenamingOrThrow(config: ProcessConfig, segment: ImportSegment, type: AssetType, asset: Asset): Promise<boolean>;
40
+ /**
41
+ * Get the translation for the text to the currently configured language.
42
+ * @param text
43
+ * @returns
44
+ */
45
+ getTranslation(text: string, language: Language): Promise<string>;
46
+ /**
47
+ * Construct a translated label for an account dropdown.
48
+ * @param accType
49
+ * @returns
50
+ */
51
+ accountLabel(accType: AccountAddress, language: Language): Promise<string>;
52
+ /**
53
+ * Construct a filter for account family.
54
+ * @param config
55
+ * @param accType
56
+ * @returns
57
+ */
58
+ accountFilter(accType: AccountAddress): FilterRule;
59
+ /**
60
+ * Construct a query for an account by its address.
61
+ * @param missing
62
+ */
63
+ account(config: ProcessConfig, account: AccountAddress, defaultAccount?: AccountNumber | undefined): Promise<AccountElement>;
64
+ /**
65
+ * Interrupt with a query asking an account.
66
+ * @param account
67
+ * @param language
68
+ */
69
+ throwGetAccount(config: ProcessConfig, address: AccountAddress): Promise<never>;
70
+ /**
71
+ * Ask for account to be used for negatice balance instead of the account itself.
72
+ * @param address
73
+ * @param language
74
+ */
75
+ throwDebtAccount(config: ProcessConfig, account: AccountNumber, address: AccountAddress): Promise<never>;
76
+ /**
77
+ * Construct a query for asking about grouping of accounts and account number for group if selected.
78
+ * @param accounts
79
+ * @param language
80
+ * @returns
81
+ */
82
+ accountGroup(config: ProcessConfig, accounts: AccountAddress[]): Promise<TasenorElement>;
83
+ /**
84
+ * Submit button for UI configuration.
85
+ * @param language
86
+ * @returns
87
+ */
88
+ submit(label: string, objectWrapLevel: number, language: Language): Promise<ButtonElement>;
89
+ /**
90
+ * A UI message.
91
+ * @param message
92
+ */
93
+ message(text: string, severity: 'info' | 'warning' | 'error' | 'success'): Promise<MessageElement>;
94
+ /**
95
+ * Throw an error message with Retry button.
96
+ * @param message
97
+ */
98
+ throwErrorRetry(message: string, language: Language): Promise<void>;
99
+ /**
100
+ * Construct RISP element from UI query.
101
+ *
102
+ * The following questions can be expressed:
103
+ *
104
+ * ### Choose an Option
105
+ *
106
+ * A list of fixed options are given. The display text is a key and the value is the resulting value, if selected.
107
+ * ```json
108
+ * {
109
+ * "name": "Option Question",
110
+ * "label": "Choose one of the following:",
111
+ * "ask": {
112
+ * "Hardware equipment": "HARDWARE",
113
+ * "Software": "SOFTWARE"
114
+ * }
115
+ * }
116
+ * ```
117
+ *
118
+ * ### Choose a Tag
119
+ *
120
+ * An ability to select from predetermined set of tags we can use
121
+ * ```json
122
+ * {
123
+ * "name": "Tag Selection",
124
+ * "label": "Select a tag:",
125
+ * "chooseTag": [ "A", "B", "C" ]
126
+ * }
127
+ * ```
128
+ *
129
+ * ### Explain in Text
130
+ * A simple text box can be used with
131
+ * ```json
132
+ * {
133
+ * "name": "A Text Box",
134
+ * "label": "Plase enter the purchase description:",
135
+ * "text": true
136
+ * }
137
+ * ```
138
+ *
139
+ * @param query
140
+ */
141
+ parseQuery(name: string, query: UIQuery, language: Language): Promise<TasenorElement>;
142
+ /**
143
+ * Construct UI for general query.
144
+ * @param UIQuery
145
+ * @param language
146
+ */
147
+ query(name: string, query: UIQuery | UIQuery[], lines: TextFileLine[] | null, language: Language): Promise<TasenorElement>;
148
+ /**
149
+ * Construct a query and throw it immediately.
150
+ * @param name
151
+ * @param query
152
+ * @param lines
153
+ * @param language
154
+ */
155
+ throwQuery(name: string, query: UIQuery | UIQuery[], lines: TextFileLine[] | null, language: Language): Promise<never>;
156
+ /**
157
+ * Throw UI exception in order to collect more information from UI.
158
+ * @param element
159
+ */
160
+ throw(element: TasenorElement): never;
161
+ /**
162
+ * Construct a descriptor of context lines needed to display in a question.
163
+ * @param lines
164
+ * @param language
165
+ * @returns
166
+ */
167
+ describeLines(lines: TextFileLine[], language: Language): Promise<TasenorElement>;
168
+ /**
169
+ * Construct a query asking one of the options in order to store to the configuration.
170
+ * @param text
171
+ * @param variable
172
+ * @param options
173
+ */
174
+ throwRadioQuestion(text: any, variable: any, options: any, language: Language): Promise<never>;
175
+ /**
176
+ * Pass control to the rule editor when found a line not matching a filter.
177
+ * @param lines
178
+ * @param language
179
+ */
180
+ throwNoFilterMatchForLine(lines: TextFileLine[], config: ProcessConfig, options: TransactionImportOptions): Promise<never>;
181
+ }
@@ -0,0 +1,482 @@
1
+ import { AskUI, SystemError } from '../error';
2
+ /**
3
+ * A RISP generator creating UI definitions for various questions.
4
+ */
5
+ export class TransactionUI {
6
+ deps;
7
+ constructor(deps) {
8
+ this.deps = deps;
9
+ }
10
+ /**
11
+ * Ensure that variable is in the configuration. If not throw AskUI exception to ask it from the user.
12
+ * @param config
13
+ * @param variable
14
+ */
15
+ async getConfigOrAsk(config, variable, element, allowNull = true) {
16
+ if (variable in config && (allowNull || config[variable] !== null)) {
17
+ return config[variable];
18
+ }
19
+ throw new AskUI({
20
+ type: 'flat',
21
+ elements: [
22
+ element,
23
+ await this.submit('Continue', 1, config.language)
24
+ ]
25
+ });
26
+ }
27
+ /**
28
+ * Throw a query for boolean value if not in the configuration.
29
+ * @param config
30
+ * @param variable
31
+ * @param description
32
+ */
33
+ async getBoolean(config, variable, description) {
34
+ return this.getConfigOrAsk(config, variable, {
35
+ type: 'yesno',
36
+ name: `configure.${variable}`,
37
+ label: await this.getTranslation(description, config.language),
38
+ actions: {}
39
+ });
40
+ }
41
+ /**
42
+ * Check if we have an answer for a segment.
43
+ */
44
+ async getSegmentAnswer(config, segment, variable) {
45
+ if ('answers' in config) {
46
+ const answers = config.answers;
47
+ const segmentAnswers = answers[segment.id];
48
+ if (segmentAnswers && variable in segmentAnswers) {
49
+ return segmentAnswers[variable];
50
+ }
51
+ }
52
+ return undefined;
53
+ }
54
+ /**
55
+ * Get the cash account for quick import selections.
56
+ */
57
+ async getCashAccount(config) {
58
+ return await this.getConfigOrAsk(config, 'cashAccount', {
59
+ type: 'account',
60
+ filter: { type: 'ASSET' },
61
+ name: 'configure.cashAccount',
62
+ label: await this.getTranslation('Select contra account for imported transactions, i.e. cash account.', config.language),
63
+ actions: {}
64
+ }, false);
65
+ }
66
+ /**
67
+ * Check if the question about asset renaming is answered. If not, throw a question.
68
+ */
69
+ async askedRenamingOrThrow(config, segment, type, asset) {
70
+ const ans = await this.getSegmentAnswer(config, segment, `hasBeenRenamed.${type}.${asset}`);
71
+ if (ans === undefined) {
72
+ throw new AskUI(await this.message(`Asset renaming question not implemented (avoid error for now by setting answer 'hasBeenRenamed.${type}.${asset}' for segment '${segment.id}').`, 'error'));
73
+ }
74
+ return ans;
75
+ }
76
+ /**
77
+ * Get the translation for the text to the currently configured language.
78
+ * @param text
79
+ * @returns
80
+ */
81
+ async getTranslation(text, language) {
82
+ return this.deps.getTranslation(text, language);
83
+ }
84
+ /**
85
+ * Construct a translated label for an account dropdown.
86
+ * @param accType
87
+ * @returns
88
+ */
89
+ async accountLabel(accType, language) {
90
+ const [reason, type, asset] = accType.split('.');
91
+ const text = await this.getTranslation(`account-${reason}-${type}`, language);
92
+ // Resolve name for the asset.
93
+ let name = asset;
94
+ if (type === 'statement') {
95
+ if (reason === 'income') {
96
+ name = await this.getTranslation(`income-${asset}`, language);
97
+ }
98
+ else if (reason === 'expense') {
99
+ name = await this.getTranslation(`expense-${asset}`, language);
100
+ }
101
+ else if (reason === 'tax') {
102
+ name = await this.getTranslation(`tax-${asset}`, language);
103
+ }
104
+ }
105
+ return text.replace('{asset}', name);
106
+ }
107
+ /**
108
+ * Construct a filter for account family.
109
+ * @param config
110
+ * @param accType
111
+ * @returns
112
+ */
113
+ accountFilter(accType) {
114
+ const [reason] = accType.split('.');
115
+ switch (`${reason}`) {
116
+ case 'debt':
117
+ return { type: ['ASSET', 'LIABILITY'] };
118
+ case 'deposit':
119
+ case 'trade':
120
+ case 'withdrawal':
121
+ return { type: 'ASSET' };
122
+ case 'fee':
123
+ return { type: 'EXPENSE' };
124
+ }
125
+ // TODO: Think about the rest combinations. Needs probably account subtypes.
126
+ return null;
127
+ }
128
+ /**
129
+ * Construct a query for an account by its address.
130
+ * @param missing
131
+ */
132
+ async account(config, account, defaultAccount = undefined) {
133
+ const language = config.language;
134
+ const ui = {
135
+ type: 'account',
136
+ name: `configure.account.${account}`,
137
+ actions: {},
138
+ label: await this.accountLabel(account, language),
139
+ filter: this.accountFilter(account)
140
+ };
141
+ if (defaultAccount) {
142
+ ui.defaultValue = defaultAccount;
143
+ }
144
+ else {
145
+ const canditates = await this.deps.getAccountCanditates(account, { ...config, plugin: config.handlers instanceof Array && config.handlers.length ? config.handlers[0] : undefined });
146
+ if (canditates.length) {
147
+ ui.defaultValue = canditates[0];
148
+ if (canditates.length > 1) {
149
+ ui.preferred = canditates;
150
+ }
151
+ }
152
+ }
153
+ return ui;
154
+ }
155
+ /**
156
+ * Interrupt with a query asking an account.
157
+ * @param account
158
+ * @param language
159
+ */
160
+ async throwGetAccount(config, address) {
161
+ const account = await this.account(config, address);
162
+ const submit = await this.submit('Continue', 1, config.language);
163
+ throw new AskUI({
164
+ type: 'flat',
165
+ elements: [
166
+ account,
167
+ submit
168
+ ]
169
+ });
170
+ }
171
+ /**
172
+ * Ask for account to be used for negatice balance instead of the account itself.
173
+ * @param address
174
+ * @param language
175
+ */
176
+ async throwDebtAccount(config, account, address) {
177
+ const language = config.language;
178
+ const text = await this.getTranslation('The account below has negative balance. If you want to record it to the separate debt account, please select another account below.', language);
179
+ const message = await this.message(text, 'info');
180
+ const parts = address.split('.');
181
+ const debtAddr = `debt.${parts[1]}.${parts[2]}`;
182
+ const accountUI = await this.account(config, debtAddr, account);
183
+ const submit = await this.submit('Continue', 1, language);
184
+ throw new AskUI({
185
+ type: 'flat',
186
+ elements: [
187
+ message,
188
+ accountUI,
189
+ submit
190
+ ]
191
+ });
192
+ }
193
+ /**
194
+ * Construct a query for asking about grouping of accounts and account number for group if selected.
195
+ * @param accounts
196
+ * @param language
197
+ * @returns
198
+ */
199
+ async accountGroup(config, accounts) {
200
+ const [reason, type] = accounts[0].split('.');
201
+ const elements = [];
202
+ const language = config.language;
203
+ for (const account of accounts) {
204
+ elements.push(await this.account(config, account));
205
+ }
206
+ return {
207
+ type: 'flat',
208
+ elements: [
209
+ {
210
+ type: 'boolean',
211
+ name: `grouping.${reason}.${type}`,
212
+ label: await this.getTranslation('Do you want to use the same account for all of them?', language),
213
+ defaultValue: false,
214
+ actions: {}
215
+ },
216
+ {
217
+ type: 'case',
218
+ condition: `grouping.${reason}.${type}`,
219
+ cases: {
220
+ true: await this.account(config, `${reason}.${type}.*`),
221
+ false: {
222
+ type: 'flat',
223
+ elements
224
+ }
225
+ }
226
+ }
227
+ ]
228
+ };
229
+ }
230
+ /**
231
+ * Submit button for UI configuration.
232
+ * @param language
233
+ * @returns
234
+ */
235
+ async submit(label, objectWrapLevel, language) {
236
+ let errorMessage = await this.getTranslation('Saving failed', language);
237
+ let successMessage = await this.getTranslation('Saved successfully', language);
238
+ if (label === 'Retry') {
239
+ errorMessage = await this.getTranslation('Retry failed', language);
240
+ successMessage = await this.getTranslation('Retried successfully', language);
241
+ }
242
+ return {
243
+ type: 'button',
244
+ label,
245
+ actions: {
246
+ onClick: {
247
+ type: 'post',
248
+ url: '',
249
+ objectWrapLevel,
250
+ errorMessage,
251
+ successMessage
252
+ }
253
+ }
254
+ };
255
+ }
256
+ /**
257
+ * A UI message.
258
+ * @param message
259
+ */
260
+ async message(text, severity) {
261
+ return {
262
+ type: 'message',
263
+ severity,
264
+ text
265
+ };
266
+ }
267
+ /**
268
+ * Throw an error message with Retry button.
269
+ * @param message
270
+ */
271
+ async throwErrorRetry(message, language) {
272
+ throw new AskUI({
273
+ type: 'flat',
274
+ elements: [
275
+ await this.message(message, 'error'),
276
+ await this.submit('Retry', 0, language)
277
+ ]
278
+ });
279
+ }
280
+ /**
281
+ * Construct RISP element from UI query.
282
+ *
283
+ * The following questions can be expressed:
284
+ *
285
+ * ### Choose an Option
286
+ *
287
+ * A list of fixed options are given. The display text is a key and the value is the resulting value, if selected.
288
+ * ```json
289
+ * {
290
+ * "name": "Option Question",
291
+ * "label": "Choose one of the following:",
292
+ * "ask": {
293
+ * "Hardware equipment": "HARDWARE",
294
+ * "Software": "SOFTWARE"
295
+ * }
296
+ * }
297
+ * ```
298
+ *
299
+ * ### Choose a Tag
300
+ *
301
+ * An ability to select from predetermined set of tags we can use
302
+ * ```json
303
+ * {
304
+ * "name": "Tag Selection",
305
+ * "label": "Select a tag:",
306
+ * "chooseTag": [ "A", "B", "C" ]
307
+ * }
308
+ * ```
309
+ *
310
+ * ### Explain in Text
311
+ * A simple text box can be used with
312
+ * ```json
313
+ * {
314
+ * "name": "A Text Box",
315
+ * "label": "Plase enter the purchase description:",
316
+ * "text": true
317
+ * }
318
+ * ```
319
+ *
320
+ * @param query
321
+ */
322
+ async parseQuery(name, query, language) {
323
+ if ('ask' in query) {
324
+ // This is just object mapping explanation to values.
325
+ return {
326
+ name,
327
+ type: 'radio',
328
+ label: query.label || await this.getTranslation('Select one of the following:', language),
329
+ actions: {},
330
+ options: query.ask
331
+ };
332
+ }
333
+ else if ('chooseTag' in query) {
334
+ return {
335
+ name,
336
+ type: 'tags',
337
+ label: query.label || await this.getTranslation('Select one of the following:', language),
338
+ actions: {},
339
+ single: true,
340
+ options: query.chooseTag
341
+ };
342
+ }
343
+ else if ('text' in query) {
344
+ return {
345
+ name,
346
+ type: 'text',
347
+ label: query.label || await this.getTranslation('Please enter text:', language),
348
+ actions: {}
349
+ };
350
+ }
351
+ else {
352
+ throw new SystemError(`Unable to parse UI from query ${JSON.stringify(query)}.`);
353
+ }
354
+ }
355
+ /**
356
+ * Construct UI for general query.
357
+ * @param UIQuery
358
+ * @param language
359
+ */
360
+ async query(name, query, lines, language) {
361
+ const elements = [];
362
+ // Construct some reference if we know context.
363
+ if (lines && lines.length) {
364
+ elements.push(await this.describeLines(lines, language));
365
+ }
366
+ if (query instanceof Array) {
367
+ for (const q of query) {
368
+ elements.push(await this.parseQuery(name, q, language));
369
+ }
370
+ }
371
+ else {
372
+ elements.push(await this.parseQuery(name, query, language));
373
+ }
374
+ elements.push(await this.submit('Continue', 2, language));
375
+ return {
376
+ type: 'flat',
377
+ elements
378
+ };
379
+ }
380
+ /**
381
+ * Construct a query and throw it immediately.
382
+ * @param name
383
+ * @param query
384
+ * @param lines
385
+ * @param language
386
+ */
387
+ async throwQuery(name, query, lines, language) {
388
+ const element = await this.query(name, query, lines, language);
389
+ this.throw(element);
390
+ }
391
+ /**
392
+ * Throw UI exception in order to collect more information from UI.
393
+ * @param element
394
+ */
395
+ throw(element) {
396
+ throw new AskUI(element);
397
+ }
398
+ /**
399
+ * Construct a descriptor of context lines needed to display in a question.
400
+ * @param lines
401
+ * @param language
402
+ * @returns
403
+ */
404
+ async describeLines(lines, language) {
405
+ const viewer = lines.map(line => ({
406
+ type: 'textFileLine',
407
+ line
408
+ }));
409
+ return {
410
+ type: 'box',
411
+ elements: [
412
+ {
413
+ type: 'html',
414
+ html: `<strong>${await this.getTranslation('Based on the following imported lines', language)}</strong>`
415
+ },
416
+ ...viewer
417
+ ]
418
+ };
419
+ }
420
+ /**
421
+ * Construct a query asking one of the options in order to store to the configuration.
422
+ * @param text
423
+ * @param variable
424
+ * @param options
425
+ */
426
+ async throwRadioQuestion(text, variable, options, language) {
427
+ throw new AskUI({
428
+ type: 'flat',
429
+ elements: [
430
+ {
431
+ type: 'message',
432
+ severity: 'info',
433
+ text
434
+ },
435
+ {
436
+ type: 'radio',
437
+ name: `configure.${variable}`,
438
+ options,
439
+ actions: {}
440
+ },
441
+ {
442
+ type: 'button',
443
+ label: await this.deps.getTranslation('Continue', language),
444
+ actions: {
445
+ onClick: {
446
+ type: 'post',
447
+ url: '',
448
+ objectWrapLevel: 1
449
+ }
450
+ }
451
+ }
452
+ ]
453
+ });
454
+ }
455
+ /**
456
+ * Pass control to the rule editor when found a line not matching a filter.
457
+ * @param lines
458
+ * @param language
459
+ */
460
+ async throwNoFilterMatchForLine(lines, config, options) {
461
+ const cashAccount = await this.getCashAccount(config);
462
+ throw new AskUI({
463
+ type: 'ruleEditor',
464
+ name: 'once',
465
+ actions: {
466
+ onContinue: {
467
+ type: 'post',
468
+ url: ''
469
+ },
470
+ onCreateRule: {
471
+ type: 'post',
472
+ url: '/rule'
473
+ }
474
+ },
475
+ config,
476
+ lines,
477
+ options,
478
+ cashAccount
479
+ });
480
+ }
481
+ }
482
+ //# sourceMappingURL=TransactionUI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionUI.js","sourceRoot":"","sources":["../../../../src/import/TransactionUI.ts"],"names":[],"mappings":"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"}