shutro-erp 0.3.3 → 0.3.5

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 (412) hide show
  1. package/dist/account_portal/.kosh/bindings.js +1 -1
  2. package/dist/account_portal/.kosh/schema.d.ts +181 -3
  3. package/dist/account_portal/module.d.ts +359 -6
  4. package/dist/accounting/.kosh/bindings.js +1 -1
  5. package/dist/accounting/.kosh/schema.d.ts +181 -3
  6. package/dist/accounting/index.js +214 -2
  7. package/dist/accounting/module.d.ts +217 -5
  8. package/dist/accounting/module.js +23 -2
  9. package/dist/calendar/.kosh/bindings.d.ts +22 -0
  10. package/dist/calendar/.kosh/bindings.js +15 -0
  11. package/dist/calendar/.kosh/schema.d.ts +795 -0
  12. package/dist/calendar/demo.d.ts +6 -0
  13. package/dist/calendar/demo.js +24 -0
  14. package/dist/calendar/index.d.ts +3 -0
  15. package/dist/calendar/index.js +291 -0
  16. package/dist/calendar/module.d.ts +1705 -0
  17. package/dist/calendar/module.js +180 -0
  18. package/dist/cli/init.js +48 -0
  19. package/dist/cli/templates.d.ts +1 -1
  20. package/dist/cli/templates.js +137 -0
  21. package/dist/contacts/.kosh/bindings.js +1 -1
  22. package/dist/contacts/.kosh/schema.d.ts +205 -3
  23. package/dist/contacts/demo.js +30 -1
  24. package/dist/contacts/index.d.ts +1 -1
  25. package/dist/contacts/index.js +155 -9
  26. package/dist/contacts/module.d.ts +338 -2
  27. package/dist/contacts/module.js +82 -5
  28. package/dist/crm/.kosh/bindings.d.ts +22 -0
  29. package/dist/crm/.kosh/bindings.js +15 -0
  30. package/dist/crm/.kosh/schema.d.ts +799 -0
  31. package/dist/crm/demo.d.ts +6 -0
  32. package/dist/crm/demo.js +45 -0
  33. package/dist/crm/index.d.ts +3 -0
  34. package/dist/crm/index.js +361 -0
  35. package/dist/crm/module.d.ts +1843 -0
  36. package/dist/crm/module.js +207 -0
  37. package/dist/event/.kosh/bindings.d.ts +22 -0
  38. package/dist/event/.kosh/bindings.js +15 -0
  39. package/dist/event/.kosh/schema.d.ts +843 -0
  40. package/dist/event/demo.d.ts +6 -0
  41. package/dist/event/demo.js +65 -0
  42. package/dist/event/index.d.ts +14 -0
  43. package/dist/event/index.js +333 -0
  44. package/dist/event/mails.d.ts +15 -0
  45. package/dist/event/mails.js +112 -0
  46. package/dist/event/module.d.ts +2800 -0
  47. package/dist/event/module.js +323 -0
  48. package/dist/event/web/CheckInBox.d.ts +9 -0
  49. package/dist/event/web/CheckInBox.js +87 -0
  50. package/dist/event/web/index.d.ts +11 -0
  51. package/dist/event/web/index.js +16 -0
  52. package/dist/event/web/messages.d.ts +2 -0
  53. package/dist/event/web/messages.js +23 -0
  54. package/dist/event_account/.kosh/bindings.d.ts +22 -0
  55. package/dist/event_account/.kosh/bindings.js +15 -0
  56. package/dist/event_account/.kosh/schema.d.ts +1639 -0
  57. package/dist/event_account/index.d.ts +3 -0
  58. package/dist/event_account/index.js +28 -0
  59. package/dist/event_account/module.d.ts +6968 -0
  60. package/dist/event_account/module.js +90 -0
  61. package/dist/hr/.kosh/bindings.d.ts +22 -0
  62. package/dist/hr/.kosh/bindings.js +15 -0
  63. package/dist/hr/.kosh/schema.d.ts +878 -0
  64. package/dist/hr/demo.d.ts +6 -0
  65. package/dist/hr/demo.js +60 -0
  66. package/dist/hr/index.d.ts +3 -0
  67. package/dist/hr/index.js +483 -0
  68. package/dist/hr/module.d.ts +2611 -0
  69. package/dist/hr/module.js +350 -0
  70. package/dist/integrations/index.js +12 -0
  71. package/dist/integrations/web/OAuthAppsPage.d.ts +9 -0
  72. package/dist/integrations/web/OAuthAppsPage.js +79 -0
  73. package/dist/integrations/web/index.d.ts +1 -0
  74. package/dist/integrations/web/index.js +3 -0
  75. package/dist/integrations/web/messages.js +58 -0
  76. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  77. package/dist/l10n_bd/.kosh/schema.d.ts +181 -3
  78. package/dist/l10n_bd/module.d.ts +359 -6
  79. package/dist/l10n_in/.kosh/bindings.js +1 -1
  80. package/dist/l10n_in/.kosh/schema.d.ts +181 -3
  81. package/dist/l10n_in/module.d.ts +380 -7
  82. package/dist/maintenance/.kosh/bindings.d.ts +22 -0
  83. package/dist/maintenance/.kosh/bindings.js +15 -0
  84. package/dist/maintenance/.kosh/schema.d.ts +911 -0
  85. package/dist/maintenance/demo.d.ts +6 -0
  86. package/dist/maintenance/demo.js +60 -0
  87. package/dist/maintenance/index.d.ts +3 -0
  88. package/dist/maintenance/index.js +422 -0
  89. package/dist/maintenance/module.d.ts +3545 -0
  90. package/dist/maintenance/module.js +446 -0
  91. package/dist/maintenance_stock/.kosh/bindings.d.ts +22 -0
  92. package/dist/maintenance_stock/.kosh/bindings.js +15 -0
  93. package/dist/maintenance_stock/.kosh/schema.d.ts +1371 -0
  94. package/dist/maintenance_stock/index.d.ts +9 -0
  95. package/dist/maintenance_stock/index.js +52 -0
  96. package/dist/maintenance_stock/module.d.ts +6953 -0
  97. package/dist/maintenance_stock/module.js +192 -0
  98. package/dist/messaging/web/index.js +1 -1
  99. package/dist/modules-sdk/index.d.ts +1 -1
  100. package/dist/modules-sdk/manifest.d.ts +70 -0
  101. package/dist/modules-sdk/manifest.js +35 -1
  102. package/dist/mrp/.kosh/bindings.d.ts +22 -0
  103. package/dist/mrp/.kosh/bindings.js +15 -0
  104. package/dist/mrp/.kosh/schema.d.ts +1378 -0
  105. package/dist/mrp/demo.d.ts +7 -0
  106. package/dist/mrp/demo.js +42 -0
  107. package/dist/mrp/index.d.ts +3 -0
  108. package/dist/mrp/index.js +392 -0
  109. package/dist/mrp/module.d.ts +8608 -0
  110. package/dist/mrp/module.js +695 -0
  111. package/dist/mrp_account/.kosh/bindings.d.ts +22 -0
  112. package/dist/mrp_account/.kosh/bindings.js +15 -0
  113. package/dist/mrp_account/.kosh/schema.d.ts +2106 -0
  114. package/dist/mrp_account/index.d.ts +3 -0
  115. package/dist/mrp_account/index.js +22 -0
  116. package/dist/mrp_account/module.d.ts +20840 -0
  117. package/dist/mrp_account/module.js +123 -0
  118. package/dist/notify/web/index.js +1 -1
  119. package/dist/payment/.kosh/bindings.js +1 -1
  120. package/dist/payment/.kosh/schema.d.ts +181 -3
  121. package/dist/payment/module.d.ts +359 -6
  122. package/dist/portal/.kosh/bindings.js +1 -1
  123. package/dist/portal/.kosh/schema.d.ts +205 -3
  124. package/dist/portal/module.d.ts +166 -2
  125. package/dist/pos/.kosh/bindings.d.ts +22 -0
  126. package/dist/pos/.kosh/bindings.js +15 -0
  127. package/dist/pos/.kosh/schema.d.ts +1690 -0
  128. package/dist/pos/accounting.d.ts +10 -0
  129. package/dist/pos/accounting.js +149 -0
  130. package/dist/pos/demo.d.ts +6 -0
  131. package/dist/pos/demo.js +90 -0
  132. package/dist/pos/index.d.ts +9 -0
  133. package/dist/pos/index.js +349 -0
  134. package/dist/pos/module.d.ts +9636 -0
  135. package/dist/pos/module.js +423 -0
  136. package/dist/pos/routes.d.ts +39 -0
  137. package/dist/pos/routes.js +368 -0
  138. package/dist/pos/web/Register.d.ts +9 -0
  139. package/dist/pos/web/Register.js +252 -0
  140. package/dist/pos/web/index.d.ts +11 -0
  141. package/dist/pos/web/index.js +16 -0
  142. package/dist/pos/web/messages.d.ts +2 -0
  143. package/dist/pos/web/messages.js +87 -0
  144. package/dist/pos_stock/.kosh/bindings.d.ts +22 -0
  145. package/dist/pos_stock/.kosh/bindings.js +15 -0
  146. package/dist/pos_stock/.kosh/schema.d.ts +2015 -0
  147. package/dist/pos_stock/index.d.ts +9 -0
  148. package/dist/pos_stock/index.js +35 -0
  149. package/dist/pos_stock/module.d.ts +11935 -0
  150. package/dist/pos_stock/module.js +115 -0
  151. package/dist/product/.kosh/bindings.js +1 -1
  152. package/dist/product/.kosh/schema.d.ts +178 -1
  153. package/dist/product/index.js +81 -4
  154. package/dist/product/module.d.ts +43 -1
  155. package/dist/product/module.js +9 -2
  156. package/dist/project/.kosh/bindings.js +1 -1
  157. package/dist/project/.kosh/schema.d.ts +181 -3
  158. package/dist/project/index.js +147 -7
  159. package/dist/project/module.d.ts +210 -2
  160. package/dist/project/module.js +52 -5
  161. package/dist/project_portal/.kosh/bindings.js +1 -1
  162. package/dist/project_portal/.kosh/schema.d.ts +181 -3
  163. package/dist/project_portal/module.d.ts +353 -4
  164. package/dist/purchase/.kosh/bindings.js +1 -1
  165. package/dist/purchase/.kosh/schema.d.ts +181 -3
  166. package/dist/purchase/index.js +163 -3
  167. package/dist/purchase/module.d.ts +215 -3
  168. package/dist/purchase/module.js +21 -3
  169. package/dist/purchase_account/.kosh/bindings.js +1 -1
  170. package/dist/purchase_account/.kosh/schema.d.ts +182 -3
  171. package/dist/purchase_account/index.js +26 -1
  172. package/dist/purchase_account/module.d.ts +393 -7
  173. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  174. package/dist/purchase_portal/.kosh/schema.d.ts +181 -3
  175. package/dist/purchase_portal/module.d.ts +366 -5
  176. package/dist/purchase_stock/.kosh/bindings.d.ts +22 -0
  177. package/dist/purchase_stock/.kosh/bindings.js +15 -0
  178. package/dist/purchase_stock/.kosh/schema.d.ts +1310 -0
  179. package/dist/purchase_stock/index.d.ts +7 -0
  180. package/dist/purchase_stock/index.js +91 -0
  181. package/dist/purchase_stock/module.d.ts +6763 -0
  182. package/dist/purchase_stock/module.js +144 -0
  183. package/dist/purchase_stock_account/.kosh/bindings.d.ts +22 -0
  184. package/dist/purchase_stock_account/.kosh/bindings.js +15 -0
  185. package/dist/purchase_stock_account/.kosh/schema.d.ts +1959 -0
  186. package/dist/purchase_stock_account/index.d.ts +3 -0
  187. package/dist/purchase_stock_account/index.js +24 -0
  188. package/dist/purchase_stock_account/module.d.ts +35366 -0
  189. package/dist/purchase_stock_account/module.js +162 -0
  190. package/dist/recruitment/.kosh/bindings.d.ts +22 -0
  191. package/dist/recruitment/.kosh/bindings.js +15 -0
  192. package/dist/recruitment/.kosh/schema.d.ts +990 -0
  193. package/dist/recruitment/demo.d.ts +6 -0
  194. package/dist/recruitment/demo.js +45 -0
  195. package/dist/recruitment/index.d.ts +3 -0
  196. package/dist/recruitment/index.js +385 -0
  197. package/dist/recruitment/module.d.ts +3247 -0
  198. package/dist/recruitment/module.js +193 -0
  199. package/dist/recruitment/web/HireButton.d.ts +9 -0
  200. package/dist/recruitment/web/HireButton.js +32 -0
  201. package/dist/recruitment/web/index.d.ts +11 -0
  202. package/dist/recruitment/web/index.js +16 -0
  203. package/dist/recruitment/web/messages.d.ts +2 -0
  204. package/dist/recruitment/web/messages.js +19 -0
  205. package/dist/reporting/documents.d.ts +5 -0
  206. package/dist/reporting/documents.js +28 -1
  207. package/dist/reporting/index.d.ts +1 -1
  208. package/dist/reporting/index.js +4 -2
  209. package/dist/reporting/models.js +9 -0
  210. package/dist/reporting/overviews.d.ts +16 -0
  211. package/dist/reporting/overviews.js +56 -0
  212. package/dist/reporting/routes-documents.js +1 -1
  213. package/dist/reporting/routes.js +138 -80
  214. package/dist/reporting/web/DashboardView.d.ts +11 -0
  215. package/dist/reporting/web/DashboardView.js +2 -2
  216. package/dist/reporting/web/DesignerView.js +5 -0
  217. package/dist/reporting/web/Overview.d.ts +9 -0
  218. package/dist/reporting/web/Overview.js +53 -0
  219. package/dist/reporting/web/index.d.ts +1 -0
  220. package/dist/reporting/web/index.js +4 -1
  221. package/dist/reporting/web/messages.js +9 -0
  222. package/dist/sale_account/.kosh/bindings.js +1 -1
  223. package/dist/sale_account/.kosh/schema.d.ts +186 -3
  224. package/dist/sale_account/index.js +22 -1
  225. package/dist/sale_account/module.d.ts +461 -7
  226. package/dist/sale_portal/.kosh/bindings.js +1 -1
  227. package/dist/sale_portal/.kosh/schema.d.ts +185 -3
  228. package/dist/sale_portal/module.d.ts +434 -5
  229. package/dist/sale_project/.kosh/bindings.js +1 -1
  230. package/dist/sale_project/.kosh/schema.d.ts +187 -3
  231. package/dist/sale_project/module.d.ts +476 -6
  232. package/dist/sale_stock/.kosh/bindings.d.ts +22 -0
  233. package/dist/sale_stock/.kosh/bindings.js +15 -0
  234. package/dist/sale_stock/.kosh/schema.d.ts +1228 -0
  235. package/dist/sale_stock/index.d.ts +7 -0
  236. package/dist/sale_stock/index.js +84 -0
  237. package/dist/sale_stock/module.d.ts +6791 -0
  238. package/dist/sale_stock/module.js +146 -0
  239. package/dist/sales/.kosh/bindings.js +1 -1
  240. package/dist/sales/.kosh/schema.d.ts +185 -3
  241. package/dist/sales/index.js +191 -4
  242. package/dist/sales/module.d.ts +355 -3
  243. package/dist/sales/module.js +78 -3
  244. package/dist/server/api/metadata.d.ts +5 -0
  245. package/dist/server/api/metadata.js +5 -0
  246. package/dist/server/api/rest.js +64 -1
  247. package/dist/server/api/views.js +1 -0
  248. package/dist/server/app-settings.d.ts +7 -0
  249. package/dist/server/app-settings.js +10 -0
  250. package/dist/server/auth/base.js +85 -0
  251. package/dist/server/auth/oauth.d.ts +21 -0
  252. package/dist/server/auth/oauth.js +579 -0
  253. package/dist/server/auth/service.d.ts +4 -0
  254. package/dist/server/auth/service.js +17 -0
  255. package/dist/server/identity.d.ts +2 -0
  256. package/dist/server/images.d.ts +12 -0
  257. package/dist/server/images.js +139 -0
  258. package/dist/server/index.d.ts +2 -0
  259. package/dist/server/index.js +2 -0
  260. package/dist/server/server.d.ts +4 -0
  261. package/dist/server/server.js +9 -1
  262. package/dist/settings/app-settings.d.ts +2 -0
  263. package/dist/settings/app-settings.js +518 -0
  264. package/dist/settings/company.js +3 -1
  265. package/dist/settings/index.d.ts +1 -0
  266. package/dist/settings/index.js +15 -0
  267. package/dist/settings/people.js +32 -6
  268. package/dist/settings/web/AppSettingsPage.d.ts +11 -0
  269. package/dist/settings/web/AppSettingsPage.js +210 -0
  270. package/dist/settings/web/CompaniesPage.js +2 -2
  271. package/dist/settings/web/CompanyPage.js +13 -2
  272. package/dist/settings/web/ConnectedAppsPage.d.ts +7 -0
  273. package/dist/settings/web/ConnectedAppsPage.js +33 -0
  274. package/dist/settings/web/OverviewPage.js +28 -4
  275. package/dist/settings/web/PeoplePage.js +23 -18
  276. package/dist/settings/web/ProfilePage.js +9 -7
  277. package/dist/settings/web/index.d.ts +2 -0
  278. package/dist/settings/web/index.js +8 -0
  279. package/dist/settings/web/messages.js +146 -2
  280. package/dist/stock/.kosh/bindings.d.ts +22 -0
  281. package/dist/stock/.kosh/bindings.js +15 -0
  282. package/dist/stock/.kosh/schema.d.ts +1147 -0
  283. package/dist/stock/demo.d.ts +7 -0
  284. package/dist/stock/demo.js +55 -0
  285. package/dist/stock/index.d.ts +3 -0
  286. package/dist/stock/index.js +674 -0
  287. package/dist/stock/module.d.ts +6330 -0
  288. package/dist/stock/module.js +1325 -0
  289. package/dist/stock/web/ScanBox.d.ts +8 -0
  290. package/dist/stock/web/ScanBox.js +90 -0
  291. package/dist/stock/web/index.d.ts +11 -0
  292. package/dist/stock/web/index.js +16 -0
  293. package/dist/stock/web/messages.d.ts +2 -0
  294. package/dist/stock/web/messages.js +25 -0
  295. package/dist/stock_account/.kosh/bindings.d.ts +22 -0
  296. package/dist/stock_account/.kosh/bindings.js +15 -0
  297. package/dist/stock_account/.kosh/schema.d.ts +1875 -0
  298. package/dist/stock_account/index.d.ts +3 -0
  299. package/dist/stock_account/index.js +130 -0
  300. package/dist/stock_account/module.d.ts +10655 -0
  301. package/dist/stock_account/module.js +339 -0
  302. package/dist/storage/attachments.d.ts +5 -0
  303. package/dist/storage/attachments.js +12 -1
  304. package/dist/storage/models.js +3 -0
  305. package/dist/storage/routes.js +13 -2
  306. package/dist/todo/.kosh/bindings.d.ts +22 -0
  307. package/dist/todo/.kosh/bindings.js +15 -0
  308. package/dist/todo/.kosh/schema.d.ts +732 -0
  309. package/dist/todo/demo.d.ts +6 -0
  310. package/dist/todo/demo.js +35 -0
  311. package/dist/todo/index.d.ts +3 -0
  312. package/dist/todo/index.js +187 -0
  313. package/dist/todo/module.d.ts +1180 -0
  314. package/dist/todo/module.js +130 -0
  315. package/dist/trade_finance/.kosh/bindings.d.ts +22 -0
  316. package/dist/trade_finance/.kosh/bindings.js +15 -0
  317. package/dist/trade_finance/.kosh/schema.d.ts +884 -0
  318. package/dist/trade_finance/demo.d.ts +6 -0
  319. package/dist/trade_finance/demo.js +63 -0
  320. package/dist/trade_finance/index.d.ts +3 -0
  321. package/dist/trade_finance/index.js +413 -0
  322. package/dist/trade_finance/module.d.ts +3779 -0
  323. package/dist/trade_finance/module.js +505 -0
  324. package/dist/trade_finance_account/.kosh/bindings.d.ts +22 -0
  325. package/dist/trade_finance_account/.kosh/bindings.js +15 -0
  326. package/dist/trade_finance_account/.kosh/schema.d.ts +1711 -0
  327. package/dist/trade_finance_account/index.d.ts +3 -0
  328. package/dist/trade_finance_account/index.js +92 -0
  329. package/dist/trade_finance_account/module.d.ts +7928 -0
  330. package/dist/trade_finance_account/module.js +244 -0
  331. package/dist/trade_finance_purchase/.kosh/bindings.d.ts +22 -0
  332. package/dist/trade_finance_purchase/.kosh/bindings.js +15 -0
  333. package/dist/trade_finance_purchase/.kosh/schema.d.ts +1153 -0
  334. package/dist/trade_finance_purchase/index.d.ts +8 -0
  335. package/dist/trade_finance_purchase/index.js +50 -0
  336. package/dist/trade_finance_purchase/module.d.ts +4252 -0
  337. package/dist/trade_finance_purchase/module.js +44 -0
  338. package/dist/trade_finance_sale/.kosh/bindings.d.ts +22 -0
  339. package/dist/trade_finance_sale/.kosh/bindings.js +15 -0
  340. package/dist/trade_finance_sale/.kosh/schema.d.ts +1071 -0
  341. package/dist/trade_finance_sale/index.d.ts +8 -0
  342. package/dist/trade_finance_sale/index.js +50 -0
  343. package/dist/trade_finance_sale/module.d.ts +4280 -0
  344. package/dist/trade_finance_sale/module.js +44 -0
  345. package/dist/ui/api.d.ts +6 -1
  346. package/dist/ui/api.js +2 -1
  347. package/dist/ui/app.js +51 -17
  348. package/dist/ui/components/AppIcon.js +33 -1
  349. package/dist/ui/components/Avatar.d.ts +21 -0
  350. package/dist/ui/components/Avatar.js +71 -0
  351. package/dist/ui/components/primitives.d.ts +2 -0
  352. package/dist/ui/components/primitives.js +7 -1
  353. package/dist/ui/i18n/messages.d.ts +53 -0
  354. package/dist/ui/i18n/messages.js +98 -0
  355. package/dist/ui/index.d.ts +2 -0
  356. package/dist/ui/index.js +2 -0
  357. package/dist/ui/offline/queue.d.ts +5 -1
  358. package/dist/ui/offline/queue.js +2 -0
  359. package/dist/ui/registry.d.ts +12 -1
  360. package/dist/ui/registry.js +10 -1
  361. package/dist/ui/search/ViewTabs.d.ts +14 -0
  362. package/dist/ui/search/ViewTabs.js +42 -0
  363. package/dist/ui/shell/Consent.d.ts +5 -0
  364. package/dist/ui/shell/Consent.js +35 -0
  365. package/dist/ui/shell/Home.js +136 -16
  366. package/dist/ui/shell/Sidebar.js +15 -22
  367. package/dist/ui/views/FormView.js +98 -17
  368. package/dist/ui/views/KanbanView.d.ts +2 -0
  369. package/dist/ui/views/KanbanView.js +32 -3
  370. package/dist/ui/views/ListView.js +155 -31
  371. package/dist/ui/views/StatsRow.d.ts +14 -0
  372. package/dist/ui/views/StatsRow.js +88 -0
  373. package/dist/ui/views/widgets.d.ts +2 -1
  374. package/dist/ui/views/widgets.js +194 -1
  375. package/dist/views/builders.d.ts +19 -2
  376. package/dist/views/builders.js +21 -1
  377. package/dist/views/condition.d.ts +6 -0
  378. package/dist/views/condition.js +20 -0
  379. package/dist/views/documents.d.ts +8 -0
  380. package/dist/views/extend.d.ts +2 -2
  381. package/dist/views/extend.js +11 -1
  382. package/dist/views/index.d.ts +2 -2
  383. package/dist/views/index.js +2 -2
  384. package/dist/views/types.d.ts +52 -5
  385. package/dist/views/validate.js +39 -1
  386. package/dist/website/.kosh/bindings.d.ts +22 -0
  387. package/dist/website/.kosh/bindings.js +15 -0
  388. package/dist/website/.kosh/schema.d.ts +881 -0
  389. package/dist/website/demo.d.ts +6 -0
  390. package/dist/website/demo.js +115 -0
  391. package/dist/website/index.d.ts +9 -0
  392. package/dist/website/index.js +250 -0
  393. package/dist/website/module.d.ts +2987 -0
  394. package/dist/website/module.js +281 -0
  395. package/dist/website/render.d.ts +45 -0
  396. package/dist/website/render.js +102 -0
  397. package/dist/website/routes.d.ts +12 -0
  398. package/dist/website/routes.js +246 -0
  399. package/dist/website/web/PagePreview.d.ts +7 -0
  400. package/dist/website/web/PagePreview.js +33 -0
  401. package/dist/website/web/index.d.ts +11 -0
  402. package/dist/website/web/index.js +16 -0
  403. package/dist/website/web/messages.d.ts +2 -0
  404. package/dist/website/web/messages.js +15 -0
  405. package/dist/website_crm/.kosh/bindings.d.ts +22 -0
  406. package/dist/website_crm/.kosh/bindings.js +15 -0
  407. package/dist/website_crm/.kosh/schema.d.ts +966 -0
  408. package/dist/website_crm/index.d.ts +3 -0
  409. package/dist/website_crm/index.js +39 -0
  410. package/dist/website_crm/module.d.ts +2955 -0
  411. package/dist/website_crm/module.js +44 -0
  412. package/package.json +118 -1
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Profile photos and company logos: small images (resized to 256 px in the browser) kept in the database, so they
3
+ * work with or without file storage. PNG, JPEG or WebP only — checked by their bytes, never trusted from the name or
4
+ * the type given; at most 300 KB. Served to signed-in users with a version in the URL, so browsers cache them.
5
+ *
6
+ * - `GET /api/v1/images/:kind/:id` `kind`: `user` or `company`; the image, or 404
7
+ * - `PUT /api/v1/auth/profile/avatar` `{ image: 'data:image/…;base64,…' }`: your photo; `DELETE` removes it
8
+ * - `PUT /api/v1/images/company/:id` a company's logo (Administrator or Settings / Company, one of your
9
+ * companies); `DELETE` removes it
10
+ */
11
+ import { createHash } from 'node:crypto';
12
+ import { audit } from './audit.js';
13
+ import { HttpProblem } from './errors.js';
14
+ const MAX_BYTES = 300 * 1024;
15
+ const KINDS = { user: 'res.users', company: 'res.company' };
16
+ const images = (env) => env.model('kosh.image');
17
+ /** The image's type from its first bytes: PNG, JPEG or WebP; anything else (SVG included) is refused. */
18
+ function sniff(bytes) {
19
+ if (bytes.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])))
20
+ return 'image/png';
21
+ if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff)
22
+ return 'image/jpeg';
23
+ if (bytes.subarray(0, 4).toString('latin1') === 'RIFF' &&
24
+ bytes.subarray(8, 12).toString('latin1') === 'WEBP')
25
+ return 'image/webp';
26
+ return null;
27
+ }
28
+ /** The bytes of a `data:` URL, checked. @throws {HttpProblem} 422 */
29
+ function decode(input) {
30
+ const bad = (detail) => new HttpProblem(422, 'invalid-image', 'Invalid image', detail);
31
+ const match = typeof input === 'string'
32
+ ? /^data:image\/[a-z+.-]+;base64,([A-Za-z0-9+/=]+)$/.exec(input)
33
+ : null;
34
+ if (match === null)
35
+ throw bad('Send the image as a data URL (PNG, JPEG or WebP).');
36
+ const bytes = Buffer.from(match[1], 'base64');
37
+ if (bytes.length === 0 || bytes.length > MAX_BYTES)
38
+ throw bad('The image must be under 300 KB.');
39
+ const mime = sniff(bytes);
40
+ if (mime === null)
41
+ throw bad('Only PNG, JPEG or WebP images.');
42
+ return { bytes, mime };
43
+ }
44
+ /** The image versions of `ids` of a kind (a short digest), for URLs that change when the image does. */
45
+ export async function imageVersions(env, kind, ids) {
46
+ if (ids.length === 0)
47
+ return {};
48
+ const found = await images(env).search({
49
+ where: { ownerModel: KINDS[kind], ownerId: { in: [...ids] } },
50
+ });
51
+ const rows = found.length === 0 ? [] : (await found.load(['ownerId', 'hash'])).read(['ownerId', 'hash']);
52
+ return Object.fromEntries(rows.map((r) => [String(r['ownerId']), String(r['hash'])]));
53
+ }
54
+ async function store(env, kind, id, input) {
55
+ const existing = await images(env).search({ where: { ownerModel: KINDS[kind], ownerId: id } });
56
+ if (input === null) {
57
+ if (existing.length > 0)
58
+ await existing.unlink();
59
+ return null;
60
+ }
61
+ const { bytes, mime } = decode(input);
62
+ const hash = createHash('sha256').update(bytes).digest('hex').slice(0, 16);
63
+ const values = { mime, data: bytes.toString('base64'), hash };
64
+ if (existing.length > 0)
65
+ await existing.write(values);
66
+ else
67
+ await images(env).create([{ ownerModel: KINDS[kind], ownerId: id, ...values }]);
68
+ return hash;
69
+ }
70
+ export function registerImageRoutes(app, auth) {
71
+ app.get('/api/v1/images/:kind/:id', async (request, reply) => {
72
+ const { kind, id } = request.params;
73
+ const owner = Number(id);
74
+ if (!(kind === 'user' || kind === 'company') || !Number.isSafeInteger(owner) || owner <= 0)
75
+ throw new HttpProblem(404, 'not-found', 'Not found', 'No such image.');
76
+ const row = await request.env((env) => env.asSuperuser({ reason: 'image' }, async (su) => {
77
+ const found = await images(su).search({
78
+ where: { ownerModel: KINDS[kind], ownerId: owner },
79
+ });
80
+ return found.length === 0
81
+ ? undefined
82
+ : (await found.load(['mime', 'data', 'hash'])).read(['mime', 'data', 'hash'])[0];
83
+ }), { write: true });
84
+ if (row === undefined)
85
+ throw new HttpProblem(404, 'not-found', 'Not found', 'No image.');
86
+ const etag = `"${String(row['hash'])}"`;
87
+ reply
88
+ .header('content-type', String(row['mime']))
89
+ .header('etag', etag)
90
+ .header('x-content-type-options', 'nosniff')
91
+ // Versioned URLs (`?v=<hash>`) never change; plain ones are checked again after a minute.
92
+ .header('cache-control', request.query.v === undefined
93
+ ? 'private, max-age=60'
94
+ : 'private, max-age=31536000, immutable');
95
+ if (request.headers['if-none-match'] === etag)
96
+ return reply.status(304).send();
97
+ return reply.send(Buffer.from(String(row['data']), 'base64'));
98
+ });
99
+ const own = async (request, image) => {
100
+ const session = await auth.requireSession(request);
101
+ const hash = await request.env((env) => env.asSuperuser({ reason: 'profile photo' }, async (su) => {
102
+ const out = await store(su, 'user', session.user, image);
103
+ await audit(env, {
104
+ kind: 'auth.avatar',
105
+ summary: image === null ? 'Profile photo removed.' : 'Profile photo changed.',
106
+ targetModel: 'res.users',
107
+ targetId: session.user,
108
+ });
109
+ await su.flush();
110
+ return out;
111
+ }), { write: true });
112
+ auth.forget(session.user);
113
+ return { avatar: hash };
114
+ };
115
+ app.put('/api/v1/auth/profile/avatar', async (request) => own(request, request.body?.['image'] ?? ''));
116
+ app.delete('/api/v1/auth/profile/avatar', async (request) => own(request, null));
117
+ const logo = async (request, image) => {
118
+ const company = Number(request.params.id);
119
+ return request.env(async (env) => {
120
+ if (!env.administrator && !env.groups.has('settings.company'))
121
+ throw new HttpProblem(403, 'access', 'Company settings', 'Changing the logo needs the Administrator role or the Settings / Company access.');
122
+ if (!env.administrator && !env.companyIds.includes(company))
123
+ throw new HttpProblem(403, 'access', 'Company settings', 'Not one of your companies.');
124
+ return env.asSuperuser({ reason: 'company logo' }, async (su) => {
125
+ const hash = await store(su, 'company', company, image);
126
+ await audit(env, {
127
+ kind: 'settings.logo',
128
+ summary: image === null ? 'Company logo removed.' : 'Company logo changed.',
129
+ targetModel: 'res.company',
130
+ targetId: company,
131
+ });
132
+ await su.flush();
133
+ return { logo: hash };
134
+ });
135
+ }, { write: true });
136
+ };
137
+ app.put('/api/v1/images/company/:id', async (request) => logo(request, request.body?.['image'] ?? ''));
138
+ app.delete('/api/v1/images/company/:id', async (request) => logo(request, null));
139
+ }
@@ -11,6 +11,7 @@ export { type FoundRecord, type MenuNode, moduleVisible, Navigation } from './ap
11
11
  export { fieldSchema, openApiDocument, openApiOf } from './api/openapi.js';
