@sync-in/server 1.8.0 → 1.9.0

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 (611) hide show
  1. package/CHANGELOG.md +64 -10
  2. package/environment/environment.dist.yaml +29 -26
  3. package/package.json +18 -17
  4. package/server/app.bootstrap.js +4 -2
  5. package/server/app.bootstrap.js.map +1 -1
  6. package/server/app.constants.js +9 -0
  7. package/server/app.constants.js.map +1 -1
  8. package/server/app.module.js +4 -0
  9. package/server/app.module.js.map +1 -1
  10. package/server/applications/admin/admin.module.js +6 -1
  11. package/server/applications/admin/admin.module.js.map +1 -1
  12. package/server/applications/{notifications/interfaces/user-mail-notification.js → admin/interfaces/check-update.interfaces.js} +1 -1
  13. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -0
  14. package/server/applications/admin/services/admin-scheduler.service.js +53 -0
  15. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -0
  16. package/server/applications/admin/services/admin.service.js +102 -0
  17. package/server/applications/admin/services/admin.service.js.map +1 -0
  18. package/server/applications/admin/services/admin.service.spec.js +46 -0
  19. package/server/applications/admin/services/admin.service.spec.js.map +1 -0
  20. package/server/applications/admin/utils/check-update.js +28 -0
  21. package/server/applications/admin/utils/check-update.js.map +1 -0
  22. package/server/applications/comments/services/comments-manager.service.js +1 -1
  23. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  24. package/server/applications/comments/services/comments-manager.service.spec.js +1 -1
  25. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  26. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  27. package/server/applications/files/constants/cache.js +10 -1
  28. package/server/applications/files/constants/cache.js.map +1 -1
  29. package/server/applications/files/constants/only-office.js +0 -25
  30. package/server/applications/files/constants/only-office.js.map +1 -1
  31. package/server/applications/files/constants/operations.js +20 -3
  32. package/server/applications/files/constants/operations.js.map +1 -1
  33. package/server/applications/files/dto/file-operations.dto.js +7 -0
  34. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  35. package/server/applications/files/files-only-office.controller.js +3 -2
  36. package/server/applications/files/files-only-office.controller.js.map +1 -1
  37. package/server/applications/files/files-only-office.controller.spec.js +6 -5
  38. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  39. package/server/applications/files/files.controller.js +100 -12
  40. package/server/applications/files/files.controller.js.map +1 -1
  41. package/server/applications/files/files.controller.spec.js +29 -8
  42. package/server/applications/files/files.controller.spec.js.map +1 -1
  43. package/server/applications/files/guards/files-only-office.guard.js +6 -0
  44. package/server/applications/files/guards/files-only-office.guard.js.map +1 -1
  45. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  46. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  47. package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
  48. package/server/applications/files/services/files-content-manager.service.js +3 -3
  49. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  50. package/server/applications/files/services/files-lock-manager.service.js +61 -22
  51. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  52. package/server/applications/files/services/files-manager.service.js +122 -24
  53. package/server/applications/files/services/files-manager.service.js.map +1 -1
  54. package/server/applications/files/services/files-manager.service.spec.js +15 -0
  55. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  56. package/server/applications/files/services/files-methods.service.js +39 -14
  57. package/server/applications/files/services/files-methods.service.js.map +1 -1
  58. package/server/applications/files/services/files-only-office-manager.service.js +12 -12
  59. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  60. package/server/applications/files/services/files-parser.service.js +1 -1
  61. package/server/applications/files/services/files-parser.service.js.map +1 -1
  62. package/server/applications/files/services/files-queries.service.js +10 -0
  63. package/server/applications/files/services/files-queries.service.js.map +1 -1
  64. package/server/applications/files/utils/doc-textify/adapters/pdf.js +5 -16
  65. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  66. package/server/applications/files/utils/files.js +1 -1
  67. package/server/applications/files/utils/files.js.map +1 -1
  68. package/server/applications/files/utils/send-file.js +3 -2
  69. package/server/applications/files/utils/send-file.js.map +1 -1
  70. package/server/applications/links/services/links-queries.service.js +1 -1
  71. package/server/applications/links/services/links-queries.service.js.map +1 -1
  72. package/server/applications/notifications/constants/notifications.js +5 -1
  73. package/server/applications/notifications/constants/notifications.js.map +1 -1
  74. package/server/applications/notifications/i18n/de.js +8 -2
  75. package/server/applications/notifications/i18n/de.js.map +1 -1
  76. package/server/applications/notifications/i18n/es.js +8 -2
  77. package/server/applications/notifications/i18n/es.js.map +1 -1
  78. package/server/applications/notifications/i18n/fr.js +8 -2
  79. package/server/applications/notifications/i18n/fr.js.map +1 -1
  80. package/server/applications/notifications/i18n/hi.js +8 -2
  81. package/server/applications/notifications/i18n/hi.js.map +1 -1
  82. package/server/applications/notifications/i18n/it.js +8 -2
  83. package/server/applications/notifications/i18n/it.js.map +1 -1
  84. package/server/applications/notifications/i18n/ja.js +8 -2
  85. package/server/applications/notifications/i18n/ja.js.map +1 -1
  86. package/server/applications/notifications/i18n/ko.js +8 -2
  87. package/server/applications/notifications/i18n/ko.js.map +1 -1
  88. package/server/applications/notifications/i18n/pl.js +8 -2
  89. package/server/applications/notifications/i18n/pl.js.map +1 -1
  90. package/server/applications/notifications/i18n/pt.js +8 -2
  91. package/server/applications/notifications/i18n/pt.js.map +1 -1
  92. package/server/applications/notifications/i18n/pt_br.js +8 -2
  93. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  94. package/server/applications/notifications/i18n/ru.js +8 -2
  95. package/server/applications/notifications/i18n/ru.js.map +1 -1
  96. package/server/applications/notifications/i18n/tr.js +8 -2
  97. package/server/applications/notifications/i18n/tr.js.map +1 -1
  98. package/server/applications/notifications/i18n/zh.js +8 -2
  99. package/server/applications/notifications/i18n/zh.js.map +1 -1
  100. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  101. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
  102. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
  103. package/server/applications/notifications/mails/models.js +38 -3
  104. package/server/applications/notifications/mails/models.js.map +1 -1
  105. package/server/applications/notifications/mails/templates.js +1 -1
  106. package/server/applications/notifications/mails/templates.js.map +1 -1
  107. package/server/applications/notifications/services/notifications-manager.service.js +8 -1
  108. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  109. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  110. package/server/applications/shares/services/shares-manager.service.js +17 -10
  111. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  112. package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
  113. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  114. package/server/applications/shares/services/shares-queries.service.js +11 -1
  115. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  116. package/server/applications/spaces/guards/space.guard.spec.js +2 -2
  117. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  118. package/server/applications/spaces/services/spaces-browser.service.js +31 -11
  119. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  120. package/server/applications/spaces/services/spaces-manager.service.js +2 -2
  121. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  122. package/server/applications/spaces/services/spaces-queries.service.js +6 -2
  123. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  124. package/server/applications/spaces/utils/permissions.js +2 -2
  125. package/server/applications/spaces/utils/permissions.js.map +1 -1
  126. package/server/applications/sync/services/sync-manager.service.js +1 -0
  127. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  128. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  129. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  130. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  131. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  132. package/server/applications/users/constants/user.js +1 -1
  133. package/server/applications/users/constants/user.js.map +1 -1
  134. package/server/applications/users/services/admin-users-queries.service.js +8 -0
  135. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  136. package/server/applications/users/services/users-manager.service.js +1 -2
  137. package/server/applications/users/services/users-manager.service.js.map +1 -1
  138. package/server/applications/users/services/users-queries.service.js +67 -68
  139. package/server/applications/users/services/users-queries.service.js.map +1 -1
  140. package/server/applications/users/users.gateway.js +6 -0
  141. package/server/applications/users/users.gateway.js.map +1 -1
  142. package/server/applications/users/users.module.js +2 -1
  143. package/server/applications/users/users.module.js.map +1 -1
  144. package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
  145. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  146. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
  147. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  148. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  149. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  150. package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
  151. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  152. package/server/authentication/constants/auth-ldap.js +2 -0
  153. package/server/authentication/constants/auth-ldap.js.map +1 -1
  154. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
  155. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  156. package/server/common/functions.js +0 -8
  157. package/server/common/functions.js.map +1 -1
  158. package/server/common/image.js +63 -58
  159. package/server/common/image.js.map +1 -1
  160. package/server/common/shared.js +18 -1
  161. package/server/common/shared.js.map +1 -1
  162. package/server/infrastructure/context/services/context-manager.service.js +3 -0
  163. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  164. package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
  165. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  166. package/static/3rdpartylicenses.txt +1380 -57
  167. package/static/assets/favicon.svg +2 -25
  168. package/static/assets/logo-dark.svg +2 -32
  169. package/static/assets/logo.svg +2 -32
  170. package/static/assets/mimes/application-sql.svg +29 -1
  171. package/static/assets/mimes/application-x-sql.svg +29 -0
  172. package/static/assets/mimes/image-bmp.svg +12 -0
  173. package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
  174. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  175. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  176. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  177. package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
  178. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  179. package/static/assets/pdfjs/version +1 -1
  180. package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
  181. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
  182. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
  183. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
  184. package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
  185. package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
  186. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
  187. package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
  188. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
  189. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
  190. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
  191. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
  192. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
  193. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
  194. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
  195. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
  196. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
  197. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
  198. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
  199. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
  200. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
  201. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
  202. package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
  203. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
  204. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
  205. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
  206. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
  207. package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
  208. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
  209. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
  210. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
  211. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
  212. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
  213. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
  214. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
  215. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
  216. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
  217. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
  218. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
  219. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
  220. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
  221. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
  222. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
  223. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
  224. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
  225. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
  226. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
  227. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
  228. package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
  229. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
  230. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
  231. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
  232. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
  233. package/static/assets/pdfjs/web/viewer.css +141 -110
  234. package/static/assets/pdfjs/web/viewer.html +7 -7
  235. package/static/assets/pdfjs/web/viewer.mjs +97 -14
  236. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  237. package/static/chunk-22DWHRCL.js +1 -0
  238. package/static/chunk-23UUFZSR.js +1 -0
  239. package/static/{chunk-VM4YX6Q7.js → chunk-24Q7OUU2.js} +1 -1
  240. package/static/chunk-25QTY2GI.js +1 -0
  241. package/static/chunk-2E7IJZLL.js +1 -0
  242. package/static/chunk-2FC5EKS5.js +1 -0
  243. package/static/chunk-2FOWUJQF.js +1 -0
  244. package/static/chunk-2XPHUNYN.js +1 -0
  245. package/static/chunk-32L7RG2G.js +1 -0
  246. package/static/chunk-3IISSX63.js +1 -0
  247. package/static/chunk-3OHSTP3R.js +1 -0
  248. package/static/chunk-42L6C5MT.js +1 -0
  249. package/static/chunk-4AGQL5GV.js +1 -0
  250. package/static/chunk-4BPSQMI2.js +1 -0
  251. package/static/chunk-4FDRWZWT.js +1 -0
  252. package/static/chunk-4FJUCMEG.js +1 -0
  253. package/static/chunk-4GCCF6PF.js +1 -0
  254. package/static/chunk-4ORP3SBY.js +1 -0
  255. package/static/chunk-4QBOHIC3.js +1 -0
  256. package/static/chunk-4YT6K5KY.js +1 -0
  257. package/static/chunk-556I6YIW.js +1 -0
  258. package/static/chunk-5DPIGJU4.js +1 -0
  259. package/static/chunk-5HNQLBSW.js +3 -0
  260. package/static/chunk-5IL7C45D.js +1 -0
  261. package/static/chunk-5KJXGMKR.js +1 -0
  262. package/static/chunk-5SPGSHKL.js +1 -0
  263. package/static/chunk-5WCQBTXW.js +1 -0
  264. package/static/chunk-5XUIPWOH.js +1 -0
  265. package/static/chunk-62WT7PI3.js +1 -0
  266. package/static/chunk-6F6OMQ5H.js +1 -0
  267. package/static/chunk-6I5BGQHT.js +1 -0
  268. package/static/chunk-6NOS45DG.js +1 -0
  269. package/static/chunk-6OKLPRCD.js +1 -0
  270. package/static/chunk-6VEJCG43.js +1 -0
  271. package/static/chunk-77SS36Z2.js +1 -0
  272. package/static/chunk-7AXEPO3G.js +1 -0
  273. package/static/chunk-7CFSJ4BO.js +1 -0
  274. package/static/chunk-7CKHC72R.js +1 -0
  275. package/static/chunk-7DUTYOJG.js +1 -0
  276. package/static/chunk-7HKFYRPF.js +1 -0
  277. package/static/chunk-7NZJZATZ.js +1 -0
  278. package/static/chunk-AADK5D2H.js +1 -0
  279. package/static/chunk-ACUF7IKP.js +1 -0
  280. package/static/chunk-AGREZPV4.js +1 -0
  281. package/static/chunk-ATBJWFA3.js +1 -0
  282. package/static/chunk-ATXLZN2B.js +1 -0
  283. package/static/chunk-AZ5TF5Y3.js +1 -0
  284. package/static/chunk-BBHYIURC.js +1 -0
  285. package/static/chunk-BHZEPHRI.js +13 -0
  286. package/static/chunk-BQZWSZNN.js +1 -0
  287. package/static/chunk-BSB4VROD.js +2 -0
  288. package/static/chunk-BYWSTP3P.js +1 -0
  289. package/static/chunk-C3AAEQKW.js +1 -0
  290. package/static/chunk-CCGGCHGN.js +1 -0
  291. package/static/chunk-CFTKW432.js +1 -0
  292. package/static/chunk-CNOVT6KU.js +1 -0
  293. package/static/chunk-D56H3XE2.js +1 -0
  294. package/static/chunk-DFOOSIIA.js +1 -0
  295. package/static/chunk-DHFQIFOF.js +1 -0
  296. package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
  297. package/static/chunk-DJDRX53V.js +2 -0
  298. package/static/chunk-DKGXUMLT.js +1 -0
  299. package/static/chunk-DRHPEERW.js +2 -0
  300. package/static/chunk-DWYP6ZGG.js +1 -0
  301. package/static/chunk-EDJAISWO.js +13 -0
  302. package/static/chunk-EIYRBM4J.js +1 -0
  303. package/static/chunk-EKEGRXCV.js +7 -0
  304. package/static/chunk-EL6QL4TP.js +1 -0
  305. package/static/chunk-ERDZ7IVF.js +1 -0
  306. package/static/chunk-EVQKKVUZ.js +1 -0
  307. package/static/chunk-F2XG7EWI.js +1 -0
  308. package/static/chunk-F672FY5I.js +1 -0
  309. package/static/chunk-F6V37MKG.js +1 -0
  310. package/static/chunk-F7TXTNZC.js +1 -0
  311. package/static/chunk-FCGTI42I.js +1 -0
  312. package/static/chunk-FQHOSSCO.js +1 -0
  313. package/static/chunk-FTSIPHMG.js +1 -0
  314. package/static/chunk-GAGHHYLF.js +1 -0
  315. package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
  316. package/static/chunk-H6WOTGQ5.js +1 -0
  317. package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
  318. package/static/chunk-HC7F57NA.js +1 -0
  319. package/static/chunk-HHWXIK2M.js +7 -0
  320. package/static/chunk-HKRGIRKB.js +3 -0
  321. package/static/chunk-HNMGPG72.js +1 -0
  322. package/static/chunk-HS4S6BV3.js +1 -0
  323. package/static/chunk-IJ7K7ATQ.js +1 -0
  324. package/static/chunk-IOIBQGHN.js +562 -0
  325. package/static/chunk-ITVA26X2.js +2 -0
  326. package/static/chunk-J6YSFHLZ.js +1 -0
  327. package/static/chunk-JAEJ6IMV.js +1 -0
  328. package/static/chunk-JB5R6V33.js +1 -0
  329. package/static/chunk-JF6WIV6M.js +1 -0
  330. package/static/chunk-JGB4LLUT.js +1 -0
  331. package/static/chunk-JGXVTKLG.js +1 -0
  332. package/static/chunk-JMYAD7E2.js +1 -0
  333. package/static/chunk-JSE63Q5X.js +1 -0
  334. package/static/chunk-JVV3ZL6L.js +1 -0
  335. package/static/chunk-JXZCNFW7.js +1 -0
  336. package/static/chunk-KAVP6UXH.js +1 -0
  337. package/static/{chunk-WLMNXRBS.js → chunk-KDEEERWZ.js} +1 -1
  338. package/static/chunk-KHRF67SG.js +1 -0
  339. package/static/chunk-KLOUBIO4.js +1 -0
  340. package/static/chunk-KMF3ZRAO.js +1 -0
  341. package/static/chunk-KNZ3AQPR.js +1 -0
  342. package/static/chunk-KT3TWCST.js +1 -0
  343. package/static/chunk-L6SYG23T.js +1 -0
  344. package/static/chunk-LJSVNPPQ.js +1 -0
  345. package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
  346. package/static/chunk-LRQSPCYZ.js +1 -0
  347. package/static/chunk-LUSVISM6.js +1 -0
  348. package/static/chunk-LXQGVNU2.js +1 -0
  349. package/static/{chunk-BIKLW4YS.js → chunk-LYZGJZNP.js} +1 -1
  350. package/static/chunk-LZKI5P5T.js +1 -0
  351. package/static/chunk-M4XL3JN5.js +6 -0
  352. package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
  353. package/static/chunk-MKUUWY6Y.js +1 -0
  354. package/static/{chunk-HAS5ZOTR.js → chunk-MNNCSSHN.js} +1 -1
  355. package/static/chunk-MR3U7TKQ.js +1 -0
  356. package/static/chunk-MRF3CNLZ.js +1 -0
  357. package/static/chunk-MRMSMTWD.js +1 -0
  358. package/static/chunk-MVZJSG5R.js +1 -0
  359. package/static/chunk-MYM43ENO.js +1 -0
  360. package/static/chunk-N3P6P6GW.js +7 -0
  361. package/static/chunk-NAH4V2R6.js +2 -0
  362. package/static/chunk-NBBDVVUF.js +1 -0
  363. package/static/chunk-NMF2ZFBE.js +1 -0
  364. package/static/chunk-NN4ONTOT.js +1 -0
  365. package/static/chunk-NOPACN4F.js +1 -0
  366. package/static/chunk-NYJPOP4L.js +1 -0
  367. package/static/chunk-OJCAIKUK.js +1 -0
  368. package/static/chunk-OQRWXCLY.js +1 -0
  369. package/static/chunk-PCFH5HCI.js +2 -0
  370. package/static/chunk-PG54TWBO.js +4 -0
  371. package/static/chunk-PJF5XUTO.js +1 -0
  372. package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
  373. package/static/chunk-PTLYIUFW.js +1 -0
  374. package/static/chunk-PZGLDZZM.js +1 -0
  375. package/static/chunk-Q4VNZGFI.js +1 -0
  376. package/static/chunk-Q556XB3S.js +1 -0
  377. package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
  378. package/static/chunk-Q7U2VPIS.js +1 -0
  379. package/static/chunk-QM6CQMEX.js +1 -0
  380. package/static/chunk-QMHUIHSR.js +1 -0
  381. package/static/chunk-QNFNXDSX.js +1 -0
  382. package/static/chunk-QVFPHTOH.js +1 -0
  383. package/static/chunk-R4MI25E2.js +1 -0
  384. package/static/chunk-R7JRAR3P.js +1 -0
  385. package/static/chunk-R7PNKQU2.js +1 -0
  386. package/static/chunk-RCAORRB7.js +1 -0
  387. package/static/chunk-RK7XRDNB.js +1 -0
  388. package/static/chunk-RO7SAOLK.js +1 -0
  389. package/static/chunk-RQUUINHV.js +1 -0
  390. package/static/chunk-RT3K6DZR.js +1 -0
  391. package/static/chunk-RUN556VW.js +1 -0
  392. package/static/chunk-RX3YQ67K.js +1 -0
  393. package/static/chunk-S6EVLDHA.js +5 -0
  394. package/static/chunk-S7S5M3AZ.js +1 -0
  395. package/static/chunk-SBLNYV74.js +1 -0
  396. package/static/chunk-SIZCHHUA.js +1 -0
  397. package/static/chunk-SRBOO7AO.js +1 -0
  398. package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
  399. package/static/chunk-T3YI3BSS.js +1 -0
  400. package/static/chunk-T74SMT7I.js +1 -0
  401. package/static/chunk-TAL3RTTQ.js +1 -0
  402. package/static/chunk-TJZKTNNS.js +1 -0
  403. package/static/chunk-UJTFWZEC.js +1 -0
  404. package/static/chunk-UPGVU5LG.js +1 -0
  405. package/static/chunk-UQ6O3I6W.js +1 -0
  406. package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
  407. package/static/chunk-VWIRXLNE.js +1 -0
  408. package/static/chunk-VZMVGIVW.js +1 -0
  409. package/static/chunk-VZPCXSRG.js +2 -0
  410. package/static/chunk-WR3MA3L3.js +1 -0
  411. package/static/chunk-XCLK7NJL.js +1 -0
  412. package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
  413. package/static/chunk-XEGHEUP5.js +1 -0
  414. package/static/chunk-XKEBQNQJ.js +1 -0
  415. package/static/chunk-XOF4UW3S.js +1 -0
  416. package/static/chunk-XOTKK2NJ.js +1 -0
  417. package/static/chunk-XX7JXKA6.js +1 -0
  418. package/static/chunk-Y2I36A4K.js +1 -0
  419. package/static/chunk-Y44XDRM5.js +1 -0
  420. package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
  421. package/static/chunk-Y5RLD72B.js +1 -0
  422. package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
  423. package/static/chunk-Y63UUJGJ.js +1 -0
  424. package/static/chunk-YBNAC7QM.js +1 -0
  425. package/static/chunk-YCTCESL4.js +1 -0
  426. package/static/chunk-YMAN4LIU.js +1 -0
  427. package/static/chunk-YTDE6SXT.js +1 -0
  428. package/static/chunk-YZPIUJB3.js +1 -0
  429. package/static/chunk-ZCOWBVOT.js +1 -0
  430. package/static/chunk-ZHRYYMYE.js +1 -0
  431. package/static/chunk-ZNXTOQFG.js +1 -0
  432. package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
  433. package/static/favicon.ico +0 -0
  434. package/static/index.html +2 -2
  435. package/static/main-3PLRDZTO.js +11 -0
  436. package/static/styles-Q4OZOSSK.css +1 -0
  437. package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
  438. package/static/assets/codemirror/mode/apl/apl.js +0 -174
  439. package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  440. package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
  441. package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
  442. package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
  443. package/static/assets/codemirror/mode/clike/clike.js +0 -942
  444. package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
  445. package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
  446. package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
  447. package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
  448. package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
  449. package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
  450. package/static/assets/codemirror/mode/css/css.js +0 -862
  451. package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
  452. package/static/assets/codemirror/mode/d/d.js +0 -223
  453. package/static/assets/codemirror/mode/dart/dart.js +0 -168
  454. package/static/assets/codemirror/mode/diff/diff.js +0 -47
  455. package/static/assets/codemirror/mode/django/django.js +0 -356
  456. package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
  457. package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
  458. package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
  459. package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
  460. package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
  461. package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
  462. package/static/assets/codemirror/mode/elm/elm.js +0 -245
  463. package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
  464. package/static/assets/codemirror/mode/factor/factor.js +0 -85
  465. package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
  466. package/static/assets/codemirror/mode/forth/forth.js +0 -180
  467. package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
  468. package/static/assets/codemirror/mode/gas/gas.js +0 -355
  469. package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
  470. package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
  471. package/static/assets/codemirror/mode/go/go.js +0 -187
  472. package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
  473. package/static/assets/codemirror/mode/haml/haml.js +0 -161
  474. package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
  475. package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
  476. package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  477. package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
  478. package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  479. package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  480. package/static/assets/codemirror/mode/http/http.js +0 -113
  481. package/static/assets/codemirror/mode/idl/idl.js +0 -290
  482. package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
  483. package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
  484. package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
  485. package/static/assets/codemirror/mode/julia/julia.js +0 -390
  486. package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
  487. package/static/assets/codemirror/mode/lua/lua.js +0 -160
  488. package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
  489. package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
  490. package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
  491. package/static/assets/codemirror/mode/meta.js +0 -221
  492. package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
  493. package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
  494. package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
  495. package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
  496. package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
  497. package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
  498. package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
  499. package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
  500. package/static/assets/codemirror/mode/octave/octave.js +0 -139
  501. package/static/assets/codemirror/mode/oz/oz.js +0 -252
  502. package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
  503. package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
  504. package/static/assets/codemirror/mode/perl/perl.js +0 -836
  505. package/static/assets/codemirror/mode/php/php.js +0 -234
  506. package/static/assets/codemirror/mode/pig/pig.js +0 -178
  507. package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
  508. package/static/assets/codemirror/mode/properties/properties.js +0 -78
  509. package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
  510. package/static/assets/codemirror/mode/pug/pug.js +0 -591
  511. package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
  512. package/static/assets/codemirror/mode/python/python.js +0 -402
  513. package/static/assets/codemirror/mode/q/q.js +0 -139
  514. package/static/assets/codemirror/mode/r/r.js +0 -190
  515. package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
  516. package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
  517. package/static/assets/codemirror/mode/rst/rst.js +0 -557
  518. package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
  519. package/static/assets/codemirror/mode/rust/rust.js +0 -72
  520. package/static/assets/codemirror/mode/sas/sas.js +0 -303
  521. package/static/assets/codemirror/mode/sass/sass.js +0 -459
  522. package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
  523. package/static/assets/codemirror/mode/shell/shell.js +0 -168
  524. package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
  525. package/static/assets/codemirror/mode/slim/slim.js +0 -575
  526. package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
  527. package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
  528. package/static/assets/codemirror/mode/solr/solr.js +0 -104
  529. package/static/assets/codemirror/mode/soy/soy.js +0 -665
  530. package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
  531. package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  532. package/static/assets/codemirror/mode/sql/sql.js +0 -529
  533. package/static/assets/codemirror/mode/stex/stex.js +0 -264
  534. package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
  535. package/static/assets/codemirror/mode/swift/swift.js +0 -221
  536. package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
  537. package/static/assets/codemirror/mode/textile/textile.js +0 -469
  538. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  539. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  540. package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
  541. package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
  542. package/static/assets/codemirror/mode/toml/toml.js +0 -88
  543. package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
  544. package/static/assets/codemirror/mode/troff/troff.js +0 -84
  545. package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
  546. package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  547. package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
  548. package/static/assets/codemirror/mode/twig/twig.js +0 -141
  549. package/static/assets/codemirror/mode/vb/vb.js +0 -275
  550. package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
  551. package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
  552. package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
  553. package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
  554. package/static/assets/codemirror/mode/vue/vue.js +0 -77
  555. package/static/assets/codemirror/mode/wast/wast.js +0 -132
  556. package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
  557. package/static/assets/codemirror/mode/xml/xml.js +0 -417
  558. package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
  559. package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
  560. package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
  561. package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  562. package/static/assets/codemirror/mode/z80/z80.js +0 -116
  563. package/static/chunk-2KLC4T2Z.js +0 -1
  564. package/static/chunk-373XVRXW.js +0 -1
  565. package/static/chunk-3XVM35O2.js +0 -1
  566. package/static/chunk-3YVRP3VM.js +0 -2
  567. package/static/chunk-AF24EYXU.js +0 -1
  568. package/static/chunk-AKQVEHO6.js +0 -2
  569. package/static/chunk-AY2SZ3G6.js +0 -1
  570. package/static/chunk-BCVX464U.js +0 -2
  571. package/static/chunk-C36MW4ME.js +0 -562
  572. package/static/chunk-DKSEQTMX.js +0 -1
  573. package/static/chunk-FZ3JPGYZ.js +0 -1
  574. package/static/chunk-GUGNR5TF.js +0 -3
  575. package/static/chunk-H6NE33VX.js +0 -1
  576. package/static/chunk-HNQRZALS.js +0 -1
  577. package/static/chunk-JSWCNGXJ.js +0 -1
  578. package/static/chunk-KFJIQIGR.js +0 -1
  579. package/static/chunk-LVM4QB22.js +0 -1
  580. package/static/chunk-M3XVNQZQ.js +0 -1
  581. package/static/chunk-MFLIJH6T.js +0 -1
  582. package/static/chunk-MSUHTBB2.js +0 -1
  583. package/static/chunk-N3U6637P.js +0 -1
  584. package/static/chunk-NNV4OXSB.js +0 -1
  585. package/static/chunk-NO2LTNW3.js +0 -1
  586. package/static/chunk-OOGP4WSH.js +0 -2
  587. package/static/chunk-PCWDQPOM.js +0 -2
  588. package/static/chunk-PGZZP5W3.js +0 -1
  589. package/static/chunk-Q5KM7LTX.js +0 -1
  590. package/static/chunk-QHC6ZPQ4.js +0 -1
  591. package/static/chunk-QZU2S5CV.js +0 -1
  592. package/static/chunk-SBZ572Q4.js +0 -2
  593. package/static/chunk-SHIVUDP3.js +0 -1
  594. package/static/chunk-SLHTEGRU.js +0 -1
  595. package/static/chunk-SSFF27P2.js +0 -24
  596. package/static/chunk-TPYBFZS5.js +0 -1
  597. package/static/chunk-UEQCWMXD.js +0 -1
  598. package/static/chunk-UG5DMXYO.js +0 -1
  599. package/static/chunk-UJPPR4MX.js +0 -1
  600. package/static/chunk-V3AT2BKP.js +0 -1
  601. package/static/chunk-VKK5BSLX.js +0 -1
  602. package/static/chunk-WJW7CT6G.js +0 -27
  603. package/static/chunk-X5XGK6T7.js +0 -4
  604. package/static/chunk-YEKR5OPO.js +0 -1
  605. package/static/chunk-YW57T2PF.js +0 -1
  606. package/static/chunk-Z5J5F5SX.js +0 -1
  607. package/static/chunk-ZPF2DSQV.js +0 -1
  608. package/static/chunk-ZTCRGJ6Y.js +0 -7
  609. package/static/main-VOL6OMJ5.js +0 -9
  610. package/static/scripts-WRDOQIU5.js +0 -24
  611. package/static/styles-2C2UNCNB.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../backend/src/applications/files/utils/doc-textify/adapters/pdf.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\nimport path from 'node:path'\nimport { getDocument, GlobalWorkerOptions, PDFDocumentProxy } from 'pdfjs-dist/legacy/build/pdf.mjs'\nimport { DocTextifyOptions } from '../interfaces/doc-textify.interfaces'\n\n// Enable parallel PDF parsing via Node.js worker threads\nGlobalWorkerOptions.workerSrc = require.resolve('pdfjs-dist/legacy/build/pdf.worker.mjs')\nconst pdfjsDistDir = path.dirname(require.resolve('pdfjs-dist/package.json'))\nconst standardFontsDir = path.join(pdfjsDistDir, 'standard_fonts') + '/'\n\n// Type guard to filter true text items\nfunction isTextItem(item: any): item is { str: string; transform: [number, number, number, number, number, number] } {\n return typeof item.str === 'string' && Array.isArray(item.transform)\n}\n\nconst ignorePdfBadFormat = new Set([0x0000, 0x0001])\n\n/** Parse PDF files */\nexport async function parsePdf(filePath: string, options: DocTextifyOptions): Promise<string> {\n let doc: PDFDocumentProxy\n\n try {\n // Load the document, allowing system fonts as fallback\n const loadingTask = getDocument({ url: filePath, disableFontFace: true, standardFontDataUrl: standardFontsDir })\n doc = await loadingTask.promise\n const fragments: string[] = []\n let lastY: number | undefined = undefined\n\n for (let pageNum = 1; pageNum <= doc.numPages; pageNum++) {\n const page = await doc.getPage(pageNum)\n const { items } = await page.getTextContent()\n\n for (const item of items) {\n // Skip non-text items\n if (!isTextItem(item)) continue\n\n const currentY = item.transform[5]\n if (lastY !== undefined && currentY !== lastY) {\n fragments.push(options.newlineDelimiter)\n }\n\n fragments.push(item.str)\n lastY = currentY\n }\n page.cleanup()\n }\n\n const content = fragments.join('')\n if (ignorePdfBadFormat.has(content.charCodeAt(0))) {\n return ''\n }\n return content\n } catch (e) {\n if (options.outputErrorToConsole) {\n console.error('Error parsing PDF:', e)\n }\n throw e\n } finally {\n doc?.destroy().catch((e: Error) => console.error(e))\n }\n}\n"],"names":["parsePdf","GlobalWorkerOptions","workerSrc","require","resolve","pdfjsDistDir","path","dirname","standardFontsDir","join","isTextItem","item","str","Array","isArray","transform","ignorePdfBadFormat","Set","filePath","options","doc","loadingTask","getDocument","url","disableFontFace","standardFontDataUrl","promise","fragments","lastY","undefined","pageNum","numPages","page","getPage","items","getTextContent","currentY","push","newlineDelimiter","cleanup","content","has","charCodeAt","e","outputErrorToConsole","console","error","destroy","catch"],"mappings":"AAAA;;;;CAIC;;;;+BAkBqBA;;;eAAAA;;;iEAjBL;qBACkD;;;;;;AAGnE,yDAAyD;AACzDC,wBAAmB,CAACC,SAAS,GAAGC,QAAQC,OAAO,CAAC;AAChD,MAAMC,eAAeC,iBAAI,CAACC,OAAO,CAACJ,QAAQC,OAAO,CAAC;AAClD,MAAMI,mBAAmBF,iBAAI,CAACG,IAAI,CAACJ,cAAc,oBAAoB;AAErE,uCAAuC;AACvC,SAASK,WAAWC,IAAS;IAC3B,OAAO,OAAOA,KAAKC,GAAG,KAAK,YAAYC,MAAMC,OAAO,CAACH,KAAKI,SAAS;AACrE;AAEA,MAAMC,qBAAqB,IAAIC,IAAI;IAAC;IAAQ;CAAO;AAG5C,eAAejB,SAASkB,QAAgB,EAAEC,OAA0B;IACzE,IAAIC;IAEJ,IAAI;QACF,uDAAuD;QACvD,MAAMC,cAAcC,IAAAA,gBAAW,EAAC;YAAEC,KAAKL;YAAUM,iBAAiB;YAAMC,qBAAqBjB;QAAiB;QAC9GY,MAAM,MAAMC,YAAYK,OAAO;QAC/B,MAAMC,YAAsB,EAAE;QAC9B,IAAIC,QAA4BC;QAEhC,IAAK,IAAIC,UAAU,GAAGA,WAAWV,IAAIW,QAAQ,EAAED,UAAW;YACxD,MAAME,OAAO,MAAMZ,IAAIa,OAAO,CAACH;YAC/B,MAAM,EAAEI,KAAK,EAAE,GAAG,MAAMF,KAAKG,cAAc;YAE3C,KAAK,MAAMxB,QAAQuB,MAAO;gBACxB,sBAAsB;gBACtB,IAAI,CAACxB,WAAWC,OAAO;gBAEvB,MAAMyB,WAAWzB,KAAKI,SAAS,CAAC,EAAE;gBAClC,IAAIa,UAAUC,aAAaO,aAAaR,OAAO;oBAC7CD,UAAUU,IAAI,CAAClB,QAAQmB,gBAAgB;gBACzC;gBAEAX,UAAUU,IAAI,CAAC1B,KAAKC,GAAG;gBACvBgB,QAAQQ;YACV;YACAJ,KAAKO,OAAO;QACd;QAEA,MAAMC,UAAUb,UAAUlB,IAAI,CAAC;QAC/B,IAAIO,mBAAmByB,GAAG,CAACD,QAAQE,UAAU,CAAC,KAAK;YACjD,OAAO;QACT;QACA,OAAOF;IACT,EAAE,OAAOG,GAAG;QACV,IAAIxB,QAAQyB,oBAAoB,EAAE;YAChCC,QAAQC,KAAK,CAAC,sBAAsBH;QACtC;QACA,MAAMA;IACR,SAAU;QACRvB,KAAK2B,UAAUC,MAAM,CAACL,IAAaE,QAAQC,KAAK,CAACH;IACnD;AACF"}
