@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,534 @@
1
+ import fs from 'fs'
2
+ import path from 'path'
3
+ import { AccountModelData, AccountNumber, ImporterModelData, TasenorPlugin, HttpResponse, FilePath, PeriodModelData, ShortDate, TagModelData, ID } from '@dataplug/tasenor-common'
4
+ import { ArgumentParser } from 'argparse'
5
+ import FormData from 'form-data'
6
+ import axios from 'axios'
7
+
8
+ export type CommandArgument = string | null | undefined | string[]
9
+ /**
10
+ * Argument container type for commands.
11
+ */
12
+ export type CommandArguments = Record<string, CommandArgument>
13
+
14
+ /**
15
+ * Definition of argument name, corresponding environment variable and default value.
16
+ */
17
+ export type CommandArgumentDefault = {
18
+ name: string
19
+ envName: string
20
+ defaultValue: string
21
+ }
22
+
23
+ /**
24
+ * Data for creating entries.
25
+ */
26
+ export type CommandEntryData = {
27
+ account_id: ID
28
+ number?: AccountNumber
29
+ amount: number
30
+ description: string
31
+ data?: Record<string, unknown>
32
+ }
33
+
34
+ /**
35
+ * A command implementation base class.
36
+ */
37
+ export class Command {
38
+
39
+ protected cli
40
+ protected accounts: Record<AccountNumber, AccountModelData>
41
+ protected accountsById: Record<number, AccountModelData>
42
+ protected plugins: TasenorPlugin[]
43
+ protected importers: ImporterModelData[]
44
+ protected args: CommandArguments
45
+
46
+ constructor(cli) {
47
+ this.cli = cli
48
+ }
49
+
50
+ get verbose() {
51
+ return !!this.args.verbose
52
+ }
53
+
54
+ get debug() {
55
+ return !!this.args.debug
56
+ }
57
+
58
+ /**
59
+ * Add command specific arguments.
60
+ * @param parser
61
+ */
62
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
63
+ addArguments(parser: ArgumentParser): void {
64
+ // Command subclass implements.
65
+ }
66
+
67
+ /**
68
+ * Set command arguments.
69
+ * @param args
70
+ */
71
+ setArgs(args: CommandArguments) {
72
+ this.args = args
73
+ }
74
+
75
+ /**
76
+ * Default output.
77
+ * @param data
78
+ */
79
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
80
+ print(data: unknown): void {
81
+ throw new Error(`Class ${this.constructor.name} does not implement print().`)
82
+ }
83
+
84
+ /**
85
+ * Print out data structure according to the selected options.
86
+ * @param data
87
+ */
88
+ out(prefix, data) {
89
+ if (this.args.json) {
90
+ console.log(JSON.stringify(data, null, 2))
91
+ } else {
92
+ if (!this.verbose) {
93
+ try {
94
+ this.print(data)
95
+ return
96
+ } catch (err) {
97
+ // If not implemented, do default verbose output.
98
+ if (!/does not implement print/.test(`${err}`)) {
99
+ throw err
100
+ }
101
+ }
102
+ }
103
+ const print = (prefix: string, obj: unknown): void => {
104
+ if (typeof obj === 'object') {
105
+ if (obj === null) {
106
+ console.log(`${prefix} = null`)
107
+ } else if (obj instanceof Array) {
108
+ for (let i = 0; i < obj.length; i++) {
109
+ console.log(`${prefix}[${i}]`)
110
+ print(` ${prefix}[${i}]`, obj[i])
111
+ }
112
+ } else {
113
+ for (const key of Object.keys(obj)) {
114
+ print(` ${prefix}.${key}`, obj[key])
115
+ }
116
+ }
117
+ } else {
118
+ console.log(`${prefix} =`, obj)
119
+ }
120
+ }
121
+ print(prefix, data)
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Entry point for running the command.
127
+ * @param args
128
+ */
129
+ async run() {
130
+ throw new Error(`A command ${this.constructor.name} does not implement run().`)
131
+ }
132
+
133
+ /**
134
+ * Construct a form data instance for a file.
135
+ * @param filePath
136
+ * @returns
137
+ */
138
+ formForFile(filePath: FilePath): FormData {
139
+ const form = new FormData()
140
+ const buf = fs.readFileSync(filePath)
141
+ form.append('file', buf, path.basename(filePath))
142
+ return form
143
+ }
144
+
145
+ /**
146
+ * Call the GET API.
147
+ * @param api
148
+ */
149
+ async get<T>(api: string): Promise<T> {
150
+ await this.cli.login()
151
+ const resp: HttpResponse = await this.cli.request('GET', api)
152
+ if (!resp.success) {
153
+ throw new Error(`Call to GET ${api} failed: ${JSON.stringify(resp)}`)
154
+ }
155
+ return resp.data as unknown as T
156
+ }
157
+
158
+ /**
159
+ * Call the GET UI API.
160
+ * @param api
161
+ */
162
+ async getUi<T>(api: string): Promise<T> {
163
+ await this.cli.login()
164
+ const resp: HttpResponse = await this.cli.requestUi('GET', api)
165
+ if (!resp.success) {
166
+ throw new Error(`Call to GET UI ${api} failed: ${JSON.stringify(resp)}`)
167
+ }
168
+ return resp.data as unknown as T
169
+ }
170
+
171
+ /**
172
+ * Call the DELETE API.
173
+ * @param api
174
+ */
175
+ async delete<T>(api: string): Promise<T> {
176
+ await this.cli.login()
177
+ const resp: HttpResponse = await this.cli.request('DELETE', api)
178
+ if (!resp.success) {
179
+ throw new Error(`Call to DELETE ${api} failed: ${JSON.stringify(resp)}`)
180
+ }
181
+ return resp.data as unknown as T
182
+ }
183
+
184
+ /**
185
+ * Call the DELETE API.
186
+ * @param api
187
+ */
188
+ async deleteUi<T>(api: string, args: Record<string, unknown> | undefined = undefined): Promise<T> {
189
+ await this.cli.login()
190
+ const resp: HttpResponse = await this.cli.requestUi('DELETE', api, args)
191
+ if (!resp.success) {
192
+ throw new Error(`Call to DELETE UI ${api} failed: ${JSON.stringify(resp)}`)
193
+ }
194
+ return resp.data as unknown as T
195
+ }
196
+
197
+ /**
198
+ * Call the PATCH API.
199
+ * @param api
200
+ */
201
+ async patch<T>(api: string, data: FormData | Record<string, unknown>): Promise<T> {
202
+ await this.cli.login()
203
+ const resp: HttpResponse = await this.cli.request('PATCH', api, data)
204
+ if (!resp.success) {
205
+ throw new Error(`Call to PATCH ${api} failed: ${JSON.stringify(resp)}`)
206
+ }
207
+ return resp.data as unknown as T
208
+ }
209
+
210
+ /**
211
+ * Call the POST API.
212
+ * @param api
213
+ */
214
+ async post<T>(api: string, data: FormData | Record<string, unknown>): Promise<T> {
215
+ await this.cli.login()
216
+ const resp: HttpResponse = await this.cli.request('POST', api, data)
217
+ if (!resp.success) {
218
+ throw new Error(`Call to POST ${api} failed: ${JSON.stringify(resp)}`)
219
+ }
220
+ return resp.data as unknown as T
221
+ }
222
+
223
+ /**
224
+ * Call the POST UI API.
225
+ * @param api
226
+ */
227
+ async postUi<T>(api: string, data: FormData | Record<string, unknown>): Promise<T> {
228
+ await this.cli.login()
229
+ const resp: HttpResponse = await this.cli.requestUi('POST', api, data)
230
+ if (!resp.success) {
231
+ throw new Error(`Call to POST UI ${api} failed: ${JSON.stringify(resp)}`)
232
+ }
233
+ return resp.data as unknown as T
234
+ }
235
+
236
+ /**
237
+ * An alternative POST call to upload file, when its path is known.
238
+ * @param api
239
+ * @param filePath
240
+ * @returns
241
+ */
242
+ async postUpload<T>(api: string, filePath: FilePath): Promise<T> {
243
+ const form = this.formForFile(filePath)
244
+ return this.post(api, form)
245
+ }
246
+
247
+ /**
248
+ * Download URL to a file.
249
+ */
250
+ async getDownload(api: string, filePath: FilePath): Promise<void> {
251
+ await this.cli.login()
252
+ const resp = await axios({
253
+ url: `${this.cli.api}${api}`,
254
+ method: 'GET',
255
+ responseType: 'arraybuffer',
256
+ headers: {
257
+ Authorization: `Bearer ${this.cli.token}`
258
+ }
259
+ })
260
+ fs.writeFileSync(filePath, resp.data)
261
+ }
262
+
263
+ /**
264
+ * Execute member function based on the given argument.
265
+ */
266
+ async runBy(op: string) {
267
+ const cmd = this.args[op]
268
+ if (!cmd) {
269
+ this.help()
270
+ return
271
+ }
272
+ if (typeof cmd !== 'string') {
273
+ throw new Error(`Invalid operation argument ${JSON.stringify(cmd)}.`)
274
+ }
275
+ if (!this[cmd]) {
276
+ console.log(this[cmd])
277
+ throw new Error(`There is no member function '${cmd}' in command class '${this.constructor.name}'.`)
278
+ }
279
+ await this[cmd]()
280
+ }
281
+
282
+ /**
283
+ * Ensure string argument.
284
+ * @param arg
285
+ */
286
+ str(arg: CommandArgument): string {
287
+ if (arg === null || arg === undefined) {
288
+ return ''
289
+ }
290
+ if (typeof arg === 'string') {
291
+ return arg
292
+ }
293
+ return arg[0]
294
+ }
295
+
296
+ /**
297
+ * Ensure numeric argument.
298
+ * @param arg
299
+ */
300
+ num(arg: CommandArgument): number {
301
+ if (arg === null || arg === undefined) {
302
+ return 0
303
+ }
304
+ return parseFloat(this.str(arg))
305
+ }
306
+
307
+ /**
308
+ * Convert year, date or number to period ID.
309
+ * @param arg
310
+ */
311
+ async periodId(db: CommandArgument, periodArg: CommandArgument): Promise<ID> {
312
+ if (!db) {
313
+ throw new Error(`Invalid database argument ${JSON.stringify(db)}`)
314
+ }
315
+ const period = this.str(periodArg)
316
+ if (!period) {
317
+ throw new Error(`Invalid period argument ${JSON.stringify(period)}`)
318
+ }
319
+ let periods: PeriodModelData[] = await this.get(`/db/${db}/period`)
320
+ if (/^\d{4}$/.test(period)) {
321
+ const date = `${period}-06-15`
322
+ periods = periods.filter(p => p.start_date <= date && date <= p.end_date)
323
+ } else if (/^\d{4}-\d{2}-\d{2}$/.test(period)) {
324
+ periods = periods.filter(p => p.start_date <= period && period <= p.end_date)
325
+ } else if (/^\d+$/.test(period)) {
326
+ const id = parseInt(period)
327
+ periods = periods.filter(p => p.id === id)
328
+ } else {
329
+ throw new Error(`Invalid period argument ${JSON.stringify(period)}`)
330
+ }
331
+ if (periods.length > 1) {
332
+ throw new Error(`Too many periods match to ${JSON.stringify(period)}`)
333
+ }
334
+ if (!periods.length) {
335
+ throw new Error(`No periods found matching ${JSON.stringify(period)}`)
336
+ }
337
+ return periods[0].id
338
+ }
339
+
340
+ /**
341
+ * Ensure that there is only one period in the DB and return its ID.
342
+ * @param dbArg
343
+ * @returns
344
+ */
345
+ async singlePeriod(dbArg: CommandArgument): Promise<PeriodModelData> {
346
+ const period: PeriodModelData[] = await this.get(`/db/${this.str(dbArg)}/period`)
347
+ if (period.length < 1) {
348
+ throw new Error('There are no periods in the database.')
349
+ }
350
+ if (period.length > 1) {
351
+ throw new Error('There are too many periods in the database to set initial balance.')
352
+ }
353
+ return period[0]
354
+ }
355
+
356
+ /**
357
+ * Read in accounts if not yet read.
358
+ */
359
+ async readAccounts(dbArg: CommandArgument): Promise<void> {
360
+ if (!this.accounts) {
361
+ this.accounts = {}
362
+ this.accountsById = {}
363
+ const accounts: AccountModelData[] = await this.get(`/db/${this.str(dbArg)}/account`)
364
+ for (const account of accounts) {
365
+ this.accounts[account.number] = account
366
+ this.accountsById[account.id || 0] = account
367
+ }
368
+ }
369
+ }
370
+
371
+ /**
372
+ * Verify that the given number is valid account and return its ID.
373
+ * @param dbArg
374
+ * @param accountArg
375
+ */
376
+ async accountId(dbArg: CommandArgument, accountArg: CommandArgument): Promise<ID> {
377
+ await this.readAccounts(dbArg)
378
+ const num = this.str(accountArg)
379
+ if (!this.accounts[num]) {
380
+ throw new Error(`No account found matching ${JSON.stringify(accountArg)}`)
381
+ }
382
+ return this.accounts[num].id
383
+ }
384
+
385
+ /**
386
+ * Verify that argument is one or more entry descriptions.
387
+ * @param entryArg
388
+ */
389
+ async entries(dbArg: CommandArgument, entryArg: CommandArgument): Promise<CommandEntryData[]> {
390
+ if (!entryArg) {
391
+ throw new Error(`Invalid entry argument ${JSON.stringify(entryArg)}.`)
392
+ }
393
+ const entry = typeof entryArg === 'string' ? [entryArg] : entryArg
394
+ const ret: CommandEntryData[] = []
395
+ for (const e of entry) {
396
+ const match = /^\s*(\d+)\s+(.+?)\s+([-+]?\d+([,.]\d+)?)(\s+\{.*\})?$/.exec(e)
397
+ if (!match) {
398
+ throw new Error(`Invalid transaction line ${JSON.stringify(e)}`)
399
+ }
400
+ const amount = Math.round(parseFloat(match[3].replace(',', '.')) * 100)
401
+ let data
402
+ if (match[5]) {
403
+ try {
404
+ data = JSON.parse(match[5])
405
+ } catch (e) {
406
+ throw new Error(`Parsing JSON '${match[5]}' failed.`)
407
+ }
408
+
409
+ }
410
+
411
+ ret.push({
412
+ account_id: await this.accountId(dbArg, match[1]),
413
+ number: match[1] as AccountNumber,
414
+ amount,
415
+ description: match[2],
416
+ data
417
+ })
418
+ }
419
+ return ret
420
+ }
421
+
422
+ /**
423
+ * Verify that the argument is proper date.
424
+ * @param date
425
+ */
426
+ date(dateArg: CommandArgument): ShortDate {
427
+ const date = this.str(dateArg)
428
+ if (!date || !/^\d{4}-\d{2}-\d{2}$/.test(date)) {
429
+ throw new Error(`Invalid date argument ${JSON.stringify(dateArg)}`)
430
+ }
431
+ return date
432
+ }
433
+
434
+ /**
435
+ * Heuristically parse string to JSON value or string if not parseable.
436
+ * @param value
437
+ */
438
+ value(value: CommandArgument): unknown {
439
+ value = this.str(value)
440
+ try {
441
+ return JSON.parse(value)
442
+ } catch (err) {
443
+ return value
444
+ }
445
+ }
446
+
447
+ /**
448
+ * Parse either direct JSON data argument or read in file, if string starts with `@`.
449
+ * @param data
450
+ */
451
+ async jsonData(dataArg: CommandArgument): Promise<Record<string, unknown>> {
452
+ if (dataArg instanceof Array) {
453
+ const ret = {}
454
+ for (const data of dataArg) {
455
+ Object.assign(ret, await this.jsonData(data))
456
+ }
457
+ return ret
458
+ }
459
+ if (!dataArg || typeof dataArg !== 'string') {
460
+ throw new Error(`Invalid JSON data argument ${JSON.stringify(dataArg)}.`)
461
+ }
462
+ let data
463
+ if (dataArg[0] === '@') {
464
+ data = fs.readFileSync(dataArg.substring(1)).toString('utf-8')
465
+ } else {
466
+ data = dataArg
467
+ }
468
+ try {
469
+ return JSON.parse(data)
470
+ } catch (err) {
471
+ throw new Error(`Failed to parse JSON ${data.substr(0, 1000)}.`)
472
+ }
473
+ }
474
+
475
+ /**
476
+ * Read in plugin data if not yet read and return info about the plugin.
477
+ * @param pluginArg
478
+ */
479
+ async plugin(pluginArg: CommandArgument): Promise<TasenorPlugin|TasenorPlugin[]> {
480
+ if (!this.plugins) {
481
+ this.plugins = await this.getUi('/internal/plugins')
482
+ }
483
+ if (pluginArg instanceof Array) {
484
+ const result: TasenorPlugin[] = []
485
+ for (const plugin of pluginArg) {
486
+ result.push(await this.plugin(plugin) as TasenorPlugin)
487
+ }
488
+ return result
489
+ }
490
+ const code = this.str(pluginArg)
491
+ const plugin = this.plugins.filter(p => p.code === code)
492
+ if (!plugin.length) {
493
+ throw new Error(`Cannot find plugin '${code}'.`)
494
+ }
495
+ return plugin[0]
496
+ }
497
+
498
+ /**
499
+ * Get the importer.
500
+ * @param nameArg
501
+ */
502
+ async importer(dbArg: CommandArgument, nameArg: CommandArgument): Promise<ImporterModelData> {
503
+ if (!this.importers) {
504
+ this.importers = await this.get(`/db/${this.str(dbArg)}/importer`)
505
+ }
506
+ const name = this.str(nameArg)
507
+ const importer = this.importers.filter(p => p.name === name)
508
+ if (!importer.length) {
509
+ throw new Error(`Cannot find importer '${name}'.`)
510
+ }
511
+ return importer[0]
512
+ }
513
+
514
+ /**
515
+ * Find the named tag or throw an error.
516
+ * @param name
517
+ */
518
+ async tag(db: CommandArgument, name: CommandArgument): Promise<TagModelData> {
519
+ const resp: TagModelData[] = await this.get(`/db/${db}/tags`)
520
+ const match = resp.filter(tag => tag.tag === name)
521
+ if (!match.length) {
522
+ throw new Error(`Cannot find a tag '${name}.`)
523
+ }
524
+ return match[0]
525
+ }
526
+
527
+ /**
528
+ * Show help.
529
+ */
530
+ help() {
531
+ const args = this.cli.originalArgs.concat(['-h'])
532
+ this.cli.run([], args)
533
+ }
534
+ }
@@ -0,0 +1,59 @@
1
+ /* eslint-disable camelcase */
2
+ import { log, PeriodModelData } from '@dataplug/tasenor-common'
3
+ import { Command } from '.'
4
+ import { ArgumentParser } from 'argparse'
5
+
6
+ class PeriodCommand 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 periods' })
12
+ ls.set_defaults({ subCommand: 'ls' })
13
+ ls.add_argument('db', { help: 'Name of the database' })
14
+
15
+ const rm = sub.add_parser('rm', { help: 'Delete a period' })
16
+ rm.set_defaults({ subCommand: 'rm' })
17
+ rm.add_argument('db', { help: 'Name of the database' })
18
+ rm.add_argument('id', { help: 'ID of the period' })
19
+
20
+ const create = sub.add_parser('create', { help: 'Create a period' })
21
+ create.set_defaults({ subCommand: 'create' })
22
+ create.add_argument('--text', { help: 'A description for the balance transfer transaction', required: false })
23
+ create.add_argument('db', { help: 'Name of the database' })
24
+ create.add_argument('start_date', { help: 'First date of the period YYYY-MM-DD' })
25
+ create.add_argument('end_date', { help: 'Final date of the period YYYY-MM-DD' })
26
+ }
27
+
28
+ async ls() {
29
+ const { db } = this.args
30
+ const resp = await this.get(`/db/${db}/period`)
31
+ this.out('period', resp)
32
+ }
33
+
34
+ print(data: PeriodModelData[]): void {
35
+ for (const period of data.sort((a, b) => (a.id || 0) - (b.id || 0))) {
36
+ const { id, start_date, end_date } = period
37
+ console.log(`#${id} ${start_date} ${end_date}`)
38
+ }
39
+ }
40
+
41
+ async rm() {
42
+ const { db, id } = this.args
43
+ await this.delete(`/db/${db}/period/${id}`)
44
+ log(`Period ${id} deleted successfully.`)
45
+ }
46
+
47
+ async create() {
48
+ const { db, start_date, end_date, text } = this.args
49
+ const params = { start_date, end_date, text }
50
+ await this.post(`/db/${db}/period`, params)
51
+ log(`Period ${start_date}...${end_date} created successfully.`)
52
+ }
53
+
54
+ async run() {
55
+ await this.runBy('subCommand')
56
+ }
57
+ }
58
+
59
+ export default PeriodCommand
@@ -0,0 +1,95 @@
1
+ import { Command } from '.'
2
+ import { ArgumentParser } from 'argparse'
3
+ import { log, TasenorPlugin } from '@dataplug/tasenor-common'
4
+
5
+ class PluginCommand extends Command {
6
+
7
+ addArguments(parser: ArgumentParser): void {
8
+ const sub = parser.add_subparsers()
9
+
10
+ const ls = sub.add_parser('ls', { help: 'List plugins and their status' })
11
+ ls.set_defaults({ subCommand: 'ls' })
12
+ ls.add_argument('--short', '-s', { action: 'store_true', help: 'If given, show just plugin codes in one line', required: false })
13
+ ls.add_argument('--installed', '-i', { action: 'store_true', help: 'If given, show only installed plugins', required: false })
14
+
15
+ const install = sub.add_parser('install', { help: 'Install plugins' })
16
+ install.set_defaults({ subCommand: 'install' })
17
+ install.add_argument('code', { help: 'Plugin code', nargs: '+' })
18
+
19
+ const rm = sub.add_parser('rm', { help: 'Uninstall plugins' })
20
+ rm.set_defaults({ subCommand: 'rm' })
21
+ rm.add_argument('code', { help: 'Plugin code', nargs: '+' })
22
+
23
+ const rebuild = sub.add_parser('rebuild', { help: 'Rebuild UI with newly installed plugins' })
24
+ rebuild.set_defaults({ subCommand: 'rebuild' })
25
+
26
+ const reset = sub.add_parser('reset', { help: 'Remove all installed plugins' })
27
+ reset.set_defaults({ subCommand: 'reset' })
28
+
29
+ const refresh = sub.add_parser('refresh', { help: 'Reftresh the plugin list' })
30
+ refresh.set_defaults({ subCommand: 'refresh' })
31
+ }
32
+
33
+ print(data: TasenorPlugin[]) {
34
+ for (const plugin of data.sort((a, b) => parseInt(a.id + '' || '0') - parseInt(b.id + '' || '0'))) {
35
+ const { id, code, installedVersion, use, type } = plugin
36
+ console.log(`#${id} ${code} ${use} ${type} ${installedVersion ? '[v' + installedVersion + ']' : ''}`)
37
+ }
38
+ }
39
+
40
+ async ls() {
41
+ const { short, installed } = this.args
42
+ let resp: TasenorPlugin[] = await this.getUi('/internal/plugins')
43
+ if (installed) {
44
+ resp = resp.filter(plugin => plugin.installedVersion)
45
+ }
46
+ if (short) {
47
+ console.log(resp.map(plugin => plugin.code).join(' '))
48
+ return
49
+ }
50
+ this.out('plugin', resp)
51
+ }
52
+
53
+ async install() {
54
+ const { code } = this.args
55
+ const plugins: TasenorPlugin[] = await this.plugin(code) as TasenorPlugin[]
56
+ for (const plugin of plugins) {
57
+ const version = plugin.availableVersion
58
+ if (!version) {
59
+ throw new Error(`No version available of plugin ${code}.`)
60
+ }
61
+ log(`Installing plugin ${plugin.code} version ${version}`)
62
+ await this.postUi('/internal/plugins', { code: plugin.code, version })
63
+ }
64
+ }
65
+
66
+ async rm() {
67
+ const { code } = this.args
68
+ const plugins: TasenorPlugin[] = await this.plugin(code) as TasenorPlugin[]
69
+ for (const plugin of plugins) {
70
+ log(`Removing plugin ${plugin.code}`)
71
+ await this.deleteUi('/internal/plugins', { code: plugin.code })
72
+ }
73
+ }
74
+
75
+ async rebuild() {
76
+ log('Rebuilding plugins')
77
+ await this.getUi('/internal/plugins/rebuild')
78
+ }
79
+
80
+ async refresh() {
81
+ log('Refreshing plugins')
82
+ await this.getUi('/internal/plugins')
83
+ }
84
+
85
+ async reset() {
86
+ log('Removing all plugins')
87
+ await this.getUi('/internal/plugins/reset')
88
+ }
89
+
90
+ async run() {
91
+ await this.runBy('subCommand')
92
+ }
93
+ }
94
+
95
+ export default PluginCommand