12
12
  export { readApiRecord, registerRestApi } from './api/rest.js';
13
13
  export { type ServedView, type ViewField, ViewRegistry } from './api/views.js';
14
+ export { installationSetting } from './app-settings.js';
14
15
  export { APPS_CHANNEL, APPS_LOG_TABLE, APPS_TABLE, type AppLoadContext, type ApplyAppsOptions, type AppsResult, applyApps, appsDigest, appTableStatements, FRAMEWORK_TABLES, installDefaults, installedApps, installedModules, type PrepareAppsOptions, type PreparedApps, prepareApps, readInstalledApps, recordInstalledApps, restoreAppMigrations, } from './apps.js';
15
16
  export { type AuditInput, audit } from './audit.js';
16
17
  export { administrators, isAdministratorUser, keepingAdministrator, LAST_ADMINISTRATOR, } from './auth/admins.js';
@@ -24,6 +25,7 @@ export { applyEnvironmentNames } from './env-names.js';
24
25
  export { HttpProblem, type Problem, problemOf, ServerConfigError } from './errors.js';
25
26
  export { type AppHost, type AppHostOptions, createAppHost, startAppHost } from './host.js';
26
27
  export { type Authenticator, denyAll, isSuperuser, languageOf, type RequestIdentity, type RequestRunOptions, runOptionsOf, } from './identity.js';
