@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,131 @@
1
+ /* eslint-disable camelcase */
2
+ import { sprintf } from 'sprintf-js'
3
+ import { Command } from '.'
4
+ import { ArgumentParser } from 'argparse'
5
+ import { AccountNumber, Asset, DocumentModelData, EntryModelData, log, PeriodModelData, StockValueData, warning } from '@dataplug/tasenor-common'
6
+ import clone from 'clone'
7
+
8
+ class BalanceCommand extends Command {
9
+
10
+ addArguments(parser: ArgumentParser): void {
11
+ const sub = parser.add_subparsers()
12
+
13
+ const ls = sub.add_parser('ls', { help: 'List account balances' })
14
+ ls.set_defaults({ subCommand: 'ls' })
15
+ ls.add_argument('db', { help: 'Name of the database' })
16
+ ls.add_argument('period', { help: 'Period year, date or ID' })
17
+
18
+ const create = sub.add_parser('create', { help: 'Initialize account balances' })
19
+ create.set_defaults({ subCommand: 'create' })
20
+ create.add_argument('--force', '-f', { action: 'store_true', help: 'If given, allow invalid entries to be created', required: false })
21
+ create.add_argument('--map', { help: 'Remap account numbers using JSON or @filepath mapping', required: false })
22
+ create.add_argument('--stock', { nargs: '*', help: 'Define initial stock using JSON or @filepath mapping', required: false })
23
+ create.add_argument('--text', { help: 'A description for the transaction', required: false })
24
+ create.add_argument('db', { help: 'Name of the database' })
25
+ create.add_argument('data', { help: 'A JSON data or @filepath for balances' })
26
+ }
27
+
28
+ async ls() {
29
+ const { db, period, verbose } = this.args
30
+ const periodId = await this.periodId(db, period)
31
+ const resp: PeriodModelData = await this.get(`/db/${db}/period/${periodId}`)
32
+ await this.readAccounts(db)
33
+ if (!verbose && resp.balances) {
34
+ this.out('balance', resp.balances.reduce((prev, cur) => ({ ...prev, [cur.number as string]: cur.total }), {}))
35
+ return
36
+ }
37
+ this.out('balance', resp)
38
+ }
39
+
40
+ print(data: Record<AccountNumber, number>) {
41
+ Object.keys(data).sort().forEach(number => {
42
+ console.log(number, this.accounts[number].name, '\t', sprintf('%.2f', data[number] / 100))
43
+ })
44
+ }
45
+
46
+ async create() {
47
+ const { db, data, map, stock, text, force } = this.args
48
+ if (!db) {
49
+ throw new Error(`Invalid database argument ${JSON.stringify(db)}`)
50
+ }
51
+
52
+ const dataArg: Record<AccountNumber, number> = await this.jsonData(data) as Record<AccountNumber, number>
53
+ const mapArg: Record<AccountNumber, AccountNumber> = (map ? await this.jsonData(map) : {}) as Record<AccountNumber, AccountNumber>
54
+ const period: PeriodModelData = await this.singlePeriod(db)
55
+ const stockArg: Record<AccountNumber, Partial<Record<Asset, StockValueData>>> = await this.jsonData(stock) as Record<AccountNumber, Partial<Record<Asset, StockValueData>>>
56
+
57
+ // Check if the DB is clean.
58
+ const docs: DocumentModelData[] = await this.get(`/db/${db}/document`)
59
+ if (docs.filter(d => d.number !== 0).length && !force) {
60
+ throw new Error('There are already non-initial transactions in the database and cannot be initialized anymore.')
61
+ }
62
+ // Ensure zero balance.
63
+ const sum = Object.values(dataArg).reduce((prev: number, cur: number) => prev + cur, 0)
64
+ if (sum) {
65
+ if (force) {
66
+ warning(`Initial balance total must be zero. Got ${sum} from ${JSON.stringify(dataArg)}.`)
67
+ } else {
68
+ throw new Error(`Initial balance total must be zero. Got ${sum} from ${JSON.stringify(dataArg)}.`)
69
+ }
70
+ }
71
+
72
+ // Ensure all accounts are valid.
73
+ for (const account of Object.keys(dataArg)) {
74
+ // Zero balance accounts not needed.
75
+ if (!dataArg[account]) {
76
+ continue
77
+ }
78
+ await this.accountId(db, mapArg[account] || account)
79
+ }
80
+
81
+ // Create initial doc.
82
+ const document: DocumentModelData = (docs.length > 0)
83
+ ? docs[0]
84
+ : await this.post(`/db/${db}/document`, {
85
+ period_id: period.id,
86
+ date: this.date(period.start_date),
87
+ number: 0
88
+ })
89
+ log(`Created a document #${document.id} on ${period.start_date}.`)
90
+ // Create entries.
91
+ const description = this.str(text) || 'Initial balance'
92
+ for (const account of Object.keys(dataArg)) {
93
+ const destAccount = mapArg[account] || account
94
+
95
+ // Skip zeroes.
96
+ if (!dataArg[account]) {
97
+ log(`Skipping an entry ${destAccount} ${description} ${sprintf('%.2f', 0)}.`)
98
+ continue
99
+ }
100
+ const entry: EntryModelData = {
101
+ document_id: document.id,
102
+ account_id: await this.accountId(db, destAccount),
103
+ debit: dataArg[account] >= 0 ? 1 : 0,
104
+ amount: Math.abs(dataArg[account]),
105
+ description
106
+ }
107
+ // Add stock if given.
108
+ if (stockArg[destAccount]) {
109
+ entry.data = {
110
+ stock: {
111
+ set: clone(stockArg[destAccount])
112
+ }
113
+ }
114
+ delete stockArg[destAccount]
115
+ }
116
+ // Add data if known.
117
+ const out: EntryModelData = await this.post(`/db/${db}/entry`, entry as unknown as Record<string, unknown>)
118
+ log(`Created an entry #${out.id} for ${destAccount} ${description} ${sprintf('%.2f', dataArg[account] / 100)}${entry.data ? ' ' + JSON.stringify(entry.data) : ''}.`)
119
+ }
120
+
121
+ if (Object.keys(stockArg).length) {
122
+ throw new Error(`Unused initial stocks for accounts ${Object.keys(stockArg).join(', ')}`)
123
+ }
124
+ }
125
+
126
+ async run() {
127
+ await this.runBy('subCommand')
128
+ }
129
+ }
130
+
131
+ export default BalanceCommand
@@ -0,0 +1,84 @@
1
+ import { DatabaseModelData, FilePath, log } from '@dataplug/tasenor-common'
2
+ import { ArgumentParser } from 'argparse'
3
+ import fs from 'fs'
4
+ import { Command } from '.'
5
+
6
+ class DbCommand extends Command {
7
+
8
+ addArguments(parser: ArgumentParser): void {
9
+ const sub = parser.add_subparsers()
10
+
11
+ const ls = sub.add_parser('ls', { help: 'List all databases' })
12
+ ls.set_defaults({ subCommand: 'ls' })
13
+
14
+ const create = sub.add_parser('create', { help: 'Create a database' })
15
+ create.set_defaults({ subCommand: 'create' })
16
+ create.add_argument('scheme', { help: 'Bookkeeping scheme plugin code' })
17
+ create.add_argument('databaseName', { help: 'Name of the new database' })
18
+ create.add_argument('companyName', { nargs: '?', help: 'Name of the company (optional)' })
19
+ create.add_argument('companyCode', { nargs: '?', help: 'Registration code of the company (optional)' })
20
+ create.add_argument('language', { nargs: '?', help: 'Database language (optional)' })
21
+ create.add_argument('currency', { nargs: '?', help: 'Currency (optional)' })
22
+
23
+ const rm = sub.add_parser('rm', { help: 'Delete a database' })
24
+ rm.set_defaults({ subCommand: 'rm' })
25
+ rm.add_argument('databaseName', { help: 'Name of the database' })
26
+
27
+ const upload = sub.add_parser('upload', { help: 'Upload a database' })
28
+ upload.set_defaults({ subCommand: 'upload' })
29
+ upload.add_argument('path', { help: 'Path to the file to upload' })
30
+
31
+ const download = sub.add_parser('download', { help: 'Download a database' })
32
+ download.set_defaults({ subCommand: 'download' })
33
+ download.add_argument('databaseName', { help: 'Name of the database' })
34
+ download.add_argument('path', { help: 'Path to the file to save' })
35
+ }
36
+
37
+ async ls() {
38
+ const resp = await this.get('/db')
39
+ this.out('db', resp)
40
+ }
41
+
42
+ print(data: DatabaseModelData[]): void {
43
+ for (const db of data) {
44
+ console.log(db.name)
45
+ }
46
+ }
47
+
48
+ async rm() {
49
+ const { databaseName } = this.args
50
+ await this.delete(`/db/${databaseName}`)
51
+ log(`Database ${databaseName} deleted successfully.`)
52
+ }
53
+
54
+ async create() {
55
+ const { scheme, databaseName, companyName, companyCode, language, currency } = this.args
56
+ const settings = {
57
+ language, currency
58
+ }
59
+ const params = { scheme, databaseName, companyName, companyCode, settings }
60
+ await this.post('/db', params)
61
+ log(`Database ${databaseName} created successfully.`)
62
+ }
63
+
64
+ async upload() {
65
+ const { path } = this.args
66
+ if (!path || !fs.existsSync(this.str(path))) {
67
+ throw new Error(`File path ${path} does not exist.`)
68
+ }
69
+ await this.postUpload('/db/upload', path as FilePath)
70
+ log(`Database ${path} uploaded successfully.`)
71
+ }
72
+
73
+ async download() {
74
+ const { path, databaseName } = this.args
75
+ await this.getDownload(`/db/${databaseName}/download`, this.str(path) as FilePath)
76
+ log(`Database ${databaseName} downloaded successfully and saved to ${path}.`)
77
+ }
78
+
79
+ async run() {
80
+ await this.runBy('subCommand')
81
+ }
82
+ }
83
+
84
+ export default DbCommand
@@ -0,0 +1,117 @@
1
+ /* eslint-disable camelcase */
2
+ import { sprintf } from 'sprintf-js'
3
+ import { Command } from '.'
4
+ import { ArgumentParser } from 'argparse'
5
+ import { EntryModelData, log } from '@dataplug/tasenor-common'
6
+
7
+ class EntryCommand extends Command {
8
+
9
+ addArguments(parser: ArgumentParser): void {
10
+ const sub = parser.add_subparsers()
11
+
12
+ const ls = sub.add_parser('ls', { help: 'Find entries matching the filter' })
13
+ ls.set_defaults({ subCommand: 'ls' })
14
+ ls.add_argument('--account', { help: 'Match to this account number', required: false })
15
+ ls.add_argument('--text', { help: 'Match to this exact description', required: false })
16
+ ls.add_argument('--period', { help: 'Match to period with this date/year/id', required: false })
17
+ ls.add_argument('db', { help: 'Name of the database' })
18
+
19
+ const edit = sub.add_parser('edit', { help: 'Change entries matching the filter' })
20
+ edit.set_defaults({ subCommand: 'edit' })
21
+ edit.add_argument('--account', { help: 'Match to this account number', required: false })
22
+ edit.add_argument('--text', { help: 'Match to this exact description', required: false })
23
+ edit.add_argument('--period', { help: 'Match to period with this date/year/id', required: false })
24
+ edit.add_argument('db', { help: 'Name of the database' })
25
+ edit.add_argument('data', { help: 'JSON data for patching the entry' })
26
+
27
+ const rm = sub.add_parser('rm', { help: 'Remove entries matching the filter' })
28
+ rm.set_defaults({ subCommand: 'rm' })
29
+ rm.add_argument('--account', { help: 'Match to this account number', required: false })
30
+ rm.add_argument('--text', { help: 'Match to this exact description', required: false })
31
+ rm.add_argument('--period', { help: 'Match to period with this date/year/id', required: false })
32
+ rm.add_argument('--all', { help: 'Delete the whole transaction that includes the matching line.', action: 'store_true', required: false })
33
+ rm.add_argument('db', { help: 'Name of the database' })
34
+ }
35
+
36
+ async filter(): Promise<EntryModelData[]> {
37
+ const { db, account, text, period } = this.args
38
+ await this.readAccounts(db)
39
+ const query: string[] = []
40
+ if (account) {
41
+ const id = await this.accountId(db, account)
42
+ query.push(`account_id=${id}`)
43
+ }
44
+ if (text) {
45
+ query.push(`text=${encodeURIComponent(text as string)}`)
46
+ }
47
+ if (period) {
48
+ const id = await this.periodId(db, period)
49
+ query.push(`period_id=${id}`)
50
+ }
51
+ return this.get(`/db/${db}/entry${query.length ? '?' + query.join('&') : ''}`)
52
+ }
53
+
54
+ async ls() {
55
+ const resp = await this.filter()
56
+ this.out('entry', resp)
57
+ }
58
+
59
+ print(data: EntryModelData[]): void {
60
+ for (const entry of data) {
61
+ const { id, account_id, debit, amount, description } = entry
62
+ console.log(`#${id} ${this.accountsById[account_id || -1].number} ${this.accountsById[account_id || -1].name}`)
63
+ console.log(' ', sprintf('%.2f', debit ? amount / 100 : amount / -100), '\t', description)
64
+ if (entry.data && Object.keys(entry.data).length) {
65
+ console.log(' ', JSON.stringify(entry.data))
66
+ }
67
+ }
68
+ }
69
+
70
+ async edit() {
71
+ const { db, data } = this.args
72
+ const params = await this.jsonData(data)
73
+ for (const key of Object.keys(params)) {
74
+ switch (key) {
75
+ case 'data':
76
+ case 'description':
77
+ break
78
+ case 'account':
79
+ params.account_id = await this.accountId(db, `${params[key]}`)
80
+ delete params.account
81
+ break
82
+ default:
83
+ throw new Error(`No handler yet for entry data '${key}'.`)
84
+ }
85
+ }
86
+ const resp: EntryModelData[] = await this.filter()
87
+ for (const entry of resp) {
88
+ const newParams = { ...params, data: Object.assign({}, entry.data, params.data) }
89
+ log(`Changing entry #${entry.id} to have ${JSON.stringify(newParams)}`)
90
+ await this.patch(`/db/${db}/entry/${entry.id}`, newParams)
91
+ }
92
+ }
93
+
94
+ async rm() {
95
+ const { db } = this.args
96
+ const resp: EntryModelData[] = await this.filter()
97
+ if (this.args.all) {
98
+ const docIds = new Set()
99
+ for (const entry of resp) {
100
+ docIds.add(entry.document_id)
101
+ }
102
+ for (const id of docIds) {
103
+ await this.delete(`/db/${db}/document/${id}`)
104
+ }
105
+ } else {
106
+ for (const entry of resp) {
107
+ await this.delete(`/db/${db}/entry/${entry.id}`)
108
+ }
109
+ }
110
+ }
111
+
112
+ async run() {
113
+ await this.runBy('subCommand')
114
+ }
115
+ }
116
+
117
+ export default EntryCommand
@@ -0,0 +1,160 @@
1
+ /* eslint-disable camelcase */
2
+ import fs from 'fs'
3
+ import mime from 'mime-types'
4
+ import { Command } from '.'
5
+ import { ArgumentParser } from 'argparse'
6
+ import { ImportState, ProcessConfig, ProcessModelData, ProcessStepModelData, RuleEditorElement, TransactionDescription, error, log } from '@dataplug/tasenor-common'
7
+
8
+ type ProcessPostResponse = { processId: number, step: number, status: string }
9
+ type ProcessGetResponse = { steps: ProcessStepModelData[] }
10
+
11
+ class ImportCommand extends Command {
12
+
13
+ addArguments(parser: ArgumentParser): void {
14
+ const sub = parser.add_subparsers()
15
+
16
+ const ls = sub.add_parser('ls', { help: 'List all imports' })
17
+ ls.set_defaults({ subCommand: 'ls' })
18
+ ls.add_argument('db', { help: 'Name of the database' })
19
+ ls.add_argument('name', { help: 'Name of the importer' })
20
+
21
+ const show = sub.add_parser('show', { help: 'Display import process in detail' })
22
+ show.set_defaults({ subCommand: 'show' })
23
+ show.add_argument('db', { help: 'Name of the database' })
24
+ show.add_argument('name', { help: 'Name of the importer' })
25
+ show.add_argument('id', { help: 'Import number' })
26
+
27
+ const create = sub.add_parser('create', { help: 'Import a file' })
28
+ create.set_defaults({ subCommand: 'create' })
29
+ create.add_argument('--first', { help: 'First date of the allowed period YYYY-MM-DD', default: '1900-01-01' })
30
+ create.add_argument('--last', { help: 'Final date of the allowed period YYYY-MM-DD', default: '2999-12-31' })
31
+ create.add_argument('--answers', { help: 'Answer file', required: false })
32
+ create.add_argument('db', { help: 'Name of the database' })
33
+ create.add_argument('name', { help: 'Name of the importer' })
34
+ create.add_argument('file', { help: 'Path to the file(s) to import', nargs: '+' })
35
+ }
36
+
37
+ async ls() {
38
+ const { db, name } = this.args
39
+ const importer = await this.importer(db, name)
40
+ const resp = await this.get(`/db/${db}/import/${importer.id}`)
41
+ this.out('import', resp)
42
+ }
43
+
44
+ async show() {
45
+ const { db, name, id } = this.args
46
+ const importer = await this.importer(db, name)
47
+ const resp = await this.get(`/db/${db}/import/${importer.id}/process/${id}`) as ProcessGetResponse
48
+
49
+ const steps: (ProcessStepModelData & { state: ImportState})[] = []
50
+
51
+ for (const step of resp.steps) {
52
+ const resp = await this.get(`/db/${db}/import/${importer.id}/process/${id}/step/${step.number}`) as { state: ImportState }
53
+ steps.push({ ...step, state: resp.state as ImportState })
54
+ }
55
+
56
+ for (const step of steps) {
57
+ if (step.directions && step.directions.element) {
58
+ const element: RuleEditorElement = step.directions.element as RuleEditorElement
59
+ if (element.config) {
60
+ element.config = '* * * config * * *' as unknown as ProcessConfig
61
+ }
62
+ }
63
+ }
64
+
65
+ if (this.args.json) {
66
+ this.out('import', steps)
67
+ } else {
68
+ for (const step of steps) {
69
+ const state = step.state
70
+ console.log()
71
+ console.log(`Step #${step.number}`)
72
+ console.log('Action:', step.action)
73
+ console.log('Direction:', step.directions && step.directions.type)
74
+ console.log('State:')
75
+ console.log(` Files: ${Object.keys(state.files).join(', ')}`)
76
+ console.log(` Stage: ${state.stage}`)
77
+ if (state.output) {
78
+ console.log(' Output:', state.output)
79
+ }
80
+ if (state.segments) {
81
+ console.log(` Segments: ${Object.keys(state.segments).join(', ')}`)
82
+ }
83
+ if (state.result !== undefined) {
84
+ console.log(' Results:')
85
+ Object.keys(state.result).forEach(segmentId => {
86
+ console.log(`=== ${segmentId} ===`)
87
+ const result: TransactionDescription = state.result as TransactionDescription
88
+ console.dir(result[segmentId], { depth: null })
89
+ })
90
+ }
91
+ // console.log()
92
+ // console.log(step.state)
93
+ // console.log()
94
+ }
95
+ }
96
+
97
+ }
98
+
99
+ async create() {
100
+ const { db, name, file, answers, first, last } = this.args
101
+ const importer = await this.importer(db, name)
102
+ const encoding = 'base64'
103
+ const files: Record<string, string>[] = []
104
+ for (const filePath of (file || [])) {
105
+ const data = fs.readFileSync(filePath).toString(encoding)
106
+ files.push({
107
+ name: filePath,
108
+ encoding,
109
+ type: mime.lookup(filePath),
110
+ data
111
+ })
112
+ }
113
+ const answersArg = answers ? await this.jsonData(answers) : null
114
+
115
+ const resp: ProcessPostResponse = await this.post(`/db/${db}/importer/${importer.id}`, {
116
+ firstDate: first,
117
+ lastDate: last,
118
+ files
119
+ })
120
+ this.out('import', resp)
121
+
122
+ if (answersArg) {
123
+ log(`Uploading answers to process #${resp.processId}`)
124
+ const resp2 = await this.post(`/db/${db}/import/${importer.id}/process/${resp.processId}`, {
125
+ answer: answersArg
126
+ })
127
+ this.out('import', resp2)
128
+ }
129
+ }
130
+
131
+ print(data: ProcessModelData[] | ProcessPostResponse) {
132
+ if ('processId' in data && 'step' in data) {
133
+ log(`Process ID: ${data.processId}, Step: ${data.step}, ${data.status}`)
134
+ return
135
+ }
136
+ if ('processId' in data && 'status' in data && data.length === undefined) {
137
+ if (data.status === 'CRASHED') {
138
+ error(`Process ID: ${data.processId}, ${data.status}`)
139
+ } else {
140
+ log(`Process ID: ${data.processId}, ${data.status}`)
141
+ }
142
+ return
143
+ }
144
+ for (const imp of data.sort((a, b) => (a.id || 0) - (b.id || 0))) {
145
+ const { id, name, status, error } = imp
146
+ console.log(`#${id} ${name} ${status}`)
147
+ if (error) {
148
+ console.log(' ', error)
149
+ }
150
+ console.log()
151
+ }
152
+
153
+ }
154
+
155
+ async run() {
156
+ await this.runBy('subCommand')
157
+ }
158
+ }
159
+
160
+ export default ImportCommand
@@ -0,0 +1,84 @@
1
+ /* eslint-disable camelcase */
2
+ import { ImporterModelData, log } from '@dataplug/tasenor-common'
3
+ import { Command } from '.'
4
+ import { ArgumentParser } from 'argparse'
5
+
6
+ class ImporterCommand extends Command {
7
+
8
+ addArguments(parser: ArgumentParser): void {
9
+ const sub = parser.add_subparsers()
10
+
11
+ const ls = sub.add_parser('ls', { help: 'List all importers' })
12
+ ls.set_defaults({ subCommand: 'ls' })
13
+ ls.add_argument('db', { help: 'Name of the database' })
14
+
15
+ const create = sub.add_parser('create', { help: 'Create an importer' })
16
+ create.set_defaults({ subCommand: 'create' })
17
+ create.add_argument('db', { help: 'Name of the database' })
18
+ create.add_argument('name', { help: 'Name of the importer' })
19
+ create.add_argument('plugin', { help: 'Code of the import handler plugin' })
20
+
21
+ const set = sub.add_parser('set', { help: 'Set configuration variable for an importer' })
22
+ set.set_defaults({ subCommand: 'set' })
23
+ set.add_argument('db', { help: 'Name of the database' })
24
+ set.add_argument('name', { help: 'The name of the importer' })
25
+ set.add_argument('variable', { help: 'Name of the configuration variable' })
26
+ set.add_argument('value', { help: 'Value for the configuration variable' })
27
+
28
+ const config = sub.add_parser('config', { help: 'Set whole configuration for an importer' })
29
+ config.set_defaults({ subCommand: 'config' })
30
+ config.add_argument('db', { help: 'Name of the database' })
31
+ config.add_argument('name', { help: 'The name of the importer' })
32
+ config.add_argument('config', { help: 'JSON data or @filepath for configuration' })
33
+ }
34
+
35
+ async ls() {
36
+ const { db } = this.args
37
+ const resp = await this.get(`/db/${db}/importer`)
38
+ this.out('importer', resp)
39
+ }
40
+
41
+ print(data: ImporterModelData[]): void {
42
+ for (const importer of data.sort((a, b) => (a.id || 0) - (b.id || 0))) {
43
+ const { id, name, config } = importer
44
+ console.log(`#${id} ${name}`)
45
+ if (config.rules) {
46
+ config.rules = '...skipped...'
47
+ }
48
+ console.dir(config, { depth: null })
49
+ console.log()
50
+ }
51
+ }
52
+
53
+ async create() {
54
+ const { db, name, plugin } = this.args
55
+ await this.plugin(plugin)
56
+ const code = this.str(plugin)
57
+ await this.post(`/db/${db}/importer`, { name, config: { handlers: [code] } })
58
+ log(`Importer ${name} created successfully.`)
59
+ }
60
+
61
+ async set() {
62
+ const { db, name, variable, value } = this.args
63
+ const importer = await this.importer(db, name)
64
+ const variableArg = this.str(variable)
65
+ const valueArg = this.value(value)
66
+ await this.patch(`/db/${db}/importer/${importer.id}`, { config: { [variableArg]: valueArg } })
67
+ const newImporter: ImporterModelData = await this.get(`/db/${db}/importer/${importer.id}`)
68
+ log(`Variable ${variableArg} set to ${JSON.stringify(newImporter.config[variableArg])}`)
69
+ }
70
+
71
+ async config() {
72
+ const { db, name, config } = this.args
73
+ const importer = await this.importer(db, name)
74
+ const configArg = await this.jsonData(config)
75
+ await this.patch(`/db/${db}/importer/${importer.id}`, { config: configArg })
76
+ log(`Updated configuration for importer ${name}`)
77
+ }
78
+
79
+ async run() {
80
+ await this.runBy('subCommand')
81
+ }
82
+ }
83
+
84
+ export default ImporterCommand