1
+ {"version":3,"sources":["../../../../../../../backend/src/applications/files/utils/doc-textify/adapters/pdf.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\nimport { readFile } from 'node:fs/promises'\nimport { getDocumentProxy } from 'unpdf'\nimport type { PDFDocumentProxy } from 'unpdf/pdfjs'\nimport type { DocTextifyOptions } from '../interfaces/doc-textify.interfaces'\n\n// Type guard to filter true text items\ninterface TextItem {\n str: string\n transform: [number, number, number, number, number, number]\n}\nfunction isTextItem(item: any): item is TextItem {\n return typeof item.str === 'string' && Array.isArray(item.transform)\n}\n\nconst ignorePdfBadFormat = new Set([0x0000, 0x0001])\n\n/** Parse PDF files */\nexport async function parsePdf(filePath: string, options: DocTextifyOptions): Promise<string> {\n let doc: PDFDocumentProxy\n const buffer = await readFile(filePath)\n\n try {\n // Load the document, allowing system fonts as fallback\n const doc = await getDocumentProxy(new Uint8Array(buffer), {\n disableFontFace: true,\n verbosity: 0\n })\n const fragments: string[] = []\n let lastY: number | undefined = undefined\n\n for (let pageNum = 1; pageNum <= doc.numPages; pageNum++) {\n const page = await doc.getPage(pageNum)\n const { items } = await page.getTextContent()\n\n for (const item of items) {\n // Skip non-text items\n if (!isTextItem(item)) continue\n\n const currentY = item.transform[5]\n if (lastY !== undefined && currentY !== lastY) {\n fragments.push(options.newlineDelimiter)\n }\n\n fragments.push(item.str)\n lastY = currentY\n }\n page.cleanup()\n }\n\n const content = fragments.join('')\n if (ignorePdfBadFormat.has(content.charCodeAt(0))) {\n return ''\n }\n return content\n } catch (e) {\n if (options.outputErrorToConsole) {\n console.error('Error parsing PDF:', e)\n }\n throw e\n } finally {\n doc?.destroy().catch((e: Error) => console.error(e))\n }\n}\n"],"names":["parsePdf","isTextItem","item","str","Array","isArray","transform","ignorePdfBadFormat","Set","filePath","options","doc","buffer","readFile","getDocumentProxy","Uint8Array","disableFontFace","verbosity","fragments","lastY","undefined","pageNum","numPages","page","getPage","items","getTextContent","currentY","push","newlineDelimiter","cleanup","content","join","has","charCodeAt","e","outputErrorToConsole","console","error","destroy","catch"],"mappings":"AAAA;;;;CAIC;;;;+BAkBqBA;;;eAAAA;;;0BAjBG;uBACQ;AASjC,SAASC,WAAWC,IAAS;IAC3B,OAAO,OAAOA,KAAKC,GAAG,KAAK,YAAYC,MAAMC,OAAO,CAACH,KAAKI,SAAS;AACrE;AAEA,MAAMC,qBAAqB,IAAIC,IAAI;IAAC;IAAQ;CAAO;AAG5C,eAAeR,SAASS,QAAgB,EAAEC,OAA0B;IACzE,IAAIC;IACJ,MAAMC,SAAS,MAAMC,IAAAA,kBAAQ,EAACJ;IAE9B,IAAI;QACF,uDAAuD;QACvD,MAAME,MAAM,MAAMG,IAAAA,uBAAgB,EAAC,IAAIC,WAAWH,SAAS;YACzDI,iBAAiB;YACjBC,WAAW;QACb;QACA,MAAMC,YAAsB,EAAE;QAC9B,IAAIC,QAA4BC;QAEhC,IAAK,IAAIC,UAAU,GAAGA,WAAWV,IAAIW,QAAQ,EAAED,UAAW;YACxD,MAAME,OAAO,MAAMZ,IAAIa,OAAO,CAACH;YAC/B,MAAM,EAAEI,KAAK,EAAE,GAAG,MAAMF,KAAKG,cAAc;YAE3C,KAAK,MAAMxB,QAAQuB,MAAO;gBACxB,sBAAsB;gBACtB,IAAI,CAACxB,WAAWC,OAAO;gBAEvB,MAAMyB,WAAWzB,KAAKI,SAAS,CAAC,EAAE;gBAClC,IAAIa,UAAUC,aAAaO,aAAaR,OAAO;oBAC7CD,UAAUU,IAAI,CAAClB,QAAQmB,gBAAgB;gBACzC;gBAEAX,UAAUU,IAAI,CAAC1B,KAAKC,GAAG;gBACvBgB,QAAQQ;YACV;YACAJ,KAAKO,OAAO;QACd;QAEA,MAAMC,UAAUb,UAAUc,IAAI,CAAC;QAC/B,IAAIzB,mBAAmB0B,GAAG,CAACF,QAAQG,UAAU,CAAC,KAAK;YACjD,OAAO;QACT;QACA,OAAOH;IACT,EAAE,OAAOI,GAAG;QACV,IAAIzB,QAAQ0B,oBAAoB,EAAE;YAChCC,QAAQC,KAAK,CAAC,sBAAsBH;QACtC;QACA,MAAMA;IACR,SAAU;QACRxB,KAAK4B,UAAUC,MAAM,CAACL,IAAaE,QAAQC,KAAK,CAACH;IACnD;AACF"}
@@ -368,7 +368,7 @@ async function uniqueDatedFilePath(rPath) {
368
368
  const extension = _nodepath.default.extname(rPath);
369
369
  const nameWithoutExtension = _nodepath.default.basename(rPath, extension);
370
370
  return {
371
- isDir: true,
371
+ isDir: false,
372
372
  path: _nodepath.default.join(_nodepath.default.dirname(rPath), `${nameWithoutExtension}-${date}${extension}`)
373
373
  };
374
374
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/utils/files.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpStatus } from '@nestjs/common'\nimport { WriteStream } from 'fs'\nimport fse from 'fs-extra'\nimport mime from 'mime-types'\nimport crypto from 'node:crypto'\nimport { createReadStream, createWriteStream, Dirent, statSync } from 'node:fs'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { formatDateISOString } from '../../../common/functions'\nimport { currentTimeStamp, isValidFileName, regExpPreventPathTraversal } from '../../../common/shared'\nimport { DEFAULT_HIGH_WATER_MARK, EXTRA_MIMES_TYPE } from '../constants/files'\nimport type { FileProps } from '../interfaces/file-props.interface'\nimport { FileError } from '../models/file-error'\n\nexport function sanitizePath(fPath: string): string {\n return path.normalize(fPath).replace(regExpPreventPathTraversal, '')\n}\n\nexport function sanitizeName(name: string): string {\n return name\n .replace(/^\\s+|[. ]+$/g, '') // trimStart + trimEnd + strip trailing dots\n .replace(/[/\\\\]/g, '') // remove slashes\n .replace(/\\.\\./g, '') // remove '..'\n}\n\nexport function checkFileName(fPath: string): string {\n const fName = fileName(fPath)\n try {\n isValidFileName(fName)\n return fName\n } catch {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Forbidden characters')\n }\n}\n\nexport function isPathExists(rPath: string): Promise<boolean> {\n return fse.pathExists(rPath)\n}\n\nexport async function isPathIsReadable(rPath: string): Promise<boolean> {\n try {\n await fs.access(rPath, fs.constants.R_OK)\n } catch {\n return false\n }\n return true\n}\n\nexport async function isPathIsWriteable(rPath: string): Promise<boolean> {\n try {\n await fs.access(rPath, fs.constants.W_OK)\n } catch {\n return false\n }\n return true\n}\n\nexport async function isPathIsDir(rPath: string): Promise<boolean> {\n return (await fs.stat(rPath)).isDirectory()\n}\n\nexport function fileName(fPath: string): string {\n return path.posix.basename(fPath)\n}\n\nexport function dirName(fPath: string): string {\n return path.dirname(fPath)\n}\n\nexport async function fileSize(rPath: string): Promise<number> {\n return (await fs.stat(rPath)).size\n}\n\nexport function createEmptyFile(rPath: string): Promise<void> {\n return fs.writeFile(rPath, '')\n}\n\nexport function makeDir(rPath: string, recursive?: boolean): Promise<string> {\n return fs.mkdir(rPath, { recursive: recursive })\n}\n\nexport function getMimeType(fPath: string, isDir: boolean): string {\n if (isDir) {\n return 'directory'\n }\n const extName: string = path.extname(fPath)\n if (EXTRA_MIMES_TYPE.has(extName)) {\n return EXTRA_MIMES_TYPE.get(extName)\n }\n const m = mime.lookup(extName)\n if (m) {\n return m.replace('/', '-')\n }\n return 'file'\n}\n\nexport function genEtag(file?: Pick<FileProps, 'size' | 'mtime'>, rPath?: string): string {\n if (!file) {\n if (!rPath) throw new Error('File or path are missing')\n const stats = statSync(rPath)\n file = { size: stats.size, mtime: stats.mtime.getTime() }\n }\n return `W/\"${file.size.toString(16)}-${file.mtime.toString(16)}\"`\n}\n\nexport function removeFiles(rPath: string): Promise<void> {\n // if the file does not exist, no error is thrown\n return fse.remove(rPath)\n}\n\nexport async function getProps(rPath: string, fPath?: string, isDir?: boolean): Promise<FileProps> {\n const stats = await fs.stat(rPath)\n const isDirectory = isDir === undefined ? stats.isDirectory() : isDir\n return {\n id: -stats.ino, // use negative number to avoid conflicts with existing database ids\n path: dirName(fPath !== undefined ? fPath : rPath),\n name: fileName(fPath !== undefined ? fPath : rPath),\n isDir: isDirectory,\n size: isDirectory ? 0 : stats.size,\n ctime: stats.birthtime.getTime(),\n mtime: stats.mtime.getTime(),\n mime: getMimeType(rPath, isDirectory)\n }\n}\n\nexport function touchFile(rPath: string, mtime?: number): Promise<void> {\n if (!mtime) mtime = currentTimeStamp()\n return fs.utimes(rPath, mtime, mtime)\n}\n\nexport async function copyFiles(srcPath: string, dstPath: string, overwrite = false, recursive = true, preserveTimestamps = true): Promise<void> {\n /*\n If src is a directory it will copy everything inside of this directory, not the entire directory itself\n If src is a file, dest cannot be a directory\n */\n if (!recursive && (await isPathIsDir(srcPath))) {\n await fs.mkdir(dstPath)\n if (preserveTimestamps) {\n const stat = await fs.stat(srcPath)\n await fs.utimes(dstPath, stat.atime, stat.mtime)\n }\n } else {\n await fse.copy(srcPath, dstPath, { overwrite, preserveTimestamps: preserveTimestamps })\n }\n}\n\nexport function moveFiles(srcPath: string, dstPath: string, overwrite = false): Promise<void> {\n /*\n If src is a file, dest must be a file and when src is a directory, dest must be a directory\n */\n return fse.move(srcPath, dstPath, { overwrite })\n}\n\nexport async function checksumFile(filePath: string, alg: string): Promise<string> {\n const hash = crypto.createHash(alg)\n const stream = createReadStream(filePath, { highWaterMark: DEFAULT_HIGH_WATER_MARK })\n await pipeline(stream, hash)\n return hash.digest('hex')\n}\n\nexport function writeFromStream(rPath: string, stream: Readable, start: number = 0): Promise<void> {\n const dst: WriteStream = createWriteStream(rPath, { flags: start ? 'a' : 'w', start: start, highWaterMark: DEFAULT_HIGH_WATER_MARK })\n return pipeline(stream, dst)\n}\n\nexport async function writeFromStreamAndChecksum(rPath: string, stream: Readable, hasRange: number, alg: string): Promise<string> {\n const hash = crypto.createHash(alg)\n if (hasRange) {\n const src = createReadStream(rPath, { highWaterMark: DEFAULT_HIGH_WATER_MARK })\n await pipeline(src, hash, { end: false })\n }\n const dst = createWriteStream(rPath, { flags: hasRange ? 'a' : 'w', highWaterMark: DEFAULT_HIGH_WATER_MARK })\n await pipeline(\n stream,\n async function* (source) {\n for await (const chunk of source) {\n hash.update(chunk)\n yield chunk\n }\n },\n dst\n )\n hash.end()\n return hash.digest('hex')\n}\n\nexport function copyFileContent(srcPath: string, dstPath: string): Promise<void> {\n const srcStream = createReadStream(srcPath, { highWaterMark: DEFAULT_HIGH_WATER_MARK })\n return writeFromStream(dstPath, srcStream)\n}\n\nexport async function dirSize(rPath: string): Promise<[number, any]> {\n let size = 0\n const errors: Record<string, string> = {}\n for (const f of await fs.readdir(rPath, { withFileTypes: true, recursive: true })) {\n if (f.isFile()) {\n const p = path.join(f.parentPath, f.name)\n try {\n size += (await fs.stat(p)).size\n } catch (e: any) {\n errors[p] = e.message\n }\n }\n }\n return [size, errors]\n}\n\nexport async function dirListFileNames(rPath: string): Promise<string[]> {\n return (await fs.readdir(rPath)).map((path: string) => fileName(path))\n}\n\nexport async function countDirEntries(rPath: string): Promise<{ files: number; directories: number }> {\n return (await fs.readdir(rPath, { withFileTypes: true, recursive: true })).reduce(\n (acc, f: Dirent) => {\n if (f.isDirectory()) {\n acc.directories++\n } else {\n acc.files++\n }\n return acc\n },\n { files: 0, directories: 0 }\n )\n}\n\nexport async function dirHasChildren(rPath: string, mustContainsDirs = true): Promise<boolean> {\n for await (const file of await fs.opendir(rPath)) {\n if (mustContainsDirs) {\n if (file.isDirectory()) return true\n } else {\n return true\n }\n }\n return false\n}\n\nexport async function uniqueFilePathFromDir(rPath: string): Promise<string> {\n if (await isPathExists(rPath)) {\n const parentDir = path.dirname(rPath)\n const extension = path.extname(rPath)\n const nameWithoutExtension = path.basename(rPath, extension)\n let count = 1\n while (await isPathExists(path.join(parentDir, `${nameWithoutExtension} (${count})${extension}`))) {\n count++\n }\n return path.join(parentDir, `${nameWithoutExtension} (${count})${extension}`)\n }\n return rPath\n}\n\nexport async function uniqueDatedFilePath(rPath: string): Promise<{ isDir: boolean; path: string }> {\n const date = formatDateISOString(new Date())\n if (await isPathIsDir(rPath)) {\n return { isDir: true, path: `${rPath}-${date}` }\n } else {\n const extension = path.extname(rPath)\n const nameWithoutExtension = path.basename(rPath, extension)\n return { isDir: true, path: path.join(path.dirname(rPath), `${nameWithoutExtension}-${date}${extension}`) }\n }\n}\n\nexport async function checkExternalPath(rPath: string) {\n if (!(await isPathExists(rPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'The location does not exist')\n }\n if (!(await isPathIsReadable(rPath))) {\n throw new FileError(HttpStatus.NOT_ACCEPTABLE, 'The location is not readable')\n }\n if (!(await isPathIsWriteable(rPath))) {\n throw new FileError(HttpStatus.NOT_ACCEPTABLE, 'The location is not writeable')\n }\n}\n"],"names":["checkExternalPath","checkFileName","checksumFile","copyFileContent","copyFiles","countDirEntries","createEmptyFile","dirHasChildren","dirListFileNames","dirName","dirSize","fileName","fileSize","genEtag","getMimeType","getProps","isPathExists","isPathIsDir","isPathIsReadable","isPathIsWriteable","makeDir","moveFiles","removeFiles","sanitizeName","sanitizePath","touchFile","uniqueDatedFilePath","uniqueFilePathFromDir","writeFromStream","writeFromStreamAndChecksum","fPath","path","normalize","replace","regExpPreventPathTraversal","name","fName","isValidFileName","FileError","HttpStatus","BAD_REQUEST","rPath","fse","pathExists","fs","access","constants","R_OK","W_OK","stat","isDirectory","posix","basename","dirname","size","writeFile","recursive","mkdir","isDir","extName","extname","EXTRA_MIMES_TYPE","has","get","m","mime","lookup","file","Error","stats","statSync","mtime","getTime","toString","remove","undefined","id","ino","ctime","birthtime","currentTimeStamp","utimes","srcPath","dstPath","overwrite","preserveTimestamps","atime","copy","move","filePath","alg","hash","crypto","createHash","stream","createReadStream","highWaterMark","DEFAULT_HIGH_WATER_MARK","pipeline","digest","start","dst","createWriteStream","flags","hasRange","src","end","source","chunk","update","srcStream","errors","f","readdir","withFileTypes","isFile","p","join","parentPath","e","message","map","reduce","acc","directories","files","mustContainsDirs","opendir","parentDir","extension","nameWithoutExtension","count","date","formatDateISOString","Date","NOT_FOUND","NOT_ACCEPTABLE"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAyQqBA;eAAAA;;QA5ONC;eAAAA;;QAgIMC;eAAAA;;QAiCNC;eAAAA;;QAxDMC;eAAAA;;QAiFAC;eAAAA;;QA1INC;eAAAA;;QAwJMC;eAAAA;;QAlBAC;eAAAA;;QA9INC;eAAAA;;QA8HMC;eAAAA;;QAlINC;eAAAA;;QAQMC;eAAAA;;QA2BNC;eAAAA;;QAfAC;eAAAA;;QA6BMC;eAAAA;;QA3ENC;eAAAA;;QAsBMC;eAAAA;;QAlBAC;eAAAA;;QASAC;eAAAA;;QA6BNC;eAAAA;;QAqEAC;eAAAA;;QAzCAC;eAAAA;;QAvFAC;eAAAA;;QAJAC;eAAAA;;QA+GAC;eAAAA;;QA6HMC;eAAAA;;QAdAC;eAAAA;;QA5ENC;eAAAA;;QAKMC;eAAAA;;;wBAvKK;gEAEX;kEACC;mEACE;wBACmD;iEACvD;iEACE;2BAEQ;2BACW;wBAC0C;uBACpB;2BAEhC;;;;;;AAEnB,SAASL,aAAaM,KAAa;IACxC,OAAOC,iBAAI,CAACC,SAAS,CAACF,OAAOG,OAAO,CAACC,kCAA0B,EAAE;AACnE;AAEO,SAASX,aAAaY,IAAY;IACvC,OAAOA,KACJF,OAAO,CAAC,gBAAgB,IAAI,4CAA4C;KACxEA,OAAO,CAAC,UAAU,IAAI,iBAAiB;KACvCA,OAAO,CAAC,SAAS,IAAI,cAAc;;AACxC;AAEO,SAAShC,cAAc6B,KAAa;IACzC,MAAMM,QAAQzB,SAASmB;IACvB,IAAI;QACFO,IAAAA,uBAAe,EAACD;QAChB,OAAOA;IACT,EAAE,OAAM;QACN,MAAM,IAAIE,oBAAS,CAACC,kBAAU,CAACC,WAAW,EAAE;IAC9C;AACF;AAEO,SAASxB,aAAayB,KAAa;IACxC,OAAOC,gBAAG,CAACC,UAAU,CAACF;AACxB;AAEO,eAAevB,iBAAiBuB,KAAa;IAClD,IAAI;QACF,MAAMG,iBAAE,CAACC,MAAM,CAACJ,OAAOG,iBAAE,CAACE,SAAS,CAACC,IAAI;IAC1C,EAAE,OAAM;QACN,OAAO;IACT;IACA,OAAO;AACT;AAEO,eAAe5B,kBAAkBsB,KAAa;IACnD,IAAI;QACF,MAAMG,iBAAE,CAACC,MAAM,CAACJ,OAAOG,iBAAE,CAACE,SAAS,CAACE,IAAI;IAC1C,EAAE,OAAM;QACN,OAAO;IACT;IACA,OAAO;AACT;AAEO,eAAe/B,YAAYwB,KAAa;IAC7C,OAAO,AAAC,CAAA,MAAMG,iBAAE,CAACK,IAAI,CAACR,MAAK,EAAGS,WAAW;AAC3C;AAEO,SAASvC,SAASmB,KAAa;IACpC,OAAOC,iBAAI,CAACoB,KAAK,CAACC,QAAQ,CAACtB;AAC7B;AAEO,SAASrB,QAAQqB,KAAa;IACnC,OAAOC,iBAAI,CAACsB,OAAO,CAACvB;AACtB;AAEO,eAAelB,SAAS6B,KAAa;IAC1C,OAAO,AAAC,CAAA,MAAMG,iBAAE,CAACK,IAAI,CAACR,MAAK,EAAGa,IAAI;AACpC;AAEO,SAAShD,gBAAgBmC,KAAa;IAC3C,OAAOG,iBAAE,CAACW,SAAS,CAACd,OAAO;AAC7B;AAEO,SAASrB,QAAQqB,KAAa,EAAEe,SAAmB;IACxD,OAAOZ,iBAAE,CAACa,KAAK,CAAChB,OAAO;QAAEe,WAAWA;IAAU;AAChD;AAEO,SAAS1C,YAAYgB,KAAa,EAAE4B,KAAc;IACvD,IAAIA,OAAO;QACT,OAAO;IACT;IACA,MAAMC,UAAkB5B,iBAAI,CAAC6B,OAAO,CAAC9B;IACrC,IAAI+B,uBAAgB,CAACC,GAAG,CAACH,UAAU;QACjC,OAAOE,uBAAgB,CAACE,GAAG,CAACJ;IAC9B;IACA,MAAMK,IAAIC,kBAAI,CAACC,MAAM,CAACP;IACtB,IAAIK,GAAG;QACL,OAAOA,EAAE/B,OAAO,CAAC,KAAK;IACxB;IACA,OAAO;AACT;AAEO,SAASpB,QAAQsD,IAAwC,EAAE1B,KAAc;IAC9E,IAAI,CAAC0B,MAAM;QACT,IAAI,CAAC1B,OAAO,MAAM,IAAI2B,MAAM;QAC5B,MAAMC,QAAQC,IAAAA,gBAAQ,EAAC7B;QACvB0B,OAAO;YAAEb,MAAMe,MAAMf,IAAI;YAAEiB,OAAOF,MAAME,KAAK,CAACC,OAAO;QAAG;IAC1D;IACA,OAAO,CAAC,GAAG,EAAEL,KAAKb,IAAI,CAACmB,QAAQ,CAAC,IAAI,CAAC,EAAEN,KAAKI,KAAK,CAACE,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnE;AAEO,SAASnD,YAAYmB,KAAa;IACvC,iDAAiD;IACjD,OAAOC,gBAAG,CAACgC,MAAM,CAACjC;AACpB;AAEO,eAAe1B,SAAS0B,KAAa,EAAEX,KAAc,EAAE4B,KAAe;IAC3E,MAAMW,QAAQ,MAAMzB,iBAAE,CAACK,IAAI,CAACR;IAC5B,MAAMS,cAAcQ,UAAUiB,YAAYN,MAAMnB,WAAW,KAAKQ;IAChE,OAAO;QACLkB,IAAI,CAACP,MAAMQ,GAAG;QACd9C,MAAMtB,QAAQqB,UAAU6C,YAAY7C,QAAQW;QAC5CN,MAAMxB,SAASmB,UAAU6C,YAAY7C,QAAQW;QAC7CiB,OAAOR;QACPI,MAAMJ,cAAc,IAAImB,MAAMf,IAAI;QAClCwB,OAAOT,MAAMU,SAAS,CAACP,OAAO;QAC9BD,OAAOF,MAAME,KAAK,CAACC,OAAO;QAC1BP,MAAMnD,YAAY2B,OAAOS;IAC3B;AACF;AAEO,SAASzB,UAAUgB,KAAa,EAAE8B,KAAc;IACrD,IAAI,CAACA,OAAOA,QAAQS,IAAAA,wBAAgB;IACpC,OAAOpC,iBAAE,CAACqC,MAAM,CAACxC,OAAO8B,OAAOA;AACjC;AAEO,eAAenE,UAAU8E,OAAe,EAAEC,OAAe,EAAEC,YAAY,KAAK,EAAE5B,YAAY,IAAI,EAAE6B,qBAAqB,IAAI;IAC9H;;;GAGC,GACD,IAAI,CAAC7B,aAAc,MAAMvC,YAAYiE,UAAW;QAC9C,MAAMtC,iBAAE,CAACa,KAAK,CAAC0B;QACf,IAAIE,oBAAoB;YACtB,MAAMpC,OAAO,MAAML,iBAAE,CAACK,IAAI,CAACiC;YAC3B,MAAMtC,iBAAE,CAACqC,MAAM,CAACE,SAASlC,KAAKqC,KAAK,EAAErC,KAAKsB,KAAK;QACjD;IACF,OAAO;QACL,MAAM7B,gBAAG,CAAC6C,IAAI,CAACL,SAASC,SAAS;YAAEC;YAAWC,oBAAoBA;QAAmB;IACvF;AACF;AAEO,SAAShE,UAAU6D,OAAe,EAAEC,OAAe,EAAEC,YAAY,KAAK;IAC3E;;GAEC,GACD,OAAO1C,gBAAG,CAAC8C,IAAI,CAACN,SAASC,SAAS;QAAEC;IAAU;AAChD;AAEO,eAAelF,aAAauF,QAAgB,EAAEC,GAAW;IAC9D,MAAMC,OAAOC,mBAAM,CAACC,UAAU,CAACH;IAC/B,MAAMI,SAASC,IAAAA,wBAAgB,EAACN,UAAU;QAAEO,eAAeC,8BAAuB;IAAC;IACnF,MAAMC,IAAAA,mBAAQ,EAACJ,QAAQH;IACvB,OAAOA,KAAKQ,MAAM,CAAC;AACrB;AAEO,SAASvE,gBAAgBa,KAAa,EAAEqD,MAAgB,EAAEM,QAAgB,CAAC;IAChF,MAAMC,MAAmBC,IAAAA,yBAAiB,EAAC7D,OAAO;QAAE8D,OAAOH,QAAQ,MAAM;QAAKA,OAAOA;QAAOJ,eAAeC,8BAAuB;IAAC;IACnI,OAAOC,IAAAA,mBAAQ,EAACJ,QAAQO;AAC1B;AAEO,eAAexE,2BAA2BY,KAAa,EAAEqD,MAAgB,EAAEU,QAAgB,EAAEd,GAAW;IAC7G,MAAMC,OAAOC,mBAAM,CAACC,UAAU,CAACH;IAC/B,IAAIc,UAAU;QACZ,MAAMC,MAAMV,IAAAA,wBAAgB,EAACtD,OAAO;YAAEuD,eAAeC,8BAAuB;QAAC;QAC7E,MAAMC,IAAAA,mBAAQ,EAACO,KAAKd,MAAM;YAAEe,KAAK;QAAM;IACzC;IACA,MAAML,MAAMC,IAAAA,yBAAiB,EAAC7D,OAAO;QAAE8D,OAAOC,WAAW,MAAM;QAAKR,eAAeC,8BAAuB;IAAC;IAC3G,MAAMC,IAAAA,mBAAQ,EACZJ,QACA,gBAAiBa,MAAM;QACrB,WAAW,MAAMC,SAASD,OAAQ;YAChChB,KAAKkB,MAAM,CAACD;YACZ,MAAMA;QACR;IACF,GACAP;IAEFV,KAAKe,GAAG;IACR,OAAOf,KAAKQ,MAAM,CAAC;AACrB;AAEO,SAAShG,gBAAgB+E,OAAe,EAAEC,OAAe;IAC9D,MAAM2B,YAAYf,IAAAA,wBAAgB,EAACb,SAAS;QAAEc,eAAeC,8BAAuB;IAAC;IACrF,OAAOrE,gBAAgBuD,SAAS2B;AAClC;AAEO,eAAepG,QAAQ+B,KAAa;IACzC,IAAIa,OAAO;IACX,MAAMyD,SAAiC,CAAC;IACxC,KAAK,MAAMC,KAAK,CAAA,MAAMpE,iBAAE,CAACqE,OAAO,CAACxE,OAAO;QAAEyE,eAAe;QAAM1D,WAAW;IAAK,EAAC,EAAG;QACjF,IAAIwD,EAAEG,MAAM,IAAI;YACd,MAAMC,IAAIrF,iBAAI,CAACsF,IAAI,CAACL,EAAEM,UAAU,EAAEN,EAAE7E,IAAI;YACxC,IAAI;gBACFmB,QAAQ,AAAC,CAAA,MAAMV,iBAAE,CAACK,IAAI,CAACmE,EAAC,EAAG9D,IAAI;YACjC,EAAE,OAAOiE,GAAQ;gBACfR,MAAM,CAACK,EAAE,GAAGG,EAAEC,OAAO;YACvB;QACF;IACF;IACA,OAAO;QAAClE;QAAMyD;KAAO;AACvB;AAEO,eAAevG,iBAAiBiC,KAAa;IAClD,OAAO,AAAC,CAAA,MAAMG,iBAAE,CAACqE,OAAO,CAACxE,MAAK,EAAGgF,GAAG,CAAC,CAAC1F,OAAiBpB,SAASoB;AAClE;AAEO,eAAe1B,gBAAgBoC,KAAa;IACjD,OAAO,AAAC,CAAA,MAAMG,iBAAE,CAACqE,OAAO,CAACxE,OAAO;QAAEyE,eAAe;QAAM1D,WAAW;IAAK,EAAC,EAAGkE,MAAM,CAC/E,CAACC,KAAKX;QACJ,IAAIA,EAAE9D,WAAW,IAAI;YACnByE,IAAIC,WAAW;QACjB,OAAO;YACLD,IAAIE,KAAK;QACX;QACA,OAAOF;IACT,GACA;QAAEE,OAAO;QAAGD,aAAa;IAAE;AAE/B;AAEO,eAAerH,eAAekC,KAAa,EAAEqF,mBAAmB,IAAI;IACzE,WAAW,MAAM3D,QAAQ,CAAA,MAAMvB,iBAAE,CAACmF,OAAO,CAACtF,MAAK,EAAG;QAChD,IAAIqF,kBAAkB;YACpB,IAAI3D,KAAKjB,WAAW,IAAI,OAAO;QACjC,OAAO;YACL,OAAO;QACT;IACF;IACA,OAAO;AACT;AAEO,eAAevB,sBAAsBc,KAAa;IACvD,IAAI,MAAMzB,aAAayB,QAAQ;QAC7B,MAAMuF,YAAYjG,iBAAI,CAACsB,OAAO,CAACZ;QAC/B,MAAMwF,YAAYlG,iBAAI,CAAC6B,OAAO,CAACnB;QAC/B,MAAMyF,uBAAuBnG,iBAAI,CAACqB,QAAQ,CAACX,OAAOwF;QAClD,IAAIE,QAAQ;QACZ,MAAO,MAAMnH,aAAae,iBAAI,CAACsF,IAAI,CAACW,WAAW,GAAGE,qBAAqB,EAAE,EAAEC,MAAM,CAAC,EAAEF,WAAW,GAAI;YACjGE;QACF;QACA,OAAOpG,iBAAI,CAACsF,IAAI,CAACW,WAAW,GAAGE,qBAAqB,EAAE,EAAEC,MAAM,CAAC,EAAEF,WAAW;IAC9E;IACA,OAAOxF;AACT;AAEO,eAAef,oBAAoBe,KAAa;IACrD,MAAM2F,OAAOC,IAAAA,8BAAmB,EAAC,IAAIC;IACrC,IAAI,MAAMrH,YAAYwB,QAAQ;QAC5B,OAAO;YAAEiB,OAAO;YAAM3B,MAAM,GAAGU,MAAM,CAAC,EAAE2F,MAAM;QAAC;IACjD,OAAO;QACL,MAAMH,YAAYlG,iBAAI,CAAC6B,OAAO,CAACnB;QAC/B,MAAMyF,uBAAuBnG,iBAAI,CAACqB,QAAQ,CAACX,OAAOwF;QAClD,OAAO;YAAEvE,OAAO;YAAM3B,MAAMA,iBAAI,CAACsF,IAAI,CAACtF,iBAAI,CAACsB,OAAO,CAACZ,QAAQ,GAAGyF,qBAAqB,CAAC,EAAEE,OAAOH,WAAW;QAAE;IAC5G;AACF;AAEO,eAAejI,kBAAkByC,KAAa;IACnD,IAAI,CAAE,MAAMzB,aAAayB,QAAS;QAChC,MAAM,IAAIH,oBAAS,CAACC,kBAAU,CAACgG,SAAS,EAAE;IAC5C;IACA,IAAI,CAAE,MAAMrH,iBAAiBuB,QAAS;QACpC,MAAM,IAAIH,oBAAS,CAACC,kBAAU,CAACiG,cAAc,EAAE;IACjD;IACA,IAAI,CAAE,MAAMrH,kBAAkBsB,QAAS;QACrC,MAAM,IAAIH,oBAAS,CAACC,kBAAU,CAACiG,cAAc,EAAE;IACjD;AACF"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/utils/files.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpStatus } from '@nestjs/common'\nimport { WriteStream } from 'fs'\nimport fse from 'fs-extra'\nimport mime from 'mime-types'\nimport crypto from 'node:crypto'\nimport { createReadStream, createWriteStream, Dirent, statSync } from 'node:fs'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { formatDateISOString } from '../../../common/functions'\nimport { currentTimeStamp, isValidFileName, regExpPreventPathTraversal } from '../../../common/shared'\nimport { DEFAULT_HIGH_WATER_MARK, EXTRA_MIMES_TYPE } from '../constants/files'\nimport type { FileProps } from '../interfaces/file-props.interface'\nimport { FileError } from '../models/file-error'\n\nexport function sanitizePath(fPath: string): string {\n return path.normalize(fPath).replace(regExpPreventPathTraversal, '')\n}\n\nexport function sanitizeName(name: string): string {\n return name\n .replace(/^\\s+|[. ]+$/g, '') // trimStart + trimEnd + strip trailing dots\n .replace(/[/\\\\]/g, '') // remove slashes\n .replace(/\\.\\./g, '') // remove '..'\n}\n\nexport function checkFileName(fPath: string): string {\n const fName = fileName(fPath)\n try {\n isValidFileName(fName)\n return fName\n } catch {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Forbidden characters')\n }\n}\n\nexport function isPathExists(rPath: string): Promise<boolean> {\n return fse.pathExists(rPath)\n}\n\nexport async function isPathIsReadable(rPath: string): Promise<boolean> {\n try {\n await fs.access(rPath, fs.constants.R_OK)\n } catch {\n return false\n }\n return true\n}\n\nexport async function isPathIsWriteable(rPath: string): Promise<boolean> {\n try {\n await fs.access(rPath, fs.constants.W_OK)\n } catch {\n return false\n }\n return true\n}\n\nexport async function isPathIsDir(rPath: string): Promise<boolean> {\n return (await fs.stat(rPath)).isDirectory()\n}\n\nexport function fileName(fPath: string): string {\n return path.posix.basename(fPath)\n}\n\nexport function dirName(fPath: string): string {\n return path.dirname(fPath)\n}\n\nexport async function fileSize(rPath: string): Promise<number> {\n return (await fs.stat(rPath)).size\n}\n\nexport function createEmptyFile(rPath: string): Promise<void> {\n return fs.writeFile(rPath, '')\n}\n\nexport function makeDir(rPath: string, recursive?: boolean): Promise<string> {\n return fs.mkdir(rPath, { recursive: recursive })\n}\n\nexport function getMimeType(fPath: string, isDir: boolean): string {\n if (isDir) {\n return 'directory'\n }\n const extName: string = path.extname(fPath)\n if (EXTRA_MIMES_TYPE.has(extName)) {\n return EXTRA_MIMES_TYPE.get(extName)\n }\n const m = mime.lookup(extName)\n if (m) {\n return m.replace('/', '-')\n }\n return 'file'\n}\n\nexport function genEtag(file?: Pick<FileProps, 'size' | 'mtime'>, rPath?: string): string {\n if (!file) {\n if (!rPath) throw new Error('File or path are missing')\n const stats = statSync(rPath)\n file = { size: stats.size, mtime: stats.mtime.getTime() }\n }\n return `W/\"${file.size.toString(16)}-${file.mtime.toString(16)}\"`\n}\n\nexport function removeFiles(rPath: string): Promise<void> {\n // if the file does not exist, no error is thrown\n return fse.remove(rPath)\n}\n\nexport async function getProps(rPath: string, fPath?: string, isDir?: boolean): Promise<FileProps> {\n const stats = await fs.stat(rPath)\n const isDirectory = isDir === undefined ? stats.isDirectory() : isDir\n return {\n id: -stats.ino, // use negative number to avoid conflicts with existing database ids\n path: dirName(fPath !== undefined ? fPath : rPath),\n name: fileName(fPath !== undefined ? fPath : rPath),\n isDir: isDirectory,\n size: isDirectory ? 0 : stats.size,\n ctime: stats.birthtime.getTime(),\n mtime: stats.mtime.getTime(),\n mime: getMimeType(rPath, isDirectory)\n }\n}\n\nexport function touchFile(rPath: string, mtime?: number): Promise<void> {\n if (!mtime) mtime = currentTimeStamp()\n return fs.utimes(rPath, mtime, mtime)\n}\n\nexport async function copyFiles(srcPath: string, dstPath: string, overwrite = false, recursive = true, preserveTimestamps = true): Promise<void> {\n /*\n If src is a directory it will copy everything inside of this directory, not the entire directory itself\n If src is a file, dest cannot be a directory\n */\n if (!recursive && (await isPathIsDir(srcPath))) {\n await fs.mkdir(dstPath)\n if (preserveTimestamps) {\n const stat = await fs.stat(srcPath)\n await fs.utimes(dstPath, stat.atime, stat.mtime)\n }\n } else {\n await fse.copy(srcPath, dstPath, { overwrite, preserveTimestamps: preserveTimestamps })\n }\n}\n\nexport function moveFiles(srcPath: string, dstPath: string, overwrite = false): Promise<void> {\n /*\n If src is a file, dest must be a file and when src is a directory, dest must be a directory\n */\n return fse.move(srcPath, dstPath, { overwrite })\n}\n\nexport async function checksumFile(filePath: string, alg: string): Promise<string> {\n const hash = crypto.createHash(alg)\n const stream = createReadStream(filePath, { highWaterMark: DEFAULT_HIGH_WATER_MARK })\n await pipeline(stream, hash)\n return hash.digest('hex')\n}\n\nexport function writeFromStream(rPath: string, stream: Readable, start: number = 0): Promise<void> {\n const dst: WriteStream = createWriteStream(rPath, { flags: start ? 'a' : 'w', start: start, highWaterMark: DEFAULT_HIGH_WATER_MARK })\n return pipeline(stream, dst)\n}\n\nexport async function writeFromStreamAndChecksum(rPath: string, stream: Readable, hasRange: number, alg: string): Promise<string> {\n const hash = crypto.createHash(alg)\n if (hasRange) {\n const src = createReadStream(rPath, { highWaterMark: DEFAULT_HIGH_WATER_MARK })\n await pipeline(src, hash, { end: false })\n }\n const dst = createWriteStream(rPath, { flags: hasRange ? 'a' : 'w', highWaterMark: DEFAULT_HIGH_WATER_MARK })\n await pipeline(\n stream,\n async function* (source) {\n for await (const chunk of source) {\n hash.update(chunk)\n yield chunk\n }\n },\n dst\n )\n hash.end()\n return hash.digest('hex')\n}\n\nexport function copyFileContent(srcPath: string, dstPath: string): Promise<void> {\n const srcStream = createReadStream(srcPath, { highWaterMark: DEFAULT_HIGH_WATER_MARK })\n return writeFromStream(dstPath, srcStream)\n}\n\nexport async function dirSize(rPath: string): Promise<[number, any]> {\n let size = 0\n const errors: Record<string, string> = {}\n for (const f of await fs.readdir(rPath, { withFileTypes: true, recursive: true })) {\n if (f.isFile()) {\n const p = path.join(f.parentPath, f.name)\n try {\n size += (await fs.stat(p)).size\n } catch (e: any) {\n errors[p] = e.message\n }\n }\n }\n return [size, errors]\n}\n\nexport async function dirListFileNames(rPath: string): Promise<string[]> {\n return (await fs.readdir(rPath)).map((path: string) => fileName(path))\n}\n\nexport async function countDirEntries(rPath: string): Promise<{ files: number; directories: number }> {\n return (await fs.readdir(rPath, { withFileTypes: true, recursive: true })).reduce(\n (acc, f: Dirent) => {\n if (f.isDirectory()) {\n acc.directories++\n } else {\n acc.files++\n }\n return acc\n },\n { files: 0, directories: 0 }\n )\n}\n\nexport async function dirHasChildren(rPath: string, mustContainsDirs = true): Promise<boolean> {\n for await (const file of await fs.opendir(rPath)) {\n if (mustContainsDirs) {\n if (file.isDirectory()) return true\n } else {\n return true\n }\n }\n return false\n}\n\nexport async function uniqueFilePathFromDir(rPath: string): Promise<string> {\n if (await isPathExists(rPath)) {\n const parentDir = path.dirname(rPath)\n const extension = path.extname(rPath)\n const nameWithoutExtension = path.basename(rPath, extension)\n let count = 1\n while (await isPathExists(path.join(parentDir, `${nameWithoutExtension} (${count})${extension}`))) {\n count++\n }\n return path.join(parentDir, `${nameWithoutExtension} (${count})${extension}`)\n }\n return rPath\n}\n\nexport async function uniqueDatedFilePath(rPath: string): Promise<{ isDir: boolean; path: string }> {\n const date = formatDateISOString(new Date())\n if (await isPathIsDir(rPath)) {\n return { isDir: true, path: `${rPath}-${date}` }\n } else {\n const extension = path.extname(rPath)\n const nameWithoutExtension = path.basename(rPath, extension)\n return { isDir: false, path: path.join(path.dirname(rPath), `${nameWithoutExtension}-${date}${extension}`) }\n }\n}\n\nexport async function checkExternalPath(rPath: string) {\n if (!(await isPathExists(rPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'The location does not exist')\n }\n if (!(await isPathIsReadable(rPath))) {\n throw new FileError(HttpStatus.NOT_ACCEPTABLE, 'The location is not readable')\n }\n if (!(await isPathIsWriteable(rPath))) {\n throw new FileError(HttpStatus.NOT_ACCEPTABLE, 'The location is not writeable')\n }\n}\n"],"names":["checkExternalPath","checkFileName","checksumFile","copyFileContent","copyFiles","countDirEntries","createEmptyFile","dirHasChildren","dirListFileNames","dirName","dirSize","fileName","fileSize","genEtag","getMimeType","getProps","isPathExists","isPathIsDir","isPathIsReadable","isPathIsWriteable","makeDir","moveFiles","removeFiles","sanitizeName","sanitizePath","touchFile","uniqueDatedFilePath","uniqueFilePathFromDir","writeFromStream","writeFromStreamAndChecksum","fPath","path","normalize","replace","regExpPreventPathTraversal","name","fName","isValidFileName","FileError","HttpStatus","BAD_REQUEST","rPath","fse","pathExists","fs","access","constants","R_OK","W_OK","stat","isDirectory","posix","basename","dirname","size","writeFile","recursive","mkdir","isDir","extName","extname","EXTRA_MIMES_TYPE","has","get","m","mime","lookup","file","Error","stats","statSync","mtime","getTime","toString","remove","undefined","id","ino","ctime","birthtime","currentTimeStamp","utimes","srcPath","dstPath","overwrite","preserveTimestamps","atime","copy","move","filePath","alg","hash","crypto","createHash","stream","createReadStream","highWaterMark","DEFAULT_HIGH_WATER_MARK","pipeline","digest","start","dst","createWriteStream","flags","hasRange","src","end","source","chunk","update","srcStream","errors","f","readdir","withFileTypes","isFile","p","join","parentPath","e","message","map","reduce","acc","directories","files","mustContainsDirs","opendir","parentDir","extension","nameWithoutExtension","count","date","formatDateISOString","Date","NOT_FOUND","NOT_ACCEPTABLE"],"mappings":"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"}
@@ -32,7 +32,7 @@ let SendFile = class SendFile {
32
32
  async stream(req, res) {
33
33
  // SendStream manages HEAD (no including body in response) & GET request (with body)
34
34
  // Ranges, LastModified, Etag are also handled
35
- // Send function uses decodeURIComponent, but filePath is already decoded : we need to encode it again before passing it.
35
+ // Send function uses decodeURIComponent, but filePath is already decoded: we need to encode it again before passing it.
36
36
  const encodedFilePath = encodeURIComponent(this.filePath);
37
37
  this.fileName = encodeURIComponent(this.downloadName ? this.downloadName : (0, _files1.fileName)(this.filePath));
38
38
  const sendResult = await (0, _send.send)(req.raw, encodedFilePath, this.sendOptions);
@@ -56,7 +56,8 @@ let SendFile = class SendFile {
56
56
  etag: true,
57
57
  dotfiles: 'allow',
58
58
  lastModified: true,
59
- cacheControl: false,
59
+ cacheControl: true,
60
+ maxAge: 0,
60
61
  index: false,
61
62
  highWaterMark: _files.DEFAULT_HIGH_WATER_MARK
62
63
  }){
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/utils/send-file.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { send, SendOptions, SendResult } from '@fastify/send'\nimport { HttpStatus, StreamableFile } from '@nestjs/common'\nimport { FastifyReply, FastifyRequest } from 'fastify'\nimport { DEFAULT_HIGH_WATER_MARK } from '../constants/files'\nimport { FileError } from '../models/file-error'\nimport { fileName, isPathExists, isPathIsDir, isPathIsReadable } from './files'\n\nexport class SendFile {\n private fileName: string\n\n constructor(\n private readonly filePath: string,\n private readonly asAttachment = true,\n private readonly downloadName = '',\n private readonly sendOptions: SendOptions = {\n acceptRanges: true,\n etag: true,\n dotfiles: 'allow',\n lastModified: true,\n cacheControl: false,\n index: false,\n highWaterMark: DEFAULT_HIGH_WATER_MARK\n }\n ) {}\n\n async checks() {\n if (!(await isPathExists(this.filePath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (await isPathIsDir(this.filePath)) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'The location is a directory')\n }\n if (!(await isPathIsReadable(this.filePath))) {\n throw new FileError(HttpStatus.METHOD_NOT_ALLOWED, 'The location is not readable')\n }\n }\n\n async stream(req: FastifyRequest, res: FastifyReply): Promise<StreamableFile> {\n // SendStream manages HEAD (no including body in response) & GET request (with body)\n // Ranges, LastModified, Etag are also handled\n // Send function uses decodeURIComponent, but filePath is already decoded : we need to encode it again before passing it.\n const encodedFilePath = encodeURIComponent(this.filePath)\n this.fileName = encodeURIComponent(this.downloadName ? this.downloadName : fileName(this.filePath))\n const sendResult: SendResult = await send(req.raw, encodedFilePath, this.sendOptions)\n // Check if the path was correctly validated\n if (sendResult.metadata['path'] === undefined) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Location not found')\n }\n if (this.asAttachment) {\n const downloadName = this.fileName.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n sendResult.headers['content-disposition'] = `attachment; filename=\"${downloadName}\";filename*=UTF-8''${this.fileName}`\n }\n res.headers(sendResult.headers)\n res.status(sendResult.statusCode)\n // sendStream.once('stream', () => console.log(`Sending: ${this.fileName}`))\n // sendStream.once('end', () => console.log(`Received: ${this.fileName}`))\n // sendStream.once('error', (e: Error) => console.error(`Transfer error : ${this.fileName} - ${e}`))\n return new StreamableFile(sendResult.stream)\n }\n}\n"],"names":["SendFile","checks","isPathExists","filePath","FileError","HttpStatus","NOT_FOUND","isPathIsDir","BAD_REQUEST","isPathIsReadable","METHOD_NOT_ALLOWED","stream","req","res","encodedFilePath","encodeURIComponent","fileName","downloadName","sendResult","send","raw","sendOptions","metadata","undefined","asAttachment","normalize","replace","headers","status","statusCode","StreamableFile","acceptRanges","etag","dotfiles","lastModified","cacheControl","index","highWaterMark","DEFAULT_HIGH_WATER_MARK"],"mappings":"AAAA;;;;CAIC;;;;+BASYA;;;eAAAA;;;sBAPiC;wBACH;uBAEH;2BACd;wBAC4C;AAE/D,IAAA,AAAMA,WAAN,MAAMA;IAkBX,MAAMC,SAAS;QACb,IAAI,CAAE,MAAMC,IAAAA,oBAAY,EAAC,IAAI,CAACC,QAAQ,GAAI;YACxC,MAAM,IAAIC,oBAAS,CAACC,kBAAU,CAACC,SAAS,EAAE;QAC5C;QACA,IAAI,MAAMC,IAAAA,mBAAW,EAAC,IAAI,CAACJ,QAAQ,GAAG;YACpC,MAAM,IAAIC,oBAAS,CAACC,kBAAU,CAACG,WAAW,EAAE;QAC9C;QACA,IAAI,CAAE,MAAMC,IAAAA,wBAAgB,EAAC,IAAI,CAACN,QAAQ,GAAI;YAC5C,MAAM,IAAIC,oBAAS,CAACC,kBAAU,CAACK,kBAAkB,EAAE;QACrD;IACF;IAEA,MAAMC,OAAOC,GAAmB,EAAEC,GAAiB,EAA2B;QAC5E,oFAAoF;QACpF,8CAA8C;QAC9C,yHAAyH;QACzH,MAAMC,kBAAkBC,mBAAmB,IAAI,CAACZ,QAAQ;QACxD,IAAI,CAACa,QAAQ,GAAGD,mBAAmB,IAAI,CAACE,YAAY,GAAG,IAAI,CAACA,YAAY,GAAGD,IAAAA,gBAAQ,EAAC,IAAI,CAACb,QAAQ;QACjG,MAAMe,aAAyB,MAAMC,IAAAA,UAAI,EAACP,IAAIQ,GAAG,EAAEN,iBAAiB,IAAI,CAACO,WAAW;QACpF,4CAA4C;QAC5C,IAAIH,WAAWI,QAAQ,CAAC,OAAO,KAAKC,WAAW;YAC7C,MAAM,IAAInB,oBAAS,CAACC,kBAAU,CAACG,WAAW,EAAE;QAC9C;QACA,IAAI,IAAI,CAACgB,YAAY,EAAE;YACrB,MAAMP,eAAe,IAAI,CAACD,QAAQ,CAACS,SAAS,CAAC,OAAOC,OAAO,CAAC,oBAAoB;YAChFR,WAAWS,OAAO,CAAC,sBAAsB,GAAG,CAAC,sBAAsB,EAAEV,aAAa,mBAAmB,EAAE,IAAI,CAACD,QAAQ,EAAE;QACxH;QACAH,IAAIc,OAAO,CAACT,WAAWS,OAAO;QAC9Bd,IAAIe,MAAM,CAACV,WAAWW,UAAU;QAChC,4EAA4E;QAC5E,0EAA0E;QAC1E,oGAAoG;QACpG,OAAO,IAAIC,sBAAc,CAACZ,WAAWP,MAAM;IAC7C;IAhDA,YACE,AAAiBR,QAAgB,EACjC,AAAiBqB,eAAe,IAAI,EACpC,AAAiBP,eAAe,EAAE,EAClC,AAAiBI,cAA2B;QAC1CU,cAAc;QACdC,MAAM;QACNC,UAAU;QACVC,cAAc;QACdC,cAAc;QACdC,OAAO;QACPC,eAAeC,8BAAuB;IACxC,CAAC,CACD;aAZiBnC,WAAAA;aACAqB,eAAAA;aACAP,eAAAA;aACAI,cAAAA;IAShB;AAoCL"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/utils/send-file.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { send, SendOptions, SendResult } from '@fastify/send'\nimport { HttpStatus, StreamableFile } from '@nestjs/common'\nimport { FastifyReply, FastifyRequest } from 'fastify'\nimport { DEFAULT_HIGH_WATER_MARK } from '../constants/files'\nimport { FileError } from '../models/file-error'\nimport { fileName, isPathExists, isPathIsDir, isPathIsReadable } from './files'\n\nexport class SendFile {\n private fileName: string\n\n constructor(\n private readonly filePath: string,\n private readonly asAttachment = true,\n private readonly downloadName = '',\n private readonly sendOptions: SendOptions = {\n acceptRanges: true,\n etag: true,\n dotfiles: 'allow',\n lastModified: true,\n cacheControl: true,\n maxAge: 0,\n index: false,\n highWaterMark: DEFAULT_HIGH_WATER_MARK\n }\n ) {}\n\n async checks() {\n if (!(await isPathExists(this.filePath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (await isPathIsDir(this.filePath)) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'The location is a directory')\n }\n if (!(await isPathIsReadable(this.filePath))) {\n throw new FileError(HttpStatus.METHOD_NOT_ALLOWED, 'The location is not readable')\n }\n }\n\n async stream(req: FastifyRequest, res: FastifyReply): Promise<StreamableFile> {\n // SendStream manages HEAD (no including body in response) & GET request (with body)\n // Ranges, LastModified, Etag are also handled\n // Send function uses decodeURIComponent, but filePath is already decoded: we need to encode it again before passing it.\n const encodedFilePath = encodeURIComponent(this.filePath)\n this.fileName = encodeURIComponent(this.downloadName ? this.downloadName : fileName(this.filePath))\n const sendResult: SendResult = await send(req.raw, encodedFilePath, this.sendOptions)\n // Check if the path was correctly validated\n if (sendResult.metadata['path'] === undefined) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Location not found')\n }\n if (this.asAttachment) {\n const downloadName = this.fileName.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n sendResult.headers['content-disposition'] = `attachment; filename=\"${downloadName}\";filename*=UTF-8''${this.fileName}`\n }\n res.headers(sendResult.headers)\n res.status(sendResult.statusCode)\n // sendStream.once('stream', () => console.log(`Sending: ${this.fileName}`))\n // sendStream.once('end', () => console.log(`Received: ${this.fileName}`))\n // sendStream.once('error', (e: Error) => console.error(`Transfer error : ${this.fileName} - ${e}`))\n return new StreamableFile(sendResult.stream)\n }\n}\n"],"names":["SendFile","checks","isPathExists","filePath","FileError","HttpStatus","NOT_FOUND","isPathIsDir","BAD_REQUEST","isPathIsReadable","METHOD_NOT_ALLOWED","stream","req","res","encodedFilePath","encodeURIComponent","fileName","downloadName","sendResult","send","raw","sendOptions","metadata","undefined","asAttachment","normalize","replace","headers","status","statusCode","StreamableFile","acceptRanges","etag","dotfiles","lastModified","cacheControl","maxAge","index","highWaterMark","DEFAULT_HIGH_WATER_MARK"],"mappings":"AAAA;;;;CAIC;;;;+BASYA;;;eAAAA;;;sBAPiC;wBACH;uBAEH;2BACd;wBAC4C;AAE/D,IAAA,AAAMA,WAAN,MAAMA;IAmBX,MAAMC,SAAS;QACb,IAAI,CAAE,MAAMC,IAAAA,oBAAY,EAAC,IAAI,CAACC,QAAQ,GAAI;YACxC,MAAM,IAAIC,oBAAS,CAACC,kBAAU,CAACC,SAAS,EAAE;QAC5C;QACA,IAAI,MAAMC,IAAAA,mBAAW,EAAC,IAAI,CAACJ,QAAQ,GAAG;YACpC,MAAM,IAAIC,oBAAS,CAACC,kBAAU,CAACG,WAAW,EAAE;QAC9C;QACA,IAAI,CAAE,MAAMC,IAAAA,wBAAgB,EAAC,IAAI,CAACN,QAAQ,GAAI;YAC5C,MAAM,IAAIC,oBAAS,CAACC,kBAAU,CAACK,kBAAkB,EAAE;QACrD;IACF;IAEA,MAAMC,OAAOC,GAAmB,EAAEC,GAAiB,EAA2B;QAC5E,oFAAoF;QACpF,8CAA8C;QAC9C,wHAAwH;QACxH,MAAMC,kBAAkBC,mBAAmB,IAAI,CAACZ,QAAQ;QACxD,IAAI,CAACa,QAAQ,GAAGD,mBAAmB,IAAI,CAACE,YAAY,GAAG,IAAI,CAACA,YAAY,GAAGD,IAAAA,gBAAQ,EAAC,IAAI,CAACb,QAAQ;QACjG,MAAMe,aAAyB,MAAMC,IAAAA,UAAI,EAACP,IAAIQ,GAAG,EAAEN,iBAAiB,IAAI,CAACO,WAAW;QACpF,4CAA4C;QAC5C,IAAIH,WAAWI,QAAQ,CAAC,OAAO,KAAKC,WAAW;YAC7C,MAAM,IAAInB,oBAAS,CAACC,kBAAU,CAACG,WAAW,EAAE;QAC9C;QACA,IAAI,IAAI,CAACgB,YAAY,EAAE;YACrB,MAAMP,eAAe,IAAI,CAACD,QAAQ,CAACS,SAAS,CAAC,OAAOC,OAAO,CAAC,oBAAoB;YAChFR,WAAWS,OAAO,CAAC,sBAAsB,GAAG,CAAC,sBAAsB,EAAEV,aAAa,mBAAmB,EAAE,IAAI,CAACD,QAAQ,EAAE;QACxH;QACAH,IAAIc,OAAO,CAACT,WAAWS,OAAO;QAC9Bd,IAAIe,MAAM,CAACV,WAAWW,UAAU;QAChC,4EAA4E;QAC5E,0EAA0E;QAC1E,oGAAoG;QACpG,OAAO,IAAIC,sBAAc,CAACZ,WAAWP,MAAM;IAC7C;IAjDA,YACE,AAAiBR,QAAgB,EACjC,AAAiBqB,eAAe,IAAI,EACpC,AAAiBP,eAAe,EAAE,EAClC,AAAiBI,cAA2B;QAC1CU,cAAc;QACdC,MAAM;QACNC,UAAU;QACVC,cAAc;QACdC,cAAc;QACdC,QAAQ;QACRC,OAAO;QACPC,eAAeC,8BAAuB;IACxC,CAAC,CACD;aAbiBpC,WAAAA;aACAqB,eAAAA;aACAP,eAAAA;aACAI,cAAAA;IAUhB;AAoCL"}
@@ -123,7 +123,7 @@ let LinksQueries = class LinksQueries {
123
123
  name: _sharesschema.shares.name,
124
124
  alias: _sharesschema.shares.alias,
125
125
  hasParent: (0, _drizzleorm.isNotNull)(_sharesschema.shares.parentId).mapWith(Boolean),
126
- isDir: (0, _drizzleorm.sql)`IF (${(0, _drizzleorm.isNotNull)(_sharesschema.shares.externalPath)}, 1 ,${_filesschema.files.isDir})`.mapWith(Boolean),
126
+ isDir: (0, _drizzleorm.sql)`IF (${(0, _drizzleorm.isNotNull)(_sharesschema.shares.externalPath)} OR ${(0, _drizzleorm.isNotNull)(shareSpaceRoot.externalPath)}, 1 ,${_filesschema.files.isDir})`.mapWith(Boolean),
127
127
  mime: _filesschema.files.mime
128
128
  },
129
129
  space: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/links/services/links-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable } from '@nestjs/common'\nimport { and, eq, getTableColumns, isNotNull, isNull, or, sql } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/mysql-core'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { files } from '../../files/schemas/files.schema'\nimport type { ShareMembers } from '../../shares/schemas/share-members.interface'\nimport type { Share } from '../../shares/schemas/share.interface'\nimport { sharesMembers } from '../../shares/schemas/shares-members.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SPACE_ROLE } from '../../spaces/constants/spaces'\nimport type { SpaceMembers } from '../../spaces/schemas/space-members.interface'\nimport { spacesMembers } from '../../spaces/schemas/spaces-members.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { USER_ROLE } from '../../users/constants/user'\nimport type { User } from '../../users/schemas/user.interface'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { CACHE_LINK_UUID_PREFIX, CACHE_LINK_UUID_TTL } from '../constants/cache'\nimport { LINK_TYPE } from '../constants/links'\nimport type { LinkAsUser, LinkGuest } from '../interfaces/link-guest.interface'\nimport type { SpaceLink } from '../interfaces/link-space.interface'\nimport type { Link } from '../schemas/link.interface'\nimport { links } from '../schemas/links.schema'\n\n@Injectable()\nexport class LinksQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache\n ) {}\n\n async linkFromShare(ownerId: number, linkId: number, shareId: number, isAdmin: number = 0): Promise<LinkGuest> {\n const [r] = await this.db\n .select({\n ...getTableColumns(links),\n permissions: sharesMembers.permissions,\n language: users.language,\n isActive: users.isActive\n })\n .from(links)\n .innerJoin(shares, and(eq(shares.id, shareId), or(eq(shares.ownerId, ownerId), and(eq(sql`${isAdmin}`, 1), isNull(shares.ownerId)))))\n .innerJoin(sharesMembers, and(eq(sharesMembers.shareId, shares.id), eq(sharesMembers.userId, links.userId), eq(sharesMembers.linkId, linkId)))\n .innerJoin(users, eq(users.id, links.userId))\n .where(eq(links.id, linkId))\n .limit(1)\n return r as LinkGuest\n }\n\n async linkFromSpace(managerId: number, linkId: number, spaceId: number): Promise<LinkGuest> {\n const linkMember: any = alias(spacesMembers, 'linkMember')\n const [r] = await this.db\n .select({\n ...getTableColumns(links),\n permissions: linkMember.permissions,\n language: users.language,\n isActive: users.isActive\n })\n .from(links)\n .innerJoin(\n spacesMembers,\n and(eq(spacesMembers.spaceId, spaceId), eq(spacesMembers.userId, managerId), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER))\n )\n .innerJoin(linkMember, and(eq(linkMember.spaceId, spacesMembers.spaceId), eq(linkMember.userId, links.userId), eq(linkMember.linkId, linkId)))\n .innerJoin(users, eq(users.id, links.userId))\n .where(eq(links.id, linkId))\n .limit(1)\n return r as LinkGuest\n }\n\n async updateLinkFromSpaceOrShare(\n link: LinkGuest,\n shareId: number,\n diffUser: Partial<User>,\n diffLink: Partial<Link>,\n diffShare: Partial<Share>,\n diffMember: Partial<ShareMembers>\n ) {\n if (Object.keys(diffUser).length) {\n await this.db.update(users).set(diffUser).where(eq(users.id, link.userId))\n }\n if (Object.keys(diffLink).length) {\n await this.db.update(links).set(diffLink).where(eq(links.id, link.id))\n }\n if (Object.keys(diffShare).length) {\n await this.db.update(shares).set(diffShare).where(eq(shares.id, shareId))\n }\n if (Object.keys(diffMember).length) {\n await this.db\n .update(sharesMembers)\n .set(diffMember)\n .where(and(eq(sharesMembers.shareId, shareId), eq(sharesMembers.userId, link.userId), eq(sharesMembers.linkId, link.id)))\n }\n }\n\n async createLinkToSpaceOrShare(guestId: number, spaceOrShareId: number, type: LINK_TYPE, link: Partial<LinkGuest>): Promise<number> {\n const linkId = dbGetInsertedId(await this.db.insert(links).values(link as Link))\n if (type === LINK_TYPE.SPACE) {\n await this.db.insert(spacesMembers).values({\n userId: guestId,\n spaceId: spaceOrShareId,\n permissions: link.permissions,\n role: SPACE_ROLE.IS_MEMBER,\n linkId: linkId\n } as SpaceMembers)\n } else {\n await this.db.insert(sharesMembers).values({\n userId: guestId,\n shareId: spaceOrShareId,\n linkId: linkId,\n permissions: link.permissions\n } as ShareMembers)\n }\n return linkId\n }\n\n allLinksFromSpaceOrShare(spaceOrShareId: number, type: LINK_TYPE): Promise<{ id: number; linkId: number }[]> {\n const members: any = alias(type == 'share' ? sharesMembers : spacesMembers, 'members')\n return this.db\n .select({ id: users.id, linkId: members.linkId })\n .from(members)\n .innerJoin(users, and(eq(users.id, members.userId), eq(users.role, USER_ROLE.LINK)))\n .where(and(eq(type == 'share' ? members.shareId : members.spaceId, spaceOrShareId), isNotNull(members.linkId)))\n }\n\n async linkFromUUID(uuid: string): Promise<LinkAsUser> {\n const { password, ...userColumns } = getTableColumns(users)\n const [r] = await this.db\n .select({\n ...getTableColumns(links),\n user: { ...userColumns }\n })\n .from(links)\n .leftJoin(users, eq(users.id, links.userId))\n .where(eq(links.uuid, uuid))\n .limit(1)\n return r\n }\n\n async spaceLink(uuid: string): Promise<SpaceLink> {\n const shareOwner: any = alias(users, 'shareOwner')\n const shareSpaceRoot: any = alias(spacesRoots, 'shareSpaceRoot')\n const [r]: SpaceLink[] = await this.db\n .select({\n share: {\n name: shares.name,\n alias: shares.alias,\n hasParent: isNotNull(shares.parentId).mapWith(Boolean),\n isDir: sql`IF (${isNotNull(shares.externalPath)}, 1 ,${files.isDir})`.mapWith(Boolean),\n mime: files.mime\n },\n space: { name: spaces.name, alias: spaces.alias },\n owner: { login: shareOwner.login, fullName: userFullNameSQL(shareOwner) }\n })\n .from(links)\n .leftJoin(sharesMembers, eq(sharesMembers.linkId, links.id))\n .leftJoin(shares, eq(shares.id, sharesMembers.shareId))\n .leftJoin(shareOwner, eq(shareOwner.id, shares.ownerId))\n .leftJoin(spacesMembers, eq(spacesMembers.linkId, links.id))\n .leftJoin(spaces, eq(spaces.id, spacesMembers.spaceId))\n .leftJoin(shareSpaceRoot, and(isNull(shares.externalPath), isNull(shares.fileId), eq(shareSpaceRoot.id, shares.spaceRootId)))\n .leftJoin(\n files,\n or(\n and(isNotNull(shares.fileId), eq(files.id, shares.fileId)),\n and(isNull(shares.externalPath), isNotNull(shareSpaceRoot.fileId), eq(files.id, shareSpaceRoot.fileId))\n )\n )\n .where(eq(links.uuid, uuid))\n .limit(1)\n return r\n }\n\n async incrementLinkNbAccess(uuid: string) {\n await this.db\n .update(links)\n .set({ nbAccess: sql`${links.nbAccess} + 1` } as Record<keyof Link, any>)\n .where(eq(links.uuid, uuid))\n .limit(1)\n }\n\n async isUniqueUUID(userId: number, uuid: string) {\n const [r] = await this.db.select({ check: links.uuid }).from(links).where(eq(links.uuid, uuid)).limit(1)\n if (!r) {\n // uuid does not exist in db\n const cacheKey = this.cache.genSlugKey(CACHE_LINK_UUID_PREFIX, userId, uuid)\n // check if uuid was already requested\n if (!(await this.cache.has(cacheKey))) {\n // store uuid to prevent reuse\n await this.cache.set(cacheKey, uuid, CACHE_LINK_UUID_TTL)\n return true\n }\n return false\n }\n return false\n }\n\n isReservedUUID(userId: number, uuid: string): Promise<boolean> {\n // check if uuid is reserved\n return this.cache.has(this.cache.genSlugKey(CACHE_LINK_UUID_PREFIX, userId, uuid))\n }\n}\n"],"names":["LinksQueries","linkFromShare","ownerId","linkId","shareId","isAdmin","r","db","select","getTableColumns","links","permissions","sharesMembers","language","users","isActive","from","innerJoin","shares","and","eq","id","or","sql","isNull","userId","where","limit","linkFromSpace","managerId","spaceId","linkMember","alias","spacesMembers","role","SPACE_ROLE","IS_MANAGER","updateLinkFromSpaceOrShare","link","diffUser","diffLink","diffShare","diffMember","Object","keys","length","update","set","createLinkToSpaceOrShare","guestId","spaceOrShareId","type","dbGetInsertedId","insert","values","LINK_TYPE","SPACE","IS_MEMBER","allLinksFromSpaceOrShare","members","USER_ROLE","LINK","isNotNull","linkFromUUID","uuid","password","userColumns","user","leftJoin","spaceLink","shareOwner","shareSpaceRoot","spacesRoots","share","name","hasParent","parentId","mapWith","Boolean","isDir","externalPath","files","mime","space","spaces","owner","login","fullName","userFullNameSQL","fileId","spaceRootId","incrementLinkNbAccess","nbAccess","isUniqueUUID","check","cacheKey","cache","genSlugKey","CACHE_LINK_UUID_PREFIX","has","CACHE_LINK_UUID_TTL","isReservedUUID"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/links/services/links-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable } from '@nestjs/common'\nimport { and, eq, getTableColumns, isNotNull, isNull, or, sql } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/mysql-core'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { files } from '../../files/schemas/files.schema'\nimport type { ShareMembers } from '../../shares/schemas/share-members.interface'\nimport type { Share } from '../../shares/schemas/share.interface'\nimport { sharesMembers } from '../../shares/schemas/shares-members.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SPACE_ROLE } from '../../spaces/constants/spaces'\nimport type { SpaceMembers } from '../../spaces/schemas/space-members.interface'\nimport { spacesMembers } from '../../spaces/schemas/spaces-members.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { USER_ROLE } from '../../users/constants/user'\nimport type { User } from '../../users/schemas/user.interface'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { CACHE_LINK_UUID_PREFIX, CACHE_LINK_UUID_TTL } from '../constants/cache'\nimport { LINK_TYPE } from '../constants/links'\nimport type { LinkAsUser, LinkGuest } from '../interfaces/link-guest.interface'\nimport type { SpaceLink } from '../interfaces/link-space.interface'\nimport type { Link } from '../schemas/link.interface'\nimport { links } from '../schemas/links.schema'\n\n@Injectable()\nexport class LinksQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache\n ) {}\n\n async linkFromShare(ownerId: number, linkId: number, shareId: number, isAdmin: number = 0): Promise<LinkGuest> {\n const [r] = await this.db\n .select({\n ...getTableColumns(links),\n permissions: sharesMembers.permissions,\n language: users.language,\n isActive: users.isActive\n })\n .from(links)\n .innerJoin(shares, and(eq(shares.id, shareId), or(eq(shares.ownerId, ownerId), and(eq(sql`${isAdmin}`, 1), isNull(shares.ownerId)))))\n .innerJoin(sharesMembers, and(eq(sharesMembers.shareId, shares.id), eq(sharesMembers.userId, links.userId), eq(sharesMembers.linkId, linkId)))\n .innerJoin(users, eq(users.id, links.userId))\n .where(eq(links.id, linkId))\n .limit(1)\n return r as LinkGuest\n }\n\n async linkFromSpace(managerId: number, linkId: number, spaceId: number): Promise<LinkGuest> {\n const linkMember: any = alias(spacesMembers, 'linkMember')\n const [r] = await this.db\n .select({\n ...getTableColumns(links),\n permissions: linkMember.permissions,\n language: users.language,\n isActive: users.isActive\n })\n .from(links)\n .innerJoin(\n spacesMembers,\n and(eq(spacesMembers.spaceId, spaceId), eq(spacesMembers.userId, managerId), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER))\n )\n .innerJoin(linkMember, and(eq(linkMember.spaceId, spacesMembers.spaceId), eq(linkMember.userId, links.userId), eq(linkMember.linkId, linkId)))\n .innerJoin(users, eq(users.id, links.userId))\n .where(eq(links.id, linkId))\n .limit(1)\n return r as LinkGuest\n }\n\n async updateLinkFromSpaceOrShare(\n link: LinkGuest,\n shareId: number,\n diffUser: Partial<User>,\n diffLink: Partial<Link>,\n diffShare: Partial<Share>,\n diffMember: Partial<ShareMembers>\n ) {\n if (Object.keys(diffUser).length) {\n await this.db.update(users).set(diffUser).where(eq(users.id, link.userId))\n }\n if (Object.keys(diffLink).length) {\n await this.db.update(links).set(diffLink).where(eq(links.id, link.id))\n }\n if (Object.keys(diffShare).length) {\n await this.db.update(shares).set(diffShare).where(eq(shares.id, shareId))\n }\n if (Object.keys(diffMember).length) {\n await this.db\n .update(sharesMembers)\n .set(diffMember)\n .where(and(eq(sharesMembers.shareId, shareId), eq(sharesMembers.userId, link.userId), eq(sharesMembers.linkId, link.id)))\n }\n }\n\n async createLinkToSpaceOrShare(guestId: number, spaceOrShareId: number, type: LINK_TYPE, link: Partial<LinkGuest>): Promise<number> {\n const linkId = dbGetInsertedId(await this.db.insert(links).values(link as Link))\n if (type === LINK_TYPE.SPACE) {\n await this.db.insert(spacesMembers).values({\n userId: guestId,\n spaceId: spaceOrShareId,\n permissions: link.permissions,\n role: SPACE_ROLE.IS_MEMBER,\n linkId: linkId\n } as SpaceMembers)\n } else {\n await this.db.insert(sharesMembers).values({\n userId: guestId,\n shareId: spaceOrShareId,\n linkId: linkId,\n permissions: link.permissions\n } as ShareMembers)\n }\n return linkId\n }\n\n allLinksFromSpaceOrShare(spaceOrShareId: number, type: LINK_TYPE): Promise<{ id: number; linkId: number }[]> {\n const members: any = alias(type == 'share' ? sharesMembers : spacesMembers, 'members')\n return this.db\n .select({ id: users.id, linkId: members.linkId })\n .from(members)\n .innerJoin(users, and(eq(users.id, members.userId), eq(users.role, USER_ROLE.LINK)))\n .where(and(eq(type == 'share' ? members.shareId : members.spaceId, spaceOrShareId), isNotNull(members.linkId)))\n }\n\n async linkFromUUID(uuid: string): Promise<LinkAsUser> {\n const { password, ...userColumns } = getTableColumns(users)\n const [r] = await this.db\n .select({\n ...getTableColumns(links),\n user: { ...userColumns }\n })\n .from(links)\n .leftJoin(users, eq(users.id, links.userId))\n .where(eq(links.uuid, uuid))\n .limit(1)\n return r\n }\n\n async spaceLink(uuid: string): Promise<SpaceLink> {\n const shareOwner: any = alias(users, 'shareOwner')\n const shareSpaceRoot: any = alias(spacesRoots, 'shareSpaceRoot')\n const [r]: SpaceLink[] = await this.db\n .select({\n share: {\n name: shares.name,\n alias: shares.alias,\n hasParent: isNotNull(shares.parentId).mapWith(Boolean),\n isDir: sql`IF (${isNotNull(shares.externalPath)} OR ${isNotNull(shareSpaceRoot.externalPath)}, 1 ,${files.isDir})`.mapWith(Boolean),\n mime: files.mime\n },\n space: { name: spaces.name, alias: spaces.alias },\n owner: { login: shareOwner.login, fullName: userFullNameSQL(shareOwner) }\n })\n .from(links)\n .leftJoin(sharesMembers, eq(sharesMembers.linkId, links.id))\n .leftJoin(shares, eq(shares.id, sharesMembers.shareId))\n .leftJoin(shareOwner, eq(shareOwner.id, shares.ownerId))\n .leftJoin(spacesMembers, eq(spacesMembers.linkId, links.id))\n .leftJoin(spaces, eq(spaces.id, spacesMembers.spaceId))\n .leftJoin(shareSpaceRoot, and(isNull(shares.externalPath), isNull(shares.fileId), eq(shareSpaceRoot.id, shares.spaceRootId)))\n .leftJoin(\n files,\n or(\n and(isNotNull(shares.fileId), eq(files.id, shares.fileId)),\n and(isNull(shares.externalPath), isNotNull(shareSpaceRoot.fileId), eq(files.id, shareSpaceRoot.fileId))\n )\n )\n .where(eq(links.uuid, uuid))\n .limit(1)\n return r\n }\n\n async incrementLinkNbAccess(uuid: string) {\n await this.db\n .update(links)\n .set({ nbAccess: sql`${links.nbAccess} + 1` } as Record<keyof Link, any>)\n .where(eq(links.uuid, uuid))\n .limit(1)\n }\n\n async isUniqueUUID(userId: number, uuid: string) {\n const [r] = await this.db.select({ check: links.uuid }).from(links).where(eq(links.uuid, uuid)).limit(1)\n if (!r) {\n // uuid does not exist in db\n const cacheKey = this.cache.genSlugKey(CACHE_LINK_UUID_PREFIX, userId, uuid)\n // check if uuid was already requested\n if (!(await this.cache.has(cacheKey))) {\n // store uuid to prevent reuse\n await this.cache.set(cacheKey, uuid, CACHE_LINK_UUID_TTL)\n return true\n }\n return false\n }\n return false\n }\n\n isReservedUUID(userId: number, uuid: string): Promise<boolean> {\n // check if uuid is reserved\n return this.cache.has(this.cache.genSlugKey(CACHE_LINK_UUID_PREFIX, userId, uuid))\n }\n}\n"],"names":["LinksQueries","linkFromShare","ownerId","linkId","shareId","isAdmin","r","db","select","getTableColumns","links","permissions","sharesMembers","language","users","isActive","from","innerJoin","shares","and","eq","id","or","sql","isNull","userId","where","limit","linkFromSpace","managerId","spaceId","linkMember","alias","spacesMembers","role","SPACE_ROLE","IS_MANAGER","updateLinkFromSpaceOrShare","link","diffUser","diffLink","diffShare","diffMember","Object","keys","length","update","set","createLinkToSpaceOrShare","guestId","spaceOrShareId","type","dbGetInsertedId","insert","values","LINK_TYPE","SPACE","IS_MEMBER","allLinksFromSpaceOrShare","members","USER_ROLE","LINK","isNotNull","linkFromUUID","uuid","password","userColumns","user","leftJoin","spaceLink","shareOwner","shareSpaceRoot","spacesRoots","share","name","hasParent","parentId","mapWith","Boolean","isDir","externalPath","files","mime","space","spaces","owner","login","fullName","userFullNameSQL","fileId","spaceRootId","incrementLinkNbAccess","nbAccess","isUniqueUUID","check","cacheKey","cache","genSlugKey","CACHE_LINK_UUID_PREFIX","has","CACHE_LINK_UUID_TTL","isReservedUUID"],"mappings":"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"}
@@ -30,6 +30,8 @@ var NOTIFICATION_APP = /*#__PURE__*/ function(NOTIFICATION_APP) {
30
30
  NOTIFICATION_APP["SYNC"] = "sync";
31
31
  NOTIFICATION_APP["AUTH_LOCKED"] = "auth_locked";
32
32
  NOTIFICATION_APP["AUTH_2FA"] = "auth_2fa";
33
+ NOTIFICATION_APP["UNLOCK_REQUEST"] = "unlock_request";
34
+ NOTIFICATION_APP["UPDATE_AVAILABLE"] = "server_update_available";
33
35
  return NOTIFICATION_APP;
34
36
  }({});
35
37
  const NOTIFICATION_APP_EVENT = {
@@ -65,7 +67,9 @@ const NOTIFICATION_APP_EVENT = {
65
67
  },
66
68
  AUTH_LOCKED: {
67
69
  [_constants.ACTION.DELETE]: 'Your account has been locked after several unsuccessful authentication attempts'
68
- }
70
+ },
71
+ UNLOCK_REQUEST: 'sends you a request to unlock the file',
72
+ UPDATE_AVAILABLE: 'A new update is available'
69
73
  };
70
74
 
71
75
  //# sourceMappingURL=notifications.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/notifications/constants/notifications.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { ACTION } from '../../../common/constants'\n\nexport enum NOTIFICATION_APP {\n COMMENTS = 'comments',\n SPACES = 'spaces',\n SPACE_ROOTS = 'spaces_roots',\n SHARES = 'shares',\n LINKS = 'links',\n SYNC = 'sync',\n AUTH_LOCKED = 'auth_locked',\n AUTH_2FA = 'auth_2fa'\n}\n\nexport const NOTIFICATION_APP_EVENT = {\n COMMENTS: 'commented',\n SPACES: {\n [ACTION.ADD]: 'You now have access to the space',\n [ACTION.DELETE]: 'You no longer have access to the space',\n [ACTION.DELETE_PERMANENTLY]: 'This space has been permanently deleted'\n },\n SPACE_ROOTS: {\n [ACTION.ADD]: 'anchored',\n [ACTION.DELETE]: 'unanchored'\n },\n SHARES: {\n [ACTION.ADD]: 'shared with you',\n [ACTION.DELETE]: 'no longer share with you'\n },\n SHARES_WITHOUT_OWNER: {\n [ACTION.ADD]: 'You now have access to the share',\n [ACTION.DELETE]: 'You no longer have access to the share',\n [ACTION.DELETE_PERMANENTLY]: 'You are no longer a member of the parent share, your child share has been deleted'\n },\n LINKS: {\n [ACTION.ADD]: 'shared with you',\n [ACTION.UPDATE]: 'You now have access to the space'\n },\n SYNC: {\n [ACTION.DELETE]: 'You are no longer synchronizing'\n },\n AUTH_2FA: {\n [ACTION.ADD]: 'Two-factor authentication (2FA) on your account has been enabled',\n [ACTION.DELETE]: 'Two-factor authentication (2FA) on your account has been disabled'\n },\n AUTH_LOCKED: {\n [ACTION.DELETE]: 'Your account has been locked after several unsuccessful authentication attempts'\n }\n}\n"],"names":["NOTIFICATION_APP","NOTIFICATION_APP_EVENT","COMMENTS","SPACES","ACTION","ADD","DELETE","DELETE_PERMANENTLY","SPACE_ROOTS","SHARES","SHARES_WITHOUT_OWNER","LINKS","UPDATE","SYNC","AUTH_2FA","AUTH_LOCKED"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAIWA;eAAAA;;QAWCC;eAAAA;;;2BAbU;AAEhB,IAAA,AAAKD,0CAAAA;;;;;;;;;WAAAA;;AAWL,MAAMC,yBAAyB;IACpCC,UAAU;IACVC,QAAQ;QACN,CAACC,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;QACjB,CAACF,iBAAM,CAACG,kBAAkB,CAAC,EAAE;IAC/B;IACAC,aAAa;QACX,CAACJ,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAG,QAAQ;QACN,CAACL,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAI,sBAAsB;QACpB,CAACN,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;QACjB,CAACF,iBAAM,CAACG,kBAAkB,CAAC,EAAE;IAC/B;IACAI,OAAO;QACL,CAACP,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACQ,MAAM,CAAC,EAAE;IACnB;IACAC,MAAM;QACJ,CAACT,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAQ,UAAU;QACR,CAACV,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAS,aAAa;QACX,CAACX,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;AACF"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/notifications/constants/notifications.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { ACTION } from '../../../common/constants'\n\nexport enum NOTIFICATION_APP {\n COMMENTS = 'comments',\n SPACES = 'spaces',\n SPACE_ROOTS = 'spaces_roots',\n SHARES = 'shares',\n LINKS = 'links',\n SYNC = 'sync',\n AUTH_LOCKED = 'auth_locked',\n AUTH_2FA = 'auth_2fa',\n UNLOCK_REQUEST = 'unlock_request',\n UPDATE_AVAILABLE = 'server_update_available'\n}\n\nexport const NOTIFICATION_APP_EVENT = {\n COMMENTS: 'commented',\n SPACES: {\n [ACTION.ADD]: 'You now have access to the space',\n [ACTION.DELETE]: 'You no longer have access to the space',\n [ACTION.DELETE_PERMANENTLY]: 'This space has been permanently deleted'\n },\n SPACE_ROOTS: {\n [ACTION.ADD]: 'anchored',\n [ACTION.DELETE]: 'unanchored'\n },\n SHARES: {\n [ACTION.ADD]: 'shared with you',\n [ACTION.DELETE]: 'no longer share with you'\n },\n SHARES_WITHOUT_OWNER: {\n [ACTION.ADD]: 'You now have access to the share',\n [ACTION.DELETE]: 'You no longer have access to the share',\n [ACTION.DELETE_PERMANENTLY]: 'You are no longer a member of the parent share, your child share has been deleted'\n },\n LINKS: {\n [ACTION.ADD]: 'shared with you',\n [ACTION.UPDATE]: 'You now have access to the space'\n },\n SYNC: {\n [ACTION.DELETE]: 'You are no longer synchronizing'\n },\n AUTH_2FA: {\n [ACTION.ADD]: 'Two-factor authentication (2FA) on your account has been enabled',\n [ACTION.DELETE]: 'Two-factor authentication (2FA) on your account has been disabled'\n },\n AUTH_LOCKED: {\n [ACTION.DELETE]: 'Your account has been locked after several unsuccessful authentication attempts'\n },\n UNLOCK_REQUEST: 'sends you a request to unlock the file',\n UPDATE_AVAILABLE: 'A new update is available'\n}\n"],"names":["NOTIFICATION_APP","NOTIFICATION_APP_EVENT","COMMENTS","SPACES","ACTION","ADD","DELETE","DELETE_PERMANENTLY","SPACE_ROOTS","SHARES","SHARES_WITHOUT_OWNER","LINKS","UPDATE","SYNC","AUTH_2FA","AUTH_LOCKED","UNLOCK_REQUEST","UPDATE_AVAILABLE"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAIWA;eAAAA;;QAaCC;eAAAA;;;2BAfU;AAEhB,IAAA,AAAKD,0CAAAA;;;;;;;;;;;WAAAA;;AAaL,MAAMC,yBAAyB;IACpCC,UAAU;IACVC,QAAQ;QACN,CAACC,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;QACjB,CAACF,iBAAM,CAACG,kBAAkB,CAAC,EAAE;IAC/B;IACAC,aAAa;QACX,CAACJ,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAG,QAAQ;QACN,CAACL,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAI,sBAAsB;QACpB,CAACN,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;QACjB,CAACF,iBAAM,CAACG,kBAAkB,CAAC,EAAE;IAC/B;IACAI,OAAO;QACL,CAACP,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACQ,MAAM,CAAC,EAAE;IACnB;IACAC,MAAM;QACJ,CAACT,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAQ,UAAU;QACR,CAACV,iBAAM,CAACC,GAAG,CAAC,EAAE;QACd,CAACD,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAS,aAAa;QACX,CAACX,iBAAM,CAACE,MAAM,CAAC,EAAE;IACnB;IACAU,gBAAgB;IAChBC,kBAAkB;AACpB"}
@@ -17,7 +17,7 @@ Object.defineProperty(exports, "de", {
17
17
  }
18
18
  });
19
19
  const de = {
20
- 'If you no longer wish to receive notifications, change your preferences directly from your user space': 'Wenn Sie keine Benachrichtigungen mehr erhalten möchten, ändern Sie Ihre Einstellungen direkt in Ihrem Benutzerbereich',
20
+ 'If you no longer wish to receive notifications, change your preferences directly from your user space.': 'Wenn Sie keine Benachrichtigungen mehr erhalten möchten, ändern Sie Ihre Einstellungen direkt in Ihrem Benutzerbereich.',
21
21
  'Access it from': 'Öffnen Sie es über',
22
22
  Comment: 'Kommentar',
23
23
  commented: 'hat kommentiert',
@@ -43,6 +43,9 @@ const de = {
43
43
  Sync: 'Synchronisierung',
44
44
  'Access your syncs from': 'Öffnen Sie Ihre Synchronisierungen über',
45
45
  'You are no longer synchronizing': 'Sie synchronisieren nicht mehr',
46
+ 'Unlock Request': 'Entsperranfrage',
47
+ 'You receive this notification because you have a lock on this file.': 'Sie erhalten diese Benachrichtigung, weil Sie eine Sperre auf dieser Datei haben.',
48
+ 'sends you a request to unlock the file': 'sendet Ihnen eine Anfrage zum Entsperren der Datei',
46
49
  'Security notification': 'Sicherheitsbenachrichtigung',
47
50
  'Your account has been locked after several unsuccessful authentication attempts': 'Ihr Konto wurde nach mehreren fehlgeschlagenen Anmeldeversuchen gesperrt',
48
51
  'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.': 'Diese Sicherheitsbenachrichtigung betrifft Ihr Sync-in-Konto. Bitte wenden Sie sich an einen Administrator, damit er die Analyse durchführt und Ihr Konto entsperrt.',
@@ -50,7 +53,10 @@ const de = {
50
53
  'Two-factor authentication (2FA) on your account has been enabled': 'Die Zwei-Faktor-Authentifizierung (2FA) für Ihr Konto wurde aktiviert',
51
54
  'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.': 'Sie erhalten diese Benachrichtigung, weil sich die Sicherheit Ihres Sync-in-Kontos geändert hat. Wenn Sie der Meinung sind, dass dies ein Fehler war, überprüfen Sie bitte Ihre Sicherheitseinstellungen oder kontaktieren Sie Ihren Administrator.',
52
55
  'Address IP': 'IP-Adresse',
53
- Browser: 'Browser'
56
+ Browser: 'Browser',
57
+ 'New Version Available': 'Neue Version verfügbar',
58
+ 'You receive this notification because you are the administrator of this server.': 'Sie erhalten diese Benachrichtigung, weil Sie der Administrator dieses Servers sind.',
59
+ 'A new update is available': 'Ein neues Update ist verfügbar'
54
60
  };
55
61
 
56
62
  //# sourceMappingURL=de.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/notifications/i18n/de.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const de = {\n 'If you no longer wish to receive notifications, change your preferences directly from your user space':\n 'Wenn Sie keine Benachrichtigungen mehr erhalten möchten, ändern Sie Ihre Einstellungen direkt in Ihrem Benutzerbereich',\n 'Access it from': 'Öffnen Sie es über',\n Comment: 'Kommentar',\n commented: 'hat kommentiert',\n 'You receive this notification if you are the owner of the file or if you have also commented on this file':\n 'Sie erhalten diese Benachrichtigung, wenn Sie der Eigentümer der Datei sind oder wenn Sie diese Datei ebenfalls kommentiert haben',\n Space: 'Bereich',\n 'from the space': 'aus dem Bereich',\n 'to the space': 'zum Bereich',\n 'Access your spaces from': 'Öffnen Sie Ihre Bereiche über',\n 'Access this space from': 'Öffnen Sie diesen Bereich über',\n 'You now have access to the space': 'Sie haben jetzt Zugriff auf den Bereich',\n 'You no longer have access to the space': 'Sie haben keinen Zugriff mehr auf den Bereich',\n 'This space has been permanently deleted': 'Dieser Bereich wurde dauerhaft gelöscht',\n anchored: 'hat angeheftet',\n unanchored: 'hat gelöst',\n Share: 'Freigabe',\n 'shared with you': 'hat mit Ihnen geteilt',\n 'no longer share with you': 'teilt nicht mehr mit Ihnen',\n 'You now have access to the share': 'Sie haben jetzt Zugriff auf die Freigabe',\n 'You no longer have access to the share': 'Sie haben keinen Zugriff mehr auf die Freigabe',\n 'You are no longer a member of the parent share, your child share has been deleted':\n 'Sie sind kein Mitglied der übergeordneten Freigabe mehr, Ihre untergeordnete Freigabe wurde gelöscht',\n 'Access your shares from': 'Öffnen Sie Ihre Freigaben über',\n 'Access password': 'Zugriffspasswort',\n Sync: 'Synchronisierung',\n 'Access your syncs from': 'Öffnen Sie Ihre Synchronisierungen über',\n 'You are no longer synchronizing': 'Sie synchronisieren nicht mehr',\n 'Security notification': 'Sicherheitsbenachrichtigung',\n 'Your account has been locked after several unsuccessful authentication attempts':\n 'Ihr Konto wurde nach mehreren fehlgeschlagenen Anmeldeversuchen gesperrt',\n 'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.':\n 'Diese Sicherheitsbenachrichtigung betrifft Ihr Sync-in-Konto. Bitte wenden Sie sich an einen Administrator, damit er die Analyse durchführt und Ihr Konto entsperrt.',\n 'Two-factor authentication (2FA) on your account has been disabled': 'Die Zwei-Faktor-Authentifizierung (2FA) für Ihr Konto wurde deaktiviert',\n 'Two-factor authentication (2FA) on your account has been enabled': 'Die Zwei-Faktor-Authentifizierung (2FA) für Ihr Konto wurde aktiviert',\n 'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.':\n 'Sie erhalten diese Benachrichtigung, weil sich die Sicherheit Ihres Sync-in-Kontos geändert hat. Wenn Sie der Meinung sind, dass dies ein Fehler war, überprüfen Sie bitte Ihre Sicherheitseinstellungen oder kontaktieren Sie Ihren Administrator.',\n 'Address IP': 'IP-Adresse',\n Browser: 'Browser'\n} as const\n"],"names":["de","Comment","commented","Space","anchored","unanchored","Share","Sync","Browser"],"mappings":"AAAA;;;;CAIC,GACD;;;;CAIC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,KAAK;IAChB,yGACE;IACF,kBAAkB;IAClBC,SAAS;IACTC,WAAW;IACX,6GACE;IACFC,OAAO;IACP,kBAAkB;IAClB,gBAAgB;IAChB,2BAA2B;IAC3B,0BAA0B;IAC1B,oCAAoC;IACpC,0CAA0C;IAC1C,2CAA2C;IAC3CC,UAAU;IACVC,YAAY;IACZC,OAAO;IACP,mBAAmB;IACnB,4BAA4B;IAC5B,oCAAoC;IACpC,0CAA0C;IAC1C,qFACE;IACF,2BAA2B;IAC3B,mBAAmB;IACnBC,MAAM;IACN,0BAA0B;IAC1B,mCAAmC;IACnC,yBAAyB;IACzB,mFACE;IACF,8IACE;IACF,qEAAqE;IACrE,oEAAoE;IACpE,iMACE;IACF,cAAc;IACdC,SAAS;AACX"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/notifications/i18n/de.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const de = {\n 'If you no longer wish to receive notifications, change your preferences directly from your user space.':\n 'Wenn Sie keine Benachrichtigungen mehr erhalten möchten, ändern Sie Ihre Einstellungen direkt in Ihrem Benutzerbereich.',\n 'Access it from': 'Öffnen Sie es über',\n Comment: 'Kommentar',\n commented: 'hat kommentiert',\n 'You receive this notification if you are the owner of the file or if you have also commented on this file':\n 'Sie erhalten diese Benachrichtigung, wenn Sie der Eigentümer der Datei sind oder wenn Sie diese Datei ebenfalls kommentiert haben',\n Space: 'Bereich',\n 'from the space': 'aus dem Bereich',\n 'to the space': 'zum Bereich',\n 'Access your spaces from': 'Öffnen Sie Ihre Bereiche über',\n 'Access this space from': 'Öffnen Sie diesen Bereich über',\n 'You now have access to the space': 'Sie haben jetzt Zugriff auf den Bereich',\n 'You no longer have access to the space': 'Sie haben keinen Zugriff mehr auf den Bereich',\n 'This space has been permanently deleted': 'Dieser Bereich wurde dauerhaft gelöscht',\n anchored: 'hat angeheftet',\n unanchored: 'hat gelöst',\n Share: 'Freigabe',\n 'shared with you': 'hat mit Ihnen geteilt',\n 'no longer share with you': 'teilt nicht mehr mit Ihnen',\n 'You now have access to the share': 'Sie haben jetzt Zugriff auf die Freigabe',\n 'You no longer have access to the share': 'Sie haben keinen Zugriff mehr auf die Freigabe',\n 'You are no longer a member of the parent share, your child share has been deleted':\n 'Sie sind kein Mitglied der übergeordneten Freigabe mehr, Ihre untergeordnete Freigabe wurde gelöscht',\n 'Access your shares from': 'Öffnen Sie Ihre Freigaben über',\n 'Access password': 'Zugriffspasswort',\n Sync: 'Synchronisierung',\n 'Access your syncs from': 'Öffnen Sie Ihre Synchronisierungen über',\n 'You are no longer synchronizing': 'Sie synchronisieren nicht mehr',\n 'Unlock Request': 'Entsperranfrage',\n 'You receive this notification because you have a lock on this file.':\n 'Sie erhalten diese Benachrichtigung, weil Sie eine Sperre auf dieser Datei haben.',\n 'sends you a request to unlock the file': 'sendet Ihnen eine Anfrage zum Entsperren der Datei',\n 'Security notification': 'Sicherheitsbenachrichtigung',\n 'Your account has been locked after several unsuccessful authentication attempts':\n 'Ihr Konto wurde nach mehreren fehlgeschlagenen Anmeldeversuchen gesperrt',\n 'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.':\n 'Diese Sicherheitsbenachrichtigung betrifft Ihr Sync-in-Konto. Bitte wenden Sie sich an einen Administrator, damit er die Analyse durchführt und Ihr Konto entsperrt.',\n 'Two-factor authentication (2FA) on your account has been disabled': 'Die Zwei-Faktor-Authentifizierung (2FA) für Ihr Konto wurde deaktiviert',\n 'Two-factor authentication (2FA) on your account has been enabled': 'Die Zwei-Faktor-Authentifizierung (2FA) für Ihr Konto wurde aktiviert',\n 'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.':\n 'Sie erhalten diese Benachrichtigung, weil sich die Sicherheit Ihres Sync-in-Kontos geändert hat. Wenn Sie der Meinung sind, dass dies ein Fehler war, überprüfen Sie bitte Ihre Sicherheitseinstellungen oder kontaktieren Sie Ihren Administrator.',\n 'Address IP': 'IP-Adresse',\n Browser: 'Browser',\n 'New Version Available': 'Neue Version verfügbar',\n 'You receive this notification because you are the administrator of this server.':\n 'Sie erhalten diese Benachrichtigung, weil Sie der Administrator dieses Servers sind.',\n 'A new update is available': 'Ein neues Update ist verfügbar'\n} as const\n"],"names":["de","Comment","commented","Space","anchored","unanchored","Share","Sync","Browser"],"mappings":"AAAA;;;;CAIC,GACD;;;;CAIC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,KAAK;IAChB,0GACE;IACF,kBAAkB;IAClBC,SAAS;IACTC,WAAW;IACX,6GACE;IACFC,OAAO;IACP,kBAAkB;IAClB,gBAAgB;IAChB,2BAA2B;IAC3B,0BAA0B;IAC1B,oCAAoC;IACpC,0CAA0C;IAC1C,2CAA2C;IAC3CC,UAAU;IACVC,YAAY;IACZC,OAAO;IACP,mBAAmB;IACnB,4BAA4B;IAC5B,oCAAoC;IACpC,0CAA0C;IAC1C,qFACE;IACF,2BAA2B;IAC3B,mBAAmB;IACnBC,MAAM;IACN,0BAA0B;IAC1B,mCAAmC;IACnC,kBAAkB;IAClB,uEACE;IACF,0CAA0C;IAC1C,yBAAyB;IACzB,mFACE;IACF,8IACE;IACF,qEAAqE;IACrE,oEAAoE;IACpE,iMACE;IACF,cAAc;IACdC,SAAS;IACT,yBAAyB;IACzB,mFACE;IACF,6BAA6B;AAC/B"}
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "es", {
13
13
  }
14
14
  });
15
15
  const es = {
16
- 'If you no longer wish to receive notifications, change your preferences directly from your user space': 'Si ya no desea recibir notificaciones, cambie sus preferencias directamente desde su espacio de usuario',
16
+ 'If you no longer wish to receive notifications, change your preferences directly from your user space.': 'Si ya no desea recibir notificaciones, cambie sus preferencias directamente desde su espacio de usuario.',
17
17
  'Access it from': 'Acceda a él desde',
18
18
  Comment: 'Comentario',
19
19
  commented: 'comentó',
@@ -39,6 +39,9 @@ const es = {
39
39
  Sync: 'Sincronización',
40
40
  'Access your syncs from': 'Acceda a sus sincronizaciones desde',
41
41
  'You are no longer synchronizing': 'Ya no está sincronizando',
42
+ 'Unlock Request': 'Solicitud de desbloqueo',
43
+ 'You receive this notification because you have a lock on this file.': 'Recibe esta notificación porque tiene un bloqueo en este archivo.',
44
+ 'sends you a request to unlock the file': 'le envía una solicitud para desbloquear el archivo',
42
45
  'Security notification': 'Notificación de seguridad',
43
46
  'Your account has been locked after several unsuccessful authentication attempts': 'Su cuenta ha sido bloqueada tras varios intentos de autenticación fallidos',
44
47
  'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.': 'Esta notificación de seguridad concierne a su cuenta de Sync-in. Póngase en contacto con un administrador para realizar el análisis y desbloquear su cuenta.',
@@ -46,7 +49,10 @@ const es = {
46
49
  'Two-factor authentication (2FA) on your account has been enabled': 'La autenticación de dos factores (2FA) de su cuenta ha sido activada',
47
50
  'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.': 'Ha recibido esta notificación porque la seguridad de su cuenta de Sync-in ha cambiado. Si cree que se trata de un error, revise su configuración de seguridad o contacte a su administrador.',
48
51
  'Address IP': 'Dirección IP',
49
- Browser: 'Navegador'
52
+ Browser: 'Navegador',
53
+ 'New Version Available': 'Nueva versión disponible',
54
+ 'You receive this notification because you are the administrator of this server.': 'Recibe esta notificación porque es el administrador de este servidor.',
55
+ 'A new update is available': 'Hay una nueva actualización disponible'
50
56
  };
51
57
 
52
58
  //# sourceMappingURL=es.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/notifications/i18n/es.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const es = {\n 'If you no longer wish to receive notifications, change your preferences directly from your user space':\n 'Si ya no desea recibir notificaciones, cambie sus preferencias directamente desde su espacio de usuario',\n 'Access it from': 'Acceda a él desde',\n Comment: 'Comentario',\n commented: 'comentó',\n 'You receive this notification if you are the owner of the file or if you have also commented on this file':\n 'Recibe esta notificación si es el propietario del archivo o si también ha comentado este archivo',\n Space: 'Espacio',\n 'from the space': 'del espacio',\n 'to the space': 'al espacio',\n 'Access your spaces from': 'Acceda a sus espacios desde',\n 'Access this space from': 'Acceda a este espacio desde',\n 'You now have access to the space': 'Ahora tiene acceso al espacio',\n 'You no longer have access to the space': 'Ya no tiene acceso al espacio',\n 'This space has been permanently deleted': 'Este espacio ha sido eliminado permanentemente',\n anchored: 'ancló',\n unanchored: 'desancló',\n Share: 'Compartir',\n 'shared with you': 'compartió con usted',\n 'no longer share with you': 'ya no comparte con usted',\n 'You now have access to the share': 'Ahora tiene acceso al recurso compartido',\n 'You no longer have access to the share': 'Ya no tiene acceso al recurso compartido',\n 'You are no longer a member of the parent share, your child share has been deleted':\n 'Ya no es miembro del recurso compartido principal; su recurso compartido hijo ha sido eliminado',\n 'Access your shares from': 'Acceda a sus recursos compartidos desde',\n 'Access password': 'Contraseña de acceso',\n Sync: 'Sincronización',\n 'Access your syncs from': 'Acceda a sus sincronizaciones desde',\n 'You are no longer synchronizing': 'Ya no está sincronizando',\n 'Security notification': 'Notificación de seguridad',\n 'Your account has been locked after several unsuccessful authentication attempts':\n 'Su cuenta ha sido bloqueada tras varios intentos de autenticación fallidos',\n 'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.':\n 'Esta notificación de seguridad concierne a su cuenta de Sync-in. Póngase en contacto con un administrador para realizar el análisis y desbloquear su cuenta.',\n 'Two-factor authentication (2FA) on your account has been disabled': 'La autenticación de dos factores (2FA) de su cuenta ha sido desactivada',\n 'Two-factor authentication (2FA) on your account has been enabled': 'La autenticación de dos factores (2FA) de su cuenta ha sido activada',\n 'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.':\n 'Ha recibido esta notificación porque la seguridad de su cuenta de Sync-in ha cambiado. Si cree que se trata de un error, revise su configuración de seguridad o contacte a su administrador.',\n 'Address IP': 'Dirección IP',\n Browser: 'Navegador'\n} as const\n"],"names":["es","Comment","commented","Space","anchored","unanchored","Share","Sync","Browser"],"mappings":"AAAA;;;;CAIC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,KAAK;IAChB,yGACE;IACF,kBAAkB;IAClBC,SAAS;IACTC,WAAW;IACX,6GACE;IACFC,OAAO;IACP,kBAAkB;IAClB,gBAAgB;IAChB,2BAA2B;IAC3B,0BAA0B;IAC1B,oCAAoC;IACpC,0CAA0C;IAC1C,2CAA2C;IAC3CC,UAAU;IACVC,YAAY;IACZC,OAAO;IACP,mBAAmB;IACnB,4BAA4B;IAC5B,oCAAoC;IACpC,0CAA0C;IAC1C,qFACE;IACF,2BAA2B;IAC3B,mBAAmB;IACnBC,MAAM;IACN,0BAA0B;IAC1B,mCAAmC;IACnC,yBAAyB;IACzB,mFACE;IACF,8IACE;IACF,qEAAqE;IACrE,oEAAoE;IACpE,iMACE;IACF,cAAc;IACdC,SAAS;AACX"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/notifications/i18n/es.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const es = {\n 'If you no longer wish to receive notifications, change your preferences directly from your user space.':\n 'Si ya no desea recibir notificaciones, cambie sus preferencias directamente desde su espacio de usuario.',\n 'Access it from': 'Acceda a él desde',\n Comment: 'Comentario',\n commented: 'comentó',\n 'You receive this notification if you are the owner of the file or if you have also commented on this file':\n 'Recibe esta notificación si es el propietario del archivo o si también ha comentado este archivo',\n Space: 'Espacio',\n 'from the space': 'del espacio',\n 'to the space': 'al espacio',\n 'Access your spaces from': 'Acceda a sus espacios desde',\n 'Access this space from': 'Acceda a este espacio desde',\n 'You now have access to the space': 'Ahora tiene acceso al espacio',\n 'You no longer have access to the space': 'Ya no tiene acceso al espacio',\n 'This space has been permanently deleted': 'Este espacio ha sido eliminado permanentemente',\n anchored: 'ancló',\n unanchored: 'desancló',\n Share: 'Compartir',\n 'shared with you': 'compartió con usted',\n 'no longer share with you': 'ya no comparte con usted',\n 'You now have access to the share': 'Ahora tiene acceso al recurso compartido',\n 'You no longer have access to the share': 'Ya no tiene acceso al recurso compartido',\n 'You are no longer a member of the parent share, your child share has been deleted':\n 'Ya no es miembro del recurso compartido principal; su recurso compartido hijo ha sido eliminado',\n 'Access your shares from': 'Acceda a sus recursos compartidos desde',\n 'Access password': 'Contraseña de acceso',\n Sync: 'Sincronización',\n 'Access your syncs from': 'Acceda a sus sincronizaciones desde',\n 'You are no longer synchronizing': 'Ya no está sincronizando',\n 'Unlock Request': 'Solicitud de desbloqueo',\n 'You receive this notification because you have a lock on this file.': 'Recibe esta notificación porque tiene un bloqueo en este archivo.',\n 'sends you a request to unlock the file': 'le envía una solicitud para desbloquear el archivo',\n 'Security notification': 'Notificación de seguridad',\n 'Your account has been locked after several unsuccessful authentication attempts':\n 'Su cuenta ha sido bloqueada tras varios intentos de autenticación fallidos',\n 'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.':\n 'Esta notificación de seguridad concierne a su cuenta de Sync-in. Póngase en contacto con un administrador para realizar el análisis y desbloquear su cuenta.',\n 'Two-factor authentication (2FA) on your account has been disabled': 'La autenticación de dos factores (2FA) de su cuenta ha sido desactivada',\n 'Two-factor authentication (2FA) on your account has been enabled': 'La autenticación de dos factores (2FA) de su cuenta ha sido activada',\n 'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.':\n 'Ha recibido esta notificación porque la seguridad de su cuenta de Sync-in ha cambiado. Si cree que se trata de un error, revise su configuración de seguridad o contacte a su administrador.',\n 'Address IP': 'Dirección IP',\n Browser: 'Navegador',\n 'New Version Available': 'Nueva versión disponible',\n 'You receive this notification because you are the administrator of this server.':\n 'Recibe esta notificación porque es el administrador de este servidor.',\n 'A new update is available': 'Hay una nueva actualización disponible'\n} as const\n"],"names":["es","Comment","commented","Space","anchored","unanchored","Share","Sync","Browser"],"mappings":"AAAA;;;;CAIC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,KAAK;IAChB,0GACE;IACF,kBAAkB;IAClBC,SAAS;IACTC,WAAW;IACX,6GACE;IACFC,OAAO;IACP,kBAAkB;IAClB,gBAAgB;IAChB,2BAA2B;IAC3B,0BAA0B;IAC1B,oCAAoC;IACpC,0CAA0C;IAC1C,2CAA2C;IAC3CC,UAAU;IACVC,YAAY;IACZC,OAAO;IACP,mBAAmB;IACnB,4BAA4B;IAC5B,oCAAoC;IACpC,0CAA0C;IAC1C,qFACE;IACF,2BAA2B;IAC3B,mBAAmB;IACnBC,MAAM;IACN,0BAA0B;IAC1B,mCAAmC;IACnC,kBAAkB;IAClB,uEAAuE;IACvE,0CAA0C;IAC1C,yBAAyB;IACzB,mFACE;IACF,8IACE;IACF,qEAAqE;IACrE,oEAAoE;IACpE,iMACE;IACF,cAAc;IACdC,SAAS;IACT,yBAAyB;IACzB,mFACE;IACF,6BAA6B;AAC/B"}
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "fr", {
13
13
  }
14
14
  });
15
15
  const fr = {
16
- 'If you no longer wish to receive notifications, change your preferences directly from your user space': 'Si vous ne souhaitez plus recevoir de notifications, modifiez vos préferences directement depuis votre espace utilisateur',
16
+ 'If you no longer wish to receive notifications, change your preferences directly from your user space.': 'Si vous ne souhaitez plus recevoir de notifications, modifiez vos préferences directement depuis votre espace utilisateur.',
17
17
  'Access it from': 'Accédez y depuis',
18
18
  Comment: 'Commentaire',
19
19
  commented: 'a commenté',
@@ -39,6 +39,9 @@ const fr = {
39
39
  Sync: 'Synchronisation',
40
40
  'Access your syncs from': 'Accédez à vos synchronisations depuis',
41
41
  'You are no longer synchronizing': 'Vous ne synchronisez plus',
42
+ 'Unlock Request': 'Demande de déverrouillage',
43
+ 'You receive this notification because you have a lock on this file.': 'Vous recevez cette notification car vous avez un verrou sur ce fichier.',
44
+ 'sends you a request to unlock the file': 'vous envoie une demande de déverrouillage du fichier',
42
45
  'Security notification': 'Notification de sécurité',
43
46
  'Your account has been locked after several unsuccessful authentication attempts': 'Votre compte a été verrouillé après plusieurs tentatives d’authentification infructueuses',
44
47
  'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.': `Cette notification de sécurité concerne votre compte Sync-in. Merci de contacter un administrateur afin qu’il procède à l’analyse et au déverrouillage de votre compte.`,
@@ -46,7 +49,10 @@ const fr = {
46
49
  'Two-factor authentication (2FA) on your account has been enabled': `L’authentification à deux facteurs (2FA) sur votre compte a été activée`,
47
50
  'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.': `Vous recevez cette notification car la sécurité de votre compte Sync-in a été modifiée. Si vous pensez qu’il s’agit d’une erreur, vérifiez vos paramètres de sécurité ou contactez votre administrateur.`,
48
51
  'Address IP': 'Adresse IP',
49
- Browser: 'Navigateur'
52
+ Browser: 'Navigateur',
53
+ 'New Version Available': 'Nouvelle version disponible',
54
+ 'You receive this notification because you are the administrator of this server.': 'Vous recevez cette notification car vous êtes l’administrateur de ce serveur.',
55
+ 'A new update is available': 'Une nouvelle mise à jour est disponible'
50
56
  };
51
57
 
52
58
  //# sourceMappingURL=fr.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/notifications/i18n/fr.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const fr = {\n 'If you no longer wish to receive notifications, change your preferences directly from your user space':\n 'Si vous ne souhaitez plus recevoir de notifications, modifiez vos préferences directement depuis votre espace utilisateur',\n 'Access it from': 'Accédez y depuis',\n Comment: 'Commentaire',\n commented: 'a commenté',\n 'You receive this notification if you are the owner of the file or if you have also commented on this file':\n 'Vous recevez cette notification si vous êtes le propriétaire du fichier ou si vous avez également commenté ce fichier',\n Space: 'Espace',\n 'from the space': `de l'espace`,\n 'to the space': `à l'espace`,\n 'Access your spaces from': 'Accédez à vos espaces depuis',\n 'Access this space from': 'Accédez à cet espace depuis',\n 'You now have access to the space': `Vous avez désormais accès à l'espace`,\n 'You no longer have access to the space': `Vous n'avez plus accès à l'espace`,\n 'This space has been permanently deleted': 'Cet espace a été définitivement supprimé',\n anchored: `a ancré`,\n unanchored: `a désancré`,\n Share: 'Partage',\n 'shared with you': 'a partagé avec vous',\n 'no longer share with you': 'ne partage plus avec vous',\n 'You now have access to the share': `Vous avez désormais accès au partage`,\n 'You no longer have access to the share': `Vous n'avez plus accès au partage`,\n 'You are no longer a member of the parent share, your child share has been deleted': `Vous n'êtes plus membre du partage parent, votre partage enfant a été supprimé`,\n 'Access your shares from': 'Accédez à vos partages depuis',\n 'Access password': `Mot de passe d'accès`,\n Sync: 'Synchronisation',\n 'Access your syncs from': 'Accédez à vos synchronisations depuis',\n 'You are no longer synchronizing': 'Vous ne synchronisez plus',\n 'Security notification': 'Notification de sécurité',\n 'Your account has been locked after several unsuccessful authentication attempts':\n 'Votre compte a été verrouillé après plusieurs tentatives d’authentification infructueuses',\n 'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.': `Cette notification de sécurité concerne votre compte Sync-in. Merci de contacter un administrateur afin qu’il procède à l’analyse et au déverrouillage de votre compte.`,\n 'Two-factor authentication (2FA) on your account has been disabled': `L’authentification à deux facteurs (2FA) sur votre compte a été désactivée`,\n 'Two-factor authentication (2FA) on your account has been enabled': `L’authentification à deux facteurs (2FA) sur votre compte a été activée`,\n 'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.': `Vous recevez cette notification car la sécurité de votre compte Sync-in a été modifiée. Si vous pensez qu’il s’agit d’une erreur, vérifiez vos paramètres de sécurité ou contactez votre administrateur.`,\n 'Address IP': 'Adresse IP',\n Browser: 'Navigateur'\n} as const\n"],"names":["fr","Comment","commented","Space","anchored","unanchored","Share","Sync","Browser"],"mappings":"AAAA;;;;CAIC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,KAAK;IAChB,yGACE;IACF,kBAAkB;IAClBC,SAAS;IACTC,WAAW;IACX,6GACE;IACFC,OAAO;IACP,kBAAkB,CAAC,WAAW,CAAC;IAC/B,gBAAgB,CAAC,UAAU,CAAC;IAC5B,2BAA2B;IAC3B,0BAA0B;IAC1B,oCAAoC,CAAC,oCAAoC,CAAC;IAC1E,0CAA0C,CAAC,iCAAiC,CAAC;IAC7E,2CAA2C;IAC3CC,UAAU,CAAC,OAAO,CAAC;IACnBC,YAAY,CAAC,UAAU,CAAC;IACxBC,OAAO;IACP,mBAAmB;IACnB,4BAA4B;IAC5B,oCAAoC,CAAC,oCAAoC,CAAC;IAC1E,0CAA0C,CAAC,iCAAiC,CAAC;IAC7E,qFAAqF,CAAC,8EAA8E,CAAC;IACrK,2BAA2B;IAC3B,mBAAmB,CAAC,oBAAoB,CAAC;IACzCC,MAAM;IACN,0BAA0B;IAC1B,mCAAmC;IACnC,yBAAyB;IACzB,mFACE;IACF,8IAA8I,CAAC,uKAAuK,CAAC;IACvT,qEAAqE,CAAC,0EAA0E,CAAC;IACjJ,oEAAoE,CAAC,uEAAuE,CAAC;IAC7I,iMAAiM,CAAC,wMAAwM,CAAC;IAC3Y,cAAc;IACdC,SAAS;AACX"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/notifications/i18n/fr.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const fr = {\n 'If you no longer wish to receive notifications, change your preferences directly from your user space.':\n 'Si vous ne souhaitez plus recevoir de notifications, modifiez vos préferences directement depuis votre espace utilisateur.',\n 'Access it from': 'Accédez y depuis',\n Comment: 'Commentaire',\n commented: 'a commenté',\n 'You receive this notification if you are the owner of the file or if you have also commented on this file':\n 'Vous recevez cette notification si vous êtes le propriétaire du fichier ou si vous avez également commenté ce fichier',\n Space: 'Espace',\n 'from the space': `de l'espace`,\n 'to the space': `à l'espace`,\n 'Access your spaces from': 'Accédez à vos espaces depuis',\n 'Access this space from': 'Accédez à cet espace depuis',\n 'You now have access to the space': `Vous avez désormais accès à l'espace`,\n 'You no longer have access to the space': `Vous n'avez plus accès à l'espace`,\n 'This space has been permanently deleted': 'Cet espace a été définitivement supprimé',\n anchored: `a ancré`,\n unanchored: `a désancré`,\n Share: 'Partage',\n 'shared with you': 'a partagé avec vous',\n 'no longer share with you': 'ne partage plus avec vous',\n 'You now have access to the share': `Vous avez désormais accès au partage`,\n 'You no longer have access to the share': `Vous n'avez plus accès au partage`,\n 'You are no longer a member of the parent share, your child share has been deleted': `Vous n'êtes plus membre du partage parent, votre partage enfant a été supprimé`,\n 'Access your shares from': 'Accédez à vos partages depuis',\n 'Access password': `Mot de passe d'accès`,\n Sync: 'Synchronisation',\n 'Access your syncs from': 'Accédez à vos synchronisations depuis',\n 'You are no longer synchronizing': 'Vous ne synchronisez plus',\n 'Unlock Request': 'Demande de déverrouillage',\n 'You receive this notification because you have a lock on this file.': 'Vous recevez cette notification car vous avez un verrou sur ce fichier.',\n 'sends you a request to unlock the file': 'vous envoie une demande de déverrouillage du fichier',\n 'Security notification': 'Notification de sécurité',\n 'Your account has been locked after several unsuccessful authentication attempts':\n 'Votre compte a été verrouillé après plusieurs tentatives d’authentification infructueuses',\n 'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.': `Cette notification de sécurité concerne votre compte Sync-in. Merci de contacter un administrateur afin qu’il procède à l’analyse et au déverrouillage de votre compte.`,\n 'Two-factor authentication (2FA) on your account has been disabled': `L’authentification à deux facteurs (2FA) sur votre compte a été désactivée`,\n 'Two-factor authentication (2FA) on your account has been enabled': `L’authentification à deux facteurs (2FA) sur votre compte a été activée`,\n 'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.': `Vous recevez cette notification car la sécurité de votre compte Sync-in a été modifiée. Si vous pensez qu’il s’agit d’une erreur, vérifiez vos paramètres de sécurité ou contactez votre administrateur.`,\n 'Address IP': 'Adresse IP',\n Browser: 'Navigateur',\n 'New Version Available': 'Nouvelle version disponible',\n 'You receive this notification because you are the administrator of this server.':\n 'Vous recevez cette notification car vous êtes l’administrateur de ce serveur.',\n 'A new update is available': 'Une nouvelle mise à jour est disponible'\n} as const\n"],"names":["fr","Comment","commented","Space","anchored","unanchored","Share","Sync","Browser"],"mappings":"AAAA;;;;CAIC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,KAAK;IAChB,0GACE;IACF,kBAAkB;IAClBC,SAAS;IACTC,WAAW;IACX,6GACE;IACFC,OAAO;IACP,kBAAkB,CAAC,WAAW,CAAC;IAC/B,gBAAgB,CAAC,UAAU,CAAC;IAC5B,2BAA2B;IAC3B,0BAA0B;IAC1B,oCAAoC,CAAC,oCAAoC,CAAC;IAC1E,0CAA0C,CAAC,iCAAiC,CAAC;IAC7E,2CAA2C;IAC3CC,UAAU,CAAC,OAAO,CAAC;IACnBC,YAAY,CAAC,UAAU,CAAC;IACxBC,OAAO;IACP,mBAAmB;IACnB,4BAA4B;IAC5B,oCAAoC,CAAC,oCAAoC,CAAC;IAC1E,0CAA0C,CAAC,iCAAiC,CAAC;IAC7E,qFAAqF,CAAC,8EAA8E,CAAC;IACrK,2BAA2B;IAC3B,mBAAmB,CAAC,oBAAoB,CAAC;IACzCC,MAAM;IACN,0BAA0B;IAC1B,mCAAmC;IACnC,kBAAkB;IAClB,uEAAuE;IACvE,0CAA0C;IAC1C,yBAAyB;IACzB,mFACE;IACF,8IAA8I,CAAC,uKAAuK,CAAC;IACvT,qEAAqE,CAAC,0EAA0E,CAAC;IACjJ,oEAAoE,CAAC,uEAAuE,CAAC;IAC7I,iMAAiM,CAAC,wMAAwM,CAAC;IAC3Y,cAAc;IACdC,SAAS;IACT,yBAAyB;IACzB,mFACE;IACF,6BAA6B;AAC/B"}
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "hi", {
13
13
  }
14
14
  });
15
15
  const hi = {
16
- 'If you no longer wish to receive notifications, change your preferences directly from your user space': 'यदि आप अब सूचनाएँ प्राप्त नहीं करना चाहते हैं, तो अपने उपयोगकर्ता क्षेत्र से सीधे अपनी प्राथमिकताएँ बदलें',
16
+ 'If you no longer wish to receive notifications, change your preferences directly from your user space.': 'यदि आप अब सूचनाएँ प्राप्त नहीं करना चाहते हैं, तो अपने उपयोगकर्ता क्षेत्र से सीधे अपनी प्राथमिकताएँ बदलें।',
17
17
  'Access it from': 'इसे यहाँ से एक्सेस करें',
18
18
  Comment: 'टिप्पणी',
19
19
  commented: 'ने टिप्पणी की',
@@ -39,6 +39,9 @@ const hi = {
39
39
  Sync: 'समन्वयन',
40
40
  'Access your syncs from': 'अपने समन्वयन यहाँ से एक्सेस करें',
41
41
  'You are no longer synchronizing': 'आप अब समन्वयन नहीं कर रहे हैं',
42
+ 'Unlock Request': 'अनलॉक अनुरोध',
43
+ 'You receive this notification because you have a lock on this file.': 'यह सूचना आपको इसलिए प्राप्त हुई है क्योंकि इस फ़ाइल पर आपका लॉक है।',
44
+ 'sends you a request to unlock the file': 'आपको फ़ाइल अनलॉक करने का अनुरोध भेजता है',
42
45
  'Security notification': 'सुरक्षा सूचना',
43
46
  'Your account has been locked after several unsuccessful authentication attempts': 'कई असफल प्रमाणीकरण प्रयासों के बाद आपका खाता लॉक कर दिया गया है',
44
47
  'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.': 'यह सुरक्षा सूचना आपके Sync-in खाते से संबंधित है। कृपया विश्लेषण करने और अपना खाता अनलॉक करने के लिए किसी प्रशासक से संपर्क करें।',
@@ -46,7 +49,10 @@ const hi = {
46
49
  'Two-factor authentication (2FA) on your account has been enabled': 'आपके खाते पर दो‑कारक प्रमाणीकरण (2FA) सक्षम कर दिया गया है',
47
50
  'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.': 'आपको यह सूचना इसलिए मिली है क्योंकि आपके Sync-in खाते की सुरक्षा बदल गई है। यदि आपको लगता है कि यह गलती से हुआ है, तो कृपया अपनी सुरक्षा सेटिंग्स की समीक्षा करें या अपने प्रशासक से संपर्क करें।',
48
51
  'Address IP': 'IP पता',
49
- Browser: 'ब्राउज़र'
52
+ Browser: 'ब्राउज़र',
53
+ 'New Version Available': 'नया संस्करण उपलब्ध है',
54
+ 'You receive this notification because you are the administrator of this server.': 'आपको यह सूचना इसलिए मिली है क्योंकि आप इस सर्वर के व्यवस्थापक हैं।',
55
+ 'A new update is available': 'एक नया अपडेट उपलब्ध है'
50
56
  };
51
57
 
52
58
  //# sourceMappingURL=hi.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/notifications/i18n/hi.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const hi = {\n 'If you no longer wish to receive notifications, change your preferences directly from your user space':\n 'यदि आप अब सूचनाएँ प्राप्त नहीं करना चाहते हैं, तो अपने उपयोगकर्ता क्षेत्र से सीधे अपनी प्राथमिकताएँ बदलें',\n 'Access it from': 'इसे यहाँ से एक्सेस करें',\n Comment: 'टिप्पणी',\n commented: 'ने टिप्पणी की',\n 'You receive this notification if you are the owner of the file or if you have also commented on this file':\n 'यदि आप फ़ाइल के मालिक हैं या आपने भी इस फ़ाइल पर टिप्पणी की है, तो आपको यह सूचना प्राप्त होती है',\n Space: 'स्पेस',\n 'from the space': 'स्पेस से',\n 'to the space': 'स्पेस में',\n 'Access your spaces from': 'अपने स्पेस यहाँ से एक्सेस करें',\n 'Access this space from': 'इस स्पेस को यहाँ से एक्सेस करें',\n 'You now have access to the space': 'अब आपको स्पेस तक पहुंच प्राप्त है',\n 'You no longer have access to the space': 'अब आपको स्पेस तक पहुंच नहीं है',\n 'This space has been permanently deleted': 'यह स्पेस स्थायी रूप से हटा दिया गया है',\n anchored: 'एंकर किया',\n unanchored: 'अनएंकर किया',\n Share: 'साझा',\n 'shared with you': 'आपके साथ साझा किया',\n 'no longer share with you': 'अब आपके साथ साझा नहीं किया',\n 'You now have access to the share': 'अब आपको साझा सामग्री तक पहुंच प्राप्त है',\n 'You no longer have access to the share': 'अब आपको साझा सामग्री तक पहुंच नहीं है',\n 'You are no longer a member of the parent share, your child share has been deleted':\n 'आप अब पैरेंट शेयर के सदस्य नहीं हैं; आपका चाइल्ड शेयर हटा दिया गया है',\n 'Access your shares from': 'अपने शेयर यहाँ से एक्सेस करें',\n 'Access password': 'एक्सेस पासवर्ड',\n Sync: 'समन्वयन',\n 'Access your syncs from': 'अपने समन्वयन यहाँ से एक्सेस करें',\n 'You are no longer synchronizing': 'आप अब समन्वयन नहीं कर रहे हैं',\n 'Security notification': 'सुरक्षा सूचना',\n 'Your account has been locked after several unsuccessful authentication attempts':\n 'कई असफल प्रमाणीकरण प्रयासों के बाद आपका खाता लॉक कर दिया गया है',\n 'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.':\n 'यह सुरक्षा सूचना आपके Sync-in खाते से संबंधित है। कृपया विश्लेषण करने और अपना खाता अनलॉक करने के लिए किसी प्रशासक से संपर्क करें।',\n 'Two-factor authentication (2FA) on your account has been disabled': 'आपके खाते पर दो‑कारक प्रमाणीकरण (2FA) अक्षम कर दिया गया है',\n 'Two-factor authentication (2FA) on your account has been enabled': 'आपके खाते पर दो‑कारक प्रमाणीकरण (2FA) सक्षम कर दिया गया है',\n 'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.':\n 'आपको यह सूचना इसलिए मिली है क्योंकि आपके Sync-in खाते की सुरक्षा बदल गई है। यदि आपको लगता है कि यह गलती से हुआ है, तो कृपया अपनी सुरक्षा सेटिंग्स की समीक्षा करें या अपने प्रशासक से संपर्क करें।',\n 'Address IP': 'IP पता',\n Browser: 'ब्राउज़र'\n} as const\n"],"names":["hi","Comment","commented","Space","anchored","unanchored","Share","Sync","Browser"],"mappings":"AAAA;;;;CAIC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,KAAK;IAChB,yGACE;IACF,kBAAkB;IAClBC,SAAS;IACTC,WAAW;IACX,6GACE;IACFC,OAAO;IACP,kBAAkB;IAClB,gBAAgB;IAChB,2BAA2B;IAC3B,0BAA0B;IAC1B,oCAAoC;IACpC,0CAA0C;IAC1C,2CAA2C;IAC3CC,UAAU;IACVC,YAAY;IACZC,OAAO;IACP,mBAAmB;IACnB,4BAA4B;IAC5B,oCAAoC;IACpC,0CAA0C;IAC1C,qFACE;IACF,2BAA2B;IAC3B,mBAAmB;IACnBC,MAAM;IACN,0BAA0B;IAC1B,mCAAmC;IACnC,yBAAyB;IACzB,mFACE;IACF,8IACE;IACF,qEAAqE;IACrE,oEAAoE;IACpE,iMACE;IACF,cAAc;IACdC,SAAS;AACX"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/notifications/i18n/hi.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const hi = {\n 'If you no longer wish to receive notifications, change your preferences directly from your user space.':\n 'यदि आप अब सूचनाएँ प्राप्त नहीं करना चाहते हैं, तो अपने उपयोगकर्ता क्षेत्र से सीधे अपनी प्राथमिकताएँ बदलें।',\n 'Access it from': 'इसे यहाँ से एक्सेस करें',\n Comment: 'टिप्पणी',\n commented: 'ने टिप्पणी की',\n 'You receive this notification if you are the owner of the file or if you have also commented on this file':\n 'यदि आप फ़ाइल के मालिक हैं या आपने भी इस फ़ाइल पर टिप्पणी की है, तो आपको यह सूचना प्राप्त होती है',\n Space: 'स्पेस',\n 'from the space': 'स्पेस से',\n 'to the space': 'स्पेस में',\n 'Access your spaces from': 'अपने स्पेस यहाँ से एक्सेस करें',\n 'Access this space from': 'इस स्पेस को यहाँ से एक्सेस करें',\n 'You now have access to the space': 'अब आपको स्पेस तक पहुंच प्राप्त है',\n 'You no longer have access to the space': 'अब आपको स्पेस तक पहुंच नहीं है',\n 'This space has been permanently deleted': 'यह स्पेस स्थायी रूप से हटा दिया गया है',\n anchored: 'एंकर किया',\n unanchored: 'अनएंकर किया',\n Share: 'साझा',\n 'shared with you': 'आपके साथ साझा किया',\n 'no longer share with you': 'अब आपके साथ साझा नहीं किया',\n 'You now have access to the share': 'अब आपको साझा सामग्री तक पहुंच प्राप्त है',\n 'You no longer have access to the share': 'अब आपको साझा सामग्री तक पहुंच नहीं है',\n 'You are no longer a member of the parent share, your child share has been deleted':\n 'आप अब पैरेंट शेयर के सदस्य नहीं हैं; आपका चाइल्ड शेयर हटा दिया गया है',\n 'Access your shares from': 'अपने शेयर यहाँ से एक्सेस करें',\n 'Access password': 'एक्सेस पासवर्ड',\n Sync: 'समन्वयन',\n 'Access your syncs from': 'अपने समन्वयन यहाँ से एक्सेस करें',\n 'You are no longer synchronizing': 'आप अब समन्वयन नहीं कर रहे हैं',\n 'Unlock Request': 'अनलॉक अनुरोध',\n 'You receive this notification because you have a lock on this file.': 'यह सूचना आपको इसलिए प्राप्त हुई है क्योंकि इस फ़ाइल पर आपका लॉक है।',\n 'sends you a request to unlock the file': 'आपको फ़ाइल अनलॉक करने का अनुरोध भेजता है',\n 'Security notification': 'सुरक्षा सूचना',\n 'Your account has been locked after several unsuccessful authentication attempts':\n 'कई असफल प्रमाणीकरण प्रयासों के बाद आपका खाता लॉक कर दिया गया है',\n 'This security notification concerns your Sync-in account. Please contact an administrator to perform the analysis and unlock your account.':\n 'यह सुरक्षा सूचना आपके Sync-in खाते से संबंधित है। कृपया विश्लेषण करने और अपना खाता अनलॉक करने के लिए किसी प्रशासक से संपर्क करें।',\n 'Two-factor authentication (2FA) on your account has been disabled': 'आपके खाते पर दो‑कारक प्रमाणीकरण (2FA) अक्षम कर दिया गया है',\n 'Two-factor authentication (2FA) on your account has been enabled': 'आपके खाते पर दो‑कारक प्रमाणीकरण (2FA) सक्षम कर दिया गया है',\n 'You received this notification because the security of your Sync-in account has changed. If you think this was a mistake, please review your security settings or contact your administrator.':\n 'आपको यह सूचना इसलिए मिली है क्योंकि आपके Sync-in खाते की सुरक्षा बदल गई है। यदि आपको लगता है कि यह गलती से हुआ है, तो कृपया अपनी सुरक्षा सेटिंग्स की समीक्षा करें या अपने प्रशासक से संपर्क करें।',\n 'Address IP': 'IP पता',\n Browser: 'ब्राउज़र',\n 'New Version Available': 'नया संस्करण उपलब्ध है',\n 'You receive this notification because you are the administrator of this server.':\n 'आपको यह सूचना इसलिए मिली है क्योंकि आप इस सर्वर के व्यवस्थापक हैं।',\n 'A new update is available': 'एक नया अपडेट उपलब्ध है'\n} as const\n"],"names":["hi","Comment","commented","Space","anchored","unanchored","Share","Sync","Browser"],"mappings":"AAAA;;;;CAIC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,KAAK;IAChB,0GACE;IACF,kBAAkB;IAClBC,SAAS;IACTC,WAAW;IACX,6GACE;IACFC,OAAO;IACP,kBAAkB;IAClB,gBAAgB;IAChB,2BAA2B;IAC3B,0BAA0B;IAC1B,oCAAoC;IACpC,0CAA0C;IAC1C,2CAA2C;IAC3CC,UAAU;IACVC,YAAY;IACZC,OAAO;IACP,mBAAmB;IACnB,4BAA4B;IAC5B,oCAAoC;IACpC,0CAA0C;IAC1C,qFACE;IACF,2BAA2B;IAC3B,mBAAmB;IACnBC,MAAM;IACN,0BAA0B;IAC1B,mCAAmC;IACnC,kBAAkB;IAClB,uEAAuE;IACvE,0CAA0C;IAC1C,yBAAyB;IACzB,mFACE;IACF,8IACE;IACF,qEAAqE;IACrE,oEAAoE;IACpE,iMACE;IACF,cAAc;IACdC,SAAS;IACT,yBAAyB;IACzB,mFACE;IACF,6BAA6B;AAC/B"}