28
+ export { imageVersions, registerImageRoutes } from './images.js';
27
29
  export { migrate, orm, pg } from './orm.js';
28
30
  export { buildKoshRegistry, KOSH_VERSION, type KoshRegistry } from './registry.js';
29
31
  export { type AppsContext, createServer, type KoshServer, type ModuleContext, type ServerOptions, startServer, } from './server.js';
@@ -11,6 +11,7 @@ export { moduleVisible, Navigation } from './api/navigation.js';
11
11
  export { fieldSchema, openApiDocument, openApiOf } from './api/openapi.js';
12
12
  export { readApiRecord, registerRestApi } from './api/rest.js';
13
13
  export { ViewRegistry } from './api/views.js';
14
+ export { installationSetting } from './app-settings.js';
14
15
  export { APPS_CHANNEL, APPS_LOG_TABLE, APPS_TABLE, applyApps, appsDigest, appTableStatements, FRAMEWORK_TABLES, installDefaults, installedApps, installedModules, prepareApps, readInstalledApps, recordInstalledApps, restoreAppMigrations, } from './apps.js';
15
16
  export { audit } from './audit.js';
16
17
  export { administrators, isAdministratorUser, keepingAdministrator, LAST_ADMINISTRATOR, } from './auth/admins.js';
@@ -24,6 +25,7 @@ export { applyEnvironmentNames } from './env-names.js';
24
25
  export { HttpProblem, problemOf, ServerConfigError } from './errors.js';
