@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,396 @@
1
+ import { Crypto, DatabaseName, error, Hostname, ID, isDatabaseName, log, Secret, Url } from '@dataplug/tasenor-common'
2
+ import { randomString, vault } from '..'
3
+ import knex, { Knex } from 'knex'
4
+ import { types } from 'pg'
5
+ import { builtins } from 'pg-types'
6
+ import { create as opaque } from 'ts-opaque'
7
+
8
+ // How many times to retry migration before giving up.
9
+ const MIGRATION_RETRY = 20
10
+
11
+ // Fix Knex messing around with the date values and timezones.
12
+ const parseDate = (val) => val
13
+ types.setTypeParser(builtins.TIMESTAMPTZ, parseDate)
14
+ types.setTypeParser(builtins.TIMESTAMP, parseDate)
15
+ types.setTypeParser(builtins.DATE, parseDate)
16
+
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ export type KnexDatabase = Knex<any, any[]>
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ export type KnexConfig = Record<string, any>
21
+ export type KnexConnectionInfo = {
22
+ host: string,
23
+ port: string | number,
24
+ database: string,
25
+ user: string,
26
+ password: string
27
+ }
28
+
29
+ /**
30
+ * Check if the database with the given name exists.
31
+ * @param master The master database.
32
+ * @param name Name of the DB to check.
33
+ * @returns True if it is found.
34
+ */
35
+ const exists = async (master: KnexDatabase, name: DatabaseName): Promise<boolean> => {
36
+ return !!(await master('databases').select('*').where({ name }).first())
37
+ }
38
+
39
+ /**
40
+ * Construct a Knex configuration for the given database.
41
+ * @param master
42
+ * @param name
43
+ * @param hostOverride
44
+ * @returns
45
+ */
46
+ const getConfig = async (master: KnexDatabase, name: DatabaseName, hostOverride: null | Hostname = null): Promise<KnexConfig> => {
47
+ const userDb = await master('databases').select('*').where({ name }).first()
48
+ const password = await Crypto.decrypt(vault.get('SECRET') as Secret, userDb.password)
49
+ if (!password) {
50
+ throw new Error('Failed to get password.')
51
+ }
52
+ return {
53
+ client: 'postgresql',
54
+ connection: {
55
+ host: hostOverride === null ? userDb.host : hostOverride,
56
+ port: userDb.port,
57
+ database: userDb.name,
58
+ user: userDb.user,
59
+ password
60
+ },
61
+ pool: {
62
+ min: 1,
63
+ max: 3
64
+ }
65
+ }
66
+ }
67
+
68
+ const cache = {}
69
+ /**
70
+ * Get the cached connection to the given customer database.
71
+ * @param master Master database connection.
72
+ * @param name Name of the database.
73
+ * @param hostOverride If given, use this host instead of the host in database.
74
+ * @returns Knex connection.
75
+ */
76
+ const get = async (master: KnexDatabase, name: DatabaseName, hostOverride: null | Hostname = null): Promise<KnexDatabase> => {
77
+ if (!(await exists(master, name))) {
78
+ delete cache[name]
79
+ throw new Error(`Database '${name}' does not exist.`)
80
+ }
81
+
82
+ const cacheName = hostOverride ? `${name}:${hostOverride}` : name
83
+
84
+ if (!cache[cacheName]) {
85
+ const knexConfig = await getConfig(master, name, hostOverride)
86
+ cache[cacheName] = knex(knexConfig)
87
+ }
88
+ return cache[cacheName]
89
+ }
90
+
91
+ /**
92
+ * Disconnect and drop cached connection.
93
+ * @param name Name of the database.
94
+ */
95
+ const disconnect = async (name: string): Promise<void> => {
96
+ for (const conn of Object.entries(cache)) {
97
+ if (conn[0].split(':')[0] === name) {
98
+ log(`Disconnecting ${conn[0]}`)
99
+ await (conn[1] as Knex).destroy()
100
+ delete cache[conn[0]]
101
+ }
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Get the configuration for the root connection.
107
+ * @returns Configuration object.
108
+ */
109
+ const getRootConfig = (): KnexConfig => {
110
+ const url = new URL(vault.get('DATABASE_URL'))
111
+ const knexConfig = {
112
+ client: 'postgresql',
113
+ connection: {
114
+ host: url.hostname,
115
+ port: parseInt(url.port) || 5432,
116
+ database: 'postgres',
117
+ user: vault.get('DATABASE_ROOT_USER'),
118
+ password: vault.get('DATABASE_ROOT_PASSWORD')
119
+ },
120
+ pool: {
121
+ min: 1,
122
+ max: 1
123
+ }
124
+ }
125
+ return knexConfig
126
+ }
127
+
128
+ /**
129
+ * Convert database URL to knex config.
130
+ * @param knexUrl
131
+ * @returns
132
+ */
133
+ const getKnexConfig = (knexUrl: Url): KnexConfig => {
134
+ const url = new URL(knexUrl)
135
+ return {
136
+ client: 'postgresql',
137
+ connection: {
138
+ host: url.hostname,
139
+ port: parseInt(url.port) || 5432,
140
+ database: url.pathname.replace(/^\//, ''),
141
+ user: url.username,
142
+ password: url.password
143
+ },
144
+ pool: {
145
+ min: 1,
146
+ max: 5
147
+ }
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Get the cached connetion to the root access.
153
+ * @returns Knex instance.
154
+ */
155
+ let rootCache
156
+ const getRoot = (): KnexDatabase => {
157
+ if (rootCache) return rootCache
158
+
159
+ rootCache = knex(getRootConfig())
160
+ return rootCache
161
+ }
162
+
163
+ const getMasterConfig = (): KnexConfig => {
164
+ return getKnexConfig(vault.get('DATABASE_URL') as Url)
165
+ }
166
+
167
+ /**
168
+ * Get the master database.
169
+ * @returns A Knex instance.
170
+ */
171
+ let masterCache
172
+ const getMaster = (): KnexDatabase => {
173
+ if (masterCache) return masterCache
174
+
175
+ masterCache = knex(getMasterConfig())
176
+ return masterCache
177
+ }
178
+
179
+ /**
180
+ * Test if the name is valid database name.
181
+ * @param name
182
+ * @returns True if valid.
183
+ */
184
+ const isValidName = (name: string): boolean => {
185
+ return isDatabaseName(name)
186
+ }
187
+
188
+ /**
189
+ * Create new customer database.
190
+ * @param db Knex for bookkeeper master database.
191
+ * @param name Name of the new database.
192
+ * @param host A host name of the DB host.
193
+ * @param port A port used by the DB host.
194
+ * @param migrations Path of the migrations file.
195
+ * @returns ID
196
+ */
197
+ const create = async (masterDb: KnexDatabase, name: DatabaseName, host: Hostname, port: number, migrations: string | null = null, hostOverride: null | Hostname = null): Promise<ID> => {
198
+ if (await exists(masterDb, name)) {
199
+ throw new Error(`Database '${name}' exist.`)
200
+ }
201
+ if (!isValidName(name)) {
202
+ throw new Error(`Invalid database name '${name}'.`)
203
+ }
204
+ const rootDb = getRoot()
205
+ const user = 'user' + randomString(20)
206
+ const password = randomString(64)
207
+ const entry = {
208
+ name,
209
+ host,
210
+ port,
211
+ user,
212
+ password: await Crypto.encrypt(vault.get('SECRET') as Secret, password),
213
+ config: {}
214
+ }
215
+ await rootDb.raw(`CREATE USER "${user}" WITH PASSWORD '${password}'`)
216
+ await rootDb.raw(`CREATE DATABASE "${name}"`)
217
+ await rootDb.raw(`GRANT ALL PRIVILEGES ON DATABASE "${name}" TO "${user}"`)
218
+ const id = (await masterDb('databases').insert(entry).returning('id'))[0].id
219
+
220
+ if (migrations) {
221
+ await migrate(masterDb, name, migrations, hostOverride)
222
+ }
223
+
224
+ return id
225
+ }
226
+
227
+ /**
228
+ * Apply migrations to the named customer database.
229
+ * @param masterDb
230
+ * @param name
231
+ * @param migrations
232
+ * @param hostOverride
233
+ */
234
+ const migrate = async (masterDb: KnexDatabase, name: DatabaseName, migrations: string, hostOverride: null | Hostname = null): Promise<void> => {
235
+ log(`Migrating database '${name}'.`)
236
+ const conf = await getConfig(masterDb, name, hostOverride)
237
+ conf.migrations = { directory: migrations }
238
+ const db = knex(conf)
239
+ await db.migrate.latest()
240
+ // Do not leave hanging connections.
241
+ await db.destroy()
242
+ }
243
+
244
+ /**
245
+ * Apply migrations to the master database.
246
+ */
247
+ const migrateMaster = async (migrations: string): Promise<void> => {
248
+ function delay(time) {
249
+ return new Promise(resolve => setTimeout(resolve, time))
250
+ }
251
+
252
+ log('Migrating master database.')
253
+
254
+ const conf = await getMasterConfig()
255
+ conf.migrations = { directory: migrations }
256
+ const db = knex(conf)
257
+ for (let i = 0; i < MIGRATION_RETRY; i++) {
258
+ try {
259
+ await db.migrate.latest()
260
+ log('Migrating master database successful.')
261
+ break
262
+ } catch (err) {
263
+ if (i < MIGRATION_RETRY - 1) {
264
+ error('Migration failed. Retrying...')
265
+ await delay(1000)
266
+ }
267
+ }
268
+ }
269
+ // Do not leave hanging connections.
270
+ await db.destroy()
271
+ }
272
+
273
+ /**
274
+ * Roll bakc last migrations from the named customer database.
275
+ * @param masterDb
276
+ * @param name
277
+ * @param migrations
278
+ * @param hostOverride
279
+ */
280
+ const rollback = async (masterDb: KnexDatabase, name: DatabaseName, migrations: string, hostOverride: null | Hostname = null): Promise<void> => {
281
+ const conf = await getConfig(masterDb, name, hostOverride)
282
+ conf.migrations = { directory: migrations }
283
+ const db = knex(conf)
284
+ await db.migrate.rollback()
285
+ // Do not leave hanging connections.
286
+ await db.destroy()
287
+ }
288
+
289
+ /**
290
+ * Destroy customer database.
291
+ * @param masterDb
292
+ * @param name
293
+ * @param hostOverride
294
+ */
295
+ const destroy = async (masterDb: KnexDatabase, name: DatabaseName, hostOverride: null | Hostname = null): Promise<string|null> => {
296
+ const db = await masterDb('databases').where({ name }).first()
297
+ if (!db) {
298
+ return 'Database not found.'
299
+ }
300
+ const dbToDelete = await get(masterDb, name, hostOverride)
301
+ await dbToDelete.raw(`DROP OWNED BY ${db.user}`)
302
+
303
+ disconnect(name)
304
+
305
+ await masterDb('database_users').where({ database_id: db.id }).delete()
306
+ await masterDb('databases').where({ id: db.id }).delete()
307
+
308
+ const rootDb = getRoot()
309
+ await rootDb.raw(`DROP OWNED BY ${db.user}`)
310
+ await rootDb.raw(`DROP USER ${db.user}`)
311
+ await rootDb.raw(`DROP DATABASE ${db.name} WITH (FORCE)`)
312
+
313
+ return null
314
+ }
315
+
316
+ /**
317
+ * Generate a name for a database that does not yet exist.
318
+ * @param masterDb - Master database.
319
+ * @param init - Initial part of the name.
320
+ * @returns Suitable name.
321
+ */
322
+ async function findName(masterDb: KnexDatabase, init: string): Promise<string> {
323
+ let n = 1
324
+ let name = init
325
+ while (await exists(masterDb, opaque(name))) {
326
+ n++
327
+ name = `${init}${n}`
328
+ }
329
+ return name
330
+ }
331
+
332
+ /**
333
+ * Terminate all DB connections.
334
+ */
335
+ async function disconnectAll() {
336
+ if (masterCache) {
337
+ log('Disconnecting master DB.')
338
+ await masterCache.destroy()
339
+ }
340
+ if (rootCache) {
341
+ log('Disconnecting root DB.')
342
+ await rootCache.destroy()
343
+ }
344
+ for (const conn of Object.entries(cache)) {
345
+ log(`Disconnecting ${conn[0]}`)
346
+ await (conn[1] as Knex).destroy()
347
+ }
348
+ }
349
+
350
+ /**
351
+ * Get a list of all customer database connection infos.
352
+ */
353
+ async function customerDbs(hostOverride: null | Hostname = null): Promise<KnexConnectionInfo[]> {
354
+ const all: KnexConnectionInfo[] = []
355
+ await vault.initialize()
356
+ const master = await getMaster()
357
+ const dbs = await master('databases').select('name', 'host', 'port', 'user', 'password')
358
+ for (const db of dbs) {
359
+ const conf = await getConfig(master, db.name, hostOverride)
360
+ const { host, port, database, user, password } = conf.connection as KnexConnectionInfo
361
+ all.push({ host, port, database, user, password })
362
+ }
363
+ return all
364
+ }
365
+
366
+ /**
367
+ * Resolve database host from environment DATABASE_URL if set.
368
+ */
369
+ function envHost(): string | null {
370
+ if (!process.env.DATABASE_URL) {
371
+ return null
372
+ }
373
+ const url = new URL(process.env.DATABASE_URL)
374
+ return url.hostname
375
+ }
376
+
377
+ export const DB = {
378
+ create,
379
+ customerDbs,
380
+ destroy,
381
+ disconnectAll,
382
+ envHost,
383
+ exists,
384
+ findName,
385
+ get,
386
+ getConfig,
387
+ getKnexConfig,
388
+ getMaster,
389
+ getMasterConfig,
390
+ getRoot,
391
+ getRootConfig,
392
+ isValidName,
393
+ migrate,
394
+ migrateMaster,
395
+ rollback
396
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Database connectivity and utilities.
3
+ *
4
+ * @module tasenor-common-node/src/database
5
+ */
6
+ export * from './BookkeeperImporter'
7
+ export * from './DB'
package/src/doccer.ts ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ *
3
+ * # Tasenor Common for Node
4
+ *
5
+ * Type definitions and functionality implementation for Node.
6
+ *
7
+ * An interactive stateful process is a backend system which handles a process with a
8
+ * states, but the transition from one state to another could need user input from
9
+ * the client - e.g. web browser.
10
+ *
11
+ * ## Sub-modules
12
+ *
13
+ * * [cli](tasenor_common_node_src_cli.html)
14
+ * * [database](tasenor_common_node_src_database.html)
15
+ * * [export](tasenor_common_node_src_export.html)
16
+ * * [import](tasenor_common_node_src_import.html)
17
+ * * [net](tasenor_common_node_src_net.html)
18
+ * * [plugins](tasenor_common_node_src_plugins.html)
19
+ * * [reports](tasenor_common_node_src_reports.html)
20
+ * * [system](tasenor_common_node_src_system.html)
21
+ * * [common](tasenor_common_node_src_common.html)
22
+ * * [error](tasenor_common_node_src_error.html)
23
+ * * [import](tasenor_common_node_src_import.html)
24
+ * * [process](tasenor_common_node_src_process.html)
25
+ * * [server](tasenor_common_node_src_server.html)
26
+ *
27
+ * @module tasenor-common-node
28
+ */
29
+ export * from './index'
package/src/error.ts ADDED
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Error types for processing and an exception used to ask more information from UI.
3
+ *
4
+ * @module tasenor-common-node/src/error
5
+ */
6
+
7
+ import { TasenorElement } from '@dataplug/tasenor-common'
8
+
9
+ export class ProcessingError extends Error {}
10
+ export class InvalidFile extends ProcessingError {}
11
+ export class InvalidArgument extends ProcessingError {}
12
+ export class BadState extends ProcessingError {}
13
+ export class NotImplemented extends ProcessingError {}
14
+ export class NotFound extends ProcessingError {}
15
+ export class DatabaseError extends ProcessingError {}
16
+ export class SystemError extends ProcessingError {}
17
+
18
+ /**
19
+ * Special exception to halt processing in order to require more configuration information from UI.
20
+ */
21
+ export class AskUI extends Error {
22
+ public element: TasenorElement
23
+
24
+ constructor(element: TasenorElement) {
25
+ super('Need more information from UI.')
26
+ this.element = element
27
+ }
28
+ }
29
+
30
+ export function isAskUI(obj: unknown): obj is AskUI {
31
+ return (obj instanceof Error) && 'element' in obj
32
+ }
@@ -0,0 +1,136 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import path from 'path'
3
+ import fs from 'fs'
4
+ import { KnexDatabase } from '..'
5
+ import { log, ParsedTsvFileData, BookkeeperConfig, DirectoryPath, TsvFilePath, JsonFilePath, Json, Value, TarFilePath } from '@dataplug/tasenor-common'
6
+ import { create } from 'ts-opaque'
7
+ import { system } from '../system'
8
+ import dayjs from 'dayjs'
9
+
10
+ /**
11
+ * Common functionality for exporters.
12
+ */
13
+ export class Exporter {
14
+
15
+ /**
16
+ * Version number of the file format produced by this exporter.
17
+ */
18
+ VERSION = 2
19
+
20
+ /**
21
+ * Read all accounts from the database and generate TSV-data.
22
+ * @param db Knex connection to use.
23
+ * @returns
24
+ */
25
+ async getAccounts(db: KnexDatabase): Promise<ParsedTsvFileData> {
26
+ throw new Error(`Exporter ${this.constructor.name} does not implement getAccounts().`)
27
+ }
28
+
29
+ /**
30
+ * Read all periods from the database and generate TSV-data.
31
+ * @param db Knex connection to use.
32
+ * @returns
33
+ */
34
+ async getPeriods(db: KnexDatabase): Promise<ParsedTsvFileData> {
35
+ throw new Error(`Exporter ${this.constructor.name} does not implement getPeriods().`)
36
+ }
37
+
38
+ /**
39
+ * Read all entries and documents from the database and generate TSV-data.
40
+ * @param db Knex connection to use.
41
+ * @returns
42
+ */
43
+ async getEntries(db: KnexDatabase): Promise<ParsedTsvFileData> {
44
+ throw new Error(`Exporter ${this.constructor.name} does not implement getEntries().`)
45
+ }
46
+
47
+ /**
48
+ * Read configuration information from database and construct compiled configuration.
49
+ * @param db Knex connection to use.
50
+ * @returns
51
+ */
52
+ async getConfig(db: KnexDatabase): Promise<BookkeeperConfig> {
53
+ throw new Error(`Exporter ${this.constructor.name} does not implement getConfig().`)
54
+ }
55
+
56
+ /**
57
+ * Read all tags from the database and generate TSV-data.
58
+ * @param db Knex connection to use.
59
+ * @param out Directory to write image files.
60
+ * @returns
61
+ */
62
+ async getTags(db: KnexDatabase, out: DirectoryPath): Promise<ParsedTsvFileData> {
63
+ throw new Error(`Exporter ${this.constructor.name} does not implement getTags().`)
64
+ }
65
+
66
+ /**
67
+ * Write prepared data to TSV file.
68
+ * @param path Output file path.
69
+ * @param lines Data content.
70
+ */
71
+ writeTsv(path: TsvFilePath, lines: ParsedTsvFileData): void {
72
+ log(`Writing ${path}`)
73
+ fs.writeFileSync(path, lines.map(l => l.join('\t')).join('\n') + '\n')
74
+ }
75
+
76
+ /**
77
+ * Write prepared data to JSON file.
78
+ * @param path Output file path.
79
+ * @param lines Data content.
80
+ */
81
+ writeJson(path: JsonFilePath, data: Json): void {
82
+ log(`Writing ${path}`)
83
+ fs.writeFileSync(path, JSON.stringify(data, null, 4) + '\n')
84
+ }
85
+
86
+ /**
87
+ * Save complete backup of the Sqlite database to the given directory.
88
+ * @param db Database connection.
89
+ * @param out Directory to store all files.
90
+ * @returns Configuration constructed from the database.
91
+ */
92
+ async dump(db: KnexDatabase, out: DirectoryPath): Promise<BookkeeperConfig> {
93
+
94
+ const accountDir = path.join(out, 'accounts')
95
+ if (!fs.existsSync(accountDir)) {
96
+ fs.mkdirSync(accountDir)
97
+ }
98
+ log(`Saving file format version ${this.VERSION}.`)
99
+ this.writeJson(create(path.join(out, 'VERSION')), this.VERSION)
100
+ const conf = await this.getConfig(db)
101
+ this.writeJson(create(path.join(out, 'settings.json')), conf as unknown as Value)
102
+ const accounts = await this.getAccounts(db)
103
+ this.writeTsv(create(path.join(accountDir, 'fi-EUR.tsv')), accounts)
104
+ const periods = await this.getPeriods(db)
105
+ this.writeTsv(create(path.join(out, 'periods.tsv')), periods)
106
+ const entries = await this.getEntries(db)
107
+ this.writeTsv(create(path.join(out, 'entries.tsv')), entries)
108
+ const tags = await this.getTags(db, out)
109
+ this.writeTsv(create(path.join(out, 'tags.tsv')), tags)
110
+
111
+ return conf
112
+ }
113
+
114
+ /**
115
+ * Construct a tar-package for the given configuration from the source directory.
116
+ * @param conf Configuration found from the database.
117
+ * @param out Directory containing files extracted as a backup.
118
+ * @param destPath Destionation file name if given.
119
+ * @returns Path to the tar-package.
120
+ */
121
+ async makeTar(conf: BookkeeperConfig, out: DirectoryPath, destPath: DirectoryPath | undefined): Promise<TarFilePath> {
122
+ const name = conf.companyName || 'unknown'
123
+ const tar = `${name.replace(/[^-a-zA-Z0-9]/, '_')}-${dayjs().format('YYYY-MM-DD')}.tasenor`
124
+ const tarPath = `${out}/../${tar}`
125
+ const dest = process.cwd()
126
+ if (!destPath) {
127
+ destPath = create<DirectoryPath>(path.join(dest, tar))
128
+ }
129
+ if (path.dirname(destPath) === '.') {
130
+ destPath = create<DirectoryPath>(path.join(dest, path.basename(destPath)))
131
+ }
132
+ await system(`cd "${out}" && tar cjf "${tarPath}" . && mv "${tarPath}" "${destPath}" && rm -fr ${out}`)
133
+ log(`Package ready ${destPath}`)
134
+ return destPath as unknown as TarFilePath
135
+ }
136
+ }