25
26
  export { createAppHost, startAppHost } from './host.js';
26
27
  export { denyAll, isSuperuser, languageOf, runOptionsOf, } from './identity.js';
28
+ export { imageVersions, registerImageRoutes } from './images.js';
27
29
  export { migrate, orm, pg } from './orm.js';
28
30
  export { buildKoshRegistry, KOSH_VERSION } from './registry.js';
29
31
  export { createServer, startServer, } from './server.js';
@@ -47,6 +47,10 @@ export interface ServerOptions {
47
47
  /** Sign-in attempts per 15 minutes per IP and login (default 10; 0 turns the limit off). */
48
48
  readonly loginLimit?: number;
49
49
  };
50
+ /** OAuth 2.0 provider (RFC 0017 §5.2): the back-office's address, where the consent page is (`KOSH_BASE_URL`). */
51
+ readonly oauth?: {
52
+ readonly baseUrl?: string;
53
+ };
50
54
  /**
51
55
  * Shutro's identity loader checks every request's user (active, companies, groups) against `base`'s data. Default:
52
56
  * on with the built-in authentication; custom authenticators opt in.
@@ -13,12 +13,14 @@ import { openApiDocument } from './api/openapi.js';
13
13
  import { registerRestApi } from './api/rest.js';
14
14
  import { ViewRegistry } from './api/views.js';
15
15
  import { registerApiKeyRoutes } from './auth/api-keys.js';
16
+ import { registerOAuthRoutes } from './auth/oauth.js';
16
17
  import { registerAuthRoutes } from './auth/routes.js';
17
18
  import { enforceScopes } from './auth/scopes.js';
18
19
  import { AuthService } from './auth/service.js';
19
20
  import { applyEnvironmentNames } from './env-names.js';
20
21
  import { HttpProblem, problemOf, ServerConfigError } from './errors.js';
21
22
  import { denyAll, runOptionsOf } from './identity.js';
23
+ import { registerImageRoutes } from './images.js';
22
24
  import { orm, pg } from './orm.js';
23
25
  import { buildKoshRegistry, KOSH_VERSION } from './registry.js';
24
26
  import { endSpan, tracer } from './telemetry.js';
@@ -169,7 +171,9 @@ export async function createServer(options) {
169
171
  ? `ip:${request.ip}`
170
172
  : request.identity.apiKey !== undefined
171
173
  ? `key:${request.identity.apiKey}`
172
- : `user:${request.identity.user}`,
174
+ : request.identity.oauthToken !== undefined
175
+ ? `oauth:${request.identity.oauthToken}`
176
+ : `user:${request.identity.user}`,
173
177
  allowList: (request) => request.routeOptions.config.public === true,
174
178
  errorResponseBuilder: (_request, context) => new HttpProblem(429, 'rate-limited', 'Too many requests', `Limit of ${context.max} requests per ${context.after} reached.`, `Retry after ${context.after}.`),
175
179
  });
@@ -209,6 +213,10 @@ export async function createServer(options) {
209
213
  if (auth !== undefined) {
210
214
  registerAuthRoutes(app, auth, { loginLimit: options.auth?.loginLimit ?? 10 });
211
215
  registerApiKeyRoutes(app, auth, registry);
216
+ registerImageRoutes(app, auth);
217
+ registerOAuthRoutes(app, auth, () => shutro, registry, {
218
+ baseUrl: options.oauth?.baseUrl ?? process.env['KOSH_BASE_URL'] ?? 'http://localhost:5173',
219
+ });
212
220
  }
213
221
  // The generated REST API and its OpenAPI document (RFC 0002 §6.3–6.4).
214
222
  for (const statement of idempotencyTableStatements())
@@ -0,0 +1,2 @@
1
+ import { type ModuleContext } from '../server/index.js';
2
+ export declare function registerAppSettingsRoutes(context: ModuleContext): void;